基于单片机的数字时钟设计.docx
- 文档编号:9426618
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:27
- 大小:64.41KB
基于单片机的数字时钟设计.docx
《基于单片机的数字时钟设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字时钟设计.docx(27页珍藏版)》请在冰点文库上搜索。
基于单片机的数字时钟设计
一摘要
单片计算机即单片微型计算机。
(Single-ChipMicrocomputer),是集CPU,RAM,ROM,
定时,计数和多种接口于一体的微控制器。
他体积小,成本低,功能强,广泛应用于智能产
品和工业自动化上。
而51单片机是各单片机中最为典型和最有代表性的一种。
这次毕业设
计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
二说明
系统由AT89C51、LED数码管、按键、发光二极管等部分构成,能实现时间的调整、定
时时间的设定,输出等功能。
系统的功能选择由SB0、SB1、SB2、SB3、SB4完成。
其中SB0
为时间校对,定时器调整功能键,按SB0进入调整状态。
SB1为功能切换键。
第一轮按动
SB1依次进入一路、二路、三路定时时间设置提示程序,按SB3进入各路定时调整状态。
定
时时间到,二极管发亮。
到了关断时间后灭掉。
如果不进入继续按SB1键,依次进入时间
¡年¡位校对、¡月¡位校对、¡日¡位校对、¡时¡位校对、¡分¡位校对、¡秒¡位
校对状态。
不管是进入那种状态,按动SB2皆可以使被调整位进行不进位增量加1变化。
各
预置量设置完成后,系统将所有的设置存入RAM中,按SB1退出调整状态。
上电后,系统自
动进入计时状态,起始于¡00¡时¡00¡分。
SB4为年月日显示转换键,可使原来显示时分
秒转换显示年月日。
三、程序设计思想和相关指令介绍
本系统的主程序主要完成时间显示和定时输出判断功能。
而年月日显示和各时间单元进
位,时间设定时,调定时间设定时等功能全部在中断服务程序中完成。
1.计时功能的实现与中断服务程序
时间的运行依靠定时中断子程序对时钟单元数值进位调整来实现的。
计数器T0打开后,
进入计时,满100毫秒后,重装定时。
中断一次,满一秒后秒进位,满60秒后即为1分钟,
分钟单元进位,60分到了后,时单元进位,24小时满后,天单元进位。
这样然后根据进率,
得到年、月、日、时、分、秒存储单元的值,并经译码后,通过扫描程序送LED中显示出来,
实现时钟计时功能。
累加是用指令INC来实现的。
进入中断服务程序以后,执行PUSHPSW和PUSHA将程序状态寄存器PSW的内容和累
加器A中的数据保存起来,这便是所谓的¡保护现场¡.以保护现场和恢复现场时存取关键
数据的存储区叫做堆栈。
在软件的控制之下,堆栈可在片内RAM中的任一区间设定,而堆栈
的数据存取与一般的RAM存取又有区别,对它的操作,要遵循¡后进先出¡的原则。
2时间控制功能与比较指令
系统的另一功能就是实现对执行设备的定时开关控制,其主要控制思想是这样的:
先
将执行设备开启的时间和关闭时间置入RAM某一单元,在计时主程序当中执行几条比较指
令,如果当前计时时间与执行设备的设定开启时间相等,就执行一条CLR指令,将对应的
那路P3置为高电位,开启;如果当前计时时间与执行设备设定的关闭时间相等,就执行SETB
对应的P3置低电位,二极管截止,。
实现此控制功能用到的比较指令为CJNEA,#direct,
rel,其转移条件是累加器A中的值与立即数不等则转移。
参考文献
1马忠梅籍顺心等.单片机的C语言应用程序设计(第4版),北京航空航天大学出版社
2余锡存曹国华.单片机原理及接口技术[M].陕西:
西安电子科技大学出版社
3雷丽文等.微机原理与接口技术[M].北京:
电子工业出版社
四:
程序
SECEQU32H;秒即时时间\伪指令
MINEQU31H;分
HOUREQU30H;时
DAYEQU35H;日
MONEQU34H;月
YEAREQU33H;年
MIN_1EQU41H;分定时器1路、开存储单元
HOUR_1EQU42H;时
DAY_1EQU43H;
MON_1EQU44H;
YEAR_1EQU45H;
MIN_11EQU40H;分定时器1路、关存储单元
HOUR_11EQU46H;时
DAY_11EQU47H;日
MON_11EQU48H;月
YEAR_11EQU49H;年
;***********************
ORG0000H
ljmpMAIN
ORG0003H;中断转换显示年月日、INT0(SB4键)
LJMPSHOW
ORG000BH;计数中断T0、方式1
LJMPTIME
ORG0013H
LJMPCHANGE;调整时间、定时、INT1(SB0键)
;------主程序
ORG0030H
MAIN:
;--------初始化付值
MOVYEAR,#02
MOVMON,#05
MOVDAY,#01
MOVHOUR,#00
MOVMIN,#00
MOVSEC,#00
CLR40H;定时单元1路清零
CLR41H
CLR42H
CLR43H
CLR44H
CLR45H
CLR46H
CLR47H
CLR48H
CLR49H
;-------开中断
MOVTMOD,#01H;计数、模式1、T0
MOVTL0,#0B0H;100SM计数定时
MOVTH0,#3CH;
clrp3.0
MOV20H,#0AH;10次*100SM
SETBPT0;T0为最高级
SETBTR0;允许计数
SETBET0;允许T0中断
SETBEX0;允许INT0中断
SETBEX1;允许INT1中断
SETBEA;开总中断
;------显示、定时器启动判断
LOOP:
MOVR1,#30H;存储单元
MOVR4,#01H;位选通
MOVR3,#03H;三组显示
NEXT:
MOVA,@R1;
MOVB,#10;将存储单元转换成两高低两组的BCD码
DIVAB
SWAPA
ORLA,B
MOVP0,A;输出
MOVP2,R4
INCR1;下一单元
MOVA,R4;
RLA;位移
MOVR4,A
LCALLDE5SM;延时0.5SM
DJNZR3,NEXT;全扫描显示一偏
;------判断定时输出(只编写了一路)
CJNER7,#88H,LOOP;是8则开,否则、定时已关、转
;---------开
MOVA,YEAR
CJNEA,YEAR_1,LOOP_1;年比较,不等转关
MOVA,MON
CJNEA,MON_1,LOOP_1
MOVA,DAY
CJNEA,DAY_1,LOOP_1
MOVA,HOUR
CJNEA,HOUR_1,LOOP_1
MOVA,MIN
CJNEA,MIN_1,LOOP_1
CPLP3.0
;---------关
LOOP_1:
MOVA,YEAR
CJNEA,YEAR_11,LOOP;年比较
MOVA,MON
CJNEA,MON_11,LOOP
MOVA,DAY
CJNEA,DAY_11,LOOP
MOVA,HOUR
CJNEA,HOUR_11,LOOP
MOVA,MIN
CJNEA,MIN_11,LOOP
CPLP3.0
LJMPLOOP
;-----年月日显示中断子程序
SHOW:
PUSHPSW
pushACC
PUSHB
PUSH01H
PUSH02H
PUSH03H
PUSH04H
MOVR2,#0FFH;中断扫描次数
TURN:
MOVR1,#33H
MOVR4,#01H
MOVR3,#03H
NEXT_1:
MOVA,@R1
MOVB,#10
DIVAB
SWAPA
ORLA,B
MOVP0,A
MOVP2,R4
INCR1
RLA
MOVR4,A
LCALLDE5SM
DJNZR3,NEXT_1
DJNZR2,TURN;反复显示一定时间后返回
POP04H
POP03H
POP02H
POP01H
POPB
POPACC
POPPSW
RETI
;-----计数中断服务子程序
TIME:
PUSHPSW
PUSHACC
PUSHB
PUSH06H
MOVTH0,#3CH;重装计数
MOVTL0,#0BH;
DJNZ20H,OUT;转到中断跳出pop程序
MOV20H,#0AH;重装:
100*10=1000
;-----进位程序
INCSEC
MOVR6,SEC;
CJNER6,#60,OUT;比较
MOVSEC,#00;
INCMIN
MOVR6,MIN
CJNER6,#60,OUT
MOVMIN,#00
INCHOUR
MOVR6,HOUR
CJNER6,#25,OUT
MOVHOUR,#00
INCDAY
MOVR5,MON
CJNER5,#1,MON_22;是否1月、不是转2月
MOVR5,DAY
CJNER5,#32,OUT;本月是否益出
INCMON
MOVDAY,#1
LJMPOUT
OUT:
POP06H
POPB
POPACC
POPPSW
RETI
MON_22:
MOVR5,MON
CJNER5,#2,MON_33;是否2月、不是转3月
MOVA,YEAR;判断是否瑞年
MOVB,#4
DIVAB
MOVA,B
JNZOUT_1;不是则转(A不为零则转)
MOVR5,DAY
CJNER5,#30,OUT;如是瑞年、判断是否到29天
INCMON
MOVDAY,#1
LJMPOUT
OUT_1:
MOVR5,DAY
CJNER5,#29,OUT;平年二月判断
INCMON
MOVDAY,#1
LJMPOUT
MON_33:
MOVR5,MON
CJNER5,#3,MON_44
MOVR5,DAY
CJNER5,#32,OUT
INCMON
MOVDAY,#1
LJMPOUT
MON_44:
MOVR5,MON
CJNER5,#4,MON_55
MOVR5,DAY
CJNER5,#31,OUT
INCMON
MOVDAY,#1
LJMPOUT
MON_55:
MOVR5,MON
CJNER5,#5,MON_66
MOVR5,DAY
CJNER5,#32,OUT
INCMON
MOVDAY,#1
LJMPOUT
MON_66:
MOVR5,MON
CJNER5,#6,MON_77
MOVR5,DAY
CJNER5,#31,OUT
INCMON
MOVDAY,#1
LJMPOUT
MON_77:
MOVR5,MON
CJNER5,#7,MON_88
MOVR5,DAY
CJNER5,#32,L1
INCMON
MOVDAY,#1
L1:
LJMPOUT
MON_88:
MOVR5,MON
CJNER5,#8,MON_99
MOVR5,DAY
CJNER5,#32,L2
INCMON
MOVDAY,#1
L2:
LJMPOUT
MON_99:
MOVR5,MON
CJNER5,#9,MON_00
MOVR5,DAY
CJNER5,#31,L3
INCMON
MOVDAY,#1
L3:
LJMPOUT
MON_00:
MOVR5,MON
CJNER5,#10,MON_AA
MOVR5,DAY
CJNER5,#32,L4
INCMON
MOVDAY,#1
L4:
LJMPOUT
MON_AA:
MOVR5,MON
CJNER5,#11,MON_BB
MOVR5,DAY
CJNER5,#31,L5
INCMON
MOVDAY,#1
L5:
LJMPOUT
MON_BB:
MOVR5,DAY
CJNER5,#32,L6
INCYEAR
MOVMON,#1
MOVDAY,#1
L6:
LJMPOUT
;-------按SB2\定时器年单元加1子程序
SB3_2:
LJMPSHOW_2;二路没编返回
SB3_3:
LJMPSHOW_3;三路没编返回
SB3_1:
MOVA,YEAR_1;调时年单元
MOVB,#10
DIVAB
SWAPA
ORLA,B
MOVP0,A
MOVP2,#01H
LCALLREAD
LCALLDE250SM
CJNEA,01H,SB3_1
CJNEA,#0FBH,KEY2_7;按SB2转年调整
LJMPMON_111;按SB1往下调月单元
KEY2_7:
CJNEA,#0FDH,SB3_1
INCYEAR_1;1路年单元加1
MOVR5,YEAR_1
CJNER5,#09,SB3_1;益出
MOVYEAR_1,#00H
AJMPSB3_1;
;-------月单元加1子程序
MON_111:
MOVA,MON_1;调时月单元显示
MOVB,#10
DIVAB
SWAPA
ORLA,B
MOVP0,A
MOVP2,#02H
LCALLREAD
LCALLDE250SM
CJNEA,01H,MON_111
CJNEA,#0FBH,KEY2_8;按SB2转月调整
LJMPDAY_111
KEY2_8:
CJNEA,#0FDH,MON_111
INCMON_1;1路月单元加1
MOVR5,MON_1
CJNER5,#13,MON_111;益出
MOVMON_1,#01H
AJMPMON_111;转到月显
;_------日单元加1子程序
DAY_111:
MOVA,DAY_1;调时日单元显示提示
MOVB,#10
DIVAB
SWAPA
ORLA,B
MOVP0,A
MOVP2,#04H
LCALLREAD
LCALLDE250SM
CJNEA,01H,DAY_111
CJNEA,#0FBH,KEY2_9;按SB2转日调整
LJMPHOUR_111
KEY2_9:
CJNEA,#0FDH,DAY_111
INCDAY_1;1组日单元加1
MOVR5,DAY_1
CJNER5,#32,DAY_111;益出
MOVDAY_1,#01H
AJMPDAY_111;转到日显
;-------按SB2时单元加1子程序
HOUR_111:
MOVA,HOUR_1;调时时单元显示提示
MOVB,#10
DIVAB
SWAPA
ORLA,B
MOVP0,A
MOVP2,#01H
LCALLREAD
LCALLDE250SM
CJNEA,01H,HOUR_111
CJNEA,#0FBH,KEY2_10;按SB2转时调整
LJMPMIN_111
KEY2_10:
CJNEA,#0FDH,HOUR_111
INCHOUR_1
MOVR5,HOUR_1
CJNER5,#24,HOUR_111;益出
MOVHOUR_1,#00H
AJMPHOUR_111;转到时显
;-------分单元加1子程序
MIN_111:
MOVA,MIN_1;调时分单元、并显示提示
MOVB,#10
DIVAB
SWAPA
ORLA,B
MOVP0,A
MOVP2,#02H
LCALLREAD
LCALLDE250SM
CJNEA,01H,MIN_111
CJNEA,#0FBH,KEY2_11;按SB2转分调整
AJMPOFF_CH;按SB3往下调定时:
关单元
KEY2_11:
CJNEA,#0FDH,MIN_111
INCMIN_1;1路分单元加1
MOVR5,MIN_1
CJNER5,#60,MIN_111;益处
MOVMIN_1,#00H
AJMPMIN_111;转到分显
年单元调整
OFF_CH:
MOVA,YEAR_11;调时年单元
MOVB,#10
DIVAB
SWAPA
ORLA,B
MOVP0,A
MOVP2,#01H
LCALLREAD
LCALLDE250SM
CJNEA,01H,OFF_CH
CJNEA,#0FBH,KEY2_F7;按SB2转年调整
LJMPMON_OFF;按SB1往下调月单元
KEY2_F7:
CJNEA,#0FDH,OFF_CH
INCYEAR_11;1路年单元加1
MOVR5,YEAR_11
CJNER5,#09,OFF_CH;益出
MOVYEAR_11,#00H
AJMPOFF_CH;
;-------月单元加1子程序
MON_OFF:
MOVA,MON_11;调时月单元显示
MOVB,#10
DIVAB
SWAPA
ORLA,B
MOVP0,A
MOVP2,#02H
LCALLREAD
LCALLDE250SM
CJNEA,01H,MON_OFF
CJNEA,#0FBH,KEY2_F8;按SB2转月调整
LJMPDAY_OFF
KEY2_F8:
CJNEA,#0FDH,MON_OFF
INCMON_11;1路月单元加1
MOVR5,MON_11
CJNER5,#13,MON_OFF;益出
MOVMON_11,#01H
AJMPMON_OFF;转到月显
;_------日单元加1子程序
DAY_OFF:
MOVA,DAY_11;调时日单元显示提示
MOVB,#10
DIVAB
SWAPA
ORLA,B
MOVP0,A
MOVP2,#04H
LCALLREAD
LCALLDE250SM
CJNEA,01H,DAY_OFF
CJNEA,#0FBH,KEY2_F9;按SB2转日调整
LJMPHOUR_OFF
KEY2_F9:
CJNEA,#0FDH,DAY_OFF
INCDAY_11;1组日单元加1
MOVR5,DAY_11
CJNER5,#32,DAY_OFF;益出
MOVDAY_11,#01H
AJMPDAY_OFF;转到日显
;-------按SB2时单元加1子程序
HOUR_OFF:
MOVA,HOUR_11;调时时单元显示提示
MOVB,#10
DIVAB
SWAPA
ORLA,B
MOVP0,A
MOVP2,#01H
LCALLREAD
LCALLDE250SM
CJNEA,01H,HOUR_OFF
CJNEA,#0FBH,KEY2_F10;按SB2转时调整
LJMPMIN_OFF
KEY2_F10:
CJNEA,#0FDH,HOUR_OFF
INCHOUR_11
MOVR5,HOUR_11
CJNER5,#24,HOUR_OFF;益出
MOVHOUR_11,#00H
AJMPHOUR_OFF;转到时显
;-------分单元加1子程序
MIN_OFF:
MOVA,MIN_11;调时分单元、并显示提示
MOVB,#10
DIVAB
SWAPA
ORLA,B
MOVP0,A
MOVP2,#02H
LCALLREAD
LCALLDE250SM
CJNEA,01H,MIN_OFF
CJNEA,#0FBH,KEY2_F11;按SB2转分调整
LJMPON_1;按SB3往下调定时:
开与关
KEY2_F11:
CJNEA,#0FDH,MIN_OFF
INCMIN_11;1路分单元加1
MOVR5,MIN_11
CJNER5,#60,MIN_OFF;益处
MOVMIN_11,#00H
LJMPMIN_OFF;转到分显
;-------开、关定时
ON_1:
CJNEA,#0FBH,MIN_OFF
K1:
MOVA,#88H
MOVR7,A
MOVP0,A
MOVP2,#0FFH;三组都显示开
LCALLREAD
LCALLDE250SM
CJNEA,01H,ON_1;去抖后比较
CJNEA,#0FBH,KEY2_12;按SB2转关
LJMPOUT_A;按SB3调出、处于开状态
KEY2_12:
CJNEA,#0FDH,K1
k2:
MOVA,#00H;显示0关
MOVR7,A
MOVP0,A
MOVP2,#0FFH;
LCALLREAD
LCALLDE250SM
CJNEA,01H,K2;去抖后比较
CJNEA,#0FBH,KEY2_13;按SB2转开
LJMPOUT_A;SB3调出、处关状态
KEY2_13:
CJNEA,#0FDH,K2;比较按了没
LJMPK1;按了SB2、转开
OUT_A:
POP00H
POPB
POPACC
POPPSW
RETI
;_------读取按键程序
READ:
MOVA,P1;读取按键
MOVR1,A
LCALLDE10MS
MOVA,P1
RET
;_----延时程序
DE5SM:
PUSH01H
MOVR1,#0FFH
DJNZR1,$
POP01H
RET
DE10MS:
PUSH04H
PUSH05H
MOVR4,#0AH
Dl1:
MOVR5,#0FFH
dl2:
DJNZR5,$
DJNZR4,dl1
POP05H
POP04H
RET
DE250SM:
PUSH02H
PUSH00H
MOVR0,#0FFH
DEL:
MOVR2,#0FFH
DJNZR2,$
DJNZR0,DEL
POP00H
POP02H
RET
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 数字 时钟 设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)