本文硬件基于蓝桥杯嵌入式主板及其扩展板
硬件基础
该模块的电路图如下:
![图片[1]-蓝桥杯嵌入式国赛模块——温度传感器-睿冰小站](https://www.r6b.cn/wp-content/uploads/2022/05/20t01.jpg)
DS18B20 主要特性
- 适应电压范围宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电
- 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条线即可实现微处理器与DS18B20的双向通讯
- DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
- DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
- 测温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
- 可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
- 在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度快
- 测量结果直接输出数字温度信号,以”一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
- 负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
DS18B20 工作时序
根据DS18B20的通信协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。
初始化(复位)
初始化时,要先将数据线拉低500us左右,然后释放,当DS18B20收到信号后等待15~60微秒左右,后发出60~240微秒的存响应负脉冲,即拉低总线。主CPU收到此信号表示复位成功。
写入字节
ROM指令和RAM指令都是靠单总线来写入一个字节的。因此写入字节时,要按照严格的时序要求来写入。
写周期最少为60微秒,最长不超过120微秒。若主机想写0,则把总线拉低电平最少60微秒直至写周期结束。若主机想写1,则一开始主机先把总线拉低1微秒表示写周期开始,1微秒后就释放总线为高电平,一直到写周期结束。
从DS18B20的角度来看,它在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。
读出字节
对于读数据操作时序也分为读0时序和读1时序两个过程。读时序是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。
DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。
主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成。
DS18B20 指令汇总
指令 | 代码 | 功能 |
读ROM | 0x33 | 读DS1820温度传感器ROM中的编码(即64位地址) |
匹配ROM | 0x55 | 寻址指定ROM代码的DS18B20 |
搜索ROM | 0xF0 | 搜索单线上连接的多个DS18B20 |
跳过ROM | 0xCC | 忽略64位ROM地址,直接向DS1820发温度变换命令 |
报警搜索 | 0xEC | 执行后只有温度超过设定值上限或下限的传感器才做出响应 |
指令 | 代码 | 功能 |
温度变换 | 0x44 | 启动DS1820进行温度转换,结果存入内部RAM的0-1字节 |
读暂存器 | 0xBE | 读内部RAM中9字节的内容 |
写暂存器 | 0x4E | 发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据 |
复制暂存器 | 0x48 | 将RAM中第3 、4字节的内容复制到EEPROM中 |
重调EEPROM | 0xB8 | 将EEPROM中内容恢复到RAM中的第3 、4字节 |
读电源模式 | 0xB4 | 读DS1820的供电模式。寄生供电时DS1820发送“ 0 ”,外接电源供电 DS1820发送“ 1 ” |
代码编写
由于比赛的时候,会提供DS18B20的底层驱动,所以只需要我们写温度读取函数
s16 ds18b20_read(void){
uint8_t val[2];
uint16_t i=0;
uint16_t temp=0;
ow_reset();//复位
ow_byte_wr(OW_SKIP_ROM);//跳过ROM
ow_byte_wr(DS18B20_CONVERT);//启动DS1820进行温度转换
delay_us(750000);
ow_reset();//复位
ow_byte_wr(OW_SKIP_ROM );//跳过ROM
ow_byte_wr(DS18B20_READ );//读暂存器
for(i=0;i<2;i++){
val[i]=ow_byte_rd();
}
temp=val[1]<<8;
temp=temp|val[0];
return temp/16;
}