ds18b20 51单片机
时间: 2023-07-24 19:42:15 浏览: 100
DS18B20是一款数字温度传感器,可以通过单总线接口与51单片机进行通讯。
使用DS18B20需要注意以下几点:
1. DS18B20的引脚包括VCC、GND和DQ(数据引脚)。其中,VCC接5V电源,GND接地,DQ连接单片机的IO口。
2. DS18B20采用的是单总线通讯协议,因此需要在程序中实现相应的通讯函数。
3. DS18B20的温度数据是以16位二进制补码形式存储的,需要将其转换为实际温度值进行使用。
下面是一个简单的示例代码,用于读取DS18B20的温度数据:
```c
#include <reg52.h>
sbit DQ = P1^4; // DQ连接单片机的P1.4口
unsigned int temp; // 保存温度数据的变量
void delay(unsigned int t) // 延时函数
{
while(t--);
}
void init_ds18b20() // 初始化DS18B20
{
DQ = 1; // 置高电平,准备发送复位脉冲
delay(500); // 延时500us
DQ = 0; // 发送复位脉冲
delay(80); // 延时80us
DQ = 1; // 释放总线
delay(500); // 等待DS18B20回应
}
void write_ds18b20(unsigned char dat) // 向DS18B20写入一个字节
{
unsigned char i;
for(i=0; i<8; i++)
{
DQ = 0; // 拉低总线
DQ = dat & 0x01; // 发送数据位
delay(5); // 等待时序
DQ = 1; // 恢复总线
dat >>= 1; // 准备发送下一位数据
}
}
unsigned char read_ds18b20() // 从DS18B20读取一个字节
{
unsigned char i, dat = 0;
for(i=0; i<8; i++)
{
DQ = 0; // 拉低总线
dat >>= 1; // 准备接收数据位
if(DQ) dat |= 0x80; // 如果总线为高电平,接收数据位为1
delay(5); // 等待时序
DQ = 1; // 恢复总线
}
return dat;
}
void get_temp() // 获取温度数据
{
init_ds18b20(); // 初始化DS18B20
write_ds18b20(0xcc); // 跳过ROM操作
write_ds18b20(0x44); // 启动温度转换
delay(100); // 等待转换完成
init_ds18b20(); // 再次初始化DS18B20
write_ds18b20(0xcc); // 跳过ROM操作
write_ds18b20(0xbe); // 发送读取温度命令
temp = read_ds18b20(); // 读取温度低字节
temp |= read_ds18b20() << 8; // 读取温度高字节
}
void main()
{
while(1)
{
get_temp(); // 获取温度数据
temp >>= 4; // 将温度数据右移4位,去掉小数部分
// 进行温度转换,具体公式见DS18B20的数据手册
temp = (temp * 625) / 100;
// 将温度数据输出到LED灯
P2 = temp;
delay(1000); // 延时1秒
}
}
```
需要注意的是,以上代码仅供参考,实际使用时需要根据具体情况进行修改。同时,DS18B20的通讯协议比较复杂,需要仔细阅读其数据手册并进行实验验证。
阅读全文