可以看到ds18b20的外部电路很简单,out接单片机的P14但要连接拉电阻
DS18B测量范围为-55℃~ 125℃。测量分辨率为9~12位可调(复位值为12位),12位精度可达0.0625℃(小数部分有4位)。 其温度测量原理,简单地说,内部精密晶体振动的振动频率会随着温度的变化而变化,在处理振动频率后,可以得到温度。 18B20有其指令系统,分为ROM命令和功能命令,内部有临时存储温度、报警上下限等数据,写在温度测量程序中。
温度传感器ds18b20是蓝桥杯的重要考点,省赛会提供底层驱动,但需要稍加修改
void delay_onewire (unsigned int t) ///单总线延迟函数 { while(t--); }
我们使用的开发板 iap15f2k61s2/iap15f2k60s2 比传统51快8~12倍,改为:
void delay_onewire (unsigned int t) { t = t*12; //放大12倍 while(t--); //10us }
单总线向ds18b20写一个字节
void Write_ds18b20(unsigned char date) ////单总线ds18b20写一个字节 { unsigned char i; for(i=0;i<8;i ) { DQ=0; //拉低P14 DQ= date & 0x01; ///将数据发送到单总线,最低位 delay_onewire(5); //延时30~60us DQ = 1; //拉高P14 date>>=1; ///数据位移 ,回到第一步 } delay_onewire(5); }
向ds18b20读一个字节
unsigned char Read_ds18b20(void) { unsigned char i; unsigned char date; for(i=0;i<8;i ) { DQ=0; //拉低 date >>= 1; ///数据位移 DQ=1; //拉高 if(DQ) { date |= 0x80; //读数据,最低位=DQ //循环8次,保存8位数据,获得一个字节 } delay_onewire(5); } }
ds18b20初始化
bit init_ds18b20(void) //ds18b20 初始化 { bit init_flag = 0; DQ = 1; //拉高 delay_onewire(12); //稳定DQ DQ = 0; /// delay_onewire(80); //延时480~960us DQ = 1; ///释放总线 delay_onewire(10); init_flag = DQ; //若DQ = 0; 初始化成功 delay_onewire(5); return init_flag; }
温度转化
unsigned char rd_temperature(void) { unsigned char temperature; unsigned char low,high; init_ds18b20(); Write_ds18b20(0xcc); //跳过rom Write_ds18b20(0x44); //执行温度转换 delay_onewire(200); //等待 init_ds18b20(); Write_ds18b20(0xcc); //跳过rom Write_ds18b20(0xbe); ///读暂存器 low = Read_ds18b20(); high = Read_ds18b20(); temperature = (high<<4) | (low>>4); return temperature; }