还剩26页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
编号课程设计说明书题目水位控制器设计院(系)电子工程与自动化学院专业自动化学生姓名xxxxxxxxxxxxx学号xxxxxxxxxxx指导教师xxxxxxxxxxxxx职称研究员题目类型理论研究实验研究工程设计√工程技术研究软件__2013年7月5日摘要半个世纪来,随着控制理论的深入研究,出现了许多新的控制算法液位高度控制是工业控制过程的一种典型控制模型,进行液位控制课题研究,有助于学生进一步学习单片机、微机控制、自动控制理论等相关课程在动态状态下,采用合适的方法对液位进行检测、控制,能收到很好的效果PID控制是目前采用最多的控制方法根据液位系统的特点,设计合适的PID控制器对其进行液位控制,不仅成本低,而且控制效果好,具有较高的使用价值本文主要是利用双向水泵对水箱进行进水与排水控制,也就是进行对水箱液位控制系统的设计,涉及到液位的动态控制、控制系统的建模、PID算法、传感器等一系列知识选用合适的器件设备、控制方案和算法,为能最大限度地满足系统对控制精度、实时控制等控制品质的要求关键词PID控制单片机液位AbstractInre__ntyearswithin-depthstudyofcontroltheory__nynewcontrolalgorithm.Liquidlevelheightisanimportantparameterinindustrialcontrolpro__ssunderdynamicconditionadopttheappropriatemethodstocontroltheliquidleveldetectionandcangetverygoodeffect.PIDcontrolisoneofthemostcontrolmethods.AccordingtothecharacteristicsoftheliquidlevelsystemdesignasuitablePIDcontrollerforlevelcontrolnotonlylowcostandgoodcontroleffectandhashigherusevalue.Thisarticle__inlyistousethetwo-waywaterpumptocontrolthefeedwateranddrainagewatertankinawordisthedesignofwatertanklevelcontrolsysteminvolvesthelevelofdynamiccontrolthemodelingofthecontrolsystemPIDalgorithmsensorsandsoonaseriesofknowledge.Choosetherightcomponentsequipmentcontrolschemeandalgorithmto__ximizemeetthecontrolaccuracyandreal-timecontrolsystemcontrolqualityrequirements.KeywordsPIDcontrol;Industrial;Liquidlevel;singechip目录引言41背景知识及系统设计要求4
1.1背景知识4
1.2stc12c5a60s2系列单片机介绍4
1.3系统设计要求4
1.4系统设计方案42主要器件的选择及论证7
2.1微处理器的选择7
2.2驱动模块选择7
2.3输出模块选择7
2.4输入模块选择73硬件电路的设计7
3.1stc12c5a08s2主控模块设计7stc12c5a08s2最小系统芯片部分8stc12c5a08s2最小系统I/O口部分
93.
1.3系统驱动模块部分……………………………………………………………………9
3.2总原理图与pcb效果图104软件设计11
4.1ad转换的程序11
4.2lcd程序11
4.1按键程序1
14.1关于中断1
14.5关于pwm1
24.6关于主程序…………………………………………………………………………125调试过程12
5.1液位传感器定标12
5.2硬件调试过程………………………………………………………………………14
5.3软件调试过程156对系统的总结与展望17
6.1总结17
6.2展望17谢辞18____19附录201背景知识及系统设计要求4
1.1背景知识4
1.2stc12c5a60s2系列单片机介绍4
1.3系统设计要求4
1.4系统设计方案42主要器件的选择及论证7
2.1微处理器的选择7
2.2驱动模块选择7
2.3输出模块选择7
2.4输入模块选择73硬件电路的设计7
3.1stc12c5a08s2主控模块设计7stc12c5a08s2最小系统芯片部分8stc12c5a08s2最小系统I/O口部分
93.
1.3系统驱动模块部分……………………………………………………………………9
3.2总原理图与pcb效果图104软件设计11
4.1ad转换的程序11
4.2lcd程序11
4.1按键程序1
14.1关于中断1
14.5关于pwm1
24.6关于主程序…………………………………………………………………………125调试过程12
5.1液位传感器定标12
5.2硬件调试过程………………………………………………………………………14
5.3软件调试过程156对系统的总结与展望17
6.1总结17
6.2展望17谢辞18____19附录20引言本课题中我们设计了基于单片机控制驱动器驱动水泵来进行水位控制的控制系统,实现了连续控制和跟踪水位,并以液晶实时显示水位该方案具有原理简单、想法新颖、容易实现、精度高等特点,控制系统对于提高工业自动化水平和提高生活供水质量具有重要的意义 在生产领域中,实现水位自动检测和控制是工业过程控制的一项关键技术,对于提高工业过程控制的自动化水平有着重要的意义 在生活领域中,供水方式过去一般是通过人工来实现控制,容易造成对水资源的浪费,所以现在人们越来越__水资源的问题目前,水位控制系统是受到广泛应用的供水系统,水位控制可以有多种实现方法,如机械控制、逻辑电路控制、机电控制、传感器控制等,但传统的控制方式存在控制精度低、能耗大、不能实现连续控制和跟踪水位的特点,所以本论文设计出更方便更准确的水位控制系统1背景知识及系统设计要求
1.1背景知识本课题涉及了单片机、自动控制原理、传感器、计算机控制技术等相关课程,需要熟练编写单片机程序、设计控制算法、正确标定传感器与ad转换的数据曲线、正确进行分段线性拟合、根据实际水位和目标水位的差值用pwm脉宽调制技术进行pid调节其中单片机程序设计为重点,主要用到其中的定时器,内置ad,中断和寄存器相关知识
1.2stc12c5a60s2系列单片机介绍stc12c5a60s2系列单片机是宏晶科技生产的单时钟/机器周期单单片机,是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但是速度快了8~12倍,内部集成__x810专用复位电路,2路pwm,8路10位ad(250k/s),针对电机控制,强干扰的场合本课题中由学校提供一片stc12c5a08s2单片机,用其进行课题设置完全能满足需求
1.3系统设计要求在学过的单片机的一些知识的基础上,通过自主学习,学会另外一些单片机的应用,学会那种单片机的一种或者几种语言的编程,学会运用学到的新的单片机控制__的芯片、电路模块,设计一个液位控制器,实现4项功能,基本功能单片机正常工作;功能1用H桥芯片驱动水泵进行正反转;实现水箱进水与排水控制;功能2实现用压力传感器进行液位的测量;功能3键盘可进行水位设置,实际水位可以实时显示
1.4系统设计方案流程图主程序流程开始外部中断1中断服务程序流程 N Y N定时器1中断服务程序设计pwm波形流程 N Y N Y 2主要器件的选择及论证
2.1微处理器和ADC的选择老师提供的stc12c5a08s2是高速、低功耗、超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但是速度快了8~12倍,内部集成__x810专用复位电路,2路pwm,8路10位ad(250k/s),用来进行课题设置完全能满足需求其中开通一路ad通道采集液位__就可以,并且精度能达到1/1024足够满足课程精度要求了,若需要再提高精度,可以考虑多开通一路ad通道采集一路标准电平__用作参考电压来计算减小液位电压的误差在本次试验中ad转换取高八位1/256的精度就已经足够了,本人采用十位转换精度,经验证最后精度能保持在1毫米误差内,已经满足需求,所以参考标准电压的ad通道只作用预留接口附加设计在硬件中,而未使用之,若读者需要可将参考电压(推荐为
2.5v)加入p.14口,并在程序中加入P1ASF=0x10;(开启p
1.4ad通道)
2.2驱动模块的选择由于单片机的负载功率不足以驱动水泵并且控制器与控制对象应该进行电气隔离进行保护,所以应该加入驱动模块,本次课题中我们考虑了
293、298器件,最后为了确保供应电流能满足水泵考虑了功率因素采用了298电路,经验证满足设计需求,293为经验证但是理论上可以尝试298控制端口需要接入in1in2ena使能3个控制端,其中常用控制方式有两种,一是将ena使能置高,in1in2接入两组互补的pwm波形控制out1out1同步输出两组互补pwm波形二是将in1in2分别接一高一低来决定输出转向,ena接入一个pwm脉冲控制__作为使能调节功率大小笔者使用了后一方案
2.3输出模块的选择本课题中需要实现液位实时显示与目标水位显示,所以需要设计输出模块,现在集成的显示模块很多,买最常见的1062lcd或者8位数码管就足够满足设计了,综合考虑编程方便、美观度和经济成本,笔者选择了lcd
2.4输入模块的选择为了能够由人自主设定目标水位,需要设计输入模块,输入模块设计方案也很多,比如用4位开关分别进行加、减、确定、修改4种操作就能满足,而考虑到用4*4键盘进行键入更能符合日常生活操作规范,笔者选择了设计4*4键盘并且加入一个4输入与门电路在按键列扫描的同时引起外部中断1由中断服务程序处理按键值获得0~999mm输入量程3脉冲__参数测试仪的硬件电路设计
3.1stc12c5a08s2主控模块设计
3.
1.1stc12c5a08s2最小应用系统芯片部分和常用的__c51系列单片机一样,最小系统笔者使用了12M晶振,加入了复位按键开关,由于手边有单片机__板方便下载调试程序,未加入串口下载电路的设计,需要的可以在加入最小应用系统电路原理图如下
3.
1.2stc12c5a08s2系统i/o外接部分本课题的外接设计需要外接1位的ad转换输入通道(并预留一路备用通道)8位的4*4键盘,l602lcd的3位使能控制,8位数据口,298的两位输入控制,1位使能控制,考虑布局方便已经使用方便,笔者使用了p
1.0为ad输入,p
1.4位预留ad输入,p2口8位为按键,p
1.1~
1.3位1602控制位,p0口8位为1602数据位,p
1.5~
1.7位298的驱动控制位原理图如下
3.
1.3系统驱动模块部分驱动模块直接用298模块,其需要两路电源,支持双输入双输出,本次使用out1ou2接入水泵响应in1in2单片机输入来同步驱动水泵,ENA接单片机的p
1.7pwm波形输出作为使能控制具体原理图如下
3.2总电路原理图与pcb笔者的pcb效果图4软件设计
4.1ad转换程序
(1)头文件的定义相关内容
(2)ADC初始化程序调用此程序将adc初始化详见附录3voidInitADC
(3)获取某通道的转换10位值调用此程序获取某一位通道ad转换10位结果详见附录3lintgetADCucharch
4.2lcd显示程序
(1)头文件的定义相关内容
(2)显示器初始化调用此程序将lcd初始化详见附录3voidLCD_Initial
(3)可以调用的显示子函数笔者编写了一些方便调用来送数据令lcd输出显示的子程序,入单字写入,34位数据直接输出,字符串输出的程序等,详见附录
3.
4.3按键程序
(1)按键扫描程序为了能够在按键按下后同时引起外部中断1进入中断服务程序将按键值处理获得0~999间的数据而不单单是16个整数,在硬件设计上笔者加入了一个与门印发中断而软件上使用了较为累赘的逐行扫描的按键扫描程序ucharkeyscan,本文不再赘述
(2)在中断中获取按键键值程序在这个中断服务程序中将判断按下的是否为数字键原按键值,若是则将原键值置高位再将新值置低位并在退出中断服务程序前判断最新的按键值是否超过了999,若超过要进行处理,因为在本课题中完全不需要设定高于200毫米的目标水位具体程序详见附录3子函数中voidInit1interrupt2函数
4.4关于中断程序笔者用上了定时器1中断和外部中断1,需要启动两个中断需要特别注意中断初始化,否则在软件调试时往往进入中断中跳不出来voidInitvoid//初始化{EA=1;//**************开总中断EX1=1;//*************开外部中断1ET1=1;//定时器中断PX1=1;//优先级高PT1=0;//优先级低IT1=0;//*************设置为电平触发方式}另外需要了解基本的中断服务程序指令格式voidInit1interrupt0voidInit1interrupt1voidInit1interrupt2voidInit1interrupt3voidInit1interrupt4其中后尾数表示中断源,依次是外部中断0,定时器中断0,外部中断1,定时器中断1等等
4.5关于pwm波形Pwm脉宽调制技术在控制系统中有着很高的地位,在本课题中笔者通过不断进入定时器1中断判断进入次数是否达到控制水泵功率所需要占空比的数值来改变或维持pwm输出的方式进行程序设计具体为void_PWM_interrupt3{statictime;if++time==zkb//每到定时器1溢出中断便进入一次中断程序中将time自加1{//并与占空比比较是否变为低电平,比如主程序求得这时应该pwm=0;//令水泵以90%的输出功率工作抽水,那么就90次跳过本if语句}//得到90个延迟周期的高电平和10个延迟周期的低电平的pwm波形iftime==100{//满百重置time=0;pwm=1;}}
4.6主程序进入主程序中首先先开启计数器、开中断、将固定字符送lcd输出显示;然后进入while循环中,不断刷新ad测出实时数据、按键数据并分别送lcd显示在while循环中等待定时器0溢出,每次溢出时进行实际液位于目标水位的位差计算并由此求取所需要的水泵转向的控制__输出以及水泵输出功率,将其换算为满功率对应占空比信息等待定时器1中断根据占空比计算结果形成pwm控制波形进行水泵转动控制具体的主函数详见附录45调试过程
5.1传感器线性拟合调测过程液位传感器是类似于洗衣机内部的压力型传感器,在课题一开始就需要根据传感器的灵敏区设置水箱,刻度标度要在其灵敏量程范围内,但是推荐不必急于用不可擦拭墨迹标定坐标度,避免后期调整传感器后坐标不同笔者由于有学校提供了共计5套传感器和水泵,所以前期只将每只传感器装好后经过反复调零和调放大系数各测了4组水位与传感器输出电压关系表并生成曲线观测其线性情况,发现在部分量程中线性度还不错多组测数能到提高精度,并且必需要在加水过程和排水过程分别测数,及早发现传感器的输出增长过程和降低过程是否能拟合,若不能那么在控制算法中就需要两套计算公式若整条线根本分线性,就需要多次分段求取各段各自的代数算式以备测试控制效果经测试,笔者与同学选中了其中两只在量程范围内精度较高并且较线性的传感器进行后期设计工作其中部分先期测试到的数据和曲线示例如下在部分量程中线性度较高前期测试传感器示例数据传感器实物图在后期测设计中,其他模块都能正确工作后需要加入ad转换算式把模拟液位测试电压转化为数字可见的液位数据,这时需要测量更多组数据,并且测量间距要足够小,最后取了平均值后进行拟合得出电压与液位关系算式,示例如下其中y=
3.1756x-
1.3855为所需算式
5.2控制模块的硬件调测过程做出实物后,在未接入单片机不加入控制程序的情况下,将驱动模块的in1接高,in2接低,使能ena直接接高,并正确向298供电,测试输出out1out2是否能驱动水泵满功率正转然后将in1in2互换高低电平,测试水泵是否满功率反转若正反转都正常,可以将ena高电平移除,用脉冲__发生器输出5v的方波接入,方波占空比分别调到20%,50%80%观测水泵输出功率状况可以验证通过单片机输出pwm波形作为使能的预期结果是否满足需要笔者经测试发现在供应电压为
7.5v工作电压时,水泵需要在pwm占空比为20%以上才具备抽水能力,否则只是空转而带不动水流水泵实物图将系统在电源开关关闭情况下正确接线接入电源,再次检验接电正确、单片机未反接后打开__电源开关向单片机和1602提供5v电源上电后,调节1602亮度调节微调电阻,使亮度适宜这时若单片机程序为空或未接单片机或接反单片机,lcd为亮着一排空格的初始状态,应及时留意是否接反单片机避免烧坏若程序正确,会显示相应字符信息,这时进行按键操作观测是否能将键入数据显示到lcd上,若不能应进行程序修改重试单纯调试按键与lcd的接线图
5.3控制模块的软件调测过程将lcd相关程序烧入单片机,正确硬件连接后开始测试,若程序正确将得到正确的显示字符反正需要再修改程序按键与lcd部分仿真正确连接硬件,传感器与单片机共低连接,程序正确设定ad转换的初始化等函数,正确从寄存器获取转换数据(笔者取10位转换结果,读者可以根据需要只取高8位),正确将数据送lcd显示,若未能实现应修改程序 若正确得出转换数据但是数据波动很大,请检查硬件连接,或者将p1.0直接接高或接地观测是否显示1023或者0000,若不是则说明硬件布局不合理或者单片机本身有故障,推荐换p1.4备用通道尝试,若不行则换芯片或者重新布局pcb正确硬件连接后,用万用表测试p
1.5p
1.6p
1.7的输出状态,当实际液位与目标水位有差距时,p
1.5p
1.6应为一高一低的电平状态,p
1.7应为高电平将p
1.7接到示波器观测应为pwm波形,若液位差较大观测到的pwm波形为纯高电平是因为程序设置的占空比为满百,可改为99便于观测或在液位差较小,系统在进行微调控制时观测示波器显示状态,能观测到较好波形若以上功能不能实现,应进行软件调试,观测是否进入定时器1中断服务程序,若没有则留意中断初始化和定时器初始化是否正确,主程序调用是否正确,若正常在中断服务程序中获得了pwm控制波形,注意是否正确定义了i/o口,p
1.5~
1.7使用是否出错多次调试结果正确后,可以配合硬件测试接入水泵观测若pid控制正常,水泵工作应该是不连续的,抽水声音明显有断续若不正常应进行软件参数调节,笔者使用试凑发反复调节可以得到较好结果若水泵工作正常但是到达预定水位不会停下而是在目标水位附近低功率抽水又排水的反复,是由于水泵的管道中有水残留,到达预定水位后残留水慢慢流下又影响了实际水位以至于反复启动控制系统工作,若不希望水泵这么跳动,可以进行软件调节将水位2毫米内误差忽略而不进行动作即可6 对系统的总结与展望
6.1总结现在本系统已经交付验收,经测试达到了所要求的全部基本要求,误差精度在一毫米左右,个人对本次课程设计中的自我表现还算满意,从方案提出到一步步验证、改进实施方案都亲力亲为并且每一步都做得不错,最终也达到了设计预期,回想这三个周,看着自己的劳动成果,无论是原理图和pcb的设计和做板焊接还是设计程序反复调试,自己的能力都显然得到了一定的锻炼和提升
6.2展望随着时代的发展,自动化控制集成度必然越来越高,精度和速度也要求越来越高,液位控制有着不错的前景,比如在家居中的运用但是通过课题学习并不是局限着课题本身,更重要的是在其中得到的锻炼和提升,相信未来在更多领域的控制设计中我们也能有所建树谢辞从论文选题到资料搜集,从做一次一次地板子到反反复复地调程序,从写稿到反复修改,期间经历了喜悦、痛苦、烦躁和彷徨,在课设的过程中心情是如此的复杂,特别是做板子和调程序的时候,喜怒哀乐都是经常变化的还体验过晚上加班在实验室里调程序的积极学习生活,现在本次课程设计的任务已经基本完成,圆满验收了在做毕业设计的过程中,感谢老师为本人们提供了实验室已经各种设备,可以让本人随时都可以在实验室测试板子,调试程序感谢同学们的无私帮助,很高兴大家能共同探讨学__同进步感谢指导老师对本人毕业设计过程中的指导感谢陪我一起熬夜测板子,调程序的同学们____
[1]谭浩强.C程序设计(第三版)[M].清华大学出版社
[2]白驹珩,雷晓平.单片计算机及其应用(第二版)[M].电子科技大学出版社
2005.
[3]康华光.电子技术基础模拟部分(第五版)[M].高等教育出版社,200645~__.
[4]阎石.数字电子技术基础(第五版)[M].高等教育出版社,200634~
79.
[5] 百度文库
[6]stc系列单片机简介
[7] 微型计算机控制技术(第二版)[M].清华大学出版社
[8]EDA技术实用教程(第四版)[M].科学出版社
[9]胡大可.MSP430系列Flash型超低功耗16位单片机[M].北京北京____大学出版社,
2001.
[10]C51单片机高效入门[M].机械工业出版社附录附录1整体系统板效果图附录2需要调用的两个头文件/*--------------------------------------------------------------------------INTRINS.HIntrinsicfunctionsforC
51.Copyrightc1988-2004KeilElektronikGmbHandKeilSoftwareInc.Allrightsreserved.--------------------------------------------------------------------------*/#ifndef__INTRINS_H__#define__INTRINS_H__externvoid_nop_void;externbit_testbit_bit;externunsignedchar_cror_unsignedcharunsignedchar;externunsignedint_iror_unsignedintunsignedchar;externunsignedlong_lror_unsignedlongunsignedchar;externunsignedchar_crol_unsignedcharunsignedchar;externunsignedint_irol_unsignedintunsignedchar;externunsignedlong_lrol_unsignedlongunsignedchar;externunsignedchar_chkfloat_float;externvoid_push_unsignedchar_sfr;externvoid_pop_unsignedchar_sfr;#endif/*--------------------------------------------------------------------------REG
52.HHeaderfileforgeneric80C52and80C32microcontroller.Copyrightc1988-2002KeilElektronikGmbHandKeilSoftwareInc.Allrightsreserved.--------------------------------------------------------------------------*/#ifndef__REG52_H__#define__REG52_H__/*BYTERegisters*/sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;sfrP3=0xB0;sfrPSW=0xD0;sfrACC=0xE0;sfrB=0xF0;sfrSP=0x81;sfrDPL=0x82;sfrDPH=0x83;sfrPCON=0x87;sfrTCON=0x88;sfrTMOD=0x__;sfrTL0=0x8A;sfrTL1=0x8B;sfrTH0=0x8C;sfrTH1=0x8D;sfrIE=0xA8;sfrIP=0xB8;sfrSCON=0x98;sfr__UF=0x99;/*8052Extensions*/sfrT2CON=0xC8;sfrRCAP2L=0xCA;sfrRCAP2H=0xCB;sfrTL2=0xCC;sfrTH2=0xCD;/*BITRegisters*//*PSW*/__itCY=PSW^7;__itAC=PSW^6;__itF0=PSW^5;__itRS1=PSW^4;__itRS0=PSW^3;__itOV=PSW^2;__itP=PSW^0;//8052only/*TCON*/__itTF1=TCON^7;__itTR1=TCON^6;__itTF0=TCON^5;__itTR0=TCON^4;__itIE1=TCON^3;__itIT1=TCON^2;__itIE0=TCON^1;__itIT0=TCON^0;/*IE*/__itEA=IE^7;__itET2=IE^5;//8052only__itES=IE^4;__itET1=IE^3;__itEX1=IE^2;__itET0=IE^1;__itEX0=IE^0;/*IP*/__itPT2=IP^5;__itPS=IP^4;__itPT1=IP^3;__itPX1=IP^2;__itPT0=IP^1;__itPX0=IP^0;/*P3*/__itRD=P3^7;__itWR=P3^6;__itT1=P3^5;__itT0=P3^4;__itINT1=P3^3;__itINT0=P3^2;__itTXD=P3^1;__itRXD=P3^0;/*SCON*/__it__0=SCON^7;__it__1=SCON^6;__it__2=SCON^5;__itREN=SCON^4;__itTB8=SCON^3;__itRB8=SCON^2;__itTI=SCON^1;__itRI=SCON^0;/*P1*/__itT2EX=P1^1;//8052only__itT2=P1^0;//8052only/*T2CON*/__itTF2=T2CON^7;__itEXF2=T2CON^6;__itRCLK=T2CON^5;__itTCLK=T2CON^4;__itEXEN2=T2CON^3;__itTR2=T2CON^2;__itC_T2=T2CON^1;__itCP_RL2=T2CON^0;#endif附录3设计专供调用的子函数voidInitADC//ADC初始化程序{P1ASF=0x01;//开p
1.0ad通道备用通道为p
1.4,0x10ADC_RES=0;ADC_LOW2=0;ADC_CONTR=ADC_POWER|ADC_SPEEDLL;delay20;}lintgetADCucharch//获取某ad通道转换结果(10位){lintp;ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;_nop_;//Mustwaitbeforeinquiry_nop_;_nop_;_nop_;while!ADC_CONTRADC_FLAG;//WaitcompleteflagADC_CONTR=~ADC_FLAG;//CloseADCp=ADC_RES*4+ADC_LOW2;returnp;}voidLCD_Initial//显示器初始化{LCD_WRITE0x38LCD_COM;delay50;LCD_WRITE0x38LCD_COM;delay50;LCD_WRITE0x06LCD_COM;delay10;LCD_WRITE0x01LCD_COM;delay10;LCD_WRITE0x0cLCD_COM;delay10;}voidLCD_WRITEunsignedcharxbitWS//写入函数{P0=x;delay5;LcdRW=0;delay5;LcdRS=WS;delay5;LcdEN=1;delay10;LcdEN=0;}voidGotoXYunsignedcharxunsignedchary//求写入数据的起始地址,并写入命令{unsignedcharcodetable
[2]={0x000x40};LCD_WRITE0x80+table[x]+yLCD_COM;}voidPutChcharm//输入数据函数{LCD_WRITEmLCD_DAT;}voidPrintunsignedchar*str//输入字符串函数{while*str!=\0{PutCh*str;str++;}}voidLCD_ZX4lintt//LCD4位数输出{PutCht/1000+0;PutCht/100%10+0;PutCht/10%10+0;PutCht%10+0;}voidLCD_ZX3uintt//LCD3位数输出{PutCht/100+0;PutCht/10%10+0;PutCht%10+0;}voidInit1interrupt2//中断服务程序获取按键值{count=keyscan;ifcount=9count=0{mum=mum*10+count;ifmum999mum=mum%10;delay5;}}voiddelayuintonx//简单的延迟{charij;fori=0;ionx;i++forj=0;j110;j++;}附录4主程序void__in{LCD_Initial;GotoXY00;Printtarget:;GotoXY013;Printmm;GotoXY10;PrintAD=;GotoXY18;Printnow=mm;InitADC;Init;TMOD=0x21;TH0=65536-_____/256;TL0=65536-_____%256;TH1=256-5;TL1=256-5;TR0=1;TR1=1;while1{x=getADC0;y=x*50;z=y/1023;m=
3.1756*z-
8.3855;GotoXY13;ADC_ZX4x;GotoXY112;ADC_ZX3m;GotoXY09;ADC_ZX3mum;ifTF0==1{TF0=0;TH0=65536-_____/256;TL0=65536-_____%256;e1=e0;e0=m-mum;ife00{fx1=0;fx2=1;//加水}elseife00{fx1=1;fx2=0;//排水}else{fx1=0;fx2=0;//停止}u+=e0*ki+e0-e1*kp;//经过不断试凑笔者只使用了pi调节ifuVSu=VS;ifu0u=
0.0;zkb=ucharu*
100.0/VS;//求占空比}}}√开始进入主程序,开启计数器,开中断,将固定字符送lcd输出显示根据算术结果进行水泵转动控制在while循环中等待定时器0溢出,每次溢出时进行实际液位于目标水位的位差计算并由此求取所需要的水泵转向的控制__输出以及水泵输出功率,将其换算为满功率对应占空比信息进入while循环中,不断刷新ad测出实时数据、按键数据并分别送lcd显示得到新的按键值999?按键值为0~9数字?将原按键值乘与10置高位再加上新按下键值每当4*4按键中扫描到按键按下就进入外部中断程序,读取按键值将键值最高位去除退出中断服务程序退出中断服务程序使能输出pwm低电平Time=100?使能输出pwm保持高电平使能输出pwm低电平Time=目标占空比?每10us进入定时器1中断中将time自加1。