📄 温度计.txt
字号:
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 ; TEMPHC HI=符号位
MOV TEMPHC,#0BH ; 置"-"标志
SJMP TEMPC11 ;
TEMPC1: MOV TEMPHC,#0AH ; 置"+"标志
;**************************************
TEMPC11: MOV A,TEMPHC ; 计算小数位温度BCD值
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 ; 计算整数位温度BCD值
ANL A,#0F0H ;
SWAP A ;
MOV TEMPL,A ;
MOV A,TEMPH ;
ANL A,#0FH ;
SWAP A ;
ORL A,TEMPL ;
MOV TEMPER_L ,A ;
LCALL HEX2BCD1 ; 调用单字节十六进制转BCD子程序
;************************************
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 ; TEMPLC HI = 个位数 BCD
ORL A,TEMPLC ;
MOV TEMPLC,A ;
MOV A,R7 ;
JZ TEMPOUT ;
ANL A,#0FH ;
SWAP A ;
MOV R7,A ;
MOV A,TEMPHC ; TEMPHC HI = 百位数 BCD
ANL A,#0FH ;
ORL A,R7 ;
MOV TEMPHC,A ;
TEMPOUT: 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 BUF1,A ; 显示小数
MOV A,TEMPLC ;
SWAP A ;
ANL A,#0FH ;
MOV BUF2,A ; 显示个位
MOV A,TEMPHC ;
ANL A,#0FH ;
MOV BUF3,A ; 显示十位
MOV A,TEMPHC ;
SWAP A ;
ANL A,#0FH ;
MOV BUF4,A ; 显示百位
MOV A,TEMPHC ;
ANL A,#0F0H ;
CJNE A,#10H,DISPBCD0 ; 百位数=0?
SJMP DISPOUT ;
DISPBCD0:
MOV A, TEMPHC ;
ANL A, #0FH ;
JNZ DISPOUT ; 十位数是0?
MOV A,TEMPHC ;
SWAP A ;
ANL A,#0FH ;
MOV BUF4,0AH ; 符号位不显示
MOV BUF3,A ; 十位数显示符号
DISPOUT: RET ; ;
;*************************************
;单字节十六进制转BCD
;*************************************
HEX2BCD1:MOV B,#64H ; 十六进制 ->BCD
DIV AB ; B=A%100
MOV R7,A ; R7=百位数
MOV A,#0AH ;
XCH A,B ;
DIV AB ; B=A%B
SWAP A ;
ORL A,B ;
RET ;
;**************************************
;DECIMAL DATA IS TRANSISTERED HEX DATA
;INPUT: A=DECIMAL DATA
;OUTPUT:A
;USED REGISTER: R1,R2,A
;**************************************
DECHEX: MOV R1, A
SWAP A
ANL A, #0FH
RL A
MOV R2, A
RL A
RL A
ADD A, R2
MOV R2, A
MOV A, #0FH
ANL A, R1
ADD A, R2
RET
;*************************************
; Calculate CRC-8 Values, Uses The
;CCITT-8 Polynomial,Expressed As
; X^8+X^5+X^4+1
;*************************************
CRC8CAL: PUSH ACC ;
MOV R7,#08H ; Number Bits Byte
CRC8LOOP1:
XRL A,B ; Calculate CRC
RRC A ; MOVe T0 Carry
MOV A,B ; Get The Last CRC Value
JNC CRC8LOOP2 ; Skip If Data==0
XRL A,#18H ; Update The CRC Value
CRC8LOOP2:
RRC A ; Position The New CRC
MOV B,A ; Store The New CRC
POP ACC ; Get The Remaining Bits
RR A ; Possition The Next Bit
PUSH ACC ; Save The Remaining Bits
DJNZ R7,CRC8LOOP1 ; Repeat For 9 Bits
POP ACC ;
RET ;
;******************************************
;读DS18B20的程序,从DS18B20中读出9个字节数据
;开始的两个字节为温度数据
;******************************************
READ_18200:
MOV R4,#9 ; 将温度高位和低位从DS18B20中读出
MOV R1,#TEMPER_L ; 低位存入40H(TEMPER_L),高位存入41H(TEMPER_H)
MOV B, #00H ;
;************************************
RE00:
MOV R2,#8 ; 数据一共有8位
RE01:
CLR C
SETB TEMPDIN ;
NOP
NOP
CLR TEMPDIN ;
NOP
NOP
NOP
SETB TEMPDIN ;
MOV R3,#9
RE10:
DJNZ R3,RE10 ;
MOV C,TEMPDIN ;
MOV R3,#23
RE20:
DJNZ R3,RE20 ;
RRC A
DJNZ R2,RE01 ;
;************************************
MOV @R1,A ;
INC R1 ;
LCALL CRC8CAL ;
DJNZ R4,RE00 ;
MOV A,B ;
JNZ READ_OUT ;
MOV TEMPL,TEMPER_L ;
MOV TEMPH,TEMPER_H ;
MOV TMSETVL,TMROMVL ;
MOV TMSETVH,TMROMVH ;
READ_OUT: RET ;
;****************************************
; TIMER0 INTERRUPT SUBROUTE
; GERANATE AN INTERRUPT PER 10ms
;****************************************
TIMER0: PUSH PSW ; PROTECT PSW,ACC REGISTER
PUSH ACC ;
MOV TL0, #0B1H ;
MOV TH0, #0E0H ;
INC T10MS ;
MOV A,T10MS ;
CJNE A,#05H,TMREND ;
MOV T10MS,#00H ;
SETB TIME1SOK ;
LCALL GET_TEMPER ;调用读温度子程序
LCALL CONVTEMP ;温度BCD码计算处理子程序
LCALL DISPBCD ;显示区BCD码温度值刷新子程序
LCALL DISPLAY ;
TMREND: POP ACC ;
POP PSW ;
RETI ;
;*****************************************
;显示子程序
;*****************************************
DISPLAY:
MOV DPTR,#NUMTAB ;指定查表启始地址
MOV R0,#6
DP11: MOV R1,#40 ;显示1000次
DPLP: MOV A,BUF1 ;取小位数
MOVC A,@A+DPTR ;查小位数的7段代码
MOV P0,A ;送出小位的7段代码
CLR P1.4 ;开小位显示
ACALL DL1ms ;显示1ms
SETB P1.4 ;
MOV A,BUF2 ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P0,A ;送出个位的7段代码
CLR P0.5 ;
CLR P1.5 ;开个位显示
ACALL DL1ms ;显示1ms
SETB P1.5 ;
MOV A,BUF3 ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P0,A ;送出十位的7段代码
CLR P1.6 ;开十位显示
ACALL DL1ms ;显示1ms
SETB P1.6 ;
MOV A,BUF4 ;取百位数
MOVC A,@A+DPTR ;查百位数的7段代码
MOV P0,A ;送出百位的7段代码
CLR P1.7 ;开百位显示
ACALL DL1ms ;显示1ms
SETB P1.7 ;
DJNZ R1,DPLP ;250次没完循环
DJNZ R0,DP11 ;4个100次没完循环
RET
;*******************************************
DLDISP: MOV A,BUF1 ;取小位数
MOVC A,@A+DPTR ;查小位数的7段代码
MOV P0,A ;送出小位的7段代码
CLR P1.4 ;开小位显示
ACALL DL1ms1 ;显示1ms
SETB P1.4 ;
MOV A,BUF2 ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P0,A ;送出个位的7段代码
CLR P0.5 ;
CLR P1.5 ;开个位显示
ACALL DL1ms1 ;显示1ms
SETB P1.5 ;
MOV A,BUF3 ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P0,A ;送出十位的7段代码
CLR P1.6 ;开十位显示
ACALL DL1ms1 ;显示1ms
SETB P1.6 ;
MOV A,BUF4 ;取百位数
MOVC A,@A+DPTR ;查百位数的7段代码
MOV P0,A ;送出百位的7段代码
CLR P1.7 ;开百位显示
ACALL DL1ms1 ;显示1ms
SETB P1.7 ;
RET ;
;**************************************
;10毫秒延时程序
;**************************************
DL10MS: LCALL DLDISP ;
RET ;
;****************************************
;0.2MS延时(按12MHZ算)
;****************************************
DL1MS: MOV R7,#200
DJNZ R7,$
RET
;****************************************
;0.2MS延时(按12MHZ算)
;****************************************
DL1MS1: MOV R7,#100
DJNZ R7,$
RET
;****************************************
;7段数码管0~9数字的共阳显示代码
;****************************************
NUMTAB:
; DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH ;
DB 22H,0FAH,31H,25H,0ACH,64H,60H,2FH,20H,24H,0FFH,0FDH ;
; "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"
;****************************************
END
参考链接:http://www.picavr.com/news/2008-01/1682.htm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -