单片机课程设计:八路温度巡回检测系统 - 图文 联系客服

发布时间 : 星期四 文章单片机课程设计:八路温度巡回检测系统 - 图文更新完毕开始阅读53025fc8d5bbfd0a795673d5

* 名 称:write_byte() * 功 能:写18b20写字节 * 入口参数:uch val 待写的数据 *******************************************************************/ void write_byte(uch val) { } DS18B20内部带有共9个字节的高速暂存器RAM和电可擦除EEPROM,起结构如表2所示。 表2 DS18B20高速暂存器结构 寄存器内容 温度值低位(LSB) 温度值高位(MSB) 高温限值(TH) 低温限值(TL) 配置寄存器 保留 保留 保留 CRC校验值 字节地址 0 1 2 3 4 5 6 7 8 uch i; uch temp; for (i = 8;i > 0;i--) { } temp = val & 0x01; //最低位移出 DQ_LOW(); NOP();NOP();NOP();NOP();NOP(); //从高拉至低电平,产生写时间隙 if (temp == 1) DQ_HIGH(); //如果写1,拉高电平 delay(2, 7); //延时63us DQ_HIGH(); NOP();NOP(); val = val >> 1; //右移一位 DS18B20所包含的操作指令如表3所示。 表3 DS18B20操作指令 ROM操作指令

指令 约定代码 读ROM 匹配ROM 33H 55H 读DS18B20温度传感器ROM中的编码(即64位地址) 发出命令后接着发出64位ROM编码,访问总线上与该编码对应的芯片 搜索ROM 跳过ROM 告警搜索 F0H CCH ECH 用于确定挂接在同一总线上DS18B20的个数 忽略64位ROM地址,直接向DS18B20发温度变换命令 执行后只有问多超过上限或下限的芯片才响应 RAM操作指令

指令 约定代码 温度转换 读暂存器 写暂存器 44H BEH 4EH 启动DS18B20温度转换。12位转换时长典型值750ms 读内部RAM中9字节的数据。 向RAM第2、3字节写上、下限温度数据,紧跟命令之后传送2字节数据 复制暂存器 重调EEPROM B8H 将EEPROM中内容恢复到RAM中第3、4字节 48H 将RAM中第2、3字节的内容复制到内部EEPROM中 功能 功能 温度数据在高速暂存器RAM的第0和第1个字节中的存储格式如下表4所示。 表4 DS18B20温度数据存储格式 位7 2 位15 S 3位6 2 位14 S 2位5 2 位13 S 1位4 2 位12 S 0位3 2 位11 S -1位2 2 位10 2 6-2位1 2 位9 2 5-3位0 2 位8 2 4-4 DS18B20在出厂是默认配置为12位,其中最高位为符号位,即温度值共11位,单片机在读取数据时,一次会读2字节共16位,读完后将低11位的二进制数转化为十进制数后再乘以0.0625便为所测的实际温度值。另外,还需要判断温度的正负。前5个数字为符号位,这5位同时变化,我们只需要判断11位就可以了。前5位为1时,读取的温度为负值,且测到的数值需要取反加1再乘以0.0625才可得到实际温度值。前5位为0时,读取的温度为正值,且温度为正值时,只要将测得的数值乘以0.0625即可得到实际温度值。考虑到实际使用的需要,在这里我们只使用一个DS18B20,故每次操作前只需复位后发出Skip ROM指令(即跳过ROM指令)再读出温度的正值、并精确到小数点后一位,即可满足设计需求。

/***************************************************************** * 名 称:get_temp() * 功 能:启动温度转换

*****************************************************************/ void get_tem() {

uchar tem1,tem2,num; float aaa;

reset(); //复位 write_byte(0xCC); //跳过ROM write_byte(0x44); //温度转换

for(num=100;num>0;num--) //确保温度转换完成所需要的时间 reset(); //再次复位,等待从机应答 write_byte(0xCC); //忽略ROM匹配 write_byte(0xBE); //发送读温度命令 tem1=read_byte(); //读出温度低8 tem2=read_byte(); //读出温度高8位 shu=(tem2<<4|tem1>>4); //温度整数部分 aaa=(tem2*256+tem1)*6.25; //温度小数部分 temper=(int)aaa; //强制转换成整型 a1=temper/1000; //取温度十位 a2=temper00/100; //取个位 a3=temper0/10; //小数点后个位 a4=temper; //小数点后十位 }

4.3 DS18B20的接口实现

4.3.1 硬件设计

DS18B20在本次设计中接线图如图4.6 所示,实验板硬件图如图4.7所示 这次实验只焊了两个温度传感器而已,其他两个用法一样,留作外接口,可以方

便外用。

图4.6 DS18B20原理图 图4.7 DSB18B20硬件连接实物图

4.3.2 软件设计

根据DS18B20约定的通讯协议,每次使用DS18B20之前都必须经过三个步骤,即先复位DS18B20,接着发出ROM操作指令,然后才可以发出RAM操作指令以进行温度转换等命令。本系统将实现读出DS18B20的温度并实时显示到LCD12864上,分辨率为0.0625℃。由于DS18B20对时序要求很严格,所以在程序设计时,时序要多加注意一点,不过数字不是死的,只要控制合理控制也不是扫描大问题。 DS18B20首次初始化时开启温度转换,之后每1s进行一次DS18B20的温度读取和转换,具体实现效果图如图4.8 流程图如图4.9所示

图 4.8温度采集效果实物图