控制系统-环境温度自动测量与报警系统课程设计_第1页
控制系统-环境温度自动测量与报警系统课程设计_第2页
控制系统-环境温度自动测量与报警系统课程设计_第3页
控制系统-环境温度自动测量与报警系统课程设计_第4页
控制系统-环境温度自动测量与报警系统课程设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、计算机控制系统课程设计 -环境温度自动测量与报警系统院 系班 级指导教师小组成员 分工情况 时 间环境温度自动测量与报警系统摘要: 单片机在检测和控制系统中得到广泛的应用, 温度则是系统常需要测量、控制和保持的一个量。 本文从硬件和软件两方面介绍了80C51单片机为主控器的温度控制与报警系统的设计,对硬件原理图和程序框图作了简洁的描述。关键字: 单片机80C51; 温度 ; 测量 ; A/D转换 ;控制 ;报警1、设计内容本课程设计以8051CPU为主控制器,设计出具有测量和报警功能的温度模拟控制系统,由A/D 转换电路模拟测量外部空间环境温度信号。运用所学基础知识,由实验箱电位器旋钮模拟外部

2、温度传感器,ADC0809转换芯片实现模拟量与数字量的转换,选通8255A接口芯片扩展CPU并行接口,判断温度信号是否报警,根据结果驱动指示灯同时在LCD 上显示输出;结合中文液晶显示模块OCMJ2*8LCD实现温度可观性,且采用C51作为开发语言进行软件编程,将各环节连贯实现。2、设计要求(1)完成测量与报警系统的硬件原理图设计(在Protel等电子设计自动化软件下进行,完成最小系统和外部扩展电路设计);(2)、完成相关软件程序的设计。由实验箱电位器旋钮模拟外部温度传感器(温度测量范围为0-100 摄氏度,输出0-5V 电压信号);(3)在LCD 屏上显示当前系统状态(报警或正常、如报警是何

3、种类型报警)和当前温度(精确到0.1 度);(4)要求在测量过程中至少采用一种数字滤波算法;(5)由发光二极管显示当前系统状态报警或正常、如报警是何种类型报警。(6)在LCD 屏上显示温度参数报警上、下限;(7)使用越限报警方式;(8)在LCD 屏上显示系统累计运行时间;3、系统开发环境简介本系统采用北京达盛科技有限公司提供的EL-MUT多CPU单片机/微机原理实验开发系统进行开发。该系统采用开放式、模块化、积木式的结构,不仅能完全满足相关课程的基本教学实验要求,而且可以开设全开放的设计性系统实验。4、系统硬件设计4.1、系统硬件图组成如上所介绍本系统设计是基于EL-MUT多CPU单片机/微机

4、原理的开发环境,应用51CPU处理器作为本系统的CPU对各功能模块进行控制。其中利用并行接口芯片8255A作为CPU与外界数据进行交换的主要通道,利用ADC0809芯片作为数据采集器对外部温度信号进行采样和模数转换。显示结果利用LCD显示点位模拟的实时温度、温度上下限值、系统运行时间及温度越限情况。并且利用LED作为报警情况只是灯。4.2、各硬件功能介绍4.2.1、51CPU处理器作为本系统的CPU对各功能模块进行控制;8051CPU板如下图所示:4.2.2、 8255A可编程通用并行接口芯片,它具有3个8位的并行口,有三种工作方式,可作为单片机与各种外部设备连接的接口电路。8255A芯片硬件

5、图如下:4.2.3、ADC0809带有8位A/D转换器,8位多路开关以及与微型计算机兼容的控制逻辑的CMOS组件。 ADC0809硬件图如下图所示:4.2.4、 OCMJ2*8 液晶LCD利用液晶的扭曲向列效应制成,具有低功耗,抗干扰,体积小,价格低等优点。内部是32*128的点阵可以显示2行8列的汉字,以及2行16*8的字符和4行8*8的字符。LCD硬件图如下图所示:4.3、硬件原理图硬件原理图如下:4.4、硬件连接方块图及连接介绍硬件连接方块图如下:如上连接图所示:并行接口芯片8255A片选端CS0(0xO4a0-0x04af);A/D转换芯ADC0809 片选端CS1(0x04b0-0x

6、04bf);采用通道0进行AD转换AN0->ADIN0;8255A A口接LCD数据输入DB0-DB7;B口接LED灯:PB0-LED1(上限报警);PB1-LED2(下限报警);PB2-LED3(正常显示);A/D转换结束标志EOC->P1.0;BUSY->P1.1;置位/复位标志 REQ->P1.2。5、系统软件设计本次设计的温度采样和报警系统以上已经介绍,要实现的功能是:温度的采样、滤波、报警显示、LCD的实时温度显示、LED灯报警显示。根据系统实现的各个功能,为使程序具有较好的可操作性和高效性,且易于调试,在软件设计时将系统的各个功能进行拆分和模块化,形成诸多个

7、不同功能的子程序模块便于对不同模块的功能进行检验和调试。最后通过程序功能之间的调用实现整个系统的有序运行。各模块介绍如下:5.1、主程序模块5.1.1主程序主程序是整个程序的主干,负责调用初始化子程序和其他数据处理子程序,程序如下: void main()TMOD=0x01; /定时器初始化,工作在方式一下TL0=0xB0;TH0=0x3C;ET0=1; /选用定时器0EA=1; /开启单片机中断功能TR0=1;/*清屏*/cs8255=0x88;REQ=0;while(busy=1); /等待处理完毕PA=0xf4; /写入清屏指令REQ=1; /发出请求while(busy=0);/ 等待

8、处理完毕REQ=0;while(1)displaytime();/显示累计时间readdata(); /读取数据if(FOR>temperature)&&(FOR-temperature)>5)|(FOR<temperature)&&(temperature-FOR)>5)/如果温度变化在0.5°C以内,则显示温度不改变 displaytem();/显示温度FOR=temperature;displayresult(); /显示结果,报警或正常5.1.2、主程序流程图主程序流程图如下:5.2、AD转换模块AD0809的片选端与C

9、S1相连,AD0809的地址范围为0x04b00x04bf,本系统在采样时选用IN0作为A/D转换时模拟量的输入端,因此地址为0x04b1。AD0809的EOC(转换结束标志位)端与51CPU的P1.0相连,当EOC为0时表示该次A/D转换仍在进行,当EOC为1时表示本次A/D转换已经结束。5.2.1、A/D转换子程序A/D转换子程序如下:unsigned char AD(void) cs0809=0x01;/启动AD转换while(EOC=0);/查询转换是否结束return(cs0809);/转换结束回送转换值5.2.2、A/D转换流程图5.3、滤波模块因为滤波后的数据是一个00h-FFh

10、的数字量,但温度是一个0100的变量,因此需要对该数字量进行标度变换。即将00hFFh的数字量转变成0-100的变量,但是由于设计要求温度精确到小数位,而在数字系统中小数位一般被四舍五入成整数位,因此为了能够体现小数位的变化需要将原来0-100之间的数变成0-1000的数,这样就避免了小数位被忽略掉了,从而提高了温度转换的精确度。算术平均值滤波和标度变换子程序如下:void readdata()unsigned int i;long tem=0;for(i=0;i<16;i+)tem+=AD();tem=tem*10;/使小数点后一位得以保留,因为精度要求为0.1度temperature

11、=(tem>>4)*100/255;/取16个数的平均值并进行标度变换5.3、越限报警模块进行算数平均值滤波后的温度是在0-1000之间的数值,系统设定的温度上限值是800,温度下限值是200,当超过上限则调用上限报警子程序,低于下限则调用下限报警子程序,否则调用正常状态显示子程序,然后选中8255A的B口输出数据,点亮相应的LED标志位。5.3.1、越限报警子程序越限报警子程序如下:void displayresult(void)unsigned char t;t=temperature/10;/还原温度值if(t<downlimit)downwarn(); /小于下限值,

12、下限报警PB=0x05;/下限报警指示灯亮else if(t>uplimit)upwarn();/大于上限值,上限报警PB=0x06; /下限报警指示灯亮elsenormal(); /正常显示PB=0x03;/正常指示灯亮5.3.2、越限报警流程图5.4、LCD显示模块该子程序通过51的P1.2位向与LCD相连的REQ位输出一个高电平,LCD显示芯片内部通过握手协议(请求/应答)自动识别该请求位,当REQ被置1时,LCD芯片会自动响应,从与8255A的A口相连的数据端DB0-DB7读入数据并写入该芯片中。由于是实时显示,要显示的数字和汉字会随模拟输入的变化而变化,则通过数组的方式并逐位显

13、示来达到实时显示的目的。数字采用显示8*16ASCII字符,汉字采用显示16*16国际汉字。中XX表示该字符或者汉字在OCMJ2*8 LCD上的列值;YY表示该字符或者汉字在OCMJ2*8 LCD上的行值在显示过程中,对于汉字采用区位码的形式。一般的显示格式为:F0 XX YY 区码 位码,当依次输入5个字节后在LCD上显示一个相应的汉字。对于字符的显示有两种格式,一种是8*8的ASCII码显示,格式控制字位F1,另一种是8*16的ASCII码显示,格式控制字位F9。一般的现实格式为:F1 XX YY ASCII码值 ,F9 XX YY ASCII码值。当依次输入4个字节后在LCD上显示一个相

14、应的汉字。5.4.1、LCD显示程序void timer(void) interrupt 1TL0=0xB0;TH0=0x3C;tt+;if(tt>=10)tt=0;s+;if(s>=60) s=0;m+;if(m>=60)m=0;/*LCD显示时间05:03*/void displaytime(void)unsigned char i;unsigned charlcdtimer=0xf9,0x0b,0x00,0x30,0xf9,0x0c,0x00,0x30,0xf9,0x0d,0x00,0x3a,0xf9,0x0e,0x00,0x30,0xf9,0x0f,0x00,0x30

15、;lcdtimer3=lcdnumberm/10;lcdtimer7=lcdnumberm%10;lcdtimer15=lcdnumbers/10;lcdtimer19=lcdnumbers%10;for(i=0;i<20;i+)REQ=0;while(busy=1);PA=lcdtimeri;/显示05:03REQ=1;while(busy=0);REQ=0;/*显示实时温度23.0*/void displaylimit(void)unsigned char i,a,b;unsigned charlcdlimit=0xf0,0x00,0x00,41,47,0xf9,0x02,0x00,

16、0x38,0xf9,0x03,0x00,0x30,0xf0,0x03,0x00,47,34,0xf9,0x08,0x00,0x32,0xf9,0x09,0x00,0x30;a=uplimit;b=downlimit;lcdlimit8=lcdnumbera/10;lcdlimit12=lcdnumbera%10;lcdlimit21=lcdnumberb/10;lcdlimit25=lcdnumberb%10;for(i=0;i<26;i+)REQ=0;while(busy=1);PA=lcdlimiti;/显示上80 下20REQ=1;while(busy=0);REQ=0;void

17、displaytem(void)unsigned char i,x,y,z;unsigned charlcdtem=0xf9,0x04,0x10,0x30,0xf9,0x05,0x10,0x30,0xf9,0x06,0x10,0x2e,0xf9,0x07,0x10,0x30;x=temperature/100;y=(temperature/10)%10;z=temperature%10;lcdtem3=lcdnumberx;lcdtem7=lcdnumbery;lcdtem15=lcdnumberz;for(i=0;i<16;i+)REQ=0;while(busy=1);/显示23.0P

18、A=lcdtemi;REQ=1;while(busy=0);REQ=0;/*上限报警子程序,显示过高*/void upwarn(void)unsigned char i;unsigned char lcdup=0xf0,0x06,0x01,25,93,0xf0,0x07,0x01,24,63; for(i=0;i<10;i+)REQ=0;while(busy=1);PA=lcdupi;REQ=1;/ 显示过高while(busy=0);REQ=0;/*下限报警子程序,显示过低*/void downwarn(void)unsigned char i;unsigned char lcddow

19、n=0xf0,0x06,0x01,25,93,0xf0,0x07,0x01,21,45; for(i=0;i<10;i+)REQ=0;while(busy=1);PA=lcddowni;/ 显示过低REQ=1;while(busy=0);REQ=0;/*正常显示子程序,显示正常*/void normal(void)unsigned char i;unsigned char lcdnormal=0xf0,0x06,0x01,53,93,0xf0,0x07,0x01,19,03; for(i=0;i<10;i+)REQ=0;while(busy=1);PA=lcdnormali;/ 显

20、示正常 REQ=1;while(busy=0);REQ=0;5.4.2、LCD显示流程图5.4.3、LCD实时显示图如下6、全部程序本系统设计全部程序如下:#include <reg51.h>#include <absacc.h>#define PA XBYTE0xcfa0#define PB XBYTE0xcfa1#define PC XBYTE0xcfa2#define cs8255 XBYTE0xcfa3#define cs0809 XBYTE0xcfa8unsigned char uplimit=80,downlimit=20;long temperature,

21、FOR=0;unsigned char m=0,s=0,tt=0;unsigned char lcdnumber=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39;sbit busy=P11;sbit REQ=P12;sbit EOC=P10;sbit UA=P13;sbit UD=P14;sbit DA=P15;sbit DD=P16;void displaytime(void);void checkkey(void);void checklimit(void);void displaylimit(void);unsigned char AD

22、(void);void readdata();void displaytem(void);void displayresult(void);void upwarn(void);void downwarn(void);void normal(void);void main()TMOD=0x01;TL0=0xB0;TH0=0x3C;ET0=1;EA=1;TR0=1;cs8255=0x88;REQ=0;while(busy=1);PA=0xf4;REQ=1;while(busy=0);REQ=0;while(1)displaytime();checkkey();readdata();if(FOR&g

23、t;temperature)&&(FOR-temperature)>5)|(FOR<temperature)&&(temperature-FOR)>5)displaytem();FOR=temperature;displayresult();void timer(void) interrupt 1TL0=0xB0;TH0=0x3C;tt+;if(tt>=10)tt=0;s+;if(s>=60) s=0;m+;if(m>=60)m=0;void displaytime(void)unsigned char i;unsigned

24、charlcdtimer=0xf9,0x0b,0x00,0x30,0xf9,0x0c,0x00,0x30,0xf9,0x0d,0x00,0x3a,0xf9,0x0e,0x00,0x30,0xf9,0x0f,0x00,0x30;lcdtimer3=lcdnumberm/10;lcdtimer7=lcdnumberm%10;lcdtimer15=lcdnumbers/10;lcdtimer19=lcdnumbers%10;for(i=0;i<20;i+)REQ=0;while(busy=1);PA=lcdtimeri;REQ=1;while(busy=0);REQ=0;void displa

25、ylimit(void)unsigned char i,a,b;unsigned charlcdlimit=0xf0,0x00,0x00,41,47,0xf9,0x02,0x00,0x38,0xf9,0x03,0x00,0x30,0xf0,0x03,0x00,47,34,0xf9,0x08,0x00,0x32,0xf9,0x09,0x00,0x30;a=uplimit;b=downlimit;lcdlimit8=lcdnumbera/10;lcdlimit12=lcdnumbera%10;lcdlimit21=lcdnumberb/10;lcdlimit25=lcdnumberb%10;for

26、(i=0;i<26;i+)REQ=0;while(busy=1);PA=lcdlimiti;REQ=1;while(busy=0);REQ=0;unsigned char AD(void) cs0809=0x01;while(EOC=0);return(cs0809);void readdata()unsigned int i;long tem=0;for(i=0;i<16;i+)tem+=AD();tem=tem*10;temperature=(tem>>4)*100/255;void displaytem(void)unsigned char i,x,y,z;lcd

27、tem=0xf9,0x04,0x10,0x30,0xf9,0x05,0x10,0x30,0xf9,0x06,0x10,0x2e,0xf9,0x07,0x10,0x30;x=temperature/100;y=(temperature/10)%10;z=temperature%10;lcdtem3=lcdnumberx;lcdtem7=lcdnumbery;lcdtem15=lcdnumberz;for(i=0;i<16;i+)REQ=0;while(busy=1);PA=lcdtemi;REQ=1;while(busy=0);REQ=0;void displayresult(void)u

28、nsigned char t;t=temperature/10;if(t<downlimit)downwarn();PB=0x05;else if(t>uplimit)upwarn();PB=0x06;elsenormal();PB=0x03;void upwarn(void)unsigned char i;unsigned char lcdup=0xf0,0x06,0x01,25,93,0xf0,0x07,0x01,24,63;for(i=0;i<10;i+)REQ=0;while(busy=1);PA=lcdupi;REQ=1;while(busy=0);REQ=0;vo

29、id downwarn(void)unsigned char i;unsigned char lcddown=0xf0,0x06,0x01,25,93,0xf0,0x07,0x01,21,45;for(i=0;i<10;i+)REQ=0;while(busy=1);PA=lcddowni;REQ=1;while(busy=0);REQ=0;void normal(void)unsigned char i;unsigned char lcdnormal=0xf0,0x06,0x01,53,93,0xf0,0x07,0x01,19,03;for(i=0;i<10;i+)REQ=0;wh

30、ile(busy=1);PA=lcdnormali;REQ=1;while(busy=0);REQ=0;7、调试过程出现的问题及解决措施(1)、本实验开始做的时候,无任何反应,无法运行,猜测是本电脑的软件坏了,于是乎用同样的试验箱连接另外一台电脑,结果还是无法运行,再次猜测是本实验的CPU板坏了,重新找老师换了一块51CPU板,才能运行。(2)、本开始定义的全局变量,之后忘记了,局部变量亦用了全局变量的字符,这样导致标量混淆,没有显示结果;同样犯了一个小错误,在全局变量中定义了表示显示时间的变量,却在显示时间的子程序中直接用了另外的字符表示,导致无法显示时间,故仔细检查,才发现犯下了这样的错误

31、,并很快纠正过来。(3)、纠正了以上的错误后,发现在LCD上显示的信息(模拟温度、运行时间、报警信息等),位置有些错乱,且不知道怎么换这些信息显示的位置,在查阅资料以及老师的帮助下,发现我们是把汉字和数字显示的行列当做同样的规律对待,之后才明白了LCD显示汉字及数字的规律,及以下规律:2OCMJ2*8 LCD液晶显示屏可以显示2行8列16*16点阵编码的汉字,也可以显示2行16列16*8点阵的特殊符号以及显示4行16列的8*8点阵的特殊符号。字符的行是按照点的个数来计算的,字符的列值是按照字节(即8点列)个数来计算的,而汉字的列值却是按照字(即16点列)来计算的。(4)、我们开始设计的LED报警显示灯,是高电平有效,及过高、过低、正常的值为0x01、0x02、0x04,故在实验室运行中,发现温度越限或正常都会两两盏灯,当然这个问题很容易就会发现其原因所在,也很好解决,把过高、过低、正常的值依次改为0x06、0x05、0x03即可。8、运行结果硬件和软件的设计可以完成实验要求的全部功能,结果显示在LCD上,可见上LCD显示图,LED显示报警信号。 故本次系统设计达到设计要求。9、总结首先得谢谢燕飞老师的辅助及教导,悉心的帮助提点。本次设计还算成功,虽然中途遇到很多问题,但在我们的努力下终究还是成功了。就是出现问题,发

温馨提示

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

评论

0/150

提交评论