📄 ds18b20asma.asm
字号:
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 码温度值刷新子程序
;**************************************
;温度暂存器内的2字节中,高字节的低半字节和低字节的高半字节组成一个字节,
;这个字节的二进制值转换为十进制后,就是温度值的百、十、个位值,而剩下的低字节化为
;十进制后,就是温度值的小数部分.
;**************************************
DISPBCD:
MOV A,TEMPLC ; 温度数据移入显示寄存器
ANL A,#0FH ; 取低字节的低4位(小数部分)
MOV BUF1,A ; 小数部分放入寄存器
MOV A,TEMPLC ; 取低字节的高4位(个位数)
SWAP A ;
ANL A,#0FH ;
MOV BUF2,A ; 个位数放入寄存器
MOV A,TEMPHC ; 取高字节的低4位(十位数)
ANL A,#0FH ;
MOV BUF3,A ; 十位数放入寄存器
MOV A,TEMPHC ; 取高字节的高4位(百位数)
SWAP A ;
ANL A,#0FH ;
MOV BUF4,A ; 百位数放入寄存器
MOV A,TEMPHC ;
ANL A,#0F0H ;
CJNE A,#10H,DISPBCD0 ; 百位数=0?
SJMP DISPOUT ;
;*************************************
;最高位为0和正数的符号位都不显示
;*************************************
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 ;
;*************************************
; Calculate CRC-8 Values, Uses The
; CCITT-8 Polynomial,Expressed As
; X^8+X^5+X^4+1
;CRC8 = X8+X5+X4+1
;X8 表示第7位需要异或运算
;X5 表示第4位需要异或运算
;X4 表示第3位需要异或运算
;1 表示第0位需要异或运算
;*************************************
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 8 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 ; 9字节数据是否读完?
MOV A,B ; 验证数据放入A中
JNZ READ_OUT ; 验证出错则不改变温度值
MOV TEMPL,TEMPER_L ; 温度数据的低字节放入寄存器
MOV TEMPH,TEMPER_H ; 温度数据的高字节放入寄存器
READ_OUT: RET
;*****************************************
;显示子程序
;*****************************************
DISPLAY:
MOV DPTR,#NUMTAB ; 指定查表启始地址
MOV R0,#4 ; 显示4位数据
DP11: MOV R1,#250 ; 显示1000次
DPLP: SETB P1.7 ; 小数点不亮
MOV A,BUF1 ; 取小位数
MOVC A,@A+DPTR ; 查小位数的7段代码
MOV P1,A ; 送出小位的7段代码
CLR P3.0 ; 开小位显示
ACALL DL1ms ; 显示1ms
SETB P3.0 ; 关小数显示
MOV A,BUF2 ; 取个位数
MOVC A,@A+DPTR ; 查个位数的7段代码
MOV P1,A ; 送出个位的7段代码
CLR P1.7 ; 小数点亮
CLR P3.1 ; 开个位显示
ACALL DL1ms ; 显示1ms
SETB P3.1 ; 关个位显示
SETB P1.7 ; 小数点不亮
MOV A,BUF3 ; 取十位数
MOVC A,@A+DPTR ; 查十位数的7段代码
MOV P1,A ; 送出十位的7段代码
CLR P3.2 ; 开十位显示
ACALL DL1ms ; 显示1ms
SETB P3.2 ; 关十位显示
SETB P1.7 ; 小数点不亮
MOV A,BUF4 ; 取百位数
MOVC A,@A+DPTR ; 查百位数的7段代码
MOV P1,A ; 送出百位的7段代码
CLR P3.3 ; 开百位显示
ACALL DL1ms ; 显示1ms
SETB P3.3 ; 关百位显示
DJNZ R1,DPLP ; 250次没完循环
DJNZ R0,DP11 ; 4个100次没完循环
RET
;****************************************
;0.2MS延时(按12MHZ算)
;****************************************
DL1MS: MOV R7,#100
DJNZ R7,$
RET
;****************************************
;7段数码管0~9数字的共阳显示代码
;****************************************
NUMTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH ;
; "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"
;****************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -