电子工程设计报告题目:闭环温度控制系统设计——单片机、显示和键盘电路及系统软件专业:小组:姓名学号:指导教师:张辉完成日期:北京工业大学电子工程设计I-2-0-摘要随着现代工业技术的迅猛发展,工业上的各种技术指标精度的要求也越来越高,在众多指标中,温度的测量与控制是一个永恒的话题,只有了精确地温度测量,才能把加热和散热的工作做得更好。本课题是小型温度测量与控制系统设计,以单片机AT89C51芯片为核心,和LED数码管显示,数模、模数转换和辅以稳压电源及变送器的测量控制系统,另配有键盘输入控制。本设计详细介绍了LED显示与键盘控制电路的工作原理,硬件电路组成的思路和相应的C语言闭环程序。本设计主要包括以下几个模块:LED显示模块、键盘控制模块。能够对环境温度随时随地检测与显示,并可以在模板上设定相应温度值使系统达到设定温度。【关键词】:LED显示、键盘控制、闭环程序、模板测试。目录一、功能指标要求---------------------------------------------------1二、D/A模块调试---------------------------------------------------1三、A/D模块调试---------------------------------------------------2四、显示电路模块---------------------------------------------------31.显示电路设计-----------------------------------------------32.显示电路原理分析-------------------------------------------4五、键盘控制电路模块-----------------------------------------------41.键盘控制电路设计-------------------------------------------42.键盘控制电路原理分析---------------------------------------4六、系统调试及程序设计---------------------------------------------4七、出现的问题分析及解决方法--------------------------------------14八、创新性--------------------------------------------------------14九、体会与建议----------------------------------------------------14【附录Ⅰ】-----------------------------------------------------------151一、功能指标要求1)显示模块:4位7段数码显示,前3位含小数点2)键盘模块:0~9数字输入键及若干功能设置按键控制;第10数字键作为允许控制开关3)独立电路板安装结构二、D/A模块调试调试方法:数据为从00—FF顺序递增并不断循环的数值。输出端波形如图二(1):图二(1)调试程序:#includeC8051F020.h#includeabsacc.h#includedata_define.c#defineC3XBYTE[0x4000]#defineTIMER0x8000#includeInit_Device.cvoiddelay(void);voidmain(void){unsignedcharx;Init_Device();while(1)2{++x;C3=x;delay();}}voiddelay(void){inti;for(i=0;iTIMER;++i);}三、A/D模块调试调试方法:输入信号范围:0V~+5V改变设置温度,运行A/D测试程序,检查模/数转换结果;在调试台上通过+10按键不断改变温度数值,调试台LED会显示相应温度。调试程序:#includeC8051F020.h#includeabsacc.h#includedata_define.c#defineC2XBYTE[0x2000]#defineTIMER0x8000#includeInit_Device.cvoiddelay(void);voidmain(void){unsignedcharx;Init_Device();while(1){C2=x;delay();x=C2;delay();}}voiddelay(void){unsignedchari;for(i=0;iTIMER;++i);}3四、显示电路模块1.显示电路设计:这次我们用的均为两位共阳极七段数码管,管脚见图四(1)图四(1)显示模块电路图见图四(2):图四(2)42.显示电路原理分析:我们选用静态显示控制电路,八位数据位作为74LS273数据锁存器的输入信号,273的输出信号作为七段数码管的输入信号,控制七个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.键盘控制电路原理分析:我们采用阵列键盘读取方案,C4和均输入低电平到74LS32或门,32输出到译码器选通。同时32也输出到74LS244数据锁存器选通。编写程序使138译码器依次输出低电平,扫描是否有键按下,当键盘上有键按下时,Yn为低电平,对应的Sn也为低电平(即对应的Dn也为低电平)。六、系统调试及程序设计系统调试:5第一步:我们首先用调试台调试,测试开环,编写程序烧录进8051,使我们自己设计的显示模块显示位跟随调试台上LED显示模块的变化。第二步:编写PID闭环程序,编写程序烧录进8051,使系统能够从键盘上输入一个设定温度值并显示在系统显示模块设定位上。随后按下调试台“Manual”按键,使系统能够将现在温度值与设定值做差,以确定需要升温还是降温,系统显示模块显示值会逐渐接近设定值并最终稳定在一个与设定值误差非常小的数值上。第三步:将完整系统(包括电源模块、系统模块、A/D模块和变送器、D/A模块、显示模块和键盘控制模块)移植到实验室真实模板上,先将模板设定为手动调节,设定一个值看系统显示位是否随动;再将模板还原为自动调节,从键盘输入一个设定值,打开调节按钮,观察系统显示位是否逐渐靠近设定位并最终稳定在一个非常相近的数值上,模板上加热(或制冷)提示灯是否点亮。如果上述答案是肯定的,系统成功,能够满足教学要求,实现小型温度控制系统。调试程序:(自定义头函数见附录Ⅰ)#includeC8051F020.h#includeabsacc.h#includedata_define.c#includeInit_Device.c#includeaddress.h//设备地址列表#includekeytable.h//键盘的键值表#includedigtaltable.h//数码管的编码表staticunsignedintDataT=0;//16进制的A/D数据staticintDataTO=0;//10进制的温度数据staticunsignedintDataTI=0;//10进制的目标温度(临时)staticunsignedintTargetT=0;//10进制的目标温度staticchartp=0;//目标温度和当前温度的差值staticunsignedintsign=0;//表示tp的正负号staticunsignedcharSwitch=0;//开关键是否按下的标志staticunsignedintInput=0;//输入voiddelay(void);voiddelay1(void);voidDisplay(constunsignedint,constunsignedint);unsignedintConvert(constunsignedint);unsignedintReadT(void);unsignedintReadKey(void);unsignedintReadKeyS(void);unsignedintDecode(unsignedint);unsignedintReadInput(void);6voidTask(void);voidmain(void){Init_Device();while(1){ReadInput();//读取键盘Task();//对温度进行调整(主任务)}}unsignedintConvert(constunsignedinta){return(int)95*a/0xff;//返回值=输入数据*95/255(取整数)返回值范围(0~95)}unsignedintReadT(void){C2=0;//向A/D转换器发出指令delay();//等待采样完成returnC2;//返回采样数据数据}voidDisplay(constunsignedintx,constunsignedintz){C13=DT3[z/10];//第三个数码管,显示第二个数字的个位C14=DT4[z%10];//第四个数码管,显示第二个数字的十位C11=DT1[x/10];//第一个数码管,显示第一个数字的个位C12=DT2[x%10];//第二个数码管,显示第一个数字的十位}voiddelay(void)//延时子程序{longinti;for(i=0;i0x1f0;++i);}voiddelay1(void){longinti;7for(i=0;i0x81f0;++i);}unsignedintReadKeyS(void){unsignedchartemp=0;unsignedchartemp1=0;unsignedchari=0;temp=C43;//读取键盘第三行temp=0x1f&C43;//屏蔽高3位if(temp==0x1f)//如果没有按下,退出{return0xff;}temp1=temp;//如有按下,则延时后再读一次,看看是不是抖动delay();temp=0x1f&C43;if(temp!=temp1)//两次读取值不同,说明是抖动,退出{return0xff;}if(temp==0x1e)//是第三行第一列的键,则返回K11(在keytable定义){returnK11;}if(temp==0x1d)//是第三行第二列的键,对Switch做求反操作,则返回K12(在keytable定义){Switch=~Switch;returnK12;}}unsignedintReadKey(void){unsignedinttemp=0;unsignedinti=0;while(1){temp=0x1f&C41;//扫描第一行,看有无按下8if(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;