蓝桥杯嵌入式国赛模块——温度传感器

本文硬件基于蓝桥杯嵌入式主板及其扩展板

硬件基础

该模块的电路图如下:

图片[1]-蓝桥杯嵌入式国赛模块——温度传感器-睿冰小站

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 指令汇总

指令代码功能
读ROM0x33读DS1820温度传感器ROM中的编码(即64位地址)
匹配ROM0x55寻址指定ROM代码的DS18B20
搜索ROM0xF0搜索单线上连接的多个DS18B20
跳过ROM0xCC忽略64位ROM地址,直接向DS1820发温度变换命令
报警搜索0xEC执行后只有温度超过设定值上限或下限的传感器才做出响应
ROM指令
指令代码功能
温度变换0x44启动DS1820进行温度转换,结果存入内部RAM的0-1字节
读暂存器0xBE读内部RAM中9字节的内容
写暂存器0x4E发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据
复制暂存器0x48将RAM中第3 、4字节的内容复制到EEPROM中
重调EEPROM0xB8将EEPROM中内容恢复到RAM中的第3 、4字节
读电源模式0xB4读DS1820的供电模式。寄生供电时DS1820发送“ 0 ”,外接电源供电 DS1820发送“ 1 ”
RAM指令

代码编写

由于比赛的时候,会提供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;		
}
© 版权声明
THE END
喜欢就支持以下吧
点赞14 分享
相关推荐