基于单片机的电子时钟设计.docx
- 文档编号:23758039
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:21
- 大小:615.53KB
基于单片机的电子时钟设计.docx
《基于单片机的电子时钟设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子时钟设计.docx(21页珍藏版)》请在冰豆网上搜索。
基于单片机的电子时钟设计
摘要
本课程设计的要求是利用AT89C51系列单片机,利用程序控制7段数码管来设计一个具有控制和定时功能的数字电子时钟。
在本次课程设计中,首先介绍分析了AT89C52单片机的功能和各I/O的功能,设计了复位电路和晶振电路,复位电路主要用于时钟的复位和实现秒表功能,晶振给单片机提供内在频率,这些都是必不可少的。
再设计了控制按键,通过P3口来控制,具有调节时钟的作用,采用共阳极的数码管作为显示系统,用P1口控制数码管段选,P0口控制数码管位选,分别显示时、分、秒。
本论文还给出了系统原程序和程序流程图。
关键字:
单片机,中断,计时,流程图
摘要···································································4
1电子时钟总体方案论证··············································6
1.1电子时钟设计要求················································6
1.2实现时钟计时的基本方法·········································6
1.3电子钟的时间显示················································6
2电子时钟硬件电路设计··············································7
2.1芯片分析··························································7
2.2晶振电路设计··········································82.3复位电路设计······················································9
2.4按键模块设计······················································9
2.5数码管显示模块设计··············································10
3电子时钟软件设计··················································11
3.1程序设计流程图···················································11
3.2程序设计原代码···················································13
4安装调试及运行结果分析···········································23
总结··································································24
参考文献·····························································25
附表一.效果图························································26附表二.器件清单·····················································27
1电子时钟总体方案论证
1.1电子时钟设计要求
1、用6个7段LED数码管作为显示设备,设计时钟功能;
2、可以分别设定小时、分钟和秒,复位后时间为00:
00:
00;
3、秒钟复位功能,秒复位键按下后,秒回到00。
1.2实现时钟计时的基本方法
利用AT89S51单片机内部的定时/计数器进行中断时,配合软件延时实现时、分、秒的计时。
该方案节省硬件成本,且能使读者在定时/计数器的使用、中断及程序设计方面得到锻炼与提高,对单片机的指令系统能有更深入的了解,从而对学好单片机技术这门课程起到一定的作用。
利用MCS-51系列单片机的可编程定时/计数器、中断系统来实现时钟计数。
1、计数初值计算:
把定时器设为工作方式1,定时时间为50ms,则计数溢出20次即得时钟计时最小单位秒,而100次计数可用软件方法实现。
假设使用T/C0,方式1,50ms定时,fosc=12MHz。
则初值X满足(216-X)×1/12MHz×12μs=50000μsX=15536→0011110010110000→3CB0H
2、采用中断方式进行溢出次数累计,计满20次为秒计时(1秒);
3、从秒到分和从分到时的计时是通过累加和数值比较实现。
1.3电子钟的时间显示
电子钟的时钟时间在六位数码管上进行显示,因此,在内部RAM中设置显示缓冲区共8个单元。
表1.1
LED8
LED7
LED6
LED5
LED4
LED3
LED2
LED1
37H
36H
35H
34H
33H
32H
31H
30H
时十位
时个位
分隔
分十位
分个位
分隔
秒十位
秒个位
2电子时钟硬件电路计
2.1芯片分析
AT89C52单片机引脚图如下。
图2.1AT89C51引脚图
MCS-52单片机是标准的40引脚双列直插式集成电路芯片,其各引脚功能如下:
VCC:
+5V电源。
VSS:
接地。
RST:
复位信号。
当输入的复位信号延续两个机器周期以上的高电平时即为有效,用完成单片机的复位初始化操作。
XTAL1和XTAL2:
外接晶体引线端。
当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。
P0口:
P0口为一个8位漏极开路双向I/O口,当作输出口使用时,必须接上拉电阻才能有高电平输出;当作输入口使用时,必须先向电路中的锁存器写入“1”,使FET截止,以避免锁存器为“0”状态时对引脚读入的干扰。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,它不再需要多路转接电路MUX;因此它作为输出口使用时,无需再外接上拉电阻,当作为输入口使用时,同样也需先向其锁存器写“1”,使输出驱动电路的FET截止。
P2口:
P2口电路比P1口电路多了一个多路转接电路MUX,这又正好与P0口一样。
P2口可以作为通用的I/O口使用,这时多路转接电路开关倒向锁丰存器Q端。
P3口:
P3口特点在于,为适应引脚信号第二功能的需要,增加了第二功能控制逻辑。
当作为I/O口使用时,第二功能信号引线应保持高电平,与非门开通,以维持从锁存器到输出端数据输出通路的畅通。
当输出第二功能信号时,该位应应置“1”,使与非门对第二功能信号的输出是畅通的,从而实现第二功能信号的输出。
[1]
根据以上的电子时钟的设计要求与芯片分析,可以分为以下的几个硬件电路模块如下面得方框电路所示。
图2.2硬件电路方框图
2.2晶振电路设计
在AT89S52芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。
时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
时钟电路原理图如下图所示。
图2.3晶振电路
2.3复位电路设计
单片机复位的条件是:
必须使RST/VPD加上持续两个机器周期(即24个振荡周期)的高电平。
例如,若时钟频率为12MHz,每机器周期为1μs,则只需2μs以上时间的高电平,在RST引脚出现高电平后的第二个机器周期执行复位。
单片机常见的复位如图所示。
电路为上电复位电路,它是利用电容充电来实现的。
在接电瞬间,RESET端的电位与VCC相同,随着充电电流的减少,RESET的电位逐渐下降。
只要保证RESET为高电平的时间大于两个机器周期,便能正常复位。
该电路除具有上电复位功能外,若要复位,只需按图中的RESET键,此时电源VCC经电阻R1、R2分压,在RESET端产生一个复位高电平。
复位电路图如下。
图2.4单片机复位电路
2.4按键模块设计键盘可以分为独立连接式和行列式两类,本设计键盘是独立键盘。
为提高CPU的效率,采用中断扫描工作方式,各按键相互独立地接通一条输入数据线,当任何一个键按下时,与之相连的输入数据线被清0(低电平),而平时改线为1(高电平),并用单片机的位来处理这些指令。
只有在有按键按下时才产生中断申请,CPU响应中断,进入中断服务程序,进入键盘扫描,并做响应处理。
下图为按键模块电路原理图,左为电子时钟时间显示位控制键,中为时间加,右为时间减。
.
图2.5按键模块电路原理图
2.5数码管显示模块设计
系统采用动态显示方式,用P0口来控制LED数码管的段控线,而用P1口来控制其位控线。
动态显示通常都是采用动态扫描的方法进行显示,即循环点亮每一个数码管,这样虽然在任何时刻都只有一位数码管被点亮,但由于人眼存在视觉残留效应,只要数码管间隔时间足够短,就可以给人以同时显示的感觉。
图2.6数码显示电路
3电子时钟软件设计
3.1软件设计流程图
图3.1主程序流程图
图3.2中断服务程序
图3.3按键子程序流程图
3.2程序设计源代码
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitkey1=P3^0;
sbitkey2=P3^1;
sbitkey3=P3^2;
sbitaa=P1^0;
sbitbb=P1^1;
sbitcc=P1^2;
sbitdd=P1^3;
sbitee=P1^4;
sbitff=P1^5;
uchart,i,j;
uchari,datp;
ucharcodesmg_table[]={
~0x3f,~0x06,~0x5b,~0x4f,
~0x66,~0x6d,~0x7d,~0x07,
~0x7f,~0x6f};
charmiao,fen,shi;
ucharkeynum;
voiddelay(uintz)//延时子程序
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidsmg_wei(uchari)//数码管位选调用子程序
{
switch(i)
{
case0:
P1=0xef;break;
case1:
P1=0x02;break;
case2:
P1=0x04;break;
case3:
P1=0x08;break;
case4:
P1=0x10;break;
case5:
P1=0x20;break;
}
}
voidsmg_num(ucharnum)//数码管段选显示程序
{
P0=smg_table[num];
if(datp==1)
{
datp=0;P0=(smg_table[num])&0x7f;//在相应位加标点
}
}
voidsmg_dispaly(ucharadd,ucharsu)//把数码管位选段选综合写成一个函数方便直接调用数码管
{
smg_wei(add);
smg_num(su/10);
delay(4);
P0=0x00;//消重影
if((add==0)||(add==2))
{datp=1;}
smg_wei(add+1);
smg_num(su%10);
delay(4);
P0=0x00;//消重影
}
voidT0_time()interrupt1//中断用定时来计数
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
t++;
if(t==18)
{
t=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
}
}
}
}
voidinit()//中断的初始化
{
P3=0xff;
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
voidkeymen()//按键程序
{
if(key1==0)//模式见可以进入调时模式可分别调时分秒和退出调时模式
{
delay(5);
if(key1==0)
{
keynum++;
while(!
key1);
if(keynum==1)
{
TR0=0;//关定时器
}
if(keynum==4)
{
keynum=0;
TR0=1;//开定时器
}
}
}if(keynum!
=0)//当进入调时模式时keynum不等于0,用keynum的值可分辨是调节时分秒那个
{
if(key2==0)//调节+号键
{
delay(5);//按键消抖
if(key2==0)
{
while(!
key2);//松手检测
if(keynum==1)//keynum==1是调节秒
{
miao++;
if(miao==60)
{
miao=0;
}
smg_dispaly(4,miao);//并送数码管显示
}
if(keynum==2)
{
fen++;
if(fen==60)
{
fen=0;
}
smg_dispaly(2,fen);
}
if(keynum==3)
{
shi++;
if(shi==24)
{
shi=0;
}
smg_dispaly(0,shi);
}
}
}
if(key3==0)//减号键
{
delay(5);
if(key3==0)
{
while(!
key3);
if(keynum==1)
{
miao--;
if(miao==-1)
{
miao=59;
}
smg_dispaly(4,miao);
}
if(keynum==2)
{
fen--;
if(fen==-1)
{
fen=59;
}
smg_dispaly(2,fen);
}
if(keynum==3)
{
shi--;
if(shi==-1)
{
shi=23;
}
smg_dispaly(0,shi);
}
}
}
}
}
voidmain()
{
init();//中断初始化
while
(1)
{
keymen();//主程序中需要一直扫描按键是否按下
switch(keynum)
{
case0:
break;
case1:
(ee=0,ff=0);smg_dispaly(4,miao);//在调节秒的模式下只让秒显示出来时和分没有显示
break;
case2:
(cc=0,dd=0);smg_dispaly(2,fen);//同上为分
break;
case3:
(aa=0,bb=0);smg_dispaly(0,shi);
break;
}
if(TR0==1)//当进入调时模式时定时器需要关闭并且关闭时分秒的时时显示当退出调时模式时时间需要时时显示
{
smg_dispaly(0,shi);
smg_dispaly(2,fen);
smg_dispaly(4,miao);
}
}
}
4安装调试及运行结果分析
电子时钟主要的设计要求是能够实现时钟的一般功能,以及包括时间的调整功能,这个基于单片机的电子时钟基本上实现了上述功能,能够通过时间调整电路对时间进行调整以及复位。
AT89S52的P0口和P2口外接由六个LED数码管(LED6~LED1)构成的显示器,用P0口作LED的段码输出口,P1口作六个LED数码管的位控输出线,P3口外接三个按键左、中、右构成键盘电路。
电子钟设置3个按键通过程序控制来实现电子钟的时间调整,左控制位,中、右分别控制时间的加和减。
一开始电子时钟并没有达到显示要求,经检测发现是段选的引脚焊锡没有达标,经改进好达到了要求。
本时钟经检测存在一定得误差,分析原因是晶振的频率的固有缺陷,如果使用74LS164芯片可以提高时钟精度。
[2]
图4.1实物效果图
参考文献:
[1]陈自美.电子电路设计·实验·测试[M].武汉.华中理工出版社,1992
[2]李朝青.单片机原理及接口技术[M].北京.北京航空航天大学出版社,2005
[3]陈同洲,郭华帅,中国传媒大学学报,2009年3月,第16卷第1期,《电子时钟仿真及FPGA实现》
[4]吴镇宇,2005年9月,《片上时钟系统的研究与的设计》
[5]李建忠,2004年,西安电子科技大学出版社,《单片机原理及应用》
[6]孙彩兰蒋海琳,计算机与信息技术,软件纵横,《基于C语言为内核的电子时钟设计》
[7]彭小军,新余高专学报,2006年4月,第9卷第2期,《用单片机实现电子时钟》
[8]颜学超,2006年5月,《一种实时时钟芯片的设计》
总结
经过近两个礼拜的努力,终于完成了刘丽老师交给我们的任务,把这个简易的电子时钟做了出来,功能也基本上满足了课程任务书的要求,能满足复位清零功能和调时功能,但还有不足,没有实现秒表功能,因为只用了一块AT89C52时钟的精度可能不会太高,本时钟的拓展功能还是很宽的。
另外在本次课程设计中发现自己的很多不足,最明显的感触就是,课堂上学的东西要与实践联系起来还是有一段距离,但自己也学到了很多东西,严谨的科学态度让我学到了很多,还有对于单片机的课程设计中程序的算法是很重要的,如何设计出巧妙的算法来实现所以得功能,这对个设计很重要,对设计人员的要求也很高,稍微一点的失误都可能造成功能实现不了。
在这次课程设计中我真真切切的意识到:
在以后得学习中要理论联系实际,自己能动手的多动手去做,实践是检验真理的唯一标准,不断的练习和实际操作是这次课程设计最大的收获,这也是离不开任课老师平时的细心指导。
本次设计有了很大的进步,让我对单片机课程设计有了个更加全面的了解,但由于时间紧迫,没能开发出更多的功能来体现电子时钟的优越性,不足的地方希望老师和同学及时指正以便我的进一步改进。
谢谢
附录1硬件电路总图
附录2元器件清单
序号
元件名称
规格型号/参数
数量(个)
1
单片机
AT89S52
1
2
显示驱动三极管
S9013
6
3
晶振
12MHz
1
4
电容
30pF的2个,22μF的1个
5
按键
BUTTON
4
6
排阻
RESPACK-8/10K
1
7
电阻
470的电阻6个,1K的三个,10K的一个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 电子 时钟 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)