- 1.40 MB
- 2022-04-21 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
本科毕业论文(设计)题 目太阳能热水器控制器设计n太阳能热水器控制系统设计摘要:该设计以单片机AT89S52为核心,结合单线数字温度传感器DS18B20与液晶显示器12864,设计一种数字化、智能化的太阳能热水器控制系统。该系统由主控芯片模块、DS18B20温度检测模块、LCD显示模块、水位检测模块、键盘控制模块、报警模块和电磁阀控制模块组成。给出了各个模块地结构及其工作原理、系统硬件原理图、程序流程图和部分源程序,并结合理论设计进行实物制作。此系统解除了热水器上水时需人工守候和过量溢水的问题,达到了省时、环保、节水的目的。该系统与传统的机械式控制系统相比较,具有结构简单,抗干扰能力强,使用方便等特点。关键词:单片机AT89S52;温度传感器DS18B20;智能控制SolarwaterheatercontrolsystemAbstract:ThisdesigntakesmonolithicintegratedcircuitAT89S52asthecore,combiningthesingledigitaltemperaturesensorDS18B20andLCD12864,todesignakindofdigital,intelligentcontrolsystemofsolarenergywaterheater.Thesystemconsistsofmainchipmodule,DS18B20temperaturedetectionmodule,LCDdisplaymodule,thewaterleveldetectionmodule,keyboardcontrolmodule,alarmmoduleandsolenoidvalvecontrolmodule.Giventothestructureofeachmoduleanditsworkingprinciple,systemhardware,schematics,processflowcharts,andsomesourcecode,andtheoreticaldesignofphysicalproduction.ThesystemneedstoliftthewaterheaterinSheungShuiandexcessiveartificialoverflowproblemwaitingtoreachatime-saving,environmentalprotection,waterconservationpurposes.Thesystemwiththetraditionalmechanicalcontrolsystemscomparedtosimplestructure,stronganti-interferenceability,easytouseandsoon.Keywords:MicrocontrollerAT89S52;TransducerDS18B20;Intelligencecontrol44n目录1引言12系统设计要求和方案论证12.1系统的设计要求22.2系统设计方案与比较23系统硬件电路设计33.1主控芯片AT89S52单片机33.2温度检测模块73.3LCD液晶显示模块113.4水位检测模块163.4.1ADC0809芯片163.4.2水位接口电路193.5键盘控制模块203.6报警模块203.7电磁阀控制模块213.8整体电路图224系统软件设计235系统硬件调试245.1自动与手动上水测试255.2水温和水位显示测试256结束语25[参考文献]27附录28致谢4444n1引言由于近年来常规能源的紧缺,开发和利用太阳能这样的绿色能源有着重要的意义,它既是可再生能源,也不会污染环境。太阳能热水器也是其中的一大产业,太阳能热水器时存在的问题:不可缺水,空晒情况下上水会爆炸;春、秋天,水温升高蒸发,造成热能损失;冬天水温不够,须用电等等。现在人们对家用电器的要求越来趋向数字化、自动化、智能化。采用太阳能热水器水温水位测控系统,能解决上述问题。使用户省心,使用方便,智能操控,用户不必作任何操作。随着中国经济的快速发展,国内对能源的需求成几何倍数上升。从国际能源环境来看,形式并不乐观,世界能源危机日趋严重,所以中国经济要想继续高速、健康的发展,摆脱能源这一“瓶颈”已经变得刻不容缓。太阳能这一取之不尽、用之不完的新型环保可再生能源必然会成为承担这一重任的首选,所以我国太阳能热转换产业的发展前景是非常广阔的,绿色能源代替传统能源,将成为建设和谐社会的必经之路!本系统是针对上述问题设计的温度控制系统,由AT89S52单片机和一些外围设备,充分运用软件和硬件结合的方法实现了当前水位高度显示、水箱温度显示,以及当水位下降到最低刻度线时自动上水三种主要功能。本系统可使用在水池,锅炉,水塔等装置上,当水位下降到一定刻度值且大于最低水位值时,可由人工使用按键来控制水泵立即上水,直至水位到达最高刻度。当水位下降到报警刻度时,系统可通过自动上水使水位保持在一定的水位高度。每次上水的最大水位值也可根据环境需要由人工自由设置,上水过程的自动控制省去人工守候环节,节省了大量的人力,带来了工作效益。从未来的发展来看,以投资少、无污染、节约能源、多功能、智能化为设计目标,将会带来客观的经济效益。2系统设计要求和方案论证44n设计要求是一个设计必须要求达到的目标或完成的目标,而设计方案是一个设计实现的重要途径,同样必不可少。2.1系统的设计要求设计的系统可以实现当前水位高度、水箱温度的显示,以及当水位下降到报警刻度时,系统可通过自动上水使水位保持在一定的水位高度。而且还可以人工手动控制上水,每次上水的最大水位值也可根据环境需要由人工自由设置。2.2系统设计方案与比较方案一:采用半导体逻辑器件构成的控制器,主要应用定时器构成。在此控制方案里,定时器和加减计数器共同构成水位显示器。由于水温的变化具有未知性,在水温检测电路里,利用热敏电阻测量的水温信号是模拟量,需要经过模/数转换成半导体逻辑器件能够识别的数字信号。这类控制电路过于庞大复杂,操作也不方便,成本也较高。方案二:采用可编程逻辑器件。结果简单的PLC控制成为首选。由于控制电路简单,检测电路要求也不高,所以必然造成接口资源和内部资源的浪费,显然不够经济。方案三:采用单片机为核心控制器的电路。单片机电路结构简单、成本低廉,可靠性高,便于实现各个控制功能。水位由设置在水箱内的四个浮子式微动开关获得的电信号检测,通过单片机处理送达显示电路显示当前水位。由于实际操作的原因,本设计水位检测用滑动变阻器来代替,通过组织的改变来实现水位的改变。然后通过模/数转换把信号输入到单片机,获得当前水位显示。水温检测由单片机根据温度传感器(DS18B20)的操作指令和时序,读取温度,并送达显示电路显示当前水温。本设计用三个按键来控制上水的水量。从结构、经济、可操作性等方面来看,方案三都是最佳选择。方案三以单片机AT89S52为核心控制器件,结合单线数字温度传感器DS18B20与液晶显示器12864和DAC0809等芯片,设计一种太阳能热水器智能控制系统。该系统原理框图如图1所示。44n单片机AT89S52键盘控制模块快LCD显示模块电磁阀控制模块温度检测模块水位检测模块蜂鸣报警模块图1系统原理框图用户在使用热水器后,当水箱中水位下降到一定刻度值时,可通过人工使用按键方法来控制电磁阀立即上水,水位达到的最高刻度也可以由按键设定。当水位下降到低于刻度线5L时,单片机接受此信号并开始执行指令,报警电路工作,同时电磁阀打开,水位不断升高,当达到最高水位30L时便给单片机发出中断请求,此时电磁阀关闭,停止工作。设置的三个按键也可以实现人工上水的功能。在上水过程中,显示器LCD既可以显示水箱的水位值又可显示水箱内水的当前温度,不仅直观方便,而且精确度高,实用性强。此系统解决了热水器上水时需人工守候和过量溢水的问题,达到了省时、环保、节水的目的。加设的缺水报警系统和液晶显示部分,使整个系统更实用,更趋向数字化、智能化。3系统硬件电路设计该系统由主控芯片模块AT89S52、DS18B20温度检测模块、LCD液晶显示模块、水位检测模块、键盘控制模块、报警模块和电磁阀开关模块组成。下面分别对各个模块作具体介绍。3.1主控芯片AT89S52单片机[2]AT89S52是一种低功耗、高性能CMOS44n8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8K字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至8Hz静态逻辑操作,支持2种软件可选择节点模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。AT89S52单片机采用40条引脚,双列直排的封装形式。在单片机的40条引脚中,有2条专用于主电源的引脚,2条外接晶振的引脚,4条控制和其它电源复用的引脚,32条I/O引脚。图2是AT89S52引脚图。图2AT89S52单片机引脚图下面分别具体说明这些引脚的名称和功能。(1)主电源引脚Vcc和GNDVcc:接+5V电源。GND:接地。(2)时钟电路引脚XTAL1和XTAL2XTAL1:接外部晶振的一端。在单片机内部,它是反相放大器的输入端。该放大器构成了片内振荡器。44nXTAL2:接外部晶振的另一端。在单片机内部,接至上述振荡器的反相放大器的输出端,振荡器的频率是晶体振荡频率。在本设计中,XTAL1和XTAL2端外接石英晶体作为定时元件,内部反相放大器自激振荡,产生时钟。石英晶体的振荡频率为12MHz,其原理图如图3所示:图3晶体振荡电路(1)控制信号引脚RST、/、和/VppRST:单片机上电后,只要在该引脚输入24个振荡周期宽度以上的高电平就会使单片机复位。图4是复位电路图。在通电瞬间,电容C通过电阻R充电,RST端出现正脉冲,用以复位。关于参数的选定,应保证复位高电平持续时间大于2个机器周期。当采用晶振为12MHz时,可取C=10uF,R=10KΩ。图4复位电路图/:地址锁存使能输出/编程脉冲输入端。当CPU在访问外部程序存储器时,ALE的输出作为外部锁存地址的低位字节的控制信号;当不访问外部存储器程序期间,ALE端仍以1/6的时钟振荡频率固定地输出脉冲。因此,它可用作对外输出地时钟或用于定时。:外部程序存储器读选通信号。CPU44n在访问外部程序存储器期间,每个机器周期中,信号两次有效。但在此期间,每当访问外部数据存储器时,这两次有效的信号不出现。端可以驱动8个负载LSTTL。/Vpp:外部访问允许/编程电源输入端。当输入高电平时,CPU执行程序,在低4KB(0000H~0FFFH)地址范围内,访问片内程序存储器;在程序计数器PC的值超过4KB地址时,将自动转向执行片外程序存储器的程序。当输入低电平时,CPU仅访问片外程序存储器。(1)输入/输出(I/O)引脚P0、P1、P2和P3P0.0~P0.7:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。P1.0~P1.7:P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入。在flash编程和校验时,P1口接收低8位地址字节。P2.0~P2.7:P2口是一个8位准双向I/O口。在CPU访问外部存储器时,它输出高8位地址。在对EPROM编程和程序验证时,它输入高8位地址。P2口能驱动4个LSTTL负载。P3.0~P3.7:P3口是一个8位准双向I/O口。它是一个复用功能口。作为第一功能使用时,为普通I/O口,其功能和操作方法与P1口相同。作为第二功能使用时,各引脚的定义如表1所示。P3口的每一条引脚均可独立定义为第一功能的输入输出或第二功能。实际在使用中,总是先按需要优先选用它的第二功能,剩下不用的才作为第一功能口线使用。P3口能驱动4个LSTTL负载。44n表1P3各口线的第二功能表口线第二功能P3.0RXD(串行输入)P3.1TXD(串行输出)P3.2INT0(外部中断0)P3.3INT1(外部中断1)P3.4T0(定时器0的外部输入)P3.5T1(定时器1的外部输入)P3.6WR(外部数据存储器写选通道)P3.7RD(外部数据存储器读选通道)3.2温度检测模块传感器属于信息技术的前沿尖端产品,尤其是温度传感器被广泛用于工农业生产、科学研究和生活等领域,数量高居各种传感器之首。近百年来,温度传感器的发展大致经历了以下三个阶段:(1)传统的分立式温度传感器(含敏感元件);(2)模拟集成温度传感器/控制器;(3)智能温度传感器。目前,国际上新型温度传感器正从模拟式向数字式、由集成式向智能化、网络化的方向发展。温度传感器的主要特点是功能单一、测温误差小、价格低廉、响应速度快、传输距离远、体积小、微功耗等,适合远距离测温、控制,不需要进行非线性校准,外围电路简单。太阳能热水器温度传感器有很多种,本设计可选用具有负温度系数的热敏电阻来测水温,热敏电阻与普通电阻不同,它具有负的温度特性,当温度升高时,电阻值减小,它的应用是为了感知温度。由于取材原因,本设计选用了型号为DS18B20的温度传感器,因为它独特的单线接口,且具有精准度高、抗干扰能力强等优点,实验中用它来代替温度传感器。DS18B20的简介[14][15]Dallas半导体公司的数字化温度传感器DS18B20是世界上第一片支持“44n一线总线”接口的温度传感器,在其内部使用了在板(ON-BOARD)专利技术。全部传感元件及转换电路集成在形如一只三级管的集成电路内。DS18B20具有微型化、低功耗、高性能、抗干扰能力强、可组网等优点,测温分辨率高,为9~12位,精度为0.5℃。DS18B20可直接将温度转化成串行数字信号,因此特别适合和单片机配合使用,直接读取温度数据。DS18B20温度与数字对应表如表2所示。目前DS18B20数字温度传感器已经广泛应用于恒温室、粮库、计算机机房温度监控及其他各种温度测控系统中。表2DS18B20温度与数字对应表温度℃数据输出(二进制)数据输出(十六进制)+125000001111101000007D0h+8500000101010100000550h+25.062500000001100100010191h+10.125000000001010001000A2h+0.500000000000010000008h000000000000000000000h-0.51111111111111000FFF8h-10.1251111111101011110FF5Eh-25.06251111111001101111FE6Eh-551111110010010000FC90h(1)DS18B20的引脚图和封装如图5所示44n图5DS18B20的引脚图和封装(1)DS18B20的引脚介绍lDQ为数字信号输入/输入端lGND为电源地lVDD为外接供电电源输入端(在寄生电源接线方式时接地)(2)DS18B20的主要特性l独特的单线接口仅需一个端口引脚进行通讯l每个器件有唯一的64位的序列号存储在内部存储器中l简单的多点分布式测温应用l可通过数据线供电。供电范围为3.0V~5.5Vl测温范围为-55~+125℃(-67~+257℉),在-10~+85℃范围内精确度为±5℃l温度计分辨率可以被使用者选择为9~12位l最多在750ms内将温度转换为12位数字l用户可定义的非易失性温度报警设置l报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件l应用包括温度控制、工业系统、消费品、温度计或任何热感测系统(4)DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的内部结构如图6所示44n图6DS18B20的内部结构框图DS18B20使用一根单线端口进行通讯。在单线端口的条件下,要先建立ROM操作协议,才能进行存储和控制操作。光刻ROM中的64位序列号是出厂前就被光刻好的,是DS18B20的地址序列号,使每个DS18B20都有各不相同,这样就可以在一根总线上挂多个DS18B20了。其中的温度传感器完成对温度的测量。内部的存储器,包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器TH,TL和结构寄存器。配置存储器则主要用来设置它的工作模式和分辨率。DS18B20测温原理如图7所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图7中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。斜率累加器预置比较计数器1低温度系数晶振预置=0温度寄存器计数器2=0高温度系数晶振图7DS18B20的工作原理DS18B20工作主程序流程图如图8所示。44n开始DS18B20复位读取温度数据转换显示结束图8DS18B20主程序流程图DS18B20单线通信功能是分时完成的,它有严格的时隙概念。因此系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器作命令→处理数据。DS18B20可编程温度传感器采用3脚PR-35封装,其中GND为接地线,DQ为数据输入输出接口,通过一个较小阻值的上拉电阻与单片机相连。VCC为电源接口,既可由数据线提供电源,又可由外部提供电源,范围可为3.0~5.5V,本系统使用外部电源供电。3.3LCD液晶显示模块[9]液晶屏显示模块与数码管相比,它显得更为专业、漂亮。液晶显示屏以其微功耗、体积小、显示内容丰富、超薄轻巧、使用方便等诸多优点,在通讯、仪器仪表、电子设备、家用电器等低功耗应用系统中得到越来越广泛的应用,使这些电子设备的人机界面变得越来越直观形象,目前已广泛应用于电子表、计数器、IC卡电话机、液晶电视机、便携式电脑、掌上型电子玩具、复印机、传真机等许多方面。12864液晶是指这种液晶有64行,每行有128个点。要显示一个完整的汉字,需要16*16的点阵,即要显示一个汉字需要16行,每行有16个点.而显示一个字符只需要8*8点阵(或者5*7点阵)等。这样12864液晶可以显示444n行汉字,每行能显示8个汉字。如果显示字符的话,每行能显示16个字符。本实验采用TS12864-3型液晶,这种液晶自带汉字库,可直接显示汉字,采用的驱动电路是ST7290。其管脚说明如表3所示。表3TS-12864-3管脚说明管脚号管脚符号管脚功能描述12316184567891011GNDVDDNCRSWREDB0~DB7PSBRSTLED+LED-电源地电源电压+5V无连接高:数据/低:指令高:读/低:写使能端数据线控制模式系统复位背光电源,+5V背光电源,0V具体指令介绍:1、清除显示CODE:RWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLLLLLLL功能:清除显示屏幕,把DDRAM位址计数器调整为“00H”。2、地址归位CODERWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLLLLLHXL功能:把DDRAM位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM。3、地址归位CODERWRSDB7DB6DB5DB4DB3DB2DB1DB044nLLLLLLLHI/DS功能:把DDRAM位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM功能;执行该命令后,所设置的行将显示在屏幕的第一行。显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。4、显示状态开/关CODERWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLLLHDCB功能:D=1:整体显示ONC=1:游标ONB=1:游标位置ON5、游标或显示移位控制CODERWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLLHS/CR/LXX功能:设定游标的移动与显示的移动控制位,这个指令并不改变DDRAM的内容。6、功能设定CODERWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLHDLX0REXX功能:DL=1(必须设为1)RE=1:扩充之立即加动作RE=0:基本指令集动作7、设定CGRAM位址CODERWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLHAC5AC4AC3AC2AC1AC0功能:设定CGRAM位址到位址计数器(AC).8、设定DDRAM位址CODERWRSDB7DB6DB5DB4DB3DB2DB1DB0LLHAC6AC5AC4AC3AC2AC1AC0功能:设定DDRAM位址到位址计数器(AC).44n7、读取忙碌状态(BF)和位址CODERWRSDB7DB6DB5DB4DB3DB2DB1DB0LHBFAC6AC5AC4AC3AC2AC1AC0功能:读取忙碌状态(BF)可以确认内部动作是否完成,同时可以读出位址计数器(AC)的值。8、写资料到RAMCODERWRSDB7DB6DB5DB4DB3DB2DB1DB0HLD7D6D5D4D3D2D1D0功能:写入资料到内部的RAM(DDRAM/CGRAM/TRAM/GDRAM)。9、读出RAM的值CODERWRSDB7DB6DB5DB4DB3DB2DB1DB0HHD7D6D5D4D3D2D1D0功能:从内部RAM读取资料(DDRAM/CGRAM/TRAM/GDRAM)。10、待命模式(12H)CODE:RWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLLLLLLH功能:进入待命模式,执行其他命令都可终止待命模式。13、卷动位址或IRAM位址选择(13H)CODE:RWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLLLLLHSR功能:SR=1:允许输入卷动位址SR=0:允许输入IRAM位址14、反白选择(14H)CODE:RWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLLLLHR1R0功能:选择4行中的任一行作反白显示,并可决定反白与否。15、睡眠模式(015H)CODE:RWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLLLHSLXX功能:SL=1:脱离睡眠模式SL=0:进入睡眠模式44n14、扩充功能设定(016H)CODE:RWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLLHHX1REGL功能:RE=1:扩充指令集动作RE=0:基本指令集动作G=1:绘图显示ONG=0:绘图显示OFF17、设定IRAM位址或卷动位址(017H)CODERWRSDB7DB6DB5DB4DB3DB2DB1DB0LLLHAC5AC4AC3AC2AC1AC0功能:SR=1:AC5-AC0为垂直卷动地址SR=0:AC3-AC0为ICONIRAM地址18、设定绘图RAM位址(018H)CODERWRSDB7DB6DB5DB4DB3DB2DB1DB0LLHAC6AC5AC4AC3AC2AC1AC0功能:设定CGRAM地址到地址计数器(AC)。液晶显示模块与单片机连接主要考虑以下三点:1.单片机若为CMOS芯片,则不用加总线驱动器等电平转换电路;若为TTL芯片则必须配电平转换电路。2.模块读/写控制线为单选,对读、写控制线分开的单片机,必须加读、写信号转换电路。3.根据对模块确定的编码地址,选择对应的译码电路。本系统的显示电路如图9所示:44n图9显示电路3.4水位检测模块水位检测模块中需要水位传感器将水位的变化信号传递给单片机,通过单片机来控制电磁阀上水还是不上水。由于各种原因,本设计用滑动变阻器来代替水位检测器,通过阻值的变化来形象的代替水位的变化。因为阻值的变化是模拟信号,而输入单片机的信号是数字信号,因此就要用到A/D转换,将模拟信号转换为数字信号输入到单片机中,实现水位的控制。3.4.1ADC0809芯片本设计用到的A/D转换芯片是ADC0809。ADC0809是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。图10为ADC0809的引脚图。44n图10ADC0809的引脚图ADC0809的内部逻辑结构如图11所示。由图可见,ADC0809由8位模拟开关、SAR8位逐次逼近式A/D转换器、地址锁存器、控制和时序电路及输出锁存器组成。图11ADC0809的结构框图对ADC0809主要信号引脚的功能说明如下:IN7~IN0:模拟量输入通道。ALE:地址锁存允许信号。对应ALE上跳沿,A、B、C地址状态送入地址锁存器中。START:转换启动信号。START上升沿时,复位ADC0809;START44n下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持低电平。本信号有时简写为ST。A、B、C:地址线。通道端口选择线,A为低地址,C为高地址,引脚图中为ADDA,ADDB和ADDC。CLK:时钟信号。ADC0809的内部没有时钟电路,所需时钟信号由外界提供,因此有时钟信号引脚。通常使用频率为500KHz的时钟信号EOC:转换结束信号。EOC=0,正在进行转换;EOC=1,转换结束。使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。D7~D0:数据输出线。为三态缓冲输出形式,可以和单片机的数据线直接相连。D0为最低位,D7为最高OE:输出允许信号。用于控制三态输出锁存器向单片机输出转换得到的数据。OE=0,输出数据线呈高阻;OE=1,输出转换得到的数据。Vcc:+5V电源。Vref——参考电源参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准。其典型值为+5V(Vref(+)=+5V,Vref(-)=-5V).A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。为此可采用下述三种方式。(1)定时传送方式对于一种A/D转换来说,转换时间作为一项技术指标是已知的和固定的。例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。(2)查询方式A/D转换芯片由表明转换完成的状态信号,例如ADC0809的EOC端。因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。(3)中断方式把表明转换完成的状态信号(EOC44n)作为中断请求信号,以中断方式进行数据传送。3.4.2水位接口电路由于在仿真软件中无法对真实水位进行仿真。所以本设计用一个滑动变阻器来代替水位传感器,阻值的变化代表水位的变化。水位接口电路如图12所示。图12ADC0809和单片机的连接图44n3.5键盘控制模块在单片机应用系统中,通常应具有人机对话功能,能随时发出各种控制命令和数据输入以及报告应用系统的运行状态与运行结果。键盘是操作人员可以通过按键输入数据和命令进行功能设置,它是本系统中不可缺少的输入设备。键盘由一组按键开关所组成。按键开关所组成的键盘可以分为两种形式:独立式按键和矩阵式按键。本设计由于按键较少,使用的是独立式按键。独立式按键电路配置灵活,软件结构简单。当功能键不是很多时,采用该种方式比较合适。独立式按键是指直接用I/O口线构成的单个按键电路。每个独立式按键单独占有一根I/O口线。每根I/O口线的工作状态不会影响其他I/O口线的工作状态。本系统设计了3个键,所用的3个键采用直接式接法。3个按键可设置3个不同档的水位刻度:按键K1为10L水位,当按下K1时,电磁阀开始工作,水箱开始上水,直至水位达到10L时,电磁阀关闭,停止上水;按键K2为20L水位,当按下K2时,电磁阀开始工作,水箱开始上水,直至水位达到20L时,电磁阀关闭,停止上水;按键K3为30L水位,当按下K3时,电磁阀开始工作,水箱开始上水,直至水位达到30L时,电磁阀关闭,停止上水。3.6报警模块本设计的报警模块是由单片机I/O口P2.6口输出低电平驱动蜂鸣器报警。蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分压电式和电磁式两种类型,本设计中用到的就是电磁式蜂鸣器。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片以及外壳等组成,接通电源后,振荡膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。由于蜂鸣器通常工作电流比较大,而单片机I/O口输出地电流很小,基本上驱动不了蜂鸣器,所以选用的NPN型三极管9013来驱动蜂鸣器。蜂鸣器报警电路如图13所示:44n图13蜂鸣器报警电路图3.7电磁阀控制模块电磁阀是用来控制流体的自动化基础元件,属于执行器;并不限于液压,气动。 电磁阀包括:线圈、磁铁和顶杆当线圈通电时,便产生磁性,跟磁铁相互吸引,磁铁就会拉动顶杆。关闭电源,磁铁和顶杆就复位了,这样电磁阀就完成了作功过程。这就是电磁阀的工作原理。电磁阀一般用于液压系统,来关闭和开通油路。实际上,根据流过介质的温度,压力等情况,比如管道有压力和自流状态无压力。电磁阀的工作原理是不同的。比如在自流状态下需要零压启动的,就是通电后,线圈整个把闸体吸起来。而有压力状态的电磁阀,则是线圈通电后吸出插在闸体上的一个销子,用流体自身的压力把闸体顶起来。这两种方式的不同之处是,自流状态的电磁阀,因为线圈要吸起整个闸体,所以体积较大,而带压状态的电磁阀,只需要吸起销子,所以体积可以做得比较小。本设计的电磁阀起控制是否上水,其电路如图14所示。在系统中用晶体管来驱动电磁阀,当晶体管基极输入高电平时,晶体管饱和导通,集电极变为低电平,因此电磁阀闭合,开始工作;当晶体管基极输入低电平时,晶体管截止,电磁阀断开,停止工作。其中二极管并联在线圈的两端,起保护作用。后接发光二极管,显示电磁阀是否工作。44n由于实际做实物中的各种原因,本设计用发光二极管来代替电磁阀的工作状态,灯亮就表明电磁阀打开,水箱上水中;灯灭就表明电磁阀关闭,水箱停止上水。图14电磁阀控制电路3.8整体电路图根据系统的各模块电路而设计的整体电路如图15所示:44n图15系统整体电路图4系统软件设计主程序设计思想:软件采用模块化设计方式,将各个功能分成独立模块,有系统和监控程序一起管理执行。本设计的软件包括主程序,键盘扫描子程序,显示子程序,水位值设定子程序以及有关的DS18B20的程序。主程序完成功能:系统对传感器DS18B20、显示器1286444n进行初始化,并且读取用户通过键盘设置的最高水位信息,随之系统自动读取当前水位并将当前水位与最高水位进行比较,最后系统执行相应功能,完成后等待下一次的启动命令。当检测到水位低于报警刻度水位时,系统会启动报警电路工作,并且会自动上水至最大水位刻度。程序清单见附录1本设计的系统整体流程图如图16所示:开始对LCD进行初始化扫描键盘执行键盘操作显示温度、水位水位是否低于预设值打开电磁阀关闭电磁阀YESNO图16系统总体流程图5系统硬件调试我在实验板上进行了实物的制作。由于各方面条件有限,在进行实物制作时,我用发光二级管来模拟电磁阀,用滑动变阻器来模拟水位的变化。发光二级管变亮表示电磁阀打开,水箱上水;发光二级管变暗表示电磁阀关闭,水箱停止上水。44n实物做好后,便开始进行硬件调试,硬件调试是一个模块一个模块地进行的,在每个模块成功的基础上,进行最后的联调。调试过程并非一帆风顺,其中出现了很多问题,开始时液晶显示上没任何显示,我请教老师和同学,最后在他们的帮助下发现单片机和液晶显示器接的排阻阻值有问题,改正后终于可以正常显示了。程序也是在老师和同学的帮助下慢慢调试出来的。最终整个系统实现了正常的工作。系统实物连接图见附录2。5.1自动与手动上水测试自动上水:当把滑动变阻器调到水位低于5L时,此时蜂鸣器开始报警,同时发光二级管变亮,表明开始自动上水,直到水满,发光二级管变暗,停止上水。手动上水:当把K1按下,发光二级管变亮,开始上水,直到水位到达10L,发光二级管变暗,停止上水;当把K2按下,发光二级管变亮,开始上水,直到水位到达20L,发光二级管变暗,停止上水;当把K3按下,发光二级管变亮,开始上水,直到水位到达30L,发光二级管变暗,停止上水。5.2水温和水位显示测试当用手捏住温度传感器DS18B20时,可以看到显示器上面显示的温度会升高,即表示系统可以正常显示水温的变化。当调节滑动变阻器时,可看到显示器上显示水位在不断变化,从最低变到最高,即表示系统可正常显示水位的变化。6结束语经过了两个多月的学习和制作,我终于完成了本设计论文和实物制作。从开始接到论文题目到系统实物的实现,每走一步对我来说都是新的尝试和挑战,这也是我在大学期间独立完成的最大的项目,在这段时间里,我学到了很多知识也有很多感受。这次完成论文的经历,使我深深地感受到了理论和实际结合的重要性。在整个过程中,我的动手能力和专业知识的运用能力得到了加强,同时,也从中学习到如何去思考和解决问题,以及如何灵活地改变方法去实现设计方案。通过此次毕业设计,巩固了我的专业知识,增强了我的产品开发意识,使我在大学期间得到了一次很好的锻炼机会。44n本设计也可进一步改进,提高系统的功能,例如:(1)加热控制功能。冬天可以使用,定时加热、温控加热等。(2)温控上水。水箱水温超过设定温度而水箱未满时,自动进行上水,直到水温降到设定水温或水箱水满时停止上水。44n[参考文献][1]沙占友,王彦朋,孟志永等.单片机外围电路设计[M].北京:电子工业出版社,2003.[2]胡乾斌,李光斌,李玲等.单片机微型计算机原理与应用[M].武汉:华中科技大学出版社,2005.[3]康华光主编.电子技术基础模拟部分[M].第四版.北京:高等教育出版社,1999.[4]曹汉芳主编.数字电路与逻辑设计[M].第四版.武汉:华中科技大学出版社,2004.[5]谢自美主编.电子线路设计·实验·测试[M].第二版.武汉:华中科技大学出版社,2000.[6]李刚。林凌,姜苇等.51系列单片机系统设计与应用技巧[M].北京:北京航空航天大学出版社,2004.[7]朱定华,刘玉.单片机原理及应用技术学习辅导[M].北京:电子工业出版社,2001.[8]梅丽凤,王艳秋等.单片机原理及接口技术[M].北京:清华大学出版社,2004.[9]陈明荧.8051单片机课程设计实例教材[M].北京:清华大学出版社,2007.[10]范逸之.VisualBasic与RS232串行通讯控制[M].北京:中国青年出版社,2007.[11]蔡美琴等.MCS-51系列单片机系统及其应用[M].北京:高等教育出版社,1992.[12]先锋工作室.单片机程序设计实例[M].北京:清华大学出版社,2003.[13]PhilFeldman&RogerJennings著,江峡译.即学即用VisualBasic[M].北京:电子工业出版社,1996.[14]李小鹏.基于单片机的风扇自动控制系统:[D].孝感学院:叶建勇,2006.[15]陈亮.数字式恒温系统设计:[D].孝感学院:叶建勇,2006.[16]陈柄和.C语言与C++语言程序设计[M].北京:北京航空航天大学出版社,2004.[17]DAndresciani,FCurti,Fatera,etal.Measurementofthegroup-delaydifferencebetweentheprincipalststesofpolarizationonalow-birefingenceterrestrialfibercable[J].OpticsLetters,1987,12.P884-846.[18]JungJH,ShineSY,LeeCH.Effectsofpre-chirpingontherepeaterlessdispersionmanagedtransmissionsystem[J].ElectronLett,1996,32(9);831~83.44n附录附录1源程序清单#include#include#include#defineucharunsignedchar/*************12864LCD引脚定义*************/#defineLCD_dataP0//数据口sbitLCD_RS=P2^0;//寄存器选择输入sbitLCD_RW=P2^1;//液晶读/写控制sbitLCD_EN=P2^2;//液晶使能控制sbitLCD_PSB=P2^3;//串/并方式控制sbitLCD_RST=P2^5;//液晶复位端口sbitP33=P3^3;//////////sbitST=P3^0;sbitOE=P3^1;sbitEOC=P3^2;sbitLED=P3^7;sbitbutton1=P3^4;sbitbutton2=P3^5;sbitbutton3=P3^6;sbitBEEP=P2^7;#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};sbitDQ=P2^6;//定义通信端口3426/*********************************************************/ucharDIS1[]={"30L "};ucharDIS2[]={"18.2 "};ucharDIS3[]={"Load.. "};ucharDIS4[]={"Water "};ucharDIS5[]={"Full! "};ucharDIS6[]={""};uchartemp[3];ucharjs,getdata,bai,ge,shi,waterlevel;/*******************************************************************/staticunsignedcharHT,LT;//定义用于存放温度值的高位voiddelay2(unsignedinti){while(i--);}44n/*******************************************************************//**//*延时函数*//**//*******************************************************************/voiddelay(intms){while(ms--){uchari;for(i=0;i<250;i++){_nop_();_nop_();_nop_();_nop_();}}}/*******************************************************************//**//*延时函数*//**//*******************************************************************/voiddelay1(intms){while(ms--){uchary;for(y=0;y<100;y++);}}//DB18B20初始化函数Init_DS18B20(void){unsignedcharx=0;DQ=1;//DQ复位delay2(8);//稍做延时DQ=0;//单片机将DQ拉低delay2(80);//精确延时大于480usDQ=1;//拉高总线delay2(14);x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败44ndelay2(20);}//读一个字节ReadOneChar(void){unsignedchari=0;unsignedchardat=0;for(i=8;i>0;i--){DQ=0;//给脉冲信号dat>>=1;//逐位右移DQ=1;//给脉冲信号if(DQ)//DQ为1时,表示收到高电平1dat|=0x80;//把收到的高电平置给DAT的最高位delay2(4);}return(dat);}//写一个字节WriteOneChar(unsignedchardat){unsignedchari=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;//把要发送的高电平或者低电平给DQ发送出去delay2(5);DQ=1;dat>>=1;//逐位右移}delay2(4);}//读取温度voidReadTemperature(){unsignedchara=0;unsignedcharb=0;Init_DS18B20();//调用初始化函数WriteOneChar(0xCC);//跳过读序号列号的操作//不需要验证序列号。WriteOneChar(0x44);//发送温度转换命令启动温度转换Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0xBE);44na=ReadOneChar();//读取温度值低位b=ReadOneChar();//读取温度值高位LT=a&0x0f;HT=b<<4;HT+=(a&0xF0)>>4;}/*******************************************************************//**//*检查LCD忙状态*//*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。*//**//*******************************************************************/bitlcd_busy(){bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;delayNOP();result=(bit)(P0&0x80);/////////////LCD_EN=0;return(result);}/*******************************************************************//**//*写指令数据到LCD*//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。*//**//*******************************************************************/voidlcd_wcmd(ucharcmd){while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P0=cmd;//////////////delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/*******************************************************************/44n/**//*写显示数据到LCD*//*RS=H,RW=L,E=高脉冲,D0-D7=数据。*//**//*******************************************************************/voidlcd_wdat(uchardat){while(lcd_busy());LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;/////////////delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/*******************************************************************//**//*LCD初始化设定*//**//*******************************************************************/voidlcd_init(){LCD_PSB=1;//并口方式LCD_RST=0;//液晶复位delay(3);LCD_RST=1;delay(3);lcd_wcmd(0x34);//扩充指令操作delay(5);lcd_wcmd(0x30);//基本指令操作delay(5);lcd_wcmd(0x0C);//显示开,关光标delay(5);lcd_wcmd(0x01);//清除LCD的显示内容delay(5);}/***********************************************************函数名:ClearPic*功能:清除图像*说明:*输入:*返回:无44n**********************************************************/voidClearPic(void){ucharw,h;lcd_wcmd(0x34);//扩充指令集lcd_wcmd(0x36);//绘图显示开for(h=0;h<32;h++)//先画上半屏32行点阵{lcd_wcmd(0x80+h);//Y地址寄存器lcd_wcmd(0x80);//X地址(LCM自动加1)for(w=0;w<16;w++)//{lcd_wdat(0x00);//写入一个字节图形数据,k++指向下一个图形字节}}for(h=0;h<32;h++)//画下半屏余下的点阵{lcd_wcmd(0x80+h);//Y地址寄存器lcd_wcmd(0x88);//X地址(LCM自动加1)for(w=0;w<16;w++)//{lcd_wdat(0x00);//写入一个字节图形数据,k++指向下一个图形字节}}lcd_wcmd(0x30);//基本指令集}ucharcodePhoto1[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x0F,0xC0,0xC8,0x00,0x0F,0xC0,0xC8,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0xE8,0x00,0x0F,0xC0,0xC8,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0xE8,0x00,0x0F,0xC0,0xC8,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0xE8,0x00,0x0F,0xC0,0xC8,0x00,0x0F,0xC0,0xC8,0x00,0x00,0x00,0xC8,0x00,0x00,0x00,0x88,0x00,0x0F,0xC3,0x06,0x00,0x00,0x02,0x02,0x00,0x00,0x0C,0x01,0x80,0x00,0x0C,0x01,0x80,0x00,0x0C,0x01,0x80,0x00,0x0C,0x01,0x80,0x00,0x04,0x01,0x80,0x00,0x03,0xFE,0x00,0x00,0x01,0xFC,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};44ncharcodePhoto2[]={0x1C,0x00,0x00,0x60,0x1C,0x00,0x00,0x60,0x1C,0x00,0x00,0x60,0x0F,0x32,0x22,0xE0,0x0F,0xFF,0xFE,0xE0,0x0E,0x00,0x00,0xE0,0x0E,0x00,0x0C,0xC0,0x06,0x00,0x01,0xC0,0x06,0x01,0xC1,0xC0,0x06,0x00,0x01,0xC0,0x03,0x60,0x03,0x80,0x03,0x00,0x03,0x80,0x03,0x00,0x03,0x80,0x03,0x87,0x03,0x80,0x03,0x80,0x03,0x00,0x03,0x80,0x03,0x00,0x03,0x80,0x33,0x00,0x01,0xD8,0x06,0x00,0x01,0xC0,0x06,0x00,0x01,0xC0,0xC6,0x00,0x01,0xE0,0x06,0x00,0x00,0xE0,0x0E,0x00,0x00,0xE0,0x0E,0x00,0x00,0xFF,0xFE,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/************************************************************图形显示************************************************************/voidphotodisplay1(uchar*DisplayPic1){uchari;unsignedcharCurrentCol=0X80;//X坐标,后写XunsignedcharCurrentRow=0X80;//Y坐标,先写YunsignedcharCurrentCol2=0X90;//X坐标,后写XunsignedcharCurrentRow2=0X90;//Y坐标,先写Ylcd_wcmd(0x34);//写数据时,关闭图形显示for(i=0;i<16;i++){lcd_wcmd(CurrentRow+i);lcd_wcmd(CurrentCol+0);lcd_wdat(DisplayPic1[4*i]);lcd_wdat(DisplayPic1[4*i+1]);}for(i=0;i<16;i++){lcd_wcmd(CurrentRow+i);lcd_wcmd(CurrentCol+1);lcd_wdat(DisplayPic1[4*i+2]);44nlcd_wdat(DisplayPic1[4*i+3]);}for(i=0;i<16;i++){lcd_wcmd(CurrentRow2+i);lcd_wcmd(CurrentCol2+0);lcd_wdat(DisplayPic1[64+4*i]);lcd_wdat(DisplayPic1[64+4*i+1]);}for(i=0;i<16;i++){lcd_wcmd(CurrentRow2+i);lcd_wcmd(CurrentCol2+1);lcd_wdat(DisplayPic1[64+4*i+2]);lcd_wdat(DisplayPic1[64+4*i+3]);}lcd_wcmd(0x36);//写完数据,开图形显示*/}voidphotodisplay2(uchar*DisplayPic1){uchari;unsignedcharCurrentCol=0X88;//X坐标,后写XunsignedcharCurrentRow=0X88;//Y坐标,先写YunsignedcharCurrentCol2=0X98;//X坐标,后写XunsignedcharCurrentRow2=0X98;//Y坐标,先写Ylcd_wcmd(0x34);//写数据时,关闭图形显示for(i=0;i<16;i++){lcd_wcmd(CurrentRow+i);lcd_wcmd(CurrentCol);lcd_wdat(DisplayPic1[4*i]);lcd_wdat(DisplayPic1[4*i+1]);}for(i=0;i<16;i++){lcd_wcmd(CurrentRow+i);lcd_wcmd(CurrentCol+1);lcd_wdat(DisplayPic1[4*i+2]);lcd_wdat(DisplayPic1[4*i+3]);}for(i=0;i<16;i++){lcd_wcmd(CurrentRow2+i);lcd_wcmd(CurrentCol2);44nlcd_wdat(DisplayPic1[64+4*i]);lcd_wdat(DisplayPic1[64+4*i+1]);}for(i=0;i<16;i++){lcd_wcmd(CurrentRow2+i);lcd_wcmd(CurrentCol2+1);lcd_wdat(DisplayPic1[64+4*i+2]);lcd_wdat(DisplayPic1[64+4*i+3]);}lcd_wcmd(0x36);//写完数据,开图形显示*/}/************************************************************清屏函数************************************************************/voidclr_screen(){lcd_wcmd(0x34);//扩充指令操作delay(5);lcd_wcmd(0x30);//基本指令操作delay(5);lcd_wcmd(0x01);//清屏delay(5);}voiddisplay_tempmain(void)//主程序温度显示函数{uchari,key;if(LT==2)LT=1;if(LT==3)LT=2;if(LT==4|LT==5)LT=3;if(LT==6)LT=4;if(LT==7|LT==8)LT=5;if(LT==9|LT==10)LT=6;if(LT==11|LT==12)LT=7;if(LT==13)LT=8;if(LT==14|LT==15)LT=9;temp[0]=HT/10;temp[1]=HT%10;temp[2]=LT;for(i=0;i<=2;i++){switch(temp[i])//检测按键值,并译码44n{case0:key='0';break;case1:key='1';break;case2:key='2';break;case3:key='3';break;case4:key='4';break;case5:key='5';break;case6:key='6';break;case7:key='7';break;case8:key='8';break;case9:key='9';break;default:key='0';break;//NONE}if(i==0)DIS2[0]=key;if(i==1)DIS2[1]=key;if(i==2)DIS2[3]=key;}}/************************************************************AD转换函数************************************************************/voidadtransfer(void){uchari,key;ST=1;ST=0;while(EOC==0);OE=1;getdata=P1;OE=0;getdata=getdata/8;if(getdata>30)getdata=30;getdata=getdata/1;shi=getdata/10;ge=getdata%10;temp[0]=shi;temp[1]=ge;for(i=0;i<=2;i++){switch(temp[i])//检测按键值,并译码{case0:key='0';break;case1:key='1';break;case2:key='2';break;44ncase3:key='3';break;case4:key='4';break;case5:key='5';break;case6:key='6';break;case7:key='7';break;case8:key='8';break;case9:key='9';break;default:key='0';break;//NONE}if(i==0)DIS1[0]=key;if(i==1)DIS1[1]=key;}}/************************************************************字函数************************************************************/voiddisplay_z1(void){uchari;lcd_wcmd(0x30);//LOAD..lcd_wcmd(0x8d);for(i=0;i<16;i++){if(DIS3[i]!=' '){lcd_wdat(DIS3[i]);}elsebreak;}}voiddisplay_z2(void){uchari;lcd_wcmd(0x30);//WATERdownlcd_wcmd(0x9d);for(i=0;i<16;i++){if(DIS4[i]!=' '){lcd_wdat(DIS4[i]);}44nelsebreak;}}voiddisplay_z3(void){uchari;lcd_wcmd(0x30);//FULLlcd_wcmd(0x9d);for(i=0;i<16;i++){if(DIS5[i]!=' '){lcd_wdat(DIS5[i]);}elsebreak;}}voiddisplay_z4(void){uchari;lcd_wcmd(0x30);//WATERuplcd_wcmd(0x8d);for(i=0;i<16;i++){if(DIS4[i]!=' '){lcd_wdat(DIS4[i]);}elsebreak;}}voiddisplay_z51(void){uchari;lcd_wcmd(0x30);//clearuplcd_wcmd(0x8d);for(i=0;i<6;i++){lcd_wdat(DIS6[i]);}}44nvoiddisplay_z52(void){uchari;lcd_wcmd(0x30);//cleardownlcd_wcmd(0x9d);for(i=0;i<6;i++){lcd_wdat(DIS6[i]);}}/************************************************************键盘函数************************************************************/ucharkeyboard(void){uchari;i=4;button1=1;button2=1;button3=1;delay2(50);if(button1==0){waterlevel=10;i=1;}if(button2==0){waterlevel=20;i=2;}if(button3==0){waterlevel=30;i=3;}returni;}/************************************************************蜂鸣器函数***44n*********************************************************/voidbeep(void){unsignedchary;for(y=0;y<180;y++){BEEP=!BEEP;//BEEP取反delay2(40);}BEEP=0;//关闭蜂鸣器}/************************************************************主函数************************************************************/voidmain(void){uchari,mm,flag;lcd_init();ClearPic();photodisplay1(Photo1);photodisplay2(Photo2);delay(1000);TMOD=0x01;TH0=0xff;TL0=0xfe;IE=0x82;TR0=1;P33=0;EOC=1;OE=0;ST=0;bai=0;ge=0;shi=0;LED=1;waterlevel=10;BEEP=0;flag=0;while(1)//主循环{ReadTemperature();//读取温度值display_tempmain();//对读到的温度值进行处理44nadtransfer();lcd_wcmd(0x30);lcd_wcmd(0x92);for(i=0;i<16;i++){if(DIS2[i]!=' '){lcd_wdat(DIS2[i]);}elsebreak;}lcd_wcmd(0x30);lcd_wcmd(0x9a);for(i=0;i<16;i++){if(DIS1[i]!=' '){lcd_wdat(DIS1[i]);}elsebreak;}lcd_wcmd(0x30);//温度符号lcd_wcmd(0x94);lcd_wdat(0xa1);lcd_wdat(0xe6);mm=keyboard();if(mm!=4)flag=1;if(getdata=waterlevel&&flag==1)flag=0;if(getdata<5){beep();waterlevel=30;flag=1;}}}voidtimer0()interrupt1{TH0=(65536-200)/256;TL0=(65536-200)%256;P33=~P33;}附录2系统整体实物图44n44