《基于单片机温度控制系统设计的检测环节课程设计论文(25页).doc》由会员分享,可在线阅读,更多相关《基于单片机温度控制系统设计的检测环节课程设计论文(25页).doc(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-基于单片机温度控制系统设计的检测环节课程设计论文-第 23 页目 录1 概述11.1 简述11.2 温度控制系统的目的12 系统主要元器件介绍22.1 单片机的选用及功能介绍22.2 DS18B20 温度传感器介绍43 总体设计方案83.1 设计原则93.2 引脚连接93.2.1 晶振电路93.2.2 串口引脚103.3 显示部分103.4 温度采集部分104 系统整体设计114.1 系统硬件电路设计114.1.1 主板电路设计114.1.2 各部分电路114.2 系统软件设计134.2.1 系统软件设计整体思路134.2.2 系统程序流图134.2.2 系统程序代码155 结束语28参考文
2、献291 概述1.1 简述单片机在测控领域中具有十分广泛的应用,它既可以直接处理电信号,也可以间接处理温度、湿度、压力等非电信号。由于该特点,因而被广泛应用于工业控制领域。 本文正是基于温度传感器和单片机而构建的电路,进而完成温度的测量和显示。 温度传感器的发展经历了三个发展阶段:传统的分立式温度传感器模拟集成温度传感器智能集成温度传感器。目前使用最广的是智能温度传感器 (亦称数字温度传感器) ,是在20世纪90年代中期问世的。它是微电子技术、计算机技术和自动测试技术(ATE)的结晶,特点是能输出温度数据及相关的温度控制量,适配于各种微控制器(MCU)。社会的发展使人们对传感器的要求也越来越高
3、,现在的温度传感器正在基于单片机的基础上从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展,并朝着高精度、多功能、总线标准化、高可靠性及安全性、开发虚拟传感器和网络传感器、研制单片测温系统等高科技的方向迅速发展,本文将介绍了智能集成温度传感器DS18B20的结构特征及控制方法,并以此传感器为测温元件,AT89S51单片机为控制核心,构成的数字温度测量装置,并对其的工作原理及程序设计作了详细的介绍。1.2 温度控制系统的目的本设计的内容是温度测试控制系统,控制对象是温度。温度控制在日常生活及工业领域应用相当广泛,比如温室、水池、发酵缸、电源等场所的温度控制。而以往温度控制是由人工完成的而且
4、不够重视,其实在很多场所温度都需要监控以防止发生意外。针对此问题,本系统设计的目的是实现一种可连续高精度调温的温度控制系统,它应用广泛,功能强大,小巧美观,便于携带,是一款既实用又廉价的控制系统。2 系统主要元器件介绍2.1 单片机的选用及功能介绍AT89S51 是美国ATMEL公司生产的低功耗,高性能CMOS型8位单片机,片内含4Kbytes 的可编程的Flash只读程序存储器,兼容标准8051指令系统及引脚。它集Flash ROM程序存储器,并支持可在线编程(ISP)功能;另一方面,由于价格低、因而被广泛应用于许多高性价比的场合,如工业控制、消费电子等各种控制领域,对于简单的测温系统而言,
5、它已经足够。单片机AT89S51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。设计中采用89S51单片机。其主要特性如下: 与MCS-51产品指令系统完全兼容; 4K字节可编程闪烁存储器; 1000擦写周期; 4.05.5V工作电压范围; 全静态工作:0Hz-33MHz; 程序存储器具有3级加密保护; 128*8位内部RAM; 32可编程I/O线; 两个16位定时器/计数器; 6个中断源和2个优先级; 可编程全双工串行通道; 图2.1 89S51单片机引脚 低功耗的闲置和掉电模式; 看门狗(WDT)及双数据指针
6、; 具有JTAG接口,可方便地在线编程或在系统编程。AT89S51 单片机为40引脚双列直插式封装。其引脚排列和逻辑符号如图2.1 所示。各引脚功能简单介绍如下: VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每个管脚可吸收8TTL门电流。当P1口的管脚写“1”时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FLASH编程时,P0口作为原码输入口,当FLASH进行校验时,P0输出原码,此时P0外部电位必须被拉高。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚
7、写入“1”后,电位被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚电位被内部上拉电阻拉高,且作为输入。作为输入时,P2口的管脚电位被外部拉低,将输出电流,这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉的优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
8、P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入时,由于外部下拉为低电平,P3口将输出电流(ILL),也是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口:P3.0 RXD(串行输口);P3.1TXD(串行输出口) ;P3.2 INT0(外部中断0);P3.3 INT1(外部中断1) ;P3.4 T0(定时器0外部输入);P3.5 T1(定时器1外部输入);P3.6 WR (外部数据存储器写选通);P3.7 RD (外部数
9、据存储器读选通)。同时P3口同时为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 ALE / PROG :当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令时ALE才起作用。另外,该引脚被略
10、微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 PSEN:外部程序存储器的选通信号。在由外部程序存储器取址期间,每个机器周期PSEN两次有效。但在访问外部数据存储器时,这两次有效的PSEN信号将不出现。 EA/VPP:当EA保持低电平时,访问外部ROM;注意加密方式1时,EA将内部锁定为RESET;当EA端保持高电平时,访问内部ROM。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。 XTAL2:来自反向振荡器的输出。2.2 DS18B20 温度传感器介绍每一片DSl8B20在其ROM中都存有其唯一的48位序
11、列号,在出厂前已写入片内ROM 中。主机在进入操作程序前必须用读ROM(33H)命令将该DSl8B20的序列号读出。DS18B20的测温原理如下,低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55 所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55 所对应的一个基
12、数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图中的斜坡累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值。 1、DS18B20的性能特点如下:1) 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通
13、讯;2) 测温范围 55125,固有测温分辨率0.5;3) 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定,实现多点测温;4) 工作电源: 35V/DC;5) 在使用中不需要任何外围元件;6) 测量结果以912位数字量方式串行传送;7) 温度以3位数字显示;8) 用户可定义报警设置,报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;9) 负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。 2、 DS18B20的内部结构DS18B20采用3脚PR35封装;DS18B20的内部
14、结构,如图2.3所示。3、 DS18B20内部结构主要由四部分组成1) 64位光刻ROM。开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前56位的CRC校验码,这也是多个DS18B20可以采用一线进行通信的原因10。64位闪速ROM的结构如下.8b检验CRC48b序列号8b工厂代码(10H) MSB LSB MSB LSB MSB LSB图2.2 ROM结构图2.3 DS18B20内部结构2) 非挥发的温度报警触发器TH和TL,可通过软件写入用户报警上下限值。3) 高速暂存存储,可以设置DS18B20温度转换的精度。DS18B20温度传感器的内部存储器还包括一个高
15、速暂存RAM和一个非易失性的可电擦除的E2PRAM。高速暂存RAM的结构为8字节的存储器,结构如表2.5所示。头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。它的内部存储器结构和字节定义如图2.6所示。低5位一直为,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式。DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率,如表2.7。由表可见,分辨率越高,所需要的温度
16、数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625LSB形式表示。Byte0温度测量值LSB(50H)Byte1温度测量值MSB(50H)E2PROMByte2TH高温寄存器-TH高温寄存器Byte3TL低温寄存器-TL
17、 低温寄存器Byte4配位寄存器-配位寄存器Byte5预留(FFH)Byte6预留(0CH)Byte7预留(IOH)Byte8循环冗余码校验(CRC)图2.4 DS18B20内部存储器结构TM R1R0 1 1 1 1 1图2.6 DS18B20字节表2.1 DS18B20温度转换时间表R1R0分辨率/位温度最大转向时间/ms00993.750110187.510113751112750当符号位S0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。图2.8是一部分温度值对应的二进制温度数据。4) CRC的产
18、生 在64 b ROM的最高有效字节中存储有循环冗余校验码(CRC)。主机根据ROM的前56位来计算CRC值,并和存入DS18B20中的CRC值做比较,以判断主机收到的ROM数据是否正确。另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作按协议进行。操作协议为:初使化DS18B20(发复位脉冲)发ROM功能命令发存储器操作命令处理数据。 另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)发ROM
19、功能命令发存储器操作命令处理数据。表2.2 一部分温度对应值表温度/二进制表示十六进制表示+1250000 0111 1101 000007D0H+850000 0101 0101 00000550H+25.06250000 0001 1001 00000191H+10.1250000 0000 1010 000100A2H+0.50000 0000 0000 00100008H00000 0000 0000 10000000H-0.51111 1111 1111 0000FFF8H-10.1251111 1111 0101 1110FF5EH-25.06251111 1110 0110 11
20、11FE6FH-551111 1100 1001 0000FC90H3 总体设计方案考虑使用温度传感器,结合单片机电路设计,采用一只DS18B20温度传感器,直接读取被测温度值,之后进行转换,依次完成设计要求。在本系统的电路设计方框图如图2.1所示,它由三部分组成:控制部分主芯片采用单片机AT89S51;显示部分采用3位LED数码管以动态扫描方式实现温度显示;温度采集部分采用DS18B20温度传感器。单 DS18B20数码管显示蜂鸣器图3.1 温度计电路总体设计方案3.1 设计原则DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电
21、源。另一种是寄生电源供电方式,如图3.1所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。本设计采用电源供电方式, P1.1口接单线总线为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管和89S51的P1.0来完成对总线的上拉。当DS18B20处于写存储器操作和温度A/D变换操作时,总线上必须有强的上拉,上拉开启时间最大为10 s。采用寄生电源供电方式是VDD和GND端均接地。由于单线制只有一根线,因此发送接收口必须是三状态的。主机控制DS18B20完成温度转换必须经过3个步骤: 初始化; ROM
22、操作指令; 存储器操作指令。3.2 引脚连接3.2.1 晶振电路单片机XIAL1和XIAL2分别接30PF的电容,中间再并个12MHZ的晶振,形成单片机的晶振电路。3.2.2 串口引脚P1.1和P1.2引脚接继电器电路的4.7K电阻上,P1口其他引脚悬空P2口中P2.0、P2.1、P2.2、P2.3分别接到显示电路的4.7K电阻上,P2.5接蜂鸣器电路,其他引脚悬空P3口中P3.5、P3.6、P3.7接到按键电路。 ALE引脚悬空,复位引脚接到复位电路、VCC接电源、VSS接地、EA接电源。3.3 显示部分显示电路采用3位共阳LED数码管,从P0口送数,P2口扫描。3.4 温度采集部分DS18
23、B20温度传感器是美国DALLAS公司生产的,DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。这一部分主要完成对温度信号的采集和转换工作,由DS18B20数字温度传感器及其与单片机的接口部分组成。数字温度传感器DS18B20把采集到的温度通过数据引脚传到单片机的P1.0口,单片机接受温度并存储。此部分只用到DS18B20和单片机,硬件很简单。4 系统整体设计4.1 系统硬件电路设计 4.1.1 主板电路设计单片机的P1.0接DS18B20的2号引脚,P0口送数P2口扫描,P1.1、P1.2控制加热器和电风扇
24、的继电器。如附录2。 4.1.2 各部分电路(1) 显示电路显示电路采用了7段共阴数码管扫描电路,节约了单片机的输出端口,便于程序的编写。图4.1 显示电路图(2) DS18B20温度传感器电路图4.2 温度传感器电路引脚图 (3) 单片机电路图4.3 单片机电路引脚图(4) 晶振控制电路图4.4 晶振控制电路图 (5) 复位电路图4.5复位电路图4.2 系统软件设计4.2.1 系统软件设计整体思路高级语言是面向问题和计算过程的语言,它可通过于各种不同的计算机,用户编程时不必仔细了解所用的计算机的具体性能与指令系统,而且语句的功能强,常常一个语句已相当于很多条计算机指令,于是用高级语言编制程序
25、的速度比较快,也便于学习和交流,但是本系统却选用了汇编语言。本装置的软件包括主程序、读出温度子程序、复位应答子程序、写入子程序、以及有关DS18B20的程序(初始化子程序、写程序和读程序)4.2.2 系统程序流图1)主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。通过调用读温度子程序把存入内存储中的整数部分与小数部分分开存放在不同的两个单元中,然后通过调用显示子程序显示出来开始 初始化 示化获取温度值 与温度上下限比较 报警转换并显示 YES 图4.6 主程序流程图2)读出温度子程序 读出温度子程序的主要功能是读出RAM中的9字节
26、,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。 DS18B20的各个命令对时序的要求特别严格,所以必须按照所要求的时序才能达到预期的目的,同时,要注意读进来的是高位在后低位在前,共有12位数,小数4位,整数7位,还有一位符号位。DS18B20复位、应答子程序跳过ROM匹配命令写入子程序温度转换命令写入子程序显示子程序DS18B20复位、应答子程序跳过ROM匹配命令写入子程序读温度命令子程序结 束 图4.7 读出温度子程序4.2.2 系统程序代码#include /将AT89X52.h头文件包含到主程序#include /将intrins.h头文件包含到主程序(调用其中的_nop_
27、()空操作函数延时)#define uint unsigned int /变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char /变量类型宏定义,用uchar表示无符号字符型(8位)uchar max=0x00,min=0x00; /max是上限报警温度,min是下限报警温度bit s=0; /s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右bit s1=0; /s1标志位用于上下限查看时的显示void display1(uint z); /声明display1()函数(display.h头文件中的函数,ds1
28、8b20.h要用应先声明)#includeds18b20.h /将ds18b20.h头文件包含到主程序#includekeyscan.h /将keyscan.h头文件包含到主程序#includedisplay.h /将display.h头文件包含到主程序/*主函数*/void main() beer=1; /关闭蜂鸣器 led=1; /关闭LED灯 timer1_init(0); /初始化定时器1(未启动定时器1) get_temperature(1); /首次启动DS18B20获取温度(DS18B20上点后自动将EEPROM中的上下限温度复制到TH和TL寄存器) while(1) /主循环
29、get_temperature(0); /获取温度函数 display(temp,temp_d*0.625);/显示函数 alarm(); /报警函数#ifndef _ds18b20_h_ /定义头文件#define _ds18b20_h_#define uint unsigned int /变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char /变量类型宏定义,用uchar表示无符号字符型(8位)sbit DQ= P23; /可位寻址变量定义,用DQ表示P2.3口sbit beer=P10; /用beer表示P1.0sbit led=P11
30、; /用led表示P1.1uchar temp=0; /测量温度的整数部分uchar temp_d=0; /测量温度的小数部bit f=0; /测量温度的标志位,0表示“正温度”1表示“负温度”)bit f_max=0; /上限温度的标志位0表示“正温度”1表示“负温度”)bit f_min=0; /下限温度的标志位0表示“正温度”、1表示“负温度”)bit w=0; /报警标志位1启动报警0关闭报警)/*延时子函数*/void ds18b20_delayus(uint t) /延时几s while(t-);void ds18b20_delayms(uint t) /延时1ms左右uint i
31、,j;for(i=t;i0;i-) for(j=120;j0;j-);/*ds18b20初始化函数*/void ds18b20_init() / DS18B20初始化uchar c=0; DQ=1;DQ=0; /控制器向DS18B20发低电平脉冲ds18b20_delayus(80); /延时15-80sDQ=1;/控制器拉高总线,while(DQ); /等待DS18B20拉低总线,在60-240s之间ds18b20_delayus(150);/延时,等待上拉电阻拉高总线DQ=1; /拉高数据线,准备数据传输;/*ds18b20字节读函数*/uchar ds18b20_read() /DS18
32、B20 字节读取uchar i;uchar d = 0;DQ = 1;/准备读;for(i=8;i0;i-) d = 1; /低位先发;DQ = 0;_nop_();_nop_();DQ = 1;/必须写1,否则读出来的将是不预期的数据;if(DQ)/在12us处读取数据;d |= 0x80;ds18b20_delayus(10);return d; /返回读取的值/*ds18b20字节写函数*/void ds18b20_write(uchar d) / ds18b20字节写 uchar i; for(i=8;i0;i-) DQ=0; DQ=d&0x01; ds18b20_delayus(5)
33、; DQ=1; d = 1; /*获取温度函数*/ void get_temperature(bit flag)uchar a=0,b=0,c=0,d=0; uint i;ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc);/向DS18B20发跳过读ROM命令ds18b20_write(0x44);/写启动DS18B20进行温度转换命令,转换结果存入内部RAMif(flag=1)/首次启动DS18B20进行温度转换需要500ms,若转换时间不够就出错,读出的是85度的错误值。 display1(1);/用开机动画耗时elseds18b20_delaym
34、s(1);ds18b20_init(); /DS18B20初始化ds18b20_write(0xcc); /向DS18B20发跳过读ROM命令ds18b20_write(0xbe);/写读内部RAM中9字节的内容命令a=ds18b20_read();/读内部RAM (LSB)b=ds18b20_read();/读内部RAM (MSB)if(flag=1)/局部位变量f=1时读上下线报警温度 max=ds18b20_read(); /读内部RAM (TH) min=ds18b20_read(); /读内部RAM (Tl)if(max&0x80)=0x80) /若读取的上限温度的最高位(符号位)为
35、1表明是负温度f_max=1;max=(max-0x80); /将上限温度符号标志位置1表示负温度,将上限温度装换成无符号数。 if(min&0x80)=0x80) /若读取的下限温度的最高位(符号位)为1表明是负温度f_min=1;min=(min-0x80); /将下限温度符号标志位置1表示负温度,将下限温度装换成无符号数。i=b;i=4;if (i=0) f=0; /i为0,正温度,设立正温度标记 temp=(a4)|(b4)|(b0;i-) for(j=120;j0;j-);/*定时器1初始化函数*/void timer1_init(bit t) TMOD=0x10;/设定定时器1工作在方式1,最大定时65.53ms TH0=0x3c;/定时器赋初值,定时50ms TL0=0xb0; EA=1;/开总中断 ET1=1;/开定时器1中断 TR1=t;/ 局部变量t为1启动定时器1,为0关闭定时器1/*主显示函数*/void display(uchar t,uchar t_d) /用于实测温度的显示 uchar i; for(i=0;i4;i+) /依次从左至右选通数码管显示,实现动态显示 switch(i) case 0: /选通第一个数码管 wei2=1; /关第二个数码管 we
限制150内