基于51单片机写一个DS18B20的驱动代码
时间: 2024-01-25 08:02:20 浏览: 69
以下是基于51单片机的DS18B20驱动代码,其中使用了延时函数。
```c
#include <reg51.h>
#define DQ P1_0 // 定义DS18B20的数据引脚
void delay_us(unsigned int t) // 微秒级延时函数
{
while(t--);
}
void delay_ms(unsigned int t) // 毫秒级延时函数
{
unsigned int i, j;
for(i = 0; i < t; i++)
for(j = 0; j < 112; j++);
}
unsigned char DS18B20_init() // 初始化DS18B20
{
unsigned char i;
DQ = 1; // 先将数据线拉高
delay_us(1); // 延时1微秒
DQ = 0; // 将数据线拉低
delay_us(500); // 延时500微秒
DQ = 1; // 将数据线拉高
delay_us(60); // 延时60微秒
i = DQ; // 读取DS18B20的应答信号
delay_us(240); // 延时240微秒
return i; // 返回DS18B20的应答信号
}
void DS18B20_write_byte(unsigned char dat) // 向DS18B20写入一个字节
{
unsigned char i;
for(i = 0; i < 8; i++)
{
DQ = 0; // 将数据线拉低
delay_us(2); // 延时2微秒
DQ = dat & 0x01; // 写入最低位
delay_us(60); // 延时60微秒
DQ = 1; // 将数据线拉高
dat >>= 1; // 右移一位
}
}
unsigned char DS18B20_read_byte() // 从DS18B20读取一个字节
{
unsigned char i, dat = 0;
for(i = 0; i < 8; i++)
{
DQ = 0; // 将数据线拉低
delay_us(2); // 延时2微秒
DQ = 1; // 将数据线拉高
delay_us(2); // 延时2微秒
dat >>= 1; // 右移一位
if(DQ) dat |= 0x80; // 如果数据线为高,则将最高位设为1
delay_us(60); // 延时60微秒
}
return dat;
}
void DS18B20_start() // 启动DS18B20的温度转换
{
DS18B20_init(); // 初始化DS18B20
DS18B20_write_byte(0xCC); // 跳过ROM操作
DS18B20_write_byte(0x44); // 启动温度转换
}
unsigned int DS18B20_read_temp() // 读取DS18B20的温度值
{
unsigned char TL, TH;
unsigned int temp;
DS18B20_init(); // 初始化DS18B20
DS18B20_write_byte(0xCC); // 跳过ROM操作
DS18B20_write_byte(0xBE); // 读取温度值
TL = DS18B20_read_byte(); // 读取温度值低字节
TH = DS18B20_read_byte(); // 读取温度值高字节
temp = TH;
temp <<= 8; // 将高字节左移8位
temp |= TL; // 将低字节与高字节合并
return temp; // 返回温度值
}
void main()
{
unsigned int temp;
while(1)
{
DS18B20_start(); // 启动温度转换
delay_ms(750); // 延时750毫秒,保证转换完成
temp = DS18B20_read_temp(); // 读取温度值
// 将温度值显示在数码管上
// ...
}
}
```
需要注意的是,DS18B20的数据引脚需要使用外部上拉电阻,一般使用4.7kΩ的电阻即可。另外,DS18B20的数据引脚也可以直接连接到单片机的IO口,不需要使用中间件。
阅读全文