c51单片机DS18B20温度转换
时间: 2023-10-09 22:09:17 浏览: 105
C51单片机与DS18B20温度传感器的通信可以使用1-Wire总线协议。以下是使用C语言编写的DS18B20温度转换程序示例:
```
#include <reg51.h>
sbit DQ = P1^0; //定义1-wire总线的单个数据线
unsigned char temp; //存放温度值
void delay_us(unsigned int us) //延时函数,单位为微秒
{
while(us--);
}
void init_ds18b20(void) //DS18B20初始化函数
{
DQ = 1;
delay_us(2);
DQ = 0;
delay_us(480);
DQ = 1;
delay_us(60);
if(DQ == 0) //DS18B20存在
{
delay_us(420);
}
}
void write_byte(unsigned char dat) //写一个字节函数
{
unsigned char i;
for(i = 0; i < 8; i++)
{
DQ = 0;
DQ = dat & 0x01;
delay_us(60);
DQ = 1;
dat >>= 1;
}
}
unsigned char read_byte(void) //读一个字节函数
{
unsigned char i, dat = 0;
for(i = 0; i < 8; i++)
{
dat >>= 1;
DQ = 0;
delay_us(6);
DQ = 1;
delay_us(9);
if(DQ)
{
dat |= 0x80;
}
delay_us(55);
}
return dat;
}
void convert_ds18b20(void) //DS18B20温度转换函数
{
init_ds18b20();
write_byte(0xcc); //跳过ROM操作
write_byte(0x44); //启动温度转换
}
void read_ds18b20(void) //DS18B20读取温度函数
{
unsigned char low, high;
init_ds18b20();
write_byte(0xcc); //跳过ROM操作
write_byte(0xbe); //读取温度值
low = read_byte(); //读取温度低字节
high = read_byte(); //读取温度高字节
temp = ((high << 8) + low) * 0.0625; //计算温度值
}
void main(void)
{
convert_ds18b20(); //启动温度转换
read_ds18b20(); //读取温度值
}
```
上述程序中,init_ds18b20()函数用于初始化DS18B20,convert_ds18b20()函数用于启动温度转换,read_ds18b20()函数用于读取温度值。程序中使用了延时函数delay_us(),可以根据实际情况进行修改。在read_ds18b20()函数中,采用了16位计算温度值的方法,最后将结果乘以0.0625得到实际温度值。
阅读全文