📄 电子钟.asm
字号:
;;; 电子钟实验
;;; MCU:89S51 COLCK:11.0592MHZ
;;; 1.实验任务: 用MCU来做个电子时钟,能用按键来设置和调整时间
; 2 原理:
; 单片机的定时/计数器T0产生定时时间,T0的最大定时为50ms,
; 即要定时1秒需要经过20次的50ms的定时。
; 对于这20次我们就可以采用软件的方法来统计了。作为秒计数时间,
; 当一秒产生时,秒计数加1,秒计数到60时,分加一,秒清零,分计数到60时,时加一,分清零
; 时计数到24时,清零 ,从新开始 。
;***********************************************************************
;;;;;;接线说明:
;;; 16*2的字符LCD插到LCD插座上
;;; 注意:该插座的第一脚与LCD的第一脚对应,并在断电的情况下插拔!!!
;;; J10(25x2双排插针)第19脚(LCD-RS)和第20脚(CPU的P1.2)连
;;; J10(25x2双排插针)第17脚(LCD-RW)和第18脚(CPU的P1.1)连
;;; J10(25x2双排插针)第15脚(LCD-E)和第16脚(CPU的P1.0)连
;;; 注意JP的短路帽不要接 ,拨码开关全部拨到数字那边
;***********************************************************************
K1 BIT P0.0 ;加一键 ,选择的数据加一
K2 BIT P0.1 ;减一键 ,选择的数据减一
K3 BIT P0.2 ;选择键 ,选择要调整秒,分还是小时用的
K4 BIT P0.3 ;确定键,是退出设定
RS EQU P1.2 ;LCD-RS
RW EQU P1.1 ;LCD-RW
E EQU P1.0 ;LCD-E
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIME;T0定时中断处理程序
MAIN: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV P2,#01H;清除屏幕
ACALL ENABLE
MOV P2,#38H;8位点阵方式
ACALL ENABLE
MOV P2,#0FH;开显示
ACALL ENABLE
MOV P2,#06H;移动光标
ACALL ENABLE
MOV P2,#01H;清除屏幕
ACALL ENABLE
MOV p2,#38H;8位点阵方式
ACALL ENABLE
MOV p2,#0ch;0FH;开显示
ACALL ENABLE
MOV p2,#06H;移动光标
ACALL ENABLE
MOV p2,#80H;显示位置第一行
ACALL ENABLE
CLR 20H
MOV P0,#0FH
MOV IE,#8aH
MOV TMOD,#051H ;设定定时器工作方式?
MOV TL0,#010H
MOV TH0,#4cH
MOV 30H,#00 ;
MOV 31H,#00 ;秒
MOV 32H,#00 ;分
MOV 33H,#00 ;小时
MOV 34H,#00 ;设定按键的数值,1为时,2为分,3为秒
SETB TR0 ;启动定时式
MAIN1:JNB K3,MAIN2 ;有选择键按下转
JNB 20H,MAIN1 ;1S是否已到?
CLR 20H
ACALL LCD;显示时间
mov P2,#90H;光标
call enable
AJMP MAIN1
MAIN2:CLR P1.3
ACALL A10MS ;去抖动
SETB P1.3
JB K3,MAIN1 ;没有按下返回
MOV 34H,#03H ;设定按键的数值置初值
ACALL LCD;显示时间
ACALL LCDM ;更新LCD的标
MAIN3:JB K3,MAIN4;等按键放开
JNB 20H,MAIN3 ;1S是否已到?
CLR 20H
ACALL LCD;显示时间
ACALL LCDM ;更新LCD的标
AJMP MAIN3
MAIN4:ACALL A10MS
JNB K3,MAIN3
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;判断是否有按键
MAIN5:MOV P0,#0FH
NOP
NOP
NOP
MOV A,P0 ;读按键的值
ADD A,#0F0H
CPL A ;如没按键按下,那A的数值为0
JNZ MAIN6 ;按键按下跳转
JNB 20H,MAIN5 ;1S是否已到?
CLR 20H
ACALL LCD;显示时间
ACALL LCDM ;更新LCD的标
AJMP MAIN5
MAIN6:ACALL A10MS ;去抖动
MOV P0,#0FH
NOP
NOP
NOP
MOV A,P0 ;读按键的值
ADD A,#0F0H
CPL A ;如没按键按下,那A的数值为0
JZ MAIN5 ;没按键按下跳转
;;;;;;;;确定键
CLR P1.3
ACALL A10MS ;去抖动
SETB P1.3
JNB K4,MAIN1;确定键退出设制
;设定按键
JB K3,MAIN7;没有按键按下跳转
DJNZ 34H,MAINXX ;设定按键的数值减一不为0转
MOV 34H,#03H;设定按键的数值从新赋数值
AJMP MAINXX
;+1键
MAIN7:JB K2,MAIN10 ;没有按+1键按下跳转
MOV A,34H ; 34H是设定按键的数值,1为时,2为分,3为秒
;秒加一
CJNE A,#03H,MAIN8
INC 31H ;秒加一
MOV A,31H
DA A ;调整为BCD码
MOV 31H,A
CJNE A,#60H,MAINXX;是不是有60S,没转
MOV 31H,#00 ;秒清0
AJMP MAINXX
;分加一
MAIN8:MOV A,34H
CJNE A,#02H,MAIN9
INC 32H ;分加一
MOV A,32H
DA A
MOV 32H,A
CJNE A,#60H,MAINXX ;是不是有一个小时,没转
MOV 32H,#00 ; 分清0
AJMP MAINXX
;小时加一
MAIN9:MOV A,34H
CJNE A,#01H,MAINXX
INC 33H ;小时加一
MOV A,33H
DA A
MOV 33H,A
CJNE A,#24H,MAINXX ;是不是到24小时
MOV 33H,#00 ;小时清0
AJMP MAINXX
;;;;;
MAINXX:
;判断按键是否释放
ACALL LCD;显示时间
ACALL LCDM ;更新LCD的标
MAINXX1:MOV P0,#0FH
NOP
NOP
NOP
MOV A,P0 ;读按键的值
ADD A,#0F0H
CPL A ;如没按键按下,那A的数值为0
JZ MAINXX2 ;按键释放
JNB 20H,MAINXX1;1S是否已到?
CLR 20H
ACALL LCD;显示时间
ACALL LCDM ;更新LCD的标
AJMP MAINXX1
MAINXX2:ACALL A10MS ;去抖动
MOV P0,#0FH
NOP
NOP
NOP
MOV A,P0 ;读按键的值
ADD A,#0F0H
CPL A ;如没按键按下,那A的数值为0
JNZ MAINXX1 ;没释放
AJMP MAIN5
;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;-1键
MAIN10:JB K1,MAINXX
MOV A,34H ; 34H是设定按键的数值,1为时,2为分,3为秒
;秒减一
CJNE A,#03H,MAIN12
;秒减一
MOV A,31H ;;BCD码的减一是用加99来求得
JZ MAIN11
ADD A,#99H
DA A ;调整为BCD码
MOV 31H,A
CJNE A,#00H,MAINXX;是不是有60S,没转
MAIN11:MOV 31H,#59H ;秒恢复60
AJMP MAINXX
;分减一
MAIN12:MOV A,34H
CJNE A,#02H,MAIN14
MOV A,32H ;;BCD码的减一是用加99来求得
JZ MAIN13
ADD A,#99H
DA A ;调整为BCD码
MOV 32H,A
CJNE A,#00H,MAINXX;是不是有60S,没转
MAIN13:MOV 32H,#59H ;秒恢复60
AJMP MAINXX
;小时减一
MAIN14:MOV A,33H ;;BCD码的减一是用加99来求得
JZ MAIN15
ADD A,#99H
DA A ;调整为BCD码
MOV 33H,A
CJNE A,#00H,MAINXX;是不是有0,没转
MAIN15:MOV 33H,#23H ;秒恢复23
AJMP MAINXX
NOP
;;;;T0定时中断处理程序:
TIME: PUSH ACC ;保护现场
PUSH PSW
MOV TL0,#0F8H;06H ;赋定时初值
MOV TH0,#4BH;4CH
INC 30H ;
MOV A,30H
CJNE A,#20,RETI1
MOV 30H,#00H ;一秒钟时间到
SETB 20H
INC 31H ;秒加一
MOV A,31H
DA A
MOV 31H,A
CJNE A,#60H,RETI1;是不是有60S,没转
MOV 31H,#00 ;秒清0
INC 32H ;分加一
MOV A,32H
DA A
MOV 32H,A
CJNE A,#60H,RETI1 ;是不是有一个小时,没转
MOV 32H,#00 ; 分清0
INC 33H ;小时加一
MOV A,33H
DA A
MOV 33H,A
CJNE A,#24H,RETI1 ;是不是到24小时
MOV 33H,#00 ;小时清0
RETI1:pop psw
pop acc
reti
;;;;;;;;;;;;;;
;;;;;时间显示
LCD:
;写数据 时间显示: XX : XX : XX;分别时:时:分:秒
MOV P2,#38H;8位点阵方式
ACALL ENABLE
MOV P2,#0FH;开显示
ACALL ENABLE
MOV P2,#06H;移动光标
ACALL ENABLE
MOV P2,#80H;第一行显示位置
ACALL ENABLE
MOV DPTR,#table1
a1: mov a,33H ;显示:时
SWAP A
ANL A,#0FH
movc a,@a+dptr
call write2
MOV A,33H
ANL A,#0FH
movc a,@a+dptr
call write2
MOV A,#":"
call write2
mov a,32H ;显示:分
SWAP A
ANL A,#0FH
movc a,@a+dptr
call write2
MOV A,32H
ANL A,#0FH
movc a,@a+dptr
call write2
MOV A,#":"
call write2
mov a,31H ;显示:秒
SWAP A
ANL A,#0FH
movc a,@a+dptr
call write2
MOV A,31H
ANL A,#0FH
movc a,@a+dptr
call write2
ret
LCDM: ;更新LCD的标
MOV A,#7EH
ADD A,34H
ADD A,34H
ADD A,34H
mov P2,A;光标
call enable
RET
write2:
mov P2,a
setb rs
clr rw
clr e
ACALL delay
setb e
ret
ENABLE:
CLR RS
CLR RW
CLR E
ACALL DELAY
SETB E
RET
delay: ;写延时,等待写完成
mov r7,#30
d1: mov r6,#25
d2: djnz r6,d2
djnz r7,d1
ret
;0 1 2 3 4 5 6 7 8 9
table1:DB 30H,31H,32H,33H,34H,35H,36H,37H,38h,39h ;返回
A10MS: MOV R6,#09
A10MS1: MOV R7,#0FFH
A10MS2: NOP
NOP
DJNZ R7,A10MS2
DJNZ R6,A10MS1
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -