用c语言写51单片机和DS18B20的驱动函数
时间: 2024-05-10 07:16:04 浏览: 111
以下是51单片机和DS18B20的驱动函数示例代码:
```c
#include <reg51.h>
sbit DQ = P1^0; // DS18B20数据线连接到P1.0
void delay(int us) // 延时函数
{
int i,j;
for(i=0; i<us; i++)
for(j=0; j<11; j++);
}
// 向DS18B20写入一个字节的数据
void write_byte(unsigned char dat)
{
unsigned char i;
for(i=0; i<8; i++)
{
DQ = 0;
DQ = dat & 0x01;
delay(5);
DQ = 1;
dat >>= 1;
}
}
// 从DS18B20读取一个字节的数据
unsigned char read_byte()
{
unsigned char i, dat = 0;
for(i=0; i<8; i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ) dat |= 0x80;
delay(5);
}
return dat;
}
// 启动DS18B20温度转换
void start_ds18b20()
{
DQ = 0;
delay(80);
DQ = 1;
delay(5);
DQ = 0;
delay(500);
}
// 读取DS18B20温度值
int read_ds18b20()
{
unsigned char th, tl;
int temp;
start_ds18b20(); // 启动温度转换
write_byte(0xCC); // 跳过ROM操作
write_byte(0x44); // 启动温度转换
delay(1000); // 等待转换完成
start_ds18b20(); // 再次启动DS18B20
write_byte(0xCC); // 跳过ROM操作
write_byte(0xBE); // 读取温度值
tl = read_byte(); // 读取低字节温度值
th = read_byte(); // 读取高字节温度值
temp = (th << 8) | tl; // 合并温度值
return temp * 0.0625; // 返回温度值
}
void main()
{
unsigned int temp;
while(1)
{
temp = read_ds18b20(); // 读取温度值
// 在这里可以将温度值输出到LCD或串口等设备
}
}
```
这段代码实现了从DS18B20获取温度值的功能,具体实现方法是通过向DS18B20写入命令启动温度转换,然后再读取温度值。注意,在读取温度值时要先读取低字节,再读取高字节,并且需要将两个字节的值合并成一个整数。最后,将温度值乘以0.0625即可得到摄氏度温度值。
阅读全文