51单片机读取DS18b20
时间: 2023-11-08 12:04:09 浏览: 48
51单片机读取DS18B20温度传感器的步骤如下:
1. 初始化DS18B20传感器:拉低总线5us以上,然后将总线拉高,并等待传感器的响应。
2. 发送读取温度命令:向传感器发送读取温度的命令,即0xCC(跳过ROM指令)+0x44(温度转换指令)。
3. 等待转换完成:等待一段时间(通常为750ms)后,检测总线上的响应信号,如果总线上输出低电平,则表示转换完成。
4. 读取温度值:向传感器发送读取温度的命令,即0xCC(跳过ROM指令)+0xBE(读取温度指令),然后读取传感器返回的温度值,共16位,包括整数位和小数位。
5. 对温度值进行转换:将读取的温度值进行转换,根据数据手册提供的公式,将16位温度值转换为实际的温度值。
6. 显示温度:将转换后的温度值显示在LCD等显示器上。
需要注意的是,读取DS18B20传感器的程序需要使用51单片机的定时器和中断功能,以确保程序的准确性和稳定性。
相关问题
51单片机读取ds18b20代码
以下是基于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的数据手册。
能帮我写一份51单片机读取DS18B20的代码吗
当然可以,以下是基于C语言的51单片机读取DS18B20温度传感器的代码:
```c
#include<reg52.h>
#include<intrins.h>
#define DQ P2_0 //DS18B20数据线
sbit LED=P1^0; //用于指示读取是否成功的LED灯
unsigned char temperature; //存储温度值的变量
//延时函数,用于让DS18B20完成转换
void delay_us(unsigned int us)
{
while(us--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
//初始化DS18B20,发送复位脉冲
void ds18b20_init()
{
DQ=1;
delay_us(2);
DQ=0;
delay_us(480);
DQ=1;
delay_us(60);
}
//向DS18B20写入一个字节的数据
void ds18b20_write_byte(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
DQ=dat&0x01;
dat>>=1;
delay_us(60);
DQ=1;
}
}
//读取DS18B20返回的一个字节数据
unsigned char ds18b20_read_byte()
{
unsigned char i,dat=0;
for(i=0;i<8;i++)
{
DQ=0;
_nop_();
DQ=1;
_nop_();
dat|=(DQ<<i);
delay_us(60);
}
return dat;
}
//读取DS18B20的温度值
void ds18b20_read_temperature()
{
unsigned char TL,TH;
ds18b20_init();
ds18b20_write_byte(0xCC); //跳过ROM操作
ds18b20_write_byte(0x44); //启动温度转换
delay_us(750);
ds18b20_init();
ds18b20_write_byte(0xCC); //跳过ROM操作
ds18b20_write_byte(0xBE); //读取温度寄存器
TL=ds18b20_read_byte(); //读取温度的低8位
TH=ds18b20_read_byte(); //读取温度的高8位
temperature=(TH<<4)|(TL>>4); //处理温度值
}
void main()
{
while(1)
{
ds18b20_read_temperature(); //读取温度值
if(temperature!=0) //读取成功
{
LED=0; //点亮LED
//在这里可以将读取到的温度值进行处理和显示
}
else //读取失败
{
LED=1; //熄灭LED
}
delay_ms(500); //延时一段时间后再次读取
}
}
```
以上代码实现了基本的DS18B20温度传感器读取功能,如果需要更多的功能,比如温度值的显示和处理,可以在代码中进行修改。