DS18B20单总线多点式测温系统教学文案

合集下载

18B20单总线多点式测温系统设计

18B20单总线多点式测温系统设计

18B20单总线多点式测温系统设计1.DS18B20的概述1.1,DSl8B20的外部管脚及特点DS18B20可编程温度传感器有3个管脚。

GND为接地线,DQ为数据输入输出接口,通过一个较弱的上拉电阻与单片机相连。

VDD为电源接口,既可由数据线提供电源,又可由外部提供电源,范围3.O~5.5 V。

本文使用外部电源供电。

主要特点有:1. 用户可自设定报警上下限温度值。

2. 不需要外部组件,能测量-55~+125℃范围内的温度。

3. -10℃~ +85℃范围内的测温准确度为±0.5℃。

4. 通过编程可实现9~l2位的数字读数方式,可在至多750 ms内将温度转换成12 位的数字,测温分辨率可达0.0625℃。

5. 独特的单总线接口方式,与微处理器连接时仅需要一条线即可实现与微处理器双向通讯。

1.2 DS18B20的内部结构DS18B20内部功能模块如图2所示,主要由4部分组成:64位光刻R0M(图3)、温度传感器、非易失性的温度报警触发器TH和TL、配置寄存器。

R0M 中的64位序列号是出厂前被光刻好的,他可以看作是该DSISB20的地址序列码,每个DSI8B20的64位序列号均不相同。

高低温报警触发器TH 和TL,配置寄存器均由一个字节的E2PROM组成,使用一个存储器功能命令可对TH,TL或配置寄存器写入。

配置寄存器中R1,R0决定温度转换的精度位数:R1R0=’00’,9位精度,最大转换时间为93.75 ms;R1R0 = ‘01’,10位精度,最大转换时间为187.5 ms;R1R0 = ‘10’,11位精度,最大转换时间为375 ms;R1R0 =’11’,12位精度,最大转换时间为750 ms;未编程时默认为12位精度。

本系统采用的也是12位的精度。

1.3,DS18B20的内存结构DSI8B20温度传感器的内部存储器包括一个高速暂存RAM (便笺式的内部存储器)和一个非易失性的可电擦除的EEPROM,后者存放高温和低温触发器TH,TL和结构寄存器。

基于ds18b20的多点测温教材

基于ds18b20的多点测温教材

基于DS18B20的单总线多点测温系统、摘要:本文主要介绍了一个基于DS18B20单片机的测温系统,详细描述了传感器在单片机下的硬件连接,软件编程以及各模块系统流程进行了详尽分析,特别是数字温度传感DS18B20的数据采集过程。

对各部分的电路也一一进行了介绍,该系统可以方便的实现实现温度采集和显示,它使用起来相当方便,具有精度高、量程宽、灵敏度高、体积小、功耗低等优点,适合于我们日常生活和工、农业生产中的温度测量,也可以当作温度处理模块嵌入其它系统中,作为其他主系统的辅助扩展。

DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。

随着社会的进步和工业技术的发展,人们越来越重视温度因素,许多产品对温度范围要求严格,而目前市场上普遍存在的温度检测仪器大都是单点测量,同时有温度传递不及时、精度不够的缺点,不利于工业控制者根据温度变化及时作出决定。

在这样的形式下,开发一种能够同时测量多点,并且实时性高、精度高,能够综合处理多点温度信息的测量系统就很有必要关键词:DS18B20,AT89c51,多点测温一、任务分工:表1—1 任务分工表二、功能描述:1.使用前程序读取序列号,一次性写入代码中。

此系统写入了三个传感器的序列号。

2.上电,显示“welcome”开机画面。

3.按键1功能选择键,可以选择显示相应的节点,显示所有节点温度,显示平均温度。

4.按键2确认键,按键1选择相应的界面后,按确认键,,同时对传感器进行数据采集,并显示温度。

三、方案选择:一)总线方案:方案一:单端口单总线的多点测温典型应用如图所示,所有DS18B20并联后其数据线连接到处理器的一个端口线上,显著特点是只占用单片机的一个端口。

每个DS18B20内部均有一个唯一的64位序列号,在工作之前先将主系统与DS18B20逐个连接,分别读出序列号并存储在单片机中,根据序列号就可以对同一总线上多个DS18B20进行识别控制,分别读取其温度。

基于DS18B20数字温度传感器的温度检测系统课程设计报告

基于DS18B20数字温度传感器的温度检测系统课程设计报告

毕业论文声明本人郑重声明:1.此毕业论文是本人在指导教师指导下独立进行研究取得的成果。

除了特别加以标注地方外,本文不包含他人或其它机构已经发表或撰写过的研究成果。

对本文研究做出重要贡献的个人与集体均已在文中作了明确标明。

本人完全意识到本声明的法律结果由本人承担。

2.本人完全了解学校、学院有关保留、使用学位论文的规定,同意学校与学院保留并向国家有关部门或机构送交此论文的复印件和电子版,允许此文被查阅和借阅。

本人授权大学学院可以将此文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本文。

3.若在大学学院毕业论文审查小组复审中,发现本文有抄袭,一切后果均由本人承担,与毕业论文指导老师无关。

4.本人所呈交的毕业论文,是在指导老师的指导下独立进行研究所取得的成果。

论文中凡引用他人已经发布或未发表的成果、数据、观点等,均已明确注明出处。

论文中已经注明引用的内容外,不包含任何其他个人或集体已经发表或撰写过的研究成果。

对本文的研究成果做出重要贡献的个人和集体,均已在论文中已明确的方式标明。

学位论文作者(签名):年月关于毕业论文使用授权的声明本人在指导老师的指导下所完成的论文及相关的资料(包括图纸、实验记录、原始数据、实物照片、图片、录音带、设计手稿等),知识产权归属华北电力大学。

本人完全了解大学有关保存,使用毕业论文的规定。

同意学校保存或向国家有关部门或机构送交论文的纸质版或电子版,允许论文被查阅或借阅。

本人授权大学可以将本毕业论文的全部或部分内容编入有关数据库进行检索,可以采用任何复制手段保存或编汇本毕业论文。

如果发表相关成果,一定征得指导教师同意,且第一署名单位为大学。

本人毕业后使用毕业论文或与该论文直接相关的学术论文或成果时,第一署名单位仍然为大学。

本人完全了解大学关于收集、保存、使用学位论文的规定,同意如下各项内容:按照学校要求提交学位论文的印刷本和电子版本;学校有权保存学位论文的印刷本和电子版,并采用影印、缩印、扫描、数字化或其它手段保存或汇编本学位论文;学校有权提供目录检索以及提供本学位论文全文或者部分的阅览服务;学校有权按有关规定向国家有关部门或者机构送交论文的复印件和电子版,允许论文被查阅和借阅。

基于C51的DS18B20多点测温系统

基于C51的DS18B20多点测温系统

基于C51的DS18B20多点测温体系2013-07-22目次摘要3第一章绪论41.1 开宣布景及意义4第二章体系硬件设计52.1 单片机52.2 DS18B20温度测量模块52.3 液晶显示模块8第三章体系软件设计103. 1体系初始化103.2 温度测量程序11第四章体系仿真调试124.1 体系仿真调试12附录14摘要本文介绍了基于温度传感器DS18b20与AT89C52单片机构成的多点温度散布式测温体系.设计了其体系构成和软件计划.该体系面向现实需求,设定DS18b20温度规模为-55℃~+125℃,采取LCD1602液晶显示屏,显示两路温度传感器的测量温度值.同时经由过程串口通信与PC机进行通信.传输收集到的温度值.现实运用标明.该体系构造简略,抗干扰才能强,合适于良好情形下现场温度的测量,可运用于仓库测温.楼宇空调掌握和临盆进程监控等范畴.症结词:DS18b20,散布式,1602 串口通第一章绪论1.1 开宣布景及意义温度的测量和掌握在储粮仓库.智能楼宇空调掌握及其他的工农业临盆和科学研讨中运用普遍.传统的温度检测是运用诸如热电偶.热电阻.半导体pn结之类的模仿传感器,经旌旗灯号取样电路.放大电路和模数转换电路处理,获取暗示温度值的数字旌旗灯号,再交由微处理器.因为检测情形庞杂,测量点多,旌旗灯号传输距离远及各类干扰的影响,使得传统测量体系的稳固性和靠得住性降低.近年来跟着单片机的成长和传感器技巧的改革,温度检测范畴也完成了从模仿旌旗灯号到数字旌旗灯号的改变.DS18b20温度传感器的普遍运用更是推进了这一范畴的成长.别的液晶显示模块具有体积小.功耗低.显示内容丰硕.超薄轻盈等长处在各类内心和显示体系中得到越来越多的运用,如今也是单片机运用设计中最经常运用的信息显示模块.分解以上产品的成长特色,愿望温度检测体系在将来的成长中有更辽阔的运用空间并且具有更好的现场测量优胜性.第二章体系硬件设计本体系经由过程DS18B20温度传感器收集温度值,经由单片机处来由液晶显示模块显示当前温度值,并经由串口通信将温度传送到PC上2.1 单片机本体系采取AT89C52单片机作为微处理器.AT89C52单片机是ATMEL公司89系列单片机的一种8位Flash单片机.它最大的特色是片内含有8k可反复编程的Flash存储器,可进行1000次的擦写操纵.别的AT89c52单片机采取ATMEL高密度非易掉存储器制作技巧制作,与工业尺度的MCS-51指令集和输出管脚相兼容,并且其兼具省电耐用.机能稳固的特色,是以成为单片机市场的主流产品.本体系采取晶振依据须要肯定体系工作频率为11.0592Mhz.2.2 DS18B20温度测量模块DS18b20是美国DALLAS公司推出的单总线数字化测温集成电路,它具有奇特的单线接口方法,将非电模仿量温度值转换为数字旌旗灯号串行输出仅需占用1位I/O端口,可以或许直接读取被测现场的温度值.它体积小,电压实用规模宽(3v~5v),且可经由过程编程实现9~12位的温度读数,即具有可调的温度分辩率,是以实用性和靠得住性较高,运用普遍.以下是DS18b20的内部构造图.1DS18b20的内部构造图DS18B20有4个重要的数据部件:① 64位激光ROM.64位激光ROM从高位到低位依次为8位CRC.48位序列号和8位家族代码(28H)构成.②温度敏锐元件.③非易掉性温度报警触发器TH和TL.可经由过程软件写入用户报警高低限值.④设置装备摆设存放器.设置装备摆设存放器为高速暂存存储器中的第五个字节.DS18B20在0工作时按此存放器中的分辩率将温度转换成响应精度的数值.DS18B20的测温规模为-55℃~+125℃,在-10℃~+85℃规模内,精度为±℃.在电压低于3.4v时精度误差较大.依据当时序特色以下是DS18B20与AT89C52单片机构成的温度监测体系如下图2.温度监测体系DS18b20的典范运用在本体系中两个温度传感器与单片机衔接方法如下:图2.2.3 传感器与单片机衔接本体系为多点温度测试.DS18B20采取外部供电方法,理论上可以在一根数据总线上挂256个DS18B20,但现实运用中发明,假如挂接20个以上的DS18B20就会产生功耗问题.别的单总线长度也不宜超出0.5M,不然会影响到数据的传输.在本电路板的设计中斟酌到初步实践的精确性,暂运用2个DS18B20分离衔接单片机的p2.6口.对DS18B20的设计,须要留意以下问题(1)对硬件构造简略的单线数字温度传感器DS18B20 进行操纵,须要用较为庞杂的程序完成.编制程序时必须严厉按芯片数据手册供给的有关操纵次序进行,读.写时光片程序要严厉按请求编写.尤其在运用DS18B20 的高测温分辩力时,对时序及电气特征参数请求更高.(2)现实运用时,要留意单线的驱动才能,不克不及挂接过多的DS18B20,同时还应留意最远接线距离.别的还应依据现实情形选择其接线拓扑构造.2.3 液晶显示模块本体系运用的是1602液晶显示模块.1602液晶显示器以其微功耗.体积小.显示内容丰硕.超薄轻盈.位数多.程序简略的诸多长处,在各类内心和低功耗体系中得到普遍的运用.依据显示内容可以分为字符型液晶,图形液晶.依据显示容量又可以分为单行16字,2行16字,两行20字等等.在本体系中运用的是字符型两行16字液晶显示器.在与单片机衔接时运用接口电路(排针)相连,为并行通信.以下是1602液晶显示器外型图和液晶显示的典范运用.图2 液晶显示器外形图1602液晶显示采取尺度的16脚接口,个中:(模块不和有标注)图2.3.2 串口通信第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器比较度调剂端,接正电源时比较度最弱,接地电源时比较度最高,比较渡过高时会产生“鬼影”,运用时可以经由过程一个10K的电位器调剂比较度第4脚:RS为存放器选择,高电日常平凡选择数据存放器.低电日常平凡选择指令存放器.第5脚:RW为读写旌旗灯号线,高电日常平凡进行读操纵,低电日常平凡进行写操纵.当RS和RW合营为低电日常平凡可以写入指令或者显示地址;当RS为高电平.RW为低电日常平凡可以写入数据.第6脚:E端为使能端,当E端由高电平跳变成低电日常平凡,液晶模块履行敕令.第7~14脚:D0~D7为8位双向数据线.第15~16脚:空脚1602液晶模块内部的字符产生计储器(CGROM)已经存储了不合的点阵字符图形,这些字符有,阿拉伯数字.英文字母的大小写.经常运用的符号.和日文化名等,每一个字符都有一个固定的代码,个中数字与字母同ASCII码兼容.UART是一种通用串行数据总线,用于异步通信.该总线双向通信,可以实现全双工传输和吸收.实现单片机和PC机的通信工作,接一个MAX232 实现电平转化.电路图如下:第三章体系软件设计图3 体系流程图全部体系的功效是由硬件电路合营软件来实现的,当硬件根本定型后,软件的功效也就根本定下来了.本体系主程序重要包含三个子程序,分离为液晶显示子程序,温度测量子程序,串口通信子程序.主体软件架构如左图:3. 1体系初始化体系初始化重要包含UART初始化,液晶显示初始化,温度传感器初始化.UART初始化包含界说准时器/计数器和串行口的工作方法,界说T1为主动重装8位计数器.液晶显示初始化主如果肯定液晶显示器的工作方法.显示开关.光标开关等.温度传感器初始化包含一个由总线掌握器发出的复位脉冲和跟有厥后由传感器发出的消失脉冲.消失脉冲是让总线掌握器知道DS18b20在总线上且已预备好操纵.一个复位脉冲跟着一个消失脉冲标明DS18b20已经预备好发送和吸收数据.以下是初始化序列图.图3.1.1 初始化序列图3.2 温度测量程序温度测量程序主如果DS18b20与单片机之间的ROM操纵敕令和DS18b20的数据读写操纵敕令.当单片机对DS18B20进行初始化,检测到一个消失脉冲后,发出匹配ROM敕令,然后发送ROM码.图3.2.1 DS18b20根本工作流程第四章体系仿真调试4.1 体系仿真调试在keil开辟情形下不克不及进行有用的仿真调试,所以在体系中采取protues单片机仿真对象进行仿真调试.下图为protues仿真读取温度后在LCD1602液晶屏上的显示成果.图4.1..1protues仿真图上位机用串口调试软件来仿真,装配了虚拟串口驱动软件和PROTEUS进行调试仿真.虚拟串口驱动软件用了VSPD 软件.VSPD软件在Window操纵体系上增长了一对在逻辑上交叉互相的虚拟串口,使串口调试助手可以或许和PROTEUS中的单片机串口相连.VSPD软件界面如下:串口仿真成果如下:在串口调试助手上显示两个温度传感器收集到的温度附录温度收集体统道理图PCB图源代码1602函数部分:#define Port P1sbit RS = P2^0; //界说端口sbit RW = P2^1;sbit E = P2^2;/**************************************************************** 微秒延时函数****************************************************************/ void delay_us(unsigned int n) //延时假如须要高精度延时{if (n == 0){return ;}while (--n);}/****************************************************************/ /* 毫秒函数声明 *//****************************************************************/ void delay_ms(unsigned char i){unsigned int b;while(i--)for (b = 1; b < 1000 ; b++) ;}/****************************************************************/ /* 写入敕令函数 *//***************************************************************/ void LCD_write_com(unsigned char com){RS = 0;E = 1;Port = com;delay_us(10);E = 0;}/****************************************************************/ /* 写入数据函数 *//****************************************************************/ void LCD_write_Data(unsigned char Data){RS = 1 ;RW = 0 ;E = 1 ;Port = Data;delay_us(10);E = 0;}/****************************************************************/ /* 写入字符串函数 *//****************************************************************/ void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s){if (y == 0){LCD_write_com(0x80 + x);}else{LCD_write_com(0xc0 + x);while (*s){LCD_write_Data( *s);s++;}}/****************************************************************/ /* 初始化函数 *//****************************************************************/ void LCD_init(void){delay_ms(40);LCD_write_com(0x38); /*显示模式设置*/delay_ms(5);LCD_write_com(0x38);delay_ms(5);LCD_write_com(0x38);delay_ms(5);LCD_write_com(0x38);LCD_write_com(0x08); /*显示封闭*/LCD_write_com(0x01); /*显示清屏*/LCD_write_com(0x06); /*显示光标移动设置*/delay_ms(5);LCD_write_com(0x0C); /*显示开及光标设置*/}/***********************************************************函数名: Display_F函数解释:打印整数型数据,没有地址传入参数:用于Display_float运用传出参数:无返回值:无**********************************************************/void Display_F(unsigned int num){unsigned char sever_num[6],i = 0;if(num == 0)LCD_write_Data(0x30);else{while(num != 0){sever_num[i++] = num % 10 + 0x30 ;num /= 10 ;}while(i--){LCD_write_Data(sever_num[i]);delay_us(500);}}}/***********************************************************函数名: Display_float函数解释:打印浮点型数据,传入参数:打印地址x,y,数据num,小数点后面打印length位传出参数:无返回值:无**********************************************************/void Display_float(unsigned char x,unsigned char y,float numf,unsigned char length){unsigned long Int_num;unsigned int temp = 1;unsigned char i = 0;for (i = 0 ; i < length ; i++){numf *= 10 ;temp *= 10 ;}if (y == 0)LCD_write_com(0x80 + x);elseLCD_write_com(0xc0 + x);Int_num = (long)numf;Display_F(Int_num / temp);LCD_write_Data('.');Display_F(Int_num % temp);}DS18B20函数部分:bit flag = 0;sbit dat=P2^6;uchar xl[2][8] = {{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e},{0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9}}; //两路DS18B20 ROM码void dsdelay(uchar z) //误差 0us{unsigned char a,b;for(z;z>0;z--)for(b=1;b>0;b--)for(a=2;a>0;a--);}void delay(unsigned int z)//延时函数{uchar x,y;for(x=z;x>0;x--)for(y=101;y>0;y--);}///////////////////////////////////////////////DS18B20函数部分////////////void dsinit()//DS18B20初始化{dat=1;dsdelay(4);dat=0; //给一个脉冲旌旗灯号dsdelay(50);//低脉冲旌旗灯号要保持480us——960usdat=1;//拉高dsdelay(9);//略微延时delay(1);}uchar read()//DS18B20 读一个字节{uchar i,k;for (i=8;i>0;i--){dat = 0; // 给脉冲旌旗灯号k>>=1;//将读到的一位数向后移一位dat = 1; // 给脉冲旌旗灯号if(dat) k|=0x80;//假如读到的是1,则,k和0x80进行或运算,首位变成1dsdelay(4);//每位读取中央距离大于1us}return(k);}void write(uchar date)//DS18B20 写一个字节{uchar i,k;k=date;for(i=0;i<8;i++){dat = 0;dat = k&0x01;dsdelay(7);dat = 1;k>>=1;dsdelay(1);}}float read_tempe(uchar num)//从DS18B20存储器中念书温度{int t;float tt;uchar a,b,i;dsinit();//每次对DS18B20输入指令都要先辈行初始化操纵write(0x55);//写序号列号for (i = 0 ; i < 8 ; i++){write(xl[num][i]) ;}write(0x44); // 启动温度转换dsinit();write(0x55);//写序号列号for (i = 0 ; i < 8 ; i++){write(xl[num][i]) ;}write(0xBE); //读取温度存放器等(共可读9个存放器)前两个就是温度a=read();//读出温度的低八位b=read();//读出温度的高八位t=b;t<<=8;//t是int,16位,讲高八位移到前面t=t|a;//将温度的高位与低位归并if ((b & 0x80 )== 0)//断定正负温度{tt=t*0.0625;//将带有小数点位的十六进制数化为十进制flag = 0;}else{tt=(~t + 1 )* 0.0625;flag = 1;}return(tt);}UART函数部分:void InitUART(void)//UART 初始化{TMOD = 0X20; //11.0592M 9600SCON = 0X50;TH1 = 0xfd;TL1 = 0xfd;PCON = 0X00;EA = 1;ES = 1;TR1 = 1;}void Send(unsigned char C)//UART 发送{SBUF = C;while(TI == 0);TI = 0;}主函数部分:uchar lable[]="TEMPE: 'C";//初始显示void Send_Tempe( float tempe,unsigned char num)//串口发送收集到的温度{unsigned long t ;unsigned char i ;unsigned char tt[]="NUM 0 TEMPE 12.50'C\n";tt[4] = num +0x30;tempe = tempe * 100 ;t = (unsigned int) tempe;tt[17] = t%10+0x30;t = t/10 ;tt[16] = t%10+0x30;t = t/10 ;tt[14] =t%10+0x30;t = t/10 ;tt[13] =t%10 +0x30;if(flag == 1)tt[12] = '-';for(i = 0 ; i < 22 ; i++)Send(tt[i]);}void main(){float tempe;unsigned char i;InitUART() ;LCD_init() ;LCD_write_str(0,0, lable);LCD_write_str(0,1, lable);while(1){for (i = 0; i < 2;i++ ){tempe = read_tempe(i);if(flag == 1)LCD_write_str(6,i, "-");elseLCD_write_str(6,i, " ");Display_float(7,i,tempe,2);Send_Tempe(tempe,i) ;delay(10000);}}。

单片机课程方案设计书之基于DS18B20的多点温度测量系统的方案设计书

单片机课程方案设计书之基于DS18B20的多点温度测量系统的方案设计书

姓名:班级:学号:指导老师:日期:引言在粮库测温系统、冷库测温系统、智能化建筑控制系统、中央空调系统等多种系统中都需要多点温度测量系统。

因此,多点温度测量技术实现尤为重要。

美国Dallas公司推出的数字温度传感器DSl8B20,电源供电范围在3.0~5.5V;温度测量范围为-55~+125℃;具有独特的单总线接口,仅需要占用一个通用I/O端口即可完成与微处理器的通信;在-10~+85℃温度范围内具有±0.5℃精度;用户可编程设定9~12位的分辨率。

以上特性使得DSl8B20非常适用于构建高精度、多点温度测量系统。

DS18B20简介DSl8B20是美国Dallas半导体公司推出的一种智能数字温度传感器。

与传统的热敏电阻相比,它能够直接读出被测温度,并且可根据实际要求通过编程实现9~12位的数字值读数方式;可以分别在93.75ms和750 ms内完成9位和12位的数字量;从DS18B20读出信息或写入DS18B20信息仅需要1根口线(单线接口);温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。

使用DS18B20可使系统结构更趋简单,可靠性更高。

1系统硬件设计由DS18B20和Atmel公司推出的单片机AT89C51以及相关外围电路组成的高精度、多点温度测量系统的结构框图如图1所示。

系统采用8片DS18B20构成小型温度传感器网络[3],通过并行连接方式连接至单片机的通用I/O端口。

单片机获得温度信息后,通过特定的算法,将处理后的温度信息通过LED显示出来,同时通过串行口送上位机处理。

DS18B20内部均有一个独立的64位序列号,单片机通过序列号可以对一条总线上的多支DS18B20进行控制,读取它们的温度。

但是,要完成这个操作,软件设计比较复杂,同时存在一个缺点——速度太慢。

无法适用于一些实时性要求高的测温场合。

所以本次设计采取一种利用单片机的并口,同步快速读取8支DS18B20的方法。

基于DS18B20的多点温度检测系统

基于DS18B20的多点温度检测系统

基于DS18B20的多点温度检测系统绪论1.1 设计背景和意义温度是一个反映物体冷热程度的物理量。

温度的检测和控制在当代日常生活和工农业生产工程中有着越来越广泛的应用,要求也越来越高[1]。

在冶金、化工等工业生产过程中,广泛使用的各种加热炉、反应炉等,都要求对温度进行严格控制。

在日常生活中,电烤箱、微波炉、电热水器等电器也需要进行温度检测与控制[2],而且现在越来越多的地方用到多点温度测量,比如冰箱的保鲜层和冷冻层是不同的温度,这就需要多点的测量和显示可以让用户直观的看到温度值,并根据需要调节冰箱的温度。

它还在其他领域有着广泛的应用,如:消防电气的非破坏性温度检测,空调系统的温度检测等。

温度检测系统应用十分广阔[3]。

1.2 国内外同类设计概况目前多点温度检测系统在国内各行各业的应用已经十分广泛,但从国内生产的多点温度检测仪器来讲,发展水平仍比较落后,和德国、美国等发达国家相比有着很大差距。

采用51单片机来对温度进行检测和控制,不仅具有成本低廉、控制方便和灵活性大等优点,而且可以提高被控温度的技术指标,从而提高产品的质量和数量。

因此,单片机对温度的处理问题是一个工业生产中经常会遇到的问题[4]。

1.3 本课题要解决的问题和方法本文基于AT89C51单片机,由两片DS18B20温度传感器采集环境温度,两片DS18B20温度传感器采用单总线连接方式,统一连接于单片机的同一IO口,由LCD1602将采集的温度实时显示出来,当温度超过设定的温度值范围,单片机控制外围电路中的蜂鸣器产生报警,并且利用max232实现与上位机的通信。

因此主要电路包括:单片机系统电路,温度采集电路,温度显示电路,上位机通信电路,报警电路等组成。

2 系统总体设计2.1 系统方案的选择该设计主要由温度测量,数据采集和数据处理部分组成,实现方案有很多种,下面将列出两种经常用到的实现方案。

2.1.1 设计方案一采用热敏电阻传感器。

随着环境温度的变化,热敏电阻的阻值也发生线性变化,电阻两端的电压也随着电阻的线性改变而发生相同的变化,用处理器采集电阻两端的电压,然后根据公式计算出当前的环境温度值。

《单片机》教学课件DS18B20单总线数字温度传感器

5
复位
上拉数据线 下拉数据线 主机发出延时500微秒的复位低脉冲 拉高数据线 延时60us等待DS18B20回应 ;flag=0,18B20不存在 ;flag=1,18B20存在 上拉数据线
6
写时序
下拉数据线 延时15微秒 读一位数据 延时45us 上拉数据线 循环8次,写8位数据
7
读时序
上拉数据线 下拉数据线 上拉数据线 延时15微秒 读一位数据 延时45us 循环16次,读取16位数据
8
DS18B20单总线数字温度传感 器
1

DS18B20管脚、接口电路

读DS18B20温度

复位时序

写3
接口电路
4
读温度流程
复位 判断18B20是否存在 写CCH; 跳过ROM匹配 写44H;发出转换温度转换命令 复位 写CCH; 跳过ROM匹配 写BEH ;发出读温度命令 读数据

基于DS18B20的多点温度测量及报警课程设计报告

《微型计算机控制技术》课程设计报告课题名称多点温度检测系统设计专业自动化(交通信息与工程)班级自动化一班学生姓名指导教师李曙光2015年 7月 3 日目录一、设计题目 (2)二、任务要求 (2)三、总体设计方案 (2)3.1控制模块 (2)3.2温度显示模块 (3)3.3温度采集模块 (4)3.4键盘控制模块 (6)3.5报警模块 (6)四、各硬件模块电路设计 (7)4.1单片机最小系统硬件仿真图 (8)4.2温度显示模块硬件仿真图 (8)4.3温度采集模块硬件仿真图 (9)4.4按键控制模块硬件仿真图 (9)4.5报警模块硬件仿真图 (9)4.6硬件实现 (10)五、各个软件模块设计和流程图 (12)5.1软件设计总流程图 (12)5.2 DS18B20初始化 (13)5.3读DS18B20测得地温度 (14)5.4数码管显示数据处理…………………………………………………………………15.5.5按键处理 (16)六.设计总结及参考资料 (16)6.1设计总结 (16)6.2参考文献 (17)七.附件 (18)附件一:完整源程序 (18)附件二:完整地器件清单及硬件电路图 (28)一、设计题目多点温度检测系统设计二、任务要求(1)使用ds18b20为温度传感器;(2)检测点数为2点以上,检测温度范围为-40到40度之间,测量相应时间小于1s;(3)完成温度数据地实时显示;(4)设计一报警电路,当采集地温度越限(超过键盘设置地上下限)时产生声光报警.三、总体设计方案3.1控制模块1)主要功能采用Atmel公司地AT89S51单片机,它作为系统地核心部分,和温度采集单元之间,它直接对温度传感器进行指令操作,获取温度传感器地温度数据后进行各种处理,然后通过显示模块显示出温度值,工作过程中,接收来自键盘控制模块地信号,并对其作出相应地响应,同时,它不断检测DS18B20测取地温度值是否超过了设定地上限温度或下限温度,如果超过则对报警模块发出指令令其报警.2)器件选择AT89S51是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器.使用Atmel 公司高密度非易失性存储器技术制造.片上Flash允许程序存储器在系统可编程,亦适于常规编程器.在单芯片上,拥有灵巧地8 位CPU 和在系统可编程Flash,使得AT89S51在众多嵌入式控制应用系统中得到广泛应用.AT89S51具有完整地输入输出、控制端口、以及内部程序存储空间.与我们通常意义上地微机原理类似,可以通过外接A/D,D/A转换电路及运放芯片实现对传感器传送信息地采集,且能够提供以点阵或LCD液晶及外接按键实现人机交互,能对内部众多I/O端口连接步进电机对外围设备进行精确操控,具有强大地工控能力.图一 AT89S51管脚图3.2温度显示模块1)主要功能实时显示两个DS18B20温度传感器采集到地温度,在按键地设置下显示设定地报警温度上、下限值.2)器件选择该模块采用两个四位地八段译码管和一块八位锁存器74HC573组成,采用扫描显示地方式显示八位数据.数码管分为共阳型和共阴型,共阳极型就是发光管地正极都连在一起,作为一条引线,负极分开.八段数码发光管就是8个发光二极管组成地,在空间排列成为8字型带个小数点,只要将电压加在阳极和阴极之间相应地笔画就会发光.8个发光二极管地阳极并接在一起,8个阴极分开,因此称为共阳八段数码管.相反则为共阴八段数码管.图二数码管显示字段(a)八段数码管结构(b)共阴型数码管(c)共阳型数码管图三八段LED数码显示管原理和结构3.3温度采集模块1)主要功能实时测量两个侧两点地温度2)器件选择该模块采用DALLAS公司地DS18B20温度传感器,该温度传感器将温度检测与数字数据输出全集成于一个芯片上,它地一个工作周期分为温度检测和数据处理两个部分,它采用单数据总线进行数据传输,由于本设计采用两点测量温度,两个温度传感器地输出数据脚共连在单片机地数据引脚上,因此在进行温度检测和数据处理中需要首先利用DS18B20地ROM操作指令对温度传感器地ROM—ID进行识别,以针对特定地温度传感器进行操作.(对DS18B20地操作指令见附录文件)DS18B20地主要特征:1)全数字温度转换及输出2)先进地单总线技术3)最高12位地分辨率时地最大工作周期为750毫秒4)可选择寄生工作方式5)检测温度范围为-55°C~+125°C6)内置EEPROM,限温度报警7)64位光刻ROM,内置产品序列号,方便多机挂接8)多种封装形式,适应不同硬件图四 DS18B20地不同封装形式3.4键盘控制模块1)主要功能通过按键进行工作模式地切换,并且用按键进行上限温度和下限温度地更改2)器件选择该模块采用几个按钮开关和相应地几个10K电阻组成,当按下按钮是,得到一个低电平信号送入单片机,松开开关后变回高电平信号,单片机识别此信号并对此做出响应.图五按键3.5报警模块1)功能实现当两个DS18B0中任意一个测取地温度超过设定地温度上、下限时,蜂鸣器响,以此报警.2)器件选择该模块采用蜂鸣器来实现,蜂鸣器是一种一体化结构地电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件.蜂鸣器主要分为有源蜂鸣器和无源蜂鸣器两种类型.有源蜂鸣器与无源蜂鸣器地区别(注意:这里地“源”不是指电源,而是指震荡源):有源蜂鸣器内部带震荡源,所以只要一通电就会叫;而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫.必须用2K-5K地方波去驱动它.有源蜂鸣器往往比无源地贵,就是因为里面多个震荡电路.无源蜂鸣器地优点是:1. 便宜2. 声音频率可控,可以做出“多来M发索拉西”地效果3. 在一些特例中,可以和LED复用一个控制口有源蜂鸣器地优点是:程序控制方便.综上所述,本实验采用无缘蜂鸣器.图六:有源和无源蜂鸣器地外观a)有源 b)无源四、各硬件模块电路设计AT89C51图七单片机端口分配图总地硬件仿真图附于附录中.下面是各模块硬件仿真连线图:4.1单片机最小系统硬件仿真图4.2温度显示模块硬件仿真图4.3温度采集模块硬件仿真图4.4按键控制模块硬件仿真图4.5报警模块硬件仿真图4.6硬件实现初始显示界面(显示两点测量温度)设定温度上限显示界面(显示温度上限值30°和第二点测量温度)设定温度下限显示界面(显示温度下限值0°和第二点测量温度)五、各个软件模块设计和流程图5.1软件设计总流程图N首先,读取第一个DS18B20测得地温度存入数组temp_buff中,然后读取第二个DS18B20测得地温度存入数组temp1_buff中,随后进行按键扫描和按键处理,对接下来要显示地模式进行选择,然后对数码要管显示地数据进行处理,根据选择地不同地模式读取相应地缓存,经过数码管扫描读出相应地温度,最后,依次判断两个点地测量温度是否超过设定地温度报警值,若超过,蜂鸣器报警,若未超过,继续从开始处循环.5.2 DS18B20初始化DS18B20地通信方式属于单总线通信方式,需按一定地通信协议.单总线地所有处理过程均从初始化开始.其中初始化序列包括一个由主机发出地复位脉冲和其后由从机发出地存在脉冲,存在脉冲让主机知道DS18B20在总线上并且已准备就绪.5.3读DS18B20测得地温度首先对DS18B20进行初始化,然后通过跳过ROM匹配指令、温度转换指令,将DS18B20采集到地数据转化为温度,再通过初始化、跳过ROM匹配指令、读温度暂存器指令,将得到地温度读取出来,最后对得到地温度数据进行处理,令TN=温度整数部分,TD=温度小数部分,以便后续进行使用.5.4数码管显示数据处理1)前四位数码管显示数据处理由于数码管数量有限,所以用前四位显示第一个DS18B20测得地温度和设定地报警温度(包括上限温度和下限温度),通过K1键进行三种模式地切换.若无按键按下或者按下三次K1键(mode=0),将第一个DS18B20测出地温度存入temp[ ]前四位,后续对其进行译码,经过译码后,前四位数码管显示第一个DS18B20测得地温度:若按下一次K1键(mode=1),将设定地报警温度上限存入temp[ ]前四位,后续对其进行译码,经过译码后,前四位数码管显示设定地报警温度上限:若按下两次K1键(mode=2),将设定地报警温度下限存入temp[ ]前四位,后续对其进行译码,经过译码后,前四位数码管显示设定地报警温度下限.2)后四位数码管显示数据处理将第二个DS18B20测得地温度存入temp[ ],后续对其进行译码,译码后实时显示第二点地测量温度 5.5按键处理检测键盘扫描是否有返回值,判断是否有按键按下.若无按键按下,则进行数码管显示数据处理;若有按键按下且为K1键,mode自加1 ,并判断mode是否大于2,若大于2,mode 清零后输出,若不大于2,直接输出mode;若有按键按下且为K2键,判断mode 是否为1,若为1,上限报警温度自加1(不超过125°),若不为1,进行下限报警温度自加1(不超过125°);若有按键按下且为K3键,判断mode 是否为1,若为1,上限报警温度自减1(不低于-50°),若不为1,进行下限报警温度自减1(不超过-50°).六.设计总结及参考资料6.1设计总结本次课程设计我们将两个DS18B20和AT89C51单片机相结合实现了多点温度测量.对单片机地独立控制外设而言难度不大,但由于不会用同一个I/O口控制多个DS18B20,因此用两个独立地I/O口分别对其控制,故编写地程序有些繁琐.本次设计地不足是,第二个DS18B20测得温度地小数部分一直无法显示,经过多次调试仍然没有结果,但基本功能都已实现.虽然课程设计结束了,但我们仍会努力将这一问题解决.经过本次设计实验,充分认识到自己实际操作方面地不足以及程序编写不够熟练等问题,因此需要多加练习.同时也更加明确了我们在接下来地学习中地侧重方向,作为工科专业应该更加注重理论与实际地结合,并且持之以恒地坚持,只有这样不断提高自己地专业素养.6.2参考文献[1]李群芳. 单片机微型计算机与接口技术第三版.电子工业出版社,2010.1[2] 谢自美.电子线路设计.实验测试(第二版)[M].武汉:华中科技大学出版社,2000.[3] 丘玉娟.用串行ROM和AT89C51实现电子密码锁[J].电脑知识与技术.2005,11(3):34~36[4]李金平•电子系统设计•电子工业出版社•2009七.附件附件一:完整源程序#include<reg51.h>#include<intrins.h>//--定义使用地IO--//sbit LSA=P2^2。

DS18B20单总线多点式测温系统资料讲解

D S18B20单总线多点式测温系统DS18B20单总线多点式测温系统1(2011-01-15 19:53:40)转载分类: DS18B20标签:ds18b20多点测量主文件:#include<reg51.h>#include<xuanze.h>unsigned int shu[]={0x30,0x31,0x32,0x33,0x34,0X35,0x36,0x37,0x38,0x39}; unsigned long t;void flcd_1602() //当为负温度时,液晶显示可以高位为0屏蔽.{init(0x80);write_data(0x4e);//NOinit(0x81);write_data(0x4f);init(0x82);write_data(0x80);init(0x85);write_data(0x74);//temperatureinit(0x86);write_data(0x65);init(0x87);write_data(0x6d);init(0x88);write_data(0x70);init(0x89);write_data(0x65);init(0x8a);write_data(0x72);init(0x8b);write_data(0x61);init(0x8c);write_data(0x74);init(0x8d);write_data(0x75);init(0x8e);write_data(0x72);init(0x8f);write_data(0x65);init(0xc0);write_data(0x80);init(0xc1);write_data(0x80);init(0xc2);write_data(0x69); //is:init(0xc3);write_data(0x73);init(0xc4);write_data(0x3a);if((t/1000)!=0){init(0xc5);write_data(0x2d);init(0xc6);write_data(shu[t/1000]);init(0xc7);write_data(shu[t/100]);}else{init(0xc5);write_data(0xfe);init(0xc6);write_data(0x2d);init(0xc7);write_data(shu[t/100]);}init(0xc8);write_data(0x2e);init(0xc9);write_data(shu[(t0)/10]);init(0xca);write_data(shu[t]);init(0xcb);write_data(0x27);init(0xcc);write_data(0x43);init(0xcd);write_data(0x80);init(0xce);write_data(0x80);init(0xcf);write_data(0x80);}void lcd_1602() //当为正温度时,液晶显示可以高位为0屏蔽. { init(0x80);write_data(0x4e);//NOinit(0x81);write_data(0x4f);init(0x82);write_data(0x80);init(0x84);write_data(0x80);init(0x85);write_data(0x74); //temperatureinit(0x86);write_data(0x65);init(0x87);write_data(0x6d);init(0x88);write_data(0x70);init(0x89);write_data(0x65);init(0x8a);write_data(0x72);init(0x8b);write_data(0x61);init(0x8c);write_data(0x74);init(0x8d);write_data(0x75);init(0x8e);write_data(0x72);init(0x8f);write_data(0x65);init(0xc0);write_data(0x80);init(0xc1);write_data(0x80);init(0xc2);write_data(0x69); //is:init(0xc3);write_data(0x73);init(0xc4);write_data(0x3a);if(t/10000!=0){init(0xc5);write_data(shu[t/10000]);init(0xc6);write_data(shu[t/1000]);init(0xc7);write_data(shu[t/100]);}else{if((t/1000)!=0){init(0xc5);write_data(0xfe);init(0xc6);write_data(shu[t/1000]);init(0xc7);write_data(shu[t/100]);}else{init(0xc5);write_data(0xfe);init(0xc6);write_data(0xfe);init(0xc7);write_data(shu[t/100]);}}init(0xc8);write_data(0x2e);init(0xc9);write_data(shu[(t0)/10]);init(0xca);write_data(shu[t]);init(0xcb);write_data(0x27);init(0xcc);write_data(0x43);init(0xcd);write_data(0x80);init(0xce);write_data(0x80);init(0xcf);write_data(0x80);}void jiance() //初始化,即检测是否存在DS18B20.{unsigned char k=0;loop:DS=1;DS=0; //主机将总线从高电平拉到低电平del(100); //持续400us~960usDS=1; //然后释放总线del(10); //DS18B20检测到总线上升沿后,等待15us~60u后发低电平。

基于DS18B20的多点温度检测系统设计

绪论 (3)1.1 设计背景和意义 (3)1.2 国内外同类设计概况 (3)1.3 本课题要解决的问题和方法 (4)2 系统总体设计 (4)2.1 系统方案的选择 (4)2.1.1 设计方案一 (4)2.1.2 设计方案二 (4)2.2 系统的构成 (5)2.3 系统的工作过程 (7)3 系统的硬件设计 (7)3.1 单片机最小系统的设计 (7)3.1.1 89C51单片机简介 (7)3.1.2 单片机最小系统 (11)3.1.3 电源电路 (12)3.2 温度检测电路及DS18B20测温原理 (13)3.2.1 DS18B20介绍 (13)3.2.2 DS18B20特性 (13)3.2.3 DS18B20内部结构(1)DS18B20的内部结构如图3-6所示。

(14)3.2.4 DS18B20电路设计 (16)3.3 温度报警电路 (18) (19)3.4 温度显示电路 (19)3.5 串口通信电路 (21)3.6 整体电路 (22)4 软件设计 (22)4.1 概述 (22)4.2 主程序方案 (22)4.3 各模块子程序设计 (24)5 温度传感器调试 (27)5.1 系统调试 (27)总结 (29)附录一 (30)附录二 (31)附录三 (32)附录四 (33)参考文献 (41)致谢 (43)绪论1.1 设计背景和意义温度是一个反映物体冷热程度的物理量。

温度的检测和控制在当代日常生活和工农业生产工程中有着越来越广泛的应用,要求也越来越高[1]。

在冶金、化工等工业生产过程中,广泛使用的各种加热炉、反应炉等,都要求对温度进行严格控制。

在日常生活中,电烤箱、微波炉、电热水器等电器也需要进行温度检测与控制[2],而且现在越来越多的地方用到多点温度测量,比如冰箱的保鲜层和冷冻层是不同的温度,这就需要多点的测量和显示可以让用户直观的看到温度值,并根据需要调节冰箱的温度。

它还在其他领域有着广泛的应用,如:消防电气的非破坏性温度检测,空调系统的温度检测等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

D S18B20单总线多点式测温系统DS18B20单总线多点式测温系统1(2011-01-15 19:53:40)转载分类: DS18B20标签:ds18b20多点测量主文件:#include<reg51.h>#include<xuanze.h>unsigned int shu[]={0x30,0x31,0x32,0x33,0x34,0X35,0x36,0x37,0x38,0x39}; unsigned long t;void flcd_1602() //当为负温度时,液晶显示可以高位为0屏蔽.{init(0x80);write_data(0x4e);//NOinit(0x81);write_data(0x4f);init(0x82);write_data(0x80);init(0x85);write_data(0x74);//temperatureinit(0x86);write_data(0x65);init(0x87);write_data(0x6d);init(0x88);write_data(0x70);init(0x89);write_data(0x65);init(0x8a);write_data(0x72);init(0x8b);write_data(0x61);init(0x8c);write_data(0x74);init(0x8d);write_data(0x75);init(0x8e);write_data(0x72);init(0x8f);write_data(0x65);init(0xc0);write_data(0x80);init(0xc1);write_data(0x80);init(0xc2);write_data(0x69); //is:init(0xc3);write_data(0x73);init(0xc4);write_data(0x3a);if((t/1000)!=0){init(0xc5);write_data(0x2d);init(0xc6);write_data(shu[t/1000]);init(0xc7);write_data(shu[t/100]);}else{init(0xc5);write_data(0xfe);init(0xc6);write_data(0x2d);init(0xc7);write_data(shu[t/100]);}init(0xc8);write_data(0x2e);init(0xc9);write_data(shu[(t0)/10]);init(0xca);write_data(shu[t]);init(0xcb);write_data(0x27);init(0xcc);write_data(0x43);init(0xcd);write_data(0x80);init(0xce);write_data(0x80);init(0xcf);write_data(0x80);}void lcd_1602() //当为正温度时,液晶显示可以高位为0屏蔽. { init(0x80);write_data(0x4e);//NOinit(0x81);write_data(0x4f);init(0x82);write_data(0x80);init(0x84);write_data(0x80);init(0x85);write_data(0x74); //temperatureinit(0x86);write_data(0x65);init(0x87);write_data(0x6d);init(0x88);write_data(0x70);init(0x89);write_data(0x65);init(0x8a);write_data(0x72);init(0x8b);write_data(0x61);init(0x8c);write_data(0x74);init(0x8d);write_data(0x75);init(0x8e);write_data(0x72);init(0x8f);write_data(0x65);init(0xc0);write_data(0x80);init(0xc1);write_data(0x80);init(0xc2);write_data(0x69); //is:init(0xc3);write_data(0x73);init(0xc4);write_data(0x3a);if(t/10000!=0){init(0xc5);write_data(shu[t/10000]);init(0xc6);write_data(shu[t/1000]);init(0xc7);write_data(shu[t/100]);}else{if((t/1000)!=0){init(0xc5);write_data(0xfe);init(0xc6);write_data(shu[t/1000]);init(0xc7);write_data(shu[t/100]);}else{init(0xc5);write_data(0xfe);init(0xc6);write_data(0xfe);init(0xc7);write_data(shu[t/100]);}}init(0xc8);write_data(0x2e);init(0xc9);write_data(shu[(t0)/10]);init(0xca);write_data(shu[t]);init(0xcb);write_data(0x27);init(0xcc);write_data(0x43);init(0xcd);write_data(0x80);init(0xce);write_data(0x80);init(0xcf);write_data(0x80);}void jiance() //初始化,即检测是否存在DS18B20.{unsigned char k=0;loop:DS=1;DS=0; //主机将总线从高电平拉到低电平del(100); //持续400us~960usDS=1; //然后释放总线del(10); //DS18B20检测到总线上升沿后,等待15us~60u后发低电平。

k=DS;del(20); //低电平至少要持续60~240usif(k==1) // 60~240us内若为高电平则要重新检测。

goto loop;}read() //从DS18B20中读出数据{ unsigned char i;unsigned long date=0;for(i=0;i<16;i++){ DS=0; //主机在某一时刻将总线从高电平拉到低电平.date>>=1;DS=1;del(3); //保持15us将总线拉到高电平,产生读时间隙if(DS)date|=0x8000;del(8); //读数据需要持续35us~60us.}return(date);}void main(){ unsigned long flag=0;EA=0;SP=0X60;init(0x01); //对液晶屏初始化init(0x38);init(0x0c);init(0x06);while(1){jiance(); //对DS18B20初始化matchrom();write(0x44); //启动温度变换del(100);jiance();matchrom();if(f==1){f=0;}else{ write(0xbe); // 读暂存存储器t=read();flag=t&0x8000; //对读取的数据进行处理 if(flag==0x8000){t=~t;t=t+1;t=t*25;t>>=2;flcd_1602();}else{ t=t*25;t>>=2;lcd_1602();}}}}头文件:#include<xuanze.h>#ifndef __XUANZE_H__#define __XUANZE_H__unsigned char k,f=0;sbit RS=P2^0;sbit RW=P2^1;sbit E=P2^2;sbit DS=P1^1;void del( int count ) //延时程序{while(count--);}void delay(unsigned int count)//延时程序{int p;while(count--)for(p=0;p<125;p++);}void write(unsigned char date)//向DS18B20中写入数据{ int i;for(i=0;i<8;i++) //由于是单总线每次只能写一位,一个字节需循环8次{DS=0; //主机在某一时刻将总线从高电平拉到低电平,产生写时间隙 DS=date&0x01; // 写入数据。

del(15); //写如数据要15us,ds18b20对数据采样需要15us~60us,共需35us~70us.DS=1;date>>=1;}}void init(unsigned int n)// RW=0,RS=0;向指令寄存器中写入命令,即对1602初始化。

{ delay(10);E=0;RS=0;RW=0;E=1;P0=n;E=0;}void write_data(unsigned char n)//RS=1,RW=0;向数据寄存器中写入数据,即显示的数符。

{delay(10);E=0;RS=1;RW=0;E=1;P0=n;E=0;}void matchrom() //匹配ROM{k=P3;switch(k){ case 0: { f=1;init(0x80);write_data(0x57);//whichinit(0x81);write_data(0x68);init(0x82);write_data(0x69);init(0x83);write_data(0x63);init(0x84);write_data(0x68);init(0x85);write_data(0x80);init(0x86);write_data(0x4e);//NOinit(0x87);write_data(0x4f);init(0x88);write_data(0x79);//youinit(0x89);write_data(0x6f);init(0x8a);write_data(0x75);init(0x8b);write_data(0x80);init(0x8c);write_data(0x57);//wantinit(0x8d);write_data(0x61);init(0x8e);write_data(0x6e);init(0x8f);write_data(0x74);init(0xc0);write_data(0x70); //pressinit(0xc1);write_data(0x72);init(0xc2);write_data(0x65);init(0xc3);write_data(0x73);init(0xc4);write_data(0x73);init(0xc5);write_data(0x80);init(0xc6);write_data(0x57);//whichinit(0xc7);write_data(0x68);init(0xc8);write_data(0x69);init(0xc9);write_data(0x63);init(0xca);write_data(0x68);init(0xcb);write_data(0x80);init(0xcc);write_data(0x6b);//keyinit(0xcd);write_data(0x65);init(0xce);write_data(0x79);init(0xcf);write_data(0x80); }break;case 1: { init(0x83);write_data(0x31); //NO 1 write(0x55);write(0x28);write(0x30);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x8e); }break;case 2: { init(0x83);write_data(0x32);//NO 2write(0x55);write(0x28);write(0x31);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x00);write(0xb9); }break;case 4: { init(0x83);write_data(0x33); //NO 3 write(0x55);write(0x28);write(0x32);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x00);write(0xe0); }break;case 8: { init(0x83);write_data(0x34); //NO 4 write(0x55);write(0x28);write(0x33);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x00);write(0xd7); } break;case 16: { init(0x83);write_data(0x35); //NO 5 write(0x55);write(0x28);write(0x34);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x00);write(0x52); } break;case 32: { init(0x83);write_data(0x36); // NO 6write(0x28);write(0x35);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x00);write(0x65); }break;case 64: { init(0x83);write_data(0x37); //NO 7 write(0x55);write(0x28);write(0x36);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x00);write(0x3c); } break;case 128: { init(0x83); write_data(0x38);//NO 8 write(0x55);write(0x28);write(0x37);write(0xc5);write(0xb8);write(0x00);write(0x00);write(0x00);write(0x0b); } break;default:{f=1;init(0x80);write_data(0x50); //pleaseinit(0x81);write_data(0x6c);init(0x82);write_data(0x65);init(0x83);write_data(0x61);init(0x84);write_data(0x73);init(0x85);write_data(0x65);init(0x86);write_data(0x80);init(0x87);write_data(0x70); //pressinit(0x88);write_data(0x72);init(0x89);write_data(0x65);init(0x8a);write_data(0x73);init(0x8b);write_data(0x73);init(0x8c);write_data(0x80);init(0x8d);write_data(0x6f); //one init(0x8e);write_data(0x6e);init(0x8f);write_data(0x65);init(0xc0);write_data(0x80);init(0xc1);write_data(0x80);init(0xc2);write_data(0x80);init(0xc3);write_data(0x6b);//keyinit(0xc4);write_data(0x65);init(0xc5);write_data(0x79);init(0xc6);write_data(0x80);init(0xc7);write_data(0x6f);//only init(0xc8);write_data(0x6e);init(0xc9);write_data(0x6c);init(0xca);write_data(0x79);init(0xcb);write_data(0x80);init(0xcc);write_data(0x21);//!init(0xcd);write_data(0x80);init(0xce);write_data(0x80);init(0xcf);write_data(0x80); }break; }}#endifDS18B20单总线多点式测温系统--2 (2011-01-16 00:33:09)转载分类: DS18B20标签:ds18b20程序改进版杂谈说明:较之第一个程序有很大的改善缺点是:闪动的不准确,由于时间待早上改善三个函数,一主函数二个头函数主函数:#include<reg51.h>void delay(unsigned int count)//延时程序{int p;while(count--)for(p=0;p<125;p++);}#include"LCD_Init.h"#include"xuanze.h"unsigned int shu[]={0x30,0x31,0x32,0x33,0x34,0X35,0x36,0x37,0x38,0x39}; unsigned long t;void flcd_1602() //当为负温度时,液晶显示可以高位为0屏蔽.{ LCD_dis_string(1,1,"NO "); //显示字符串LCD_dis_string(5,1,"temperature"); //显示字符串temperatureLCD_dis_string(1,2," is:"); //显示字符串is:if((t/1000)!=0){LCD_write_command(0xc5);LCD_write_data(0x2d);LCD_write_command(0xc6);LCD_write_data(shu[t/1000]);LCD_write_command(0xc7);LCD_write_data(shu[t/100]);}else{LCD_write_command(0xc5);LCD_write_data(0xfe);LCD_write_command(0xc6);LCD_write_data(0x2d);LCD_write_command(0xc7);LCD_write_data(shu[t/100]);}LCD_write_command(0xc8);LCD_write_data(0x2e);LCD_write_command(0xc9);LCD_write_data(shu[(t0)/10]);LCD_write_command(0xca);LCD_write_data(shu[t]);LCD_write_command(0xcb);LCD_write_data(0x27);LCD_write_command(0xcc);LCD_write_data(0x43);LCD_write_command(0xcd);LCD_write_data(0x80);LCD_write_command(0xce);LCD_write_data(0x80);LCD_write_command(0xcf);LCD_write_data(0x80);}void lcd_1602() //当为正温度时,液晶显示可以高位为0屏蔽.{LCD_dis_string(1,1,"NO "); //显示字符串LCD_dis_string(5,1,"temperature"); //显示字符串temperatureLCD_dis_string(5,2," is:"); //显示字符串is:if(t/10000!=0){LCD_write_command(0xc5);LCD_write_data(shu[t/10000]);LCD_write_command(0xc6);LCD_write_data(shu[t/1000]);LCD_write_command(0xc7);LCD_write_data(shu[t/100]);}else{ if((t/1000)!=0){LCD_write_command(0xc5);LCD_write_data(0xfe);LCD_write_command(0xc6);LCD_write_data(shu[t/1000]);LCD_write_command(0xc7);LCD_write_data(shu[t/100]);}else{LCD_write_command(0xc5);LCD_write_data(0xfe);LCD_write_command(0xc6);LCD_write_data(0xfe);LCD_write_command(0xc7);LCD_write_data(shu[t/100]);}}LCD_write_command(0xc8);LCD_write_data(0x2e);LCD_write_command(0xc9);LCD_write_data(shu[(t0)/10]);LCD_write_command(0xca);LCD_write_data(shu[t]);LCD_write_command(0xcb);LCD_write_data(0x27);LCD_write_command(0xcc);LCD_write_data(0x43);LCD_write_command(0xcd);LCD_write_data(0x80);LCD_write_command(0xce);LCD_write_data(0x80);LCD_write_command(0xcf);LCD_write_data(0x80);}void Init_ds18b20() //初始化,即检测是否存在DS18B20.{ unsigned char k=0;loop:DS=1;DS=0; //主机将总线从高电平拉到低电平del(100); //持续400us~960usDS=1; //然后释放总线del(10); //DS18B20检测到总线上升沿后,等待15us~60u后发低电平。

相关文档
最新文档