电子时钟计时器的设计c语言版调试完美通过可直接使用附原理图源程序以及完整的文档汇总Word文件下载.docx
《电子时钟计时器的设计c语言版调试完美通过可直接使用附原理图源程序以及完整的文档汇总Word文件下载.docx》由会员分享,可在线阅读,更多相关《电子时钟计时器的设计c语言版调试完美通过可直接使用附原理图源程序以及完整的文档汇总Word文件下载.docx(46页珍藏版)》请在冰豆网上搜索。
教学系审核意见:
主任签字:
年月日
摘要
时钟是人类日常生活必不可少的工具,本设计从日常生活中常见的事物入手,通过对电子时钟的设计,让我们认识到单片机已经深入到我们生活的每个领域,该设计不仅可以锻炼我们的动手能力,而且可以加深我们对单片机的认识和激发我们对未知科学领域的探索。
本文利用单片机实现数字时钟计时功能的主要内容。
它体积小,成本低、功能强、使用方便、可靠性高等一系列优点,广泛应用于智能产业和工业自动化上。
本次设计采用独立式按键进行时间调整,其中STC89C52是核心元件,同时采用数码管LED动态显示“时”,“分”,“秒”的现代计时装置。
与传统机械表相比,它具有走时精确,显示直观等特点。
它的计时周期为24小时,显满刻度为“23时59分59秒”,另外利用DS1302具有校时功能,断电后有记忆功能,恢复供电时可实现计时同步等特点。
该系统同时具有硬件设计简单、工作稳定性高、价格低廉等优点。
关键词:
STC89C52;
LED数码管;
8255芯片;
DS1302芯片;
电子时钟的设计
设计要求
利用单片机作为控制核心,完成一个时钟计时器。
具体要求如下:
(1)采用6位LED数码显示时、分、秒。
(2)时制式为24小时制。
(3)使用按键开关可实现时、分调整。
(4)秒表/时钟功能转换。
(5)定时设定提醒的功能。
(6)整点提醒(蜂鸣)。
(7)DS1302设时,对时,掉电记忆时间的功能。
1.方案论证与对比
1.1方案一
此方案采用单片机内部定时器T0进行计时,STC89S52实时控制。
如图1所示:
图1方案一系统方框图
1.2方案二
此方案采用专用时钟芯片DS1302精确计时,单片机STC89C52实时读取时钟显示至6位数码管。
如图2所示:
图2方案二系统方框图
1.3方案对比
以上方案中,方案一设计简洁,编程比较简单,计时精度不高,准确性不能完全保证。
虽硬件简洁、成本更低廉、便于实现,绿色环保,编程简单易写,不能达到提高同学们编程的能力和对单片机及其扩展芯片的学习和深程度的去了解单片机及其更广泛的应用,故在此我们选择挑战,放弃对其选择。
虽然我们对其进行了放弃,但我们也把此方法的程序写好以便进行对比。
方案二与方案一相比,编程比较复杂,计时精度较高,而且可以灵活运用,可扩展性好,并能充分的利用单片机的有效资源。
还可让我们培养我们的自学能力,自己去发掘单片机内部结构及其扩展功能,自己去学会怎样对其他芯片控制的学习方法,使得课程设计具有一定的挑战性,正因如此,故我们选择方案二。
2.系统硬件电路的设计
2.1单片机的选择及引脚功能介绍
STC89C52具有如下特点:
40个引脚(引脚图如图四所示),4kBytesFlash片内程序存储器,128bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
此外,STC89C52RC设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
图4STC89C52芯片引脚图
引脚功能介绍:
VCC(40):
+5V;
GND(20):
接地;
P0口(39-32):
P0口为8位漏极开路双向I/O口,每引脚可吸收8个TTL门电流;
P1口(1-8):
P1口是从内部提供上拉电阻器的8位双向I/O口,P1口缓冲器能接收和输出4个TTL门电流;
P2口(21-28):
P2口为内部上拉电阻器的8位双向I/O口,P2口缓冲器可接收和输出4个TTL门电流;
P3口(10-17):
P3口是8个带内部上拉电阻器的双向I/O口,可接收和输出4个TTL门电流,P3口也可作为AT89C51的特殊功能口;
RST(9):
复位输入。
当振荡器复位时,要保持RST引脚2个机器周期的高电平时间;
ALE/PROG(30):
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节,在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6,它可用作对外部输出的脉冲或用于定时目的,要注意的是,每当访问外部数据存储器时,将跳过1个ALE脉冲;
PSEN(29):
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期2次PSEN有效,但在访问外部数据存储器时,这2次有效的PSEN信号将不出现;
EA/VPP(31):
当EA保持低电平时,外部程序存储器地址为(0000H-FFFFH)不管是否有内部程序存储器。
FLASH编程期间,此引脚也用于施加12V编程电源(VPP);
XTAL1(19):
反向振荡器放大器的输入及内部时钟工作电路的输入;
XTAL2(18):
来自反向振荡器的输出。
2.28255A芯片的结构及引脚功能介绍
8255A芯片是Intel公司生产的通用可编程并行接口电路,广泛应用于单片机扩展并行I/O口。
它具有8个位并行口PA、PB和PC。
8255A芯片的内部结构及引脚如图5所示。
(1).8255A的内部结构
8255A的内部结构有以下几部分组成:
a.并行I/O端口A、B、C8255A的内部有3个8位并行I/O口:
A口、B口、C口。
3个I/O口都可以通过编程选择为输入口或输出口,但在结构和功能上有所不同。
A口:
含有一个8位数据输出锁存/缓冲器和一个8位输入锁存器。
B口:
含有一个8位数据输出锁存/缓冲器和一个8位输入锁存器(不锁存)。
C口:
当数据传送不需要联络信号时,这3个端口都可以用作输入口或输出口。
当A口B口需要有联络信号时,C口可以作为A口和B口的联络信号线。
b.工作方式控制电路:
8255A的三个端口在使用使可分为A、B两组。
A组包括A口8位和C口高4位:
B组包括B口8位和C口低4位。
两组的控制电路中分别有控制寄存器,根据写入的控制字决定两组的工作方式,也可对C口每一位置“1”或清“0”。
c.数据总线缓冲器:
数据总线缓冲器是三态双向的8位缓冲器,是8255A与单片机数据总线的接口,8255A的D0~D7可以和AT89C51单片机的P0.0~P0.7直接相连。
数据的输入输出、控制字和状态信息的传递,均可通过数据总线缓冲器进行。
d.读/写控制逻辑:
8255A读/写控制逻辑的作用是从CPU的地址和控制总线上接受有关信号,转变成各种控制命令送到数据缓冲器及A组和B组的控制电路,控制A、B、C3个端口的操作。
其引脚图如图5所示:
图58255引脚图
8255A共有40个引脚,一般为双列直插DIP封装,40个引脚可分为与CPU连接的数据线、地址和控制信号以及与外围设备连接的三个端口线。
D0~D7:
双向三态数据总线。
RESET:
复位信号,输入,高电平有效。
复位后,控制寄存器清0,A口、B口、C口被置为输入方式。
CS:
片选信号,输入,低电平有效。
RD.:
读信号,输入,低电平有效。
有效时,允许CPU通过8255AD0~D7读取数据或状态信息。
WR.:
写信号,输入,低电平有效。
有效时,允许
A1A0:
端口控制信号,输入。
2位可构成四种状态,分别寻址A口、B口、C口和控制寄存器
PA0~PA7:
A口数据线,双向。
PB0~PB7:
B口数据线,双向。
PC0~PC7:
C口数据/信号线,双向。
当8255A工作于方式0时,PC0~PC7分为两组(每组4位)并行I/O数据线;
当8255A工作于方式1或方式2时,PC0~PC7为A口、B口提供联络信号。
2.3DS1302芯片的结构及引脚功能介绍
DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×
8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
(1).DS1302的引脚功能及结构
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;
其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc≥2.5V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
I/O为串行数据输入输出端(双向),后面有详细说明。
SCLK始终是输入端。
DS1302的引脚功能以及单片机的连接图如图6
图6DS1302引脚及其与单片机连接的原理图
2.4显示电路设计
单片机中通常用七段LED构成字型“8”,另外,还有一个小数点发光二极管以显示小数位!
这种显示器有共阴和共阳两种!
发光二极管的阳极连在一起的(公共端)称为共阳极显示器,阴极连在一起的称为共阴极显示器。
一位显示器由8个发光二极管组成,其中,7个发光二极管构成字型“8”的各个笔划(段),a_g,另一个小数点为dp发光二极管。
当在某段发光二极管上施加一定的正向电压时,该段笔画即亮;
不加电压则暗。
为了保护各段LED不被损坏,需外加限流电阻。
由于共阴极连接需加驱动,故在这里我采用的是共阳阳极连接。
以共阳极LED为例,各LED公共阳极K0接高电平,若向各控制端a,b, ┄,g,dp顺次送入00011110信号,则该显示器显示“⒎”字型。
共阴极7段LED显示数字0~F、文字、符号及小数点的编码(a段为最地位,dp点为最高位),如图7。
图7数码管的驱动显示电路设计
2.5电源电路设计
在各种电子设备中,直流稳压电源是必不可少的组成部分,它是电子设备唯一能量来源,它的设计思路是根据我们以前学过的模电电子技术,要想得到我们所要的+6V输出电压,就需将交流220V的电压经过变压器、整流电路、滤波电路和稳压电路四个部分。
2.6键盘动态扫描电路设计
在单片机系统中按键数量较多时,为了减少I/O口的占用,常常将按钮排列成矩阵式键盘中,每条水平线和直线在交叉处不直接连通,而是通过一个按钮加以连接。
这样,一个端口(如P1口)就能组成4*4=16个按钮,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条就能组成20键的键盘,而直接用端口线则只能多出一键(9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是最合理的。
矩阵式键盘的按钮识别办法确定矩阵式键盘上何键被按下简绍一种“行扫描法”。
行扫描法又称为逐行(或列)扫描查询法,是一种最常用的,按钮识别办法,如下图示键盘,介绍过程如下。
判断键盘中有无键盘按下将全部行线置低电平,然后检测列的电平为低,则表示键盘中有键被按下,而且闭合的键位位于低电平线与4根行线相交叉的4个按钮之中。
若所有列线均为高电平,则键盘中无键按下。
判断闭合键所在的位置:
在确认有键按下后,即可置某根行线为低电平时,其他线为高电平。
在确定某根位置为低电平后,再逐行检测各列线的电平状态。
若某列为低,则该列与置为低电平的行线交叉处的按钮就是闭合的按钮。
将程序通过串口下载到单片机中,在键盘上按任意键时,将会在数码管上显示对应的字符。
为了驱动键盘,同上以8255_PC第四位作为输入,8255PC高四位作为列扫描输出,以此来实现动态扫描显示法。
如图8所示:
图8键盘动态扫描电路设计
3.控制系统的软件设计
3.1主程序流程图
本设计中主程序主要实现显示的初始化和调用各子程序工作的功能,读取时间的子程序主要实现初始化,时间信息的采集和显示段码的码的存取。
分别对各个器件的功能进行编程设计,根据主程序流程图(如下)进行全面的分析。
设计中计时主要以定时器T0中断完成,定点闹铃使用峰鸣器来完成。
当端口有开关按下时,转入相应的功能程序。
其主程序执行流程图如下图9:
图9主程序流程图
3.2显示子程序
时间显示子程序显示时钟芯片3个内存单元(小时、分钟、秒钟)的BCD码数据,8255的PA口送数码管的位选编码。
8255的PB口送段选编码,位选段选编码存放在ROM表中。
显示时,先取出位选编码数据,然后送至PA口输出,接着取出段选编码数据送至PB口输出,剩下的数码管以同样地方法送数据直到将3个内存单元的数据分成6个位全部送去数码管显示。
数码管显示子程序流程图如图9所示:
图10数码管显示子程序流程图
3.3闹钟时间设定功能程序
在时钟状态下,触发外中断1时,进入闹钟时间设定模式,且不影响T0计时器的功能状态,在键盘上输入对应的数字进行时间设定。
当分别按下调节时钟、分钟和秒钟的个位时,时间自动确定,闹钟时间只精确到分钟。
闹钟时间设定流程图如图11所示:
图11闹钟时间设定流程图
3.4键盘扫描程序
本设计采用动态扫描法,动态扫描法不仅扫描键阵,也可以实现显示,是目前应用十分广泛的一种方法。
动态扫描法是采用输出“移动”信号,轮流对各行按键进行检测来实现的。
设置行线为输出,列线为输入,当无按键按下时,列输入全为“1”.设计时,将某一行输出为“0”,读取列线值,若其中某一位为“0”,则表明行、列交叉处的按键按下,否则,无按键按下;
继续扫描下一行(将下一行输出为“0”),直至全扫描完为止。
键盘扫描程序流程图如12图所示:
图12键盘扫描程序流程图
4.系统功能调试与整体指标
4.1硬件调试与分析
(1)时间准确性调试
硬件调试时可先检查印制版及焊接的质量情况,将电子时钟通电后,显示00:
00:
00。
触发INT0中断开始计时,每过一秒时间就显示变化一次。
计时准确,显示稳定。
(2)闹铃功能调试
将时钟调到11点59分58秒,2秒后,时钟开始定点闹铃,铃声为“嘀-嘀-嘀-嘀”声,持续1分钟报时声自动停止也可以触发功能键来中止闹铃。
设计的电子时钟计时精确度较高,并可应用于日常生活中。
能够通过键盘对电子时钟进行调整,且调整过程简单方便,易于操作,有较强的人性化设计。
并且可通过键盘实现闹铃与时间模式的切换,使电子时钟的功能更加强大。
能够进行定时闹铃,计时较准确,基本能实现测试目标。
4.2软件调试与分析
软件调时在KEILC51编译器下进行,源程序编译及仿真调试应分段或以子程序为单位逐个进行,最后可结合硬件实时调试。
4.3性能分析
按照设计程序分析,LED显示器动态扫描的频率为167HZ,实际使用观察时完全没有闪烁。
由于计时中断程序中加了中断延时误差处理,所以实际计时精度非常高,可满足多种场合的应用需要。
5.详细仪器清单
表格1仪器清单
仪器名称
STC89C52
8255A
3位数码管
3位数码管2个
DS1302
11.0592k晶振
32.768k晶振
矩阵键盘
4×
4矩阵
30PF电容
100PF电容
1K电阻
蜂鸣器
6.总结与思考及致谢
在老师的指导和同学的帮助之下,我完成了此次单片机课程设计。
从开始接到课题要求到时钟的实现,再到论文的完成,每走一步对我来说都是新的尝试与挑战。
在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。
在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程。
这次时钟计时器设计的经历也会使我终身受益,我感受到做设计是要用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破。
通过设计,我在老师的精心指导和严格要求下,获得了丰富的理论知识,极大地提高了实践能力。
最后,再一次感谢我的老师.,老师严谨细致、一丝不苟的作风一直是我学习的榜样;
老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;
这次时钟计时器设计的每个环节,都离不开老师您的细心指导。
我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。
参考文献
[1]余锡存.单片机原理及接口技术[M].西安:
西安电子科技大学出版社,2000
[2]贾好来.MCS-51单片机原理及应用[M].北京:
机械工业出版社,2006
[3]楼然苗,李光飞.单片机课程设计指导[M].北京:
北京航空航天大学出版社,2007
[4]夏路易,石宗义.《电路原理图与电路板设计教程》北京希望电子工业出版2002
[5]朱定华,戴汝平.单片微机原理与应用.(M)北京:
清华大学出版社,2003
附录一:
程序(方案一)
#include<
reg52.h>
absacc.h>
#defineuintunsignedint
#defineucharunsignedchar
#definePAXBYTE[0xD1FF]
#definePBXBYTE[0xD2FF]
#definePCXBYTE[0xD5FF]
#definePCONXBYTE[0xD7FF]
sbitbuzzer=P3^3;
//蜂鸣器端口
//数码管0-9的段选编码
ucharcodetabledu[]={
0xA0,0xBB,0x62,0x2A,
0x39,0x2C,0x24,0xBA,
0x20,0x28};
//数码管各位选编码
ucharcodetablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
//全局变量定义
unsignedlongnum1,num2;
ucharshi0,shi1,fen0,fen1,m0,m1,num,
num3,aa,bb,cc,count,temp,count,S,flag,flag1;
charhour,min,second,h0,h1,mi0,mi1,s0,s1;
voidinit();
//初始化函数声明
voiddisplay(uchar,uchar,uchar,uchar,uchar,uchar);
//显示函数声明
voiddelay(uint);
//带参数延时函数声明1毫秒
voidkeyscan();
//键盘扫描函数
voidmain()
{
PCON=0x80;
init();
while
(1)//主体循环
{
keyscan();
//时钟分离部分
m1=aa%10;
m0=aa/10;
fen1=bb%10;
fen0=bb/10;
shi1=cc%10;
shi0=cc/10;
//clock分离部分
s1=second%10;
s0=second/10;
mi1=min%10;
mi0=min/10;
h1=hour%10;
h0=hour/10;
//时钟显示和clock显示部分
if(num3>
=1&
&
num3<
=4||count==0)
display(shi0,shi1,fen0,fen1,m0,m1);
else
display(h0,h1,mi0,mi1,s0,s1);
//************整点报时***********//
if(aa==0&
bb==0)//报时10秒
{
TR1=1;
//开启定时器1
flag=1;
//控制整点报时计数num1++
}
//********闹钟报时*********//
if(aa==second&
bb==min&
cc==hour)//闹时一分钟
flag1=1;
//控制闹钟计数num2++
}
}
}
//************初始化函数**************//
voidinit()
//********定时器0,1初始化********//
TMOD=0x11;
EA=1;
ET0=1;
ET1=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
TR0=1;
voidtime0()interrupt1//定时0时钟函数(控制数码时钟)
{
num++;
if(num==20)
{
num=0;
aa++;
if(aa==60)
{
aa=0;
bb++;
if(bb==60)
{
bb=0;
cc++;
if(cc==24)
cc=0;
}
}
}
voidtime1()interrupt3//定时1时钟函数(控制整点报时时间)
TH1=(65536-