请用c语言生成一个51单片机获取DS18B20的代码
时间: 2023-05-31 13:03:31 浏览: 159
以下是一个简单的51单片机获取DS18B20温度传感器数据的代码:
```c
#include <reg51.h>
sbit DQ = P2^0; // 定义DS18B20数据引脚
// 函数声明
void delay_us(unsigned int us);
void delay_ms(unsigned int ms);
unsigned char ds18b20_init(void);
void ds18b20_write_byte(unsigned char dat);
unsigned char ds18b20_read_byte(void);
float ds18b20_get_temp(void);
void main()
{
float temp;
while(1)
{
if(ds18b20_init()) // 初始化DS18B20
{
ds18b20_write_byte(0xcc); // 跳过ROM操作
ds18b20_write_byte(0x44); // 启动温度转换
delay_ms(750); // 等待转换完成
temp = ds18b20_get_temp(); // 获取温度
}
}
}
// 延时函数
void delay_us(unsigned int us)
{
while(us--);
}
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i=0; i<ms; i++)
for(j=0; j<123; j++);
}
// DS18B20操作函数
unsigned char ds18b20_init(void)
{
unsigned char i;
DQ = 1;
delay_us(5);
DQ = 0;
delay_us(500);
DQ = 1;
delay_us(80);
i = DQ;
delay_us(420);
return i;
}
void ds18b20_write_byte(unsigned char dat)
{
unsigned char i, j;
for(i=0; i<8; i++)
{
j = dat >> i;
j &= 0x01;
DQ = 0;
delay_us(2);
DQ = j;
delay_us(60);
DQ = 1;
delay_us(2);
}
}
unsigned char ds18b20_read_byte(void)
{
unsigned char i, j, dat;
for(i=0; i<8; i++)
{
DQ = 0;
delay_us(2);
DQ = 1;
delay_us(2);
j = DQ;
delay_us(60);
dat |= (j << i);
}
return dat;
}
float ds18b20_get_temp(void)
{
unsigned char tl, th;
int temp;
float f_temp;
ds18b20_init(); // 初始化DS18B20
ds18b20_write_byte(0xcc); // 跳过ROM操作
ds18b20_write_byte(0xbe); // 读取温度寄存器
tl = ds18b20_read_byte(); // 读取低8位温度数据
th = ds18b20_read_byte(); // 读取高8位温度数据
temp = th;
temp <<= 8;
temp |= tl;
f_temp = (float)temp * 0.0625; // 计算温度
return f_temp;
}
```
这个代码使用了P2口的第0位作为DS18B20的数据引脚,如果需要使用其他引脚,可以相应地修改代码。在主函数中,首先调用ds18b20_init()函数初始化DS18B20,然后调用ds18b20_write_byte()函数启动温度转换,再等待750毫秒(DS18B20转换温度需要一定时间),最后调用ds18b20_get_temp()函数获取温度值并存储在变量temp中。可以根据需要,将temp的值输出到LCD屏幕、串口、LED灯等。
阅读全文