在任务一、二的上我们实现了点亮RGB 与 数码管驱动,要完成任务三,需要添加温度传感器的驱动,获取环境温度。
温度传感器的型号是:DS18B20 ,该传感器有以下特点:
独特的1-Wire总线接口仅需要一个管脚来通信。
能够采用数据线供电,供电范围为3.0V至5.5V。
温度可测量范围为:-55℃至+125℃
温度范围超过-10℃至85℃之外时测温分辨率0.5℃。
内部温度采集精度可以由用户自定义为9-Bits至12-Bits。
温度转换时间在转换精度为12-Bits时达到最大值750ms。
1、硬件确认
该模块比较简单,就由2个电阻,LED,DS18B20共同组成,其中一个电阻 是 LED 的限流电阻,所以DS18B20的外围非常、非常简单!!
2、驱动原理确认
阅读规格书发现、总结:
通过单总线访问DS18B20的执行序列如下:
步骤1:初始化
步骤2:ROM操作指令
步骤3:DS18B20功能指令
每一次DS18B20的操作都必须满足以上步骤,若是缺少步骤或是顺序混乱,器件将不会有返回值。搜索ROM命令和报警搜索命令除外。当这两个命令执行时,主控制器必须返回步骤1。
2.1、初始化时序
按照规格书逻辑图理解为:
配置输出模式,低电平保持480us
等待15-60us
配置输入模式,电平由上拉电阻拉高,等待DS18B20输出低电平,低电平保持的时间是60-240us。
DS18B20输出低电平时表示该线上由DS18B20存在,可以用于判断连接是否正常。
如:读取到高电平,连接或器件有问题。读取到低电平,通讯正常。
2.2、写时序
上图是写时序,写数据时最小必须有60us的电平保持时间,且写数据间至少有1us的恢复时间。
2.3、读时序
上图是读时序,读数据的窗口有60us,期间DS18B20会保持电平,且读数据间至少有1us的间隔时间。
所以按照以上逻辑,写出代码就可以获取温度了!
3、测试代码
3.1、初始化代码
void DS18B20_Rst( void ) { DS18B20_DQ_OUT; DS18B20_DQ_OUTL; delay_us( 750 ); DS18B20_DQ_OUTH; delay_us( 15 ); }
3.2、读数据
uint8_t DS18B20_Read_Bit( void ) { DS18B20_DQ_OUT; uint8_t data; DS18B20_DQ_OUTL; delay_cycles( 2 * 32 ); DS18B20_DQ_OUTH; delay_cycles( 12 * 32 ); DS18B20_DQ_IN; if ( DS18B20_DQ_READ ){ data = 1; }else{ data = 0; } delay_cycles( 50 * 32 ); return data; }
3.3、写数据
void DS18B20_Write_Byte( uint8_t dat ) { uint8_t j; uint8_t testb; DS18B20_DQ_OUT; for ( j = 1; j <= 8; j++ ){ testb = dat & 0x01; dat = dat >> 1; if ( testb ) { DS18B20_DQ_OUTL; delay_us( 2 ); DS18B20_DQ_OUTH; delay_us( 60 ); }else{ DS18B20_DQ_OUTL; delay_us( 60 ); DS18B20_DQ_OUTH; delay_us( 12 ); } } }
4、组合实验
GIF演示效果:
上图就是温度报警器的实际演示效果,由于GIF没有声音,所以在蜂鸣器响的同时,添加了LED指示。
设定的报警温度是30℃,在正常温度下显示绿灯,用手捏住温度传感器加热它,达到30℃,蜂鸣器响,亮红灯!