基于DS18B20数字温度传感器的温度计设计 汇编语言代码
时间: 2024-02-09 17:11:55 浏览: 171
以下是基于DS18B20数字温度传感器的温度计汇编语言代码示例,假设使用的是8051单片机:
```assembly
;定义DS18B20数据线
DQ equ P2.1
;定义温度值存储地址
temp equ 0x30
;DS18B20芯片初始化函数
Init_DS18B20:
mov DQ, #1
nop
nop
nop
mov DQ, #0
nop
nop
nop
mov DQ, #1
nop
nop
nop
jnb DQ, $
nop
nop
ret
;DS18B20芯片写字节函数
Write_DS18B20:
mov R7, #8
clr C
mov A, DPL
loop1:
mov ACC.0, C
mov DQ, ACC
nop
nop
nop
mov C, A.0
rrc A
mov DQ, #1
nop
nop
nop
djnz R7, loop1
ret
;DS18B20芯片读字节函数
Read_DS18B20:
mov R7, #8
clr A
loop2:
mov DQ, #0
nop
nop
nop
mov DQ, #1
nop
nop
nop
mov C, DQ
rlc A
djnz R7, loop2
ret
;DS18B20芯片转换温度函数
Convert_DS18B20:
call Init_DS18B20
mov DPL, #0xcc
call Write_DS18B20
mov DPL, #0x44
call Write_DS18B20
ret
;DS18B20芯片读取温度函数
ReadTemperature_DS18B20:
call Init_DS18B20
mov DPL, #0xcc
call Write_DS18B20
mov DPL, #0xbe
call Write_DS18B20
call Read_DS18B20
mov temp, A
call Read_DS18B20
mov temp+1, A
ret
main:
;初始化串口
mov SCON, #0x50
mov TMOD, #0x20
mov TH1, #0xfd
setb TR1
;循环读取温度
loop:
call Convert_DS18B20 ;转换温度
call ReadTemperature_DS18B20 ;读取温度
mov A, temp+1
mov R1, #10
div AB, #10
mov DPH, A
mov DPL, #0x30
movx @DPTR, A
mov A, B
mov R1, #10
div AB, #10
mov DPH, A
mov DPL, #0x31
movx @DPTR, A
mov A, B
mov R1, #625
mul AB
div AB, #100
mov DPH, A
mov DPL, #0x32
movx @DPTR, A
mov A, B
mov DPH, #0
mov DPL, #0x33
movx @DPTR, A
;输出温度
mov SBUF, 'T'
jnb TI, $
clr TI
mov SBUF, 'e'
jnb TI, $
clr TI
mov SBUF, 'm'
jnb TI, $
clr TI
mov SBUF, 'p'
jnb TI, $
clr TI
mov SBUF, 'e'
jnb TI, $
clr TI
mov SBUF, 'r'
jnb TI, $
clr TI
mov SBUF, 'a'
jnb TI, $
clr TI
mov SBUF, 't'
jnb TI, $
clr TI
mov SBUF, 'u'
jnb TI, $
clr TI
mov SBUF, 'r'
jnb TI, $
clr TI
mov SBUF, 'e'
jnb TI, $
clr TI
mov SBUF, ':'
jnb TI, $
clr TI
mov DPL, #0x30
mov A, temp+1
mov R1, #10
div AB, #10
mov DPH, A
mov A, B
add A, #48
mov SBUF, A
jnb TI, $
clr TI
mov DPL, #0x31
mov A, temp+1
mov R1, #10
div AB, #10
mov DPH, A
mov A, B
add A, #48
mov SBUF, A
jnb TI, $
clr TI
mov SBUF, '.'
jnb TI, $
clr TI
mov DPL, #0x32
mov A, temp
mov R1, #625
mul AB
div AB, #100
mov DPH, A
mov A, B
add A, #48
mov SBUF, A
jnb TI, $
clr TI
mov SBUF, 'C'
jnb TI, $
clr TI
;延时1s
mov R7, #255
delay:
djnz R7, delay
mov R7, #255
delay1:
djnz R7, delay1
sjmp loop
```
在以上代码中,我们同样通过定义DS18B20数据线,编写初始化、写字节、读字节、转换温度和读取温度等函数,在主函数中循环执行转换温度、读取温度并输出温度值。需要注意的是,在汇编语言中,输出字符串需要分别发送每个字符,并且需要使用延时函数进行延时。
阅读全文