📄 万年历串口程序.txt
字号:
; LCALL SEND_D
INC DPTR
DJNZ COUNT,LGS33
RET
LGS4: MOV DPTR,#TAB04 ;显示汉字和字符
MOV COUNT,#02H
MOV A,#8CH
MOV DA_IN,A
CLR RS_STU
LCALL SERIAL_WR
; LCALL SEND_I
LGS44: CLR A
MOVC A,@A+DPTR
MOV DA_IN,A
SETB RS_STU
LCALL SERIAL_WR
; LCALL SEND_D
INC DPTR
DJNZ COUNT,LGS44
RET
LGS5: MOV DPTR,#TAB05 ;显示汉字和字符
MOV COUNT,#02H
MOV A,#9AH
MOV DA_IN,A
CLR RS_STU
LCALL SERIAL_WR
; LCALL SEND_I
LGS55: CLR A
MOVC A,@A+DPTR
MOV DA_IN,A
SETB RS_STU
LCALL SERIAL_WR
; LCALL SEND_D
INC DPTR
DJNZ COUNT,LGS55
RET
LGS6: MOV DPTR,#TAB06 ;显示汉字和字符
MOV COUNT,#02H
MOV A,#9DH
MOV DA_IN,A
CLR RS_STU
LCALL SERIAL_WR
; LCALL SEND_I
LGS66: CLR A
MOVC A,@A+DPTR
MOV DA_IN,A
SETB RS_STU
LCALL SERIAL_WR
; LCALL SEND_D
INC DPTR
DJNZ COUNT,LGS66
RET
;***********************************************
;18B20子程序
;**********************************************
WENDU: JNB TEMPONEOK,MAIN2 ;上电时先温度转换一次
LCALL READTEMP1 ;读出温度值子程序
LCALL CONVTEMP ;温度BCD码计算子程序
LCALL DISPBCD ;显示区BCD码温度值刷新子程序
CLR TEMPONEOK
RET
MAIN2: LCALL READTEMP ;温度转换开始
SETB TEMPONEOK
SJMP WENDU
;************************************************
; 子程序区
;*************************************************
INITDS1820: SETB TEMPDIN ; DS18B20的复位
NOP
NOP
CLR TEMPDIN
MOV R6,#0A0H
DJNZ R6,$
MOV R6,#0A0H
DJNZ R6,$
SETB TEMPDIN
MOV R6,#32H
DJNZ R6,$
MOV R6,#3CH
LOOP1820: MOV C,TEMPDIN
JC INITDS1820OUT
DJNZ R6,LOOP1820
MOV R6,#064H
DJNZ R6,$
SJMP INITDS1820
RET
INITDS1820OUT:
SETB TEMPDIN
RET
;**************************************************************
;读DS18B20,从18B20中读出一个字节的数据
;********************************************************************
READDS1820: MOV R7,#08H
SETB TEMPDIN
NOP
NOP
READDS1820LOOP:
CLR TEMPDIN
NOP
NOP
NOP
SETB TEMPDIN
MOV R6,#07H
DJNZ R6,$
MOV C,TEMPDIN
MOV R6,#3CH
DJNZ R6,$
RRC A
SETB TEMPDIN
DJNZ R7,READDS1820LOOP
MOV R6,#3CH
DJNZ R6,$
RET
;写DS18B20的程序
;****************************************************
WRITEDS1820: MOV R7,#08H
SETB TEMPDIN
NOP
NOP
WRITEDS1820LOP:
CLR TEMPDIN
MOV R6,#07H
DJNZ R6,$
RRC A
MOV TEMPDIN,C
MOV R6,#34H
DJNZ R6,$
SETB TEMPDIN
DJNZ R7,WRITEDS1820LOP
RET
;********************************************************
READTEMP: LCALL INITDS1820 ;复位
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITEDS1820
MOV R6,#34H
DJNZ R6,$
MOV A,#44H ;温度转换命令
LCALL WRITEDS1820
MOV R6,#34H
DJNZ R6,$
RET
READTEMP1: LCALL INITDS1820 ;
MOV A,#0CCH
LCALL WRITEDS1820
MOV R6,#34H
DJNZ R6,$
MOV A,#0BEH
LCALL WRITEDS1820
MOV R6,#34H
DJNZ R6,$
MOV R5,#09H
MOV R0,#TEMPHEAD
MOV B,#00H
READTEMP2: LCALL READDS1820
MOV @R0,A ;)))))))))))))0
INC R0
READTEMP21: LCALL CRC8CAL
DJNZ R5,READTEMP2
MOV A,B
JNZ READTEMPOUT
MOV A,TEMPHEAD+0
MOV TEMPL,A
MOV A,TEMPHEAD+1
MOV TEMPH,A
READTEMPOUT: RET
;************************************************************
;处理温度BCD码子程序
;***************************************************
CONVTEMP: MOV A,TEMPH
ANL A,#80H
JZ TEMPC1
CLR C
MOV A,TEMPL
CPL A
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH ; -------------------
CPL A
ADDC A,#00H
MOV TEMPH,A ; 符号位
MOV TEMPHC,#0BH ;&&&&&&&&&&&&&&&
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH
TEMPC11: MOV A,TEMPHC
SWAP A
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH ;乘0。0625
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR
MOV TEMPLC,A ;TEMPLC LOW= 小数部分BCD
;
MOV A,TEMPL ;整数部分
ANL A,#0F0H
SWAP A
MOV TEMPL,A
MOV A,TEMPH
ANL A,#0FH
SWAP A
ORL A,TEMPL
MOV 1FH,TEMPL
LCALL HEX2BCD1
MOV TEMPL,A
ANL A,#0F0H
SWAP A
ORL A,TEMPHC ;TEMPHC LOW =十位数BCD
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH
SWAP A ;TEMPHC HI=个位数BCD码
ORL A,TEMPLC
MOV TEMPLC,A
MOV A,R7
JZ TEMPC12
ANL A,#0FH
SWAP A
MOV R7,A
MOV A,TEMPHC ;TEMPHC HI=百位数BCD
ANL A,#0FH
ORL A,R7
MOV TEMPHC,A
TEMPC12: RET
;****************************************************************
;小数部分码表
;********************************************
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
;************************************************************************
;显示区BCD码温度刷新子程序
;*****************************
DISPBCD: MOV A,TEMPLC
ANL A,#0FH
MOV 10H,A
MOV A,TEMPLC
SWAP A
ANL A,#0FH
MOV 11H,A
MOV A,TEMPHC
ANL A,#0FH
MOV 12H,A
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 13H,A
MOV A,TEMPHC
ANL A,#0F0H
CJNE A,#010H,DISPBCD0
SJMP DISPBCD2
DISPBCD0: MOV A,TEMPHC
ANL A,#0FH
JNZ DISPBCD2 ;十位数是0
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 13H,#0AH ;符号位不显示
MOV 12H,A ;十位数显示符号7
DISPBCD2: RET
;********************************************
;显示子程序
;**********************************************
DISP1: MOV R1,#10H
MOV R5,#0FEH
PLAY: MOV 7FH,#0FFH ;P1=7FH
MOV A,R5
MOV P3,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV 7FH,A
MOV A,R5
JB ACC.1,LOOP5
; CLR P1.7
LOOP5: LCALL DL1MS
INC R1
MOV A,R5
JNB ACC.3,ENDOUT
RL A
MOV R5,A
AJMP PLAY
ENDOUT: MOV 7FH,#0FFH ;7FH=P1
MOV 7EH,#0FFH ;7EH=P3
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH
;***********************************************************************************
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;************************************************************************************
;单字节十六进制转BCD
;*****************************************
HEX2BCD1: MOV B,#064H
DIV AB
MOV R7,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
RET
;****************************************************
;CRC校检 X^8+X^5+X^4+1
;***************************************************
CRC8CAL: PUSH ACC
MOV R7,#08H
CRC8LOOP1: XRL A,B
RRC A
MOV A,B
JNC CRC8LOOP2
XRL A,#18H
CRC8LOOP2: RRC A
MOV B,A
POP ACC
RR A
PUSH ACC
DJNZ R7,CRC8LOOP1
POP ACC
RET
;*****************************************
XIANSHI:MOV A,#80H
MOV DA_IN,A
CLR RS_STU
LCALL SERIAL_WR
; LCALL SEND_I
MOV 20H,#05H
MOV DPTR,#TAB1 ;显示(温度:)
WENDU1: CLR A
MOVC A,@A+DPTR
MOV DA_IN,A
SETB RS_STU
LCALL SERIAL_WR
; LCALL SEND_D
INC DPTR
DJNZ 20H,WENDU1
LCALL DELAY3
MOV 21H,#03H
WENDU2: CLR A ;显示温度值
MOV DPTR,#TAB2
MOV A,12H
MOVC A,@A+DPTR
MOV DA_IN,A
SETB RS_STU
LCALL SERIAL_WR
; LCALL SEND_D
WENDU3: CLR A ;显示温度值
MOV A,11H
MOVC A,@A+DPTR
MOV DA_IN,A
SETB RS_STU
LCALL SERIAL_WR
; LCALL SEND_D
WENDU4: CLR A
MOV A,#2EH
MOV DA_IN,A
SETB RS_STU
LCALL SERIAL_WR
; LCALL SEND_D
WENDU5: CLR A ;显示温度值
MOV A,10H
MOVC A,@A+DPTR
MOV DA_IN,A
SETB RS_STU
LCALL SERIAL_WR
; LCALL SEND_D
WENDU6: MOV A,#20H
MOV DA_IN,A
SETB RS_STU
LCALL SERIAL_WR
; LCALL SEND_D
CLR A
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV DA_IN,A
SETB RS_STU
LCALL SERIAL_WR
; LCALL SEND_D
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV DA_IN,A
SETB RS_STU
LCALL SERIAL_WR
; LCALL SEND_D
LCALL DELAY3
RET
;*****************************************
;液晶串口写数据字程序
SERIAL_WR: PUSH ACC
MOV A,DA_IN
SETB CS
MOV WR_COUNT1,#05H
SETB STD
SERIAL_WR1: SETB SCLK
CLR SCLK
DJNZ WR_COUNT1,SERIAL_WR1
CLR STD
SETB SCLK
CLR SCLK
JNB RS_STU,CLR_RS
SETB STD
SJMP SETB_RS
CLR_RS: CLR STD
SETB_RS: SETB SCLK
CLR SCLK
CLR STD
SETB SCLK
CLR SCLK
MOV WR_COUNT1,#02H
SERIAL_WR2: MOV WR_COUNT2,#04H
SERIAL_WR21: RLC A
MOV STD,C
SETB SCLK
CLR SCLK
DJNZ WR_COUNT2,SERIAL_WR21
MOV WR_COUNT2,#04H
CLR STD
SERIAL_WR22: SETB SCLK
CLR SCLK
DJNZ WR_COUNT2,SERIAL_WR22
DJNZ WR_COUNT1,SERIAL_WR2
CLR SCLK
CLR CS
; LCALL DEL
POP ACC
RET
DELAY3: MOV R5,#02H
DEL31: MOV R6,#1AH
DEL33: DJNZ R6,DEL33
DJNZ R5,DEL31
RET
;**************************************
DEL: MOV 50H,#08H
DEL1: MOV 51H,#01FH
DEL2: MOV 52H,#01FH
DEL3: DJNZ 52H,DEL3
DJNZ 51H,DEL2
DJNZ 50H,DEL1
RET
;****************************************************
TAB01: DB '年 '
TAB02: DB '月 '
TAB03: DB '日 '
TAB04: DB '周 '
TAB05: DB '时 '
TAB06: DB '分 '
TAB07: DB '秒 '
TAB1: DB '温度:'
TAB2: DB '0123456789'
TAB3: DB 0A1H,0E6H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -