1、 题 目: DS18B20 数字温度计姓名学号:20133522080 赵晓磊 20130123096 段石磊 20133522028 付 成指导老师: 万青 设计时间: 2015 年 12月 单片机原理及应用课程设计报告书电子与信息工程学院目 录1. 引 言 11.1. 设计意义 .11.2. 系统功能要求 12. 方案设计 13. 硬件设计 24. 软件设计 55. 系统调试 76. 设计总结 87. 附 录 98. 作品展示 159. 参考文献 17DS18B20 数字温度计设计1. 引 言1.1. 设计意义在日常生活及工农业生产中,经常要用到温度的检测及控制,传统的测温元件有热电偶和热
2、电阻。而热电偶和热电阻测出的一般都是电压,再转换成对应的温度,需要比较多的外部硬件支持。其缺点如下: 硬件电路复杂; 软件调试复杂; 制作成本高。本数字温度计设计采用美国 DALLAS半导体公司继 DS1820之后推出的一种改进型智能温度传感器 DS18B20作为检测元件,测温范围为-55125,最高分辨率可达 0.0625。DS18B20可以直接读出被测温度值,而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的热点。1.2. 系统功能要求设计出的 DS18B20数字温度计测温范围在-55125,误差在0.5以内,采用 LED数码管直接读显示。2. 方案设计按照系统设计功能
3、的要求,确定系统由 3个模块组成:主控制器、测温电路和显示电路。数字温度计总体电路结构框图如 4.1图所示:AT89C2051主控制器DS18B20显示电路扫描驱动图 4.13. 硬件设计温度计电路设计原理图如下图所示,控制器使用单片机 AT89C2051,温度传感器使用 DS18B20,使用四位共阳 LED数码管以动态扫描法实现温度显示。主控制器 单片机 AT89C2051具有低电压供电和小体积等特点,两个端口刚好满足电路系统的设计需要,很适合便携手持式产品的设计使用。系统可用两节电池供电。AT89C2051的引脚图如右图所示: 1、VCC:电源电压。2、GND:地。 3、P1 口:P1 口
4、是一个 8位双向 I/O口。口引脚 P1.2P1.7提供内部上拉电阻,P1.0 和 P1.1要求外部上拉电阻。P1.0 和 P1.1还分别作为片内精密模拟比较器的同相输入(ANI0)和反相输入(AIN1)。P1 口输出缓冲器可吸收 20mA电流并能直接驱动 LED显示。当 P1口引脚写入“1”时,其可用作输入端,当引脚 P1.2P1.7用作输入并被外部拉低时,它们将因内部的写入“1”时,其可用作输入端。当引脚 P1.2P1.7用作输入并被外部拉低时,它们将因内部的上拉电阻而流出电流。 4、P3 口:P3 口的 P3.0P3.5、P3.7 是带有内部上拉电阻 的七个双向 I/O口引脚。P3.6
5、用于固定输入片内比较器的输出信号并且它作为一通用 I/O引脚而不可访问。P3 口缓冲器可吸收 20mA电流。当 P3口写入“1”时,它们被内部上拉电阻拉高并可用作输入端。用作输入时,被外部拉低的 P3口脚将用上拉电阻而流出电流。 5、RST:复位输入。RST 一旦变成高电平所有的 I/O引脚就复位到“1” 。当振荡器正在运行时,持续给出 RST引脚两个机器周期的高电平便可完成复位。每一个机器周期需 12个振荡器或时钟周期。 6、XTAL1:作为振荡器反相器的输入和内部时钟发生器的输入。 7、XTAL2:作为振荡器反相放大器的输出。 总 线 驱 动 器 74LS24474LS244 为 3 态
6、8 位 缓 冲 器 , 一 般 用 作 总 线 驱 动 器 。 引 脚 图 见 上 图 。显示电路 显示电路采用 4位共阳极 LED数码管,从 P1口输出段码,列扫描用P3.0P3.3 口来实现,列驱动用 8055三极管。温度传感器 DS18B20DS18B20的性能特点:1、适应电压范围更宽,电压范围:3.05.5V,在寄生电源方式下可由数据线供电。 2、独特的单线接口方式,DS18B20 在与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20的双向通讯。 3、 DS18B20 支持多点组网功能,多个 DS18B20可以并联在唯一的三线上,实现组网多点测温。 4、DS18B20
7、在使用中不需要任何外围元件,全部 传感元件及转换电路集成在形如一只三极管的集成电路内。 5、温范围55+125,在-10+85时精度为0.5。 6、可编程 的分辨率为 912 位,对应的可分辨温度分别为 0.5、0.25、0.125和 0.0625,可实现高精度测温。 7、在 9位分辨率时最多在 93.75ms内把温度转换为数字,12 位分辨率时最多在 750ms内把温度值转换为数字,速度更快。8、测量结果直接输出数字温度信号,以“一线总线“串行传送给 CPU,同时可传送 CRC校验码,具有极强的抗干扰纠错能力。9、负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作。DS18B2
8、0 与单片机的接口电路(引脚图见右图)DS18B20可以采用电源供电方式,此时 DS18B20的第 1 脚接地,第 2脚作为信号线,第 3脚接电源。 4. 软件设计系统程序主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和显示数据刷新子程序等。4.1 主程序主程序的主要功能是负责温度的实时显示、读出并处理 DS18B20的测量温度值。温度测量每 1s进行一次。主程序流程图如图 4.1所示。4.2 读出温度子程序读出温度子程序的主要功能是读出 RAM中的 9字节。在读出时必须进行CRC校验,校验有错时不能进行温度数据的改写。读出温度子程序流程图如下图所示:读出温度子程序 读出温
9、度子程序的主要功能是读出 RAM中的 9字节。在读出时须进行 CRC校验,校验有错时不进行温度数据的改写。得出温度子程序流程图如下图所示。初始化调用显示子程序1s 到 ?初次上电读出温度值温度计酸处理显示数据刷新发温度转换开始命令发 DS18B20 复位指令 CRC 校验正确?温度转换命令子程序 温度转换命令子程序主要是发温度转换开始命令。当采用 12位分辨率时,转换时间约为 750ms。在本程序设计中,采用 1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如下图所示。计算温度子程序 计算温度子程序将 RAM中读取值进行 BCD码的转换运算,并进行温度值正负的判定。计算温度子程序流程
10、图如下左图所示.现实数据刷新子程序 现实数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高数据显示位为 0时,将符号显示位移入下一位。现实数据刷新子程序流程图如下右图所示.发跳过 ROM 指令发读取温度指令读取操作,CRC 校验9 字节完?移入温度暂存器结束发 DS18B20 复位命令发温度转换开始命令结束发跳过 ROM 命令开始 计算小数位温 度 BCD 值温度数据移入显示寄存器十位数 0?5. 系统调试系统的调试以程序调试为主。硬件调试比较简单,首先检查电感的焊接是否正确,然后可用万用表测试或通电检测。软件调试可以先编写显示程序并进行硬件的正确性检验,然后分别进行主程序、读出
11、温度子程序、温度转换命令子程序、计算温度子程序和现实数据刷新子程序等的编程及调试由于 DS18B20与单片机采用串行数据传送,因此,对 DS18B20进行读/写编程时必须严格地保证读/写时序;否则将无法读取测量结果。本程序采用单片机汇编或 C语言编写用 Wave3.2或 Keil C51编译器编程调试。软件调试到能显示温度值,并且在有温度变化时显示温度能改变,救基本完成。性能测试可用制作的温度机和已有的成品温度计同时进行测量比较。由于DS18B20的精度很高,所以误差指标可以限制在 0.5以内。另外,-55+125的测温范围使得该温度计完全适合一般的应用场合,其低电压供电特性可做成用电池供电的
12、手持温度计。DS18B20温度计还可以在高低温报警、远距离多点测温控制等方面进行应用开发,但在实际设计中应注意以下问题;1、DS18B20 工作时电流高大 1.5mA,总线上挂接点数较多且同时进行转换时要考虑增加总线驱动,可用单片机端口在温度转换时导通一个 MOSFET供电。温度零下?温度值取补码置一标志置+标志计算整数位温 度 BCD 值结束百位数 0?十位数显示符号百位数不显示百位数显示数据(不显示符号)结束2、连接 DS18B20的总线电缆是有长度限制的,因此在用 DS18B20进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配等问题。3、在 DS18B20测温程序设计中,向 DS
13、18B20发出温度转换命令后,程序总要等待 DS18B20的返回信号。一旦某个 DS18B20接触不好或断线,当程序读DS18B20时,将没有返回信号,程序进入死循环。这一点在进行 DS18B20硬件连接和软件设计时要给予一定的重视。6. 设计总结历时 2个星期的单片机课程设计已经结束了,在这两个星期的时间里,我们在老师的指导下完成了基于 DS18B20的数字温度计的设计和制作。在进行实验的过程中,我们了解并熟悉 DS18B20、AT89C2051 以及 74LS244的工作原理和性能。并且通过温度计的制作,我们将电子技能实训课堂上学到的知识进行运用,并在实际操作中发现问题,解决问题,更加增加
14、对知识的认识和理解。在课程设计的过程中,也遇到了一些问题。比如最开始根据课本上的电路图进行合理的设计布局和布线。有些同学的布局不合理,导致焊接的过程中任务相当繁重,并且不美观。在之后的烧程序调试的时候,出现问题之后,没有合理布线的同学在查找问题的过程中相当棘手。在焊接过程中,出现最多的就是虚焊问题。对于这个问题,在焊接的过程中,我尽量依照书中的指导,尽量将焊点焊成水滴状,最后接电后再根据数码管的显示情况进行逐个排查。在将程序烧到单片机之后,接上电源,发现数码管没有出现正常的“000.0”,而是出现了“666.6” ,在检查线路无误之后,和其他的同学讨论之后得出结论:书中程序是对于单片机、电阻及
15、数码管是直接连接而设计的,而在加入了 74LS244 之后,要将 8 个输入输出端口进行掉序。于是,我便将 8 个端口进行调换,之后再次接通电源,数码管显示“000.0” ,调试成功。在自己的温度计制作完成之后,我还帮助其他没有完成的同学进行检修,并且成功帮助 2 位同学找到问题进行解决,最后都调试成功。总之,在这 2 个星期中,通过自己在实验室动手制作数字温度计,不仅将课本的知识与实践相结合,而且在实践中更加深入了解书中原本抽象的知识。这也是整个课程设计中最有收获的地方。7. 附 录源程序代码/*/ / DS18B20温度计 C程序/ 2005.2.28通过调试/*/使用 AT89C2051
16、单片机,12MHZ 晶振,用共阳 LED数码管/P1口输出段码,P3 口扫描/#pragma src(d:aa.asm)#include “reg51.h“#include “intrins.h“ /_nop_();延时函数用#define Disdata P1 /段码输出口#define discan P3 /扫描口#define uchar unsigned char#define uint unsigned intsbit DQ=P37; /温度输入口sbit DIN=P10; /LED小数点控制uint h;/*温度小数部分用查表法*/Uchar code ditab16=0x00,0
17、x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09uchar code dis_712=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf;/* 共阳 LED段码表 “0“ “1“ “2“ “3“ “4“ “5“ “6“ “7“ “8“ “9“ “不亮“ “-“ */ uchar code scan_con4=0xfe,0xfd,0xfb,0xf7; / 列扫描控制字uchar data temp_data2=0x00,0x00;
18、/ 读出温度暂放uchar data display5=0x00,0x00,0x00,0x00,0x00;/显示单元数据,共 4个数据,一个运算暂存用/*11微秒延时函数*/void delay(uint t)for(;t0;t-);/*显示扫描函数*/scan()char k;for(k=0;k0; i-) /DQ=1;_nop_();_nop_(); DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();/5usDQ = val /最低位移出delay(6); /66usval=val/2; /右移一位DQ = 1;delay(1); /*18B20
19、读 1个字节函数*/从总线上读取一个字节uchar read_byte(void)uchar i;uchar value = 0;for (i=8;i0;i-)DQ=1;_nop_();_nop_();value=1;DQ = 0; /_nop_();_nop_();_nop_();_nop_(); /4usDQ = 1;_nop_();_nop_();_nop_();_nop_(); /4us if(DQ)value|=0x80;delay(6); /66usDQ=1;return(value);/*读出温度函数*/read_temp()ow_reset(); /总线复位write_byte
20、(0xCC); / 发 Skip ROM命令write_byte(0xBE); / 发读命令temp_data0=read_byte(); /温度低 8位temp_data1=read_byte(); /温度高 8位ow_reset();write_byte(0xCC); / Skip ROMwrite_byte(0x44); / 发转换命令/*温度数据处理函数*/work_temp()uchar n=0; /if(temp_data1127)temp_data1=(256-temp_data1);temp_data0=(256-temp_data0);n=1;/负温度求补码display4=
21、temp_data0display0=ditabdisplay4;display4=(temp_data0/display3=display4/100;display1=display4%100;display2=display1/10;display1=display1%10;if(!display3)display3=0x0A;if(!display2)display2=0x0A;/最高位为 0时都不显示if(n)display3=0x0B;/负温度时最高位显示“-“/ /*主函数*/main()Disdata=0xff; /初始化端口discan=0xff;for(h=0;h4;h+)displayh=8;/开机显示 8888ow_reset(); / 开机先转换一次write_byte(0xCC); / Skip ROMwrite_byte(0x44); / 发转换命令for(h=0;h500;h+)scan(); /开机显示“8888“2 秒while(1)read_temp(); /读出 18B20温度数据work_temp(); /处理温度数据for(h=0;h500;h+)scan(); /显示温度值 2秒/*结束*/作品展示