📄 at89s52.asm
字号:
CONFIG12 EQU 7FH
TEMPH EQU 21H
TEMPL EQU 20H
REG2 EQU 22H
REG3 EQU 23H
REG4 EQU 24H
DAT EQU P0.7
SCLK EQU P3.2
IO EQU P3.3
RST EQU P3.4
year DATA 66H
month DATA 65H
week DATA 64H
day DATA 63H
hour DATA 62H
mintue DATA 61H
second DATA 60H
ORG 0000H
LJMP START
ORG 001BH
LJMP INTT1
START: ;初值
LCALL ZJ
SETB EA
MOV TMOD,#10H ;计数器1,方式1
MOV TL1,#00H
MOV TH1,#00H
MOV 32H,#8EH
MOV 31H,#00H ;允许写1302
LCALL WRITE
MOV 32H,#90H
MOV 31H,#0A6H ;1302充电,充电电流1.1MA
LCALL WRITE
;主程序~~~~~~~~~~~~~~~~~~~~~
MAIN1:
MOV 32H,#8DH ;读出年
LCALL READ
MOV year,31H
MOV 32H,#8BH ;读出星期
LCALL READ
MOV week,31H
MOV 32H,#89H ;读出月
LCALL READ
MOV month,31H
MOV 32H,#87H ;读出日
LCALL READ
MOV day,31H
MOV 32H,#85H ;读出小时
LCALL READ
MOV hour,31H
MOV 32H,#83H ;读出分钟
LCALL READ
MOV mintue,31H
MOV 32H,#81H ;读出秒
LCALL READ
MOV second,31H
;~~~~~~~~~~~~分离缓存~~~~~~~~
MOV R0,year ;年分离,送显示缓存
LCALL DIVIDE
MOV 7BH,R1
MOV 4BH,R1
MOV 7CH,R2
MOV 4CH,R2
MOV 78H,week
MOV 48H,week
MOV R0,month ;月分离,送显示缓存
LCALL DIVIDE
MOV 79H,R1
MOV 49H,R1
MOV 7AH,R2
MOV 4AH,R2
MOV R0,day ;日分离,送显示缓存
LCALL DIVIDE
MOV 76H,R1
MOV 46H,R1
MOV 77H,R2
MOV 47H,R2
MOV R0,hour ;小时分离,送显示缓存
LCALL DIVIDE
MOV 74H,R1
MOV 44H,R1
MOV 75H,R2
MOV 45H,R2
MOV R0,mintue ;分钟分离,送显示缓存
LCALL DIVIDE
MOV 72H,R1
MOV 42H,R1
MOV 73H,R2
MOV 43H,R2
MOV R0,second ;秒分离,送显示缓存
LCALL DIVIDE
MOV 70H,R1
MOV 40H,R1
MOV 71H,R2
MOV 41H,R2
CLR EA
LCALL TOUTOU
LCALL NS
SETB EA
LCALL DISPLAY
LCALL GENGXIAN ;更新农历程序
JNB P0.1,SETG111
JNB F0,SSS
SETB P0.4 ;非闰月,则p0.4清零,指示灯亮
LJMP MAIN1
SETG111:
LJMP SETG
SSS:
CLR P0.4 ;闰月,则p0.4置位,指示灯不亮
LJMP MAIN1
;~~~~~~~~~~~~~~~~~~~~~~~~~ 温度
TOUTOU:
LCALL CHUSHI
LCALL RDTEMP
MOV A,TEMPL
ANL A,#11110000B
MOV TEMPL,A
MOV A,TEMPH
ANL A,#00000111B
ORL A,TEMPL
SWAP A
MOV 25H,A
MOV A,25H
MOV B,#64H
DIV AB
MOV A,B
MOV B,#0AH
DIV AB
SWAP A
ORL A,B
MOV 10H,A
RET
CHUSHI:
LCALL RESET
MOV A,#0CCH
LCALL WRITE111
MOV A,#4EH
LCALL WRITE111
MOV A,#CONFIG12
LCALL WRITE111
RET
RDTEMP:
LCALL RESET
MOV A,#0CCH
LCALL WRITE111
MOV A,#44H
LCALL WRITE111
LCALL DL1MS
LCALL RESET
MOV A,#0CCH
LCALL WRITE111
MOV A,#0BEH
LCALL WRITE111
LCALL ERAD111
MOV TEMPL,A
LCALL ERAD111
MOV TEMPH,A
RET
RESET:
LA:
SETB DAT
MOV 52H,#200
LB:
CLR DAT
DJNZ 52H,LB
SETB DAT
MOV 52H,#30
LC:
DJNZ 52H,LC
CLR C
ORL C,DAT
JC LB
MOV 58H,#80
LD:
ORL C,DAT
JC LP
DJNZ 58H,LD
SJMP LA
LP:
MOV 52H,#250
LF:
DJNZ 52H,LF
RET
WRITE111:
MOV 53H,#8
W51HA:
SETB DAT
MOV 54H,#8
RRC A
CLR DAT
W52HA:
DJNZ 54H,W52HA
MOV DAT,C
MOV 54H,#30
W53HA:
DJNZ 54H,W53HA
DJNZ 53H,W51HA
SETB DAT
RET
ERAD111:
CLR EA
MOV 58H,#8
RD1A:
CLR DAT
MOV 54H,#6
NOP
SETB DAT
RD2A:
DJNZ 54H,RD2A
MOV C,DAT
RRC A
MOV 55H,#30
RD3A:
DJNZ 55H,RD3A
DJNZ 58H,RD1A
SETB DAT
RET
;公历设置程序~~~~~~
SETG :
SETB TR1
SETB ET1
MOV 32H,#8EH
MOV 31H,#00H ;允许写1302
LCALL WRITE
MOV 32H,#80H
MOV 31H,#80H ;1302停止振荡
LCALL WRITE
GWAIT: ;~
LCALL DISPLAY
JNB P0.1,GWAIT
SETG1:
LCALL DISPLAY
JNB P0.1,SETG2
JNB P0.2,GADDYEAR
JNB P0.3,JIANYEAR
AJMP SETG1
GADDYEAR:
MOV R7,66H ;年加一
LCALL ADD1
MOV 66H,A
CJNE A,#51H,GADDYEAR1
MOV 66H,#00H
AJMP GADDYEAR1
JIANYEAR:
MOV R7,66H ;年减一
LCALL JIAN1
MOV 66H,A
CJNE A,#00H,GADDYEAR1
MOV 66H,#51H
GADDYEAR1:
MOV 32H,#8CH ;年值送人1302
MOV 31H,66H
LCALL WRITE
MOV R0,66H
LCALL DIVIDE ;年分离送显示缓存
MOV 4BH,R1
MOV 7BH,R1
MOV 4CH,R2
MOV 7CH,R2
WAITT1: ;~~~~~~~
LCALL DISPLAY
JNB P0.2,WAITT1
JNB P0.3,WAITT1
AJMP SETG1
SETG2:
SETB 0AH ;调月时闪标志
GWAIT2:
LCALL DISPLAY
JNB P0.1,GWAIT2
SETG3:
LCALL DISPLAY
JNB P0.1,SETG4
JNB P0.2,GADDMONTH
JNB P0.3,JIANMONTH
AJMP SETG3
GADDMONTH:
MOV R7,65H ;月加一
LCALL ADD1
MOV 65H,A
CJNE A,#13H,GADDMONTH1
MOV 65H,#01H
AJMP GADDMONTH1
JIANMONTH:
MOV R7,65H ;月减一
LCALL JIAN1
MOV 65H,A
CJNE A,#00H,GADDMONTH1
MOV 65H,#12H
GADDMONTH1:
MOV 32H,#88H ;月值送人1302
MOV 31H,65H
LCALL WRITE
MOV R0,65H
LCALL DIVIDE ;月分离,送显示缓存
MOV 79H,R1
MOV 49H,R1
MOV 7AH,R2
MOV 4AH,R2
WAITT2: ;~
LCALL DISPLAY
JNB P0.2,WAITT2
JNB P0.3,WAITT2
AJMP SETG3
SETG4:
SETB 0BH ;调日时闪标志
GWAIT4:
LCALL DISPLAY
JNB P0.1,GWAIT4
SETG5:
LCALL DISPLAY
JNB P0.1,SETG6
JNB P0.2,GADDDAY
JNB P0.3,JIANDAY
AJMP SETG5
GADDDAY:
MOV R7,63H ;日加一
LCALL ADD1
MOV 63H,A
CJNE A,#32H,GADDDAY1
MOV 63H,#01H
JIANDAY:
MOV R7,63H ;日减一
LCALL JIAN1
MOV 63H,A
CJNE A,#00H,GADDDAY1
MOV 63H,#31H
GADDDAY1:
MOV 32H,#86H ;日值送人1302
MOV 31H,63H
LCALL WRITE
MOV R0,63H
LCALL DIVIDE ;日分离,送显示缓存
MOV 76H,R1
MOV 46H,R1
MOV 77H,R2
MOV 47H,R2
WAITT3: ;~~~
LCALL DISPLAY
JNB P0.2,WAITT3
JNB P0.3,WAITT3
AJMP SETG5
SETG6:
SETB 0CH ;调星期时闪标志
GWAIT6:
LCALL DISPLAY
JNB P0.1,GWAIT6
SETG7:
LCALL DISPLAY
JNB P0.1,SETG8
JNB P0.2,GADDWEEK
JNB P0.3,JIANWEEK
AJMP SETG7
GADDWEEK:
MOV R7,64H ;星期加一
LCALL ADD1
MOV 64H,A
CJNE A,#07H,GADDWEEK1
MOV 64H,#00H
AJMP GADDWEEK1
JIANWEEK:
MOV R7,64H ;星期减一
LCALL JIAN1
MOV 64H,A
CJNE A,#00H,GADDWEEK1
MOV 64H,#06H
GADDWEEK1:
MOV 32H,#8AH
MOV 31H,64H ;星期值送人1302
LCALL WRITE
MOV R0,64H
LCALL DIVIDE ;星期值分离送显示缓存
MOV 48H,R1
MOV 78H,R1
WAITT4: ;~~~~
LCALL DISPLAY
JNB P0.2,WAITT4
JNB P0.3,WAITT4
AJMP SETG7
SETG8:
SETB 0DH ;调小时时闪标志
GWAIT8:
LCALL DISPLAY
JNB P0.1,GWAIT8
SETG9:
LCALL DISPLAY
JNB P0.1,SETG10
JNB P0.2,GADDHOUR
JNB P0.3,JIANHOUR
AJMP SETG9
GADDHOUR:
MOV R7,62H ;小时加一
LCALL ADD1
MOV 62H,A
CJNE A,#24H,GADDHOUR1
MOV 62H,#00H
AJMP GADDHOUR1
JIANHOUR:
MOV R7,62H ;小时减一
LCALL JIAN1
MOV 62H,A
CJNE A,#00H,GADDHOUR1
MOV 62H,#23H
GADDHOUR1:
MOV 32H,#84H ;小时值送人1302
MOV 31H,62H
LCALL WRITE
MOV R0,62H
LCALL DIVIDE ;小时值分离送显示缓存
MOV 74H,R1
MOV 44H,R1
MOV 75H,R2
MOV 45H,R2
WAITT5: ;~~~~~
LCALL DISPLAY
JNB P0.2,WAITT5
JNB P0.3,WAITT5
AJMP SETG9
SETG10:
SETB 0EH ;调分时候闪标志
GWAIT10:
LCALL DISPLAY
JNB P0.1,GWAIT10
SETG11:
LCALL DISPLAY
JNB P0.1,SETGOUT
JNB P0.2,GADDMINTUE
JNB P0.3,JIANMINTUE
AJMP SETG11
GADDMINTUE:
MOV R7,61H ;分钟加一
LCALL ADD1
MOV 61H,A
CJNE A,#60H,GADDMINTUE1
MOV 61H,#00H
AJMP GADDMINTUE1
JIANMINTUE:
MOV R7,61H ;分钟减一
LCALL JIAN1
MOV 61H,A
CJNE A,#00H,GADDMINTUE1
MOV 61H,#59H
GADDMINTUE1:
MOV 32H,#82H ;分钟值送人1302
MOV 31H,61H
LCALL WRITE
MOV R0,61H
LCALL DIVIDE ;分钟值分离送显示缓存
MOV 72H,R1
MOV 42H,R1
MOV 73H,R2
MOV 43H,R2
WAITT6:
LCALL DISPLAY
JNB P0.2,WAITT6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -