基于单片机的数字电子时钟设计共31页文档.docx
《基于单片机的数字电子时钟设计共31页文档.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字电子时钟设计共31页文档.docx(26页珍藏版)》请在冰豆网上搜索。
![基于单片机的数字电子时钟设计共31页文档.docx](https://file1.bdocx.com/fileroot1/2023-2/22/4e4ca019-065f-4cc5-9526-0c86a9ee81c3/4e4ca019-065f-4cc5-9526-0c86a9ee81c31.gif)
基于单片机的数字电子时钟设计共31页文档
基于单片机的数字电子钟设计
一,实验目的
1.学习8051定时器时间计时处理、按键扫描及LED数码管显示的设计方法。
2.设计任务及要求利用实验平台上4个LED数码管,设计带有闹铃功能的数字时钟
二,实验要求
A.基本要求:
1.在4位数码管上显示当前时间。
显示格式“时时分分”
2.由LED闪动做秒显示。
3.利用按键可对时间及闹玲进行设置,并可显示闹玲时间。
当闹玲时间到蜂鸣器发出声响,按停止键使可使闹玲声停止。
4.实现秒表功能(百分之一秒显示)
B.扩展部分:
1.日历功能(能对年,月,日,星期进行显示,分辨平年,闰年以及各月天数,并调整)
2.音乐闹铃(铃音可选择,闹铃被停止后,闪烁显示当前时刻8秒后,或按键跳入正常时间显示状态)
3.定时功能(设定一段时间长度,定时到后,闪烁提示)
4.倒计时功能(设定一段时间长度,能实现倒计时显示,时间长减到0时,闪烁提示)
5.闹铃重响功能(闹铃被停止后,以停止时刻开始,一段时间后闹铃重响,且重响时间的间隔可调)
三,实验基本原理
利用单片机定时器完成计时功能,定时器0计时中断程序每隔0.01s中断一次并当作一个计数,设定定时1秒的中断计数初值为100,每中断一次中断计数初值减1,当减到0时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。
为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要译码器,数据锁存器等较多硬件,可采用动态显示法实现LED显示,通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。
由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。
四,实验设计分析
针对要实现的功能,采用AT89S51单片机进行设计,AT89S51单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。
这样,既能做到经济合理又能实现预期的功能。
在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。
程序可分为闹钟的声音程序、时间显示程序、日期显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等。
运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。
首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。
这是前期准备工作。
第二部分是硬件部分:
依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。
第三部分是软件部分:
先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。
第四部分是软件画图部分:
设计好电路后进行画图,包括电路图和仿真图的绘制。
第五部分是软件仿真部分:
软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。
第六部分是硬件实现部分:
连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。
最后进行功能扩展,在已经正确的设计基础上,添加额外的功能!
五,实验要求实现
A.电路设计
1.整体设计
此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:
显示电路用8个共阴数码管分别显示,星期(年份),小时、分钟(月份)和秒(日),通过动态扫描进行显示,从而避免了译码器的使用,同时节约了I/0端口,使电路更加简单。
单片机采用AT89S51系列,这种单片机应用简单,适合电子钟设计。
电路的总体设计框架如下:
单片机
输入部分
晶振和复位
输出部分
2.分块设计
模块电路主要分为:
输入部分、输出部分、复位和晶振电路。
2.1输入部分
输入信号主要是各种模式选择和调整信号,由按键开关提供。
以下为输入部分样例:
在本实验中主要用用P3口输入按键信号,还用到了特殊的P0口。
对于P0口,由于其存在高阻状态,为了实现开关功能,给其添加上拉电阻,具体如下图所示:
2.2输出部分
本电路的输出信号为7段数码管的位选和段选信号,闹铃脉冲信号,提示灯信号。
本实验的数码管是共阴的,为了防止段选信号不能驱动数码管,故在P1口连接上拉电阻后,再送段选信号,以提高驱动,位选信号直接从P2口接入,如下图:
闹铃由P2.6端输出,模块如下:
2.3晶振与复位电路
本实验单片机时钟用内部时钟,模块如下:
复位电路为手动复位构成,模块如下:
各模块拼接组合,电路总体设计图如下:
B.程序设计
B.1程序总体设计
本实验用汇编程序完成.
主程序开始
显示星期,时,分,秒
是否有调转?
T0中断
秒,分,时等进位
闪烁提示
显示日期并调整
响铃提示
时间调整
闹铃设置
定时设置
铃声测试
秒表模式
回主程序
定时到
按0键
按0键
闹铃到
按1键
按2键
按3键
按4键
按5键
按7键
7键恢复
按4键
按8键
按0键
按0键
倒计时启动并显示
回主程序
秒表暂停
秒表清零
回主程序
按7键
程序总的流程图如下:
NO
YES
结合电路图,程序设计的整体思路为:
接通电源,数码管显示星期数,时,分,秒。
并且走时显示LED灯每隔1秒改变一次明暗,此为正常工作模式。
以下为在该工作方式下模式选择的按键方式:
1.按1键——日期模式。
显示年月日且可调整,调整状态指示灯亮。
日期调整对应键如下:
6键——年(千位,百位),按一次该位加1
5键——年(十位,个位),按一次该位加1
4键——月,按一次该位加1
3键——日,按一次该位加1
0键——调整状态指示灯灭,返回主程序,显示时间
2.按2键——调时模式。
显示时分秒且可调整,调整状态指示灯亮。
时间调整对应键如下:
6键——时,按一次该位加1
5键——分,按一次该位加1
4键——秒,按一次该位清0
0键——调整状态指示灯灭,返回主程序,显示时间
3.按3键——闹铃调整模式。
显示闹铃时刻且可调整,调整状态指示灯亮。
闹铃调整对应键如下:
5键——时,按一次该位加1
4键——分,按一次该位加1
0键——调整状态指示灯灭,返回主程序,显示时间
4.长按4键——定时调整(倒计时)模式。
显示定时长度且可调整,调整状态显示灯亮。
定时调整对应键如下:
6键——分,按一次该位加1
5键——秒,按一次该位加1
4键——开启定时功能,并显示倒计时
0键——调整状态指示灯灭,返回主程序,显示时间
5.按5键铃声测试,扬声器播放音乐。
6.按下7键,进入秒表模式,显示秒表走时。
拨上7键,秒表暂停;按下7键,秒表又继续走时。
按下8键,秒表清零。
0键——调整状态指示灯灭,返回主程序,显示时间
7.按下8键,数码管熄灭,时钟仍在走时,进入节能模式。
拨上8键,数码管亮,恢复普通工作模式。
8.9键为闹铃启动(停止)键,按下可以选择是否要闹铃,以及在闹铃响起时,按此键可以停止闹铃。
9.10键为铃声选择开关,按下与否,可以选择两手音乐。
10.11键为闹铃重响控制开关,重响功能开启时,从闹铃随音乐结束而结束的时刻开始,或从手动按9键停止闹铃的时刻开始定时,一段时间后闹铃重响。
11.12键为闹铃重响间隔选择开关,可选两个定时长度,以便在闹铃重响功能开启时,闹铃初次响后,过一段时间闹铃继续响。
B.2程序主要模块
B.2.1延时模块
数码管显示动态扫描时,用到延时程序,这里使用延迟1ms的程序,此程序需要反复调用程序如下:
D_1MS:
MOVR7,#2
D_5:
MOVR2,#250
DJNZR2,$
DJNZR7,D_5
RET
除数码管动态扫描外,数码管的闪烁提示,以及音乐模块也用到了延时,只是延时的长短不同罢了,在此不再赘述。
B.2.2中断服务程序
本实验中,计数器T0,T1中断都有运用,其中T0中断为时钟定时所用,T1中断用于音乐播放。
T0的定时长度为0.01s,工作于方式1,计数1次,时长1us,故计数器计数10000次,进入中断,计数初值为65536-10000=55536=#0D8F0,装满定时器需要0.01s的时间,从而100次中断为一秒,一秒之后,判断是否到60秒,若不到则秒加一,然后返回,若到,则秒赋值为0,分加一,依次类推。
包括日期显示的功能也是如此。
另外,由于要实现倒计时功能,因此在中断程序中还要加入减一的寄存器,需要时将其进行显示。
基于以上考虑,以R3为倒计时中的秒,R4为倒计时的分,当秒加1时R3减一,减到0之后,秒赋值为59,分减一,直到分为0。
以下为定时中断流程图:
进入T0定时中断
修正,重装计数初值
按7键
秒表的百分之一秒位,秒位,分位,时位的进位
DECPNUM
PNUM=0,已到1秒
MOVPNUM,#100重装中断计数值
INCSECOND秒位加1
R3,R4所存定时长度减1
分,时,日周,月,年的进位
RETI中断返回
NO
YES
YES
NO
计数器T1工作于方式1,当调用响铃程序时,其计数功能开启,为音乐音调不同频率的方波的形成,提供延时。
其中断服务程序就是根据音调改变音乐方波输出口电平的高低,用语句CPL实现。
中断服务程序中日历的实现较为复杂,要考虑平年,闰年,特殊的2月,每月的天数的不尽相同。
具体的逻辑判断方法为:
首先,要考虑年份是不是闰年,闰年的判断方法是:
将年份除以100,若能整除,则将年份除以400,若还能整除,则为闰年,若不能,则为平年;若不能被100整除,则判断是否能被4整除,若能,则为闰年,若不能则为平年。
只有2月与平、闰年相关,因此在闰年和平年的子程序中,要判断是不是2月,若是则在相应的年中进行日期的增加,若不是则转入平时的月份。
其中1、3、5、7、8、10、12月是每月31天,4、6、9、11月为每月30天。
日历进位判断流程图如下:
年份能否被100整除
N
Y
年份是否能被4整除
年份是否能被400整除
N
N
平年
闰年
Y
Y
是不是2月
是不是2月
Y
日>=28之后返回为1
N
N
Y
日>=29之后返回为1
若月份为1、3、5、7、8、10、12月则调用31天的程序
若月份为4、6、9、11则调用30天的程序
本实验用8个数码管,刚好能显示年,月,日,扫描显示与时间的扫描显示类似。
年比较特殊,由两个寄存器存储,个位,十位为0时,表明年数能被100整除,若此时千位,百位
组成两位数能被4整除,则年数被400整除,为闰年。
若十位,个位组成两位数能被4整除,则年数能被4整除,为闰年。
B.2.3主程序
主程序主要对按键进行扫描,以及判断定时和闹铃时间是否已到,若到则调用相关程序,该段程序如下:
MAIN:
JNBP3.0,DATETZ;按下0键,显示日期并可对日期进行调整
JNBP3.1,ZSTZ1;按下1键,显示时间,并可调时
JNBP3.2,NLTZZ;按下2键,进行闹铃设置
JNBP3.3,DSTZ;按下3键,进行定时设置
JNBP3.4,CESHI;闹铃测试
JNBP3.6,STOPWATCHTZ;按下6键,进入秒表方式
ACALLDISP;调用时钟显示子程序
JNBP0.6,RERING;判断是否开启闹铃重响功能
RE:
JNBP2.7,DSPDKQ;判断是否开启闹铃功能,没开则去判断定时
FMQPD:
;判断定时值R4,R3是否到零、闹铃时刻是否已到
MOVA,HOUR;
SUBBA,38H;
JZFEN;判断小时数是否到闹铃所定时间,若到,则对分进行判断;若不到,则对定时进行判断
AJMPDSPDKQ
FEN:
MOVA,MINUTE;
SUBBA,37H;
JZMIAO;判断分是否到闹铃所定时间,若到,则对秒进行判断;若不到,则对定时进行判断
AJMPDSPDKQ
MIAO:
MOVA,SECOND
SUBBA,#0
JZSHENGYIN1;判断秒是否到闹铃所定时间,若到,则时,分,秒都到达闹铃时刻,进入响铃子程序;若不到则判断定时
AJMPDSPDKQ
RERING:
;闹铃重响判断程序
JNBF0,RE;标志位F0为0,不进行闹铃重响设定
CPLF0
MOV3CH,#1;定时判断标志位赋1,定时判断功能开启
JNBP0.7,M1;闹铃重响间隔时间选取
MOVR4,#0;闹铃重响间隔30秒
MOVR3,#30
AJMPMAIN
M1:
;闹铃重响间隔60秒
MOVR4,#1
MOVR3,#0
AJMPMAIN
DSPDKQ:
;判断是否应该进行定时判断
MOVA,3CH;3CH是引入的判断因子,当其为0时,不对定时时间是否到0进行判断
JNZDSPD2;当3CH不是0时,跳转到定时判断程序
AJMPMAIN
DSPD2:
MOVA,R4;
JZS_PD;R4所存定时分数为0,则转而判断R3所存定时秒数
AJMPMAIN;
S_PD:
MOVA,R3;
JNZMAIN;R4,R3所存参数减为0,定时长度已到
JNBP0.6,SHENGYIN2;闹铃重响功能开启时,跳入响铃程序
AJMPTISHI;不是闹铃重响定时,则定时时间到时,跳入提示程序
AJMPMAIN
CESHI:
ACALLRING
AJMPMAIN
SHENGYIN1:
;调用响铃子程序
LCALLRING
AJMPMAIN
SHENGYIN2:
SETBF0;闹铃重响标志位设定
LCALLRING;响铃
CLRF0;标志位复位
AJMPMAIN
NLTZZ:
AJMPNLTZ1;跳入闹铃调整程序
DSTZ:
AJMPDSTZ1;跳入定时调整程序
DATETZ:
AJMPDATETZ1;跳入日期调整程序
STOPWATCHTZ:
AJMPSTOPWATCHTZ1;跳入秒表程序
B.2.4显示子程序
8个数码管轮流进行显示,分别显示1ms,依赖人的视觉暂留效应,给人以数码管持续高亮的错觉。
该段程序如下:
DISP:
;时间显示子程序
JNBP3.7,OUT1;判断节能开关7是否按下,按下则数码管不显示,延长其寿命
MOVDPTR,#LEDTAB
MOVA,SECOND;显示当前时间秒位
MOVB,#10
DIVAB;A存十位,B存个位
MOVCA,@A+DPTR
MOVP1,A
CLRSEC_S
ACALLD_1MS;显示当前时间秒十位
SETBSEC_S
MOVA,B
MOVCA,@A+DPTR
MOVP1,A
CLRSEC_G
ACALLD_1MS;显示当前时间秒个位
SETBSEC_G
MOVA,MINUTE;显示当前时间分位
MOVB,#10
DIVAB
MOVCA,@A+DPTR
MOVP1,A
CLRMIN_S
ACALLD_1MS
SETBMIN_S
MOVA,B
MOVCA,@A+DPTR
MOVP1,A
CLRMIN_G
ACALLD_1MS
SETBMIN_G
MOVA,HOUR;显示当前时间时位
MOVB,#10
DIVAB
MOVDPTR,#LEDTAB
MOVCA,@A+DPTR
MOVP1,A
CLRHOU_S
ACALLD_1MS
SETBHOU_S
MOVA,B
MOVCA,@A+DPTR
MOVP1,A
CLRHOU_G
ACALLD_1MS
SETBHOU_G
MOVA,WEEK;显示当前星期数
MOVCA,@A+DPTR
MOVP1,A
CLRY_S
ACALLD_1MS
SETBY_S
OUT1:
RET
日期的显示,秒表的显示,倒计时的显示,调闹铃,调定时的显示,闪烁的显示程序与以上的的扫描相似,有的以子程序的方式出现,通过子程序调用语句ACALL调用;有点直接嵌套在相应的程序里面,顺序执行,或者用调转语句AJMP调用。
B.2.5调整程序
时钟包括很多调整,如时间,日期,闹铃,秒表等,本程序,设计了相应的调整程序段,通过对应的按键,程序跳入调整模式或功能模式。
在此着重分析一下闹铃重响以及定时功能的实现过程,这两个功能都灵活运用了标志位。
1,定时功能运用了一个内存地址3CH为标志位,只有3CH中所存值非0时,在主程序中才判断定时是否已到。
3CH值初始化为0,程序开始运行时并不判断定时是否已到。
当通过按键进入定时初值设置,并开始倒计时,3CH的值被赋为1,
当倒计时显示到0时,进入闪烁提示,提示结束后3CH又被赋值为0,程序回到主程序后,不必判断定时是否已到。
但当倒计时未完,按返回键回到主程序时,3CH的值为1,故在主程序判断未完成的定时任务,倒计时到0时调用同一个提示程序,最后仍可保证在主程序不再定时开启时去判断定时,从而节约资源。
2,重闹铃的精髓也是标志位的设计,以F0为标志位,其初值为0,正常响铃时判断重响功能键,若重响功能关闭,则跳过重响设定程序;若重响功能开启,则判断标志位F0,为了更好的说明,将相关程序截取如下:
//闹铃重响功能是否判断//
JNBP0.6,RERING
//重响定时,//
RERING:
;闹铃重响判断程序
JNBF0,RE;标志位F0为0,不进行闹铃重响设定
CPLF0
MOV3CH,#1;定时判断标志位赋1,定时判断功能开启
JNBP0.7,M1;闹铃重响间隔时间选取
MOVR4,#0;闹铃重响间隔30秒
MOVR3,#30
AJMPMAIN
M1:
;闹铃重响间隔60秒
MOVR4,#1
MOVR3,#0
AJMPMAIN
JBP2.7,GO;判断暂停键是否按下,未按下则响铃
JNBP0.6,GO1;音乐暂停键,再判断闹铃重响功能是否开启
AJMPEND0
GO1:
;闹铃重响功能开启处理程序
JBF0,GO;重响标志位判断,若F0为1,表明此次响铃调用为重闹铃导致,进入重闹铃环节;若F0为0则表示此次闹铃调用为正常闹铃导致,因为重闹铃功能开启,故将F0置1,以便重闹铃的实现!
CPLF0
AJMPEND0
通过以上程序可知,闹铃初次响时,标志位F0总是0,若重响功能开启,则在初次闹铃自然结束或人为按键结束后通过CPLF0语句,使F0置1,为重响时间间隔的设置提供条件。
当F0值为1时,才能在闹铃功能关闭的情况下重闹铃,重闹铃不像正常闹铃那样,即使没有人为关闭,音乐唱完后,自动回到主程序,而是一直再响,若要关闭重闹铃,则拨动重闹铃开启开关即可。
重闹铃结束后回到调用闹铃的位置,用CLRF0使标志位复位,至此一个重闹铃循环结束。
又回到初次闹铃前的状态。
若要重响开启重闹铃,则需再次开启重闹铃功能。
JNBP0.6,SHENGYIN2;闹铃重响功能开启时,跳入响铃程序
AJMPTISHI;不是闹铃重响定时,则定时时间到时,跳入提示程序
AJMPMAIN
SHENGYIN2:
SETBF0;闹铃重响标志位设定
LCALLRING;响铃
CLRF0;标志位复位
AJMPMAIN
以上程序段可以区别正常定时和重闹铃定时,通过若重闹铃功能选择键按下,则定时,时间到通过一直响铃来提示;若重闹铃功能关闭则定时到用闪烁来提示。
我们不难发现重闹铃开关也可作为定时在主程序中判断时,不同提示方式的选择开关,我们不会影响重闹铃标志位,因为在闹铃子程序调用语句后有F0标志位的清零语句:
CLRF0
C.程序调试及仿真
本程序通过Keil单片机开发平台实现程序的编译,链接,生成HEX文件。
程序再编译过程中可以发现错位,并及时改正,在设计时非常重要,使错误被扼杀在摇篮中。
通过Keil和硬件仿真平台Proteus的联合,可以将设计效果仿真出来,根据效果,有目的的改变设计,优化程序。
c.1利用Keil软件实验过程截图:
1,建一个工程,并设定与Proteus仿真相关的参数
2,汇编程序,并生成HEX文件
c.2利用Proteus仿真实验过程截图:
1.普通时间显示模式仿真图,表示:
星期一9点10分38秒
2.日期调节,显示模式仿真图,表示:
2010年7月10日
3.闹铃调节显示仿真图,表示闹铃时刻为8点整
4.定时,倒计时显示仿真图,表示此时定时初值已经减到54秒,及还有54秒定时到。
定时最大值为59分59秒。
5.秒表显示仿真图,表示秒表已经从0记到8.28秒。
秒表可计时到小时,其中小时位数字可到99,即最大计时为100小时
D,电子时钟电路板焊接实现
通过软,硬件设计和仿真,基本上实现了自己想要的功能,就可以真刀真枪的干一场了。
软件通过调试基本上是没问题的,但是硬件仿真过于泛泛,对电路的细节要求不是那么高,有些问题是不能发现的,最后的实现效果还是要用实物来验证的。
元器件的购买是个苦活,虽然中发市场那么大,但那些元件才是我要的那个它呢?
我们购买的量少,对于那些元器件厂家来说,根本不屑做我们的生意,根本不用说砍价了。
经过一番“跋涉”,终于搜刮齐了元器件。
根据以往经验,焊接电路的布线非常重要,首先要在电路板上将线的大致走向规划好,如何美观,精简是要领。
一下是本次试验的硬件电路实现
正面:
反面:
五.实验总结及感想
一分耕耘,一分收获。
只有亲自用实践来验证这句话,在能得其要领。
经过这次单片机课程设计,我从一个单片机实践的门外汉,已经越升为略知一二的新手。
虽然还有很多有关单片机的应用有待学习,但万变不离其宗,只要深入了解单片的原理,全部知识点,各个细节,一切设计皆有可能。
在实验的开始几天,基本上没有收获,不知何从下手,不知所措。
为了看得更远,不妨站在前人的肩膀上,我在整体思路模糊的情况下,在网上大量招资粮,各种与电子时钟相关的文章,我阅读了不少。
随着涉猎的点滴积累,我对电子时钟的设计方案已经慢慢酝酿而成。
有了方向和不少知识储备后,在接下来的几天,几乎每天都有突破,虽然有时只是一句程序的修改或诞生,但那种收获的感觉很暖人心。
实验中遇到了不少问题,接下来总结一下,共同探讨。
1,按键问题。
我的设计中,很多功能选择是通过按键开关实现的。
在仿真中发现,调整数值时,有时按键反应太快,按一次,跳了几下,使设置时间,日期很不方便。
但是仿真多了之后,找到了按键(实际上是按鼠标)的节奏,对按键的掌控力提高了不少,不怎么会出现跳变的情况了。
有些开关我采用了长按键的方式来防抖,效果不错,但是每次都要长按键,调整效率太低,我没有普及。
本来想把所有的按键都加延时防抖电路,但仿真中感觉对键盘的控制力没提高多少,有时还是会出问题,这个方案放弃了。
索性将板子焊接出来了在调试软件吧,仿真毕竟不是那么“真”啊!
实际电路调试中,按键反应没有出现过于灵敏的问题,基本可控制。
出现以上问题,我认为是电路板上焊接点太多,接触不是很好,影响了信号的传输时间,从而解决了按键