89C52单片机ds18b20温控的代码
时间: 2023-07-09 11:16:51 浏览: 49
以下是使用89C52单片机控制DS18B20温度传感器的示例代码,包括初始化、读取温度和显示温度:
```
#include <reg52.h>
sbit DQ = P2^7; // DS18B20数据线连接到P2.7引脚
// 延时函数,用于等待DS18B20响应信号
void Delay1ms(unsigned int i)
{
unsigned int j;
for(; i > 0; i--)
for(j = 110; j > 0; j--);
}
// 向DS18B20发送复位信号
void DS18B20_Reset(void)
{
unsigned char i;
DQ = 0; // 拉低数据线
Delay1ms(20); // 延时20ms
DQ = 1; // 释放数据线
Delay1ms(20); // 延时20ms
i = DQ; // 读取DS18B20响应信号
Delay1ms(20); // 延时20ms
}
// 向DS18B20发送一个字节数据
void DS18B20_WriteByte(unsigned char dat)
{
unsigned char i, j;
for(i = 0; i < 8; i++)
{
j = dat >> i; // 依次取出每一位数据
j &= 0x01; // 取最低位
DQ = 0; // 拉低数据线
Delay1ms(2); // 延时2ms
DQ = j; // 输出数据
Delay1ms(20); // 延时20ms
DQ = 1; // 释放数据线
}
Delay1ms(2); // 延时2ms
}
// 从DS18B20读取一个字节数据
unsigned char DS18B20_ReadByte(void)
{
unsigned char i, j, dat;
dat = 0;
for(i = 0; i < 8; i++)
{
DQ = 0; // 拉低数据线
Delay1ms(2); // 延时2ms
DQ = 1; // 释放数据线
Delay1ms(2); // 延时2ms
j = DQ; // 读取数据
j <<= i; // 将数据复位到正确的位
dat |= j; // 将数据组合起来
Delay1ms(20); // 延时20ms
}
return dat;
}
// DS18B20初始化
void DS18B20_Init(void)
{
DS18B20_Reset(); // 发送复位信号
DS18B20_WriteByte(0xCC);// 跳过ROM操作
DS18B20_WriteByte(0x44);// 开始温度转换
Delay1ms(100); // 等待转换完成
}
// 从DS18B20读取温度值
int DS18B20_ReadTemperature(void)
{
unsigned char tl, th;
int temp;
DS18B20_Init(); // 初始化DS18B20
DS18B20_Reset(); // 发送复位信号
DS18B20_WriteByte(0xCC);// 跳过ROM操作
DS18B20_WriteByte(0xBE);// 读取温度寄存器
tl = DS18B20_ReadByte(); // 读取温度低字节
th = DS18B20_ReadByte(); // 读取温度高字节
temp = th;
temp <<= 8;
temp |= tl;
return temp;
}
// 显示温度值
void DisplayTemperature(int temp)
{
unsigned char i;
unsigned char code table[] = {
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90
};
unsigned char buf[4];
if(temp < 0) // 如果温度为负数,则显示"-"号
{
buf[0] = 0x40; // "-"号的编码为0x40
temp = -temp; // 取温度的绝对值
}
else
{
buf[0] = 0x00;
}
buf[1] = table[temp / 100]; // 百位数字
buf[2] = table[temp % 100 / 10]; // 十位数字
buf[3] = table[temp % 10]; // 个位数字
for(i = 0; i < 4; i++)
{
P1 = buf[i];
Delay1ms(5);
P1 = 0x00;
}
}
void main()
{
int temp;
while(1)
{
temp = DS18B20_ReadTemperature(); // 读取温度值
DisplayTemperature(temp); // 显示温度值
Delay1ms(100); // 延时100ms
}
}
```
这段代码使用了89C52单片机的GPIO控制DS18B20温度传感器,具体的电路连接可以参考DS18B20的数据手册。需要注意的是,DS18B20的数据线需要上拉到5V电平,可以使用一个10K欧姆的电阻实现。同时,DS18B20在进行温度转换时,需要一定的时间,可以根据具体的应用需求来设置延时时间。