51单片机温度传感器DS18B20,传感器接口的单总线管脚接至单片机 P3.7 IO 口上,写温控程序
时间: 2024-03-17 07:44:34 浏览: 20
以下是一个简单的51单片机温度传感器DS18B20的温控程序:
```c
#include <reg51.h>
#define DQ P3_7 // 定义单总线管脚连接到单片机的IO口
void delay(unsigned int t)
{
while(t--);
}
void writeByte(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ = 0; // 发送开始信号
delay(1);
DQ = dat & 0x01; // 发送数据位
dat >>= 1;
delay(5);
DQ = 1; // 发送结束信号
delay(1);
}
}
unsigned char readByte()
{
unsigned char i, dat = 0;
for (i = 0; i < 8; i++)
{
DQ = 0; // 发送开始信号
delay(1);
DQ = 1; // 发送读取命令
delay(3);
dat >>= 1; // 读取数据位
if (DQ)
{
dat |= 0x80;
}
delay(4);
}
return dat;
}
void initDS18B20()
{
writeByte(0xcc); // 跳过ROM命令
writeByte(0x4e); // 发送写Scratchpad命令
writeByte(0x4b); // 设置温度上限为75度
writeByte(0x00); // 设置温度下限为0度
writeByte(0x1f); // 设置分辨率为12位
writeByte(0x00); // 发送结束信号
}
void readTemperature(unsigned char *temp)
{
unsigned char i;
writeByte(0xcc); // 跳过ROM命令
writeByte(0x44); // 发送温度转换命令
delay(500); // 等待转换完成
writeByte(0xcc); // 跳过ROM命令
writeByte(0xbe); // 发送读取Scratchpad命令
for (i = 0; i < 2; i++)
{
temp[i] = readByte(); // 读取温度值
}
}
void main()
{
unsigned char temp[2];
initDS18B20(); // 初始化DS18B20传感器
while(1)
{
readTemperature(temp); // 读取温度值
if (temp[1] > 0x7f) // 判断温度的符号位
{
temp[1] = ~temp[1] + 1; // 如果温度为负数,进行补码运算
temp[0] = ~temp[0];
temp[0]++;
if (temp[0] == 0x00)
{
temp[1]++;
}
}
// 这里可以根据实际需求,进行温度控制操作
}
}
```
以上程序基于OneWire协议与DS18B20传感器进行通信,实现了DS18B20传感器的初始化和温度读取功能。在主函数中,可以根据实际需求进行温度控制操作。需要注意的是,读取温度值的函数返回的温度值是一个两字节的整数,需要进行符号位和补码运算才能得到正确的温度值。