51单片机ds18b20程序报警
时间: 2023-06-27 20:05:27 浏览: 59
下面是51单片机DS18B20温度传感器的报警程序示例:
```c
#include <reg52.h>
#include <intrins.h>
#define DQ P2_7
typedef unsigned char uchar;
typedef unsigned int uint;
sbit beep = P1^5; // 蜂鸣器
uchar alarm_temp = 30; // 报警温度
void delay(uint t) // 延时函数
{
while(t--);
}
void delay_ms(uint t) // 毫秒延时函数
{
uint i, j;
for(i = 0; i < t; i++) {
for(j = 0; j < 120; j++);
}
}
uchar ds18b20_init() // 初始化DS18B20
{
uchar i;
DQ = 1;
_nop_();
_nop_();
_nop_();
DQ = 0;
delay(200);
DQ = 1;
delay(30);
i = DQ;
delay(170);
return i;
}
void ds18b20_write_byte(uchar dat) // 向DS18B20写入一个字节
{
uchar i;
for(i = 0; i < 8; i++) {
DQ = 0;
_nop_();
_nop_();
DQ = dat & 0x01;
delay(5);
DQ = 1;
dat >>= 1;
}
}
uchar ds18b20_read_byte() // 从DS18B20读取一个字节
{
uchar i, dat = 0;
for(i = 0; i < 8; i++) {
dat >>= 1;
DQ = 0;
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
if(DQ) dat |= 0x80;
delay(5);
DQ = 1;
}
return dat;
}
void ds18b20_convert() // DS18B20转换温度
{
ds18b20_init();
ds18b20_write_byte(0xcc);
ds18b20_write_byte(0x44);
}
uchar ds18b20_read_temp() // 读取DS18B20温度值
{
uchar temp_l, temp_h;
int temp;
ds18b20_init();
ds18b20_write_byte(0xcc);
ds18b20_write_byte(0xbe);
temp_l = ds18b20_read_byte();
temp_h = ds18b20_read_byte();
temp = temp_h;
temp <<= 8;
temp |= temp_l;
return temp;
}
void main()
{
uchar temp;
while(1) {
ds18b20_convert(); // 转换温度
delay_ms(500);
temp = ds18b20_read_temp(); // 读取温度值
if(temp > alarm_temp) { // 温度超过报警温度
beep = 0; // 蜂鸣器响
delay_ms(200);
beep = 1;
delay_ms(200);
}
}
}
```
在这个程序中,我们定义了一个报警温度,当温度超过这个值时,蜂鸣器会响起。程序中使用了DS18B20温度传感器,通过调用`ds18b20_convert()`函数来转换温度,然后调用`ds18b20_read_temp()`函数来读取温度值。如果温度超过报警温度,就会触发报警。