基于DS18B20的温度采集系统设计.docx
《基于DS18B20的温度采集系统设计.docx》由会员分享,可在线阅读,更多相关《基于DS18B20的温度采集系统设计.docx(24页珍藏版)》请在冰豆网上搜索。
基于DS18B20的温度采集系统设计
(基于DS18B20的温度采集系统设计)
课程设计说明书
系(部):
信息工程系
班级:
自动化082班
学生姓名:
孙继国学号080819611
指导教师:
王常顺
时间:
2010年12月13日到2010年12月24日
课程设计任务书
题目基于DS18B20的温度采集系统设计
系(部)信息工程系
专业自动化
班级082班
学生姓名孙继国
学号080819611
12月13日至12月24日共2周
指导教师(签字)
系主任(签字)
年月日
一、设计内容及要求
利用DS18B20实现温度采集,并用数码管显示。
能实现温度上下限的设置,并能够超限报警(用proteus实现)
二、设计原始资料
单片机原理及应用教程范立南2006年1月
单片机原理及应用教程刘瑞新2003年07月
三、设计完成后提交的文件和图表
1.计算说明书部分
1)方案论证报告打印版或手写版
2)程序流程图
3)具体程序
2.图纸部分:
具体电路原理图打印版
四、进程安排
教学内容学时地点
资料查阅与学习讨论1天单片机实验室
分散设计5天单片机实验室
编写报告3天单片机实验室
成果验收1天单片机实验室
五、主要参考资料
《电子设计自动化技术基础》马建国、孟宪元编清华大学出版2004年4月
《实用电子系统设计基础》姜威2008年1月
《单片机系统的PROTEUS设计与仿真》张靖武2007年4月
指导老师成绩
答辩小组成绩
总成绩
目录
摘要…………………………………………………………………
1.系统方案…………………………………………………………
1.1设计任务……………………………………………………
1.2DS18B20芯片介绍…………………………………………
2.仿真图设计………………………………………………………。
1.1仿真设计总图………………………………………………
1.2仿真设计中出现的问题……………………………………
3.软件设计…………………………………………………………
3.1主程序设计…………………………………………………
3.1.1主程序流程图设计………………………………………
3.1.2主程序程序设计…………………………………………
3.2子程序设计…………………………………………………
3.2.1子程序流程图设计………………………………………
3.2.2子程序程序设计…………………………………………
4.系统调试与分析…………………………………………………
5.设计总结…………………………………………………………
附录:
总程序………………………………………………………
参考文献……………………………………………………………
摘要
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本文利用单片机结合传感器技术开发设计,把传感器理论与单片机实际应用有机结合,详细地讲述了利用温度传感器DS18B20测量环境温度,同时51单片机在现代电子产品中广泛应用以及其技术已经非常成熟,DS18B20可以直接读出被测温度值,而且采用一线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点
关键词:
单片机控制、温度检测、温度传感器、低成本、易使用
Abstract
1.系统方案
1.1设计的任务书
利用DS18B20实现温度采集,并用数码管显示。
(用proteus实现)
1.2DS18B20芯片介绍
(1)DS18B20基本知识
DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
(2)DS18B20产品的特点
●只要求一个端口即可实现通信.
●在DS18B20中的每个器件上都有独一无二的序列号。
●实际应用中不需要外部任何元器件即可实现测温。
●测量温度范围在-55。
C到+125。
C之间。
●数字温度计的分辨率用户可以从9位到12位选择。
●内部有温度上、下限告警设置。
(3)DS18B20的引脚介绍TO-92封装的DS18B20的引脚排列见图1,其引脚功能描述见表1。
(底视图)图1表1 DS18B20详细引脚功能描述
序号
名称
引脚功能描述
1
GND
地信号
2
DQ
数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源。
3
VDD
可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
(4)DS18B20的使用方法
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
DS18B20的复位时序
DS18B20的读时序
对于DS18B20的读时序分为读0时序和读1时序两个过程。
对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。
DS18B20在完成一个读时序过程,至少需要60us才能完成。
DS18B20的写时序
对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。
对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
2.仿真图设计
2.1仿真图总图
2.2仿真图设计中的问题及解决方案
(1)在DS1820测温程序设计中,向DS1820发出温度转换命令后,程序总要等待DS1820的返回信号,一旦某个DS1820接触不好或断线,当程序读该DS1820时,将没有返回信号,程序进入死循环。
(2)开始在p.0-p2.3都接了三极管,基极接的p2.0-p2.3,发射极接的电源,集电极接的数码管的片选口。
可是都导不通。
不管是把p2.0-p2.3置1还是清0.后来直接把三极管删了。
(3)后来在p.0-p2.3都接了非门,可是还导不通。
不管是把p2.0-p2.3置1还是清0.后来直接把非门删了。
(4)直接用导线连接p2.0-p2.3和数码管的片选口,还是不对。
结果忘了改晶振频率。
3.软件设计
3.1主程序设计
3.1.1主程序流程图设计
3.1.2主程序程序设计
ORG0000H
SJMPSTART
ORG0050H
START:
;设置初值
MOVSP,#70H
MOVLED_0,#00H
MOVLED_1,#00H
CLRSOUND
MOVH_TEM,#60;高温报警温度设置
MOVL_TEM,#40;低温报警温度设置
MAIN:
LCALLGET_TEMPER;读出传感器感应温度
MOVA,TEMPER_L
MOVC,40H;将28H中的最低位移入C
RRCA
MOVC,41H
RRCA
MOVC,42H
RRCA
MOVC,43H
RRCA
MOVTEMPER_L,A;循环右移实现把用两个字节存放的温度存到29H中来
WAIT:
SETBALARM_L;关黄灯
SETBALARM_H;关红灯
CLRSOUND;关报警
MOVWENDU,29H;读取转换结果
MOVA,#99;由于选用了两位数码管,设置读数上限为99度
MOVR7,WENDU
SUBBA,R7
JCOUT;判断是否高于99,如高于99输出恒定符号
CLRC
MOVA,H_TEM
DECA
MOVR0,WENDU
SUBBA,R0;判断是否高于高温上限
JCHALM
MOVR1,L_TEM
MOVA,WENDU;判断是否低于高温报警温度(或下限温度)
SUBBA,r1
JCLALM
NOP
LCALLDISP
LJMPMAIN
LALM:
;低温报警
JNBCLOSE,CL;关闭报警声
CLRALARM_L;亮黄灯
SETBSOUND;开报警声
LCALLDISP;显示报警温度
LJMPMAIN
HALM:
;高温报警
JNBCLOSE,CL;关闭报警声
MOVR2,#235;置计数值
SETBSOUND;开报警声
DV:
LCALLDELAY1mS;延时1毫秒
DJNZR2,DV
CPLALARM_H;标志位取反
LCALLDISP;显示报警温度
SJMPCL
CL:
LJMPMAIN
OUT:
;超过99度上限显示
LCALLGET_TEMPER_2
MOVA,TEMPER_L
MOVC,40H;将28H中的最低位移入C
RRCA
MOVC,41H
RRCA
MOVC,42H
RRCA
MOVC,43H
RRCA
MOVTEMPER_L,A
LCALLDISP_2;调用超限显示
LJMPWAIT
3.2子程序设计
3.2.1子程序流程图设计
(1)读转换温度子程序
(2)单片机读DS18B20的子程序
(3)DS18B20感应(写)温度子程序
3.2.2子程序程序设计
6系统调试与分析
(1)刚开始什么都不显示,原因是用作驱动的三极管没导通。
后来把三极管成了非门。
(2)换成非门后,显示乱码。
直接用导线连接p2.0-p2.3和数码管的片选口。
(3)换成导线后直接挨个出0,改了改延时又先挨个出0,出完0后再挨个显85.0.再改了改延时变成了先挨个出0,出完0后再挨个显85.0.再挨个显示温度。
总之不能显示个静态的温度。
(4)在老师的帮助下。
我改了改显示子程序,显示完小数部分后延时小一点最后确定为400多us,再把p口重置。
结果显示就是一个静态温度了。
(5)不过每次运行一开始会先出现85.0.老师说我扫描时间的问题。
我改了改采集温度的时间延时。
可是结果只显示0.0或-0.1.
(6)最后我选择用硬件仿真。
结果发现proteus上的数码管我接的是共阳的,实验台上的数码管是共阴的。
接着我改了改码表。
和一些小地方。
显示的温度还是有85.0.后来老师说那是ds18b20上电复位的一个必要状态。
不过可以屏蔽掉。
5.设计总结
经过将近1周的单片机课程设计,终于完成了我的温度采集系统设计,虽然没有完全达到设计要求,但从心底里说,还是高兴的,毕竟这次设计把仿真和硬件都做了出来,高兴之余不得不深思呀!
在本次设计的过程中,我发现很多的问题,虽然以前还做过这样的设计但这次设计真的让我长进了很多,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,举个例子,以前写的那几次,数据加减时,我用的都是BCD码,这一次,我全部用的都是16进制的数直接加减,显示处理时在用除法去删分,感觉效果比较好,有好多的东西,只有我们去试着做了,才能真正的掌握,只学习理论有些东西是很难理解的,更谈不上掌握。
从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。
附录一程序总清单
ORG0000H
TMPLEQU29H;用于保存读出温度的低8位
TMPHEQU28H;用于保存读出温度的高8位
BIAOZHIEQU38H;是否检测到DS18B20标志位
DATAINBITP3.7;定义位地址
MAIN:
LCALLGET_TEMPER;调用读温度子程序
LCALLCVTTMP;调用转换子程序
LCALLDISPLAY;调用数码管显示子程序
AJMPMAIN
;====================================================================================
;复位初始化子程序
INIT_1820:
SETBDATAIN
NOP
CLRDATAIN
;主机发出延时复位低脉冲
MOVR0,#6BH;1071us
MOVR1,#04H;41us
TSR1:
DJNZR0,$;2us107=214us
MOVR0,#6BH;107
DJNZR1,TSR1;2us(214+2+1)4=868
SETBDATAIN;拉高数据线
NOP
NOP
NOP
MOVR0,#32H
TSR2:
JNBDATAIN,TSR3;等待DS18B20回应1us
DJNZR0,TSR2;2us(2+1)32=96us
JMPTSR4;延时
TSR3:
SETBBIAOZHI;置标志位,表示DS1820存在
JMPTSR5
TSR4:
CLRBIAOZHI;清标志位,表示DS1820不存在
JMPTSR7
TSR5:
MOVR0,#6BH;1us
TSR6:
DJNZR0,$;2us(2+1)107=321us;时序要求延时一段时间
TSR7:
SETBDATAIN
RET
;====================================================================================
;读转换温度子程序(让DS18B20感应温度,再读其温度)
GET_TEMPER:
SETBDATAIN
LCALLINIT_1820
JBBIAOZHI,TSS2
RET
TSS2:
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE
MOVA,#44H;发出温度转换指令
LCALLWRITE
ACALLDISPLAY;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
LCALLINIT_1820;准备读温度前先复位
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE
MOVA,#0BEH;发出读温度命令
LCALLWRITE
LCALLREAD;将读出的温度数据保存
RET
;DS18B20感应(写)温度子程序
WRITE:
MOVR2,#8;一共8位数据
CLRC
WR1:
CLRDATAIN;开始写入DS18B20总线要处于复位(低)状态
MOVR3,#08
DJNZR3,$;总线复位保持16微妙以上
RRCA;把一个字节DATA分成8个BIT环移给C
MOVDATAIN,C;写入一个BIT
MOVR3,#50
DJNZR3,$;等待100微妙
SETBDATAIN;重新释放总线
NOP
DJNZR2,WR1;写入下一个BIT
SETBDATAIN
RET
;单片机读ds18b20的子程序
READ:
MOVR4,#2;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
MOVR1,#29H;低位存入29H,高位存入28H
RE00:
MOVR2,#8;数据一共有8位
RE01:
CLRC
SETBDATAIN
NOP
NOP;延时
CLRDATAIN
NOP
NOP
NOP;延时
SETBDATAIN
MOVR3,#9
DJNZR3,$;延时
MOVC,DATAIN
MOVR3,#23
DJNZR3,$;延时
RRCA
DJNZR2,RE01;减1不为0转移,为0则读完8位
MOV@R1,A
DECR1;读高8位
DJNZR4,RE00
RET
;====================================================================================
;转换子程序(先判断正负,在分别取小数个位十位百位,再看百位或是为不存在的时候符号的位子)
CVTTMP:
MOVA,TMPH;读高8位
ANLA,#080H;取符号位
JZTMPC1;判0转移,即为正数转移,负数顺序执行
;为负数的情况
CLRC
MOVA,TMPL;读低8位
CPLA
ADDA,#1;求其补码
MOVTMPL,A;求补再送回
MOVA,TMPH;读低8位
CPLA
ADDCA,#0;由于不考虑符号位,则可看成正数
MOVTMPH,A;再送回
MOV73H,#0BH;显示负号(即把负号存在73H中)
SJMPTMPC2
;为正数的情况
TMPC1:
MOV73H,#0AH;正数符号不显示
TMPC2:
;取小数部分
MOVA,TMPL;读低8位
ANLA,#0FH;取出低四位,即小数部分
MOVDPTR,#TMPTAB;把表头地址给数据指针
MOVCA,@A+DPTR;查表
MOV70H,A;把小数部分存到70H
;取个位十位部分
MOVA,TMPL;再读低8位
ANLA,#0F0H;取出高四位,即个位部分
SWAPA;交换到低四位
MOVTMPL,A
MOVA,TMPH;读高8位
ANLA,#0FH;取其低四位,即十位
SWAPA;交换到高四位
;把十位个位合起部分
ORLA,TMPL;把十位和个位合起来
;百位部分BCD码转换部分
BCD1:
MOVB,#100
DIVAB
JZBCD2;判0转移,即百位为0转移,为1顺序执行
MOV73H,A;存百位数到73H
;十位部分BCD码转换部分
BCD2:
MOVA,#10;
XCHA,B
DIVAB
MOV72H,A;存十位数到72H
MOV71H,B;存个位数到71H
NOP;延时
;判百位有无部分(有百位只能为1)
BCD3:
MOVA,73H
ANLA,#0FH;取出百位(虽然百位数只用四位二进制表示,也得清除百位之外的影响)
CJNEA,#1,BCD4;比较不为1转移,即无百位
SJMPBCD5;有百位则个位十位都显示
BCD4:
MOVA,72H
ANLA,#0FH;取出十位(虽然十位数也只用四位二进制表示,也得清除其他位的影响)
JNZBCD5;判1转移,即十位是1返回
MOVA,73H;十位为0,读73H里存的符号
MOV72H,A;把百位的符号移到十位
MOV73H,#0AH;百位不显示
BCD5:
RET
;小数部分码表由于四位二进制数可以表示16个数
TMPTAB:
DB0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
;====================================================================================
;显示子程序
DISPLAY:
;显示小数部分
MOVR1,#70H;
MOVA,@R1
MOVDPTR,#TAB;
MOVCA,@A+DPTR;
MOVP1,A;
MOVP2,#0F1H;置p2.0为1,即最右的一块数码管显示小数部分
LCALLD1S;延时
MOVP2,#0F0H;重置p2口,消除影响
;显示个位部分
MOVR1,#71H;
MOVA,@R1;
MOVDPTR,#TAB;
MOVCA,@A+DPTR;
MOVP1,A;
MOVP2,#0F2H;置p2.1为1,即倒数第二块数码管显示个位部分
CLRP1.7;亮小数点
LCALLD1S;延时
MOVP2,#0F0H;重置p2口,消除影响
;显示十位部分
MOVR1,#72H;
MOVA,@R1;
MOVDPTR,#TAB;
MOVCA,@A+DPTR;
MOVP1,A;
MOVP2,#0F4H;置p2.2为1,即正数第二块数码管显示十位部分
LCALLD1S;延时
MOVP2,#0F0H;重置p2口,消除影响
;显示百位部分
MOVR1,#73H;
MOVA,@R1;
MOVDPTR,#TAB;
MOVCA,@A+DPTR;
MOVP1,A;
MOVP2,#0F8H;置p2.3为1,即第一块数码管显示百位部分
LCALLD1S;延时
MOVP2,#0F0H;重置p2口,消除影响
RET
;数码管共阳级码表
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H
DB92H,82H,0F8H,80H,90H,0FFH,0BFH
;=============================================
;延时子程序
D1S:
MOVR6,#2;1us
D1MS:
MOVR4,#50;1us
DL:
NOP;1us
NO