“盛群杯”单片机大赛设计报告
温度读取部分:
采用数字温度传感器DS18B20。
DS18B20为数字式温度传感器,无需其他外加电路,直接输出数字量。
可直接与单片机通信,读取测温数据,电路简单。
如图1.2.2 所示。
DS18B20与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,因而使用DS18B20可使系统结构更趋简单,可靠性更高。
他在测温精度、转换时间、传输距离、分辨率等方面带来了令人满意的效果
2.2.1 温度采集部分设计
本系统采用半导体温度传感器作为敏感元件。
传感器我们采用了DS18B20单总线可编程温度传感器,来实现对温度的采集和转换,直接输出数字量,可以直接和单片机进行通讯,大大简化了电路的复杂度。
DS18B20应用广泛,性能可以满足题目的设计要求。
DS18B20的测温电路如图2.2.1所示。
图2.2.1 DS18B20测温电路
(1)DSI8B20的测温功能的实现:
其测温电路的实现是依靠单片机软件的编程上。
当DSI8B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的0,1字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0.062 5℃/LSB形式表示。
温度值格式如表2.2.1所示,其中“S”为标志位,对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变换为原码,再计算十进制值。
DSI8B20完成温度转换后,就把测得的温度值与 TH做比较,若T>TH或T<TL,则将该器件内的告警标志置位,并对主机发出的告警搜索命令做出响应。
表2.2.1 DS18B20温度值格式表
(2)、DSl820工作过程中的协议
初始化 -> RoM操作命令 -> 存储器操作命令-> 处理数据
①初始化单总线上的所有处理均从初始化开始
② ROM操作命令总线主机检测到DSl820的存在便可以发出ROM操作命令之一这些命令如表2.2.2所示
表2.2.2 ROM操作命令表
③存储器操作命令如表2.2.3所示
表2.2.3 存储器操作命令表
(3)温度转换算法及分析
由于DS18B20转换后的代码并不是实际的温度值,所以要进行计算转换。
温度高字节(MS Byte)高5位是用来保存温度的正负(标志为S的bit11~bit15),高字节(MS Byte)低3位和低字节来保存温度值(bit0 ~ bit10)。
其中低字节(LS Byte)的低4位来保存温度的小数位(bit0 ~ bit 3)。
由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取小数舍入,保留一位小数即可。
也就说,本系统的温度精确到了0.1度。
算法核心:首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LS Byte)取反加一变成原码。
处理过后把DS18B20的温度Copy到单片机的RAM中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位的BCD码存入RAM中。
3.1读取DS18B20温度模块子程序
每次对DA18B20操作时多要按造DS18B20工作过程中的协议进行。
初始化-> RoM操作命令-> 存储器操作命令-> 处理数据程序流程图如图3.1.1所示。
3.2 数据处理子程序
由于DS18B20转换后的代码并不是实际的温度值,所以要进行数据处理。
由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取四舍五入,保留一位小数即可。
也就说,本系统的温度精确到了0.1度。
首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LS Byte)取反加一变成原码。
处理过后把DS18B20的温度Copy到单片机的RAM 中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位的BCD码存入RAM中。
数据处理子程序流程图如图3.2.1所示。
图3.1.1 读取DS18B20温度子程序流程图
温度传输调试过程:
开始时初始化成功,从机有应答。
但在读取温度时
数据读出全为0xff ,说明从机没回应,或说从机没发数据到总线上,认为传输时序有问题,因为使用的命令是没问题的
开始时通信只能一次成功,第二次即出错。
第二次初始化失败
数据传输有问题,读出的数据为0x50,0x05
重新修改时序延时后,能得到正确的温度数据,但正确的温度读数是在断点设置的情况下,得到的。
在全速运行时,却无法通信,即从机没发数据到总线或从机就没接收数据。
大致判断情况为温度转换没完成。
因为温度转换过程中,不响应总线,向总线发数据,延长时间继续调试。
但延长时间过长,编译器死机。
经过调整温度获取正确。
采取的方案为使用定时器,在开启温度,过一段时间,再去读取温度。