ds18b20 51单片机
时间: 2023-10-01 15:04:55 浏览: 48
DS18B20代码51单片机代码
5星 · 资源好评率100%
DS18B20是一种数字温度传感器,可以通过单总线接口与51单片机通信。使用51单片机读取DS18B20的温度数据需要进行一系列的初始化和通信操作。以下是一个基本的读取DS18B20温度数据的示例代码:
```c
#include<reg51.h>
#include<intrins.h>
#define DQ P1_0
void Delay1us(void);
void Delay10us(void);
void Delay500us(void);
void Delay750us(void);
/* DS18B20写字节函数 */
void WriteByte(unsigned char dat)
{
unsigned char i;
for(i=0; i<8; i++)
{
DQ=0; //拉低总线
_nop_();
_nop_();
if(dat&0x01) DQ=1; //写数据
_nop_();
_nop_();
DQ=1; //释放总线,等待写入下一位
dat>>=1;
}
}
/* DS18B20读字节函数 */
unsigned char ReadByte(void)
{
unsigned char i, dat;
for(i=0; i<8; i++)
{
DQ=0; //拉低总线
_nop_();
_nop_();
DQ=1; //释放总线
_nop_();
_nop_();
dat>>=1;
if(DQ) dat|=0x80; //读数据
Delay1us();
}
return dat;
}
/* DS18B20初始化函数 */
void Init_DS18B20(void)
{
DQ=1; //释放总线
Delay750us();
DQ=0; //拉低总线
Delay500us();
DQ=1; //释放总线
Delay10us();
}
/* DS18B20开始转换函数 */
void StartConvert_DS18B20(void)
{
Init_DS18B20();
WriteByte(0xCC); //跳过ROM操作
WriteByte(0x44); //开始转换
}
/* DS18B20读温度函数 */
unsigned int ReadTemp_DS18B20(void)
{
unsigned char temp1, temp2;
unsigned int temp;
Init_DS18B20();
WriteByte(0xCC); //跳过ROM操作
WriteByte(0xBE); //读取温度数据
temp1=ReadByte(); //读LSB
temp2=ReadByte(); //读MSB
temp=temp2;
temp=(temp<<8)|temp1;
return temp; //返回温度值
}
/* 延时1微秒函数 */
void Delay1us(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/* 延时10微秒函数 */
void Delay10us(void)
{
unsigned char i;
for(i=0; i<10; i++) Delay1us();
}
/* 延时500微秒函数 */
void Delay500us(void)
{
unsigned char i;
for(i=0; i<500; i++) Delay1us();
}
/* 延时750微秒函数 */
void Delay750us(void)
{
unsigned char i;
for(i=0; i<750; i++) Delay1us();
}
void main()
{
unsigned int temp;
while(1)
{
StartConvert_DS18B20(); //开始转换
Delay500us(); //等待转换完成
temp=ReadTemp_DS18B20(); //读取温度值
temp=temp*0.0625; //将温度值转换为摄氏度
//显示温度值
//...
}
}
```
需要注意的是,DS18B20的通信协议比较复杂,需要根据数据手册进行详细的配置和操作。在实际应用中,可以使用已经封装好的DS18B20库来简化操作。
阅读全文