51单片机DS18B20初始化代码
时间: 2023-07-02 12:04:49 浏览: 150
以下是51单片机通过单总线协议初始化DS18B20温度传感器的代码:
```c
#include <reg52.h>
#include <intrins.h>
#define DQ P1_4
/** 延时函数,单位为微秒 **/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/** 发送一个脉冲 **/
void OneWireWriteByte(unsigned char dat)
{
unsigned char i;
EA = 0;
for(i=0; i<8; i++)
{
DQ = 0; // 拉低总线,开始发送数据
_nop_();
_nop_();
DQ = dat & 0x01; // 根据数据位,控制总线输出高低电平
DelayUs2x(6); // 持续一段时间
DQ = 1; // 恢复总线状态
dat >>= 1; // 右移一位,处理下一个数据位
}
EA = 1;
}
/** 读取一个脉冲 **/
unsigned char OneWireReadByte()
{
unsigned char i, dat;
EA = 0;
for(i=0; i<8; i++)
{
DQ = 0; // 拉低总线,开始发送读取命令
_nop_();
_nop_();
DQ = 1; // 释放总线
_nop_();
_nop_();
dat >>= 1; // 右移一位,为下一个数据位做准备
if(DQ) // 如果总线上读到的是1,即DS18B20发送的是高电平
dat |= 0x80; // 将dat高位设置为1
DelayUs2x(4); // 持续一段时间
}
EA = 1;
return dat; // 返回读取的数据
}
/** 初始化DS18B20 **/
bit DS18B20Init()
{
bit res;
DQ = 1; // 首先把总线拉高
DelayUs2x(10); // 持续一段时间
DQ = 0; // 拉低总线,准备发送初始化命令
DelayUs2x(60); // 持续一段时间
DQ = 1; // 释放总线
DelayUs2x(10); // 持续一段时间
res = DQ; // 读取总线状态
DelayUs2x(50); // 持续一段时间
return res; // 返回总线状态
}
void main()
{
unsigned char temp;
if(DS18B20Init()) // 初始化DS18B20
{
OneWireWriteByte(0xcc); // 跳过ROM,直接对DS18B20操作
OneWireWriteByte(0x44); // 启动温度转换
while(!OneWireReadByte()); // 等待温度转换完成
OneWireWriteByte(0xcc); // 跳过ROM
OneWireWriteByte(0xbe); // 发送读取温度命令
temp = OneWireReadByte(); // 读取温度数据的低8位
printf("The temperature is %d degrees Celsius.", temp);
}
else
printf("DS18B20 initialization failed.");
}
```
以上代码中,`OneWireWriteByte()`函数用于向DS18B20发送一个脉冲,`OneWireReadByte()`函数用于读取DS18B20发送的脉冲,`DS18B20Init()`函数用于初始化DS18B20,`main()`函数中的代码则展示了如何通过单总线协议读取DS18B20的温度数据。需要注意的是,这段代码中使用了定时器中断,如果你的编译器不支持内联汇编,可能需要稍作修改。
阅读全文