51单片机ds18b20程序报警
时间: 2023-06-27 10:04:40 浏览: 118
以下是51单片机使用DS18B20传感器进行温度报警的程序:
首先,需要定义DS18B20的引脚:
```c
sbit DQ = P3^4; //定义DS18B20的引脚
```
然后,在主函数中初始化DS18B20,并且设置温度报警阈值:
```c
void main()
{
unsigned char temp, TL, TH;
float f_temp;
DS18B20_init(); // 初始化DS18B20
TL = 30; // 设置温度报警阈值下限为30℃
TH = 40; // 设置温度报警阈值上限为40℃
while(1)
{
temp = DS18B20_get_temp(); // 获取当前温度
f_temp = temp / 2.0; // 计算实际温度值
if(f_temp < TL || f_temp > TH) // 判断是否超出温度报警阈值
{
alarm(); // 超出温度报警阈值,触发报警
}
}
}
```
其中,alarm()函数用于触发报警:
```c
void alarm()
{
// 这里可以使用蜂鸣器或者LED进行报警提示
}
```
完整的程序如下所示:
```c
#include <reg52.h>
sbit DQ = P3^4; //定义DS18B20的引脚
// DS18B20初始化函数
void DS18B20_init()
{
unsigned char i;
DQ = 1; // DQ置高
i = 72; // 延时约1us
while(i--);
DQ = 0; // DQ拉低
i = 2; // 延时约60us
while(i--);
DQ = 1; // DQ拉高
i = 10; // 延时约480us
while(i--);
}
// DS18B20读取一位函数
unsigned char DS18B20_read_bit()
{
unsigned char dat;
DQ = 0; // DQ拉低
_nop_(); // 延时约1us
_nop_();
dat = DQ; // 读取DQ电平
_nop_(); // 延时约15us
DQ = 1; // DQ拉高
return dat;
}
// DS18B20写入一位函数
void DS18B20_write_bit(unsigned char dat)
{
DQ = 0; // DQ拉低
_nop_(); // 延时约1us
_nop_();
DQ = dat; // 写入DQ电平
_nop_(); // 延时约60us
DQ = 1; // DQ拉高
}
// DS18B20读取一个字节函数
unsigned char DS18B20_read_byte()
{
unsigned char i, j, dat = 0;
for(i = 0; i < 8; i++)
{
j = DS18B20_read_bit(); // 读取一位
dat |= (j << i); // 将读取的位组装成字节
}
return dat;
}
// DS18B20写入一个字节函数
void DS18B20_write_byte(unsigned char dat)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
DS18B20_write_bit(dat & 0x01); // 写入一位
dat >>= 1;
}
}
// DS18B20获取温度函数
unsigned char DS18B20_get_temp()
{
unsigned char TL, TH, temp;
float f_temp;
DS18B20_write_byte(0xCC); // 跳过ROM操作
DS18B20_write_byte(0x44); // 启动温度转换
while(DS18B20_read_byte() == 0xFF); // 等待温度转换完成
DS18B20_write_byte(0xCC); // 跳过ROM操作
DS18B20_write_byte(0xBE); // 读取温度寄存器
temp = DS18B20_read_byte(); // 读取温度低8位
TH = DS18B20_read_byte(); // 读取温度高8位
TL = DS18B20_read_byte(); // 读取温度阈值寄存器
f_temp = ((TH << 8) + temp) / 16.0; // 计算实际温度值
return temp;
}
// 报警函数
void alarm()
{
// 这里可以使用蜂鸣器或者LED进行报警提示
}
void main()
{
unsigned char temp, TL, TH;
float f_temp;
DS18B20_init(); // 初始化DS18B20
TL = 30; // 设置温度报警阈值下限为30℃
TH = 40; // 设置温度报警阈值上限为40℃
while(1)
{
temp = DS18B20_get_temp(); // 获取当前温度
f_temp = temp / 2.0; // 计算实际温度值
if(f_temp < TL || f_temp > TH) // 判断是否超出温度报警阈值
{
alarm(); // 超出温度报警阈值,触发报警
}
}
}
```
阅读全文