ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:609.57KB ,
资源ID:4659740      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4659740.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(电子工程设计2小型温度控制系统结题报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

电子工程设计2小型温度控制系统结题报告.docx

1、电子工程设计2小型温度控制系统结题报告电子工程设计报告题目:闭环温度控制系统设计单片机、显示和键盘电路及系统软件 专 业: 小 组: 姓名学号: 指导教师:张辉 完成日期: 摘 要随着现代工业技术的迅猛发展,工业上的各种技术指标精度的要求也越来越高,在众多指标中,温度的测量与控制是一个永恒的话题,只有了精确地温度测量,才能把加热和散热的工作做得更好。本课题是小型温度测量与控制系统设计,以单片机AT89C51芯片为核心,和LED数码管显示,数模、模数转换和辅以稳压电源及变送器的测量控制系统,另配有键盘输入控制。 本设计详细介绍了LED显示与键盘控制电路的工作原理,硬件电路组成的思路和相应的C语言

2、闭环程序。本设计主要包括以下几个模块:LED显示模块、键盘控制模块。能够对环境温度随时随地检测与显示,并可以在模板上设定相应温度值使系统达到设定温度。【关键词】:LED显示、键盘控制、闭环程序、模板测试。目 录一、 功能指标要求-1二、 D/A模块调试-1三、 A/D模块调试-2四、 显示电路模块-31. 显示电路设计-32. 显示电路原理分析-4五、 键盘控制电路模块-41. 键盘控制电路设计-42. 键盘控制电路原理分析-4六、 系统调试及程序设计-4七、 出现的问题分析及解决方法-14八、 创新性-14九、 体会与建议-14【附录】-15一、功能指标要求1) 显示模块:4 位7 段数码显

3、示,前 3 位含小数点2) 键盘模块:09数字输入键及若干功能设置按键控制 ;第10数字键作为允许控制开关3) 独立电路板安装结构 二、D/A模块调试调试方法:数据为从00FF顺序递增并不断循环的数值。输出端波形如图二(1):图二(1)调试程序:#include C8051F020.h#include absacc.h#include data_define.c#define C3 XBYTE0x4000#define TIMER 0x8000#include Init_Device.cvoid delay(void);void main(void) unsigned char x; Init

4、_Device(); while(1) +x; C3=x; delay(); void delay(void) int i; for(i=0;iTIMER;+i) ;三、A/D模块调试调试方法:输入信号范围: 0V+5V 改变设置温度,运行A/D测试程序,检查模/数转换结果;在调试台上通过+10按键不断改变温度数值,调试台LED会显示相应温度。调试程序:#include C8051F020.h#include absacc.h#include data_define.c#define C2 XBYTE0x2000#define TIMER 0x8000#include Init_Device.

5、cvoid delay(void);void main(void) unsigned char x; Init_Device(); while(1) C2=x; delay(); x=C2; delay(); void delay(void) unsigned char i; for(i=0;iTIMER;+i);四、显示电路模块1. 显示电路设计:这次我们用的均为两位共阳极七段数码管,管脚见图四(1)图四(1)显示模块电路图见图四(2):图四(2)2. 显示电路原理分析:我们选用静态显示控制电路,八位数据位作为74LS273数据锁存器的输入信号,273的输出信号作为七段数码管的输入信号,控制

6、七个LED的亮灭。地址数据A1和A2作为74LS138三八译码器的输入信号,138输出信号为锁存器时钟信号,VCC接G1端恒高有效,和C1分别接译码器G2A和G2B端,恒低有效。Y0控制选通锁存器1(即设定值高位),Y1控制选通锁存器2(即设定值低位),Y2控制选通锁存器3(即显示值高位),Y3控制选通锁存器4(即显示值低位)。A1和A2按照程序设定的变化脉冲依次令Y0、Y1、Y2、Y3输出高脉冲,分别选通四个数码管,当8051芯片数据位输入信号时,四位数码管可以依照事先译好的数据表显示出相应的数值。五、键盘控制电路模块1. 键盘控制电路设计:见图五(1)图五(1)2. 键盘控制电路原理分析:

7、我们采用阵列键盘读取方案,C4和均输入低电平到74LS32或门,32输出到译码器选通。同时32也输出到74LS244数据锁存器选通。编写程序使138译码器依次输出低电平,扫描是否有键按下,当键盘上有键按下时,Yn为低电平,对应的Sn也为低电平(即对应的Dn也为低电平)。六、系统调试及程序设计系统调试: 第一步:我们首先用调试台调试,测试开环,编写程序烧录进8051,使我们自己设计的显示模块显示位跟随调试台上LED显示模块的变化。第二步:编写PID闭环程序,编写程序烧录进8051,使系统能够从键盘上输入一个设定温度值并显示在系统显示模块设定位上。随后按下调试台“Manual”按键,使系统能够将现

8、在温度值与设定值做差,以确定需要升温还是降温,系统显示模块显示值会逐渐接近设定值并最终稳定在一个与设定值误差非常小的数值上。第三步:将完整系统(包括电源模块、系统模块、A/D模块和变送器、D/A模块、显示模块和键盘控制模块)移植到实验室真实模板上,先将模板设定为手动调节,设定一个值看系统显示位是否随动;再将模板还原为自动调节,从键盘输入一个设定值,打开调节按钮,观察系统显示位是否逐渐靠近设定位并最终稳定在一个非常相近的数值上,模板上加热(或制冷)提示灯是否点亮。如果上述答案是肯定的,系统成功,能够满足教学要求,实现小型温度控制系统。调试程序:(自定义头函数见附录)#include C8051F

9、020.h#include #include data_define.c #include Init_Device.c #include address.h /设备地址列表#include keytable.h /键盘的键值表#include digtaltable.h /数码管的编码表static unsigned int DataT=0; /16进制的A/D数据static int DataTO=0; /10进制的温度数据static unsigned int DataTI=0; /10进制的目标温度(临时)static unsigned int TargetT=0; /10进制的目标温度

10、static char tp=0; /目标温度和当前温度的差值static unsigned int sign=0; /表示tp的正负号static unsigned char Switch=0; /开关键是否按下的标志static unsigned int Input=0; /输入void delay(void);void delay1(void);void Display(const unsigned int,const unsigned int);unsigned int Convert(const unsigned int);unsigned int ReadT(void);unsig

11、ned int ReadKey(void);unsigned int ReadKeyS(void);unsigned int Decode(unsigned int);unsigned int ReadInput(void);void Task(void);void main(void) Init_Device(); while(1) ReadInput(); /读取键盘 Task(); /对温度进行调整(主任务) unsigned int Convert(const unsigned int a) return (int) 95*a/0xff; /返回值=输入数据*95/255 (取整数)

12、返回值范围(095) unsigned int ReadT(void) C2=0; /向A/D转换器发出指令 delay(); /等待采样完成 return C2; /返回采样数据数据void Display(const unsigned int x,const unsigned int z) C13=DT3z/10; /第三个数码管,显示第二个数字的个位 C14=DT4z%10; /第四个数码管,显示第二个数字的十位 C11=DT1x/10; /第一个数码管,显示第一个数字的个位 C12=DT2x%10; /第二个数码管,显示第一个数字的十位void delay(void) /延时子程序 l

13、ong int i; for(i=0;i0x1f0;+i) ;void delay1(void) long int i; for(i=0;i0x81f0;+i) ;unsigned int ReadKeyS(void) unsigned char temp=0; unsigned char temp1=0; unsigned char i=0; temp=C43; /读取键盘第三行 temp=0x1f&C43; /屏蔽高3位 if(temp=0x1f) /如果没有按下,退出 return 0xff; temp1=temp; /如有按下,则延时后再读一次,看看是不是抖动 delay(); tem

14、p=0x1f&C43; if(temp!=temp1) /两次读取值不同,说明是抖动,退出 return 0xff; if(temp=0x1e) /是第三行第一列的键,则返回K11(在keytable定义) return K11; if(temp=0x1d) /是第三行第二列的键,对Switch做求反操作,则返回K12(在keytable定义) Switch=Switch; return K12; unsigned int ReadKey(void) unsigned int temp=0; unsigned int i=0; while(1) temp=0x1f&C41; /扫描第一行,看有

15、无按下 if(temp!=0x1f) /第一行如有有按下,则跳出while循环 i=0x0; break; temp=0x1f&C42; /扫描第二行,看有无按下 if(temp!=0x1f) /第二行如有有按下,则跳出while循环 i=0x40; break; temp=0x1f&C43; /扫描第三行,看有无按下 if(temp!=0x1f) /第三行如有有按下,则跳出while循环 i=0x80; break; temp=0x1f&C44; /扫描第四行,看有无按下 if(temp!=0x1f) /第四行如有有按下,则跳出while循环 i=0xC0; break; return 0x

16、ff; /都没有按下,返回0xff return i|temp; /将高三位和低五位合并unsigned int Decode(unsigned int a) /对键值解码 switch(a) case K1: return 1; case K2: return 2; case K3: return 3; case K4: return 4; case K5: return 5; case K6: return 6; case K7: return 7; case K8: return 8; case K9: return 9; case K10: return 0; case K11: re

17、turn 10; default: return 0xff; unsigned int ReadInput(void) unsigned int key=0; unsigned int i=0; unsigned int temp=0; key=ReadKeyS(); /读取开关键是否按下 i=Decode(ReadKeyS(); /对读取的键值解码 if(i!=10) /如果不等于开关键(10为开关键解码后的值),则不读数据,退出 return 0xff; Display(0,DataTO); /数码管的输入区清零 /delay1(); while(1) key=ReadKey(); /读取

18、第一个键值(十位) i=Decode(key); /解码 if(i10) /如果是前二行的键值,则更新DataTI(临时的输入数据) DataTI=i; /更新DataTI Display(DataTI,DataTO); /更新数码管,显示输入的数字 break; Task(); /和main()的那个Task()相同,目的是防止输入数据的时候单片机失去控温能力 while(1) key=ReadKey(); /读取键值 if(key=0xff) /等键盘松开 break; Task(); while(1) key=ReadKey(); /读取第二个键值(个位) i=Decode(key);

19、/解码 if(i95) /如果温度大于95度,就修正为96度(95度时温度变送器为5V) DataTI=95; tp=TargetT-DataTO; /目标温度和目标温度的差值 if(tp0) /如果为负 tp=tp+1; /求差值绝对值 sign=1; /符号位标记为1(1为负数,0为正数) else sign=0; /符号位标记为0(1为负数,0为正数) /分三段控制,030度,3170度,7195度 if(DataTO31); /第一段 while(1) if(tp1) /如果差值为0,则令驱动器空载(0V) C3=0x80; break; if(tp4&sign=0) /如果差值小于4

20、且为正数,令驱动器加热(但不是满载) C3=170; break; if(tp4&sign=1) /如果差值小于4且为负数,令驱动器冷却(但不是满载) C3=30; break; if(sign=1) /如果差值大于4且为负数,令驱动器冷却(满载) C3=0; break; if(sign=0) /如果差值大于4且为正数,令驱动器加热(满载) C3=255; break; break; if(DataTO30); /第二段 while(1) if(tp1) /如果差值为0,则令驱动器空载(0V) C3=0x80; break; if(tp4&sign=0) /如果差值小于4且为正数,令驱动器加

21、热(但不是满载) C3=220; break; if(tp4&sign=1) /如果差值小于4且为负数,令驱动器冷却(但不是满载) C3=75; break; if(sign=1) /如果差值大于4且为负数,令驱动器冷却(满载) C3=0; break; if(sign=0) /如果差值大于4且为正数,令驱动器加热(满载) C3=255; break; break; if(DataTO70); /第三段 while(1) if(tp1) /如果差值为0,则令驱动器空载(0V) C3=0x80; break; if(tp4&sign=0) /如果差值小于4且为正数,令驱动器加热(但不是满载) C

22、3=255; break; if(tp4&sign=1) /如果差值小于4且为负数,令驱动器冷却(但不是满载) C3=100; break; if(sign=1) /如果差值大于4且为负数,令驱动器冷却(满载) C3=0; break; if(sign=0) /如果差值大于4且为正数,令驱动器加热(满载) C3=255; break; break; Display(DataTI,DataTO); /更新数码管显示 return;七、出现的问题分析及解决方法问题一:我们在用老师的调试程序调试LED数码管时,发现无论怎么弄LED都显示乱码。 解决方法:后来问老师,我得知老师的程序是按照Q1Q7依次对应数码管的ag, 同时将程序再按照四个数码管不同的对应线路译出四个独立的表。问题二:一开始调试闭环程序时我们用的是P调节,显示值确实很接近设定值,但是不能稳定在某一数值,而是不停地变换,比如85、84来回跳。解决方法:我们改进了程序,将P调节改进成PID调节,虽然在某些温度依然会来回跳,但是比改进算法前要稳定了很多。问题三:将系统移植到实验模板上时,我们发现最终显示值偏离设定值较大,最大偏差甚至达到67度。解决方法:我将0对应变送器输出0V,100对应5V。然而当我用万用表测了100时变送器输出端的电压值

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1