基于单片机的时钟设计Word文档格式.docx
《基于单片机的时钟设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的时钟设计Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
利用单片机内部的定时计数器进行中端定时,配合软件延时实现时、分、秒的计时。
该方案节省硬件成本,但程序设计较为复杂。
2.显示方案
对于实时时钟而言,显示显然是另一个重要的环节。
通常LED显示有两种方式:
动态显示和静态显示。
静态显示的优点是程序简单、显示亮度有保证、单片机CPU的开销小,节约CPU的工作时间。
但占有I/O口线多,每一个LED都要占有一个I/O口,硬件开销大,电路复杂。
需要几个LED就必须占有几个并行口,比较适用于LED数量较少的场合。
当然当LED数量较多的时候,可以使用单片机的串行口通过移位寄存器的方式加以解决,但程序编写比较麻烦。
LED动态显示硬件连接简单,但动态扫描的显示方式需要占有CPU较多的时间,在单片机没有太多实时测控任务的情况下可以采用。
最终选择方案:
本系统需要采用8位LED数码管来分别显示时、分、秒,因为本实验中我们I/O口线比较多,所以选用动态显示,数码管连接方式为共阴极,键盘中S1键调时,S2键调分。
(三)硬件部分
1、STC89C52单片机介绍
AT89C52是51系列单片机的一个型号,它是ATMEL公司生产的。
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。
它的部分引脚功能介绍如下。
P0口:
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口。
作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。
P1口:
P1口是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
P2口:
P2口是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。
P3口:
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能。
P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。
2.74HC573芯片:
74HC573是高性能硅门CMOS器件,八进制3态非反转透明的锁存器,SL74HC573跟LS/AL573的管脚一样。
输入是和标准CMOS输出兼容的;
加上拉电阻,他们能和LS/ALSTTL输出兼容。
当锁存使能端LE为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。
当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。
2.KeilC51介绍及使用
本设计中源程序程序的编写与调试是在KeilC51集成环境uVision中进行的。
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,界面友好,操作简单。
另外重要的一点是只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
(1)建立一个新的工程:
:
单击“Ptoject”菜单,在弹出的下拉菜单中选择“NewProject”选项。
然后选择你要保存的路径,输入工程的名字然后点击保存。
这时会弹出一个对话框,要求你选择单片机的型号,根据你所用的单片机来选择,KeilC51几乎支持所有的51内核的单片机,在本设计中选择的是AT89S51。
(2)编写程序:
单击“File”菜单,在下拉菜单中选择“New”,这时编辑窗口会出现一个Text1窗口,光标在该窗口中闪烁,首先保存该空白文档,单击菜单上的“File”,在弹出的下拉菜单中选择“SaveAs”选项,在出现的对话框中键入欲使用的文件名并同时键入正确的后缀名(本设计中为.c),然后保存。
回到编辑界面后,单击“Target1”前面的“+”,然后在“SourceGroup1”上单击右键,在弹出菜单中选择“AddFilestoGroup’SourceGroup1’”,选中设计所需要的源程序文件,然后单击“Add”,这时注意到“SourceGroup1”文件夹中多了若干个子项,子项的多少跟所增加的源程序的多少相同。
这时就可以键入应用程序了。
KeilC51会自动识别关键字,并以不同的颜色提醒用户加以注意,这样会使用户少犯错误,有利于提高编程效率。
(3)编译并生成HEX文件:
程序编写完成以后,单击“Ptoject”菜单,在下拉菜单中选择“BuiltTarget”选项,或者使用快捷键F7。
编译成功后右击“Target1”在弹出菜单中选择“OptionsForTarget’Target1’”,在弹出的对话框中选择“Output”选项中的“CreatHEXFile”选项使程序编译后产生HEX代码,供下载器软件使用。
3.烧录器的使用
本设计中程序是用Easy51Pro编程器烧写的。
Easy51Pro编程器是一款操作简单、容易自制、容易扩充、非常稳定、灵活的ISP编程器。
它支持hex文件,有重载的文件对话框,让你不必到处去找文件而且有热键支持,让我们调试程序时效率更高。
接好编程器的硬件电路后,在最上方选择你要编程的器件后点击“检测器件”,如果检测到了器件,左边的状态栏就会显示“检测到器件”并显示该器件的ROM与编程电压的大小特性。
检测到器件以后单击“操作”中的“自动打开文件”选项,在弹出的对话框中打开要烧录的程序的hex文件,然后单击“自动完成”选项,烧写完毕后如果显示“0个单元不对”就说明程序烧写成功了。
当然在烧录过程中会碰到一些问题,比如检测器件时,时有时无,这是下载线不稳定的表现,如果不能检测到器件,但是却可以正常读写,并且效验无误,这个就是单片机的问题了,可能单片机已经坏了,如果写器件时总是写到某个地址就停顿,然后报告失败;
或者可以顺利写完,但效验时显示有单元不正确,最可能的原因是电源不稳定,电缆太长,线路没焊好,器件质量问题等,也可能与电脑性能有关,特别是开启了很多程序的时候。
4.数码管显示部分
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f代表段码值0~9
时钟显示校正电路
本设计利用按键开关来校正时钟显示的数字。
当按钮按下时,将在相应的端口输入一个低电平,通过相应的程序来改变时钟显示。
其中S1按键开关用来修改时;
S2按键用来修改分。
P3.0,P3.1设置为高电平,LCDEN即连接单片机P3.4的设置为低电平。
如当S1按键按下时,P3.0变成低电平,反馈到单片机,然后通过软件使时单元加1。
9、总电路原理图
(五)软件部分
根据上述电子时钟的工作流程,软件设计可分为以下几个功能模块:
(1)主程序模块。
开始
设定时钟初值
调用键盘扫描程序
数码管显示程序
时钟处理程序
主程序流程图
保护现场
调用键盘设置子程序
调用显示子程序
返回
时间设置流程图
显示模块。
该模块完成时分秒8位LED的动态显示。
当按下S1键后,时加一,当按下S2键后,分加一,显示程序流程图如下图所示。
扫描键盘
否
调用显示程序有键按下?
是
调用显示程序
有键按下?
求取键号
键盘扫描程序流程图
程序:
/*------------------------------------------------------*/
#include<
reg52.h>
//头文件
#defineucharunsignedchar
#defineuintunsignedint
#defineweiP0//位码输出口
sbitdula=P2^6;
sbitwela=P2^7;
ucharsecond,minute,hour,j,q,;
//时分秒定义
ucharcodeduanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//显示段码值0~9
display();
delay(uintk);
clear();
chuli();
ucharq;
/*********************************************************************************************
函数名:
主函数
/**********************************************************************************************/
main()
{
second=0;
//初
minute=59;
//始
hour=23;
//值
//////////////////主循环///////////////////////////////
while
(1)
{
display();
//调用显示子函数
chuli();
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//函数功能:
在8位数码管上显示时分秒
//输出端口:
P0
display()
{
////////////////////////////////////
//时
wela=1;
wei=0xfe;
wela=0;
wei=duanma[hour/10];
dula=1;
dula=0;
delay(10);
clear();
wei=0xfd;
wei=duanma[hour%10];
///////////////////////////////////
//显示“-”
wei=0xfb;
wei=0x40;
//分
wei=0xf7;
wei=duanma[minute/10];
wei=0xef;
wei=duanma[minute%10];
wei=0xdf;
///////////////////////////////////////
//秒
wei=0xbf;
wei=duanma[second/10];
wei=0x7f;
wei=duanma[second%10];
//////////////////////////////////////////
//时间处理子函数
chuli()
q++;
if(q==5)
{
if(second<
59)//判断秒钟是否加到60
{second++;
else
{second=0;
if(minute<
59)//判断分钟是否加到60
{minute++;
else
{minute=0;
if(hour<
23)//判断时间是否加满一天
{hour++;
else
hour=0;
}}}}
delay(uintk)
{uinti,j,z;
for(z=k;
z>
0;
z--)
{for(i=2;
i>
i--)
{for(j=2;
j>
j--);
}}}
clear()
wei=0xff;
wei=0x00;
三、实验成果:
1、电路仿真效果图:
2、实物拍摄效果图:
四、设计总结
经过短短一周的课程设计,感触颇多。
因为单片机已经很久没复习,刚拿到题目,不知道从哪入手,后来通过对书本的回顾,加深了对单片机的记忆。
本次设计正是为我们提供了一个深入学习、探索的机会,成为课堂教学的有益补充。
单片机理论的学习是为课程的设计作准备的,但有时学习的理论也解决不了实践中的问题。
实践中获得的知识能让我对单片机的知识有更好的认识和理解。
虽然这次的课程设计我参考了不少资料,没有做到创新应用,但我对C语言的编程有了一个全新的认识,我明白了许多。
这次课程设计的最大收获是:
只有把理论用到实践中我们才能真正掌握好所学知识。
时间是检验真理的唯一标准。
四、参考文献
[1]楼然笛.单片机开发[M].北京:
人民邮电出版社,1994.
[2]付家才.单片机控制工程实践技术[M].北京:
化学工业出版社2004.3.
[3]李光才.单片机课程设计实例指导[M].北京:
北京航空航天大学出版社2004.
[4]朱定华.单片机原理及接口技术实验[M].北京:
北方交通大学出版社2002.11.
[5]刘湘涛.江世明.单片机原理与应用[M].北京:
电子工业出版社,2006.