📄 text1.asm
字号:
LED_SDA BIT P0.0
LED_CLK BIT P0.1
TEMP BIT P2.0
COM1 BIT P0.2
COM2 BIT P0.3
COM3 BIT P0.4
COM4 BIT P0.5
COM5 BIT P0.6
COM6 BIT P0.7
HTEMP EQU 32H
LTEMP EQU 33H
;***********************************主程序********************************************
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
LCALL RESET ;要求给18B20复位
MOV A,#0CCH ;跳过匹配
LCALL WRITE
MOV A,#44H ;启动温度转换
LCALL WRITE
LCALL RESET ;要求给18B20复位
MOV A,#0CCH ;跳过匹配
LCALL WRITE
MOV A,#0BEH ;读18B20的内容的命令
LCALL WRITE
LCALL READ
LCALL CHTEMP ;处理温度
LCALL DISP
AJMP MAIN
;********************************RESET**********************************************
RESET:
CLR TEMP
MOV R4,#240 ;延时480US,最小值为480
DJNZ R4,$
SETB TEMP ;释放总线
MOV R3,#30 ;设置112~60US的延时
DJNZ R3,$
;延时16US,等待18B20的回应
CHECK: JNB TEMP,SETF ;判断18B20是否做出回应,等待时间为60-240US回应则将P1口的灯点亮
MOV R4,#60
DJNZ R4,CHECK
CLR P3.1 ;否则将启动蜂鸣器报警,将灯熄灭
MOV P1,#0FFH
SETB TEMP
SJMP RESET
SETF: MOV P1,#00H
SETB P3.1
MOV R3,#120 ;延时240US,最小值为60
D2: DJNZ R3,D2
RET
;******************************************WRITE**********************************************
WRITE: MOV R2,#8 ;一共8位数据
CLR C
LOOP1: CLR TEMP ;在此后的15~60US内18B20将会对总线采样
MOV R3,#8 ;延时15US
DJNZ R3,$
RRC A
MOV TEMP,C
MOV R3,#22 ;延时45US,数据已经送到总线,应该等待,直到下降沿出现后的60US
DJNZ R3,$
SETB TEMP
DJNZ R2,LOOP1
SETB TEMP
RET
;********************************************** READ *************************************************
READ:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#31H ; 低位存入31H(TEMPER_L),高位存入30H(TEMPER_H),先读的是低字节
RE00:
MOV R2,#8 ;数据一共有8位
CLR C ;清除C的内容
RE01:
SETB TEMP
NOP
NOP
CLR TEMP
MOV R3,#8
DJNZ R3,$ ;延时15秒
NOP
NOP
NOP
SETB TEMP
MOV C,TEMP ;主机采样
MOV R3,#23 ;延时45秒
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A ;低8位读完,存入31H
DEC R1
DJNZ R4,RE00 ;高8读完,寸28H
RET
;**************************************CHTEMP****************************
CHTEMP:
MOV A,31H ;字节0的内容放在31H
ANL A,#0F0H ;屏蔽小数部分
SWAP A ;高低字节交换
MOV R7,A
MOV A,30H ;字节1的内容放在30H
ANL A,#0FH ;屏蔽S
SWAP A
ORL A,R7
MOV HTEMP,A ;整数部分BCD
MOV A,31H
ANL A,#0FH ;SI低字节的低4位,即小数部分
MOV DPTR,#DOTTAB ;将小数部分模拟转换为相应的BCD码
MOVC A,@A+DPTR
MOV LTEMP,A ;小数部分的BCD
RET
;****************************************显示程序*********************************************
DISP:
LP1: MOV R6,#255 ;Display 255 times
LP2: MOV A,HTEMP ;处理整数部分
MOV B,#10
DIV AB
MOV DPTR,#TAB ;显示十位
MOVC A,@A+DPTR
LCALL SEND
CLR COM1
LCALL DL1MS
SETB COM1
MOV DPTR,#DAB ;显示个位
MOV A,B
MOVC A,@A+DPTR
LCALL SEND
CLR COM2
CALL DL1MS
SETB COM2
MOV A,LTEMP ;处理小数部分
MOV B,#10
DIV AB
MOV DPTR,#TAB ;显示小数部分
MOV A,B
MOVC A,@A+DPTR
LCALL SEND
CLR COM3
LCALL DL1MS
SETB COM3
DJNZ R6,LP2
RET
;-------------Emulate SBUF SEND BYTE---------------
SEND:
CLR C
MOV R7,#08H
DUP: RLC A
MOV LED_SDA,C
CLR LED_CLK
SETB LED_CLK
DJNZ R7,DUP
RET
;--------------DELAY 1MS----------------------
DL1MS:
MOV R7,#125
DJNZ R7,$
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;不带小数点0~9
DAB: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H ;带小数点
;******************************小数的显示模拟取值***********************************
DOTTAB: DB 00H,00H,01H,01H,02H,03H,03H,04H,05H,05H,06H
DB 06H,07H,08H,08H,09H,09H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -