西华大学电气信息学院智能化电子系统设计报告
图3.8单片机STC89C52 I/O接口电路
3.2.2 DS18B20介绍
DS18B20是DALLAS公司生产的一线式传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55摄氏度到+125摄氏度,可编程为9到12位A/D转换精度,测温分辨率可达0.0625摄氏度,被侧温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生。CPU只需一根端口线就能与诸多DS18B20通信,占用问处理器的端口较少,可节省大量的引线和逻辑电路。
DS18B20主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH个TL、配置寄存器。DS18B20中的温度传感器可完成对温度的测量,用16位符号扩展的二进制补码读数形式提供,以0.0625摄氏度/LSB形式表达,其中S为符号位。例如+125摄氏度的数字输出为07DOH,+25.0625摄氏度的数字输出为0191H,-25.0625摄氏度的数字输出为FF6FH,-55摄氏度的数字输出为FC90H.
DS18B20采用一线通信接口。因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。主要首先提供以下功能命令之一:⑴读ROM指令0X33, ⑵ROM匹配指令0X55,⑶搜索ROM指令0XF0, ⑷跳过ROM指令0XCC, ⑸报警检查指令0XEC。这些指令操作作用在没有一个器件的64位光刻ROM序列号。
第 9 页
西华大学电气信息学院智能化电子系统设计报告
图3.9 DS18B20的两种封装形式
图 3.10 DS18B20内部结构图
第 10 页
西华大学电气信息学院智能化电子系统设计报告 4 软件设计
软件设计关键在于DS18B20的使用。DS18B20属于单线式器件,它在一根数据线上实现数据的双向传输,这就需要一定的协议,来对读写数据提出严格的时序要求,而STC89C52单片机并不支持单线传输,因此必须采用软件的方法来模拟单线的协议时序。DS18B20有严格的通信协议来保证各为数据传输的正确性和完整性。主机操作单线器件DS18B20必须遵循一定的顺序。系统的主程序主要通过初始化,键盘扫描,获取温度,显示温度,报警等子程序实现。通过一个循环设置,使系统不断地进行对温度的检测。下图为本系统主程序的设计流程,各个模块的设计见下文。软件设计具体程序见附录四。
开始 初始化 键盘扫描 温度采集 N 显示温度 Y 报警
图4.1主程序设计流程图
4.1 温度采集模块
温度采集包括初始化DS18B20子程序;读DS18B20子程序;写DS18B20子程序;获得温度子程序。DS18B20初始化需要这几个过程先将数据线置高电平“1”,延时10
第 11 页
西华大学电气信息学院智能化电子系统设计报告 us;再将数据线拉到低电平“0” 延时500 us;然后再数据线拉到高电平“1”,高电平保持60us,判断DS18B20是否发出低电平信号,跟据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制;若CPU读到了数据线上的低电平“0”后,根据时序要求还要做延时,其延时的时间从发出的高电平算起最少要480 us时间;最后将数据线再次拉高到高电平“1”后结束。需要注意的是每次采集温度的时候都需要初始化。DS18B20发出高电平初始化成功,返回flag=1表示DS18B20初始化成功。
读DS18B20也需要几个流程:先将数据线拉高“1” 延时2us时间;再将数据线拉低“0” 延时10 us;然后将数据线拉高“1” 延时8us读取1位数据,读取1位数据后延时50us时间;最后通过读取1位右移1位循环进行分别读出8位即一个字节的数据。程序中我们把读取的第一字节存templ中,读取的第二字节存temph中。如果需要读出设定的TH和TL值用于报警,这时也需将数据读出。我们把读取的第3字节存tempth 即TH的值;把读取的第4个字节存temptl即TL的值。由于读出的数据时二进制数显示的时候是十进制。所以必须将读出的数据进行处理。先判断符号位将temph的高5位与0xf8相与就可以知道正负。若为负值f=1,将templ和temph取反。转换的时候我们将小数部分和整数部分分别转换,小数部分templ与0x0f相与后的值乘以625就是小数部分的值,需要注意的是小数部分的值是用整数形式表示的;整数部分temph左移四位和 templ右移四位合并为一个字节就是整数部分的值。
获得温度就是在前面操作的基础上调用。先初始化DS18B20,发出跳过ROM匹配命令;再向DS18B20发温度转换命令显示温度,等待AD转换,发跳过ROM匹配命令;最后发出读温度命令将读出的温度数据保存到tempint和tempdf处为显示做准备。
下面两个框图为温度采集流程图和读温度两个主要的流程图。
第 12 页
西华大学电气信息学院智能化电子系统设计报告
图4.2 温度采集流程图
读取第1,2字节即为温度数值 发起 Read temperature命令 No 应答脉冲? 初始化DS18B20 延时750ms, 等待温度转换完成 发起 Skip Rom命令 No 应答脉冲? 开始 初始化DS18B20 发起 Convert T 命令 温度显示模块主要包括显示温度子程序和延迟子程序。显示温度即把读出的温度传递过来分别显示。我们是将数码分为各个位动态扫描显示。读温度程序中将小数部分和整数部分的值分别存放在tempint和tempdf中,符号位存放在f中。由于是分各个位显示,所以必须对数进行取模运算,C语言提供了整除和求余数运算,两者相结合就可以取出各个位的模。由于我们是用数码管显示,第一位显示符号位,f=0表示正温度用“0”表示,f=1表示负温度用“-”表示,“-”值可以用0xbf送到数码管显示。第四个数码管需要显示小数位,我们采用查表的方法将要显示的带小数的数模放在ledmap1中,需要显示的时候再调用;一般数模放在ledmap中。显示的时候采用循环的方式进行,
第 13 页