ds18B20 单片机代码51
时间: 2024-01-05 16:03:46 浏览: 70
DS18B20代码51单片机代码
5星 · 资源好评率100%
以下是基于51单片机的ds18B20温度传感器代码,使用的是单总线协议:
```c
#include <reg52.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit DQ = P2^3; //定义单总线数据线引脚
//延时函数
void Delay(uint t)
{
while(t--);
}
//初始化函数
void Init_DS18B20()
{
uchar flag = 0;
DQ = 1; //拉高数据线
Delay(10); //稍作延时
DQ = 0; //拉低数据线
Delay(600); //延时>480us
DQ = 1; //拉高数据线
Delay(5); //稍作延时
flag = DQ; //读取DS18B20的应答信号
Delay(50); //稍作延时
}
//读取一个字节的数据
uchar ReadOneByte()
{
uchar i, dat = 0;
for(i=0; i<8; i++)
{
DQ = 0; //拉低数据线
_nop_(); //微秒级延时
_nop_();
dat >>= 1; //先移位
DQ = 1; //拉高数据线
if(DQ) dat |= 0x80; //如果数据线为高,则把最高位设为1
Delay(5); //稍作延时
}
return dat;
}
//写一个字节的数据
void WriteOneByte(uchar dat)
{
uchar i;
for(i=0; i<8; i++)
{
DQ = 0; //拉低数据线
_nop_(); //微秒级延时
_nop_();
DQ = dat & 0x01; //写入数据
dat >>= 1; //移位准备写入下一个数据
Delay(5); //稍作延时
DQ = 1; //拉高数据线
}
}
//读取DS18B20的温度值
int Get_DS18B20_Temp()
{
uchar TL, TH;
int temp;
Init_DS18B20(); //初始化DS18B20
WriteOneByte(0xCC); //跳过ROM操作
WriteOneByte(0x44); //温度转换
Delay(800); //等待转换完成,此处延时可以根据实际应用需要进行调整
Init_DS18B20(); //重新初始化DS18B20
WriteOneByte(0xCC); //跳过ROM操作
WriteOneByte(0xBE); //读取温度值
TL = ReadOneByte(); //读取低8位
TH = ReadOneByte(); //读取高8位
temp = TH;
temp <<= 8;
temp |= TL;
return temp; //返回读取到的温度值
}
//主函数
void main()
{
int temp;
while(1)
{
temp = Get_DS18B20_Temp();
temp = temp*0.625; //计算出实际温度值
//将温度值通过串口发送给上位机或者其他设备
}
}
```
注意,以上代码仅供参考,具体实现可能需要根据实际情况进行修改。如果需要使用其他型号的温度传感器,也需要对代码进行相应的修改。
阅读全文