_温度控制器系统设计报告_第1页
_温度控制器系统设计报告_第2页
_温度控制器系统设计报告_第3页
_温度控制器系统设计报告_第4页
_温度控制器系统设计报告_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、温度控制系统设计报告自 动 化 学 院智能仪表课程设计报告专 业电子信息技术及仪器班 级08062912学 号08061939学生姓名马佳俊指导教师学 期大四上完成日期2011.9.9一、 目的智能仪表课程设计是一项综合性的专业实践活动,目的是让学生将所学的基础理论和专业知识运用到具体的工程实践中,以培养学生综合运用知识能力、实际动手能力和工程实践能力,为此后的毕业设计打下良好的基础。二、 任务本次智能仪表课程设计的任务是设计一个温度控制器,并完成相关的编程工作。基本任务是利用AT89C51单片机、ADC0809模数转换器等芯片设计一个具有温度测量显示和开关控制输出的装置。三、温度控制系统具体

2、设计要求电路设计、软件编程的功能和要求:1)该装置要求利用Proteus仿真软件完成软件编程与实现。2)用6只共阴极的八段数码管来分别显示工作状态、设定温度和实际温度温度。如下图所示: 实际温度 设定温度 工作状态:“1”“1”表示开机 “0”“0”表示关机3)用3只按钮来分别作为开机/关机键、温度设定上升键和下降键。4)用1只LED发光二极管来表示加热器开关量控制输出,所有发光二极管均要求用2003达林顿管或三极管放大驱动。5)温度设定范围099,在装置处于开机状态情况下,当实际温度高于等于设定温度时,加热器控制输出“关”;当实际温度低于设定温度5时,加热器控制输出“开”。6)上电后,自动显

3、示关机状态、设定温度50和实际室内温度,这时用户可以设定温度进行设定,但只有在按下启动/关闭键后,控制器正式工作;在运行期间,若对温度状态进行设定,则控制器按新设定开始。若关机后(非断电)重新启动控制器,则自动进入上次关机前的设定状态。7)温度传感器采用AT502热敏电阻(Proteus软件中用滑动变阻器代替)。8)完成电路原理图设计,请注意:只设计本课题要求相关的电路;9)完成2) 5)所规定功能的软件流程图和编程工作;10)完成软硬件调试四、硬件设计部分1、系统设计整体框架图如图4-1所示图4-1 温度控制系统框架图本系统总体框架如图4-1所示,主要是基于AT89C51单片机和其他四个模块

4、组成,四个模块即:LED显示模块、加热器控制模块、按键扫描/处理模块和基于ADC0808芯片的数据采集模块。AT89C51单片机将通过ADC0808数据采集模块采集到的数据经过相应的处理送往LED显示模块进行显示。数据采集模块:系统要求对温度进行实时采样、控制、显示,利用芯片ADC0808对温度采样,用一路模拟通道采集信号,就能满足要求。由于温度的变化在短时间内不是非常明显,没必要一直都要采集温度值,因此本系统采用内部中断0产生定时中断定时的对温度值进行采集,并送显示。按键扫描/处理模块:通过外部中断来实现,即有中断产生就去执行按键相应程序(开/关加热器、温度设置值上调、温度设置值下调)。加热

5、器控制模块:在装置处于开机状态情况下,当实际温度高于等于设定温度时,加热器控制输出“关”;当实际温度低于设定温度5时,加热器控制输出“开”。实时的控制温度的变化使得温度值在设定值附近,以满足系统的设计要求。1-1 ADC0809与MCS-51系列单片机的接口方法ADC0809与8051单片机的硬件接口有3种形式,分别是查询方式、中断方式和延时等待方式,本系统中选用中断接口方式。由于ADC0809无片内时钟,时钟信号可由单片机I/0口产生。ADC0809内部设有地址锁存器,所以通道地址由P0口的低3位直接与ADC0809的A、B、C相连。通道基本地址为0000H0007H。其对应关系如表4-1-

6、1所示。地址码输入通道CBA000IN0001IN1010IN2011IN3100IN4101IN5110IN6111IN7表4-1-1 0809输入通道地址控制信号:将P2.7作为片选信号,在启动A/D转换时,由单片机的写信号和P2.7控制ADC的地址锁存和启动转换。由于ALE和START连在一起,因此ADC0809在锁存通道地址的同时也启动转换。在读取转换结果时,用单片机的读信号和P2.7引脚经或非门后,产生正脉冲作为OE信号,用以打开三态输出锁存器。其接口电路如图4-3-1 数据采集电路所示。2、 AT89C51晶振电路和复位电路2-1晶振电路原理图 如图4-2-1所示图4-2-1 内部

7、振荡器方式内部方式时钟电路如图4-2-1所示。外接晶体以及电容、构成并联谐振电路,接在放大器的反馈回路中,内部振荡器产生自激振荡,一般晶振可在212MHz之间任选。对外接电容值虽然没有严格的要求,但电容的大小多少会影响振荡频率的高低、振荡器的稳定性、起振的快速性和温度的稳定性。外接晶体时,和通常选30pF左右;外接陶瓷谐振器时,和的典型值为47pF。2-2上电外部复位电路如图4-2-2所示图4-2-2上电外部复位电路单片机的复位是靠外部电路实现的。无论是HMOS还是CHMOS型,在振荡器正运行的情况下,RST引脚保持二个机器周期以上时间的高电平,系统复位。在RST端出现高电平的第二个周期,执行

8、内部复位,以后每个周期复位一次,直至RST端变低。本文采用上电外部复位电路,如图4-2-2所示,相关参数为典型值。 3、 数据采集模块3-1 原理图如图4-3-1所示图4-3-1数据采集电路3-2 数据采集模块工作原理数据采集电路就是将滑动变阻器上的阻值通过IN0读入经过AD转换在OUT1-OUT8输出高低电平。我们的电阻电阻阻值是1千欧,从0到100%显示,我们的输出端有256种显示方式。00h-0ffh。 我们在滑动变阻器前面加上一个串联电阻阻值为1.56K,这样子我们滑动阻值的1%就对应输出端的二进制数00000001B,这样子二进制转换成相应的十进制在建立表格方面也会有相应的简便。当P

9、2.6,WR置低位时,ALE跟OE(输出使能端)置高位,start端也至高位,这时INT0从滑动变阻器读进来的阻值通过AD转换,在输出端形成高低电平输入单片机的P1端,这就形成了对电阻值的数据采样。温度表的建立:温度标的建立就是通过滑动变阻器的改变电阻值来对OUT输出端端口的高低电平的改变来对应相应的温度值。 比如:滑动变阻器上显示的是12%,那么OUT端口显示的二进制代码是00001100B,通过对端口的比较:if(adcv=buddlei)adcv即为端口的二进制数。然后对变量realtep赋值。这样再调用显示函数,在数码管上就显示12.uchar code fm =0,1,2,3,4,5

10、,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98 ; uchar code buddle=0x00

11、,0x01,0x02 ,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3

12、c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x62 ; 通过对端口数据的比较,然后再给变量赋值建立了从0-98十进制与二进制之间的关系。 4、 温度值/加热器开关设置模块4-1电路原理图,如图4-4-1所示图4-4-1 温度值/加热器设置原理图4-2 工作原理三个开关

13、中任何一个开关按下,INT0都将置低。INT0置低时单片机将有一个外部中断0产生中断,此时说明有按键按下。单片机检测到有按键按下但是还是未知哪个按键。此时我们可以通过检测P2.7,P3.0,P3.1口的状态来判断是哪个按键按下,如果在相应位置上出现低电平则相应按键被按下。然后执行相应的按键功能的程序以及显示程序。5、 LED显示模块5-1 LED原理图 如图4-5-1所示图4-5-1LED显示电路图5-2 LED显示工作原理本系统应用8段6位共阴数码管作为显示器件,用片选信号来控制数码管的显示字符,应位选信号来控制点亮那个数码管。所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的

14、LED的亮灭来显示出不同的字形。一个八段数码管称为一位,多个数码管并列在一起可构成多位数码管,它们的段选线(即a,b,c,d,e,f,g,dp)连在一起,而各自的公共端称为位选线。显示时,都从段选线送入字符编码,而选中哪个位选线,那个数码管便会被点亮。数码管的8段,对应一个字节的8位,a对应最低位,dp对应最高位。所以如果想让数码管显示数字0,那么共阴数码管的字符编码为00111111,即0x3f;其他数字以此类推。P0口对应的是控制数码管的段选,也就是说可以让数码管显示不同的数字,字符。而在不同的数码管显示则是通过P2口的位选来实现的。换句话说P2口就是控制1-6号数码管哪个被点亮,哪个来显

15、示数字。如果程序循环显示的时间比较少那就呈现在眼前的就是六位数码管全亮,其实是循环点亮,但是人的眼没法在这么短时间内辨别出来。6、加热器控制模块6-1电路原理图 如图6-1-1所示图6-1-1加热器控制电路6-2 电路图简要说明本系统用1只LED发光二极管来表示加热器开关量控制输出,电路如图6-1-1所示。当P10输出低电平时,LED点亮,表明加热器处于工作状态。7、整个系统电路原理图 如7-1-1所示图7-1-1温度控制系统原理图(工作状态)五、软件设计部分5-1函数程序设计流程图如图5-1图5-1温度控制系统主函数主函数中包含了加热控制子程序,温度设置/加热器开关、数据采集和模数转换模块都

16、采用中断程序,以利于节省资源提高单片机的利用率。通过比较温度设置值和外界实际温度值来确定是否开启加热器,以及什么时候开启或关闭加热器,同时将加热器的工作状态在LED上显示出来。以至于达到自动控制的目的。使得温度一直在设置值附近。5-1-1加热器控制子程序流程系统要求温度设定范围099,在装置处于开机状态情况下,当实际温度高于等于设定温度时,加热器控制输出“关”;当实际温度低于设定温度5时,加热器控制输出“开”,所以其流程图如图5-1-1所示。图5-1-1 加热器温度控制子程序流程图5-2 按键扫描/处理(外部中断0程序)流程图如图5-2-1图5-2-1按键扫描/处理(外部中断0程序)流程图采用

17、中断程序来查询按键的按下与否。按键按下后通过读取P1口的状态来确定哪个按键的按下,最终确定程序该往哪个方向执行。中断结束返回主函数,将数值送LED显示程序显示。5-3定时器中断0程序由于温度的变化在短时间内几乎没什么变化,因此本系统采用内部定时器0来定时控制ADC0808的工作,这样有利于保护芯片,可以让芯片有一定的休息时间,而又不影响系统的精度。当定时器定时时间到时,单片机内部产生一个中断使得主程序暂时停止执行而转至执行中断程序,即ADC0808转换程序。启动ADC808,当判断到转换完成时,单片机将ADC0808输出口的数据读入内部寄存器,经过相应的处理转换成温度值,调用显示程序将其显示在

18、数码管上。中断程序执行结束返回主函数继续执行。如图5-3-1所示图5-3-1外部中断0程序流程图6-1 LED显示子程序该系统中用6只共阴极的八段数码管来分别显示工作状态、设定温度和实际温度温度,从节省单片机资源和写程序方便角度考虑,采用动态显示方式。6-2 LED显示子程序流程图如图6-2图6-2LED显示子程序流程图六、课程设计总结程序:#include <reg51.h>#define uint unsigned int#define uchar unsigned charsbit led1=P20; /开关机数码管sbit led2=P21; /sbit led3=P22;

19、 /设定温度数码管sbit led4=P23; /sbit led5=P24; /实际温度数码管sbit led6=P25; /sbit key1=P27; /OFF/ONsbit key2=P30; /设定温度加键sbit key3=P31; /设定温度减键sbit wr=P36; /sbit rd=P37; /sbit cs=P26; /wr,rd,cs对ADC0808选通工作sbit hot=P34; sbit l0=P10;sbit l1=P11; /开关机数码管sbit l2=P12; /sbit l3=P13; /设定温度数码管sbit l4=P14; /sbit l5=P15;

20、/实际温度数码管sbit l6=P16; /sbit l7=P17;uchar code fm =0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,

21、87,88,89,90,91,92,93,94,95,96,97,98 ; uchar code buddle=0x00,0x01,0x02 ,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x3

22、0,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x62 ; /加热uchar code table= /0-9数码管显示表0x3f,0x06,0x5b,

23、0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; uchar turn=0,settep=66,realtep,adcv,num;uint i; /全局变量turn表示开关机,settep表示设定温度,realtep表示实际温度/*delayms延迟函数*/void delayms(uint ms)uint i,j;for(i=ms;i>0;i-) /delayms延时函数,for(j=110;j>0;j-);/*outside1外部中断1的初始函数*/void outside1_init(void)EA=1; /开总中断EX1=1; /允许外部中断1中断IT

24、1=1; /外部中断1为脉冲触发方式/*outside1外部中断1函数,对按键中断子程序定义*/void outside1(void) interrupt 2EX1=0; /执行外部中断1程序时,屏蔽外部中断1的响应if(key1=0) /是否有key1按键按下 delayms(10); /有,延迟,消抖if(key1=0) /确认是否有key1按键按下if(turn=0) /ON/OFF选择turn=1; /turn为0,按下key1,turn为1表开机else /turn=0; /turn为1,按下key1,turn为0表关机if(key2=0) /是否有key2按键按下delayms(1

25、0); /有,延迟,消抖if(key2=0) /确认是否有key2按键按下if(turn=1) /开机时if(settep<=98) /settep设定温度小于等于98时,可以继续加settep+; if(key3=0) /是否有key3按键按下delayms(10); /有,延时,消抖if(key3=0) /确认是否有key3按键按下if(turn=1) /开机时if(settep>=1) /settep设定温度大于等于1时,可以继续减settep-;EX1=1; /允许外部中断1中断,继续等待按键/*outside0外部中断0初始化函数*/void outside0_init(

26、void)EA=1; /总中断开EX0=1; /允许外部中断0中断IT0=1; /外部中断0为脉冲触发方式/*outside0外部中断0函数,对ADC值对应查温度定义*/void outside0(void) interrupt 0EX0=0; /关闭外部中断0中断adcv=P1; /把P1口的数据传给adcvfor(i=0;i<=98;i+)if(adcv=buddlei)realtep=fmi;EX0=1;/*timer0定时器0的初始化函数*/void timer0_init(void)TMOD=0x01; /定时器0工作方式选择,定时,工作方式1TH0=(66536-45872)

27、/256; /设定定时时间初始值,11.0592M的晶振5ms为45872TL0=(66536-45872)%256; /低八位EA=1; /开总中断ET0=1; /允许定时器0中断TR0=1; /定时器0运行控制位/*timer0定时器0功能函数,启动/停止ADC,1秒扫描一次*/void timer0() interrupt 1TH0=(66536-45872)/256; /装初始值,高八位TL0=(66536-45872)%256; /低八位if(turn=1) /当开机时,才启动ADC0808num+; /num计数if(num=1) /启动ADCwr=0; /cs=0; /rd=0;

28、 /wr,cs,rd控制启动ADC if(num=20) /num=20是为1秒num=0; /num清零wr=1; /cs=1; /rd=1; /wr,cs,rd关闭ADC等下次再启动/*display数码管显示函数定义*/void display(uchar turn,uchar settep,uchar realtep)/显示子函数 turn表示开关,settep表示设定温度,realtep表示实际温度uchar setshi,setge,realshi,realge;/setshi,setge对设定温度的settep的十位和个位拆分,realshi,realge对实际温度的十位和个位拆分setshi=settep/10; /settep的十位放在se

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论