51单片机温度传感器汇编语言
时间: 2023-12-15 10:06:16 浏览: 211
以下是51单片机温度传感器汇编语言的代码示例:
```assembly
; DS18B20温度传感器汇编语言代码
; 作者:Jan Bar
; 项目地址:https://github.com/jan-bar/Temperature
; 定义DS18B20的IO口
sbit DQ = P3^7
; 定义延时函数
Delay1ms: ; 1毫秒延时函数
mov R2, #110
L3: djnz R2, L3
ret
Delay10us: ; 10微秒延时函数
mov R0, #2
L1: mov R1, #248
L2: djnz R1, L2
djnz R0, L1
ret
; 初始化DS18B20
Init_DS18B20:
setb DQ ; 拉低总线
call Delay1ms
clr DQ ; 拉高总线
call Delay10us
mov C, DQ ; 判断DS18B20是否存在
jz Init_DS18B20 ; 如果不存在则重新初始化
mov C, #0 ; 初始化成功
ret
; 发送一个字节
Send_Byte:
mov A, R7 ; 从R7中获取要发送的字节
mov R6, #8 ; 发送8位
L4: mov C, A.0 ; 获取最低位
setb DQ ; 拉低总线
nop ; 延时
nop
mov DQ, C ; 发送最低位
call Delay10us ; 延时10微秒
clr DQ ; 拉高总线
rlc A ; 右移一位
djnz R6, L4 ; 发送下一位
ret
; 读取一个字节
Read_Byte:
mov R6, #8 ; 读取8位
clr A ; 清零A寄存器
L5: setb DQ ; 拉低总线
nop ; 延时
nop
mov DQ, C ; 发送最低位
nop ; 延时
nop
mov C, DQ ; 读取最低位
rlc A ; 左移一位
call Delay10us ; 延时10微秒
clr DQ ; 拉高总线
djnz R6, L5 ; 读取下一位
mov R7, A ; 将读取的字节保存到R7中
ret
; 启动温度转换
Start_Convert:
call Init_DS18B20 ; 初始化DS18B20
call Send_Byte ; 发送跳过ROM操作码
mov R7, #0xCC ; 发送跳过ROM命令
call Send_Byte
mov R7, #0x44 ; 发送启动温度转换命令
call Send_Byte
ret
; 读取温度值
Read_Temperature:
call Init_DS18B20 ; 初始化DS18B20
call Send_Byte ; 发送跳过ROM操作码
mov R7, #0xCC ; 发送跳过ROM命令
call Send_Byte
mov R7, #0xBE ; 发送读取温度命令
call Send_Byte
call Read_Byte ; 读取温度低字节
mov R5, A ; 保存温度低字节
call Read_Byte ; 读取温度高字节
mov R4, A ; 保存温度高字节
mov A, R5 ; 将温度低字节保存到A寄存器
mov R7, #0x80 ; 判断温度正负
anl A, R7
jz Positive_Temperature ; 如果温度为正,则跳转到Positive_Temperature
mov A, #0 ; 如果温度为负,则将A寄存器清零
cpl A ; 取反A寄存器
add A, #1 ; 加1
mov R5, A ; 保存温度低字节
mov A, R4 ; 将温度高字节保存到A寄存器
cpl A ; 取反A寄存器
add A, #0xFF ; 加上0xFF
mov R4, A ; 保存温度高字节
Positive_Temperature:
mov A, R5 ; 将温度低字节保存到A寄存器
anl A, #0xF0 ; 取高4位
swap A ; 交换高低4位
anl A, #0x0F ; 取低4位
mov R5, A ; 保存温度低字节
mov A, R4 ; 将温度高字节保存到A寄存器
anl A, #0x0F ; 取低4位
mov R4, A ; 保存温度高字节
ret
; 主程序
Main:
call Start_Convert ; 启动温度转换
call Read_Temperature ; 读取温度值
mov P1, #0xFF ; 设置P1口为输出
mov A, R4 ; 将温度高字节保存到A寄存器
anl A, #0x7F ; 取高7位
mov P1, A ; 将高7位输出到P1口
mov A, R5 ; 将温度低字节保存到A寄存器
anl A, #0xF8 ; 取高3位
orl P1, A ; 将高3位输出到P1口
sjmp Main ; 循环执行
```
阅读全文