C51:用DS18B20传感器读取温度
工作原理:51单片机是通过DS18B20温度传感器,并且基于onewire协议来读取温度数据的
下面是onewire协议的原理图:
在onewire.c文件中,已经包含了init_DS18B20(DS18B20设备初始化),Write_DS18B20(向DS18B20写一个字节)和,Read_DS18B20(从DS18B20读取一个字节)函数了,我们要做的就是根据这些函数,编写一个读取温度的函数。
程序流程:
1.初始化(init_DS18B20)——>跳过ROM(0xcc)——>转换温度(0x44)
2.初始化(init_DS18B20)——>跳过ROM(0xcc)——>读取暂存器(0xbe)——>调用两次Read_DS18B20(先读低位,再读高位)
注意:
官方提供的延时函数不太准确,需要扩大延时12倍,否则无法读到准确的温度
以下是修改过后的onewire.c源文件源码:
sbit DQ = P1^4; //修改过后的延时函数
void Delay_OneWire(unsigned int t)
{t = t * 12;while(t--);
}void Write_DS18B20(unsigned char dat)
{unsigned char i;for(i=0;i<8;i++){DQ = 0;DQ = dat&0x01;Delay_OneWire(5);DQ = 1;dat >>= 1;}Delay_OneWire(5);
}unsigned char Read_DS18B20(void)
{unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ = 0;dat >>= 1;DQ = 1;if(DQ){dat |= 0x80;} Delay_OneWire(5);}return dat;
}bit init_ds18b20(void)
{bit initflag = 0;DQ = 1;Delay_OneWire(12);DQ = 0;Delay_OneWire(80);DQ = 1;Delay_OneWire(10); initflag = DQ; Delay_OneWire(5);return initflag;
}
读取温度函数原型如下,注意:需要把Read_Temperature()函数放在onewire.c文件中
float Read_Temperature(void)
{float temp_return;unsigned char low,high; //用于储存温度值init_ds18b20();Write_DS18B20(0xcc); Write_DS18B20(0x44); //不加上Delay软件延时,防止阻塞程序。等待温度转换完成,直接去读取暂存器 init_ds18b20();Write_DS18B20(0xcc); Write_DS18B20(0xbe); low = Read_DS18B20(); //读取温度低8位数据high = Read_DS18B20(); //读取温度高8位数据temp_return = (high<<8|low)*0.0625;return temp_return;
}
程序示例:
unsigned char temperature;
unsigned char cnt_temp;
void Read_DS18B20(void)
{if(cnt_temp>=100) //每0.1s读取一次温度{cnt_temp=0;temperature=(unsigned char)Read_Temperature(); //这里使用强制类型转换,使读到的温度是整数}
}void Timer2_ISR(void) interrupt 12
{cnt_temp++;
}
这里可以根据读到的温度,进行各种操作,比如在数码管上显示温度等等。