|
;;;MCU:89S51 COLCK:11.0592MHZ
;;;作者 :LYP103
;;;;; 1.实验任务: 用MCU来做个电子时钟,能用按键来设置和调整时间
;2 :原理
; 单片机的定时/计数器T0产生定时时间,T0的最大定时为50ms,
;即要定时1秒需要经过20次的50ms的定时。
;对于这20次我们就可以采用软件的方法来统计了。作为秒计数时间,
;当一秒产生时,秒计数加1,秒计数到60时,分加一,秒清零,分计数到60时,时加一,分清零
;时计数到24时,清零 ,从新开始 。
;***********************************************************************
;;;接线说明:
;;; 16*2的字符LCD插到J9上
;;;J10的1脚和J7的1脚连 ,J10的2和J7的2连,,J10的3和J7的3连, J10的4和J7的4连
;;;注意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,3 ;返回
A10MS: MOV R6,#09
A10MS1: MOV R7,#0FFH
A10MS2: NOP
NOP
DJNZ R7,A10MS2
DJNZ R6,A10MS1
|
|