📄 wengdu2.asm
字号:
;这是关于单个DS18B20的测温程序,数据脚为P1.5,晶振是11.059MHZ
;温度传感器18B20采用器件默认的12位转化,最大转化时间要750毫秒
;内存分配声明
TEMPER_L EQU 31H ;用于保存读出温度的低字节
TEMPER_H EQU 30H ;用于保存读出温度的高字节
TEMPER_NUM EQU 32H ;FORMAT后的整数部分(integer),将两字节的温度整合成1字节
DAT BIT P1.5 ;DS18B20数据线
;------------------------------主函数开始-----------------------------
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
CLR EA ;使用DS18B20一定要禁止中断
MOV SP,#60H
MOV TEMPER_NUM,#30
START: LCALL GET_TEMPER ;调用读温度子程序
LCALL T_FORMAT ;将读出的2字节温度格式化
LCALL DISPLAY ;显示温度
AJMP START
;-----------------------DS18B20的温度转换子程序-----------------------
GET_TEMPER:
LCALL Set_18B20
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
LCALL DISPLAY ;用显示温度(持续1s左右)来等待AD转换结束,12位的话要转换750ms
LCALL Set_18B20 ;准备读温度前先初始化
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_1820
RET
;--------------------------DS18B20初始化程序--------------------------
Set_18B20:
SETB DAT
NOP
CLR DAT
MOV R2,#250 ;主机发出延时500微秒的复位低脉冲
DJNZ R2,$
SETB DAT ;然后拉高数据线
MOV R2,#30
DJNZ R2,$ ;延时60us等待DS18B20回应
JNB DAT,INIT1
JMP Set_18B20 ;超时而没有响应,重新初始化
INIT1: MOV R2,#120
DJNZ R2,$ ;延时240us
JB DAT,INIT2 ;数据变高,初始化成功
JMP Set_18B20
INIT2: MOV R2,#240
DJNZ R2,$
RET
;-----------------写DS18B20的子程序(有具体的时序要求)-----------------
WRITE_1820:
MOV R2,#8 ;一共8位数据
WR0: CLR DAT
MOV R3,#6
DJNZ R3,$
RRC A
MOV DAT,C
MOV R3,#20
DJNZ R3,$
SETB DAT
NOP
NOP
DJNZ R2,WR0
SETB DAT
RET
;------读DS18B20的程序,从DS18B20中读出两个字节的温度数据--------------------------
READ_1820:
MOV R4,#2 ;将温度高位和低位从DS18B20中读出
MOV R1,#TEMPER_L ;低位存入31H(TEMPER_L)
RE0: MOV R2,#8
RE1: SETB DAT
NOP
NOP
CLR DAT
NOP
NOP
SETB DAT
MOV R3,#4
DJNZ R3,$
MOV C,DAT
RRC A
MOV R3,#30
DJNZ R3,$
DJNZ R2,RE1
MOV @R1,A
DEC R1 ;高位存入30H(TEMPER_H)
DJNZ R4,RE0
RET
;----------整合读出的1字节温度(关于DS18B20读出的2字节温度格式请参考资料)----------
T_FORMAT:
MOV A,#0F0H
ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值
INC TEMPER_NUM
TEMPER_COV1:
MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM
MOV TEMPER_NUM,A ;
RET
;---------------------------显示温度子程序----------------------------
DISPLAY:MOV R1,#250
MOV DPTR,#TAB
DISP1:MOV A,TEMPER_NUM
MOV B,#100
DIV AB
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
CALL D1MS
SETB P2.3
MOV A,B
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P0,A
CLR P2.2
CALL D1MS
SETB P2.2
MOV A,B
MOVC A,@A+DPTR
MOV P0,A
CLR P2.1
CALL D1MS
SETB P2.1
DJNZ R1,DISP1
RET
;-------------------------1mS延时(按12MHZ算)--------------------------
D1MS: MOV R7,#250
LOOP0: NOP
NOP
DJNZ R7,LOOP0
RET
;-------------------------共阴数码管对应字型表-------------------------
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;段码表
; 0 1 2 3 4 5 6 7 对应内容
DB 7FH,6FH,77H,7CH,39H,5EH
; 8 9 A B C D
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -