哈工大51单片机数字时钟.docx
《哈工大51单片机数字时钟.docx》由会员分享,可在线阅读,更多相关《哈工大51单片机数字时钟.docx(13页珍藏版)》请在冰豆网上搜索。
![哈工大51单片机数字时钟.docx](https://file1.bdocx.com/fileroot1/2023-1/22/a4b7b0f9-fd28-4d8b-85dc-ecf2cd9a5f08/a4b7b0f9-fd28-4d8b-85dc-ecf2cd9a5f081.gif)
哈工大51单片机数字时钟
数字日历钟的设计
1.课程设计要求
1.数码管显示:
秒、分、时(可同时显示,也可轮换显示)
2.能够设置时间,“设置按键”数量不限,以简单合理易用为好。
3.误差:
1秒/天(报告中要论述分析是否满足要求)
4.设置校准键:
当数字钟显示在“整点±30秒”范围时,按动“校准键”,数字钟即刻被调整到整点,消除了±30秒的误差。
5.加上“星期”显示(可以预置),并可以对其进行设置。
2.方案论证
1.通过单片机内部的计数/定时器,采用软件编程来实现时钟计数,一般称为软时钟,这种方法的硬件线路简单,系统的功能一般与软件设计相关,通常用在对时间精度要求不高的场合。
2.采用时钟芯片,它的功能强大,功能部件集成在芯片内部,具有自动产生时钟等相关功能,硬件成本相对较高;软件编程简单,通常用在对时钟精度要求较高的场合。
3.原理论述
这里采用应用广泛的80C51单片机作为时钟控制芯片,利用单片机内部的定时/计数器T0实现软时钟的目的。
首先将T0设定工作于定时方式1,对机器周期计数形成基准时间(50ms),然后使用循环的程序结构使基准时间计数20次从而形成秒,秒计60次形成分,分计60形成小时,小时计到24形成一天,天计到7形成一星期,再重新循环。
最后通过数码管把它们的内容在相应的位置显示出来,达到时、分、秒计时的功能。
此外还要实现对时间的调整功能,80C51的P1.0、P1.1、P1.2、P1.3外接四个独立按键,当按下P1.0按键时,根据按此键次数的不同,系统分别进入调“星期”、“小时”、“分”状态的功能;当按下P1.1按键时,对显示的数码管进行加一的功能;当按下P1.2按键时,对显示的数码管进行减一的功能,达到调整星期的目的。
当按下P1.3按键时,系统进入调整“秒”状态的功能,如果此时大于30秒则直接清零“秒”显示的数码管,同时对“分”显示的数码管加一;如果小于等于30秒则直接清零“秒”显示的数码管。
同时设置了复位按键,当电路发生故障时,按下此键,可对所有的显示数码管进行清零,达到“复位”的目的。
所设计方案的流程图如下
4.分析
4.1硬件部分
采用7SEG-MPX8-CC八个共阴二极管显示器来显示日期和时间。
通过设置功能按键来实现调整日期和整点调时的功能。
电路连接使用PCB,使电路连接简洁美观。
4.2软件部分
(1)“时钟”基准时间由单片机内部的定时中断T0提供,考虑因素:
定时时间是“秒”的整除数,且长短适宜。
最长不能超过16位定时器的最长定时时间;最短不能少于中断服务程序的执行时间。
基准时间越短,越有利于提高时钟的运行精确度。
基准时间定为0.05秒。
(2)用一个计数器对定时中断的次数进行计数,由基准时间为0.05秒知计数值为20即可实现“秒”定时,同理进行“分”﹑“时”定时,以及“星期”定时。
5.计算
该部分主要是对51单片机内部定时中断T0的计时初值进行计算。
该单片机使用的晶振为内部晶振,因此晶振频率为fosc=12MHz,机器周期为Tj=12/fosc=12/12×106=1us。
由上面分析可知,定时时间T=50ms
定时初值为X=216-T/Tj=65536-50000=15536=3CB0H
6.仿真
6.1数码管显示器结构
“星期”、“小时”、“分”、“秒”显示单元如上图所示,上图显示的时间为星期四的1点11分:
43秒。
对于“星期”显示,0代表星期天,1代表星期一,2代表星期二,3代表星期三,4代表星期四,5代表星期五,6代表星期六。
6.2各按键分布及功能介绍
按键功能如下:
1.按键1是用来选定“星期”、“小时”、“分”的调整。
当不按或者按键次数是3的整数倍时,选定“星期”状态;当除以3余数为1次时,选定“小时”状态;当按除以3余数为2次时,选定“分”状态。
2.按键2是对按键1选定的状态进行加一操作。
3.按键3是对按键1选定的状态进行减一操作。
4.按键4可以进行整点调时功能,当“秒”状态小于等于30秒时,直接对“秒”清零;当“秒”状态大于30秒时,对“秒”清零,同时“分”加一。
5.按键5是用来复位的,当电路发生故障时,按下此键,可以使整个电路恢复初始设置。
6.3对“星期”的调整
通过调整“星期”、“小时”和“分”的状态,得到如下仿真图
6.4整点调时
在16s时按下按键4,在运行12s后可以得到如下结果
在35s时按下按键4,“分”加一,“秒”清零,19s后得到如下结果:
7.PCB图的设计
8.误差分析
使用keil软件进行误差分析,使用debug进行调试,在计时1s处设置断点,当计数初值为3CB0H时,计时1s和计时2s的调试结果如下:
计时1s调试结果
计时2s调试结果
由上表可知,计时1s调试结果为t1=1.000357s,计时2s调试结果t2=2.000646,t2-t1=2.000646-1.000357=1.000289s,也就是1s会有
T=289us的误差,可以通过调整计数初值来减小误差。
单片机的机器周期Tj=1us,
调整量
,因而计数初值应改为3CBEH。
这样,1s的误差就变为9us,一天的误差为
,达到了要求。
9.总结
由于大三逐渐接触专业课,但是仅仅停留在书本和考试上,而没有达到“知行合一”的地步。
通过这次课程设计,使我体会到了《数字电路》和《单片机》这两门课程的重要性和实用性。
而且我不仅了解了多种仿真软件以及他们的利弊,还对单片机的汇编语言程序进行了复习。
硬件部分,由于先前我们都没有操作过proteus之类的软件,所以一切从零开始,针对这次课程设计需要,查询了可以用于硬件仿真的软件,有Multisim和proteus。
由于Multisim的仿真性能很差,无法仿真单片机,因而选择preteus。
然后通过各种渠道学习了proteus软件的基本操作、原理图的绘制修改、原件的封装以及原件集成库的创建。
流程很简洁,过程很纠结。
我们一步一个脚印地制作着,生怕哪个步骤出错而导致前功尽废。
软件部分,由于学习过《单片机》这门课程,对汇编语言还是比较熟悉,但是过去编辑的程序很短,属于功能比较单一的程序。
而这次课程设计的程序相对比较庞大,是一个艰巨的挑战。
通过回顾51单片机的中断和定时器/计数器部分,将程序写出来了。
然后就是使用keil软件进行调试,修改。
最终得到了正确的程序,本报告的程序绝对原创。
感谢任老师的悉心指导,感谢学院给我们这次机会来做到“知行合一”。
10.参考文献
[1]《单片机原理与应用》宗成阁编著
[2]《单片机应用与仿真调试》严天峰编著
[3]《模拟电子技术(第三版)》胡宴如耿苏燕编著
[4]《数字电子技术(第三版)》杨志忠卫桦林编著
11.程序
ORG0000H
LJMPSTART
ORG000BH
LJMPINIT0
START:
MOVP0,#00H
MOVP2,#0FFH
MOVR0,#70H;主程序开始
MOVR7,#0DH;13
INIT:
MOV@R0,#00H
INCR0
DJNZR7,INIT
MOVTMOD,#01H;选择定时器/计数器T0的方式1
MOVTL0,#0B0H;对低位赋初值
MOVTH0,#03CH;高位赋初值
SETBEA;开中断
SETBET0
SETBTR0;T0计时开始
START1:
LCALLSCAN
LCALLKEYSCAN
SJMPSTART1
DL1MS:
MOVR6,#64H;延时1子程序,延时0.5ms
DL1:
MOVR7,#19H
DL2:
DJNZR7,DL2
DJNZR6,DL1
RET
DL20MS:
ACALLSCAN;延时20ms子程序
ACALLSCAN
ACALLSCAN
RET;数码管显示程序开始
SCAN:
MOVA,78H
MOVB,#0AH
DIVAB;时间秒的十位送给A,时间秒的个位送B
MOV71H,A;时间秒要显示的十位
MOV70H,B;时间秒要显示的个位
MOVA,79H
MOVB,#0AH
DIVAB;时间分的十位送给A,时间分的个位送B
MOV73H,A;时间分要显示的十位送地址
MOV72H,B;时间分要显示的个位送地址
MOVA,7AH
MOVB,#0AH
DIVAB;时间时的十位送给A,时间时的个位送B
MOV75H,A;时间时显示的十位送地址
MOV74H,B;时间时要显示的个位送地址
MOVR1,#70H
MOVR5,#80H
MOVR3,#08H
SCAN1:
MOVA,R5;数码管的显示程序
CPLA
MOVP2,A
MOVA,@R1
MOVDPTR,#TAB
MOVCA,@A+DPTR;对字段表取值显示
MOVP0,A
LCALLDL1MS;延时程序
INCR1
MOVA,R5
RRA
MOVR5,A
DJNZR3,SCAN1
MOVP2,#0FFH
MOVP0,#00H
RET;"0~9"和"-"的字段表
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
;定时/计数器T0中断程序
INIT0:
PUSHACC
PUSHPSW
CLRET0;开T0中断
CLRTR0;定时器0清零
MOVTL0,#0B0H
MOVTH0,#03CH;定时50ms
SETBTR0
INC7CH;124
MOVA,7CH
CJNEA,#14H,OUTT0;50ms是否到20次,没有到就继续执行50ms的延时
MOV7CH,#00
INC78H
MOVA,78H
CJNEA,#3CH,OUTT0;一秒的延时是否计到60次,没有就继续执行
MOV78H,#00
INC79H
MOVA,79H
CJNEA,#3CH,OUTT0;一分的延时是否计到60次,没有就继续执行
MOV79H,#00
INC7AH
MOVA,7AH
CJNEA,#18H,OUTT0;60分钟的延时是否计到24次,没有就
MOV7AH,#00
OUTT0:
SETBET0;启动定时器T0
POPPSW
POPACC
RETI;按键处理程序
KEYSCAN:
CLREA
JNBP1.0,KEYSCAN0;P1.0有按键按下则跳转到子程序(选择)不为1转移
JNBP1.1,KEYSCAN1;P1.1有按键按下则跳转到子程序(+)
JNBP1.2,KEYSCAN2;P1.2有按键按下则跳转到子程序(—)
JNBP1.3,KEYSCAN3;P1.3有按键按下测跳转到子程序(确定键)
KEYOUT:
SETBEA
RET
KEYSCAN0:
LCALLDL20MS;20ms的延时消抖
JBP1.0,KEYOUT;为1转移
WAIT0:
JNBP1.0,WAIT0;判断按键是否松手,松手就往下执行程序
INC7DH
MOVA,7DH
MOVB,#3
DIVAB
MOV38H,B
SJMPKEYOUT
KEYSCAN1:
LCALLDL20MS;按键加一的程序
JBP1.1,KEYOUT
WAIT1:
JNBP1.1,WAIT1
MOVA,38H
KSCAN11:
CJNEA,#01H,KSCAN12;如果功能键按下则对时加一调整
INC7AH;
MOVA,7AH
CJNEA,#24,KEYOUT
MOV7AH,#00
SJMPKEYOUT
MOVA,38H
KSCAN12:
INC79H;;如果功能键按下则对分加一调整
MOVA,79H
CJNEA,#60,KEYOUT
MOV79H,#00
SJMPKEYOUT
MOVA,78H
KSCAN13:
CJNEA,#1EH,KK1;加秒
MOV78H,3BH;
INC79H
AJMPKEYOUT
KK1:
CLR78H
AJMPKEYOUT
KEYSCAN2:
LCALLDL20MS;按键减一的程序
JBP1.2,KEYOUT
WAIT2:
JNBP1.2,WAIT2
MOVA,38H
KSCAN21:
CJNEA,#01H,KSCAN22;如果功能键按下则对时减一调整
DEC7AH;
MOVA,7AH
CJNEA,#0FFH,KEYOUT
MOV7AH,#23
SJMPKEYOUT
KSCAN22:
DEC79H;如果功能键按下则对分减一调整
MOVA,79H
CJNEA,#0FFH,L1
MOV79H,#59
L1:
AJMPKEYOUT
MOVA,78H
KSCAN23:
CJNEA,#1EH,KK2;减秒
MOV78H,3BH;
DEC79H
AJMPKEYOUT
KK2:
CLR78H
AJMPKEYOUT
KEYSCAN3:
LCALLDL20MS;延时消抖程序
JBP1.3,KEYOUT
WAIT3:
JNBP1.3,WAIT3;判断是否放开按键
LJMPSTART
END