简易秒表时钟的设计.docx
《简易秒表时钟的设计.docx》由会员分享,可在线阅读,更多相关《简易秒表时钟的设计.docx(24页珍藏版)》请在冰豆网上搜索。
简易秒表时钟的设计
单片机课程设计报告书
课题名称
简易时钟/秒表计时器
姓名
董天奇
学号
2009010545
院、系、部
物理与电子科学系
专业
电子信息科学与技术
指导教师
丁雷
2011年12月12日
一、设计任务及要求:
设计任务:
1、用6位LED数码管显示时、分、秒,以24h〔小时〕计时方式显示;显示格式为:
13.:
25:
15或自行设计显示格式。
2、通过按键进展时钟/秒表功能的转换,时钟计时每1s进展加1操作,秒表计时每10ms进展加1操作。
3、按键实现计时启动、暂停及清零功能。
要求:
指导教师签名:
年月日
二、指导教师评语:
指导教师签名:
年月日
三、成绩
指导教师签名:
年月日
一、引言………………………………………………………………………………………3
1.1秒表概述………………………………………………………………………………3
1.2设计任务………………………………………………………………………………3
1.3系统主要功能…………………………………………………………………………3
二、系统的硬件设计…………………………………………………………………………5
2.1秒表时钟计时器的硬件电路…………………………………………………………5
2.2电路原理图……………………………………………………………………………6
2.3AT89C2052单片机及其引脚说明……………………………………………………6
三、系统软件设计……………………………………………………………………………9
3.1秒表时钟计时器主程序………………………………………………………………9
3.2秒表时钟计时器显示子程序…………………………………………………………9
3.3定时器中断效劳程序…………………………………………………………………10
3.4调时功能程序…………………………………………………………………………10
3.5秒表时钟功能程序……………………………………………………………………10
四、控制源程序………………………………………………………………………………11
五、简易秒表时钟仿真………………………………………………………………………11
六、完毕语……………………………………………………………………………………19
七、参考文献…………………………………………………………………………………19
1、引言
1.1秒表概述
秒表是电器制造,电国,工业自动化控制、国防、实验室及科研单位理想的计时仪器,它广泛应用于各种继电器、电磁开关,控制器、廷时器、定时器等的时间测试。
目前所使用的电秒表大多是指针式或集成电路型的,构造相对复杂、测试功能单一。
本仪器还具有实时时钟、手动计时的功能。
1.2本设计任务
1、以24h〔小时〕计时方式,显示格式为:
13-25-15
2、用八位LED数码管显示时、分、秒
3、使用按键开关可实现时分调整
4、使用按键开关可实现时分秒表/时钟功能转换通过按键进展时钟/秒表功
能的转换,时钟计时每1s进展加1操作,秒表计时每10ms进展加1操
作。
5、按键实现计时启动、暂停及清零功能。
6、省电模式
1.3系统主要功能
1.3.1时钟功能
对于时钟功能,需要在数码管上显示小时、分钟和秒钟,因此,可以在内部存储空间分别定义它们的显示缓存空间,来存放小时、分钟和秒钟的BCD码,各2个字节。
由于时钟是不能停顿的,因此需要采用内部定时器自动计时,并使用定时器中断处理程序来定时进展时间数值的刷新。
52单片机的2个定时器都具有16位定时器的工作模式。
当晶振为12MHz时,16位定时器的最大定时值为65.536mS;要到达1秒钟,可以采用两种方法:
采用一个定时器定时与软件计数相结合的方法;或者采用两个定时器级联的方法。
由于秒表在计时功能时也需要用到1个定时器,因此,我们采用第一个方法,只使用1个定时器,例如使用T0。
为了到达较为准确的计时,使T0的溢出时间为50ms,使用一个字节作为软件计数器ST,计数值为20。
定时器的中断处理程序对ST进展减1操作,当ST为0时,1秒到达,此时更新存放小时、分钟、秒钟的显示缓存区。
1.3.2计时功能
当秒表用作计时功能时,也需要一个定时器进展10MS的定时,在本例中使用单片机的TIMER1。
在TIMER1的中断处理程序中对SS和ss的缓存空间进展更新,与上面类似。
1.3.3功能按键
再看按键的处理。
可以采用查询的方法来识别。
对于A键,主要功能在于功能切换。
对于B键,主要功能是时钟的时分秒调整的转换和秒表的启动和暂停,对于C、D键用于秒表的复位和调整。
1.3.4中断嵌套和控制
现在在我的方案中有2个中断,T0、T1中断。
这3个中断的特点是:
T0的工作是连续的,可以在误差X围内可以被打断但不可以停顿。
2、系统硬件设计
2.1秒表/时钟计时器的硬件电路
秒表/时钟计时器的硬件电路如下图,采用AT89C52单片机,最小化应用设计;采用共阳七段LED显示器,P0口输出段码数据,P2.0-P2.5口作列扫描输出,P1.0、P1.1、P1.2口接三个按钮开关,用以调时及功能设置。
为了提供共阳LED数码管的驱动电压,用三极管8550作电源驱动输出。
采用12M晶振,有利于提高秒计时的准确性。
图2.1硬件系统的总体设计框架
P3口引脚
特殊功能
P3.0
RXD〔串行输入口〕
P3.1
TXD〔串行输出口〕
P3.2
〔外部中断0〕
P3.3
〔外部中断1〕
P3.4
T0〔定时器0外部输入〕
P3.5
T1〔定时器1外部输入〕
图2.2P3口特殊功能
2.2电路原理图设计
电路原理图设计最根本的要求是正确性,其次是布局合理,最后在正确性和布局合理的前提下力求美观。
设计电路原理图:
图2.3电路原理图
2.3AT89C52单片机及其引脚说明
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器〔RAM〕,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为您提供许多较复杂系统控制应用场合。
图2.4AT89C52芯片
AT89C52有40个引脚,32个外部双向输入/输出〔I/O〕端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进展编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发本钱。
AT89C52有PDIP、PQFP/TQFP及PLCC等三种封装形式,以适应不同产品的需求。
主要功能特性:
•兼容MCS51指令系统
•8k可反复擦写(>1000次〕FlashROM
•32个双向I/O口
•256x8bit内部RAM
•3个16位可编程定时/计数器中断
•时钟频率0-24MHz
•2个串行中断
•可编程UART串行通道
•2个外部中断源
•共6个中断源
•2个读写中断口线
•3级加密位
•低功耗空闲和掉电模式
•软件设置睡眠和唤醒功能
3、系统程序的设计
3.1主程序
本设计中,计时采用定时器T0中断完成,其余状态循环调用显示子程序,当端口开关按下时,转入相应功能程序。
其主程序执行流程见下列图
3.2显示子程序
数码管显示的数据存放在内存单元70H-75H中。
其中70H-71H存放秒数据,72H-73H存放分数据,74H-75H存放时数据,每一地址单元内均为十进制BCD码。
由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。
显示时,先取出70H-75H某一地址中的数据,然后查得对应的显示用段码,并从P0口输出,P2口将对应的数码管选中供电,就能显示该地址单元的数据值。
为了显示小数点及“-〞、“A〞等特殊字符,在显示班级及计时时采用不同的显示子程序。
3.3定时器T0、T1中断效劳程序
定时器TO、T1用于时间计时,定时溢出中断周期可分别设为50ms和10ms.中断进入后,现判断是时钟计时还是秒表计时,时钟计时累计中断20次〔即1s〕时,对秒计数单元进展加1操作,秒表计时每10ms进展加1操作。
在计数单元中采用十进制BCD码计数,满60〔秒表功能时有100〕进位,T0中断效劳程序执行流程见下列图
图3.2
定时器T0、T1溢出周期为50ms(10ms),T0为秒计数用,T1为调整时闪烁用;P1.0,P1.1,P1.2为调整按钮,P0口为字符输出口,采用共阳显示管。
3.4调时功能程序
调时功能程序的设计方法时:
按下P3.1口按键,时钟进入调秒状态,等待操作,此时计时器停顿走动。
再按下P3.2、P3.3按钮时,那么时间加一或减一秒;假设再按下P3.1,那么进入分钟调整状态,分钟小时调整如上。
再按P3.1进入小时调整,再按此键退出调整状态,时钟继续走动。
3.5时钟/秒表功能程序
在正常计时状态下,假设按下P3.0口按键,那么进展时钟/秒表功能的转换,转换后计时从开场。
当按下P3.1口的按键时,可实现计时启动、暂停功能。
按P3.2可实现清零。
4、控制源程序清单
#include"reg52.h"
#defineuintunsignedint
#defineucharunsignedchar
sbitkey1=P3^1;
sbitkey2=P3^2;
sbitkey3=P3^3;
sbitkey4=P3^0;
uintaa,bb;
uintcount,count1,count2,count3,countkey,count11,count22,count33,countkey1;
uintcount4=10;
uchartable[]={
0X3F,0X06,0X5B,0X4F,0X66,
0X6D,0X7D,0X07,0X7F,0X6F,
};
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidkeyscan1()
{
if(key4==0)
{
delay(5);
if(key4==0)
{
while(!
key4);
count++;
if(count==3)
{
count=0;
}
}
}
if(count==1)
{if(key2==0)
{count11=0;
count22=0;
count33=0;
}
if(key1==0)
{
delay(5);
if(key1==0)
{
while(!
key1);
countkey1++;
if(countkey1==2)
{
countkey1=0;
}
}
}
if(countkey1==1)
{
TR1=1;
}
if(countkey1==0)
TR1=0;
}
if(count==0)
{if(key1==0)
{
delay(5);
if(key1==0)
{
while(!
key1);
TR0=0;
countkey++;
if(countkey==4)
{
TR0=1;
countkey=0;
}
}
}
if(countkey==1)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!
key2);
count1++;
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!
key3);
count1--;
}
}
}
if(countkey==2)
{
if(key2==0)
{
delay(15);
if(key2==0)
{
while(!
key2);
count2++;
}
}
if(key3==0)
{
delay(15);
if(key3==0)
{
while(!
key3);
count2--;
}
}
}
if(countkey==3)
{
if(!
key2)
{delay(5);
if(!
key2)
{
while(!
key2);
count3++;
if(count3==24)
count3=0;
}
}
if(!
key3)
{delay(5);
if(!
key3)
{
while(!
key3);
count3--;
if(count3==0)
count3=24;
}
}
}
if(count4==0)
{
if(!
key2)
{delay(5);
if(!
key2)
{
while(!
key2);
count4++;
}
}
if(!
key3)
{delay(5);
if(!
key3)
{
while(!
key3);
count4--;
}
}
}
}
}
/*voidkeyscan()
{
if(key1==0)
{
delay(10);
if(key1==0)
{TR0=0;
while(!
key);
delay(10);
while(!
key);
if(key2==0)
{
delay(key2==0);
if(key2==0)
{
}
}
}
}
}*/
voiddisplay(uintsecond1,uintsecond10,uintminute1,uintminute10,uinthour1,uinthour10)
{
P1=table[hour10];
P2=0xfe;
delay
(1);
P2=0xff;
P1=table[hour1];
P2=0xfd;
delay
(1);
P2=0xff;
P1=0x40;
P2=0xfb;
delay
(1);
P2=0xff;
P1=table[minute10];
P2=0xf7;
delay
(1);
P2=0xff;
P1=table[minute1];
P2=0xef;
delay
(1);
P2=0xff;
P1=0x40;
P2=0xdf;
delay
(1);
P2=0xff;
P1=table[second10];
P2=0xbf;
delay
(1);
P2=0xff;
P1=table[second1];
P2=0x7f;
delay
(1);
P2=0xff;
}
voidtime0()interrupt1
{
TH0=(65536-40000)/256;
TL0=(65536-40000)%256;
bb++;
if(bb==20)
{
bb=0;
count1++;
}
if(count1==60)
{
count1=0;
count2++;
}
if(count2==60)
{
count2=0;
count3++;
}
if(count3==24)
{
count3=0;
}
}
voidtime1()interrupt3
{
TH1=(65536-400)/256;
TL1=(65536-400)%256;
aa++;
if(aa==20)
{
aa=0;
count11++;
}
if(count11==100)
{
count11=0;
count22++;
}
if(count22==60)
{
count22=0;
count33++;
}
if(count33==60)
{
count33=0;
}
}
voidmain()
{key1=1;key2=1;key3=1;key4=1;
TMOD=0X11;
TH0=(65536-40000)/256;
TL0=(65536-40000)%256;
TH1=(65536-400)/256;
TL1=(65536-400)%256;
EA=1;
ET1=1;
ET0=1;
TR0=1;
while
(1)
{keyscan1();
if(count==0)display(count1%10,count1/10,count2%10,count2/10,count3%10,count3/10);
if(count==1)display(count11%10,count11/10,count22%10,count22/10,count33%10,count33/10);
if(count==2)P2=0xff;
}}
5、简易秒表/时钟的仿真
1、Keil调试
图3-1程序调试完成图
2、Proteus调试
6、结束语
通过本次课程设计较系统地掌握有关单片机控制的设计思想和设计方法,主要对AT89C52的构造、功能、内部资源等了解并对其进展测试和加以应用的知识得到学习。
通过这个课程设计,我发现了单片机功能的强大,能应用于各种领域。
在自己以后的学习中,不仅要有刻苦努力,要有钻研精神,还要有创新,对自己感兴趣的一定要用心去学。
7、参考文献
[1]鑫,华臻,陈书谦,?
单片机原理及应用?
,电子工业,2005.8,第1次印刷
[2]光友,朱宏辉,?
单片微型计算机原理及接口技术?
,水利水电2002.9,第1版,第3次印刷
[3]杨文龙,?
单片机原理及应用?
,XX电子科技大学1993,6,第1版
[4]夏路易,石宗义,?
电路原理图与电路板设计教程?
希望电子工业出版2002
[5]微分半动力系统的不变集[D].:
大学数学系数学研究所,1983:
1-7.
[6]李大伦.经济全球化的重要性[N].光明日报,1998-12-27(3).
[7]蠡甫.西方文论选[C].XX:
XX译文,1979:
12-17.
[8]桥.核反响堆压力管道与压力容器的LBB分析[R].:
清华大学核能技术设计研究院,1997:
9-10.
[9]微分半动力系统的不变集[D].:
大学数学系数学研究所,1983:
1-7.
[10]伍蠡甫.西方文论选[C].XX:
XX译文,1979:
12-17.