DS18B20温度采集与控制
DS18B20温控实验报告 - 副本

桂林航院电子工程系单片机课程设计与制作说明书设计题目:DS18B20数字温度计的设计专业:通信技术班级:学号:姓名:指导教师:2012年 6 月 28 日桂林航天工业学院单片机课程设计与制作成绩评定表单片机课程设计与制作任务书专业:通信技术学号: 2 姓名:一、设计题目:DS18B20数字温度计的设计二、设计要求:1.要求采集温度精确到度。
2.显示测量温度三、设计内容:硬件设计、软件设计及样品制作四、设计成果形式:1、设计说明书一份(不少于4000字);2、样品一套。
五.完成期限: 2010 年月日指导教师:贾磊磊年月日教研室:年月日目录一摘要 (1)设计要求 (1)二理论设计 (2)硬件电路计 (2)2.1.1芯片介绍 (2)2.1.2 DS18B20简介 (7)设计方案 (9)2.2.1.显示方案 (9)2.2.2.系统硬件电路设计 (11)2.2.3软件设计流程及描述 (11)三.系统的调试 (13).硬件的调试 (13)实验结果 (19)四、设计注意事项 (19)点阵设计注意事项 (20)单片机注意事项 (16)仿真器使用注意事项 (16)五.设计心得体会 (17)总结与体会 (17)摘要在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。
其中,温度控制也越来越重要。
在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。
采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而能够大大的提高产品的质量和数量。
因此,单片机对温度的控制问题是一个工业生产中经常会遇到的控制问题。
单片机是一种集CPU、RAM、ROM、I/O接口和中断系统等部分于一体的器件,只需要外加电源和晶振就可实现对数字信息的处理和控制。
因此,单片机广泛用于现代工业控制中。
本论文侧重介绍“单片机温度控制系统”的软件设计及相关内容。
基于DS18B20数字温度测量模块设计

基于DS18B20数字温度测量模块设计1.设计目的(1)掌握DS18B20数字温度传感器的工作原理及使用方法(2)掌握对DS18B20转换数据进行处理的方法(3)学习用数码管显示复杂数据的方法2.设计任务用AT89S52控制DS18B20,读取数据,并对DS18B20转换后的数据进行处理,最后在数码管上显示DS18B20测出的温度。
要求使用6位数码管显示,最高位为符号位,如果温度值为正,不显示,如果温度为负,则显示负号;第2—4位显示温度值的整数部分,并在第4位数据上显示小数点;第5位显示一位小数,最低位显示摄氏度符号“C”。
(1)基本要求a.用AT89C51控制DS18B20,读取数据b.对DS18B20转换后的数据进行处理,转换成实际温度值c. 将符号位,整数值和小数值分别存放在特定的存储单元中.(2)进阶要求在数码管上显示DS18B20测出的温度,只要求显示出温度值的整数部分及符号位。
(3)高级要求a.使用6位数码管显示测得的温度b.最高位为符号位,如果温度值为正,不显示,如果温度为负,则显示负号c.第2—4位显示温度值的整数部分,并在第4位数据上显示小数点d.第5位显示一位小数e.最低位显示摄氏度符号“C”3.DS18B20数字温度传感器概述DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
DS18B20产品的特点:a.只要求一个端口即可实现通信。
b.在DS18B20中的每个器件上都有独一无二的序列号。
c.实际应用中不需要外部任何元器件即可实现测温。
d.测量温度范围在-55。
C到+125。
C之间。
e.数字温度计的分辨率用户可以从9位到12位选择。
f.内部有温度上、下限告警设置。
TO-92封装的DS18B20的引脚排列见图4-2,其引脚功能描述见表4-1。
单总线温度传感器DS18B20简介

单总线温度传感器DS18B20简介DS18B20是DALLAS公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、搞干扰能力强、易配处理器等优点,特别适用于构成多点温度测控系统,可直接将温度转化成串行数字信号(提供9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片。
它具有3引脚TO-92小体积封装形式,温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
以上特点使DS18B20非常适用于远距离多点温度检测系统。
DS18B20外形及引脚说明外形及引脚如图2所示:图2 管脚排列图在TO-92和SO-8的封装中引脚有所不同,具体差别请查阅PDF手册,在TO-92封装中引脚分配如下:1(GND):地2(DQ):单线运用的数据输入输出引脚3(VDD):可选的电源引脚DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。
高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。
初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。
初始时,计数器1预置的是与-55℃相对应的一个预置值。
以后计数器1每一个循环的预置数都由斜率累加器提供。
为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。
计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。
DS18B20 测温系统

电子综合实践设计报告专业班级:学生姓名:指导教师:设计时间:物理与通信电子学院摘要DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单、体积小、低功耗、高精度、抗干扰能力强等特点的数字温度传感器。
本设计采用多点测温方法,在一个IO口上挂接多个DS18B20测温,在远距离工作时,为了防止信号的衰减,DS18B20用屏蔽双绞线包裹,远端接地的方法工作,并把所测得的温度在LCD上显示出来。
文中简要的介绍了DS18B20的基本特点、引脚功能、测温原理及时序的控制。
给出了DS18B20的使用电路、使用中的注意事项、硬件及软件设计方法。
经过测试,该系统的测量精度及速度等指标均能满足设计要求。
关键词:DS18B20 测温系统数字温度传感器多点测温目录摘要 (2)1 引言 (4)2 设计要求 (4)3 方案设计与原理 (4)3.1 DS18B20 简介 (4)3.1.1 DS18B20特性 (4)3.1.2说明: (5)3.1.3 DS18B20测温原理: (5)3.1.4 DS18B20测温原理图: (6)3.1.5 64位激光刻ROM (7)3.1.6 CRC发生器 (7)3.1.7 单总线系统 (7)3.2 DS18B20指令控制 (7)3.2.1 ROM时序指令控制 (8)3.2.2DS18B20功能指令控制 (8)3.3 18B20时序详解 (9)3.3.1初始化时序 (9)3.3.2读/写时序 (9)3.4二叉树遍历 (11)4 设计程序流程图: (16)5 设计硬件原理图 (17)6 DS18B20使用中应注意事项 (18)7测试中出现的问题及解决办法和说明: (18)8 结束语 (19)9 参考文献: (20)10 附录: (21)1 引言本系统利用DS18B20进行测温,基于单片机AT89S52进行温度控制,具有硬件电路简单,控温精度高、功能强,体积小,简单灵活等优点,可以应用于控制温度在-55℃到+125℃之间的各种场合,可以实现温度的实时采集、显示功能。
DS18B20 水温控制系统

DS18B20 水温控制系统(全)上个月参加的学校的电子设计大赛,说真的,参加完除了没有感受之外,剩下的感受就是很累。
我是计算机科学与技术学院的,按道理说电子大赛和我的专业根本就不怎么挂钩,不过我还是在同学的督促下“上当”了。
学校的那个信息工程的老师很奇怪,对我们专业好像及其有偏见,也怪不得他被扯下来,不让他教书了。
对我们也是非常有意见,讲说的那天,也是专门和我们做对。
这个温度控制,是用最小系统板做的。
因为我们不会硬件电路一些焊接等。
所以就找了个系统板来做.代码用了36个小时,文档用了18个小时完成。
差不多90%都是自己做的,所以我才说累。
由于代码是汇编做的,我是用Keil来调试代码的,还好最小系统板ME300B有在线仿真功能。
不过也调试了几乎100多次。
做完这个,学校还算给面子,应付我们一个三等奖。
然后他们大赛选一批人去北京培训,然后回来参加广东省的电子大赛,呵呵,当然我是被选上了,但是我从一开始不怎么想做这个,所以我不怎么想去,后来金山公司的暑假实习培训,录取了我,所以我就爽快的拒绝了去北京的那件事。
现在我觉得自己的决定还是很明智的。
呵呵,我只想做自己喜欢做的。
单片机是今年刚刚学的,然后就可以作出这么一个东西来,我觉得自己的脑子还好,至少吸收掌握的比较快,估计和我的基础有关系吧。
但是我的兴趣仍然是高级编程,Windows编程,毕竟自己学了很久了。
不想就这么放弃。
好废话不多说了,这个文档是我花了一个小时整理到博客上的,我觉得这个博客还是非常的COOL的,竟然没有字数限制。
呵呵喜欢。
以后就用你了。
这是我第一篇发表的文章,还希望大家多多留言,提出宝贵的意见。
目录一.引言...二.设计目的...三.系统功能...四.系统设备...五.温度控制总体方案与原理...1.系统模块图...2.系统模块总关系图...六.温度转换核心及其算法...1.温度传感器DS18B20原理与特性...DSl8B20的管脚及特点...DS18B20的内部结构...DS18B20的内存结构...DS18B20的测温功能...DSl820工作过程中的协议...温度传感器与单片机通讯时序...2.温度转换算法及分析...七.硬件设计说明...1.系统总体电路图...2.各个模块电路图...输入系统...输出系统...芯片系统...八.软件设计说明...1.总模块的流程图...2.各个模块的流程图...读取温度DS18B20模块的流程...键盘扫描处理流程...九.操作指引...按键功能...显示温度...设定温度...十.参考文献...程序源代码...一.引言在一些温控系统中,广泛采用的是通过热电偶、热电阻或PN结测温电路经过相应的信号调理电路,转换成A/D转换器能接收的模拟量,再经过采样/保持电路进行A/D转换,最终送入单片机及其相应的外围电路,完成监控。
DS18B20和ADC0832共同使用

DS18B20和ADC0832共同使用DS18B20是一款数字温度传感器,它采用单总线接口进行通信,只需要一个引脚就能完成数据的传输。
它具有精确的温度测量能力,温度范围为-55℃到+125℃,精度可达±0.5℃。
DS18B20芯片内部有一个ROM存储器,用于存储每个传感器的唯一序列号,可以通过读取序列号来区分不同的传感器。
ADC0832是一款8位模数转换器,它可以将模拟信号转换为数字信号。
ADC0832具有2个模拟输入通道和1个数字输出接口。
它采用串行通信方式与主控芯片进行数据传输,通过配置转换通道和启动转换命令,可以实现对模拟信号的采样和转换。
ADC0832具有较高的转换精度和采样速率,适用于多种数据采集和测量应用。
我们可以将DS18B20和ADC0832结合起来,实现对温度进行采集和转换。
具体实现步骤如下:1. 连接硬件:将DS18B20和ADC0832与主控芯片(如Arduino)连接。
DS18B20通过单总线接口连接到主控芯片的数字引脚,ADC0832通过串行通信接口连接到主控芯片的数字引脚。
确保连接正确,使得主控芯片能够与两个芯片进行通信。
2.初始化DS18B20:在程序中初始化DS18B20传感器,读取每个传感器的唯一序列号,并将其保存在变量中以供后续使用。
可以使用DS18B20的相关库函数来完成这些操作。
3.初始化ADC0832:在程序中初始化ADC0832,配置转换通道和采样参数。
可以使用ADC0832的相关库函数来完成这些操作。
4.温度采集:通过对DS18B20传感器发送读取温度的命令,获取温度值。
可以使用DS18B20的相关库函数来实现温度的读取。
5.模拟信号采集:通过对ADC0832发送启动转换的命令,开始模拟信号的采样和转换。
等待转换完成后,通过读取ADC0832的输出接口,获取转换后的数字信号。
可以使用ADC0832的相关库函数来实现这些操作。
6.数据处理:将获取到的温度值和模拟信号进行处理,可以进行数据显示、保存、传输等操作。
DS18B20温度传感器使用方法以及代码

第7章DS18B20温度传感器7.1 温度传感器概述温度传感器是各种传感器中最常用的一种,早起使用的是模拟温度传感器,如热敏电阻,随着环境温度的变化,它的阻值也发生线性变化,用处理器采集电阻两端的电压,然后根据某个公式就可以计算出当前环境温度。
随着科技的进步,现代的温度传感器已经走向数字化,外形小,接口简单,广泛应用在生产实践的各个领域,为我们的生活提供便利。
随着现代仪器的发展,微型化、集成化、数字化、正成为传感器发展的一个重要方向。
美国DALLS半导体公司推出的数字化温度传感器DS18B20采用单总线协议,即单片机接口仅需占用一个I/O端口,无需任何外部元件,直接将环境温度转化为数字信号,以数码方式串行输出,从而大大简化了传感器与微处理器的接口。
7.2 DS18B20温度传感器介绍DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。
与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
可以分别在93.75 ms和750 ms内完成9位和12位的数字量,并且从DS18B20读出的信息或写入DS18B20的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。
因而使用DS18B20可使系统结构更趋简单,可靠性更高。
他在测温精度、转换时间、传输距离、分辨率等方面较DS1820有了很大的改进,给用户带来了更方便的使用和更令人满意的效果。
1.DS18B20温度传感器的特性①独特的单线接口方式:DS18B20与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
②在使用中不需要任何外围元件。
③可用数据线供电,电压范围:+3.0~ +5.5 V。
④测温范围:-55 ~+125 ℃。
固有测温分辨率为0.5 ℃。
⑤通过编程可实现9~12位的数字读数方式。
ds18b20多路温度采集程序之欧阳引擎创编

本程序为ds18b20的多路温度采集程序,是我自己参考其他程序后改写而成,可显示4路正负温度值,并有上下限温度报警(声音、灯光报警)。
欧阳引擎(2021.01.01)亲测,更改端口即可使用。
(主要器件:51单片机,ds18b20,lcd显示器)附有proteus仿真图,及序列号采集程序/****上限62度下限-20度****/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit ds=P1^1;sbit rs=P1^4;sbit e=P1^6;sbit sp=P1^0;sbit d1=P1^2;sbit d2=P1^3;uchar lcdrom[4][8]={{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e}, {0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0},{0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7}}; unsigned char code table0[]={"TEMPERARTURE:U "}; unsigned char code table1[]={"0123456789ABCDEF"};int f[4];int tvalue;float ftvalue;uint warnl=320;uint warnh=992;/****lcd程序****/void delayms(uint ms)//延时{uint i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--);}void wrcom(uchar com)//写指令{delayms(1);rs=0;P3=com;delayms(1);e=1;delayms(1);e=0;}void wrdat(uchar dat)//写数据{rs=1;e=0;P3=dat;delayms(5);e=1;delayms(5);e=0;}void lcdinit()//初始化lcd{delayms(15);wrcom(0x38);delayms(5); wrcom(0x0c);delayms(5); wrcom(0x06);delayms(5);wrcom(0x01);delayms(5); }void display(uchar *p)//显示{while(*p!='\0'){wrdat(*p);p++;delayms(1);}}displayinit()//初始化显示{lcdinit();wrcom(0x80);display(table0);}/****ds18b20程序****/ void dsrst()//ds18b20复位{uint i;ds=0;i=103;while(i>0)i--;ds=1;i=4;while(i>0)i--;}bit dsrd0()//读一位数据{uint i;bit dat;ds=0;i++;ds=1;i++;i++;dat=ds;i=8;while(i>0)i--;return(dat);}uchar dsrd()//读1个字节数据{uchar i,j,dat;dat=0;for(i=8;i>0;i--){j=dsrd0();dat=(j<<7)|(dat>>1);}return(dat);}void dswr(uchar dat)//写数据{uint i;uchar j;bit testb;for(j=8;j>0;j--){testb=dat&0x01;dat=dat>>1;if(testb){ds=0;i++;i++;ds=1;i=8;while(i>0)i--;}else{ds=0;i=8;while(i>0)i--;ds=1;i++;i++;}}}void tmstart()//初始化ds18b20{sp=1;d1=1;d2=1;dsrst();delayms(1);dswr(0xcc);dswr(0x44);}void read_dealtemp()//读取并处理温度{uchar i,j,t;uchar a,b;for(j=0;j<4;j++){dsrst();delayms(1);dswr(0x55);for(i=0;i<8;i++){dswr(lcdrom[j][i]);//发送64位序列号}dswr(0xbe);a=dsrd();b=dsrd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0){d1=1;tvalue=~tvalue+1;wrcom(0xc0);wrdat(0x2d);if(tvalue>warnl){d2=0;sp=0;}else{d2=1;sp=1;}}else{d2=1;wrcom(0xc0); wrdat(' ');if(tvalue>warnh) {d1=0;sp=0;}else{d1=1;sp=1;}}if(j==0){wrcom(0x8e); wrdat('2'); }if(j==1){wrcom(0x8e); wrdat('3');}if(j==2){wrcom(0x8e); wrdat('4');}if(j==3){wrcom(0x8e);wrdat('5');}ftvalue=tvalue*0.0625;tvalue=ftvalue*10+0.5;ftvalue=ftvalue+0.05;f[j]=tvalue;//温度扩大十倍,精确到一位小数tvalue=f[j];t=tvalue/1000;wrcom(0x80+0x41);wrdat(table1[t]);//显示百位t=tvalue%1000/100;wrdat(table1[t]);//显示十位t=tvalue%100/10;wrdat(table1[t]);//显示个位wrdat(0x2e); //显示小数点儿t=tvalue%10/1;wrdat(table1[t]);//显示小数位delayms(5000);}}/****主函数****/void main(){d1=1;d2=1;sp=1;displayinit();//初始化显示while(1){tmstart();//初始化read_dealtemp();//读取温度}}/****序列号读取程序****/#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit DQ = P1^1; //温度传感器信号线sbit rs = P1^4; //LCD数据/命令选择端(H/L)位声明sbit lcden = P1^6; //LCD使能信号端位声明void delay(uint z); //延时函数void DS18B20_Reset(void); //DQ18B20复位,初始化函数bit DS18B20_Readbit(void); //读1位数据函数uchar DS18B20_ReadByte(void); //读1个字节数据函数void DS18B20_WriteByte(uchar dat); //向DQ18B20写一个字节数据函数void LCD_WriteCom(uchar com); //1602液晶命令写入函数void LCD_WriteData(uchar dat); //1602液晶数据写入函数void LCD_Init(); //LCD初始化函数void Display18B20Rom(char Rom); //显示18B20序列号函数/**********************************************//* 主函数 *//**********************************************/void main(){ uchar a,b,c,d,e,f,g,h;LCD_Init();DS18B20_Reset();delay(1);DS18B20_WriteByte(0x33);delay(1);a = DS18B20_ReadByte();b = DS18B20_ReadByte();c = DS18B20_ReadByte();d = DS18B20_ReadByte();e = DS18B20_ReadByte();f = DS18B20_ReadByte();g = DS18B20_ReadByte();h = DS18B20_ReadByte();LCD_WriteCom(0x80+0x40);Display18B20Rom(h);Display18B20Rom(g);Display18B20Rom(f);Display18B20Rom(e);Display18B20Rom(d);Display18B20Rom(c);Display18B20Rom(b);Display18B20Rom(a);while(1);}/***************************************************//* 延时函数:void delay() *//* 功能:延时函数*//***************************************************/void delay(uint z)//延时函数{uint x,y;for( x = z; x > 0; x-- )for( y = 110; y > 0; y-- );}/***************************************************//* DS18B20函数:void DS18B20_Reset() *//* 功能:复位18B20 *//***************************************************/void DS18B20_Reset(void)//DQ18B20复位,初始化函数{uint i;DQ = 0;i = 103;while( i > 0 ) i--;DQ = 1;i = 4;while( i > 0 ) i--;}/***************************************************//* DS18B20函数:void DS18B20_Readbit() *//* 功能:读1个字节数据函数*//***************************************************/bit DS18B20_Readbit(void) //读1位数据函数{uint i;bit dat;DQ = 0;i++; //i++起延时作用DQ = 1;i++;i++;dat = DQ;i = 8;while( i > 0 )i--;return( dat );}/***************************************************//* DS18B20函数:void DS18B20_ReadByte() *//* 功能:读1个字节数据函数*//***************************************************/uchar DS18B20_ReadByte(void) //读1个字节数据函数{uchar i,j,dat;dat = 0;for( i = 1; i <= 8; i++ ){j = DS18B20_Readbit();dat = ( j << 7 ) | ( dat >> 1 );}return(dat);}/***************************************************//* DS18B20函数:void DS18B20_WriteByte() *//* 功能:向DQ18B20写一个字节数据函数*//***************************************************/void DS18B20_WriteByte(uchar dat) //向DQ18B20写一个字节数据函数{uint i;uchar j;bit testb;for( j=1; j<=8; j++){testb = dat&0x01;dat= dat>>1;if(testb) //写1{DQ = 0;i++;i++;DQ = 1;i = 8;while(i>0)i--;}else{DQ = 0; //写0i = 8;while(i>0)i--;DQ = 1;i++;i++;}}}/***********************************************//* LCD函数:void LCD_WriteCom() *//* 功能:向LCD写入命令 */ /***********************************************/void LCD_WriteCom(uchar com){rs = 0;P3= com;delay(5);lcden = 0;delay(5);lcden = 1;delay(5);lcden = 0;}/***********************************************//* LCD函数:void LCD_WriteData(uchar dat) */ /* 功能:向LCD写入数据 *//***********************************************/void LCD_WriteData(uchar dat){rs = 1; //选择LCD为写入数据状态lcden = 0;P3= dat; //将待写入数据放到总线上delay(5);lcden = 1; //给LCD使能端一个脉冲delay(5); //信号将之前放到总线上lcden = 0; //的数据写入LCDdelay(5);}/***********************************************//* LCD函数:void LCD_Init() *//* 功能:初始化LCD,设定LCD的初始状态*//***********************************************/void LCD_Init(){LCD_WriteCom(0x38); //LCD显示模式设定delay(15);LCD_WriteCom(0x08); //关闭LCD显示delay(3);LCD_WriteCom(0x01); //LCD显示清屏delay(3);LCD_WriteCom(0x06); //设定光标地址指针为自动加1delay(3);LCD_WriteCom(0x0c); //打开LCD显示,但不显示光标}/**********************************************//* *//* 显示18B20序列号 *//* *//**********************************************/void Display18B20Rom(char Rom){uchar h,l;l = Rom & 0x0f; //取低4位h = Rom & 0xf0; //取高4位h >>= 4;if( ( h >= 0x00 )&&( h <= 0x09 ) )LCD_WriteData(h+0x30); //取ASCII码 elseLCD_WriteData(h+0x37); //取ASCII码 if( ( l >= 0x00 )&&( l <= 0x09 ) )LCD_WriteData(l+0x30); //取ASCII码 elseLCD_WriteData(l+0x37); //取ASCII码}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(3)发送 DS18B20 功能指令。
指令名称 温度转换
指令代码 44H
指令功能 启动 DS18B20 温度转换,最长 750ms,结果存于内部 9 字节 RAM
-1-
写暂存器
4EH
读暂存器 复制暂存器 重调 EEPROM 读供电模式
BEH 48H B8H B4H
发此命令后,可向内 RAM 发 3 个字节,1st 是 TH,2st 是 TL, 3st 配置寄存器 发此命令后,依次读出内 RAM 中 0~8 字节的内容,低位在前。 复制 2、3、4 字节的内容到 EEPROM 中 EEPROM 中的内容恢复到 2、3、4 字节 当 DS18B20 寄生供电时为“0”,外部电源供电为“1”
要想完成一次测温任务,首先需要主 MCU 指挥 DS18B20 进行一次温度转换,待转换完 成后,再让主 MCU 读取 DS18B20 内部 RAM 中的温度数据。具体操作如下:
(1)主 MCU 控制“1-Wire”总线进行复位初始化。参见“对 DS18B20 进行复位初始 化”操作。
(2)主 MCU 发送跳过 ROM 的操作(CCH)命令。 (3)主 MCU 发送转换温度的操作(44H)命令,后面释放总线至少 750 毫秒,让 DS18B20 完成转换的操作。 (4)主 MCU 发出复位操作并接收 DS18B20 的应答(存在)脉冲。 (5)主 MCU 发送跳过 ROM 的操作(CCH)命令。 (6)主 MCU 发送读取 RAM 的命令(BEH),随后主机依次读取 DS18B20 发出的从第 0 一第 8,共九个字节的数据。如果只想读取温度数据,那在读完第 0 和第 1 个数据后即丢 掉(不读)后续字节的内容。 上述操作中,涉及到主 MCU 对 DS18B20 的写(发送)操作和读(读取)操作,下文将 介绍如何完成这两种操作方法。 写操作:写操作周期最少为 60 微秒,最长不超过 120 微秒。写周期开始时,主机先把总 线拉低 1 微秒表示写周期开始。之后主机若想写 0,则继续拉低电平最少 60 微秒直至写周期 结束,然后释放总线为高电平。主机若想写 1,则拉低总线电平 1 微秒后就释放总线为高电 平,一直到写周期结束。 作为从机的 DS18B20 在检测到总线被拉低后等待 15 微秒然后从 15us 到 60us 开始对总 线采样,在采样期内总线为高电平则为 1,若采样期内总线为低电平则为 0。如下图所示。
//two byte compose a int variable
temp=temp|a;
//tt=temp*0.0625; //算出来的是测到的温度,数值可到小数点后两位
//temp=tt*10+0.5; //为了显示温度后的小数点后一位并作出四舍五入,因为取值运算不
能取小数点后的数
tt=temp*(0.0625*10)+0.5; temp=tt; return temp; }
void tmpwritebyte(uchar dat) //写 1 字节
{
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0; _nop_();
//延时 1us
_nop_(); //延时 1us
-4-
dat=DS; delay10us(1); //延时 10us return (dat); }
uchar tmpread(void) //读 1 字节 8 位 {
uchar i,j,dat; dat=0; for(i=1;i<=8;i++) {
j=tmpreadbit(); dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在 DAT 里 } return(dat); }
1.DS18B20 的测温时序
DS18B20 的温度采集
DS18B20 测温传感器通过“1-Wire”总线通信,其功能是分时完成的,他有严格的时序 概念,如果出现时序混乱,“1-Wire”器件将不响应主机,因此读写时序很重要。MCU 对 DS18B20 的各种操作必须按协议进行。根据 DS18B20 的协议规定,微控制器控制 DS18B20 完成温度的转换必须经过以下 3 个步骤:
-8-
-9-
wei1=1;
//显示百位
wei2=0;
wei3=0;
wei4=0;
wei5=0;
wei6=0;
P0=table[bai];
delay(2);
wei1=0;
//显示十位
wei2=1;
wei3=0;
wei4=0;
wei5=0;
wei6=0;
P0=table1[shi1];
delay(2);
wei1=0;
//百位 //十位 //个位
//define interface // variable of temperature
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //
void display(uint temp)
//显示程序
{
uchar bai,shi1,shi0,ge; bai=temp/100;//温度数值上为十位
-6-
shi0=temp%100;//温度数值上为几点几 shi1=shi0/10;//温度上为个位,并且显示时需要加小数点 ge=shi0%10;//温度上为小数位,并已经四舍五入
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};
//
void delay10us(uint t){
-3-
TR1=1; while(t--) {
while(!TF1); TF1=0; }
TR1=0; }
读操作:对于读数据,操作时序也分为读“0”和读“1”两个过程。读时序时,主机先 把总线拉低,在 1 微秒之后释放单总线为高电平,DS18B20 在检测到总线被拉低 1 微秒后,
-2-
便开始送出数据(即 DS18B20 把数据传输到总线上)。若是要送出 0 就把总线拉为低电平直 到读周期结束。若要送出 1 则释放总线为高电平。
uint tmp()
//读取温度
{ uint tt; uchar a,b; dsreset(); delay10us(30); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread();//低八位
b=tmpread();//高八位
temp=b;
temp<<=8;
(1)对 DS18B20 进行复位初始化。复位要求主 MCU 将数据线下拉 480us~960us,本任 务下拉时间为 600us,然后释放,DS18B20 收到信号后等待 15us~60us 左右,然后发出 60us~240us 的低脉冲,主 MCU 收到此信号后表示复位成功。如下图所示。
(2)发送 ROM 指令。ROM 指令共 5 条,如下表所示。
void delay(uint count) {
uint i; while(count) {
i=200; while(i>0) i--; count--; } }
//delay
void dsreset(void) {
//初始化
DS=0; delay10us(60); DS=1; 后将总线拉低 delay10us(6); while(DS); }
指令名称 搜索 ROM 读 ROM 匹配 ROM 跳过 ROM 警报搜索
指令代码 F0H 33H 55H CCH ECH
指令功能 用于确定挂在同一总线上从机的个数和识别 64 位 ROM 地址 读从机的 64 位 ROM 编码 发此命令后,接着发 64 位 ROM 编码,访问与编码对应的从机 忽略 64 位 ROM 编码,直接向从机温度转换指令,适合单从机 发此指令,只有温度超过设定值上/下限的从机做出响应
do {
tmpchange();//让 18b20 开始转换温度 for(a=100;a>0;a--) {
display(tmp());
}
if(tmp()>410) {Tcon=0;} if(tmp()<390) {Tcon=1;} else {Tcon=0;} }while(1); }
// 大于 41 摄氏度,停止加热 // 小于 39 摄氏度,开始加热 //其他温度
DS=1;
delay10us(6); //延时 10us
}
else
{
DS=0;
//write 0
delay10us(6); //延时 10us
DS=1; _nop_();
//延时 1us
-5-
_nop_(); }
//延时 1us
} }
void tmpchange(void) //温度转换 {
dsreset(); delay10us(30); tmpwritebyte(0xcc); // address all drivers on bus tmpwritebyte(0x44); // initiates a single temperature conversion }
主机在开始拉低总线 1 微秒后释放总线,然后在包括前面的拉低总线电平 1 微秒在内的 15 微秒时间内完成对总线进行采样检测,采样期内总线为低电平则为 0。采样期内总线为高 电平则为 1。完成一个读时序过程,至少需要 60us 才能完成。如下图所示。