单片机课程设计(电子钟)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。
尽管目前市场上已有现成的数字钟集成电路芯片出售,价格便宜、使用也方便,但鉴于单片机的定时器功能也可以完成数字钟电路的设计,因此进行数字钟的设计是必要的。
在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路,写程序、调试电路的能力。
单片机具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。
关键词 : 单片机;数码管;数字时钟
目录
1 系统功能要求 (1)
2 设计原理及方案论证 (2)
2.1数字钟原理 (2)
2.2电子时钟方案 (2)
2.3数码管显示方案 (3)
3 主控制器和外围器件 (4)
3.1单片机主控芯片 (4)
3.2 LED驱动芯片 (4)
3.3 4x4矩阵键盘模块 (5)
3.4 蜂鸣器模块 (5)
3.5 下载线接口电路 (6)
3.6 DS1302时钟模块 (6)
3.7 单片机晶振模块 (7)
4 系统硬件电路设计 (8)
4.1 单片机整体功能模块图 (8)
4.2 单片机蜂鸣器和数码管连接图 (8)
4.2 单片机矩阵键盘连接图 (9)
4.3 单片机时钟模块和晶振连接图 (9)
5 软件程序设计 (10)
6 实验测试部分 (20)
6.1测试结果 (20)
6.1.1电子钟正常的运行 (20)
6.1.2电子钟矫正时间后的运行 (20)
6.2测试结果分析与结论 (21)
7总结 (22)
8参考文献 (23)
1 系统功能要求
本次设计时钟电路,使用了AT89S52单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂。
同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘、芯片、蜂鸣器、数码管显示即可满足设计要求。
(1)准确计时,以数字形式显示时、分、秒的时间。
(2)小时以24小时计时形式,分秒计时为60进位。
(3)校正时间功能,即能随意使用键盘键上的按键来调整时钟的时、分、秒。
(4)闹钟功能,一旦走时到该时间,能以用蜂鸣器来进行定时提醒。
2 设计原理及方案论证
2.1数字钟原理
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路.由于计数的起始时间不可能与标准时间一致,故需要在电路上加一个校时电路,同时标准的1MHZ时间信号必须做到准确稳定.通常使用石英晶体振荡器电路构成数字钟.
(1)晶体振荡器
晶体振荡器给数字钟提供一个频率稳定准确的11.0592MHz的方波信号,可保证数字钟的走时准确及稳定.不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器。
(2)复位电路
时间计数电路由秒个位和秒十位计数器,分个位和分十位计数器,时个位和时十位电路构成,秒个位和秒十位计数器,分个位和分十位计数器为60进制计数器,时个位和时十位计数器为24进制计数器。
(3)数码管
数码管通常有发光二极管(LED)数码管和液晶(LCD)数码管,本设计提供的为LED数码管。
(4)键盘
键盘是控制和修改时钟的重要输入模块,通过键盘可以修改时间,修改闹钟时间,控制显。
2.2电子时钟方案
方案一:本方案采用DS1302。
该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。
为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。
当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。
而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。
方案二:本方案完全用软件实现数字时钟。
原理为:在单片机内部存储器设6个字节分别存放时钟的时、分、秒信息。
利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将
其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。
该方案具有硬件电路简单的特点。
但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。
而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。
电子时钟是本设计的最主要的部分。
根据需要,可利用两种方案实现。
基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。
2.3数码管显示方案
方案一:静态显示。
所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。
该方式每一位都需要一个8 位输出口控制。
静态显示时较小的电流能获得较高的亮度,且字符不闪烁。
但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。
方案二:动态显示。
所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。
利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。
显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。
调整参数可以实现较高稳定度的显示。
动态显示节省了I/O口,降低了能耗。
从节省I/O口和降低能耗出发,本设计采用方案二。
3 主控制器和外围器件
3.1单片机主控芯片
本实验采用AT89S52芯片。
(1)8 位的 CPU,片内有振荡器和时钟电路,工作频率为 0~24MHz
(2)片内有 256字节数据存储器 RAM
(3)片内有 8K字节程序存储器 ROM
(4)4个8位的并行I/O口(P0、P1、P2、P3)
(5)1个全双工串行通讯口
(6)3个16位定时器/计数器(T0、T1、T2)
(7)可处理 6个中断源,两级中断优先级
图3.1
3.2 LED驱动芯片
本实验采用两个74HC573锁存器。
数码管的段ABCDEFGH对应74HC573-1芯片,数码管的位WE1~WE6对应74HC573-2芯片。
DU P2.6段选信号控制74HC573-1锁存器,WE P2.7位选信号控制74HC573-2锁存器。
两个锁存器IO口接P0^0到P0^7,对应PCB网络编号D0到D7。
图3.2
3.3 4x4矩阵键盘模块
本实验采用4x4矩阵键盘INT1、LCDEN、RS、WR、RD、P3^0~ P3^2对应AT89S52芯片上的INT1、LCDEN、RS、WR、RD、P3^0~ P3^2 IO口。
图3.3
3.4 蜂鸣器模块
本实验蜂鸣器FM接到AT89S52芯片上的P2^3 IO口,对应的PCB网络编号为FM。
图3.4
3.5 下载线接口电路
本实验下载线接口电路P3^0、P3^1引脚接到AT89S52芯片上的P3^0、P3^1 IO口上。
图3.5
3.6 DS1302时钟模块
本实验时钟模块CLK和I/O口接到AT89S52芯片上的P2^1、P2^0 IO口上。
图3.6
3.7 单片机晶振模块
本实验晶振模块X1、X2接到AT89S52芯片上的X1、X2 IO口。
图3.7
4 系统硬件电路设计
4.1 单片机整体功能模块图
蜂鸣器模块对应AT89S52的P2^3 IO端口;矩阵键盘具体的扫描由P3端口控制;下载线接口电路通过P3^0和P3^1连接控制。
AT89S52
蜂鸣器数码管
矩阵键盘单片机晶振
DS1302时钟模块
下载线接口电路
通过X1、X2 IO口连接控制
P2^6段选信号
P2^7位选信号
对应P0^0到P0^7的IO口对应P2^3 IO口
对应AT89S52芯片上的INT1、LCDEN、RS、WR、RD、P3^0到P3^2 IO口。
通过P2^1、P2^0
IO口连接控制
通过P3^0、P3^1
IO口连接控制
图4.1
4.2 单片机蜂鸣器和数码管连接图
蜂鸣器模块对应AT89S52的P2^3 IO端口;数码管模块的段选信号由P2^6控制,位选信号由P2^7控制,数码管具体显示由P0端口控制;
图4.2
4.2 单片机矩阵键盘连接图
4x4矩阵键盘INT1、LCDEN、RS、WR、RD、P3^0~ P3^2对应AT89S52芯片上的INT1、LCDEN、RS、WR、RD、P3^0~ P3^2 IO口。
图4.2
4.3 单片机时钟模块和晶振连接图
DS1302时钟模块则通过P2^1和P2^0连接控制;单片机晶振通过X1和X2连接控制;
图4.3
5 软件程序设计
#include<reg51.h>
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,key=10,temp,qq;
uchar shi20,shi10,fen20,fen10,miao20,miao10,ok=1,wei,dingshi,change,yidingshi; uchar baoshi,baoshijieshu;
unsigned int pp;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/***************************延时函数******************************/
void delay(unsigned char i)
{ for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
/****************六个数码管动态扫描显示时,分,秒*********************/
void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1) { dula=0;
P0=table[shi2];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[shi1]|0x80;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
P0=table[fen2];
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(5);
P0=table[fen1]|0x80; dula=1;
dula=0;
P0=0xf7;
wela=1;
wela=0;
delay(5);
P0=table[miao2];
dula=1;
dula=0;
P0=0xef;
wela=1;
wela=0;
delay(5);
P0=table[miao1];
dula=1;
dula=0;
wela=1;
wela=0;
delay(5);
}
/***********通过矩阵键盘的S18和S19键设置定时和取消定时,S16为暂停进入矫正时间状态,S17为继续计时******************/
void keyscan0()
{ P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(10);
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{ case 0xbb:ok=0;change=1; break;
case 0x7b:ok=1;change=0;dingshi=0;break;
}
}
}
P3=0xf7;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(10);
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{ case 0xe7:ok=0;dingshi=1;break;
case 0xd7:yidingshi=0; break; //取消定时
}
}
}
}
/****************通过矩阵键盘S6—S15设置时钟具体时间时间*********************/ void keyscan()
{
{ P3=0xfe;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(10);
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{ case 0xee:key=0;wei++;break;
case 0xde:key=1;wei++;break;
case 0xbe:key=2;wei++;break;
case 0x7e:key=3;wei++;break;
}
while(temp!=0xf0)
{ temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfd;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(10);
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{ case 0xed:key=4;wei++;break;
case 0xdd:key=5;wei++;break;
case 0xbd:key=6;wei++;break;
case 0x7d:key=7;wei++;break; }
while(temp!=0xf0)
{ temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
P3=0xfb;
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{ delay(10);
if(temp!=0xf0)
{ temp=P3;
switch(temp)
{ case 0xeb:key=8;wei++;break;
case 0xdb:key=9;wei++;break;
}
while(temp!=0xf0)
{ temp=P3;
temp=temp&0xf0;
beep=0;
}
beep=1;
}
}
}
}
/***********主函数设置时钟和定时时间时,分,秒的进制转换*********************/ void main()
{ TMOD=0x01;
/*由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。
*/ TH0=(65536-46080)/256;
TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12
ET0=1;
EA=1;
while(1)
{ keyscan0();
if(ok==1)
{ TR0=1;
wei=0;
if(pp==20)
{ pp=0;
m++;
if(m==60)
{ m=0;
f++;
if(f==60)
{ f=0;
s++;
if(s==24) //为24h一个循环,若要12h,只需在此改为12即可。
{ s=0;
}
}
}
}
a0=s%10;
a1=s/10;
b0=f%10;
b1=f/10;
c0=m%10;
c1=m/10;
display(a1,a0,b1,b0,c1,c0);
}
else
{if(change==1)
{ TR0=0;
keyscan();
if(key!=10)
{ switch(wei)
{ case 1: if(key<3) //小时最高位为2
a1=key;
else
wei--;
break;
case 2: if(a1==1|a1==0)
a0=key;
else
if(key<5)
a0=key; //当小时最高位为2时,低位最高为4
break;
case 3: if(key<6) //分钟最高位为5
b1=key;
else
wei--;
break;
case 4: b0=key; break;
case 5: if(key<6) //秒最高位为5
c1=key;
else
wei--;
break;
case 6: c0=key; break;
}
key=10;
}
m=c1*10+c0;
f=b1*10+b0;
s=a1*10+a0;
display(a1,a0,b1,b0,c1,c0);
}
if(dingshi==1)
{ TR0=0;
display(shi20,shi10,fen20,fen10,miao20,miao10);
keyscan();
if(key!=10)
{
switch(wei)
{ case 1: if(key<3) //小时最高位为2
shi20=key;
else
wei--;
break;
case 2: if(a1==1|a1==0)
shi10=key;
else
if(key<5)
a0=key; //当小时最高位为2时,低位最高为4
break;
case 3: if(key<6) //分钟最高位为5
fen20=key;
else
wei--;
break;
case 4: fen10=key; break;
case 5: if(key<6) //秒最高位为5
miao20=key;
else
wei--;
break;
case 6: miao10=key; break;
}
key=10;
}
yidingshi=1;
display(shi20,shi10,fen20,fen10,miao20,miao10);
}
}
if(yidingshi==1)
{ if((a1==shi20)&&(a0==shi10)&&(b1==fen20)&&(b0==fen10)&&(c1==miao20)&&(c0= =miao10))
beep=0;
}
if(((a1==shi20)&&(a0==shi10)&&(b1==fen20)&&(b0==fen10+1)&&(c1==miao20)&&(c0 ==miao10))||(yidingshi==0))//一分钟报时提示
beep=1;
}
}
/****************定时器T0中断函数*********************/
void time0() interrupt 1
{ TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
pp++;
}
6 实验测试部分6.1测试结果
6.1.1电子钟正常的运行
图6.1
6.1.2电子钟矫正时间后的运行
图6.2
6.2测试结果分析与结论
该程序为数码管显示可调且可定时钟表,用到HJ-3G开发板中矩阵键盘的上三排与第四排前两个按键。
若要更改时钟初始值(即时钟校准),可先按下矩阵键盘中的S16键(第三排第三列),此时时钟会暂停。
然后按S6---S15中的键修改矫正当前值,S6--S15分别先后对应数字0到9。
矫正完后,按下S17(第三排最后一个),时钟可继续工作。
若要设置定时时间,可先按下S18(第四排第一个),然后按数字键S6--S15设置定时时间(设置顺序是由高位到低位的顺序),设置完定时后,按下S17可恢复到正常计时状态定时时间到,蜂鸣器会持续响一分钟报时。
若要取消定时,或者蜂鸣器响时想对其关闭,可以按下S19功能键。
7总结
在硬件电路制作阶段,我到图书馆、网上查阅各种资料,在电脑上使用 keil 和万利软件进行以及相关的绘图软件,使自己在理论分析设计和动手操作能力等各方面得到了极大提高。
我通过对设计任务书的具体要求分析思考,再加上在学校进行的各种相关实践和实习积累的经验,在编写程序调试时,遇到了不少困难,这使我学会了耐心分析问题,并进一步锻炼自己去攻破难题的能力。
这次课程设计整体来说是成功的,但我也发现了自己许多错漏和不足之处。
譬如,最简单的程序没写好就想着写更复杂的程序,做事还是缺乏耐性和细心,当有时遇到问题时,总觉得无从下手,对于课本上的知识不能很好的组织起来。
以后会更认真的学习相关内容。
8参考文献
[1] 李朝青.单片机原理及接口技术(简明修订版).杭州:北京航空航天大学出版社,1998
[2] 李广弟.单片机基础[M].北京:北京航空航天大学出版社,1994
[3] 阎石.数字电子技术基础(第三版). 北京:高等教育出版社,1989
[4] 廖常初.现场总线概述[J].电工技术,1999.
[5] 丁元杰单片微机原理及应用(第三版)机械工业出版社,2005
[6] 杨景常,谢维成单片微机原理及应用实验指导西华大学印,2011。