用汇编语言写一个关于51单片机和DS18B20的温度报警器
时间: 2024-05-01 12:23:38 浏览: 97
C语言基于51单片机的DS18b20的温度报警系统
5星 · 资源好评率100%
下面是一个简单的汇编程序,可以实现51单片机与DS18B20的基本通信,以及在温度超过设定值时触发报警功能。
```
; DS18B20温度报警器程序
; 使用P1.0作为DS18B20的数据线
; 定义常量
THRESHOLD EQU 28 ; 设定的温度阈值
; 定义变量
TEMP DB 0 ; 当前温度值
; 主程序入口
MAIN: MOV P1, #0 ; 初始化P1口为输出模式
MOV P1.0, #1 ; 拉高数据线
ACALL DELAY_US ; 延时500us
MOV P1.0, #0 ; 拉低数据线
ACALL DELAY_US ; 延时500us
MOV P1.0, #1 ; 释放数据线
ACALL DELAY_US ; 延时500us
MOV P1, #0 ; 将P1口设为输入模式
JNB P1.0, SKIP ; 如果DS18B20在忙,则跳过
ACALL READ_TEMP ; 读取温度值
CJNE TEMP, THRESHOLD, SKIP ; 如果温度未超过阈值,则跳过
ACALL ALARM ; 触发报警功能
SKIP: ACALL DELAY_MS ; 延时1s
SJMP MAIN ; 重复执行
; 延时函数(500us)
DELAY_US: MOV R7, #3
DJNZ R7, $
RET
; 延时函数(1ms)
DELAY_MS: MOV R6, #10
MOV R7, #245
DJNZ R7, $
DJNZ R6, $
RET
; 读取温度值函数
READ_TEMP: MOV R0, #0 ; 清零计数器
MOV R1, #0 ; 清零寄存器
MOV R2, #0 ; 清零寄存器
LOOP: MOV P1, #0 ; 将P1口设为输出模式
MOV P1.0, #1 ; 拉高数据线
ACALL DELAY_US ; 延时2us
MOV P1.0, #0 ; 拉低数据线
ACALL DELAY_US ; 延时80us
MOV P1.0, #1 ; 释放数据线
ACALL DELAY_US ; 延时8us
MOV C, P1.0 ; 读取数据线状态
RLC A ; 将读取的状态存入累加器
INC R0 ; 计数器加1
JNB R0.4, LOOP ; 如果计数器未满8位,则继续读取
MOV TEMP, A ; 将温度值存入变量TEMP
RET
; 报警功能函数
ALARM: MOV P1.1, #1 ; 触发报警
ACALL DELAY_MS ; 延时500ms
MOV P1.1, #0 ; 关闭报警
RET
```
注意:以上程序仅供参考,实际使用时需要根据具体硬件和需求进行调整和修改。
阅读全文