数字钟在单片机上的实现汇编语言.docx
- 文档编号:10929097
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:57
- 大小:171.26KB
数字钟在单片机上的实现汇编语言.docx
《数字钟在单片机上的实现汇编语言.docx》由会员分享,可在线阅读,更多相关《数字钟在单片机上的实现汇编语言.docx(57页珍藏版)》请在冰点文库上搜索。
数字钟在单片机上的实现汇编语言
武汉大学电子信息学院
电子系统综合设计课程论文
数字钟在单片机上的实现(汇编语言)
、
专业:
年级:
作者:
_____________
_____________
指导教师:
2012年06月29日
1作品的背景与意义
数字钟是一种用数字电路技术实现时、分、秒计时的钟表。
与机械钟相比具有更高的准确性和直观性,具有更长的使用寿命,已得到广泛的使用。
数字钟的设计方法有许多种,例如可用中小规模集成电路组成电子钟,也可以利用专用的电子钟芯片配以显示电路及其所需要的外围电路组成电子钟,还可以利用单片机来实现电子钟等等。
这些方法都各有其特点,其中利用单片机实现的电子钟具有编程灵活,以便于功能的扩展。
2功能指标设计
设计要求
2.1.1基本要求
1.设计一个精确的1秒定时器;
2.根据1秒定时器,设计一个带小时、分钟、秒的时钟,并将小时、分钟、秒显示在LED上;
3.设计小时、分钟、秒的修改按键,可分别调整小时、分钟、秒(按键设计参考电子表)。
2.1.2拓展要求
1.增加小时、分钟、秒的键盘直接修改功能;
2.设计闹钟功能,最多支持5个闹钟,可分别查看和修改闹钟时间,可分别设置闹钟开关;
3.增加万年历功能。
功能设计方案
1.实现正常走时(秒-分-时-日-月-年进位);
2.能够设置时间和日期;
3.能够自动区分平闰年和大小月及2月;
4.具有5个闹钟及其设置功能;
5.在任何设置状态下,修改位会闪烁显示。
3作品方案设计
总体方案的选择
以T0计时器中断产生1s信号,T1计时器中断刷新数码管。
系统软件流程图如下所示:
设计时使T0优先级高于T1以确保准确计时,初始化完成后,程序一直处于主循环模块,主循环模块中有设置按键的检测模块,当遇到设置信号暂时跳出主循环去执行相应的设置模块,时间设置,日期设置,闹钟设置3大模块彼此之间是相互独立且平行的,他们和主循环模块也不干扰。
因此,当进入任何一个模块时,其他模块中的所有功能和按键都暂时失效,程序由始至终中断服务一直打开。
模块划分及分析
••MAIN:
初始化程序模块
进行初值的分配(栈顶地址,初始时间,初始日期,初始化闹钟及相关标志地址)各定时器,中断初始化。
▪ZHUXUNHUAN:
主循环模块
程序主要执行部分,包含闹钟检测,独立按键检测(日期—时间转换检测),矩阵按键检测(闹钟设置,日期设置,时间设置)3大检测部分。
▪•SERVE:
1s中断服务
中断走时:
秒→分→时→日→月→年
▪XIAGSHI:
刷屏中断服务(显示中断服务)
以人眼不能分辨的频率一次刷新8或6位数码管来显示时间或日期及其他设置界面。
▪SHIJIANSHEZHI:
时间设置模块
修改时间,其中修改位闪烁显示加以区分,内嵌了时间的自动检测和校正代码,既不允许修改出现不存在的时间。
▪WANNIANLISHEZHI:
日期设置模块
修改日期,同样的修改位闪烁加以区分,内嵌了日期的自动检测和校正代码,既不允许出现不存在的日期。
▪NAOZHONGSHEZHI:
闹钟设置模块
修改闹钟时间,闹钟开关的置换,修改位闪烁加以区分,内嵌时间自动监测和校正代码已设置正确的时间。
单模块设计流程图
在完成的整体设计和模块划分后,便进入到工作量最大的单模块流程设计。
▪主循环:
说明:
1.初始化时,将保存5个闹钟(按时分秒顺序排放)的15个地址50H—5EH均清零,将对应的5个闹钟开关0AH—0EH也都清零表示闹钟开关状态,检测闹钟时,从第一个闹钟开始分别检测开关,时分秒只要有任何一项不符合及即检测下一个闹钟,到最后一个闹铃也不符合时,进入按键检测部分。
2.按键检测包含独立按键和矩阵按键两部分,独立按键很简单,矩阵按键则编写检测子程序,将检测到的键值保存在寄存器R7中,没有检测到按键时不改变R7的数值。
因此,检测器先将R7里面放入#0FH(只要不是#00H—#0CH中的数即可),然后调用矩阵键盘检测子程序,再来通过检测R7的数值来判断有无按键按下或按下的那个键。
▪时间设置模块:
说明:
1.进入时间设置模块后,时的十位开始闪烁,通过独立按键s17,s18可以向右向左移动闪烁即修改位,修改正确的判断实际上是对将要修改完成的时间进行合理性的判断,如合理则修改时间,若不合理则此次按键失效。
2.检测到退出信号后,先要将所有初始化过程中改变了的标志位还原,如闪烁开关位等,再调回主循环。
▪日期设置模块:
日期设置模块和时间设置模块几乎完全一样,所不同的是初始化不一样及日期设置里面有8位数码管需要刷新,而且由于日期比时间复杂,因此该模块中有两处日期校正部分,一部分是对按键修改是否正确的判断,使用方法也是使相应按键暂时失效(例如:
修改前日期是2012:
03:
31,那么此时月份上得十位1-9所以数字都暂时失效,日个位上的2-9所以数字也都全部暂时失效);另一部分是修改后的日期校正,通过调用该子程序,防止上一部分不能消除的错误日期设置(例如:
修改前日期是2012:
01:
31,这时修改月份个位为2则日期变为2012:
02:
31,显然这样的日期是不存在的,这时校正程序将日期进位,日期更改为2012:
03:
01)。
这部分校正模块在后面的1s中断服务中也有使用。
下图为该模块流程图:
▪闹钟设置模块:
闹钟设置模块和时间设置一是大同小异,主要区别在于多了一部分闹铃开关的检测。
下图为该模块流程图:
4模块源程序
ORG0000H
AJMPMAIN
ORG000BH
AJMPSERVE
ORG001BH
AJMPXIANSHI
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,40H;段选表0,1,2,3,4,5,6,7,8,9,熄灭,-
TAB1:
DB0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH,00H,40H;段选表带小数点,同上
MAIN:
/*****************************************************************************/
//初始化
MOVSP,#60H;栈指针地址赋值
MOV3CH,#0CH;设置界面修改位的闪烁频率具体代码在SERVE1秒中断服务中
MOV37H,#0FFH;临时地址预留给39H
MOV39H,#0FFH;段位标志8位数据对应8个数码管为0的那位数码管始终暗
MOV3AH,#B;界面转换标志******01为时间界面取反后******10为万年历界面******00为设置闹钟界面
CLRA;时间万年历初始化时间00:
00:
00万年历2000。
01。
01
MOV30H,A;时
MOV31H,A;分
MOV32H,A;秒
MOV33H,#01H;日
MOV34H,#01H;月
MOV35H,A;年只能显示2000-2099的时间
MOV3DH,A;数码管闪烁开关初始化为关闭状态取反后打开
MOV40H,A;闹钟设置界面预留地址地址
MOV41H,A
MOV42H,A
MOV43H,A
MOV44H,A
MOV45H,A
MOV46H,A
MOV47H,A
MOV50H,A;闹钟1时
MOV51H,A;闹钟1分
MOV52H,A;闹钟1秒
MOV0AH,A;闹钟1开关00000000为关闭状态取反后打开闹钟1
MOV53H,A;同上
MOV54H,A
MOV55H,A
MOV0BH,A
MOV56H,A
MOV57H,A;同上
MOV58H,A
MOV0CH,A
MOV59H,A;同上
MOV5AH,A
MOV5BH,A
MOV0DH,A
MOV5CH,A;同上
MOV5DH,A
MOV5EH,A
MOV0EH,A
//中断,定时器初始化
MOVTMOD,#11H
MOV38H,#14H;T0定时器每50ms溢出一次溢出20次为一秒
SETBPT0;优先级设置1秒中断为最高级屏幕刷新优先级低
SETBPT1
SETBET0
SETBET1
SETBEA
MOVTH1,#0DFH;T1定时器设置显示扫描频率
MOVTL1,#0E0H
MOVTH0,#3CH;T0定时器设置为50ms
MOVTL0,#0B0H
SETBTR1
SETBTR0
/***********************************************************************/
//程序主循环
ZHUXUNHUAN:
//闹钟检测
MOVA,0AH
JZNAO2;检测闹钟开关若关检测下一个闹钟,否则检测时间是否为闹钟设定时间
MOVA,30H
CJNEA,50H,NAO2
MOVA,31H
CJNEA,51H,NAO2
MOVA,32H
CJNEA,52H,NAO2
AJMPXIANG;时间为闹钟设定时间吻合进入闹铃程序下同
NAO2:
MOVA,0BH
JZNAO3
MOVA,30H
CJNEA,53H,NAO3
MOVA,31H
CJNEA,54H,NAO3
MOVA,32H
CJNEA,55H,NAO3
AJMPXIANG
NAO3:
MOVA,0CH
JZNAO4
MOVA,30H
CJNEA,56H,NAO4
MOVA,31H
CJNEA,57H,NAO4
MOVA,32H
CJNEA,58H,NAO4
AJMPXIANG
NAO4:
MOVA,0DH
JZNAO5
MOVA,30H
CJNEA,59H,NAO5
MOVA,31H
CJNEA,5AH,NAO5
MOVA,32H
CJNEA,5BH,NAO5
AJMPXIANG
NAO5:
MOVA,0EH
JZBU
MOVA,30H
CJNEA,5CH,BU
MOVA,31H
CJNEA,5DH,BU
MOVA,32H
CJNEA,5EH,BU
AJMPXIANG
//检测独立按键
BU:
JBT0,ZHU1;检测s19是否按下按下进入万年历界面,否则检测矩阵键盘
MOVA,3AH;界面转换标志取反即可使得时间和万年历界面相互转换
CPLA
MOV3AH,A
//检测矩阵键盘
//检测到按键1,2,3,4,5时进入对应的闹钟设置界面检测到0BH(对应s11)进入时间设置界面检测到0CH(对应s12)进入万年历设置界面
//若未检测到按键则跳回主程序继续下一个检测周期
ZHU1:
MOVR7,#0FH
ACALLJIANCEANJIAN;矩阵键盘检测子程序将检测到的键值存入r7
CJNER7,#0FH,ZHU2
AJMPZHUXUNHUAN
ZHU2:
CJNER7,#0BH,ZHU3
AJMPSHIJIANSHEZHI
ZHU3:
CJNER7,#0CH,ZHU4
AJMPWANNIANLISHEZHI
ZHU4:
CJNER7,#01H,ZHU5
AJMPNAOZHONGSHEZHI
ZHU5:
CJNER7,#02H,ZHU6
AJMPNAOZHONGSHEZHI
ZHU6:
CJNER7,#03H,ZHU7
AJMPNAOZHONGSHEZHI
ZHU7:
CJNER7,#04H,ZHU8
AJMPNAOZHONGSHEZHI
ZHU8:
CJNER7,#05H,ZHUXUNHUAN0
AJMPNAOZHONGSHEZHI
ZHUXUNHUAN0:
AJMPZHUXUNHUAN
/****************************************************************************/
//1秒中断服务见书141例6-6
SERVE:
CLREA
PUSHB
PUSHDPH
PUSHDPL
PUSHPSW
PUSHACC
MOVTH0,#3CH
MOVTL0,#0B0H
MOVA,3DH
JZSE
MOVA,3CH
CJNEA,#6,SE0
MOV39H,37H
SE0:
DJNZ3CH,SE
MOV39H,#0FFH
MOV3CH,#0CH
SE:
DJNZ38H,RETURN
MOV38H,#14H
MOVA,#01H
ADDA,32H
MOV32H,A
CJNEA,#3CH,RETURN
MOV32H,#00H
MOVA,#01H
ADDA,31H
MOV31H,A
CJNEA,#3CH,RETURN
MOV31H,#00H
MOVA,#01H
ADDA,30H
MOV30H,A
CJNEA,#18H,RETURN
MOV30H,#00H
MOVA,#01H
ADDA,33H
MOV33H,A
ACALLNYR
RETURN:
POPACC
POPPSW
POPDPL
POPDPH
POPB
SETBEA
RETI
/**************************************************************************/
//年月日校正子程序用于万年历进位和万年历设置防止出现不存在的时间
NYR:
MOVA,33H
CJNEA,#32,MONTH;日为32时,月进位日置1
MOV33H,#01H
AJMPMONTH0
MONTH:
CJNEA,#31,MONTH1;日为31时分辨大小月及2月
MOVA,34H
CJNEA,#4,MONTH2
MOV33H,#01H
AJMPMONTH0
MONTH2:
CJNEA,#2,MONTH6
MOV33H,#01H
AJMPMONTH0
MONTH6:
CJNEA,#6,MONTH9
MOV33H,#01H
AJMPMONTH0
MONTH9:
CJNEA,#9,MONTH11
MOV33H,#01H
AJMPMONTH0
MONTH11:
CJNEA,#11,RETURN0
MOV33H,#01H
AJMPMONTH0
MONTH1:
CJNEA,#30,MONTH29;日为30时分辨2月
MOVA,34H
CJNEA,#02H,RETURN0
MOV33H,#01H
AJMPMONTH0
MONTH29:
CJNEA,#29,RETURN0;日为29时分辨闰平年2月
MOVA,34H
CJNEA,#02H,RETURN0
MOVA,35H
MOVB,#04H
DIVAB
MOVA,B
JNZMONO
AJMPRETURN0
MONO:
MOV33H,#01H
MONTH0:
MOVA,#01H;月进位
ADDA,34H
MOV34H,A
CJNEA,#0DH,RETURN0
MOV34H,#01H
MOVA,#01H
ADDA,35H
MOV35H,A
CJNEA,#100,RETURN0;年最多只能99
MOV35H,#00
RETURN0:
RET
/******************************************************************/
//屏幕刷新中断
XIANSHI:
PUSHB
PUSHDPH
PUSHDPL
PUSHPSW
PUSHACC
MOVTH1,#0DFH
MOVTL1,#0E0H
MOVA,3AH
JNB,WANNIANLI;界面显示判断
//时间界面
MOVA,32H
MOVB,#0AH
DIVAB
MOV10H,B
MOV11H,A
MOVA,31H
MOVB,#0AH
DIVAB
MOV12H,B
MOV13H,A
MOVA,30H
MOVB,#0AH
DIVAB
MOV14H,B
MOV15H,A
MOV16H,#0AH
MOV17H,#0AH
AJMPLIANG
//万年历界面
WANNIANLI:
JNB,SHEZHI
MOVA,33H
MOVB,#0AH
DIVAB
MOV10H,B
MOV11H,A
MOVA,34H
MOVB,#0AH
DIVAB
MOV12H,B
MOV13H,A
MOVA,35H
MOVB,#0AH
DIVAB
MOV14H,B
MOV15H,A
MOV16H,#00H
MOV17H,#02H
AJMPLIANG
//闹钟设置界面
SHEZHI:
MOV10H,40H
MOV11H,41H
MOV12H,42H
MOV13H,43H
MOV14H,44H
MOV15H,45H
MOV16H,46H
MOV17H,47H
//刷新屏幕
LIANG:
MOVR6,#B;位选
MOVR0,#10H;利用r0间接访问功能实现选中位显示控制
MOVR4,#8H;刷新8次
MAIN0:
;位选子程序
ACALLL
CJNER0,#12H,TT1
MOVDPTR,#TAB1
AJMPK
TT1:
CJNER0,#14H,TT2
MOVDPTR,#TAB1
AJMPK
TT2:
MOVDPTR,#TAB
K:
MOVA,@R0
MOVCA,@A+DPTR
MOVR5,A
//数码管开关判断不刷新39H中对应为0的那段数码管
MOVA,39H
JNB,AC0
JNB,AC1
JNB,AC2
JNB,AC3
JNB,AC4
JNB,AC5
JNB,AC6
JNB,AC7
AJMPJ0
AC0:
CJNER4,#08H,J0
AJMPJ1
AC1:
CJNER4,#07H,J0
AJMPJ1
AC2:
CJNER4,#06H,J0
AJMPJ1
AC3:
CJNER4,#05H,J0
AJMPJ1
AC4:
CJNER4,#04H,J0
AJMPJ1
AC5:
CJNER4,#03H,J0
AJMPJ1
AC6:
CJNER4,#02H,J0
AJMPJ1
AC7:
CJNER4,#01H,J0
AJMPJ1
J0:
ACALLR;段选子程序
J1:
MOVA,R6
RLA
MOVR6,A
INCR0
ACALLDELAY1;延时越长数码管越亮但过长导致刷新过慢数码管不能同时全亮
MOVDPTR,#8200H
MOVA,#00H
MOVX@DPTR,A
DJNZR4,MAIN0
POPACC
POPPSW
POPDPL
POPDPH
POPB
RETI
L:
MOVDPTR,#8300H
MOVA,R6
MOVX@DPTR,A
RET
R:
MOVDPTR,#8200H
MOVA,R5
MOVX@DPTR,A
RET
/********************************************************************/
//延时子程序
DELAY:
;延时20毫秒用于矩阵键盘的检测
MOV3EH,#120
LOOP1:
MOV3FH,#30
LOOP2:
DJNZ3FH,LOOP2
DJNZ3EH,LOOP1
RET
MDELAY:
MOV3EH,#5
MLOOP1:
MOV3FH,#0AAH
MLOOP2:
DJNZ3FH,MLOOP2
DJNZ3EH,MLOOP1
RET
DELAY1:
MOV3EH,#15
LOOP11:
MOV3FH,#40
LOOP21:
DJNZ3FH,LOOP21
DJNZ3EH,LOOP11
RET
DELAY0:
MOV3EH,#0FFH
LOOP10:
MOV3FH,#0FFH
LOOP20:
DJNZ3FH,LOOP20
DJNZ3EH,LOOP10
RET
/***********************************************************/
//时间设置
SHIJIANSHEZHI:
MOV39H,#B;时的十位闪烁
MOV37H,39H
MOV3DH,#0FFH;开闪烁开关
M:
JBT1,S1;检测独立按按键s20按下则退出时间设置继续进入主循环
MOV39H,#0FFH
MOV3DH,#00H
AJMPZHUXUNHUAN
S1:
JBINT0,S2;闪烁位即修改为右移
MOVA,37H
CJNEA,#B,SS0
RRA
RRA
RRA
MOV37H,A
S10:
JNBINT0,S10;右移按键松开才继续下面的程序防止一次按键右移多位下同
AJMPM
SS0:
RRA
MOV37H,A
S11:
;左移
JNBINT0,S11
AJMPM
S2:
JBINT1,M1
MOVA,37H
CJNEA,#B,SS1
RLA
RLA
RLA
MOV37H,A
S12:
JNBINT1,S12
AJMPM
SS1:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 单片机 实现 汇编语言
![提示](https://static.bingdoc.com/images/bang_tan.gif)