写一个基于51单片机的温度报警器代码,传感器为DS18B20
时间: 2024-01-25 20:02:11 浏览: 29
以下是基于51单片机的温度报警器代码,传感器为DS18B20:
```c
#include <reg51.h>
#include <DS18B20.h>
#define THRESHOLD 25 // 温度阈值
#define LED P1 // LED灯接口
void delay(unsigned int time) // 延时函数
{
unsigned int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 120; j++);
}
void main()
{
float temp;
while (1)
{
temp = DS18B20_GetTemp(); // 读取温度值
if (temp >= THRESHOLD) // 判断是否超过阈值
{
LED = 0; // LED灯亮
delay(500); // 延时500ms
LED = 1; // LED灯灭
delay(500); // 延时500ms
}
}
}
```
需要注意的是,以上代码需要使用DS18B20.h头文件中的函数,因此需要将该头文件放在代码目录下,并且需要将DS18B20.c文件编译链接到代码中。
相关问题
用CC语言写一个关于51单片机和DS18B20的温度报警器
以下是基于51单片机和DS18B20的温度报警器的CC语言代码:
```
#include <reg51.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^0; // DS18B20数据线连接的单片机的引脚
void delay(uint i) // 延时函数
{
while(i--);
}
void init_ds18b20() // DS18B20初始化函数
{
uchar i;
DQ = 1; // 数据线置高
delay(1);
DQ = 0; // 发送复位脉冲
delay(500);
DQ = 1;
delay(30);
i = DQ; // 等待DS18B20响应
delay(500);
}
void write_byte(uchar dat) // 向DS18B20写一个字节
{
uchar i, j;
for(j=0; j<8; j++)
{
i = dat & 0x01;
dat = dat >> 1;
if(i) // 发送高电平
{
DQ = 1;
_nop_();
_nop_();
DQ = 0;
_nop_();
_nop_();
}
else // 发送低电平
{
DQ = 1;
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
}
}
}
uchar read_byte() // 从DS18B20读一个字节
{
uchar i, j, dat = 0;
for(j=0; j<8; j++)
{
i = DQ;
_nop_();
_nop_();
dat = dat >> 1;
if(i) dat |= 0x80;
_nop_();
_nop_();
}
return dat;
}
void read_temperature(int *temp) // 读取DS18B20温度值
{
uchar tl, th;
init_ds18b20();
write_byte(0xcc); // 跳过ROM操作
write_byte(0x44); // 启动温度转换
delay(500);
init_ds18b20();
write_byte(0xcc); // 跳过ROM操作
write_byte(0xbe); // 发送读取温度命令
tl = read_byte(); // 读取温度低位
th = read_byte(); // 读取温度高位
*temp = (th << 8) | tl; // 计算温度值
}
void main() // 主函数
{
int temp;
while(1)
{
read_temperature(&temp); // 读取温度值
temp = temp * 0.0625; // 转换为摄氏温度
if(temp > 30) // 判断温度是否超过30度
{
P2 = 0xff; // 温度超过30度,报警
}
else
{
P2 = 0x00; // 温度正常,不报警
}
}
}
```
以上代码实现了一个简单的基于51单片机和DS18B20的温度报警器。当温度超过30度时,报警器会发出警报。你可以根据自己的需求进行修改和优化。
51单片机基于DS18B20的温度报警器
基于51单片机的温度报警器需要使用特定的库来读取DS18B20温度传感器的数据,以下是一个基于DS18B20的温度报警器代码:
```C
#include <reg51.h>
#include <ds18b20.h>
#include <delay.h>
//定义DS18B20的引脚
sbit DQ=P2^3;
//定义温度阈值
#define THRESHOLD 25
void main()
{
unsigned char temp[2];
unsigned int temperature;
while(1)
{
DS18B20_Start(); //启动DS18B20
DS18B20_SendByte(0xcc); //跳过ROM操作
DS18B20_SendByte(0x44); //启动温度转换
Delay1ms(750); //等待750ms,确保温度转换完成
DS18B20_Start(); //重新启动DS18B20
DS18B20_SendByte(0xcc); //跳过ROM操作
DS18B20_SendByte(0xbe); //读取温度寄存器
temp[0] = DS18B20_ReadByte(); //读取温度值的低字节
temp[1] = DS18B20_ReadByte(); //读取温度值的高字节
temperature = (temp[1] << 8) | temp[0]; //将低字节和高字节合并为一个整数
if (temperature > THRESHOLD * 16) {
//温度超过阈值,触发报警
//具体操作根据需要进行修改
} else {
//温度正常,不需要报警
//具体操作根据需要进行修改
}
Delay1ms(5000); //等待5秒后再次检测温度
}
}
```
在这个代码中,我们首先引入了 reg51.h、ds18b20.h 和 delay.h 三个库。然后通过定义 DQ 常量来设置 DS18B20 的引脚。
在主函数中,我们使用 DS18B20_Start() 函数启动 DS18B20,通过 DS18B20_SendByte() 函数发送命令,等待温度转换完成后再次启动 DS18B20,通过 DS18B20_SendByte() 函数读取温度值,并将低字节和高字节合并为一个整数,最后与预设的温度阈值进行比较,如果温度超过阈值,则触发报警操作,否则进行正常操作。需要注意的是,具体的报警和正常操作需要根据实际需求进行修改。
最后,我们通过 Delay1ms() 函数等待5秒后再次检测温度。