数字电子钟课程设计Word下载.docx
《数字电子钟课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《数字电子钟课程设计Word下载.docx(32页珍藏版)》请在冰豆网上搜索。
6、程序清单和图样资料;
7、作品及照片;
8、形成符合学校规定的课程设计书面文档;
二、设计(论文)需要的工作条件
软件环境:
ADS,Protel等软件。
硬件环境:
计算机、电子元件(电阻,电容集成芯片等),LED显示灯、电路板等。
三、应收集的资料及主要参考文献
参考文献:
[1]周毓林.WindowsCE内核定制及应用开发[M].北京:
电子工业出版社,2005
[2]TerenceA,GogginTA.WindowsCE高级开发指南[M].北京:
电子工业出版社,2000
[3]MuenchC.WindowsCE权威指南[M].北京:
中国电力出版社,2001
[4]Microsoft公司.MicrosoftWindows驱动程序模型设计[M].北京:
北京大学出版社,2000
[5]BolingD.MicrosoftWindows程序设计[M].北京:
北京大学出版社19
四、进度计划及指导安排
2014年4月30日:
下发任务书,相关资料准备和查阅相关文献。
2014年5月5日-19日:
开展课程设计研究与指导工作,并撰写论文。
2014年5月21日:
修改设计成果、论文初步完成。
2014年6月2日前:
完善课程设计成果,设计论文第二、三稿修订。
2014年6月16日:
毕业设计成果完成,毕业论文定稿,并打印4本纸质版交指导教师。
期间主要指导学生8次:
2014年4月、2014年5月、2014年6月。
任务书审定日期:
2014年4月28日指导教师(签字)
任务书批准日期:
2014年4月30日教研室主任(签字)
任务书下达日期:
2014年4月30日学生(签字)
所做工作
摘要
随着社会单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。
而51单片机是各单片机中最为典型和最有代表性的一种。
本设计以AT89C51芯片为核心,辅以必要的外围电路,设计了一个结构简单,功能齐全的电子时钟,它由5V直流电源供电。
在硬件方面,除了CPU外,使用八个七段LED数码管来进行显示,LED采用的是动态扫描显示,使用74LS245芯片进行驱动。
通过LED能够较为准确地显示时、分、秒。
四个简单的按键实现对时间的调整。
软件方面采用C语言编程。
整个电子钟系统能完成时间的显示、调时、校时和三组定时闹钟的功能。
选用单片机最小系统应用程序,添加比较程序、时间调整程序及蜂鸣程序,通过时间比较程序触发蜂鸣,实现闹钟功能,完成设计所需求的软件环境。
介绍并使用Keil单片机模拟调试软件,测试程序的可行性并用Proteus进行仿真。
关键词:
单片机,定时器,中断,闹钟,LED
1方案的选择和论证
通过对多种单片机最理想的电子时钟开发芯片。
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,而且它与MCS-51兼容,且具有4K字节可编程序存储器和1000次擦写循环,数据保留时间为10年,是最好的选择。
1.1按键的选择
方案一:
4×
4矩阵式键盘。
如果选择此方案,那么在修改时钟或设置闹铃时间时就可以直接从键盘输入,方便、快捷,但程序较为复杂。
方案二:
独立式按键。
如果设置过多按键,将会占用较多I/O口,而且会给布线带来不便,因此,此方案适用于按键较少的情况。
如果选择此方案,由于按键较少,在修改时间或设置闹铃时间时就不能直接输入,只能通过加或减完成,稍为麻烦一些,但其程序简单。
由于并不需要经常修改时间和设置闹铃时间,而且方案二的程序简单,按键少、成本低,因此,选择方案二。
1.2显示器的选择
液晶显示器。
如果选择此方案,将会降低系统的功耗,这样就可以用电池供电,便于携带。
但液晶显示器的驱动电路复杂,使用起来有一定的难度。
用数码管作为显示器。
数码管的驱动电路简单,使用方便,如果选择了此方案,那么在夜间看时间的时候就不需要有光源,非常方便。
其缺点是功耗较大。
由于数码管使用起来较为方便,在夜间看时间也很方便,因此我选择了方案二。
1.3计时部分的选择
如果使用时钟芯片,系统就不怕掉电且时间精确。
但这种芯片比较贵,况且,设计本系统主要是为了学习单片机程序的编写和调试以及设计硬件电路的一些方法,因此采用软件的方法来计时而没有采用价格较高的时钟芯片。
1.4发音部分的设计
通过三极管放大后驱动蜂鸣器工作,再通过软件这时产生等时时间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本。
1.5显示器驱动电路
由于通过数码管公共及的电流较大且避免过多地使用分立元件,采用了一片74LS245来驱动段码,用P3口作位码驱动。
1.6电源的选择
如果是用电池供电,就比较方便携带,但是本系统,采用了数码管作为显示器,功耗较大,需要经常更换电池。
况且,本系统的体积较大,即使使用电池供电也不能随身携带,因此,用电池供电不大合适,所以用5V外部稳压电源来供电。
2数字电子钟的设计原理和方法
2.1设计原理
系统原理图
2.2硬件电路的设计
AT89C51是一款单片封装的微控制器,适合于许多要求高集成度、低成本的场合。
可以满足多方面的性能要求。
AT89C51采用了高性能的处理器结构,指令执行时间只需2到4个时钟周期。
6倍于标准51单片机器件。
AT89C51集成了许多系统级的功能,这样可大大减少元件的数目和电路板面积并降低系统的成本。
AT89C51单片机内部主要有以下部件:
8031CPU、振荡电路、总线控制部件、中断控制部件、片内Flash存储器、并行I/O接口、定时器和串行I/O接口。
图2-2AT89C51单片机
2.2.1键盘电路的设计
键盘采用4个独立按键配以4个上拉电阻实现对时钟和闹钟的设定及修改。
图2-3独立按键图2-4键盘输入电路
2.2.2段码驱动电路
图2-5段码驱动器74LS245
2.2.3蜂鸣器驱动电路
发音部分是通过三极管放大驱动蜂鸣器工作,再通过软件这时产生等时时间方波驱动蜂鸣器发出间断嘀声,这样就可以省去硬件振荡电路,降低成本。
图2-6蜂鸣器驱动电路
2.3软件部分的设计
2.3.1主程序部分的设计
程序部分主要采用了程序结构的模块化设计,避免了一些函数的不必要的重复书写,使程序变得单间易懂。
程序在执行时,主程序要须通过调用子函数就可完成相应的功能。
主程序流程图如下图2-7。
图2-7主程序流程图
2.3.2中断定时器的设置
数字电子钟设计中主要使用定时器T0中断ET0,利用ET0中断进行计时时间的自增,从而实现计时功能。
AT89C51有两个通用定时/计数器。
两者均可配置为定时器或事件计数器。
另外增加了定时器T0/T1,溢出时T0/T1脚自动翻转的功能选项。
用作“定时器”功能时,每经过一个机器周期,寄存器值加1。
用作“计数器”功能时,寄存器在对应的外部输入管脚T0/T1上每发生一次1到0的跳变时加1。
使用该功能时,外部输入每个机器周期被采样一次。
图2-8定时器工作原理[1]
设计中采用了中断方式1作为定时中断,其定时计数初值的设置可由以下公式计算得到,中断服务流程图如下图3-9。
X:
计数初值t:
定时时间
:
机器周期[1]
图2-9中断服务流程图
2.3.3闹钟子函数
闹钟时间的判别主要是通过设定时间与实时时间对逐位对比确定是否进行闹铃。
其工作流程图如下图2-10。
图2-10闹铃判断流程图
2.3.4计时函数
计时函数部分,主要是通过单片机定时中断来计时,复产生一次中断标志位flag加1,当flag加满20次为1秒,然后把flag清0把秒存储单元加1。
然后再依次判断分、时。
其流程图如下图2-11。
图2-11计时流程图
2.3.4键盘扫描函数
这些函数主要是判断是否有按键按下,并根据相应按键按下的情况调用相关函数执行,其相关流程图如下图2-12。
图2-12键盘扫描流程图
2.3.5时间和闹钟的设置
此部分主要是通过判断cnt在不同值时通过调用加1、减1子函数对时间和闹钟的时、分、秒进行设置。
在闹钟设置时,判断按键S4按下情况我,进行闹钟的开启与关闭,相关流程图如下图2-13。
图2-13时间/闹钟设置流程图
实验结果
此电子闹钟设计是利用Proteus仿真软件进行仿真,基本上实现了课程设计要求实现的功能。
硬件部分设置了的三个按键S1、S2、S3、S4。
当按键S1第一次按下时,停止计时进入闹钟1的秒设置,当按键S1第二、第三次按下时,分别进入闹钟1的分设置和时设置,当按S1第四、第五、第六次按下时分别进入闹钟2的秒、分、时设置,当按S1第七、第八、第九次按下时分别进入闹钟3的秒、分、时设置,当按S1第十、第二一、第十二次按下时分别进入时间的秒、分、时设置,在S1按下的各阶段,可用按键S2、S3进行时间和闹铃时间的时、分、秒进行加减设置;
当按键S1第十三次按下时恢复到时间显示功能。
当显示的时间和定时设置的时间一致时,蜂鸣器发出等时间断蜂鸣声,闹铃时间设置为60秒。
在各个闹钟设置阶段,如果有S4按下,则相应闹钟功能关闭或开启;
如在闹铃时有S4按下则提前停止闹铃。
另外,闹铃电路有音乐闹钟的扩展的功能(可以将蜂鸣器换成扬声器再加一段音乐程序即可实现)。
因时间有限,扩展功能还未能及时实现,比如音乐闹铃。
总结
通过自己的不懈努力,我终于完成了毕业设计任务书上的任务要求。
功能上基本达标:
时钟的显示,调时功能、校时功能、闹铃功能、闹钟设功能。
其精确度完全可以满足日常生活显示时间的需要;
调时功能,方便快捷;
校时功能保证了时钟准确和可靠性,闹钟响铃还有扩展成音乐闹钟的余地。
硬件设施合乎要求,软件设计可以配合硬件实现要求的功能。
总结
开始的时候由于没有经验,不知如何下手,所以就去图书馆找了一些书看,尽管有许多设计方案,可是总觉得自己还有许多的东西弄不太清楚,于是就请教同学。
他尝做一些设计,有了一些经验。
经过他的努解释分析之后决定用查表,中断的方法来做这样可以降低一些硬件的难度,初次设计应切合自己的水平。
我以为这些做好了,构思也有了写程序应该是相对容易的。
谁知道,写起程序来才想到中断程序不会写,我真的感到很难,那是真的有点想放弃,于是就去请教了老师,老师帮忙分析了一下。
自己有查阅了一些资料。
终于明白了中断程序是怎么写的。
于是在自己的努力下,程序很快就写好了,功能上基本达标:
时钟的显示,秒表显示,定时功能,调时功能。
时钟显示功能,精确度完全可以满足日常生活显示时间的需要;
硬件设施合乎要求,软件设计可以配合硬件实现要求功能。
这次是我第一个设计器件,尽管经李了不少艰辛,但给我积累了一点设计的经验,最后也以有点小小的成就感。
后面的路还很长,我还得努力。
参考文献
[1]丁向荣、贾平。
《单片机应用系统与开发技术》.清华大学出版社,2009
[2]第二版.51系列单片机设计实例.北京航空航天大学出版社(81—89页数码管时钟电路的设计).
[3]黄庆华、张永格.单片机开发与实例.电子工业出版社(127-162页数字式电子时钟的设计)
[4]李叶紫.王喜斌.胡辉.孙东辉.编著MCS_51单片机应用教程清华大学出版社.2008.6.
附录电路设计
附录源程序
#include<
reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitlcden=P2^2;
sbitlcdrs=P2^0;
sbitlcdrw=P2^1;
sbitjdq=P2^3;
sbitled=P2^4;
sbitsound=P2^5;
inta,b,i,min,hour,minge,minshi,hourge,hourshi,amin,ahour,aminge,aminshi,ahourge,ahourshi,sec,secshi,secge;
//unsignedcharcodex[]={0xFF,0xC7,0x83,0x01,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0xFF};
//unsignedcharcodez[]={0xFF,0xE3,0xC1,0x80,0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0x7F,0xFF,0xFF};
ucharcodetable1[]={'
0'
'
1'
2'
3'
4'
5'
6'
7'
8'
9'
};
ucharcodetable2[]="
Time:
00:
00"
;
ucharcodeAlarm_1[]="
Alarm:
;
ucharcodenul[]="
"
ucharnum1,num2;
bitflag=0;
voiddelay(unsignedintxms)//延时程序
{
uinti,j;
for(i=xms;
i>
0;
i--)
for(j=124;
j>
j--);
}
voidwrite_com(ucharcom)//LCD命令控制,写指令函数
delay(5);
lcdrs=0;
P0=com;
delay(5);
lcden=1;
lcden=0;
voidwrite_data(uchardate)//LCD数据控制,写数据函数
lcdrs=1;
P0=date;
voidtime()//设置时间函数
while
(1)
{
if(key1==0)
{
delay(10);
if(key1==0)
{
if(hour==23)//"
时"
设置
hour=0;
else
hour++;
hourge=hour%10;
hourshi=hour/10;
write_com(0x0f);
delay
(2);
write_com(0x80+6);
write_data(table1[hourge]);
//"
个位写入LCD第二行第6位
delay(5);
write_com(0x80+5);
write_data(table1[hourshi]);
十位写入LCD第二行第5位
while(!
key1);
//delay
(1);
}
}
if(key2==0)
delay(10);
if(key2==0)
if(min==59)//"
分"
min=0;
min++;
minge=min%10;
minshi=min/10;
write_com(0x80+9);
write_data(table1[minge]);
个位写入LCD第二行第9位
delay
(1);
write_com(0x80+8);
write_data(table1[minshi]);
十位写入LCD第二行第8位
key2);
if(key3==0)
{
if(key3==0)
write_com(0x0c);
//整体显示,关光标,不闪烁
TR1=1;
//定时计数器1启动
key3);
break;
//key3松开时,显示时间"
"
位均已设置完毕
}
voidalarm()//设置闹钟时间函数
if(key1==0)
if(ahour==23)//闹钟"
设置
ahour=0;
ahour++;
ahourge=ahour%10;
ahourshi=ahour/10;
//delay
(2);
write_com(0x80+0x40+8);
write_data('
:
'
);
write_com(0x80+0x40+7);
write_data(table1[ahourge]);
write_com(0x80+0x40+6);
write_data(table1[ahourshi]);
if(key2==0)//闹钟"
if(amin==59)
amin=0;
amin++;
aminge=amin%10;
aminshi=amin/10;
write_com(0x80+0x40+10);
write_data(table1[aminge]);
write_com(0x80+0x40+9);
//delay
(2);
write_data(table1[aminshi]);
{flag=~flag;
write_com(0x80+0x40);
for(i=0;
i<
11;
i++)
write_data(nul[i]);
//设置结束,此时LCD第二行无数据显示,只有第一行有时间显示
voidkeyscan()//键盘扫描
{if(key1==0)
{delay(10);
{
while(!
//key1键松开后执行下一行程序
time();
//调用time()函数,即时间设置
}
}
elseif(key2==0)
delay(10);
key2)
ahourge=ahour%10;
ahourshi=ahour/10;
write_com(0x80+0x40+7);
write_data(table1[ahourge]);
delay(5);
write_com(0x80+0x40+6);
delay
(2);
write_data(table1[ahourshi]);
aminge=amin%10;
aminshi=amin/10;
write_com(0x80+0x40+10);
write_data(table1[aminge]);
write_com(0x80+0x40+9);
write_data(table1[aminshi]);
write_com(0x80+0x40);
for(i=0;
++i)
write_data(Alarm_1[i]);
//显示闹钟设置的时间