📄 万年历最终版.asm
字号:
;*****************************
;* 万年历程序 *
;*****************************
;67H(高两位年)66H(低两位年)65H(月)64H(星期)
;63H(日)62H(小时)61H(分)60H(秒)57H(农历月)56H(农历日)
;显示缓冲单元7CH~7BH(4CH~4BH)年低位,7AH~79H(4AH~49H)月,
;78H(48H)星期,77H~76H(47H~46H)日,75H~74H(45H~44H)时,
;73H72H(43H~42H)分,71H~70H(41H~40H)秒,5EH~5DH(55H~54H)农历年
;5CH~5BH(53H~52H)农历月,5AH~59H(51H~50H)农历日
;闰年标志为F0,定时器T1为调整时候闪烁用
;
;
SCLK EQU P2.3
IO EQU P2.4
RST EQU P2.5
YEAR DATA 66H
MONTH DATA 65H
WEEK DATA 64H
DAY DATA 63H
HOUR DATA 62H
MINTUE DATA 61H
SECOND DATA 60H
DS1302_ADDR DATA 32H
DS1302_DATA DATA 31H
WFLAG1 BIT 2EH.2 ;DS18B20存在标志位
DQ BIT P2.1 ;DS18B20数据线
TEMPER_L EQU 3CH
TEMPER_H EQU 3DH
A_BIT EQU 3EH ;温度低位
B_BIT EQU 3FH ;温度高位
ORG 0000H
AJMP START
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
LJMP INTT1
ORG 0023H
RETI
ORG 002BH
RETI
;************************************
;* 主程序 *
;************************************
START: MOV 2FH,#10H ;设初试模式
MOV SP,#33H
CLR 2EH.1 ;清秒闪标志
CLR 2EH.3 ;清负温度标志
MOV 3AH,#0H ;设秒闪记数初值
SETB EA
MOV SCON,#00H ;串行输出,方式0
MOV TMOD,#10H ;计数器1,方式1
MOV TL1,#00H
MOV TH1,#00H
MOV DS1302_ADDR,#8EH
MOV DS1302_DATA,#00H ;允许写1302
LCALL WRITE
MOV DS1302_ADDR,#90H
MOV DS1302_DATA,#0A6H ;1302充电,充电电流1.1mA
LCALL WRITE
MAIN1:JB P1.4,MAIN11
SETM: LCALL DISPLAY
JNB P1.4,SETM
MOV A,2FH
RL A
CJNE A,#20H,FLAG1
MOV A,#01H
FLAG1:MOV 2FH,A
MAIN11: MOV DS1302_ADDR,#8DH ;READ OUT YEAR
LCALL READ
MOV YEAR,DS1302_DATA
MOV DS1302_ADDR,#8BH ;READ OUT WEEK
LCALL READ
MOV WEEK,DS1302_DATA
MOV DS1302_ADDR,#89H ;READ OUT MONTH
LCALL READ
MOV MONTH,DS1302_DATA
MOV DS1302_ADDR,#87H ;READ OUT DAY
LCALL READ
MOV DAY,DS1302_DATA
MOV DS1302_ADDR,#85H ;READ OUT HOUR
LCALL READ
MOV HOUR,DS1302_DATA
MOV DS1302_ADDR,#83H ;READ OUT MINTUE
LCALL READ
MOV MINTUE,DS1302_DATA
MOV DS1302_ADDR,#81H ;READ OUT SECOND
LCALL READ
MOV A,SECOND
CJNE A,DS1302_DATA,SHAND
AJMP SHAN
SHAND:SETB 2EH.1 ;秒闪标志
SHAN: MOV SECOND,DS1302_DATA
WENDU:JNB 2FH.3,WENDU1 ;不在温度模式下跳过温度读数
AJMP WENDU2
WENDU1:LJMP FENLI
WENDU2:LCALL INIT_18B20 ;读温度
LCALL RE_CONFIG
LCALL GET_TEMPER
AJMP CHANGE
INIT_18B20: SETB DQ
NOP
CLR DQ
MOV R0,#0FBH
TSR1: DJNZ R0,TSR1;延时
SETB DQ
MOV R0,#25H
TSR2: JNB DQ ,TSR3
DJNZ R0,TSR2
TSR3: SETB WFLAG1 ;置标志位,表明DS18B20存在
CLR P2.2;二极管指示
AJMP TSR5
TSR4: CLR WFLAG1
LJMP TSR7
TSR5: MOV R0,#06BH
TSR6: DJNZ R0,TSR6
TSR7:SETB DQ;表明不存在
RET
;********************设定DS18B20暂存器设定值**************
RE_CONFIG:
JB WFLAG1,RE_CONFIG1
RET
RE_CONFIG1: MOV A,#0CCH ;放跳过ROM命令
LCALL WRITE_18B20
MOV A,#4EH
LCALL WRITE_18B20 ;写暂存器命令
MOV A,#00H ;报警上限中写入00H
LCALL WRITE_18B20
MOV A,#00H ;报警下限中写入00H
LCALL WRITE_18B20
MOV A,#1FH ;选择九位温度分辨率
LCALL WRITE_18B20
RET
;*****************读转换后的温度值****************
GET_TEMPER:
SETB DQ
LCALL INIT_18B20
JB WFLAG1,TSS2
RET ;若不存在则返回
TSS2: MOV A,#0CCH ;跳过ROM
LCALL WRITE_18B20
MOV A,#44H ;发出温度转换命令
LCALL WRITE_18B20
MOV R0,#0FBH
TSR9: MOV R1,#0F0H
TSR8: DJNZ R1,TSR8
DJNZ R0,TSR9
;LCALL DISPLAY ;延时
LCALL INIT_18B20
MOV A,#0CCH ;跳过ROM
LCALL WRITE_18B20
MOV A,#0BEH;发出读温度换命令
LCALL WRITE_18B20
LCALL READ2_18B20 ;读两个字节的温度
RET
;***************写DS18B20程序************
WRITE_18B20:
MOV R2,#8
CLR C
WR1:
CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
sETB DQ
NOP
DJNZ R2,WR1
SETB DQ
RET
;***********读18B20程序,读出两个字节的温度*********
READ2_18B20:
MOV R4,#2 ;低位存在29 H,高位存在28H
MOV R1,#29H
RE00: MOV R2,#8
RE01: CLR C
SETB C
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;************读出的温度进行数据转换**************
CHANGE: MOV A,29H
MOV C,28H.0 ;将28H中的最低位移入C
RRC A
MOV C,28H.1
RRC A
MOV C,28H.2
RRC A
MOV C,28H.3
RRC A
MOV 29H,a
JNB ACC.7,XZ
SETB 2EH.3
CPL A
ADD A,#01H
MOV 29H,a
XZ: Mov a,29H;将29H中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov B_BIT,a ;十位在a
mov A_BIT,b ;个位在b
FENLI: MOV R0,YEAR ;年分离,送显示缓存
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -