帮我写一个完整地C51 的 DS18b20 代码驱动程序
时间: 2024-05-12 13:13:45 浏览: 89
下面是一个简单的 C51 的 DS18b20 代码驱动程序:
```
#include <reg52.h>
#include <intrins.h> // _nop_() 函数
#include <stdio.h>
sbit DQ = P2^0; // 设置 DQ 引脚
void delay(unsigned int t) // 延时函数
{
unsigned int i;
while (t--)
{
for (i = 0; i < 12; i++)
{
_nop_();
}
}
}
unsigned char ds18b20_init() // 初始化函数
{
unsigned char i;
DQ = 1;
delay(2);
DQ = 0;
delay(80);
DQ = 1;
delay(16);
i = DQ;
delay(80);
return i;
}
void ds18b20_write(unsigned char dat) // 写数据函数
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
_nop_();
DQ = dat & 0x01;
dat >>= 1;
delay(5);
DQ = 1;
}
}
unsigned char ds18b20_read() // 读数据函数
{
unsigned char i, dat = 0;
for (i = 0; i < 8; i++)
{
dat >>= 1;
DQ = 0;
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
if (DQ)
{
dat |= 0x80;
}
delay(5);
}
return dat;
}
void ds18b20_convert() // 转换函数
{
ds18b20_init();
ds18b20_write(0xcc);
ds18b20_write(0x44);
}
void ds18b20_read_temp() // 读取温度函数
{
unsigned char temp_h, temp_l;
float temp;
ds18b20_init();
ds18b20_write(0xcc);
ds18b20_write(0xbe);
temp_l = ds18b20_read();
temp_h = ds18b20_read();
temp = temp_h;
temp *= 256;
temp += temp_l;
temp *= 0.0625;
printf("Temperature: %.2f°C\n", temp);
}
void main()
{
ds18b20_convert();
delay(100);
ds18b20_read_temp();
while (1);
}
```
这里使用了 8051 单片机,使用了 P2^0 作为 DQ 引脚。在程序中,先进行初始化操作,然后写入转换命令,等待转换完成,最后读取温度数据并显示出来。
阅读全文