51单片机读取ds18b20代码
时间: 2023-11-12 19:07:01 浏览: 90
51单片机 DS18B20报警-c程序
以下是基于51单片机读取DS18B20温度传感器的代码:
```
#include <reg52.h>
sbit DQ = P3^7; // DS18B20数据引脚
void DelayUs2x(unsigned char t)
{
while(--t);
}
void DelayMs(unsigned char t)
{
while(t--)
{
DelayUs2x(245);
DelayUs2x(245);
}
}
// 初始化DS18B20
bit Init_DS18B20()
{
bit init_flag;
DQ = 1;
DelayUs2x(5);
DQ = 0;
DelayMs(20);
DQ = 1;
DelayUs2x(30);
init_flag = DQ;
DelayUs2x(5);
return init_flag;
}
// DS18B20写入一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for(i=0; i<8; i++)
{
DQ = 0;
DQ = dat & 0x01;
DelayUs2x(5);
DQ = 1;
dat >>= 1;
}
DelayUs2x(5);
}
// DS18B20读取一个字节
unsigned char Read_DS18B20()
{
unsigned char i, dat = 0;
for(i=0; i<8; i++)
{
dat >>= 1;
DQ = 0;
DQ = 1;
if(DQ)
dat |= 0x80;
DelayUs2x(5);
}
return dat;
}
// 从DS18B20读取温度
unsigned int Get_DS18B20_Temp()
{
unsigned char a, b;
unsigned int temp;
Init_DS18B20();
Write_DS18B20(0xcc); // 跳过ROM操作
Write_DS18B20(0x44); // 启动温度转换
DelayMs(150); // 等待转换完成
Init_DS18B20();
Write_DS18B20(0xcc); // 跳过ROM操作
Write_DS18B20(0xbe); // 发送读取温度命令
a = Read_DS18B20(); // 读取低温度字节
b = Read_DS18B20(); // 读取高温度字节
temp = b;
temp <<= 8;
temp |= a;
return temp;
}
void main()
{
unsigned int temp;
while(1)
{
temp = Get_DS18B20_Temp();
// 进行温度转换
temp = (temp * 625) / 100; // DS18B20输出的是0.1℃的整数值,需要转换为0.01℃
// 将温度值发送到显示屏(或其他设备)上
// ...
DelayMs(500); // 等待一段时间后重新读取温度
}
}
```
注意:以上代码仅供参考,具体实现需要根据自己的硬件环境进行调整。另外,DS18B20温度传感器是一种数字式温度传感器,需要根据其协议进行读取,具体协议可以参考DS18B20的数据手册。
阅读全文