用51单片机和芯片DS18B20设计一个温度报警系统,当温度超过30度启动蜂鸣器报警。用C语言编写代码
时间: 2024-02-26 13:51:35 浏览: 89
好的,以下是用C语言编写的代码:
```c
#include <reg51.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
#define DQ P2_0 // DS18B20数据线连接的单片机IO口
u8 temperature; // 存储温度值
// 延时函数
void delay(u16 i)
{
while (i--)
;
}
// DS18B20初始化函数
void ds18b20_init()
{
DQ = 1;
_nop_();
_nop_();
_nop_();
DQ = 0;
delay(600);
DQ = 1;
delay(60);
}
// DS18B20写入一个字节函数
void ds18b20_write(u8 dat)
{
u8 i;
for (i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
DQ = dat & 0x01;
delay(6);
DQ = 1;
dat >>= 1;
}
}
// DS18B20读取一个字节函数
u8 ds18b20_read()
{
u8 i, j, dat = 0;
for (i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
_nop_();
dat >>= 1;
DQ = 1;
j = DQ;
delay(6);
if (j)
dat |= 0x80;
}
return dat;
}
// DS18B20转换温度函数
void ds18b20_conversion()
{
ds18b20_init();
ds18b20_write(0xcc); // 跳过ROM操作
ds18b20_write(0x44); // 启动温度转换
}
// DS18B20读取温度函数
void ds18b20_read_temperature()
{
u8 temp_l, temp_h;
ds18b20_init();
ds18b20_write(0xcc); // 跳过ROM操作
ds18b20_write(0xbe); // 发送读取温度命令
temp_l = ds18b20_read(); // 读取温度低8位
temp_h = ds18b20_read(); // 读取温度高8位
temperature = (temp_h << 4) | (temp_l >> 4); // 温度值为高8位左移4位与低8位右移4位的或运算
}
// 蜂鸣器报警函数
void bzzz(u8 t)
{
u8 i;
for (i = 0; i < t; i++)
{
P1 = 0x00; // 低电平输出
delay(200);
P1 = 0xff; // 高电平输出
delay(200);
}
}
void main()
{
while (1)
{
ds18b20_conversion(); // 温度转换
ds18b20_read_temperature(); // 读取温度
if (temperature > 30) // 温度超过30度
{
bzzz(10); // 启动蜂鸣器报警,响10声
}
else
{
P1 = 0xff; // 关闭蜂鸣器
}
}
}
```
该代码实现了用51单片机和芯片DS18B20设计一个温度报警系统,当温度超过30度启动蜂鸣器报警。
阅读全文