
随着单片机技术的不断发展,单片机在日用电子产品中的应用越来越广泛,广泛应用于冰箱、空调器、粮仓等日常生活中温度的测量和控制。传统的温度计有反应速度慢、读数麻烦、测量精度不高、误差大等缺点,本课程利用集成温度传感器DS18B20设计并制作了一款基于STCC52的两位数码管显示的数字温度计,其电路简单,软硬件结构模块化,易于实现。
目前温度计的发展很快,从原始的玻璃管温度计发展到了现在的热电阻温度计、热电偶温度计、数字温度计、电子温度计等等。目前的温度计中传感器是它的重要组成部分,它的精度灵敏度基本决定了温度计的精度、测量范围、控制范围和用途等。传感器应用极其广泛,目前已经研制出多种新型传感器[1]。
通过“数字温度计的设计”的设计过程,结合所学的课程,掌握目前自动化仪表的一般设计要求、工程设计方法、开发及设计工具的使用方法,通过这一设计实践过程,锻炼学生的动手能力和分析、解决问题的能力;积累经验,培养按部就班、一丝不苟的工作和对所学知识的综合应用能力。
1.1 单片机的发展概况
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。概括的讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机了解计算机原理与结构的最佳选择[2]。
可以说,二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。不过,这种电脑,通常是指个人计算机,简称PC机。它由主机、键盘、显示器等组成)。还有一类计算机,大多数人却不怎么熟悉。这种计算机就是把智能赋予各种机械的单片机(亦称微控制器)。顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。因为它体积小,通常都藏在被控机械的“肚子”里。它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。现在,这种单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。
第一代:七十年代后期,4位逻辑控制器件发展到8位。使用NMOS工艺(速度低,功耗大、集成度低)。代表产品:MC6800、Intel8048。
第二代:八十年代初,采用CMOS工艺,并逐渐被高速低功耗的HMOS工艺代替。代表产品:MC146805、Intel8051。
第三代:近十年来,MCU的发展出现了许多新特点:
(1) 在技术上,由可扩展总线型向纯单片型发展,即只能工作在单片方式。
(2) MCU的扩展方式从并行总线型发展出各种串行总线。
(3) 将多个CPU集成到一个MCU中。
(4) 在降低功耗,提高可靠性方面,MCU工作电压已降至3.3V。
:FLASH的使用使 MCU 技术进入了。数字式温度计要求测温范围在-50到110度,精度误差在0.5度以内,四位七段LED数码管直读显示。在温度超过设定值时有声光报警。
1.2 传感器的发展趋势
随着现代科技的发展,传感器技术的应用越来越广泛。其中,在传感器家族中占有重要地位的成员——温度传感器的应用也深入了各个领域。
传感器就是能感知外界信息并能按一定规律将这些信息转换成可用信号的装置;简单说传感器是将外界信号转换为电信号的装置。所以传感器由信号感受器和信号转换器组成,它能够感受一定的信号并将这种信号转换成信息处理系统便于接收和处理的信号(如电信号和光信号),有的半导体敏感元器件可以直接输出电信号,本身就构成传感器。敏感元器件品种繁多,就其感知外界信息的原理来讲,可分为:
① 物理类,基于力、热、光、电、磁和声等物理效应。
② 化学类,基于化学反应的原理。
③ 生物类,基于酶、抗体、和激素等分子识别功能。
通常据其基本感知功能可分为热敏元件、光敏元件、气敏元件、力敏元件、磁敏元件、湿敏元件、声敏元件、放射线敏感元件、色敏元件和味敏元件等十大类。
温度传感器是最早开发,应用最广的一类传感器。根据美国仪器学会的调查,1990年,温度传感器的市场份额大大超过了其他的传感器。从17世纪初伽利略发明温度计开始,人们开始利用温度进行测量。真正把温度变成电信号的传感器是1821年由德国物理学家赛贝发明的,这就是后来的热电偶传感器。五十年以后,另一位德国人西门子发明了铂电阻温度计。在半导体技术的支持下,本世纪相继开发了半导体热电偶传感器、PN结温度传感器和集成温度传感器。与之相应,根据波与物质的相互作用规律,相继开发了声学温度传感器、红外传感器和微波传感器[3]。
智能温度传感器(亦称数字温度传感器)是在20世纪90年代中期问世的。它是微电子技术、计算机技术和自动测试技术的结晶。目前,国际上已开发出多种智能温度传感器系列产品。智能温度传感器内部包含温度传感器、A/D传感器、信号处理器、存储器(或寄存器)和接口电路。有的产品还带多路选择器、控制器(CPU)、随机存取存储器(RAM)和只读存储器(ROM)。智能温度传感器能输出温度数据及相关的温度控制量,适配各种微控制器(MCU),并且可通过软件来实现测试功能,其智能化取决于软件的开发水平。
温度传感器的发展:
温度传感器,使用范围广,数量多,居各种传感器之首。温度传感器的发展大致经历了以下3个阶段:
1.传统的分立式温度传感器(含敏感元件),主要是能够进行非电量和电量之间转换。传统的分立式温度传感器——热电偶传感器。热电偶传感器是工业测量中应用最广泛的一种温度传感器,它与被测对象直接接触,不受中间介质的影响,具有较高的精度;测量范围广,可从-50~1600℃进行连续测量,特殊的热电偶如金铁——镍铬,最低可测到-269℃,钨——铼最高可达2800℃[4]。
2.模拟集成温度传感器/控制器。模拟集成温度传感器是采用硅半导体集成工艺制成的,因此又称硅传感器或单片集成温度传感器。模拟集成温度传感器是在20世纪80年代问世的,它将温度传感器集成在一个芯片上、可完成温度测量及模拟信号输出等功能。模拟集成温度传感器的主要特点是功能单一(仅测量温度)、测温误差小、价格低、响应速度快、传输距离远、体积小、微功耗等,适合远距离测温,不需要进行非线性校准,外围电路简单。
3.智能温度传感器。目前,国际上新型温度传感器正从模拟式想数字式、集成化向智能化及网络化的方向发展。
温度传感器按传感器与被测介质的接触方式可分为两大类:一类是接触式温度传感器,一类是非接触式温度传感器。接触式温度传感器的测温元件与被测对象要有良好的热接触,通过热传导及对流原理达到热平衡。这种测温方法精度比较高,并可测量物体内部的温度分布。但对于运动的、热容量比较小的及对感温元件有腐蚀作用的对象,这种方法将会产生很大的误差。
非接触测温的测温元件与被测对象互不接触。常用的是辐射热交换原理。此种测稳方法的主要特点是可测量运动状态的小目标及热容量小或变化迅速的对象,也可测量温度场的温度分布,但受环境的影响比较大。
目前的智能温度传感器(亦称数字温度传感器)是在20世纪90年代中期问世的,它是微电子技术、计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配各种微控制器(MCU)。社会的发展使人们对传感器的要求也越来越高,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展[3]。本文将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对以此传感器,STCC52单片机为控制器构成的数字温度测量装置的工作原理及程序设计作了详细的介绍。与传统的温度计相比,其具有读数方便,测温范围广,测温准确,输出温度采用数字显示,主要用于对测温要求比较准确的场所,或科研实验室使用。该设计控制器使用ATMEL公司的ATS51单片机,测温传感器使用DALLAS公司DS18B20,用四位数码管来实现温度显示[5]。
1.3 数字温度计设计方案选择
本系统设计主要由温度测量和数据采集和报警装置三部分电路组成,其中温度测量的部分是最重要的部分,其实现的方法有很多种,下面将列出两种在日常生活中和工农业生产中经常用到的实现方案。
方案一:使用热敏电阻
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。例如环氧封装系列NTC热敏电阻如下图1-1。
图1-1 环氧封装系列NTC热敏电阻
方案二:采用数字温度芯片DS18B20
采用数字温度芯片DS18B20测量温度,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线性较好。在0—100摄氏度时,最大线形偏差小于1摄氏度。DS18B20的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器STCC52构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。这样,测温系统的结构就比较简单,体积也不大。采用51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便[6]。DS18B20温度传感器的引脚和正视及俯视图如图1-2所示:
图1-2 DS18B20的引脚图
另外此设计还可以与PC机通信上传数据,STCC52在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。
该系统利用STCC52芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。该系统扩展性非常强,它可以在设计中加入时钟芯片DS1302以获取时间数据,在数据处理同时显示时间,并可以利用AT24C16芯片作为存储器件,以此来对某些时间点的温度数据进行存储,利用键盘来进行调时和温度查询,获得的数据可以通过MAX232芯片与计算机的RS232接口进行串口通信,方便的采集和整理时间温度数据[7]。
通过两种温度测量方案的比较和考量,容易看出方案一的测温装置可测温度范围宽、体积小,但是线性误差较大。方案二的测温装置电路简单、并且由于DS18B20是数字式温度传感器,无需连接A/D转换等复杂电路,从而精确度较高、实现方便、软件设计也比较简单,所以此次温度控制系统中的温度测量元件采用DS18B20,并应用方案二的设计思路。
1.4 本章小结
本章首先进行了设计的方案论证,从理论和实际应用两方面说明了在简单的温度测量系统中为什么要选择数字温度传感器DS18B20,在控制器上为什么选择51单片机家族中的STCC52单片机作为主控制器。然后对数字温度计设计中所需要的主要元器件以及温度显示方式进行了解。并且大致了解了设计的思路和步骤。
第2章 硬件的设计
2.1 方案总体设计框图
方案的总体设计要求:
(1) 用DS18b20作为温度传感器构建温度检测电路
(2) 构建包括显示电路和报警电路的系统硬件图
(3) 分析设计的扩展电路及应用
设计方案的总体设计完成后用keil软件编写系统程序,要求烧写程序后能够实现显示电路对温度的显示,以及报警电路的警报。
设计的总体框图如图2-1所示:
图2-1总体设计框图
2.2 系统主要硬件组成
本设计构成的温度控制系统由三部分组成:DS18B20温度传感器,STCC52所构成的最小系统,显示模块和声光报警构成,实现的功能是测试室内温度并用四位数码管显示温度,在温度超过一定数值时候实现声光报警。并要求温度测量误差在一定范围内。
2.1.1最小系统
最小系统由复位电路,时钟电路,电源电路和一个STCC52和一个MAX232构成,最小系统的电路结构图如图2-2所示:
图2-2 最小系统电路结构图
本次设计采用的复位电路是开关复位电路,因为有开关的复位电路方便使用,时钟电路有内部方式时钟电路和外部方式时钟电路,由于外部方式时钟电路需要外部振荡源,增加了设计的硬件连接难度,故而选择相对较简单的内部方式时钟电路。并且电容选择在50PF~30PF之间,晶体在1.2MHz~12MHz之间。本设计选择的型号为30PF电容和12MHz的晶振[8]。
实物连接图用手机拍照如图2-3,图中晶振为了美观放在单片机的底座下面。
图2-3 最小系统电路结构图
2.1.2温度显示模块设计
温度控制系统显示模块设计采用四位七段数码管显示温度数据,数码管采用共阳的四位七段数码管并用四个三极管连接电阻进行放大,在P0口加八个上拉电阻,阻值为470K,数码管的四位分别连接单片机的P2.0~P2.3。四位数码管的引脚图如图2-4所示:
图2-4 四位共阳数码光引脚图
数码管以及驱动电路部分与单片机的连接电路图如图2-5:
图2-5 数码管驱动电路连接电路图
显示器是最常用的输出设备,特别是数码管和液晶显示器,由于结构简单,价格便宜,接口电路简单,故而得到广泛的应用,点亮动态显示器本设计采用动态显示,动态显示即一位一位的点亮各位显示器,由于动态显示中采用P0口作为段数据口,由于布线时将DS18B20放在P1口上,故而采用P0口的八位口作为段数据口,由于P0口没有P1口的驱动能力强,故而选择给P0口加上拉电阻,上拉电阻的阻值为470欧姆[9]。
由于数码管是共阳的,放大电路采用PNP型三极管并且型号为S8550,放大电路中电阻阻值采用1K的电阻。具体实物焊接图如图2-6:
图2-6 数码管显示部分实物
2.1.3 报警模块设计
设计中的报警模块设计采用声光同时报警,声光报警装置由蜂鸣器和发光二极管构成,将单片机的P3.4引脚接红色发光二极管并连接470欧姆的电阻,并且发光二极管的正极接电源,那么当给P3.4引脚低电平的时候,发光二极管点亮,能够实现二极管发光报警。声光报警的实物图如图2-7[10]。
图2-7 声光报警实物
单片机引脚的P3.7接一个电阻和S8550的PNP类型的三极管去驱动蜂鸣器,同样当给P3.7低电平的时候,蜂鸣器会导通。
蜂鸣器的原理:螺旋形和盆形的基本工作原理是一样的,都由铁芯、磁性线圈、触点、衔铁、膜片等组成。当司机按下按钮时,电流经触点通过线圈,线圈产生磁力吸下衔铁强制膜片移动,衔铁移动使触点断开,电流中断磁力消失,膜片在本身的弹性和弹簧片作用下又同衔铁一起恢复原位,触点闭合电路接通,电流再通过触点流经线圈产生磁力,重复上述动作。如此反复循坏膜片不断振动,从而出音响。共鸣板与膜片刚性联接,可使振动平顺发出声音更加悦耳。
在设计中同时给P3.4和P3.7低电平,并改编程序使蜂鸣器和红色发光二极管频闪。模块的与单片机的具体连接电路如图2-8。
图2-8 声光报警电路
2.3 DS18B20的通信协议及控制方法
DALLAS最新单线数字温度传感器DS18B20是一种新型的“一线器件”,其体积更小、更适用于多种场合、且适用电压更宽、更经济。DALLAS半导体公司的数字化温度传感器DS18B20是世界上第一片支持“一线总线”接口的温度传感器。温度测量范围为-55~+125摄氏度,可编程为9位~12位转换精度,测温分辨率可达0.0625摄氏度,分辨率设定参数以及用户设定的报警温度存储在EEPROM中,掉电后依然保存。被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可以在远端引入,也可以采用寄生电源方式产生,多个DS18B20可以并联到3根或2根线上,CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便[11]。
2.3.1 DS18B20性能特点
DS18B20的性能特点:
① 采用单总线专用技术,既可通过串行口线,也可通过其它I/O口线与微机接口,无须经过其它变换电路,直接输出被测温度值(9位二进制数,含符号位)。
② 测温范围为-55℃-+125℃,测量分辨率为0.0625℃。
③ 内含位经过激光修正的只读存储器ROM。
④ 适配各种单片机或系统机。
⑤ 用户可分别设定各路温度的上、下限。
⑥ 内含寄生电源。
2.3.2 DS18B20内部结构
DS18B20内部结构主要由四部分组成:位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。位光刻ROM是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号。位ROM结构图如图2-9所示。
图2-9 位ROM结构图
不同的器件地址序列号不同。DS18B20的管脚排列如图2-10所示。
图2-10 DS18B20引脚分布图
DS18B20高速暂存器共9个存储单元,如表2-1所示:
表2-1 DS18B20存储单元
| 序号 | 寄存器名称 | 作用 | 序号 | 寄存器名称 | 作用 |
| 0 | 温度低字节 | 以16位补码形式存放 | 4、5 | 保留 | 保留 |
| 1 | 温度高字节 | 6 | COUNT REMAIN | 计数寄存器 | |
| 2 | TH/用户字节1 | 存放温度上限 | 7 | COUNT PER℃ | 计数寄存器 |
| 3 | HL/用户字节2 | 存放温度下限 | 8 | CRC | CRC校验位 |
表2-2 DS18B20的RAM
| 高8位 | S | S | S | S | S | 26 | 25 | 24 |
| 低8位 | 23 | 22 | 21 | 20 | 2-1 | 2-2 | 2-3 | 2-4 |
DS18B20有六条控制命令,分别为温度转换,读暂存器代码,写暂存器命令,复制暂存器命令,以及读电源供电方式,具体代码和操作说明如表2-3所示:
表2-3 DS18B20控制指令
| 指令 | 约定代码 | 操作说明 |
| 温度转换 | 44H | 启动DS18B20进行温度转换 |
| 读暂存器 | BEH | 读暂存器9个字节内容 |
| 写暂存器 | 4EH | 将数据写入暂存器的TH、TL字节 |
| 复制暂存器 | 48H | 把暂存器的TH、TL字节写到E2RAM中 |
| 重新调E2RAM | B8H | 把E2RAM中的TH、TL字节写到暂存器TH、TL字节 |
| 读电源供电方式 | B4H | 启动DS18B20发送电源供电方式的信号给主CPU |
DS18B20器件要求采用严格的通信协议,以保证数据的完整性。该协议定义了几种信号类型:复位脉冲,应答脉冲时隙;写0,写1时隙;读0,读1时隙。与DS18B20的通信,是通过操作时隙完成单总线上的数据传输。发送所有的命令和数据时,都是字节的低位在前,高位在后[12]。
复位和应答脉冲时隙:
每个通信周期起始于微控制器发出的复位脉冲,其后紧跟DS18B20发出的应答脉冲,在写时隙期间,主机向DS18B20器件写入数据,而在读时隙期间,主机读入来自DS18B20的数据。在每一个时隙,总线只能传输一位数据。
当主机将单总线DQ从逻辑高拉到逻辑低时,即启动一个写时隙,所有的写时隙必须在60~120us完成,且在每个循环之间至少需要1us的恢复时间。写0和写1时隙如图所示。在写0时隙期间,微控制器在整个时隙中将总线拉低;而写1时隙期间,微控制器将总线拉低,然后在时隙起始后15us之释放总线。
2.4 DS18B20与单片机接口电路设计
2.4.1 DS18B20的硬件接口
单总线只有一根数据线。设备主机或从单片机通过一个漏极开路或三态端口连接至该数据线,这样允许设备在不发送数据时释放数据总线,以便总线被其它设备所使用。单总线端口为漏极开路其内部等效电路如图2-11所示,闲置状态为高电平。
图2-11 单总线的硬件接口示意图
本设计的整体设计思路:首先由温度传感器检测待测物的温度,并转化成数字信号送入单片机中进行运算处理,与设定温度比较后,再由单片机发出控制信号,控制加热丝工作,在整个工作过程中,待测物的温度始终都能得以显示。由于DS18B20温度传感器是数字输出,而且只占用一个I/O端口,因此它特别适合于微处理器控制的各种温度测控系统,避免了模拟温度传感器与微处理器接口时需要的A/D转换和较复杂的外围电路,缩小了系统的体积,提高了系统的可靠性,所以本系统采用美国DALLAS半导体公司生产的DS18B20数字温度传感器代替温度传感器经A/D转换环节。按照系统设计功能的要求,确定系统由3个模块组成:主控制器、测温电路和显示电路[13]。
在硬件上,DS18B20与单片机的连接有两种方法,一种是Vcc接外部电源,GND接地,I/O与单片机的I/O线相连;另一种是用寄生电源供电,此时UDD、GND接地,I/O接单片机I/O。外部电源供电方式是DS18B20最佳的工作方式,工作稳定可靠,抗干扰能力强,而且电路也比较简单,可以开发出稳定可靠的多点温度监控系统。站长推荐大家在开发中使用外部电源供电方式,毕竟比寄生电源方式只多接一根VCC引线。在外接电源方式下,可以充分发挥DS18B20宽电源电压范围的优点,即使电源电压VCC降到3V时,依然能够保证温度量精度。
设计中用单片机的P1.1口连接DS18B20,并在P1.1口加4.7K的上拉电阻,具体与单片机的电路连接图如图2-12:
图2-12 DS18B20与单片机连接电路
2.4.2 DS18B20测温原理
DS18B20的测温原理是:低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,DS18B20芯片中还含有计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理[14]。
在正常测温情况下,DS1820的测温分辨力为0.5℃,可采用下述方法获得高分辨率的温度测量结果:首先用DS1820提供的读暂存器指令(BEH)读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz,然后再用BEH指令取计数器1的计数剩余值Cs和每度计数值CD。考虑到DS1820测量温度的整数部分以0.25℃、0.75℃为进位界限的关系,实际温度Ts可用下式计算:
2.5 系统整体硬件电路
系统整体的硬件电路设计就是将上诉的DS18B20模块部分,显示模块部分,报警模块部分以及USB取电线和串口线的连接,实现系统的上电和主机的程序下载功能。实物图如图2-13所示。
图2-13 USB取电线实物连接
图2-14 串口线实物连接
系统的总体电路连接框图如图2-15。
图2-15 系统总体电路连接图
具体的实物连接图即是系统的总体电路连接再加上取电线和串口线共同构成了实物的温度控制系统,通过以上的硬件连接就可以实现对室温的测量以及显示,并可以界定上下限,进行声光双控的报警设置。
2.6 本章小结
本章主要研究了温度控制系统系统的硬件部分设计,并从单总线的概念和结构原理上对硬件部分的温度测量部分,温度显示部分和报警装置部分分别进行了的电路设计和实物焊接,并从DS18B20的使用特点等几个方面对系统的硬件结构进行了详细的说明,最后描述了系统的总体硬件设计方案。本章是整个设计的核心,通过正确的硬件设计再搭配合适的软件程序,才能设计出应用所需的温度控制系统[15]。
第3章 软件的设计
3.1 软件总体设计
系统总程序主要包括主程序、读出温度子程序、温度转换子程序、计算温度子程序、显示数据刷新子程序等。下面就DS18B20进行读取温度以及计算转换温度和进行显示温度的软件部分设计进行介绍。
由于DS18B20只有一根数据线,因此它和主机(单片机)通信是需要串行通信,而ATS51有两个串行端口,所以可以不用软件来模拟实现。经过单线接口访问DC18B20必须遵循如下协议:初始化、ROM操作命令、存储器操作命令和控制操作。要使传感器工作,一切处理均严格按照时序。
3.1.1 系统总程序设计
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值,温度测量每1s进行一次,口线要接5KΩ左右的上拉电阻。系统的主程序流程图如图3-1所示。
图3-1 主程序流程图
3.1.2 读温度子程序设计
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需要进行CRC校验,校验有错时不进行温度数据的改写。
DS18B20通过使用时间片来读出和写入数据,时间片用于处理数据位和进行何种指定操作的命令。它有写时间片和读时间片两种:
写时间片:当主机把数据线从逻辑高电平拉至逻辑低电平时,产生写时间片。有两种类型的写时间片:写1时间片和写0时间片。所有时间片必须有60微秒的持续期,在各写周期之间必须有最短为1微秒的恢复时间.
读时间片:从DS18B20读数据时,使用读时间片。当主机把数据线从逻辑高电平拉至逻辑低电平时产生读时间片。数据线在逻辑低电平必须保持至少1微秒;来自DS18B20的输出数据在时间下降沿之后的15微秒内有效。为了读出从读时间片开始算起15微秒的状态,主机必须停止把引脚驱动拉至低电平。在时间片结束时,I/O引脚经过外部的上拉电阻拉回高电平,所有读时间片的最短持续期为60微秒,包括两个读周期间至少1μs的恢复时间[16]。其程序流程图如图3-2所示。
图3-2 读出温度子程序流程图
具体获得温度程序设计如下
uint get_temperature()
{
float wendu,i_l;
ds_reset();
delay(1); //约2ms
ds_write_byte(0xcc);
ds_write_byte(0xbe);
tem_l=ds_read_byte();
tem_h=ds_read_byte();
temp=tem_h;
temp<<=8;
temp=temp|tem_l;
tem_xiaoshu=tem_l&0x0f;
tem_h&=0x0f;
tm_zhengshu=(tem_l>>4)|(tem_h<<4);
/wendu=temp*0.0625; //温度读取的解释我记录在 "倒塌 18B20"里面
//temp=wendu*10+0.5;
return temp;
}
3.1.3 温度转换子程序设计
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如图3-3所示。
图3-3 温度转换命令子程序流程图
具体程序如下进行温度转换:先初始化,然后跳过ROM:跳过位ROM地址,直接向ds18B20发温度转换命令,适合单片工作,发送温度转换命令:
void tem_change()
{
ds_reset();
delay(1); //约2ms
ds_write_byte(0xcc);
ds_write_byte(0x44);
}
3.1.4 计算温度子程序设计
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其流程图如图3-4所示。由于实际测量条件下是室温测量,因而没有设计到温度在零下的情况,故在此软件的设计中将此步骤省略。以便于程序的简便和使用。
图3-4 计算温度子程序流程图
相关的具体程序段如下:
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //不带小数点数字编码
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef}; //带小数点数字编码
3.2 显示数据的程序设计
显示数据子程序主要是对显示缓冲区中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。程序流程图如图3-5所示。
图3-5 显示数据刷新子程序流程图
数码管的显示程序段如下:
void display(uint temp)
{
uchar bai,shi,ge;
bai=temp/100;
shi=temp%100/10;
ge=temp%100%10;
dula=0;
P0=table[bai]; //显示百位
dula=1; //从0到1,有个上升沿,解除锁存,显示相应段
dula=0; //从1到0再次锁存
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(1); //延时约2ms
P0=table1[shi]; //显示十位
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(1);
P0=table[ge]; //显示个位
dula=1;
dula=0;
P0=0xfb;
wela=1;
wela=0;
delay(1);
}
3.3 本章小结
本章主要研究了温度控制系统系统的软件部分设计,从温度测量部分程序设计到温度显示部分的程序设计,以及报警装置部分的程序设计分别进行了的原理和程序分析,主要侧重于温度的读取和计算,最后再送显示数据程序部分已经比较简单,关键注意各个部分的子程序与总程序之间的衔接。分清主程序和小块程序,先从基本程序入手,逐步分析后再将各部分程序进行汇总。具体程序见附录二。本章是整个设计的灵魂核心,通过正确的硬件设计再搭配合适的软件程序,才能设计出应用所需的温度控制系统。
第4章 检测与调试
4.1 硬件的调试
硬件调试时利用开发系统,基本测试仪器,例如万用表和示波器等等,检查用户系统硬件中存在的故障,在具体调试过程中,分为静态调试与动态调试两步进行:
静态调试:是用户系统未工作时候的一种调试,步骤如下:
第一步:目测。检查外部的各种元件或者是电路是否有断点。
第二部:用万用表测试。先用万用表复核目测中有疑问的连接点,在检测各种电源线与接地线之间是否有短路现象。
第三部:加电检测。给电路板加电,检测所有的插座或者是硬件的电源是否复核要求的值。
第四步:联机检查。因为只有单片机开发系统才能完成对用户系统的调试工作。
动态调试:动态调试时在用户系统工作的情况下发现和排除用户系统硬件中存在的器件内部故障,器件连接逻辑错误等的一种硬件检查,动态调试的一般方法是由近及远,由分到合。
由近及远:是将信号流经的各器件按照距离单片机的逻辑距离进行由近及远的分层,然后分层调试,调试时,仍采用去掉无关元件的方法,逐层调试下去,就会定位故障元件了。
由分到合:是指首先按逻辑功能将用户系统硬件电路分为若干块,当调试电路时,与该元件无关器件全部从用户系统中去掉,这样可以将故障范围限定在某个局部的电路上,当各块电路无故障后,将各电路逐块加入系统中,再对各块电路功能及各电路之间可能存在相互联系进行调试。由分到合的调试即告完成[17]。
硬件连接正确并调试没有发现错误后,该设计的硬件实物图如图4-1。
图4-1 硬件实物总图
4.2 软件的调试
软件调试是通过对用户程序的汇编,连接,执行来发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程。程序运行后编辑,查看程序是否有逻辑的错误。
在对硬件调试后再对软件进行,因为先对硬件检查没有问题的情况下再对软件进行调试,本设计中所选的是KEIL编译软件,该软件以它的代码紧凑和使用方便等优点优于其他编译器。
首先对声光报警的软件部分进行调试,打开keil软件后,建立工程后,再新建一个程序文件,将其添加进入工程文件后,开始对编写声光报警的程序,编写语言利用C语言。
例如编写如下程序使之达到声光报警:
#include sbit LABA=P3^7; sbit LED=P3^4; void main() { int j; while(1) { LABA=0;LED=0; for(j=0;j<30000;j++); LABA=1;LED=1; for(j=0;j<30000;j++); } Keil软件编译窗口如图4-2。 图4-2 keil软件调试界面 然后对程序进行检查,软件会自动检测它的正确性,可以根据提示栏中的内容逐块逐步逐句的分析程序错误的地方。当程序没有错误时,软件不报错,这里可以添加生成一个HEX文件以便于烧写程序。 连接好串口之后,打开烧写软件,并打开HEX文件,开始后给系统上电,就会显示出声光报警了。烧写软件的界面如下图4-3。 图4-3 烧写软件界面 根据以下步骤分别编译其他软件块的程序,并进行纠错查错,最后实现本次设计所要求的功能。实物图如下图4-4。 图4-4 烧录程序后的数码管显示图 4.3 温度显示结果的分析 由于温度控制系统设计过程中存在的误差,可能导致测量结果存在一定的偏差,下面对测量结果每半分钟进行采样一次,取10次采样结果,并利用普通温度计的标准温度与测量温度进行参照对比,以便于分析本次设计的实验结果以及误差分析。 采样结果如表4-1: 表4-1 调试结果 单位:℃ 实验 测量值 4.4 本章小结 本章主要对温度控制系统设计的软件部分和硬件部分进行检测和调试,通过硬件的调试确定硬件焊接没有错误之后,利用KEIL软件对设计中的各部分子程序进行程序的纠错和调试,并将错误的地方改正过来,最后通过烧写软件将正确的程序下载到单片机内,实现温度控制的显示和报警等一系列过程,最后对温度显示的数据进行了初步简要的分析,大致确定了误差范围,并成功完成实验目的。 结 论 通过对温度控制系统设计的研究,了解了STCC52单片机的基本性能,引脚及外部总线分布,熟悉单片机的内部组成,能够熟练掌握单片机复位,时钟等和中断控制的知识,并应用到设计的软件中。 本次设计的温度控制系统只是单片机广泛应用于各行各业中的一例,相信以后单片机的应用会更加广泛化。另外对本设计还可以作一些扩展,使单片机的应用越来越广泛,由于单片机的运算功能较差,往往需要借助计算机系统,因此单片机和PC机进行远程通信更具有实际意义。 本设计总结: (1)MSC-51系列单片机与温度传感器之间可以实现简单温度测量。 (2)温度传感器DS18B20是单总线模式与单片机进行通信。 (3)数码管及蜂鸣器分别用于显示温度和报警装置的研究。 (4)Keil软件适用于单片机编译程序。 设计中利用KEIL软件对程序进行编译,通过对程序的分析,明确温度传感器DS18B20的单总线和数据传入方式。总结DS18B20的初始化程序和读程序以及写程序,本设计能够实现的功能是: (1) 对室内温度的准确显示。 (2) 实现在温度范围内的越界声光报警。 致 谢 在毕业设计期间,我的指导教师李艳辉老师不但给我提供了良好的设计环境,而且自始至终给我悉心指教和细心的指导。与接触的这段时间,从她的身上学到的东西,将会使我受益终生。毕业设计的顺利完成,更是与和所有老师和学长所给予的正确指导和无私的帮助是分不开的,借此论文完成之际,我要向和所有老师表示深深的谢意! 毕业设计过程中,我竭尽能力完成了设计任务,这期间,同学以及研究生学长给予了我帮助和鼓励,不仅帮助我解决了一些难题,更给予支持和鼓励,有了他们,我才更迅速准确的完成了设计,在此,对于我的同学和高年级学长们表示深深地谢意。 最后,感谢学校提供的实验场所,让我们可以有良好的环境去进行毕业设计,再次感谢我的指导老师李艳辉老师,还要感谢刘远红老师和所有老师对我的严格要求和指导。我会在老师的教导下更加努力认真的完成今后的任务。在此,望广大老师和同学们批评和指正。 参考文献 [1] 孙育才.单片微型计算机及其应用[M].东南大学出版社,2004,(07):16-17. [2] 沈德金.单片机接口电路与应用程序实例[M].北京航天航空大学出版社,1990,(10):116-117. [3] 李广弟.单片机基础[M].北京:北京航空航天大学出版社,1994,(02):1-3. [4] 冯博琴.微型计算机原理与接口技术[M].清华大学出版社,2002,(03):17-18. [5] 沈德金.单片机接口技术实验指导[M].北京:北京航空航天大学出版社,1993,(9):6-7. [6] 李朝青.单片机原理及接口技术[M].杭州:北京航空航天大学出版社,1998,(5):8-10. [7] Philips.80c51-based 8-bit Microcontrollers[M].1994,(7):36-37. [8] Philips.PCF8563 Real-time Clock/calendar Product Specification[EB].1999. [9] 徐爱钧.单片机高级语言C51应用程序设计[M].北京:电子工业出版社.2002. [10] 阎石.数字电子技术基础[M].北京:高等教育出版社,19,(11):16-17. [11] Richard c.Dorf.modern control systerm[M].Science Publishing House,2002. [12] Labrosse J J.嵌入式实时操作系统[M].邵贝贝等译.北京:北京航空航天大学出版社,2003,(07):96-97. [13] 张幽彤.MCS-8098系统使用大全[M].北京:清华大学出版社,1993,(12):21-23. [14] Mifarel.Standerd Card IC S50 Functional Specification DATA SHEET[M].Philips,2001,(02):14-15. [15] P.B.Coates.Wavelength Specification in Multi-Wave length Pyrometer [M]. High Tempand HighPress,1988,(07):126-128. [16] A.Rosso,F.Righini. A new Transfer Atandard Pyrometer[M]. Measurement,1985,(04):4-6. [17] Lee C C.Fuzzy logic in Control System[M].Fuzzy Controller IEEE Trans,SMC,1990,( 11):71-72. 附录一 元件清单 名称 型号规格 图形符号 数量 单片机 STCC52 1 LED数码显示管 四位一体(共阳) 1 电阻 1K欧姆 6 电阻 470欧姆 2 电阻 10K欧姆 1 三极管 S8550 6 有极性电容 10UF 1 无极性电容 30PF 2 无极性电容 104 2 晶振 12MHz 1 按键开关 SW-PW 1 发光二极管 LED 1 蜂鸣器 Beer 1 温度传感器 DS18B20 1 串口下载线 1 USB取电线 1 附录二 程序 #include "reg52.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int sbit ds=P1^1; sbit p20=P2^0; sbit p21=P2^1; sbit p22=P2^2; sbit p23=P2^3; uchar flag,caiyang_flag; uint temp,dingshi; //参数temp一定要声明为 int 型 uchar tem_h,tem_l,tem_zhengshu,tem_xiaoshu; uchar temp_disp[3]={0,0,0}; uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef}; //带小数点数字编码 /*延时函数*/ void TempDelay (uchar us) { while(us--); } void delay(uint ms) { while(ms--); } /*void delay(uint count) //延时子函数 { uint i; while(count) { i=200; while(i>0) i--; count--; } }*/ void init_com() { TMOD=0x21; //设置定时器1为模式2 TH1=0xfd; //装初值设定波特率 TL1=0xfd; TR1=1; //启动定时器 TH0=0XFC; TL0=0X17; TR0=1; PCON=0; //波特率不倍频 SCON=0x50; //波特率不倍频 /*数码管的显示 */ void display(uint temp) { uchar bai,shi,ge; bai=temp/100; shi=temp%100/10; ge=temp%100%10; dula=0; P0=table[bai]; //显示百位 dula=1; //从0到1,有个上升沿,解除锁存,显示相应段 dula=0; //从1到0再次锁存 wela=0; P0=0xfe; wela=1; wela=0; delay(1); //延时约2ms P0=table1[shi]; //显示十位 dula=1; dula=0; P0=0xfd; wela=1; wela=0; delay(1); P0=table[ge]; //显示个位 dula=1; dula=0; P0=0xfb; wela=1; wela=0; delay(1); }*/ /***************************************** 时序:初始化时序、读时序、写时序。 所有时序都是将主机(单片机)作为主设备,单总 线器件作为从设备。而每一次命令和数据的传输 都是从主机主动启动写时序开始,如果要求单总 线器件回送数据,在进行写命令后,主机需启动 读时序完成数据接收。数据和命令的传输都是低 位在先。 初始化时序:复位脉冲 存在脉冲 读;1 或 0时序 写;1 或 0时序 只有存在脉冲信号是从18b20(从机)发出的,其 它信号都是由主机发出的。 存在脉冲:让主机(总线)知道从机(18b20)已 经做好了准备。 ******************************************/ /*初始化:检测总线控制器发出的复位脉冲 和ds18b20的任何通讯都要从初始化开始 初始化序列包括一个由总线控制器发出的复位脉冲 和跟在其后由从机发出的存在脉冲。 初始化:复位脉冲+存在脉冲 具体操作: 总线控制器发出(TX)一个复位脉冲 (一个最少保持480μs 的低电平信号),然后释放总线, 进入接收状态(RX)。单线总线由5K 上拉电阻拉到高电平。探测到I/O 引脚上的上升沿后 DS1820 等待15~60μs,然后发出存在脉冲(一个60~240μs 的低电平信号)。具体看"倒塌 18b20"文档里的 " 单线复位脉冲时序和1-wire presence detect "的时序图*/ void ds_reset(void) { ds=1; _nop_(); //1us ds=0; TempDelay(80); //当总线停留在低电平超过480us,总线上所以器件都将被复位,这里//延时约530us总线停留在低电平超过480μs,总线上的所有器件都 //将被复位。 _nop_(); ds=1; TempDelay(5); _nop_(); _nop_(); _nop_(); if(ds==0) flag=1; //detect 18b20 success else flag=0; //detect 18b20 fail TempDelay(20); _nop_(); _nop_(); ds=1; //再次拉高总线,让总线处于空闲状态 } /*---------------------------------------- 读/写时间隙: DS1820 的数据读写是通过时间隙处理 位和命令字来确认信息交换。 ------------------------------------------*/ bit ds_read_bit(void) //读一位 { bit dat; ds=0; //单片机(微处理器)将总线拉低 _nop_(); //读时隙起始于微处理器将总线拉低至少1us ds=1; //拉低总线后接着释放总线,让从机18b20能够接管总线,输出有效数据 _nop_(); _nop_(); dat=ds; TempDelay(10); return(dat); } uchar ds_read_byte(void ) //读一字节 { uchar value,i,j; value=0; //一定别忘了给初值 for(i=0;i<8;i++) { j=ds_read_bit(); value=(j<<7)|(value>>1); } return(value); //返回一个字节的数据 } void ds_write_byte(uchar dat) //写一个字节 { uchar i; bit onebit; //一定不要忘了,onebit是一位 for(i=1;i<=8;i++) { onebit=dat&0x01; dat=dat>>1; if(onebit) //写 1 { ds=0; _nop_(); _nop_(); //看时序图,至少延时1us,才产生写"时间隙" ds=1; //写时间隙开始后的15μs内允许数据线拉到高电平 TempDelay(5); } else //写 0 { ds=0; TempDelay(8); ds=1; _nop_(); _nop_(); } } } /***************************************** 主机(单片机)控制DS18B20完成温度转换要经过三个步骤: 每一次读写之前都要18B20进行复位操作,复位成功后发送 一条ROM指令,最后发送RAM指令,这样才能对DS18b20进行 预定的操作。 复位要求主CPU将数据线下拉500us,然后释放,当ds18B20 受到信号后等待16~60us,后发出60~240us的存在低脉冲, 主CPU收到此信号表示复位成功 ******************************************/ /*---------------------------------------- 进行温度转换: 先初始化 然后跳过ROM:跳过位ROM地址,直接向ds18B20发温度转换命令,适合单片工作 发送温度转换命令 ------------------------------------------*/ void tem_change() { ds_reset(); delay(1); //约2ms ds_write_byte(0xcc); ds_write_byte(0x44); } /*---------------------------------------- 获得温度: ------------------------------------------*/ uint get_temperature() { float wendu,i_l; ds_reset(); delay(1); //约2ms ds_write_byte(0xcc); ds_write_byte(0xbe); tem_l=ds_read_byte(); tem_h=ds_read_byte(); temp=tem_h; temp<<=8; temp=temp|tem_l; tem_xiaoshu=tem_l&0x0f; tem_h&=0x0f; tem_zhengshu=(tem_l>>4)|(tem_h<<4); //wendu=temp*0.0625; //temp=wendu*10+0.5; return temp; } /*---------------------------------------- 读ROM ------------------------------------------*/ void timer0(void) interrupt 1 { dingshi++; EA=0; ET0=0; TH0=0XFc; TL0=0X17; if(dingshi>=100) dingshi=0; caiyang_flag=1; } flag=1; ET0=1; EA=1; } void main() { init_com(); ET0=1; EA=1; while(1) { caiyang_flag=0; tem_change(); get_temperature(); P2=0x0e; //p20=0;p21=1;p22=1;p23=1; P0=table[tem_zhengshu/10]; delay(500); tem_zhengshu=tem_zhengshu%10; P2=0x0d; P0=table[tem_zhengshu]&0x7f; delay(500); P2=0x0b;//p20=1;p21=1;p22=0;p23=1; P0=table[tem_xiaoshu%10]; delay(500); P2=0x07;//p20=1;p21=1;p22=1;p23=0;P0=0xc6; delay(500); } }
由上表的数据分析可以看出,本次温度控制系统的设计误差保持在0.71左右。基本达到了温度实时显示的目的,证明设计思路和结果是正确的。测量值 27.1 27.0 27.4 27.2 28.2 27.8 27.5 28.0 27.9 27.9 温度计 26.9 26.9 26.9 26.9 26.9 26.9 26.9 26.9 26.9 26.9 偏差 0.2 0.1 0.5 0.3 1.3 0.9 0.6 1.1 1.0 1.0
