对时功能电子钟设计报告 本文关键词:功能,报告,电子钟,设计
对时功能电子钟设计报告 本文简介:设计报告题目完成人:张欣,杜枫一、系统概述使用AT89C51单片机结合段码LED显示器,键盘设计一个具有对时功能的电子钟。1、设计要求:l采用8个LED数码管,显示格式为“时时-分分-秒秒”,采用24小时制。l“时/分/秒”相应LED闪动,表示相应的部分处于对时状态。l用5个功能键操作来设置当前时间
对时功能电子钟设计报告 本文内容:
设计报告
题
目
完成人:张欣,杜枫
一、
系统概述
使用AT89C51单片机结合段码LED显示器,键盘设计一个具有对时功能的电子钟。
1、设计要求:
l
采用8个LED数码管,显示格式为“时时-分分-秒秒”,采用24小时制。
l
“时/分/秒”相应LED闪动,表示相应的部分处于对时状态。
l
用5个功能键操作来设置当前时间:
功能键K1~K5功能如下。
l
K1—进入时间设置状态,且“时时-分分-秒秒”LED闪动。
l
K2—设置小时。
l
K3—设置分钟。
l
K4—设置秒钟。
l
K5—确认完成设置,“时时-分分-秒秒”LED停止闪动,继续计时。
l
未进入计时状态时,K2-K5键的操作被忽略。
程序执行后LED显示“00:00:00”,然后开始计时。
2、用汇编语言编写相应软件;
3、系统软、硬件联调。
二、
方案设计
本次设计是基于AT89C51单片机电子钟的设计,对时、分、秒的显示的控制,时、分、秒用六位数码管显示LED数码管时钟电路采用24小时计时方式。该电路采用AT89C51单片机,使用5V电池供电,只使用一个按键进行复位状态的控制以及正常显示等状态。LED显示采用静态扫描方式实现,采用6M晶振。
该电子钟使用单片机模块控制,用单片机原理实现时、分、秒计时的装置。本次设计通过用单片机为主控制,通过电路仿真而实现。首先使用Proteus
Professional软件进行绘制硬件电路图,用keil软件进行编程与调试,最终生成hex文件,传入单片机内部,从而实现仿真效果。
三、
硬件设计
根据AT89C51单片机灌电流能力强,拉电流能力弱的特点,我们选用共阳数码管。将AT89C51的P3.0~P3.1分别与74LS164的数据输入口和时钟信号输入口相连,74LS164是8位串入并出移位寄存器,负责将P3.0输出的串行数据转换成并行信号。显然,这种方式显示同样的位数使用单片机的口线大大减少,即可以让LED当前时间数值,数码管显示器有二种工作方式,即静态显示方式和动态扫描显示方式。为节省端口,本系统采用静态扫描显示方式。系统的时分显示部件由6只7段共阳LED数码管构成,前两只用于时的显示,中间两只用于分的显示,最后两只用于秒的显示。每个LED数码管由相对应的74LS164驱动,数码管的a,b,c,d,e,f,g,h,分别分别74LS164的QA,QB,QC,QD,QE,QF,QH相连。
3.1
AT89C51引脚及其功能
引脚功能:
Vcc(40):电源电压
GND(20):接地
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
RST(9):复位信号输入端。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1(18):振荡器反相放大器的及内部时钟发生器的输入端。
XTAL2(19):振荡器反相放大器的输出端。通过XTAL1、XTAL2外接晶振后,即可构成自激振荡器,驱动内部时钟发生器向主机提供时钟信号。
3.2
时钟电路
单片机必须在时钟的驱动下才能进行工作。MCS-51系列单片机内部有一时钟振荡电路,只需外接振荡电源,就能产生一定频率的时钟信号到单片机内部的各个单元,决定单片机的工作速度。电路如下图:
3.3驱动部件
74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。图3(a)为74LS245的管脚图。
图3(a)74LS245管脚图
3.4显示部分
由8个共阴极的数码管组成时、分、秒和分隔符的显示P0口的8条数据线P0.0至P0.7分别与74LS245的A口对应相接,增大AT89C51的带负载能力;P3口对应接八个数码管的公共端,通过程序控制数码管的亮与灭,这样通过P0口送出一个存储单元的高位、低位BCD显示代码,通过P3口送出
扫描选通代码轮流点亮LED1至LED8,就会将要显示的数据在数码管中显示出来,从P0口输出的代码是BCD码,从P3口输出的就是位选码。这是扫描显示原理。
LED显示段码
字型
共阳极段码
共阴极段码
字型
共阳极段码
共阴极段码
0
C0H
3FH
9
90H
6FH
1
F9H
06H
A
88H
77H
2
A4H
5BH
B
83H
7CH
3
BOH
4FH
C
C6H
39H
4
99H
66H
D
A1H
5EH
5
92H
6DH
E
86H
79H
6
82H
7DH
F
84H
71H
7
F8H
07H
空白
FFH
00H
8
80H
7FH
P
8CH
73H
注:(1)本表所列各字符的显示段码均为小数点不亮的情况。
(2)“空白”字符即没有任何显示。
四、
软件设计
本次设计的软件部分由主程序,静态显示子程序,中断服务程序,时、分、秒加1子程序,时、分、秒单元清零子程序组成。
4.1
电子钟的主程序
本设计中,计时采用定时器T0中断完成,其余状态循环调用显示子程序,当端口开关按下时,转入相应功能程序。其主程序执行流程见下图。
开始
设堆栈指针
秒分时计数单元清零
设定时器工作方式
设定时器初值
设中断方式
中断初始化
调显示子程序
TMOD=01为工作方式1
4.2定时器中断服务程序
定时器TO用于时间计时,定时溢出中断周期设为100ms,中断进入后,判断是否到1秒钟,到了,则调用加法子程序对秒进行加1处理,处理完后返回断点地址,同时判断秒是否到了60秒,到了则对秒单元清零,同时对分进行加1操作,同样对分进行判断,到60分则对分单元清零,同时对时加1,同样也对时进行判断,到24小时,则对时单元清零,最后中断返回。
T0中断服务程序执行流程见下图:
保护现场
赋初值
10数是否到?
N
Y
秒值加1
是否到60秒?
N
Y
秒清0
分加1
是否到60分?
N
Y
分清0
小时加1
是否到24小时?
N
Y
小时清0
恢复现场
返回中断
4.3电子钟的显示子程序
4.4延时子程序
※附:程序片段如下:
S_SETBITP1.0
M_SETBITP1.1
H_SETBITP1.2
SECONDEQU30H
MINUTEEQU31H;定义MINUTE为31H单元标号,分计数单元
HOUREQU32H;定义HOUR为32H单元标号,时计数单元
TCNTEQU34H;定义TCNT为34H单元标号定时器TO计数
ORG00H;程序开始地址
SJMPSTART
;跳转到START执行
ORG0BH;定时器TO中断入口地址
LJMP
INT_T0;跳转到INT-TO执行
START:MOV
DPTR,#TABLE;指针指向TABLE首地址
MOVHOUR,#0;初始化秒计数单元
MOVMINUTE,#0;初始化分计数单元
MOVSECOND,#0;初始化时计数单元
MOVTCNT,#0;初始化T0计数单元
MOVTMOD,#01H;工作方式1
MOVTH0,#(65536-50000)/256;定时
50
毫秒
MOVTL0,#(65536-50000)MOD
256
MOVIE,#82H;允许定时器TO中断
SETBTR0;启动定时器T0
;判断是否有控制键按下,是哪一个键按下
A1:LCALLDISPLAY;跳转到DISPLAY执行
JNBS_SET,S1;检查
P1.0
口
电平
JNBM_SET,S2;检查
Pl.l
口电平
JNBH_SET,S3;检查
P1.2
口
电平
LJMPA1;返回
S1:LCALLDELAY;去抖动
JBS_SET,A1;确认
P1.0
口电平
INCSECOND;秒值加1
MOVA,SECOND;秒数值送入A比较
CJNE
A,#60,J0;判断是否加到60秒
MOVSECOND,#0;SECOND
单元清零
LJMPK1;转到K1执行
S2:LCALLDELAY;长调用DELAY指令
JBM_SET,A1;确认Pl.l
口电平
K1:INCMINUTE;分钟值加1
MOVA,MINUTE;分数值送入A比较
CJNEA,#60,J1;判断是否加到60分
MOVMINUTE,#0;秒单元清零
LJMPK2;调用K2指令
S3:LCALLDELAY;调用延时子程序
JBH_SET,A1;确认?1.2
口电平
K2:INCHOUR;小时值加1
MOVA,HOUR;时数值送入A比较
CJNEA,#24,J2;判断是否加到24小时
MOVHOUR,#0;时单元清零
MOVMINUTE,#0;分单元清零
MOVSECOND,#0;秒单元清零
LJMPA1;跳转到程序A1
;等待按键抬起
J0:
JBS_SET,A1;调用A1指令
LCALLDISPLAY;调用显示子程序
SJMPJ0;返回J0指令
J1:
JBM_SET,A1;数值比较
LCALLDISPLAY;调用显示子程序
SJMPJ1;返回J1指令
J2:
JBH_SET,A1;数值比较
LCALLDISPLAY;调用显示子程序
SJMPJ2;返回J2指令
;定时器TO中断服务子程序,对秒,分钟和小时的计数
INT_T0:MOVTH0,#
(65536-50000)/256;定时
50ms
MOVTL0,#
(65536-50000)
MOD
256
INCTCNT;定时器TO计数单元中的数值加1
MOVA,TCNT;定时器T0计数单元中的数值送入A比较
CJNEA,#20,RETUNE
;计时
1
秒,
INCSECOND;秒计数单元中的数值加1
MOVTCNT,#0;定时器TO计数单元归零
MOVA,SECOND;秒计数单元中的数值送入A比较
CJNEA,#60,RETUNE;记时
1
分,
INCMINUTE;分计数单元中的数值加1
MOVSECOND,#0;秒计数单元归零
MOVA,MINUTE;分计数单元中的数值送入A比较
CJNEA,#60,RETUNE;记时
1
时,
INCHOUR;时计数单元中的数值加1
MOVMINUTE,#0;分计数单元归零
MOVA,HOUR;时计数单元中的数值送入A比较
CJNEA,#24,RETUNE;记时
1
天,
MOVHOUR,#0;时计数单元归零
MOVMINUTE,#0;分计数单元归零
MOVSECOND,#0;秒计数单元归零
MOVTCNT,#0;定时器T0计数单元清零
RETUNE:
RETI;中断返回
;显示控制子程序
DISPLAY:
MOVA,SECOND;显示秒
MOVB,#10;B寄存器赋值为10
DIVAB;(A)/(B),商存入A,余数存入B,分别处理A与B中数
CLRP3.6;数码管7开始工作
MOVCA,@A+DPTR;数据指针指向数值地址并送入A输出显示
MOVP0,A;在数码管7输出显示秒单元的十位数值
LCALLDELAY;调用延时子程序
SETBP3.6;数码管7停止工作
MOVA,B;将B寄存器中的数送入A处理显示
CLRP3.7;数码管8开始工作
MOVCA,@A+DPTR;数据指针指向数值地址并送入A输出显示
MOVP0,A;在数码管8输出显示秒单元的个位数值
LCALLDELAY;调用延时子程序
SETBP3.7;数码管8停止工作
CLRP3.5;数码管6开始工作
MOVP0,#40H;显示分隔符
LCALLDELAY;调用延时子程序
SETBP3.5;数码管6停止工作
MOVA,MINUTE;显示分钟
MOVB,#10;B寄存器赋值为10
DIVAB
CLRP3.3;数码管4开始工作
MOVCA,@A+DPTR;数据指针指向数值地址并送入A输出显示
MOVP0,A;在数码管4输出显示分单元的十位数值
LCALLDELAY;调用延时子程序
SETBP3.3;数码管4停止工作
MOVA,B;将B寄存器中的数送入A处理显示
CLRP3.4;数码管5开始工作
MOVCA,@A+DPTR;数据指针指向数值地址并送入A输出显示
MOVP0,A;在数码管5输出显示分单元的个位数值
LCALLDELAY;调用延时子程序
SETBP3.4;数码管5停止工作
CLRP3.2;数码管3开始工作
MOVP0,#40H;显示分隔符
LCALLDELAY;调用延时子程序
SETBP3.2;数码管3停止工作
MOVA,HOUR;显示小时
MOVB,#10;B寄存器赋值为10
DIVAB;商存入A,余数存入B,分别处理A与B中数
CLRP3.0;数码管1开始工作
MOVCA,@A+DPTR;数据指针指向数值地址并送入A输出显示
MOVP0,A;在数码管1输出显示时单元的十位数值
LCALL
DELAY;调用延时子程序
SETBP3.0;数码管1停止工作
SETB
P3.0;数码管1停止工作
MOVA,B;将B寄存器中的数送入A处理显示
CLRP3.1;数码管2开始工作
MOVCA,@A+DPTR;数据指针指向数值地址并送入A输出显示
MOVP0,A;在数码管2输出显示时单元的个位数值
LCALLDELAY;调用延时子程序
SETBP3.1;数码管2停止工作
RET;子程序返回
TABLE:DB
3FH,06H,5BH,4FH,66H;*W
极
LED
显示器段选码
0,1,2,3,4
DB6DH,7DH,07H,7FH,6FH;共阴极
LED
显示器段选码
5,6,7,
;延时子程序
DELAY:
MOVR6,#10;R6
赋值为
10
Dl:
MOVR7,#250;R7
赋值为
250
DJNZR7,$;原地踏步
DJNZR6,Dl;返回D1循环
RET;子程序返回
END;结束程序
五、仿真实验结果
5.1软件调试
打开程序调试软件keil
uVision4,在里面新建一个工程,命名为:数字时
钟“2345”。接着新建文件,编写相应程序。编写好的各个程序进行编译与连接。在调试过程中,程序有错误,我们根据相应的提示进行了多次修改,直到该程序能够正确编译。之后,我们在点击相关栏目,让它生成我们在硬件仿真时所需要的“.HEX”文件。到此,我们的软件调试就完成了。下面是我们软件调试的部分贴图。
程序运行成功,并生成HEX文件,如图1。
图
1
将生成的HEX文件,加载到单片机中。如图2。
图2
生成HEX文件
5.2硬件调试
打开Proteus
7
Professional软件,按照方案所选的电路元件来设计整体电路,先把个芯片按一定的位置放好,然后对相应的接口进行连接。做好之后把编程所生成的HEX文件加载到AT89C51中,运行仿真软件,查看运行效果。仿真结果未达到设计要求,目前我们仍在查找原因。
下图5(a)--图5(e)是未连驱动电路时的硬件仿真结果部分贴图;
图5(f)--图5(g)是连了驱动电路后的硬件调试部分贴图。
图
5(a)
图
5(b)
图
5(c)
图
5(d)
图
5(e)
图
5(f)
图
5(g)
六、参考文献
①《单片机程序设计实例》
清华大学出版社
②《单片机原理及接口技术》
高等教育出版社
③《单片机课程设计实例指导》
北京航空航天大学出版社