1、基于单片机的温度测量控制系统设计27页doc基于单片机的温度测量控制系统设计1引言2 1.1问题的提出2 1.1.1什么是温度控制2 1.2设计目的2 2设计方案3 2.1硬件设计方案3 2.2软件设计方案3 3硬件设计5 3.1主控制部分AT89S51的设计方案5 3.2温度采集模块7 3.3显示模块7 4软件设计9 4.1温度采集9 4.2键盘输入10 4.3 LCD显示11 5总结12 6参考文献15 附录1设计原理图14 附录2设计程序151引言1.1问题的提出温度是工业生产中主要的被控参数之一,与之相关的各种温度控制系统广泛应用于冶金、化工、机械、食品等领域。温度控制是工业生产过程中
2、经常遇到的过程控制,有些工艺过程对其温度的控制效果直接影响着产品的质量,因而设计一种较为理想的温度控制系统是非常有价值的。1.11什么是温度控制温度控制系统由温控器和热电偶组成,热电偶检测温度并转换成电信号传给温控器,温控器根据所设定的温度发出控制信号,温度高于设定温度上限停止加热系统或开启降温系统,低于设定温度下线停止降温系统或开启加热系统。1.2设计目的本设计以AT89C51单片机为核心的温度控制系统的工作原理和设计方法。温度信号由温度芯片DS18B20采集,并以数字信号的方式传送给单片机。由键盘输入预设温度,比较实际环境温度与预设温度再由单片机做出相应的处理已以达到温度控制的目的。2设计
3、方案2.1硬件设计方案本课题设计的是一种以AT89C51单片机为主控制单元,以DS18B20为温度传感器的温度控制系统。该控制系统可以实时存储相关的温度数据。其主要包括:温度采集模块、按键处理模块、LCD显示模块、通讯模块以及单片机最小系统。 本系统由温度传感器DS18B20、AT89C51、LCD显示电路、软件构成。DS18B20输出表示摄氏温度的数字量,然后用51单片机进行数据处理、译码、显示、报警等。系统框图如图2.1所示图2.1温度传感器DS18B20把所测得的温度以数字信号的方式发送到AT89C51单片机上,经过51单片机处理,将把温度在显示电路上显示,本系统显示器为点阵字符LCD,
4、LM016L液晶模块。本系统除了显示温度以外还可以通过键盘预设一个温度值,对所测温度进行监控,当温度高于设定温度时,启动蜂鸣器报警;当所测温度低于设定温度时,启动继电器2S;当所测温度等于设定温度时LED等闪烁。 2.2软件设计方案从软件的功能不同可分为两大类:一是监控软件(主程序),它是整个控制系统的核心,专门用来协调各执行模块和操作者的关系。二是执行软件(子程序),它是用来完成各种实质性的功能如测量、计算、显示、通讯等。每一个执行软件是一个小的功能执行模块。这里将各执行模块一一列出,并为每一个执行模块进行功能定义和接口定义。各执行模块规划好后,就可以规划监控程序了。首先要根据系统的总体功能
5、选择一种最合适的监控程序结构,然后根据实时性的要求,合理地安排监控软件和各执行模块之间地调度关系。主程序是系统的监控程序,在程序运行的过程中必须先经过初始化。本设计的主程序中将传感器获取的温度与预设温度进行了比较,并对各种不同的状态变化的控制做出了设定。流程图如图2.2 所示。系统在初始化完成后就进入温度测量程序,实时的测量当前的温度并通过显示电路在LCD上显示。根据硬件设计完成对温度的控制。按下4*3键盘上的OK键可以便可以输入预设温度。图2.23硬件设计3.1主控制部分AT89S51的设计方案:AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗
6、称单片机。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。其主要特性如下:(1) 18位微处理器和控制器,中央处理器是整个单片机的核心部件,能同时 处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。 (2)内含一个布尔运算器,可直接对数据的位进行操作和运算,特别适用于逻辑控制。 (3)内含4KB可重擦写的可编程闪烁程序存贮器(EEPROM)。 (4)内含128*8位的数据存贮器(RAM)。 (5)4个8位(32根)双向且可独立寻址的I/O(输入输出)接口P0P3。 (6)2个16位的计数器/定时器。 (7)片内
7、振荡器和时钟电路。 (8)全双工方式的串行接口(DART)。 (9)两级中断优先权的6个中断源/5个中断矢量的中断逻辑。(10)指令集有111条指令,其中64条为单周期指令,支持6种寻址方式。 (11)最高时钟振荡频率可达12MHz,大部分指令执行时间为1us,乘、除指令为4us。 (12)与MCS-51兼容,寿命为1000次写/擦循环,数据保留时间为10年。 (13)低功耗的闲置和掉电模式,可编程串行通道,三级程序存储器锁定。 引脚及功能 AT89C51单片机为40脚双列直插式封装结构。其引脚排列顺序及引脚符号如图3.1所示: 图3.1 AT89C51管脚图AT89C51重要管脚说明:Vcc
8、:电源电压GND:地P0口:P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口,作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端口。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号校验期间,P1接收低8位地址。表3.1.1为P1口第二功能。 P1口第二功
9、能 表3.1.1端口引脚第二功能P1.5MOSI(用于ISP编程)P1.6MISO(用于ISP编程)P1.7SCK(用于ISP编程)P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流I。在访问位地址的外部数据存储器时,P2口线上的内(也即特殊功能寄存器,在整个访问期间不改变)。P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入
10、“1”时,它们被内部上拉电阻拉高并可作为输入端口。作输入端口时,被外部拉低的P3口将用P3口的第二功能表 表3.1.2 端口功能第二功能端口引脚第二功能RXD(P3.0)串行输入口T0(P3.4)定时/计数器0外部输入TXD(P3.1)串行输出口T1(P3.5)定时/计数器1外部输入INT0(P3.2)外中断0WR(P3.6)外部数据存储器写选通INT1(P3.3)外中断1RD(P3.7)外部数据存储器读选通上拉电阻输出电流I。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,P3口的第二功能如表3.1.2。 3.2温度采集模块由于DS18B20芯片将温度传感器、信号放大调理、A/
11、D转换、接口全部集成于一芯片,与单片机连接简单、方便且化学性很稳定。它能用做工业测温元件,且此元件线形较好。在0100摄氏度时,最大线形偏差小于1摄氏度。该芯片直接向单片机传输数字信号,便于单片机处理及控制。与AD590相比是更新一代的温度传感器,所以温度传感器采用DS18B20。DS18B20是DALLAS公司生产的一线式数字温度传感器,它具有微型化、低功耗、高性能抗干扰能力、强易配处理器等优点,特别适合用于温度测控系统,可直接将温度转化成串行数字信号(按9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片,温度测量范围55125,可编程为912位A/D转换精度,测温分辨率可达
12、0.0625,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20可以并联到三根或者两根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。从而可以看出DS18B20可以非常方便的被用于远距离多点温度检测系统。DS18B20内部结构主要由四部分组成:64位光刻ROM,温度传感器,非挥发的温度报警触发器TH和TL,高速暂存器。在硬件上,DS18B20与单片机的连接有两种方法,一种是Vcc接外部电源,GND接地,I/O与单片机的I/O线相连;另一种是用寄生电源供电,此时UDD、G
13、ND接地,I/O接单片机I/O。无论是内部寄生电源还是外部供电,I/O口线要接5K左右的上拉电阻。 3.3显示模块本设计显示电路采用LM016L来显示测量得到的温度值。LM016L液晶模块采用HD44780控制器,hd44780具有简单而功能较强的指令集,可以实现字符移动,闪烁等功能,LM016L与单片机MCU通讯可采用8位或4位并行传输两种方式,hd44780控制器由两个8位寄存器,指令寄存器(IR)和数据寄存器(DR)忙标志(BF),显示数RAM(DDRAM),字符发生器ROMA(CGOROM)字符发生器RAM(CGRAM),地址计数器RAM(AC)。IR用于寄存指令码,只能写入不能读出。
14、DR用于寄存数据,数据由内部操作自动写入DDRAM和CGRAM,或者暂存从DDRAM和CGRAM读出的数据。BF为1时,液晶模块处于内部模式,不响应外部操作指令和接受数据,DDTAM用来存储显示的字符,能存储80个字符码。CGROM由8位字符码生成5*7点阵字符160种和5*10点阵字符32种。CGRAM是为用户编写特殊字符留用的,它的容量仅64字节,可以自定义8个5*7点阵字符或者4个5*10点阵字符,AC可以存储DDRAM和CGRAM的地址,如果地址码随指令写入IR,则IR自动把地址码装入AC,同时选择DDRAM或CGRAM。LM016L液晶模块的引脚功能如表3.2所示:LM016L引脚功
15、能表 表3.3引脚符号功能说明1VSS一般接地2VDD接电源(+5V)3VEE液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高4RSRS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。5R/WR/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。6EE(或EN)端为使能(enable)端,下降沿使能。7DB0低4位三态、 双向数据总线 0位(最低位)8DB1低4位三态、 双向数据总线 1位9DB2低4位三态、 双向数据总线 2位10DB3低4位三态、 双向数据总线 3位11DB4高4位三态、 双向数据总线 4位12DB5高4位三态、 双向数
16、据总线 5位13DB6高4位三态、 双向数据总线 6位14DB7高4位三态、 双向数据总线 7位(最高位)4、软件设计4.1温度采集CPU对DS18B20的访问流程是:先对DS18B20初始化,再进行ROM操作命令,最后才能对存储器操作,数据操作。DS18B20每一步操作都要遵循严格的工作时序和通信协议。如主机控制DS18B20完成温度转换这一过程,根据DS18B20的通讯协议,须经三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。流程图如图4.1所示图4.14.2键盘输入3*4的键盘与单片机I/O口
17、相连。采用列扫描的方式扫描键盘,按下键盘,则该按键出行列接通,I/O口输入为低电平,则此时便可将所按键的值输入单片机,经数据处理后便可输出显示在LCD上。因为键盘的制造工艺不同,在按下键盘过程中,若手一晃,结果按键就会抬起极小的一段时间,此时单片机检测到的就是有一个抬手后又按了一个键子,这是我们所不希望的,所以在键盘输入时加个按键延时以消除抖动。即按键后,过一段时发现还是按键的就认为一直是按键的,此时单片机可以写程序此为一次按键。所以要加除抖是用来防止失误或手抖造成的错误按键。图4.24.3 LCD显示LM016L的寄存器选择控制表如表4.3所示LM016L选择控制表 表4.3RSR/W操作说
18、明00写入指令寄存器(清除屏等)01都busy flag(DB7),以及读取位址计数器(DB0DB6)值10写入数据寄存器(显示各字型等)11从数据寄存器读取数据注:关于E=H脉冲开始时初始化E为0,然后置E为1,再清0。LM016L显示的流程图如图4.3所示图4.35总结本次课程设计完成了基于单片机AT89C51的温度测量与控制系统的设计方案与软硬件实现。系统包括数据采集模块,单片机控制模块,显示模块和温度设置模块,报警模块和LED显示模块六个部分。文中对每个部分功能、实现过程作了详细介绍。完成了课题既定的任务,基本达到了预期的目标。能够进行两位数温度的测定与控制。 该系统在输入了预设温度后
19、将预设温度与测定温度进行比较,当测定温度高于预设温度是蜂鸣器启动一段时间进行报警;当测定温度等于预设温度时LED灯闪烁提醒;当测定温度低于传感器温度是继电器启动2S。其仿真图如下图所示:系统具有如下特点:.采用智能温度传感器DS18B20采集温度数据,简化了硬件电路设计,温度采集数据更加精准;.AT89C51单片机的采用,有利于功能扩展;.电路设计充分考虑了系统可靠性和安全性。本次课设软件和硬件相结合,有相当大的难度,同时也有很大的实用性。在做课程设计的过程中,我的理论和实践水平都有了较大的提高。并且我熟练掌握了单片机硬件设计和接口技术,同时对温度传感器的原理及应用有了一定的了解,掌握了各种控
20、制电路及其相关元器件的使用。图5.1 测定温度高于预设温度图5.2 测定温度等于预设温度图5.3测定温度低于预设温度通过此次对温度测量与控制系统的设计,我们学会了怎样把所学的书本知识应用于实践中去,并学会了如何去思考整个控制系统的软硬件设计。实践过程中我们遇到了一些困难,但在解决问题的过程中,我们学会了团队合作精神和怎样发现问题、分析问题,进而解决问题。此次课程设计不仅增强了我们学习专业课的兴趣,而且给了我们勇气和信心,更重要的是它为我们以后的学习指明了方向。6参考文献1雄壮.陈策.程序设计技术(第三版)M.重庆:重庆大学出版社.2008.02 2张毅刚. 单片机原理与应用设计M. 北京:电子
21、工业出版社,2008年3参考网页资料 4参考网页资料 5参考网页资料6参考网页资料7参考网页资料8胡寿松自动控制原理北京:国防工业出版社,20005王锦标.方崇智过程计算机控制北京:清华大学出版社.1997附录1设计原理图附录2设计程序#include#include #define uchar unsigned char#define uint unsigned int#define key_port P1sbit buzzer=P04;sbit led=P01;sbit relay=P00;sbit dq=P05;sbit rs=P32;sbit rw=P31;sbit e=P30;uch
22、ar table=0,0,0,0;/0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;uchar table1=Ceding_T: ;uchar table2=Yuse_T: ;uchar m,flag,shandeng,k;uchar j,temp1,temp2,i;uchar ReadOneChar(void);uchar readtemperature(void);uint mi(uchar a); char biao3;void write_com(uchar com);void write_dat(uchar dat); /延时程序v
23、oid delay(uint i) while(i-);void delay_50us(uint i) uchar j; for(;i0;i-) for(j=19;j0;j-); void delay_50ms(uint i) uint j; for(;i0;i-) for(j=6245;j0;j-); /LCD程序void init_lcd(void) /lcd初始化 delay_50us(300); write_com(0x38); delay_50us(100); write_com(0x38); delay_50us(100); write_com(0x38); write_com(0
24、x38); write_com(0x08); write_com(0x01); write_com(0x06); write_com(0x0c); void write_com(uchar com) /写指令 e=0; rs=0; rw=0; P2=com; delay_50us(10); e=1; delay_50us(20); e=0; void write_dat(uchar dat) /写数据 e=0; rs=1; rw=0; P2=dat; delay_50us(10); e=1; delay_50us(20); e=0; /键盘扫描程序 /ds18b20程序void init_ds
25、18b20(void) /ds18b20初始化 uchar n; dq=1; delay(8); dq=0; delay(80); dq=1; delay(8); n=dq; delay(100); dq=1; void WriteOneChar(uchar dat) uchar i; for(i=0;i=1; delay(4);uchar ReadOneChar(void) uchar i,value; for(i=0;i=1; dq=1; if(dq) value|=0x80; delay(4); return value; uchar readtemperature(void) /读温度
26、函数 uchar a,b; init_ds18b20(); WriteOneChar(0xcc); /跳过ROM WriteOneChar(0x44); /启动温度测量 delay(300); init_ds18b20(); WriteOneChar(0xcc); WriteOneChar(0xbe); /读温度 a= ReadOneChar(); b= ReadOneChar(); b4; return b;void jianpan(void) unsigned char temp,a,sign;key_port=0xff; /写1初始化key_port=0xf0; /写判断按下初值temp
27、=key_port; /读状态a=0; if(temp&0xF0) != 0xF0) / 只要有键按下,temp!=0xf0 delay_50us(50);/ 延时去抖动 if(temp&0xF0) != 0xF0) key_port=0xfe; temp=key_port; switch(temp) case(0xee):a=1;break; case(0xde):a=2;break; case(0xbe):a=3;break; case(0x7e):a=4;break; key_port=0xfd; temp=key_port; switch(temp) case(0xed):a=5;break; case(0xdd):a=6;break; case(0xbd):a=7;break; case(0x7d):a=8;bre