• 5.80 MB
  • 2022-04-22 13:40:03 发布

水位监控系统的设计说明书.doc

  • 94页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'水位监控系统的设计说明书摘要作为水资源大国,合理利用水资源成为现在面临的一个严峻问题。因此,应用新技术,实时监控水库水位,有利于更好地对水资源进行调度和管理。经过近几十年的发展,水位监控系统由原来的人工目视手动监控发展到如今的基于单片机自动控制,这对于水位监控不仅是从技术上解决人工监控的误差,更有利于对水资源的合理利用和节约用水。单片机技术越来越成熟,现如今单片机更是向着高度集成、低功耗、低价格、处理速度高等方向发展,因而越来越多的水位监控系统采用单片机来控制,这种系统具有成本低、可靠性高、易于操作、维护简单方便等特点,一般大量应用于大型的水库以及工业生产。水位监系统的设计理念是适合大众使用,体积相对小,功能齐全,操作简单,交互界面人性化,能实现不间断的水位监控,以及对所测水位信息进行实时显示、远距离传送和高低水位上下限的报警,同时对相应的水泵电机进行相应的控制,真正实现节约水资源。水位监控系统的设计方案,主要采用STC89C52单片机作为系统的核心控制部件,采用TLC1549采集水位信息并进行模数转换处理,利用LCD12232液晶显示水位信息,通过VB编写上位机监控程序,从而实现上位机与水位监控系统进行信息交换。水位监控系统的硬件系统包含电源、振荡、复位、下载、键盘、显示、时钟、串行通信、模数转换、模拟水位、报警、电机等模块,利用电子绘图软件进行原理图、PCB图的绘制,并完成了硬件系统实物的制作。软件系统包含监控等各个模块的模块化程序。通过硬、软件系统的联调、测试,该水位监控系统的功能和性能指标完全符合设计任务书的要求。据初步测算,系统成本远远低于市场所售其它同类产品,而且该系统具有应用范围广、操作简单、可靠性高等优点,具有一定的推广价值。关键词:水位监控;单片机;串行通信;VBI ABSTRACTOurcountryisarichcountryofwaterresources,rationaluseofwaterresourceshasbecomeaseriousproblemourcountryhastoface.Therefore,applyingnewtechnologiestomonitorreservoir’slevelsinreal-timeisconducivetobetterschedulingandthemanagementofwaterresources.Afterdecadesofdevelopments,thewater’slevelmonitoringsystemhasdevelopedfromtheoriginalartificialmanualmonitoringineyestothetoday"sautomaticcontrolbasedonmicrocontroller,whichisnotonlysolvetheerrorsofmanualmonitoringintechnicalforwaterlevelmonitoring,butalsomoreconducivetotherationaluseofwaterandtheconservationofwater.SCMtechnologybecomesmoremature.Andnowitisdevelopingtothedirectionofhighintegratedsingle-chip,low-power,low-cost,highprocessingspeed.Thusmoreandmorewaterlevel’smonitoringsystemsareusingthemicrocontrollertocontrol.Thissystemislowcost,highreliability,easyoperation,easymaintenance,etc..Soitisgenerallyusedinlargereservoirsandindustrialproduction.Thedesignofwaterlevel’smonitoringsystemissuitableforpublicuse.Thevolumeisrelativelysmall,andit’sfull-featured,easytooperate,user-friendlyinterface.Itcanachievecontinuouswaterlevel’smonitoring,aswellasreal-timedisplayofthemeasuredwaterlevelinformation,long-distancetransmissionandthealarmofthelowerandthehigherlevel,whilecontrolthecorrespondingpumpmotor,inordertosavewaterresourcesinreal.ThedesignofthewaterlevelmonitoringsystemmainlyuseSTC89C52microcontrollerasthecoreofthesystemcontrolunit,anduseTLC1549togatherlevel’sinformationandanalogtodigitalconversionprocess,useLCD12232LCDdisplaywaterlevelinformation.AccordingtoVBforcompilingmonitoringprogram,itcanachievetheinformationexchangebetweenPCandwaterlevel’smonitoringsystem.Thehardwaresystemofthewaterlevel’smonitoringsystemincludesapowersupply,oscillation,reset,download,keyboard,display,clock,serialcommunication,analogtodigitalconversion,analog’slevel,alarms,motorsandothermodules.Usingtheelectronicdrawingsoftwarecandrawtheschematics,PCBmap,andcompletetheII physicalhardwareproduction.Modularsoftwaresystemcontainsvariousmodulesmonitoring.Throughthealignmentandtestingofhardwareandsoftwaresystems,thefunctionandperformanceofthewaterlevel’smonitoringsystemisfullyconsistentwiththerequirementsofthedesignspecification.Accordingtopreliminaryestimates,thesystem’scostsisfarlessthantoothersimilarproductsinthemarketforsale.Andthesystemhaswiderangeofapplications,simpleoperation,highreliability.Ithassomepromotionalvalue.Keywordswaterlevelmonitoring;mcu;serialcommunication;vbIII VI 1绪论1.1课题的背景及意义在工、农业生产中,大型的水库、水箱是工业和农业生产中重要的蓄水工具,对水位进行有效的实时监控、可靠控制直接关系到工厂生产的效率以及农业生产的质量,同时也影响其生产的安全[1]。在以前,对水库和水箱的控制一般是基于人工进行控制的,由于人工操作存在不及时、不准确,容易造成很大测量误差,在这种情况下带来的危机,轻则影响产品的质量,重则影响人员和设备的安全。所以对于水库、水箱的控制,如果能够使用一种能自动且不间断的测量工具,能够实时反应水位信息,能根据当前水位信息自动与预设的水位进行对比分析,从而自动向运行人员提供水位超上限和超下限的声光报警,并自动控制相应的闸门或阀门电机进行蓄水和放水。这不仅提高了水位监控的安全性,实时性,更大程度提高了可靠性。从节约水资源方面考虑,相对于传统的水位监控,由于存在自动化水平不高,集成电路应用程度不高,水位数据一般都是人工目视采集,因而产生的误差容易造成水资源的浪费。这其中的原因很大程度上是因为传统的水位监控系统没有具备对水位测量传输的实时性,导致实时水位信息没有及时反馈到控制室,不能及时告知运行值班人员,以致对闸门或阀门的电机控制有一定的误差,或延迟。从而造成水位超过最大上限时没能打开相应闸门或阀门及时放水或者当水位低于最低下限时没能及时的关闭相应的闸门或阀门进行相应的蓄水。所以对水库或水箱水位的监控引入具有操作简单、维护方便、实时反应水位信息、水位信息远距离传送、实时水位报警、并根据实时水位情况准确控制相应电机的自动化水位监控系统,已必不可少。这对于节约水资源和合理利用水资源有着不可代替的意义[2]。随着社会的发展,科学知识不断的研究和探讨,自动化理论的完善,集成电路的迅速发展。如今水位监控出现了以单片机、PLC为核心的可靠性比较高的水位监控系统,技术上实现了自动化、智能化、远距离遥控、遥测以及无人值班的突破。通过他们可以将全国乃至全世界的水资源进行资源共享和分析,这对于水资源的保护和合理利用有着重要的意义。从单片机诞生开始,单片机作为微机控制的核心,具有高速度、低功耗、编程方便、低价格等特点,一直大规模的应用于智能控制、远程控制、自动化程度比较高的场合,随着16位、32位甚至更高处理位数的单片机的出现,使单片机的应用场合越来越广。4 毕业设计的意义在于培养学生学习、思考、动手的能力,让学生在整个过程中通过查询相关资料学习水位监控系统的有关理论知识,熟悉理论的同时要明白水位监控系统的工作原理,从而展开主要功能的实现。通过老师的指导,查询相关资料确定水位监控系统各个硬件模块的构建制作,以及完善软件系统和硬件系统。学生通过查询资料、设计方案、制作调试的过程,真正做到了理论实践相结合,这不仅对学生的学习能力、动手能力得到了相应的提高、更激发了学生自主学习、实践的兴趣。1.2设计的主要工作水位监控系统设计的主要任务是:水位监控系统中硬件设计配合软件设计,即把水位监控系统所需要的各个硬件模块的设计配合软件设计,把硬件模块和软件模块进行联调,得出结果。水位监控系统设计采用的是基于51单片机为核心,由独立电源供电模块、下载模块、液晶显示模块(采用LCD1232液晶显示器)、键盘接口模块(采用4个独立式按键键盘)、MAX232通信、DS1302时钟芯片、TLC1549模数转换、DAC8512数模转换、声光报警、直流电机控制等模块组成[3]。把所需模块通过电路连接在一起,设计其原理图、PCB图、并制作实物电路板,并利用VB编写上位机监控程序。利用KEIL单片机程序开发软件编写水位监控系统相对应的C语言程序,并把它编译成单片机能识别的程序下载到硬件系统中进行调试,记下运行的结果[4]。4 2设计思想与方案2.1设计思想为了实现水位监控系统的大众化,让节约水资源从监控、合理利用出发,根据所学的知识和自身能力对水位监控系统的进行设计。具有以下四点要求:(1)水位监控系统操作简单,能耗低,通过模拟的水位进行直观的显示。通过电位器模拟水位,其测量水位范围为0-102.3米。(2)具有上位机通信能力,能通过电脑对系统的水位上下限制进行设置,并把水位信息传送至电脑。(3)具有系统软件更新升级的能力。(4)具有超高水位超低水位报警的功能。可以用电机正反转模拟闸门或阀门升降。2.2设计方案随着科技的发展,水位监控系统技术也有了飞速的发展,出现了以基于单片机控制水位监控系统和基于PLC控制的水位监控系统,两者都可实时直观的显示水位状态,具有可靠性高、人机交互界面、远程通信监控等优点,在运行中可以很方便的修改水位的上下限,因而逐步取代传统的水位监控系统,成为当代最主要的水位监控系统[5]。所以有以下两种设计方案:方案一:利用PLC对水位进行监控。PLC水位监控系统具有可靠的运行性能、不受外界波动、能耗低等特点。其方案包含电源、报警、模数转换、测量、输出、输入、按键、电机等模块,方案框图如图1所示。图1方案一系统框图4 方案二:基于单片机的水位监控系统。硬件系统核心采用的是STC89C52单片机,系统包含电源、振荡、复位、下载、键盘(采用4位一体的独立式按键)、显示(用LCD12232液晶作为显示媒介)、时钟(DS1302产生时钟信号)、串行通信、模数转换(TLC1549模数转换芯片)、模拟水位、报警(蜂鸣器加LED灯光)、数模转换(DAC8512)、直流电机等模块[6]。以及相对应的各个模块的软件系统,并且利用VB编写上该系统的上位机程序对水位信息进行监控和控制。系统框图如图2所示。图2方案二系统框图结合上面两种方案,比较PLC控制和单片机控制。PLC控制具有价格昂贵、操作复杂、维护不方便且不同品种的PLC不能通用等,一般适用于大型监控系统。单片机控制具有体积小,高度集成,编程方便,功耗低,使用简单,价格低等特点,被大量应用于大型的水库以及工农业生产中。通过分析对比,决定采用方案二对水位监控系统进行设计。4 3硬件系统的设计3.1主要元器件介绍3.1.1STC89C52单片机水位监控系统的设计采用STC89C52单片机作为系统的核心。STC89C52单片机是STC公司生产制造的,采用PQFP封装,具有44个引脚,相比DIP封装多了四个NA引脚,具有丰富的资源,有一个8位的高性能并行处理器和一个布尔处理器,内部数据存储器(RAM)为512B字节,内部程序存储器大小达到8KB字节,并采用电可擦除写入的FlashROM方式,方便对程序的更新。具有4个可进行8位输入输出接口,一共32位,都属于准双向口。除此之外,STC89C52单片机在低功耗时还具有节电模式,也可对数据存储器(RAM)数据进行保存,保证了数据不易丢失。STC89C52RC单片机的引脚图如图3所示。图3STC89C52单片机引脚图3.1.2TLC1549模数转换芯片TLC1549模数转换芯片是美国德州仪器生产的一款高精度高速度的AD转换器。TLC1549抗干扰,抗噪声的能力强,对于转换的数字信号数据能准确反映模拟信号。根据不同引脚分布的功能,TLC1549还能通过三总线传输的方式和单片机进行串行数据交换[7]。90 其主要管脚功能如下:REF+:引脚的功能是为转换提供正参考电压的接入端,也就是进行模数转换所需的参考电压值接在此管脚,通常把电源VCC端接到此处。通过和REF-引脚相配合对输入的模拟电压最高值,最低值进行设定。当输入的模拟电压大于或等于正参考值时,数字信号输出即为所能转换的最大值。当输入的模拟电压小于或等于负参考值时,其数字信号输出就为0。ERF-:转换所需负参考电压的输入管脚。通常把地接至此管脚。ANALOGIN:为模拟信号的输入口,需要把要测的模拟信号接入该引脚。CS:为芯片的片选信号,一般为低电平有效。I/OCLOCK:TLC1549的输入输出所需的时钟接口。DATAOUT:转换后的数字信号输出接口。它的输出是基于CS的电平状态,当CS为高电平时是没有数字信号输出;当CS为低电平时输出的才是转换后的有效数字信号。VCC:为转换芯片提供正电源电压。GND:接地,一般不做特殊要求,全部的地都应接在此管脚。TLC1549芯片的管脚图如图4所示。图4TLC1549管脚图3.1.3DS1302时钟芯片产生时间的方法有很多,其中可以直接用单片机中的内部定时器计时。但应用单片机内部定时器来产生实时时钟,这无疑是对单片机资源的一种浪费,而且还将影响水位监控系统的其他主要功能,因而采用时钟芯片进行实时计时。DS1302芯片作为一款时钟芯片,是由DALLAS公司设计并生产的一种能够使用涓流对电池充电的一款新型时钟芯片,DS1302时钟芯片里面包含一个具有实时计时的时钟、日历和具有能存储31字节的静态数据存储器RAM,通过集成技术把它们集成在芯片内部[8]。DS90 1302具有显示实时时间信息和对实时时间进行处理的功能。比如要把24/12小时制的实时时钟进行调整,以及对其年、月、日、星期等数据的调整,只需将单片机通过串行接口的通信方式与DS1302芯片相连接,就可以把以上信息进行实时计时,并能自动的对时钟、天数、年、月、日进行调整[9]。芯片还具有宽电压的设计,使用电压范围为2-5.5V,从而使用范围更广。DS1302芯片的管脚的主要功能描述:Vcc1:DS1302芯片的主电源接入,为芯片的正常工作提供电源。Vcc2:DS1302接电池的管脚。芯片根据对两个电源的管脚电压值进行比较,确定从哪个管脚获取能量。I/O:作为DS1302的双向数据输入输出管脚。为DS1302芯片提供输入信息,作为输出口把DS1302芯片的信息通过此管脚输入给单片机。X1、X2:DS1302芯片晶振的输入管脚,为DS1302芯片提供振荡信号。其一般选用32.168KHZ晶振。GND:芯片的接地管脚。其管脚排列如图5所示。图5DS1302时钟芯片管脚图3.1.4LCD12232液晶显示屏液晶显示屏能够很直观的把系统处理好的信息通过文字或图像显现出来,是实现人机交互不可缺少的硬件之一。液晶屏在两块玻璃中加入液晶等材料,通过两个电极产生电场,使液晶分子在电场的效应下产生不规则的运动。通过对不同光源进行实效控制,产生明暗的图像显示。所以控制两级之间的电压就能把所需要的信息显现出来[10]。水位监控系统的设计采用的是LCD12232液晶屏作为信息显示。通过显示屏可以对水位监控系统进行功能、时间、密码的设置以及明确得知实时水位信息、地址信息、电机正反转状态等信息。在水位监控系统的设计中为了节省单片机的I/O口资源,采用单片机串行口的方式对所选择的液晶进行操作。对于选择的液晶串行方式主要管脚的描述如下:VDD:液晶屏所需电源引入的管脚,管脚号为1号。CLK:液晶屏串口所需同步触发时钟的输入管脚。90 SID:液晶串行所需的数据输入管脚。CS:作为液晶显示器的片选端口,只对高电平有效。选择的液晶显示器实物如图6所示。图6LCD12232液晶显示屏3.1.5直流电机驱动模块水位监控系统采用直流电机作为模拟的水库闸门、水箱阀门。通过对其进行正反转的控制模拟闸门或阀门的打开和关闭。低压直流电机作为一种执行机构,采用L298电机驱动模块控制,利用数模转换得到的模拟信号,使得驱动直流电机的转子进行旋转[11]。通过给定不同的模拟量数据使直流电机进行正转、反转、停止转动三个状态来模拟闸门升降。对于直流所加入的电压一般为5V。其实物图如图7所示。图7直流电机驱动实物图3.1.6蜂鸣器蜂鸣器作为水位监控系统设计报警发声部件,通过发出嘀嘀的声音告知运行值班人员水位是否超出设定的水位值。90 蜂鸣器按形式可以分为电磁蜂鸣器和电压式蜂鸣器,通常在蜂鸣器的两端加入一定的电流通过电磁感应产生震动就可以使蜂鸣器发出声音。蜂鸣器的组成一般由振膜、电磁感应线圈组成,其结构简单,使用方便,适用于各种声音报警场合。但要注意蜂鸣器的正极不能接反。蜂鸣器的外观图如图8所示。图8蜂鸣器外观图3.1.7MAX232芯片MAX232芯片是能够和通用RS232通信标准兼容的一块集成片。MAX232芯片是一块能把单片机的TTL电平通过转换变为电脑串口能识别的RS232电平。在水位监控系统中是把单片机所测的水位以及其他数据产生的串行输出TTL电平信号转换为电脑能识别的RS232电平信号,实现与电脑通信的能力,从而使电脑具备上位机的功能,水位监控系统具备下位机的功能[12]。MAX232芯片的管脚如图9所示。图9MAX232的管脚图3.1.8DAC8512数模转换芯片采用DAC8512芯片作为水位监控系统的数模转换芯片,DAC8512作为一款具有12位高速转换能力的D/A芯片,采用三总线控制方式,只需要5V单电源,内部有输出的缓冲放大器[13]。对于芯片所需的基准电压为内置的2.5V,具有分辨率为每位1mv。DAC8512可以通过片选管脚进行多个连接,在水位监控系统中主要是把单片机处理后的水位数字信号转换成模拟信号,从而控制直流电机。其主要管脚功能如下:VDD:为DA转换芯片提供+5V电源,把电源接于此管脚。CLK:触发脉冲输入管脚。90 CS:为芯片选择信号,一般低电平对其有效。SDI:数字信号的输入管脚。Vout:为模拟电压的输出管脚,通常在1mv-4.095V之间。GND:接地,一般不做特殊要求,全部接地都应接在此管脚。CLR:清空模拟数据的管脚,一般低电平有效。DAC8512数模转换芯片的管脚图如图10所示。图10DAC8512数模转换芯片管脚图3.1.9WT588D语音模块采用WT588D语音芯片作为水位监控系统的语音报警模块,采用8欧姆的扬声器作为声音输出元件。其主要作用是在系统通电的时候通过语音提醒输入密码,当输入秘密正确时发出语音提醒系统已经起动,当水位发生变化时,提示超水位上限,超水位下限,通过发出相应的报警声音告知运行人员,使系统具有人性化。采用了三线串口的控制方式对WT588D语音芯片进行控制。WT588D语音模块的实物图如图11所示。图11WT588D语音模块实物图90 3.2硬件单元电路的设计3.2.1STC89C52单片机最小系统一块单片机只有把它接入相应的电源,相应的晶体振荡电路,再加入相应的复位电路然后下载相应的程序,通过这样组合的单片机才能正常的按照所写的程序要求来执行操作。因而对于水位监控系统的设计,首先要对单片机的最小系统要进行设计规划。(1)电源电路部分:水位监控系统的各个功能实现首先必须要对其引入稳定的供电电压+5V,能让各个模块具有驱动能力。为了能更方便获取所需的电源电压,采用专用的电源变压器将市电降压成所需要的12V交流电压,通过滤波、整流、稳压、滤波给系统提供稳定的直流电压+5V,详见设计图纸电源电路原理图。通过下载口对系统供电的电路如图12所示。图12下载口电源电路(2)单片机只有满足相应的时钟信号才能进行工作,时钟信号由时钟电路产生,通过在STC89C52的XT1、XT2引脚上接入11.0592MHz的石英晶振外加两个电容器(电容器根据经验一般取30PF)组成的电路为单片机提供时钟信号。采用11.0592MHz的晶振更能实现对计算机进行通信的波特率,使用11.0592MHz的晶体晶振为系统单片机提供必要的时钟信号[14]。时钟电路如图13所示。图13振荡电路(3)单片机的复位有上电复位和对其进行按键复位,当出现死机和运行错误的时候一般采用按键方式对单片机进行复位操作。因为硬件系统中采用的是90 STC单片机,需要在复位管脚RST上产生两个周期的高电平才能使单片机复位。单片机复位信号的产生采用了按键方式的电路设计。按复位键通过电容(一般采用104)对单片机产生复位信号。系统复位如图14所示。图14单片机复位电路3.2.2下载电路水位监控系统设计了两套下载电路,一套可以直接通过RS232串行通信口更改系统所必要的程序。另一套是通过一个接口把单片机的P3.0/RXD引脚和P3.1/TXD引脚以及电源接地引脚与接口模块相连接,通过专用的STC下载连接线就可以对单片机进行下载操作,能很方便的对水位监控系统进行程序升级功能。水位监控系统更新程序需要的下载电路如图15所示。图15下载电路3.2.3键盘模块电路键盘作为水位监控系统的输入设备,能对系统的功能进行操作和设置,只需要4个独立式键盘就可以满足水位监控系统各个功能的操作需求。键盘电路为共阴极设计,即有按键按下的时候,单片机通过扫描发现相应的端口有低电平即为按键的按下,通过消抖,做出相应的执行动作。由于独立式键盘的每个按键连接着单片机的不同端口,所以各个按键相互独立,不干扰,四个按键分别为左键(P10)、上键(P13)、下键(P12)、右键(P90 11)。水位监控系统独立键盘电路如图16所示。图16独立式键盘电路3.2.4蜂鸣器报警电路蜂鸣器作为水位超最高水位上限和超低水位下限的声音报警器件,它发出的声音能让运行人员知道当前水位监控系统的状态。在水位监控系统中蜂鸣器的电路采用单片机的I/O口再加一个三极管(三极管根据经验一般采用PNP型)的方式来使蜂鸣器发出报警。其中单片机的I/O选用P33引脚作为驱动蜂鸣器的端口,即当单片机的P33引脚输出高电平的时候蜂鸣器就相应的发出蜂鸣报警,反之停止发声报警[15]。其蜂鸣器连接方式如图17所示。图17蜂鸣器报警电路3.2.5液晶显示模块电路液晶屏作为输出器件,在水位监控系统的设计中采用了LCD12232液晶作为人机交互媒介,通过它可以很直观的得知当前水位信息,实时时间信息,以及电机是否进行旋转等信息。为了充分利用单片机的端口资源,采用串行口的方式对液晶进行控制,进行电路设计,对液晶的串行控制的各个管脚做了相应定义[16]90 。并采用三极管加电阻对其必要进行驱动,液晶屏的片选管脚与单片机的P2.2端口相接,串行数据口SID接入单片机的P2.3口,液晶屏所需要的脉冲CLK接入单片机的P2.4口。单片机首先通过片选管脚选中液晶显示器,再给相应的脉冲信号,根据脉冲信号,把命令和数据发送给液晶相应的寄存器,从而通过这些引脚实现液晶屏的相应显示数据的功能。液晶电路如图18所示。图18LCD12232液晶显示电路3.2.6DS1302时钟电路DS1302作为一款时钟芯片,主要是为水位监控系统提供时间的参考。对其进行电路设计,DS1302芯片需要在其X1、X2管脚上接入一个32.768KHz的石英晶振用来作为芯片的时钟振荡信号。单片机首先通过片选管脚选中时钟芯片,再给相应的脉冲信号,根据脉冲信号,命令和数据发送给液晶相应的寄存器或把时间数据读出给单片机。为了控制需要对其端口进行接线的分配,该芯片的I/O数据口的管脚与单片机的P3.5引脚相连接,CLK触发脉冲口的管脚连接着单片机的I/O口P3.6,RST复位端口管脚连接着单片机的输入输出口P3.4,通过对电路的整合。DS1302在水位监控系统中的接线如图19所示。图19DS1302时钟电路3.2.7数模转换模块电路90 由于要驱动直流电机用来模拟水库闸门、水箱的阀门,所以需要模拟信号的输出,使用DAC8512数模转换芯片来进行转换,实现直流电机的正反转,对其进行电路设计[17]。让DAC8512的LD管脚与单片机的P3.7相连接、SDI数字信号输入管脚与单片机的P3.7相连接、LD串行信号管脚与单片机的P3.7相连接,对其电路进行整合。因而数模转换接线图的形式如图20所示。图20数模转换的电路3.2.8模拟水位及模数转换模块电路模数转换对于水位监控系统的水位数据信息采集至关重要。水位监控系统中模数转换电路采用了一个电位器来模拟实际水位的电路设计,给定一个2.5V的稳压二极管,通过电位器(采用10KΩ)产生0-2.5V的电压,来对应相应的0-102.3米水位数据,从中接入TLC1549数模转换芯片中进行转换。同时在电路设计中预留了传感器输入端口,只需要加入相应的跳线帽,便可以方便的进行转换,方便传感器进行实际的水位监控测量。根据所需程序大同小异的情况,基于成本和环境的考虑,采用电位器的方法模拟产生水位的方式进行后续程序的设计。通过一个稳压二级管为TLC1549芯片提供基准电压,TLC1549主要的管脚CS与单片机的P2.5引脚相连接、DOUT转换后的数字信号输出与单片机的P2.6引脚相连接、CLK与单片机的P2.7引脚相连接。从而实现模拟信号转换为数字信号[2]。其模数转换接线形式图如图21所示。3.2.9通信模块电路在水位监控设计中,需要与电脑(上位机)进行数据传输,以及接收上位机所发出的命令。还可以通过电脑对系统所需要的程序进行更新,单片机在收到命令后并对其进行相应的处理,执行相应命令的动作[18]。采用RS232串行通信口进行通信,其中主要的芯片为MAX232电平转换芯片,对其进行电路设计,把单片机的串行输出口P3.1,串行输入口P3.0分别与相应的MAX90 232芯片相连接,采用串行线的方式与电脑相连接。通信模块的接线图如图22所示。图21模数转换电路图22通信模块电路3.2.10语音报警模块电路90 对于水位监控系统的起动、水位超高上限、超低下限都有相应的语音进行通报。语音报警电路主要采用WT588D语音芯片,采用三线串口的方式进行控制,当通过片选信号选定后,通过单片机给定一定的脉冲信号,再根据脉冲信号发送命令和要读出语音的地址信号给语音芯片。因此语音芯片的DATA数据口接入单片机的P1.6、CLK触发脉冲接入单片机的P1.5、CS使能端接入单片机的P1.4,因而其语音报警的接线形式图如图23所示。图23语音报警电路3.2.11LED电路对于水位超高上限、超低下限,在报警开关打开的时候,将有相应的一个LED灯点亮作为灯光报警。把LED阴极连接在一起在,作为LED电路接线方式,LED另一端分别接入单片机P1管脚,只要P1口有高电平时点亮。采用P1.7作为灯光报警的反映端口。因而光报警的连电路接的形式如图24所示。图24LED电路3.2.12拨动开关电路设计中,利用拨动开关接P0口,因为一端与地相连,可以通过调节开关产生高低电平,产生所需要的地址信息,因而拨动开关的连电路接的形式如图25所示。图25拨动开关电路90 4软件系统的设计4.1软件设计的描述对于水位监控系统设计的系统软件包含着系统监控、LCD1223液晶显示、按键扫描、TLC1549转换模块、数模转换、DS1302时钟模块、语音模块、报警、串口通信模块等模块化程序,以及其它必须要有的基本模块程序。4.2系统软件的程序设计程序设计抓住硬件系统的每一个模块进行分模块化设计,这样更加方便程序的检查和日后对系统功能的升级,将分模块对系统的程序进行介绍。4.2.1系统监控程序设计水位监控系统的系统监控程序又叫主函数程序,主要作用是在系统通电后对系统所有的模块产生初始化命令,并对串口通信进行初始化,密码输入正确后,读取水位信息、读取DS1302中的时钟信息,读取地址信息,同时进入水位信息、时间、地址显示的状态显示界面,等待按键扫描。流程图如图26所示。图26系统监控程序流程图4.2.2键盘模块程序设计90 水位监控系统采用了四位一体的独立式键盘,采用扫描的方式进行按键扫描。因此对于键盘模块的程序设计有按键扫描程序以及键盘服务程序组成。键盘模块相对应的程序操作如图27所示。图27键盘扫描程序流程图4.2.3液晶显示模块程序设计利用了LCD12232液晶显示屏作为各种数据的显示,对于LCD12232液晶显示屏,水位监控系统采用了串行方式对其进行控制,因此其程序的设计应包含对液晶的初始化操作和读写进行操作。液晶显示程序操作的方法如图28所示。图28液晶显示程序流程图4.2.4DS1302时钟程序设计时钟芯片是为系统提供时间信息,工作原理为首先向DS90 1302芯片中写入相应的初始时钟信息,通过外部的晶振使其自动进行计时工作,然后再通过单片机向时钟芯片发送命令,读取在DS1302寄存器中的时间数据,时钟芯片在收到命令后通过单片机对它的触发脉冲进行数据传出。水位监控系统中DS1302时钟程序的设计如图29所示。图29DS1302时钟程序流程图4.2.5报警模块程序设计报警模块采用蜂鸣器,和一个LED灯组成,可以通过设置分别关闭。报警模块程序动作步骤如图30所示。图30报警模块程序流程图4.2.6模数转换模块程序设计TLC90 1549是一个具有10位转换能力的模数转换芯片,在对它进行软件设计时,要对其进行初始化操作,写入控制命令,读取转换的数字信号信息等命令。模数转换模块操作步骤如图31所示。图31模数转换程序流程图4.2.7通信模块程序设计通信模块采用串口方式,对其进行程序设计包含对串口的初始化、发送数据、以及接收数据并进行处理。串口通信模块程序的操作步骤如图32所示。图32串口通信流程图90 4.2.8数模转换模块程序设计DAC8512是一个具有12位转换能力的数模转换芯片,在对其进行软件设计时,要对其进行初始化操作,写入控制命令,以及读取转换的数字信号信息等命令。数模转换模块的操作步骤方式如图33所示。图33数模转换程序流程图4.2.9语音模块程序设计水位监控系统采用了WT588D语音芯片,让它在特定的时候发出语音信息,从而使系统具有人性化。语音模块程序的操作步骤的方式如图34所示。图34语音模块程序流程图90 4.2.10VB上位机设计水位监控系统具有与电脑通信功能,通过VB里的串口工具编写水位监控系统上位机监控软件,软件可以对水位信息进行实时监控,可以对水位上下限值进行修改,以及打开或关闭报警操作[19]。具体界面如图35所示。图35VB上位机界面图4.2.11水位算法设计水位监控系统的水位算法是对水位进行采样16次,并对这16个数据进行统计,取其中出现最多的一个水位数据作为当前水位数据,这样对于水位信息读取准确性得到了保证[20]。90 5系统调试运行及结果分析5.1系统使用说明首先把各个硬件模块通过杜邦线连接在一起,组成水位监控系统,再为水位监控系统提供电源。通过串行通信接口或者使用专用的下载线,把编译好的程序下载到系统中去。通过按相应的按键、操作上位机软件和调节相应的电位器,观察各个模块反映的现象,从而得出结论。在系统上电后,首先显示的是水位监控系统等字样,同时语音做出相应的提示,系统在等待输入密码的状态下,键盘左键只作为确定键进行密码确定,右键是向右移位键,上、下功能键为密码数字加减键。只有当密码输入正确后,系统才进入状态显示界面。进入界面后,按键左键作为进入下个界面的按键,而右键为进入日期显示界面,和返回状态界面[21]。当按下左键即从状态显示屏进入到水位上、下限的设置,通过上、下按键选择,右键进入所选择的要设置的水位限值,在上、下限设置界面按下左键即进入到声光报警开关的设置,通过右键可以对其开关进行打开或关闭,从这个界面,再按下左键即进入系统时间的设置可以通过其他三个按键对时间、日期、星期、年月进行设置。在时间界面再按下左键进入密码修改显示屏,可以通过其他三键进行密码修改,如果没有进行密码修改,按下左键直接进入水位状态显示屏,否则就进入水位监控系统,密码输入显示。以此循环操作。5.2系统运行结果5.2.1密码输入下载编写好的水位监控系统软件至系统中,将水位监控系统利用专用电源通电并打开电源开关,通过观察,将出现的密码输入界面如图36所示。图36密码输入界面90 5.2.2水位信息状态显示系统显示的第一界面为欢迎界面,在此界面需要进行必要的密码输入,系统的初始密码为四个0,通过键盘右键和上下键,键入该四位密码。当密码输入完成后按键盘左键系统自动判断密码进入到状态显示界面,其中包含模拟的实时水位信息、时钟信息、地址、以及电机正反转运行状态标志等。状态显示的界面如图37所示。图37状态显示界面5.2.3当前日期显示在状态显示界面如果按下右键就直接进入日期显示界面,从而显示当日的年月日,日期显示界面的显示如图38所示。如果是按下左键即进入水位上、下限的设置界面,水位上下限设置界面的显示如图39所示。图38日期显示界面图39水位上下限设置界面90 5.2.4水位上下限的修改在水位上、下限设置界面如果通过上、下按键选择修改项,按右键就进入相应的上限或下限修改界面,值得注意的是在相应的水位上、下限修改界面,只能通过按左键返回水位上、下限设置界面,相应的水位上限修改界面显示如图40所示。水位下限修改界面显示如图41所示。如果在水位上、下限设置界面按下左键系统将进入报警修改界面的显示,如图42所示。图40水位上限修改界面图41水位下限修改界面图42报警开关修改界面5.2.5报警开关90 在报警开关修改界面,其报警开关可以通过上、下按键选择要打开或关闭的报警方式,通过按下右键对其开关进行分别打开或关闭。其所有报警方式全部打开界面如图43所示。如果在报警开关修改界面按下左键系统即进入时间日期修改显示界面,其时间日期修改界面的显示如图44所示。图43报警全打开界面图44时间修改界面5.2.6密码修改在时间显示界面可以通过上、下按键以及按右键移位键对时间信息进行修改,当在此界面按下左键时,系统进入密码修改显示界面,通过此界面可以对密码进行修改。在密码修改界面如果没有通过上、下按键和右键移位按键对密码进行修改,即按下左键按键时,系统直接进入水位状态显示界面。反之就要进入密码输入界面输入修改后的密码。其密码修改界面的显示如图45所示。图45密码修改显示界面5.2.7调节水位的反映90 在水位状态显示界面,通过调节模拟水位的电位器来调整当前水位值。当调整的水位值比系统预设的最大水位值还要高的时候,这时水位状态显示界面多了一个向上的箭头“↑”代表直流电机正转,此时观察直流电机正在正转。当调整的水位值比系统预设的最小水位值还要低的时候,这时水位状态显示界面多了一个向下的箭头“↓”代表直流电机反转,此时观察直流电机正在反转。如果报警开关全都打开,这时蜂鸣器发出蜂鸣声,语音模块分别发出水位超上限或发出水位超下限的提醒,同时报警的LED灯点亮。其电机正转水位状态显示界面的反映如图46所示。电机反转水位状态显示界面的反映如图47所示。电机旋转如图48所示。LED灯报警如图49所示。图46电机正转水位状态显示界面图47电机反转水位状态显示界面图48直流电机进行正反转旋转图49LED报警90 5.2.8上位机监控功能具有串口通信的功能,通过串行连线和电脑相连接,电脑作为上位机通过VB程序软件编写监控程序,波特率为9600,选择好相应的端口并打开,对水位监控系统发送相应的协议命令,水位监控系统在接收到系统命令后,根据命令的不同做出相应的动作[15]。通过设计把通信协议格式有开始符(A),地址(E1)由拨码开关接P0产生,命令符一位,数据,结束符(F)组成。水位监控上位机监控程序由专用的VB程序编写打包得到,可以分别设置水位上、下限,以及把报警开关的命令发送给下位机水位监控系统,系统通过串口收到的数据进行对比,根据相应的命令进行相应的动作。同时下位机水位监控系统能实时的把水位信息传送给上位机,这样就给运行人员带来了明确的实时水位信息。打开上位机软件界面如图50所示。图50上位机软件界面打开监控软件后,根据实际要求找到相应的端口,在监控软件中,通过选择相应的端口,上位监控系统就可以显示当前水位。通过对比下位机得到结果,显示如图51所示,实时水位如图52所示。图51水位显示90 图52实时水位水位监控系统中上位机软件对水位上、下限的默认值进行初始化。如果要进行水位上、下限修改,必须要输入四位数字,系统才能对水位上、下限值进行设置,否则弹出相应提示。进行水位上限设置如图53所示。图53水位上限值设置设置水位下限值,点击相应的水位下限设置按钮,把水位监控系统相应的下限值修改为所需要输入的值。水位下限设置如图54所示。图54水位上下限值修改90 水位监控系统的上位机软件还设置了能通过电脑修改报警开关的功能,通过点击界面中的报警开关按钮,报警打开,如图55所示。当按钮在打开报警的状态的时,点击它,就把水位监控系统所有报警开关修改为ON。报警修改后如图56所示。当按钮在关闭报警的状态的时,点击它,就把水位监控系统所有报警开关修改为OFF。报警关闭修改后如图57所示。报警修改后如图58所示。图55打开报警界面图56系统报警修改为ON图57关闭报警界面90 图58系统报警修改为OFF5.3设计课题的误差及缺陷分析水位监控系统采用了电位器进行模拟水位监控,当达到最低水位0米时需要2.8V电压,实际只要2.5V,存在0.3V的误差,所以在实际应用的时候要进行误差补偿。水位监控系统的程序是利用C51编写,由于在编译的时候需要把C51编写的程序转换为汇编,从而在延时函数上有将近1ms的误差。系统的密码不能进行掉电保存,从而在忘记密码时需要对系统进行复位。在应用中应加入保存。上位机监控软件采用的是VB编写的上位机水位监控系统程序,采用串口通信,从而限制了使用距离,可以通过转成无线或光纤。时间显示没加电池,在掉电情况下时间不走,在实际应用中应加上电池。5.4设计体会水位监控系统的设计是对课堂学习效果的检验,更是对学习课外知识能力的一种肯定。针对水位监控系统的设计,从最开始选择课题,到初步确定设计方案,以及后续利用专用软件对所需电路、程序严格按照要求进行设计,整个过程涉及到了问题的研究以及可行性分析,与现实生活的联系。在对设计选择所需要的各个模块过程中,能不断加强对单片机的综合应用能力,对水位监控系统中的每个模块功能也得到了更好的理解,并对水位监控系统的上位机软件的编写有了更深一步的了解。通过设计,加强了单片机系统开发的能力,提高了发现问题、解决的问题能力,深刻影响着以后的学习和工作。90 结束语设计课题为水位监控系统的设计,从选择课题开始,不断的通过互联网和图书馆查找相关资料,然后制定了设计计划。通过老师的指导,先后完成了课题设计任务书的内容,课题开题报告的编写、外文翻译的书写、对水位监控系统的设计方案等进行了确定。通过相关软件对相关实物进行设计和制作,然后进行调试,编写设计论文说明书等。这个过程,虽然时间不长,但收获却很多,对单片机以及其他相关知识有了更加深入的探究和了解,也让学习能力、编程能力、动手能力以及各种相关软件的使用能力有了明显提高。水位监控系统的设计主要以操作方便、实时性、能和电脑通信、适用广泛的设计思路来进行设计、制作的。水位监控系统与其他的监控系统相比较,设计的系统具有成本低、操作简单、易懂、维护方便、系统软件升级容易等优点,不仅能适用于大型水库的水位监控,也适合于普通家庭水塔水位的监控,同时也可以利用本系统对水资源进行合理利用。在设计的这段日子里,通过不断努力学习和分析,不断咨询指导老师以及在指导老师不为辛苦的指导,终于给水位监控系统设计画上了句号,实现了预想的功能。但是有些方面还是需要改进的,比如系统密码能加入掉电保存芯片,对数据进行加密,通信连接方式改用无线WIFI传播方式,使其传输数据距离更远。在以后的学习中,对于水位监控系统的设计,功能要不断加强、不断优化。90 参考文献[1]王雪梅.水资源研究发展态势[J].地球科学进展.2011.59~256WangXuemei.Waterresourcesresearchanddevelopmenttrend[J].advanceinearthscience.2011.59~256(inChinese)[2]吴再群.基于单片机的水位控制系统[J].电子科技.2013.23~65WuZaiqun.Waterlevelcontrolsystembasedonsinglechipmcu[J].Journalofelectronicscienceandtechnology,2013.23~65(inChinese)[3]朱昌富.基于单片机的水位监控系统[J].宁德师范学院学报(自然科学版).2012.128~158ZhuChangfu.basedmicrocontrollerWaterLevelMonitoringSystem[J].NingdeTeachersCollege(NaturalScience).2012.128~158(inChinese)[4]陆中宏,高松.单片机应用技术[M].机械工业出版社,2010.32~61LuZhonghong,GaoSong.Single-chipcomputerapplicationtechnology[M].Mechanicalindustrypublishinghouse.2010.32~61(inChinese)[5]朱高中.基于单片机远程水位检测系统的研究[J]光电子技术.2012.80~120ZhuGaozhong.basedonMCUremotewaterleveldetectionsystemOf[J].optoelectronictechnology.2012.80~120(inChinese)[6]李登辉.高塔水位智能控制系统设计[J].电子制作.2014.60~72LiDenghuitowerwaterlevelintelligentcontrolsystem[J].Electronicproduction.2014.60~72(inChinese)[7]商杰,武洪涛.10位串行模/数转换器TLC1549在单片机系统中的应用[J].现代电子技术.2013.67~82ShangJie,WuHongtao.10SerialA/DconverterTLC1549inMCUSystem[J].Modernelectronictechnology.2013.67~82(inChinese)[8]冯大捷.基于DS1302电子时钟的设计[J].科技视界.2012.64~83FengDajieDesignDS1302electronicclock[J].BasedTechnologyVision.2012.64~83(inChinese)[9]李伟跃.基于时钟芯片DS1302的万年历的设计[J].科技创新导报.2012.20~30LiWeiyue.clockchipDS1302calendar-baseddesign[J].ScienceandTechnologyInnovationHeral.2012.20~30(inChinese)[10]冉莉,王民.基于单片机的液晶显示模块硬软件设计开发[J].科技广场.2012.12~2490 RanLi,WangMing.MicrocontrollerbasedLCDmodulehardwareandsoftwaredesignanddevelopment[J].TechnologySquare.2012.12~24(inChinese)[11]张天鹏,徐磊.L298N控制直流电机正反转[J].工业设计.2011.52~80ZhangtianPeng,LeiXu.L298NReversibleDCmotorcontrol[J].IndustrialDesign.2011.52~80(inChinese)[12]严俊高,陈洁.串行通信控制及使用实例[J].机床电器.2012.50~92YanJungao.Serialcommunicationcontrolandusingtheinstance[J].Machinetoolelectricalappliances.2012.50~92(inChinese)[13]康华光.电子技术模拟部分(第五版)[M].北京:高等教育出2006.20~61KangHuaguang.Electronictechnologyfoundationsimulationpart(fifthedition)[M].Beijing:highereducationpress,2006.20~61(inChinese)[14]唐俊瞿.单片机原理及应用[M].北京:冶金工业出版社,2003.102~121TangJunqu.Singlechipmicrocomputerprincipleandapplication[M].Beijing:metallurgicalindustrypress,2003.102~121(inChinese)[15]胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社,1996.120~160HuHancai.Singlechipmicrocomputerprincipleandinterfacetechnology[M].Beijing:tsinghuauniversitypress,1996.120~160(inChinese)[16]李广弟.单片机基础[M],北京:北京航空航天大学出版社,2007.328~346LiGuangdi.microcontrollerbasedon[M],Beijing:BeijingAerospaceUniversityPress,2007.328~346(inChinese)[17]徐爱明.浅析单片机技术在传感器设计中的应用[J].中国新技术新产品.2013.46~81XuAimingTheapplicationofSCMtechnologyinsensordesign[J].Chinesenewtechnologiesandproducts.2013.46~81(inChinese)[18]于艳,顾桓.MCS-51单片机和PC机间的串口通信[J].科学技术与工程.2012.62~81YuYan,GuHuan.MCS-51microcontrollerserialcommunicationbetweenPCand[J].ScienceTechnologyandEngineering.2012.62~81(inChinese)[19]周子琛,申振宁.用VB实现计算机与单片机的串行通信[J].半导体术.2013.214~260ZhouZichenShenZhenning.UsingVBtorealizethecomputerandsinglechipmicrocomputerserialcommunication[J].Journalofsemiconductortechnology,2013.328~346(inChinese)90 [20]LishuangZhao.ADesignofIntelligentHomeMonitoringSystem[A].Proceedingsof2015InternationalIndustrialInformaticsandComputerEngineeringConference(IIICEC2015)[C].2015.121~160[21]AbowdGD,AllenR,GarlanD.FormalizingStyletoDescriptionsofSoftwareArchitecture[J].ACMTransactionsonSoftwareEngineeringandMethodology,1995.313~364.90 致谢时光飞逝,岁月如梭,大学时光眼看就要结束了。毕业设计完成,代表着我即将毕业,步入社会。经过大学四年的学习,毕业设计成了检验我四年来学习的一种有效方法。经过从开始整理思路,制定目标,到完成毕业设计这样的一个过程,从无到有这样的一个过程中,让我受益匪浅,也让我懂得了结果并不重要,重要的是过程。这段时间我不仅巩固了四年来的学习内容,更增长了新的知识、经验,这些知识、经验让我以后在社会上少走弯路奠定了基础。在完成毕业设计这个过程中,我遇到了很多的难题,苦恼过后,发现总会有那么多的人在支持我,帮助我。因此,我要深深的感谢我的指导老师王韧老师,以及在背后默默支持我的同学及朋友。是他们,在我遇到问题困难时,一遍一遍极有耐心的跟我讲解,帮我解决相应的困难,再一次谢谢他们。我要特别感谢指导老师王老师,是王老师的悉心指导,才能让我顺利的完成毕业设计。认识王老师那年,王老师作为我们班的单片机任课老师,王老师做事一丝不苟,对我们严厉有加,经常挂在嘴边的九字真言“有想法、勤实践、善总结”,王老师的为人处事,工作尽心尽职的态度,都深深的影响着我。因此我要衷心的感谢王老师,感谢王老师在教导我们知识、技能的同时,更注重对我的道德修养的培养。毕业设计的顺利完成,感谢学校领导为我们提供这么好的学习气氛,感谢老师们细致教导,感谢同学们的热情帮助。90 附录附录A元件清单元件名称元件参数数量电源插座2贴片电容0.1μF10电容100μF1电容22μF2发光二极管9保护二极管1N40081MAX2321ISP下载口1排阻470Ω1蜂鸣器1模数转换芯片TLC15491数模转换芯片DAC85121拨码开关1晶振11.0592MHz1晶振32.768KHz1三极管A10151开关六角1按键5单片机STC89C5281语音芯片WT588D1插座10液晶LCD122321时钟芯片DS13021RS232接口1电阻510Ω1电阻1K4稳压管2.5V1电阻2K17排阻5.1K2电位器50K2扬声器8Ω1直流电机1变压器12V1稳压芯片5V2稳压芯片12V2整流桥2W10190 附录B实物图90 附录C程序清单/****************************************************************课题名称:水位监控系统的设计(基于单片机STC89C52)作者:林光宗指导老师:王韧完成时间:2015年5月功能(1)、水位监控系统上电或按键复位后能显示欢迎界面(密码输入界面)(2)、具有能实时显示水位,时间,以及电机正反转状态;(3)、具有水位上下限修改、报警开关修改、时间修改以及密码修改功能;(4)、具有通信功能;(5)、具有语音提示功能;(6)、具有能通过电脑在线修改水位上下限、报警开关的功能;(7)、具有初始水位上下限分别为水位上限80.0米、下限为30.0米、初始密码为四个0;硬件说明:单片机STC公司的STC89C52,晶振-11.0592HZ,输入设备-接在P1口的四位独立式键盘,输出设备-LCD12232液晶屏,TLC1549模数转换,DAC8512数模转换,MAX232通信,WT588D语音模块。/*******************************************************************///******************系统有关端口和函数头文件定义********************#ifndef__BOARD_H__#define__BOARD_H__#defineucharunsignedchar#defineuintunsignedint//************************端口定义*****************************//***********adc1549端口*****************sbitCS2=P2^5;sbitDOUT=P2^6;sbitIO_CLK=P2^7;//***********液晶屏端口*****************sbitled=P1^7;sbitLCD_CS=P2^2;sbitLCD_SID=P2^3;sbitLCD_CLK=P2^4;//***********按键端口*******************90 sbitleftkey=P1^0;//左按键sbitupkey=P1^3;//上按键sbitdownkey=P1^2;//下按键sbitrightkey=P1^1;//右按键//***********电机端口*********************sbitLD=P3^7;sbitSDI=P2^0;sbitCLK=P2^1;//***********ds1302端口********************sbitT_RST=P3^4;//位定义1302芯片的接口,复位端口定义在P3.4引脚sbitT_IO=P3^5;//位定义1302芯片的接口,数据输出端定义在P3.5引脚sbitT_CLK=P3^6;//位定义1302芯片的接口,时钟输出端口定义在P3.6引//***********声音报警端口********************sbitVoice=P3^3;sbitWTCS=P1^4;//P02sbitWTCLK=P1^5;//P03sbitWTDA=P1^6;//P01//***************变量的定义*****************//*************有关水位的变量的声明*********externintwaterline;//当前水位externintlast_waterline;externintwaterline_H;//最高水位externintwaterline_L;//最低水位externuchartemp_key;//时钟按键模式externuchartemp_k;//****************有关1302时钟芯片变量的定义************externucharHour;//小时externucharMin;//分钟externucharSec;//秒externucharlast_Sec;//秒externucharMonth;//月份externucharDay;//天externucharweek;//周externucharyear;//年90 externuintpassword;//密码externuintdisp_password;//***********************有关串行口变量的定义************externucharAddr;//地址位externucharstart;//开始位externuchardat;//串行口接收数据externvoidcheck(ucharxx);//串行口接收数组//***********************有关报警变量的定义************externuchardisp_mode;//显示屏模式变量externucharVoiceAlarm;//声音报警开关变量externucharLightAlarm;//光报警开关变量externucharflag;//游标位置变量externucharend;externuinttemp_voice;//语音次数延时变量externucharWT_temp,WT_temp1;//语音报警中间变量//****************************外部函数定义***************************externvoidW_dig_signal(uintv);externvoidspi_write(uchardat);//SPI电机控制externvoiddelay_ms(uintx);//毫秒级延时函数externvoidkey();//按键函数externucharkeyscan();//判断按键函数externvoidkey0();externvoidkey1();externvoidkey2();externvoidkey3();externvoidkey4();externvoidkey5();externvoidkey6();externvoidkey7();externvoidkey8();//**********************有关报警函数定义***************externvoidstop_run();//电机停止转动函数externvoidleft_run();//电机反转函数externvoidright_run();//电机正转函数90 externvoidMotor();externvoidVoice_Alarm();//声音报警函数externvoidLight_Alarm();//灯光报警函数externvoidAlarm();externvoidWT588D(ucharx);//语音模块//**********************有关串行口函数定义***************externvoidanswer_01();//串行口返回数据函数(回答函数)externvoidanswer_02();externvoidanswer_03();externvoidanswer_04();externvoidserial_init();//串行口发送初始化函数//**********************有关asd1549函数定义***************externuintAdc1549();//ADC1549转换函数externuintfitler();//ADC1549滤波算法函数//**********************有液晶屏函数定义***************externvoidlcd_init();//液晶屏初始化externvoidsend_data(uchardat);//液晶屏发送数据函数externvoidsend_com(uchardat);//液晶屏发送命令函数externvoidwelcome();//欢迎界面externvoiddisp_WaterLine();//水位报警时间状态显示界面externvoiddisp_set_WaterLine();//水位设置界面externvoiddisp_set_WaterLine_H();//最高水位设置界面externvoiddisp_set_WaterLine_L();//最低低水位设置界面externvoiddisp_set_Alalm();//设置报警界面externvoiddisp_set_Time();//设置时间界面externvoidset_password();//设置密码界面externvoiddisp_Time();//时间显示//***********************有关1302时钟芯片函数的定义************externvoidGetTime();//获取时间函数externvoidInitDS1302();//DS1302初始化externvoidWrite1302(unsignedchardat);//DS1302写数据externvoidWriteSet1302(unsignedcharadd,unsignedchardat);externunsignedcharRead1302();//DS1302读数据externunsignedcharReadSet1302(unsignedcharadd);90 #endif//**********************主函数*********************#include#include#include#includemain(){system_init();welcome();while(1){switch(disp_mode)//0:欢迎界面密码显示,1:状态显示,2:水位上下限修改,3:水位上限,4:水位下限//5:报警,6:时间设置,7:密码设置,8:查看日期{case0:key0();break;case1:waterline=fitler();//读水位信号GetTime();//获取时间Alarm();//报警函数answer_01();if(waterline>waterline_H)//调用电机模块{W_dig_signal(4095);}if(waterlinewaterline_L&&waterline0;i--)for(j=110;j>0;j--);}//********************系统初始化******************voidsystem_init(){waterline_H=800;//设置水位上下限初始值waterline_L=200;WT_temp=5;WT_temp1=0;W_dig_signal(2100);//电机停转Addr=P0;//读取本机地址P1=0x1e;WT588D(0x06);disp_mode=0;serial_init();//串口初始化,波特率:9600lcd_init();InitDS1302();flag=0x21;//显示屏光标初始值delay_ms(500);waterline=fitler();//读水位信号answer_01();}//***************************按键扫描函数***********************#include#include#include//**************************************************************ucharkeyscan(){ucharkey_mode=4;leftkey=1;if(leftkey==0)//左按键按下90 {delay_ms(10);//确认按键按下防抖if(leftkey==0){while(leftkey==0);key_mode=0;}}upkey=1;if(upkey==0)//上按键按下{delay_ms(10);//确认按键按下防抖if(upkey==0){while(upkey==0);key_mode=1;}}downkey=1;if(downkey==0)//下按键按下{delay_ms(10);//确认按键按下防抖if(downkey==0){while(downkey==0);key_mode=2;}}rightkey=1;if(rightkey==0)//右按键按下{delay_ms(10);//确认按键按下防抖if(rightkey==0){90 while(rightkey==0);key_mode=3;}}returnkey_mode;}//***************************按键模式0函数***********************voidkey0(){ucharkey_mode=4;key_mode=keyscan();switch(key_mode){case0://密码正确按左键进入状态显示屏if(disp_password==password){WT_temp=4;WT588D(0x03);delay_ms(27000);disp_mode=1;}else{WT_temp=5;WT588D(0x07);WT_temp1=0;}break;case1://光标处密码加一switch(flag){case0x21:if(disp_password/1000==9){90 disp_password=disp_password-9000;}elsedisp_password=disp_password+1000;break;case0x22:if(disp_password%1000/100==9){disp_password=disp_password-900;}elsedisp_password=disp_password+100;break;case0x23:if(disp_password%100/10==9){disp_password=disp_password-90;}elsedisp_password=disp_password+10;break;case0x24:if(disp_password%10==9){disp_password=disp_password-9;}elsedisp_password=disp_password+1;break;default:break;}welcome();break;90 case2://光标处密码减一switch(flag){case0x21:if(disp_password/1000==0){disp_password=disp_password+9000;}elsedisp_password=disp_password-1000;break;case0x22:if(disp_password%1000/100==0){disp_password=disp_password+900;}elsedisp_password=disp_password-100;break;case0x23:if(disp_password%100/10==0){disp_password=disp_password+90;}elsedisp_password=disp_password-10;break;case0x24:if(disp_password%10==0){disp_password=disp_password+9;}elsedisp_password=disp_password-1;90 break;default:break;}welcome();break;case3:if(flag==0x24){flag=0x21;disp_mode=0;}elseflag++;disp_mode=0;welcome();break;default:break;}}//***************************按键模式1函数***********************//*****在状态显示屏下只有左右键有效左键切换下一屏右键显示日期voidkey1(){ucharkey_mode=4;key_mode=keyscan();if(key_mode==0){send_com(0x0d);flag=0x15;disp_mode=2;disp_set_WaterLine();}if(key_mode==3)90 {disp_mode=8;disp_Time();}}//***************************按键模式2函数***********************//*****在设置水位上下限显示屏当前所有按键均有效voidkey2(){ucharkey_mode=4;key_mode=keyscan();switch(key_mode){case0:flag=0x15;disp_mode=5;disp_set_Alalm();break;case1:send_com(0x0d);if(flag==0x15){flag=0x25;}elseflag=0x15;disp_set_WaterLine();break;case2:send_com(0x0d);if(flag==0x25){flag=0x15;}else{flag=0x25;}90 disp_set_WaterLine();break;case3:send_com(0x0d);if(flag==0x15){disp_mode=3;flag=0x21;disp_set_WaterLine_H();}else{flag=0x21;disp_mode=4;disp_set_WaterLine_L();}break;default:break;}}//***************************按键模式3函数*************************//*****在设置水位上限显示屏左键返回设置水位上下限显示屏上下键调整右键移位voidkey3(){ucharkey_mode=4;key_mode=keyscan();switch(key_mode){case0:flag=0x15;disp_mode=2;disp_set_WaterLine();break;90 case1:switch(flag){case0x21:if(waterline_H<=23)waterline_H=waterline_H+1000;break;case0x22:if(waterline_H<=923)waterline_H=waterline_H+100;break;case0x23:if(waterline_H<=1013)waterline_H=waterline_H+10;break;case0x25:if(waterline_H<=1022)waterline_H=waterline_H+1;break;default:break;}if(waterline_H>=1023)waterline_H=1023;disp_set_WaterLine_H();break;case2:switch(flag){case0x21:if(waterline_H>=1000)waterline_H=waterline_H-1000;break;case0x22:if(waterline_H>=100)waterline_H=waterline_H-100;break;case0x23:if(waterline_H>=10)waterline_H=waterline_H-10;break;case0x25:if(waterline_H>=1)90 waterline_H=waterline_H-1;break;default:break;}if(waterline_H<=0)waterline_H=0;disp_set_WaterLine_H();break;case3:if(flag<0x23)flag=flag+1;elseif(flag==0x23)flag=flag+2;elseflag=0x21;disp_mode=3;disp_set_WaterLine_H();break;default:break;}}//***************************按键模式4函数*************************//*****在设置水位下限显示屏左键返回设置水位上下限显示屏上下键调整右键移位voidkey4(){ucharkey_mode=4;key_mode=keyscan();if(key_mode==0){flag=0x15;disp_mode=2;90 disp_set_WaterLine();}if(key_mode==1)//上键{switch(flag){case0x21:if(waterline_L<=23)waterline_L=waterline_L+1000;break;case0x22:if(waterline_L<=923)waterline_L=waterline_L+100;break;case0x23:if(waterline_L<=1013)waterline_L=waterline_L+10;break;case0x25:if(waterline_L<=1022)waterline_L=waterline_L+1;break;default:break;}if(waterline_L>=1023)waterline_L=1023;disp_set_WaterLine_L();}if(key_mode==2)//下键{switch(flag){case0x21:if(waterline_L>=1000)waterline_L=waterline_L-1000;break;case0x22:if(waterline_L>=100)waterline_L=waterline_L-100;90 break;case0x23:if(waterline_L>=10)waterline_L=waterline_L-10;break;case0x25:if(waterline_L>=1)waterline_L=waterline_L-1;break;default:break;}if(waterline_L<=0)waterline_L=0;disp_set_WaterLine_L();}if(key_mode==3)//右键{if(flag<0x23)flag=flag+1;elseif(flag==0x23)flag=flag+2;elseflag=0x21;disp_mode=4;disp_set_WaterLine_L();}}//***************************按键模式5函数*************************//在设置报警显示屏左键进入下一屏上下键调整报警状态voidkey5(){ucharkey_mode=4;key_mode=keyscan();switch(key_mode){90 case0:flag=0x10;disp_mode=6;disp_set_Time();break;case1:send_com(0x0d);if(flag==0x25){flag=0x15;}elseflag=0x25;Alarm();disp_set_Alalm();break;case2:if(flag==0x15){flag=0x25;}elseflag=0x15;disp_set_Alalm();Alarm();break;case3:if(flag==0x15){if(VoiceAlarm==0){VoiceAlarm=1;Alarm();}else{VoiceAlarm=0;90 }}if(flag==0x25){if(LightAlarm==0){LightAlarm=1;}elseLightAlarm=0;}disp_set_Alalm();Alarm();break;default:break;}}//***************************按键模式6函数************************//*****在设置时间显示屏左键进入下一屏上下键调整时间右键移位voidkey6(){ucharkey_mode=4;key_mode=keyscan();switch(key_mode){case0://左键flag=0x21;disp_mode=7;set_password();break;case1://上键switch(flag){90 case0x10:if(Hour<=22){Hour=Hour+1;}elseHour=0;break;case0x12:if(Min<=58)//分{Min=Min+1;}elseMin=0;break;case0x14:if(Sec<=58)//秒{Sec=Sec+1;}elseSec=0;break;case0x16:if(week!=7)//周{week++;}elseweek=1;break;case0x21:if(year!=99)//年{year++;}elseyear=0;break;case0x23:if(Month<=11)//月{Month=Month+1;}elseMonth=1;break;case0x25:if(Day!=31)//日90 {Day++;}elseDay=1;break;default:break;}InitDS1302();disp_set_Time();break;case2:switch(flag)//下键{case0x10:if(Hour>=1){Hour=Hour-1;}elseHour=23;break;case0x12:if(Min>=1){Min=Min-1;}elseMin=59;break;case0x14:if(Sec>=1){Sec=Sec-1;}elseSec=59;break;case0x16:if(week!=1){week--;90 }elseweek=7;break;case0x21:if(year!=0){year--;}elseyear=99;break;case0x23:if(Month>=2){Month=Month-1;}elseMonth=12;break;case0x25:if(Day!=1){Day--;}elseDay=31;break;default:break;}InitDS1302();disp_set_Time();break;case3:if(flag<=0x14){flag=flag+2;disp_mode=6;}elseif(flag==0x16){flag=0x21;90 disp_mode=6;}elseif(flag<0x25){flag=flag+2;disp_mode=6;}else{flag=0x10;disp_mode=6;}disp_set_Time();break;default:break;}}//***************************按键模式7函数*************************voidkey7(){ucharkey_mode=4;key_mode=keyscan();switch(key_mode){case0:if(temp_key!=0)//左键{flag=0x21;temp_key=0;disp_mode=0;welcome();}elsedisp_mode=1;90 break;case1://光标处密码加一temp_key=1;switch(flag){case0x21:if(password/1000==9){password=password-9000;}elsepassword=password+1000;break;case0x22:if(password%1000/100==9){password=password-900;}elsepassword=password+100;break;case0x23:if(password%100/10==9){password=password-90;}elsepassword=password+10;break;case0x24:if(password%10==9){password=password-9;}90 elsepassword=password+1;break;default:break;}set_password();break;case2://光标处密码减一temp_key=1;switch(flag){case0x21:if(password/1000==0){password=password+9000;}elsepassword=password-1000;break;case0x22:if(password%1000/100==0){password=password+900;}elsepassword=password-100;break;case0x23:if(password%100/10==0){password=password+90;}else90 password=password-10;break;case0x24:if(password%10==0){password=password+9;}elsepassword=password-1;break;default:break;}set_password();break;case3:temp_key=1;if(flag==0x24){flag=0x21;disp_mode=7;}elseflag++;disp_mode=7;set_password();break;default:break;}}voidkey8(){ucharkey_mode=4;90 key_mode=keyscan();if(key_mode==3){disp_mode=1;}}//*********************TLC1549模数转换函数***********#include#include#include#include//*********************adc1549采样函数*************uintAdc1549(){uchari;uintx;x=0;CS2=1;_nop_();_nop_();CS2=0;for(i=0;i<10;i++){IO_CLK=0;_nop_();_nop_();IO_CLK=1;_nop_();x<<=1;if(DOUT==1){x=x+1;}}90 CS2=1;returnx;}//*************************滤波算法**********************uintfitler(){uintvalue_x=0;uintxdatax[TIME];ucharcnt;ucharcnt_max=0;uchari;ucharj;for(i=1;icnt_max){cnt_max=cnt;value_x=x[j];}}//*****************误差补偿***************************returnvalue_x;}90 //*****************DAC8512数模转换函数**************************#include#include#include"DAC8512.h"#includevoidW_dig_signal(uintv){ucharx;LD=0;SDI=0;CLK=1;_nop_();LD=1;for(x=0;x<12;x++){CLK=0;_nop_();SDI=(bit)(v&0x0800);_nop_();CLK=1;v=v<<1;}LD=0;_nop_();LD=1;LD=0;}//*********************LCD12232液晶显示函数************#include#include#include//*********************LCD12232液晶显示初始化***********voidlcd_init(){90 send_com(0x30);//功能设定8位数据send_com(0x02);//DDRAM归零send_com(0x04);//点设置send_com(0x0d);//整体显示开,反白send_com(0x01);//清屏send_com(0x80);//设置显示位置}//*****************发指令给12232液晶//***************voidsend_com(ucharcom){uchari,i_data;i_data=0xf8;LCD_CS=1;LCD_CLK=0;for(i=0;i<8;i++){LCD_SID=(bit)(i_data&0x80);LCD_CLK=0;LCD_CLK=1;i_data=i_data<<1;}i_data=com;i_data&=0xf0;for(i=0;i<8;i++){LCD_SID=(bit)(i_data&0x80);LCD_CLK=0;LCD_CLK=1;i_data=i_data<<1;}i_data=com;i_data<<=4;for(i=0;i<8;i++){90 LCD_SID=(bit)(i_data&0x80);LCD_CLK=0;LCD_CLK=1;i_data=i_data<<1;}LCD_CS=0;delay_ms(10);}//******************发数据给12232液晶*************voidsend_data(uchardat){uchari,i_data;i_data=0xfa;LCD_CS=1;LCD_CLK=0;for(i=0;i<8;i++){LCD_SID=(bit)(i_data&0x80);LCD_CLK=0;LCD_CLK=1;i_data=i_data<<1;}i_data=dat;i_data&=0xf0;for(i=0;i<8;i++){LCD_SID=(bit)(i_data&0x80);LCD_CLK=0;LCD_CLK=1;i_data=i_data<<1;}i_data=dat;i_data<<=4;for(i=0;i<8;i++)90 {LCD_SID=(bit)(i_data&0x80);LCD_CLK=0;LCD_CLK=1;i_data=i_data<<1;}LCD_CS=0;delay_ms(10);}//************************欢迎屏****************************voidwelcome(){send_com(0x0d);send_com(0x81);//把显示地址设为0X80,即为第一行的首位//send_data(0xcb);send_data(0xae);//"水"字的编码//send_data(0xce);send_data(0xbB);//"位"字的编码//send_data(0xbc);send_data(0xe0);//“监”字的编码//send_data(0xbf);send_data(0xd8);//“控”字的编码//send_data(0xcf);send_data(0xb5);//“系”字的编码//send_data(0xcd);send_data(0xb3);//“统”字的编码//send_com(0x90);send_data("#");send_data(":");//居中空出2格//send_data(disp_password/1000+0x30);send_data("");send_data(disp_password%1000/100+0x30);send_data("");send_data(disp_password%100/10+0x30);90 send_data("");send_data(disp_password%10+0x30);send_com(flag+0x70);}//**********************状态显示屏*******************************voiddisp_WaterLine(){send_com(0x0c);send_com(0x80);//打开第一行首位//send_data(0xcb);send_data(0xae);//"水"字的编码//send_data(0xce);send_data(0xbb);//"位"字的编码//send_data(":");//":"的编码//if(waterline<=waterline_L)//发送报警状态{send_data(0x19);}elseif(waterline>=waterline_H){send_data(0x18);}elsesend_data("");if(waterline/1000==0)send_data("0");elsesend_data(waterline/1000+0x30);if((waterline/1000==0)&&(waterline%1000/100==0))send_data("0");elsesend_data(waterline%1000/100+0x30);send_data(waterline%100/10+0x30);send_data(".");90 send_data(waterline%10+0x30);//发送当前水位值//send_data("m");send_data("");if(Addr/16>9)//显示地址的高四位变成ascll码{send_data(Addr/16+0x37);}else{send_data(Addr/16+0x30);}if((Addr&0x0f)>9)//显示地址的低四位{send_data((Addr&0x0f)+0x37);}else{send_data((Addr&0x0f)+0x30);}send_com(0x90);send_data(0xca);//"时"的编码//send_data(0xb1);send_data(0xbc);//"间"的编码//send_data(0xe4);send_data(":");//":"的编码//send_data(Hour/10+0x30);send_data(Hour%10+0x30);//发送实际小时值//send_data(":");send_data(Min/10+0x30);send_data(Min%10+0x30);//发送实际分值//send_data(":");send_data(Sec/10+0x30);send_data(Sec%10+0x30);//发送实际秒值//send_com(flag+0x70);}//****************修改水位上下限显示*************90 voiddisp_set_WaterLine(){send_com(0x01);//清屏send_com(0x80);//打开第一行首位//send_data(0xcb);send_data(0xae);//"水"字的编码//send_data(0xce);send_data(0xbB);//"位"字的编码//send_data(0xc9);send_data(0xcf);//"上"字的编码//send_data(0xcf);send_data(0xde);//"限"字的编码//send_data(":");send_data(waterline_H/1000+0x30);send_data(waterline_H%1000/100+0x30);send_data(waterline_H%100/10+0x30);send_data(".");send_data(waterline_H%10+0x30);send_data("m");send_com(0x90);send_data(0xcb);send_data(0xae);//"水"字的编码//send_data(0xce);send_data(0xbB);//"位"字的编码//send_data(0xcf);send_data(0xc2);//"下"字的编码//send_data(0xcf);send_data(0xde);//"限"字的编码//send_data(":");send_data(waterline_L/1000+0x30);send_data(waterline_L%1000/100+0x30);send_data(waterline_L%100/10+0x30);send_data(".");send_data(waterline_L%10+0x30);//当前水位上限值//90 send_data("m");send_com(flag+0x70);}//***********************修改水位上限***************voiddisp_set_WaterLine_H(){send_com(0x01);//清屏send_com(0x80);//打开第一行首位//send_data("");send_data("");send_data(0xcb);send_data(0xae);//"水"字的编码//send_data(0xce);send_data(0xbB);//"位"字的编码//send_data(0xc9);send_data(0xcf);//"上"字的编码//send_data(0xcf);send_data(0xde);//"限"字的编码//send_data(0xd0);//修send_data(0xde);send_data(0xb8);//改send_data(0xc4);send_com(0x90);//打开第二行首位//send_data("");send_data("");send_data(waterline_H/1000+0x30);send_data("");send_data(waterline_H%1000/100+0x30);send_data("");send_data(waterline_H%100/10+0x30);send_data("");send_data(".");send_data("");send_data(waterline_H%10+0x30);90 send_data("");//当前水位上限值//send_data(0xc3);send_data(0xd7);//米字的编码//send_com(flag+0x70);}//***********************修改水位下限***************voiddisp_set_WaterLine_L(){send_com(0x01);//清屏send_com(0x80);//打开第一行首位//send_data("");send_data("");send_data(0xcb);send_data(0xae);//"水"字的编码//send_data(0xce);send_data(0xbB);//"位"字的编码//send_data(0xcf);send_data(0xc2);//"下"字的编码//send_data(0xcf);send_data(0xde);//"限"字的编码//send_data(0xd0);send_data(0xde);send_data(0xb8);send_data(0xc4);send_com(0x90);send_data("");send_data("");send_data(waterline_L/1000+0x30);send_data("");send_data(waterline_L%1000/100+0x30);send_data("");send_data(waterline_L%100/10+0x30);send_data("");send_data(".");90 send_data("");send_data(waterline_L%10+0x30);send_data("");//当前水位上限值//send_data(0xc3);send_data(0xd7);//米字的编码//send_com(flag+0x70);}//*********************设置时间显示屏*****************voiddisp_set_Time(){ucharcodec_week[]={0x00,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb};//星期的中标代码send_com(0x01);//第一行send_com(0x80);send_data(Hour/10+0x30);send_data(Hour%10+0x30);send_data(0x3A);send_data("");send_data(Min/10+0x30);send_data(Min%10+0x30);send_data(0x3A);send_data("");send_data(Sec/10+0x30);send_data(Sec%10+0x30);send_data(0xd6);send_data(0xdc);send_data(0xa2);send_data(c_week[week]);send_com(0x90);send_data("2");send_data("0");send_data(year/10+0x30);send_data(year%10+0x30);90 send_data(0xc4);send_data(0xea);send_data(Month/10+0x30);send_data(Month%10+0x30);send_data(0xd4);send_data(0xc2);send_data(Day/10+0x30);send_data(Day%10+0x30);send_data(0xc8);send_data(0xd5);send_com(flag+0x70);//确定游标位置}//*******************报警开关***********************voiddisp_set_Alalm(){disp_mode=5;send_com(0x01);send_com(0x80);send_data(0xC9);send_data(0xF9);//声send_data(0xD2);send_data(0xF4);//音send_data(0xB1);send_data(0xA8);//报send_data(0xBE);send_data(0xAF);//警send_data(0x3A);send_data("");//:if(VoiceAlarm==0){send_data(0x4F);send_data(0x46);send_data(0x46);}90 else{send_data("");send_data(0x4f);send_data(0x4e);}send_com(0x90);send_data(0xB5);send_data(0xC6);//灯send_data(0xB9);send_data(0xE2);//光send_data(0xB1);send_data(0xA8);//报send_data(0xBE);send_data(0xAF);//警send_data(0x3A);send_data("");if(LightAlarm==0){send_data(0x4F);//显示0FFsend_data(0x46);send_data(0x46);}else{send_data("");send_data(0x4f);//显示ONsend_data(0x4e);}send_com(flag+0x70);}//************************密码修改****************************voidset_password(){90 send_com(0x01);send_com(0x0d);send_com(0x81);//把显示地址设为0X80,即为第一行的首位//send_data(0xc3);send_data(0xdc);//“密”字的编码//send_data(0xc2);send_data(0xeb);//“码”字的编码//send_data(0xd0);//修send_data(0xde);send_data(0xb8);//改send_data(0xc4);send_com(0x90);send_data("#");send_data(":");//居中空出2格//send_data(password/1000+0x30);send_data("");send_data(password%1000/100+0x30);send_data("");send_data(password%100/10+0x30);send_data("");send_data(password%10+0x30);send_com(flag+0x70);}//****************************时间显示屏*********************voiddisp_Time(){ucharcodec_week[]={0x00,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb};send_com(0x01);send_com(0x80);send_data("2");send_data("0");send_data(year/10+0x30);send_data(year%10+0x30);send_data(0xc4);90 send_data(0xea);send_data(Month/10+0x30);send_data(Month%10+0x30);send_data(0xd4);send_data(0xc2);send_data(Day/10+0x30);send_data(Day%10+0x30);send_data(0xc8);send_data(0xd5);send_com(0x92);send_data(0xd0);send_data(0xc7);send_data(0xc6);send_data(0xda);send_data(0xa2);send_data(c_week[week]);}/*********************DS1302时钟函数****************#include#include#include#include/********************向1302写一个字节数据*********voidWrite1302(unsignedchardat){unsignedchari;T_CLK=0;//拉低T_CLK,为脉冲上升沿写入数据做好准备_nop_();//稍微等待,使硬件做好准备for(i=0;i<8;i++)//连续写8个二进制位数据{T_IO=dat&0x01;//取出dat的第0位数据写入1302_nop_();//稍微等待,使硬件做好准备_nop_();T_CLK=1;//上升沿写入数据90 _nop_();_nop_();//稍微等待,使硬件做好准备T_CLK=0;//重新拉低T_CLK,形成脉冲dat>>=1;//将dat的各数据位右移1位,准备写入下一个数据位}}//*********************向1302写一个字节数据**********voidWriteSet1302(unsignedcharadd,unsignedchardat){T_RST=0;//禁止数据传递_nop_();_nop_();T_CLK=0;//确保写数居前T_CLK被拉低_nop_();_nop_();T_RST=1;//启动数据传输_nop_();//稍微等待,使硬件做好准备_nop_();Write1302(add);//写入命令字Write1302((dat/10<<4)|(dat%10));T_CLK=1;//将时钟电平置于已知状态_nop_();T_RST=0;//禁止数据传递}//*************************从1302读一个字节数据**********unsignedcharRead1302(){unsignedchari,dat;_nop_();//稍微等待,使硬件做好准备for(i=0;i<8;i++)//连续读8个二进制位数据{dat>>=1;//将dat的各数据位右移1位,先读出的是最低位if(T_IO==1)//如果读出的数据是1dat|=0x80;//将1取出,写在dat的最高位90 T_CLK=1;//将T_CLK置于高电平,为下降沿读出_nop_();//稍微等待_nop_();T_CLK=0;//拉低T_CLK,形成脉冲下降沿_nop_();//稍微等待_nop_();}returndat;//将读出的数据返回}unsignedcharReadSet1302(unsignedcharadd){unsignedchartemp,dat1,dat2;T_RST=0;_nop_();//拉低T_RSTT_CLK=0;_nop_();//确保写数居前T_CLK被拉低T_RST=1;_nop_();//启动数据传输Write1302(add);//写入命令字temp=Read1302();//读出数据T_CLK=1;_nop_();//将时钟电平置于已知状态_nop_();T_RST=0;_nop_();//禁止数据传递_nop_();dat1=temp/16;//16进制转成BCD取高四位dat2=temp%16;temp=dat1*10+dat2;//转换成10进制数字return(temp);//将读出的数据返回}/*********************1302进行初始化设置**************voidInitDS1302(){if(Month==0||Day==0){Month=1;Day=1;}90 WriteSet1302(0x8e,0x00);//允许写入WriteSet1302(0x80,Sec);//秒初始值0WriteSet1302(0x82,Min);//分初始值59WriteSet1302(0x84,Hour);//时初始值8WriteSet1302(0x8a,week);//周WriteSet1302(0x8c,year);//年WriteSet1302(0x86,Day);//日初始值6WriteSet1302(0x88,Month);//月初始值5WriteSet1302(0x90,0xa6);//写充电控制寄存器.}/*******************获取DS1302时间************************voidGetTime(){Sec=ReadSet1302(0x81);Min=ReadSet1302(0x83);Hour=ReadSet1302(0x85);Day=ReadSet1302(0x87);Month=ReadSet1302(0x89);year=ReadSet1302(0x8d);week=ReadSet1302(0x8b);}//***********************通信函数****************#include#include#include#include//********************回答(发送水位)子函数****************voidanswer_01(){EA=0;//关中断TI=0;//允许发送SBUF=waterline/1000+0x30;//发送当前水位while(!TI);TI=0;90 SBUF=waterline%1000/100+0x30;while(!TI);TI=0;SBUF=waterline%100/10+0x30;while(!TI);TI=0;SBUF=waterline%10+0x30;while(!TI);TI=0;EA=1;//打开中断}////*********************串口中断服务函数****************voidserial()interrupt4{ucharserial_dat[7];ucharser_cnt;ucharx;ES=0;RI=0;dat=SBUF;switch(dat){case0x41://判断开始符ser_cnt=0;break;case0x46://判断地址x=serial_dat[0]>0x39?(serial_dat[0]-0x37)*16:(serial_dat[0]-0x30)*16;x=serial_dat[1]>0x39?(x+serial_dat[1]-0x37):(x+serial_dat[1]-0x30);if((x!=Addr)&&(x!=0x00))break;switch(serial_dat[2]){90 case0x32:waterline_H=(serial_dat[3]-0x30)*1000+(serial_dat[4]-0x30)*100+(serial_dat[5]-0x30)*10+(serial_dat[6]-0x30);//设置最高水位break;case0x35:waterline_L=(serial_dat[3]-0x30)*1000+(serial_dat[4]-0x30)*100+(serial_dat[5]-0x30)*10+(serial_dat[6]-0x30);//设置最低水位break;case0x33:VoiceAlarm=0;//设置声音报警关LightAlarm=0;//设置光报警关break;case0x34:VoiceAlarm=1;//设置声音报警开变量LightAlarm=1;//设置光报警开变量break;default:break;}break;default:serial_dat[ser_cnt]=SBUF;//接收数据数组ser_cnt++;break;}RI=0;//允许发送ES=1;//允许发送}//************************串口初始化函数*****************voidserial_init(){TMOD=0x20;//确定用计数器T1模式2TH1=0xfa;//给计数器初始值TL1=0xfa;//采用波特率为960090 TR1=1;SCON=0x50;//确定串口通信方式EA=1;ES=1;}//***************************报警函数*************#include#include#include//***************************设置灯光报警***********************voidAlarm(){Voice_Alarm();Light_Alarm();}//*********************设置声音报警函数***************//根据报警开关是否打开以及当前的水位与标准值比较voidVoice_Alarm(){if(VoiceAlarm==0)//如果声音报警开为关{Voice=1;}else{if(waterline<=waterline_L){WT_temp=2;WT588D(0x02);Voice=0;}elseif(waterline>=waterline_H){WT_temp=3;90 WT588D(0x01);Voice=0;}else{WT_temp=1;WT588D(0xfe);//不作声音报警Voice=1;}}}voidWT588D(ucharx){uchari,text=x;if(WT_temp1!=WT_temp){delay_ms(150);WTCS=0;delay_ms(18);WTCLK=0;for(i=0;i<8;i++){WTCLK=1;if(text&1)WTDA=1;elseWTDA=0;text>>=1;delay_ms(10);WTCLK=0;delay_ms(12);}WTCS=1;}90 WT_temp1=WT_temp;}//***************************设置光报警函数***********************//根据报警开关是否打开以及当前的水位与标准值比较voidLight_Alarm(){if(LightAlarm==0)//判断灯光报警是否打开{led=0;//为关闭不报警}else{if(waterline<=waterline_L||waterline>=waterline_H){led=1;}elseled=0;}}90'