基于单片机的无塔供水系统(详细介绍).doc_第1页
基于单片机的无塔供水系统(详细介绍).doc_第2页
基于单片机的无塔供水系统(详细介绍).doc_第3页
基于单片机的无塔供水系统(详细介绍).doc_第4页
基于单片机的无塔供水系统(详细介绍).doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘 要无塔供水系统是目前解决高层建筑供水问题的最常用的方案,它具有卫生、节水、节约投资、体积小的优点。本次研究的主题是了解智能无塔供水系统的工作原理,并搭建一个简单的智能无塔供水系统。实际设计中我们以AT89C51单片机作为所要实现的无塔供水系统的核心,并通过DS1302实现其时间模块,用ADC809采集压力信号,转换成数字信号,在变频泵工作区间,将数字信号进行相应处理后经DA转换变成相应的变频泵控制信号来控制变频泵,实现定时供水。我们利用INT0中断来调节时间,可以实现分钟和小时的增加和减小,通过INT1中断来调节压力,同样可以实现压力的加减。我们设置了一个闪烁标志位,在刚进入中断时可以在数码管上闪烁显示,以表明进入或退出了调节状态。在程序中我们还定义了一个显示切换键,用来切换显示的是实时压力还是系统时间。文章从硬件和软件两个方面入手介绍了无塔供水系统的基本原理,硬件部分包括中央处理单元电路、时钟电路、数模转换、模数转换及调节部分。软件部分用C语言来实现对硬件的控制,主要包括主程序、时间显示及设置子程序、压力显示及设置子程序等软件模块。整个电路实现了一个智能无塔供水系统应有的基本要求,还添加了一些功能,达到了预期的效果。关键词:AT89C51单片机,DS1302,ADC809,ADC0832,动态显示,散转程序1.无塔供水系统及背景分析随着建筑业的迅速发展,高楼大厦不断出现,而高楼上时常得不到及时与必须的水源,致使住在高层楼房的住户生活不便,甚至在高楼上的消防设施在关键时不能发挥应有的作用。因此,现在的高层建筑大多采用无塔供水系统。所谓无塔供水是指能取代水塔的供水方式,主要有以下几种:a. 电接点控制.这种供水方式比较简单,但是因为只通过起停泵来进行压力控制,所以容易导致泵频繁启动,一般会降低泵的使用寿命,现在一般不经常使用.b. 变频控制柜控制.这种供水方式比较智能化,通过变频器调节水泵转速来控制压力,压力稳定,节能效果显著,而且能消除水锤效应,保护水泵,应用比较广泛.c. 潜水泵自动化供水设备.这种供水方式是用变频控制,有变频控制的优点,另外因为有缓冲稳压容器所以压力稳定,可靠程度更高,而且他还有另外的一套自动电路,在变频故障下不影响用水,所以现在采用这种设备的地方越来越多.变频控制方式系统通过监测管网压力来控制变频调速器。管网压力越低,水泵转的越快,管网压力大到一定程度后,水泵停机。在夜间开启小流量泵。并能设置定式供水。其用途主要有以下几方面: 1. 该系统既可用于生产、生活用水,亦可用于热水供应,恒压喷淋等系统。 2. 可广泛用于工业企业、生活、生产供水系统及企业自备并改造工程,自来水厂、生活小区及消防供水系统。 3. 可用于各种场合的恒压、变压、冷却水和循环供水系统。 4. 可用于污水泵站、污水处理及污水提升系统。 5. 可用于农业排灌、园林喷淋、水景和音乐喷泉系统。 6. 可用于宾馆、大型公共建筑供水及消防系统。本实验就是基于这样的实际模型来采用单片机设计一个无塔供水系统1.1 本实验的主要任务: 任务一:我们用05V的直流电压型号来模拟管网压力信号,实现定时供水,当时间在区间(6:308:30, 11:3013:30,17:3020:30),启用变频泵,变频泵的启用我们通过点亮LED DS1来模拟任务二:在夜间(0点到6:30)关掉变频泵,开启夜间灯(LED DS3),当管网压力小于一定值后,开启小流量泵,小流量泵的启用通过点亮LED DS2来模拟任务三:在变频泵工作时,我们根据输出的变频泵调速信号来调节管网压力,在试验中我们采用稳定性的概念,当变频泵调速信号很大时,我们就增大管网压力,从而使变频泵调速信号下降;当变频泵调速信号很小时,我们就减小管网压力,从而使变频泵调速信号上升。任务四:通过键盘实现时间调整和管网压力的设定,可以实现小时、分钟和压力的加减。2系统的总体设计方案2.1总体结构框图我们将该系统分成时钟、AD转换、DA转换、水泵控制和七段数码管显示五部分,总体结构框图如下:图1 总体结构图2.2 芯片选择我们选用DS1302芯片来产生系统时间,用ADC0809进行AD转换,用DAC0832来进行DA转换,用SN74HC573和ULN2803A驱动的七段数码管来实现显示功能,各模块通过单片机AT89C52来综合控制,水泵的开启用LED灯来实现,时间和压力的调整通过按键来实现,下面来介绍下芯片。2.2.1单片机AT89C52下面是其实物和引脚图 图2 单片机实物图和引脚图AT89C52是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。该单片机有4个IO口,其中P3口也可作为AT89C51的一些特殊功能口,具体功能如下P3.0 RXD(串行输入口)、P3.1 TXD(串行输出口)、P3.2 /INT0(外部中断0)、P3.3 /INT1(外部中断1)、P3.4 T0(记时器0外部输入)、P3.5 T1(记时器1外部输入)、P3.6 /WR(外部数据存储器写选通)、P3.7 /RD(外部数据存储器读选通)2.2.2 DS1302DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h8Dh,写时80h8Ch)是存放秒、分,小时、日、月、年、周数据的,存放的数据格式为BCD码形式,它的内部时间寄存器如下:表1 DS1302内部时间寄存器这张表呢是DS1302内部的7个与时间、日期有关的寄存器图和一个写保护寄存器,我们要做的就是将初始设置的时间、日期数据写入这几个寄存器,然后再不断地读取这几个寄存器来获取实时时间和日期。这几个寄存器的说明如下:1、秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当初始上电时该位置为1,时钟振荡器停止,DS1302处于低功耗状态;只有将秒寄存器的该位置改写为0时,时钟才能开始运行。2、小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是 ,当为1时,表示PM。在24小时模式时,位5是第二个10小时位3、控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。也就是说在电路上电的初始态WP是1,这时是不能改写上面任何一个时间寄存器的,只有首先将WP改写为0,才能进行其它寄存器的写操作。对DS1302进行操作的步骤如下:首先要通过8eH将写保护去掉,这样我们才能将日期,时间的初值写时各个寄存器,然后就可以对数码管缓存区进行初值的写入。同时也通过秒寄存器将位7的CH值改成0,这样DS1302就开始走时运行了,接着将写保护寄存器再写为80H,防止误改写寄存器的值。最后不断读取缓存区的值,将它们格式化后显示到数码管上。2.2.3 DAC0832DAC0832是采用CMOS工艺制成的单片直流输出型8位数/模转换器。它由倒T型R-2R电阻网络、模拟开关、运算放大器和参考电压VREF四大部分组成。输出的模拟量与输入的数字量成正比。2.2.4 ADC0809ADC0809对输入模拟量要求:信号单极性,电压范围是05V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路,ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。A,B和C为地址输入线,用于选通IN0IN7上的一路模拟量输入。通道选择表如下表所示。表2 ADC0809通道选择表CBA选择的通道000IN0001IN1010IN2011IN3100IN4101IN5110IN6111IN7数字量输出及控制线:11条 ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE1,输出转换得到的数据;OE0,输出数据线呈高阻状态。D7D0为数字量输出线。 ADC0809初始化时,使ST和OE信号全为低电平,是否转换完毕,我们根据EOC信号来判断,当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。工作时,首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 AD转换,之后EOC输出信号变低,指示转换正在进行。直到AD转换完成,EOC变为高电平,指示AD转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。2.3 系统硬件设计系统由主控芯片AT89C52、DS1302时钟电路、AD转换电路、DA转换电路、数码管显示电路和键盘电路构成系统硬件电路图如下:图3 无塔供水系统硬件电路图通过DS1302来产生系统时间,送到数码管显示,U8和U9模块分别实现AD和DA转换,从电路图上可以得到他们的地址分别为7FFF和BFFF,可以实现模拟压力的采集和输出,U5、 U4和U6是数码管的驱动电路,U5(段选通)和U4(位选通)的地址分别为DFFF和EFFF。P1.0到P1.2接受DS1302提供的数据时钟输入信号,P1.3到P1.4外接LED灯DS1、DS2和DS3,DS1用来表示变频泵的开启,DS2用来表示小流量泵的开启,用DS3的点亮来表示是否是夜间,五个开关S1、S2、S3、S4和S5分别与INT0、INT1、T0、T1和P1.6连接,这5个按键我们要实现调整功能。单片机的 P0.0到P0.7作为IO口与总线连接,进行数据传输。AD转换芯片的 EOC信号与单片机的P1.7连接。3程序设计流程及描述 由于系统的工作量比较大,所以我们把整个系统的软件部分分成五个模块:主程序模块、时间模块、AD转换模块、DA转换模块、水泵控制模块、压力调节模块和显示模块。31 软件函数介绍主函数有:main()、初始化时间到DS1302芯片函数set_time()、读取时间函数(把数据送到显示缓存区)read_time()、AD转换函数adc0809(ad)、DA转换函数(产生变频泵模拟控制信号)operate()、延时函数delay(int y)、判断是否处在变频泵工作区间函数panduan()、判断是否在夜间函数night()。时间模块有:DS1302初始化函数initial_ds1302()、从芯片中读取时间函数read_ds1302、开中断函数open_write_bit()、关中断函数close_write_bit()、读取时间函数(把数据送到显示缓存区)read_time、把缓存区的时间数据置入为系统时间函数set_time(),调整时间函数time_change(void) interrupt 0、调分钟函数minute()、调小时函数hour()。AD转换模块有:8通道AD转换函数adc0809(ad)。DA转换模块有:、DA转换函数(产生变频泵模拟控制信号) operate()。压力调节模块有:调压函数pressure_change(void) interrupt 2显示模块有:取段码函数get_code(unsigned char i)、显示函数display()。3.2 按键功能介绍主程序中,S5键定义为显示切换键,没按下时显示时间,按下后显示实时压力。在调时中断(INT0)子程序中,按S1键进入调节时间程序;S3定义为增键,S4定义为减键。S5键定义为功能键,没按时可以调分钟,第一次按下后可以调小时,第二次按下后可以退出调时程序转到主程序中。在调节分钟时,S3按下后分钟加一,S4按下分钟减一。在调节小时时,S3按下后小时加一,S4按下小时减一。在调管网设定压力(INT1)时,按S2键进入压力调节程序,S5定义为退出中断键。按下一次后退出中断,S3定义为压力增一键,S4定义为压力减一键。3.3 符号说明flag:调时功能标志位flash:闪烁标志位flags:变频泵标志位flags1:夜间标志位DS1:变频泵开启指示灯DS2:小流量泵开启指示灯DS3:夜间指示灯3.4 主程序介绍及流程图流程图如下:图4 主程序流程图在主程序中,定义了两个定时时间,一个为time0=2500us,用于正常的动态显示,另一个为time1=10000us,用于中断(调节时间、调节压力)时数码管进行闪烁。由于程序中用了三个中断INT0(调节时间)、INT1(调节管网压力)和T0(显示),我们要考虑中断优先级的问题,在调节时间和调节压力时数码管都要显示(执行T0中断),因而T0优先级应该是最高的,IP寄存器应该置入0X02。在取得系统时间后,我们通过函数panduan()来确定变频泵的开启,在变频泵工作区间,我们进行DA转换operate(),以输出用于控制变频泵调节的压力指示信号。通过函数night()来确定夜间指示灯的开启,在夜间时,通过判断管网实时压力与设定压力的大小来决定小流量泵的开启。由于在主程序中S5键用于切换管网压力和时间的显示,S5按下后显示压力,于是在按下S5键后我们要屏蔽那些用到时间数据的子程序,例如read_time()、panduan()和night(),以防止时间数据送入到数码管缓存区中覆盖压力数据,影响压力的显示,因而我们添加了相应的代码。对于压力显示部分,我们是这样设计的,外部压力信号为0时,AD输出为0X00,外部信号为5V时,AD输出为0XFF,量化值为5/255=0.0196,在程序中我们通过PA经ADC0809的通道IN6采集压力数据(函数信号发生器提供)的,采集后实时压力数字量存放在ad6里,那么实时压力q=ad6*0.0196,由于ADC0809和DAC0832的精度比较高,我们在数码管上显示的压力可以精确到小数点后两位,ad6和数码管缓存区数据都是char类型的,q是double类型的,由于数据类型的限制,我们不能直接q中分离压力的整数位、十分位和百分位,因而我们决定从ad6中将其分离出来,具体如下:例如模拟压力3.41对应的数字量ad6为174,我们先分离整数位的,1V对应的数字量为51,用ad6/51得到3,放在display_buffer5中,还剩下174-51*3=21,;0.1V对应的数字量是5.1,我们近似为5,21/5即得到十分位4,剩下21-5*4=1;0.01V对应的是0.5,则(1*10)/(0.5*10)=10/5=2,这样就得到了百分位。然后把相应的位送到数码管缓存区进行显示即可。对应的程序如下:display_buffer5=ad6/51; display_buffer3=(ad6-display_buffer5*51)/5; display_buffer2=(ad6*10-display_buffer5*10*51-display_buffer3*51)*10/51而display_buffer4中我们存放小数点数据16,在查段码函数中我们定义16对应的段码是0X40,用来显示“-”,这样3.41显示为3-413.5 系统时间(DS1302)产生程序介绍系统时间主要通过DS1302产生,置数时把秒、分、时数据通过IO送到0X80、0X82、0X84,读数据时分别从0X81、0X83、0X85读取秒、分、时数据。控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作,因而在close_write_bit()中,送0x8e后,把0x80送到控制寄存器中,以屏蔽对芯片的读写操作,在open_write_bit()中,送入0x8e后,把0x00送到控制寄存器中。DS1302的时序图如下:图5 DS1302时序图从上图可以看出,单字节写时:在进行操作之前先得将CE(也可说是RST)置高电平,然后单片机将控制字的位0放到I/O上,当I/O的数据稳定后,将SCLK置高电平,DS1302检测到SCLK的上升沿后就将I/O上的数据读取,然后单片机将SCLK置为低电平,再将控制字的位1放到I/O上,如此反复,将一个字节控制字的8个位传给DS1302。接下来就是传一个字节的数据给DS1302,当传完数据后,单片机将CE置为低电平,操作结束。单字节读操作的一开始写控制字的过程和上面的单字节写操作是一样,但是单字节读操作在写控制字的最后一个位,SCLK还在高电平时,DS1302就将数据放到I/O上,单片机将SCLK置为低电平后数据锁存,单机机就可以读取I/O上的数据。如此反复,将一个字节的数据读入单片机。读与写操作的不同就在于,写操作是在SCLK低电平时单片机将数据放到IO上,当SCLK上升沿时,DS1302读取。而读操作是在SCLK高电平时DS1302放数据到IO上,将SCLK置为低电平后,单片机就可从IO上读取数据,根据这些不难得到DS1302的时钟程序了,得到的时间直接送到display_buffer中,然后调用display()进行显示。3.6 按键调时程序介绍及流程图流程图如下:图6 调时程序流程图调时我们采用INT0中断程序,按下S1进入中断,我们定义了一个S5键,用flags记录它按下的次数,flags初始值为0,按一次后flags加一,当flags为3时清0,那么在一次调时中断中flags从0、1、2、0变化,我们采用散转程序,当flags为0时,转到调分钟程序,当flags为1时,转到调小时程序,当flags为2时跳出中断,然后将缓存区的数据置入到DS1302中,flags不为2时按照流程图一直循环。对于调分钟子程序,T0为増一键,T1为减一键,其流程图如下:图7 调分钟流程图对于调小时子程序,T0为増一键,T1为减一键,其流程图如下:图8 调小时程序流程图在调时程序中,为了区分与正常的显示,我们加了一个闪烁功能,在刚进入终端后将闪烁标志位flash置1,改变一下动态扫描的时间,变长一点,数码管则闪烁显示,在中断结束时将flash置0,使数码管正常显示。3.7按键调压程序介绍及流程图流程图如下:图9 调管网压力程序流程图为了简单,我们的管网压力只设计了6个值可调:0、1、2、3、4、5,闪烁功能跟时间调节一样,这里不再介绍。我们定义S5键为中断退出键,程序思路跟调时程序基本一样。3.8 AD转换、DA转换和变频泵控制信号AD转换将电压模拟量量化后变成数字量,DA转换正好与之相反,我们在考虑变频泵的输出控制信号时,从稳定的观点出发,当控制信号比较大时,我们就要增加压力值,压力值的增加要使控制信号变小;当控制信号比较小时,我们就要减少压力值,压力值的减少会使控制信号变大,最终可以是压力值稳定在一个正常工作的状态。为了达到这一目的,我们先在AD转换得到的数字量存放在char类型数据ad6中,然后定义out=0xFF-ad6,将out中的数据送到DA转换芯片就得到变频泵的模拟输出控制信号,这样当管网压力输入为0时,输出控制信号比较大,当管网压力输入为5V时,输出信号比较小,刚好可以实现“管网压力小,控制信号大;管网压力大,控制信号小”的逻辑关系。3.8 变频泵及夜间工作区间判断程序介绍及流程图变频泵判断程序流程图如下:图10 变频泵工作区间判断程序流程图程序如下:unsigned char panduan() unsigned int data f,s,t; unsigned char data i=0; int fflags=0; f=display_buffer3*10+display_buffer2; s=display_buffer5*10+display_buffer4; t=s*100+f; while(fflags!=1)&(i=timei&t=timei+1) fflags=1; i=i+2; return fflags;在这里,我们先定义一个整型数组time6=630,830,1130,1330,1730,2030,我们的思路是先把时间处理下,例如06点15分,我们先把小时和分钟数据转换成10进制,然后将小时数据乘100后加上分钟数据,6:15变成615,然后与timei和timei+1比较,i=0,2,4;如果在这个时间段就将变频泵标志位fflags置1,点亮变频泵。3.9 显示程序介绍显示程序我们采用动态显示,某一时刻只有一个数码管工作,也就是所谓的分时显示,通过定时器0每2.5ms点亮一个数码管,通过送不同的位码,选通不同的数码管,4个数码管的位码依次是0x01、0x02、0x04和0x08,数码管被选通后,送入相应的段码完成一次显示,虽然每个时刻只点亮一个数码管,但间隔时间很短,由于视觉暂留,在我们看起来8个数码管同时被点亮的,这就是动态显示的原理具体程序见附录。4调试中遇到的问题在本次实验中我们遇到了不少问题,首先是硬件的问题,我们把日历电路弄好后发现数码管没有显示,最后仔细的对照了电路图和实验板,发现时DS1302的4管脚(GND)没有接地,我们将其接地后数码管后正常显示,估计也是老师给我们的一个考验吧。在DA转换中,我们起先采用滑动变阻器经INT3通道采集压力数据,但接调试器后滑动变阻器被压在最下面,调节不方便,因而我们用函数信号发生器经INT6通道送入外部压力信号,可以实现压力的连续可调。我们想利用S5键用于切换管网压力和时间的显示,S5按下后显示压力,但编写好程序后,发现数码管显示很混乱,有时显示时间,有时是显示压力,我们猜想可能是按下S5键显示压力时,时间数据送入了数码管缓存区,覆盖了压力数据,导致错误显示,因而,我们在S5键按下后的程序段屏蔽了一些用到时间数据的程序如:read_time()、panduan()和night(),以防止时间数据送入到数码管缓存区中覆盖压力数据,影响压力的显示,修改后正常显示了。在刚开始编写调时程序时,我们对中断理解的不够深刻,没有设置中断优先级,进入调时中断后(INT0),数码管没有正常显示,经过仔细的思考,我们设置了一个优先级,让TO中断优先级最高,以打断INT0的中断,修改后在INT0中断数码管正常显示了。 5结束语通过几周的程序调试,我们改正了不少错误,实现了所要求的所有功能,在变频泵工作区间,我们用示波器测定了变频泵模拟电压控制量的输出,发现:当输入管网压力很小时,控制信号很大,输入管网压力很大时,控制信号很小,当增大管网压力时,控制信号变小,而减少管网压力时,控制信号变大。在实物演示时,当时间在区间(6:308:30, 11:3013:30,17:3020:30)时,二极管DS1(变频泵)被点亮,此时可以检测到变频泵控制信号,在06:30时,点亮夜间指示灯DS3,在夜间,如果管网实时压力小于设定压力,则点亮二极管DS2(小流量泵),而且可以正常的调整时间和管网设定压力,达到了预期的目标。在这次电子系统设计之前,我们对单片机相关知识了解很少,在实验过程中,我们遇到了不少问题,得到了王建校老师、张红老师和金印彬老师的耐心指导,为我们解决了不少问题,在这里向你们表示感谢。参考文献:1 王建校,杨建国,宁改娣,危建国。51系列单片机及C51程序设计,科学出版社,20022 王建校,张虹,金印彬。电子系统设计与实践实验指导书,西安交通大学电气工程学院电工电子教学实验中心3 王建校,张虹,金印彬。电子系统设计与实践。高等教育出版社,2008附录:无塔供水系统源程序#include #include #include #include #define SEGMENT XBYTE0xDFFF /段码寄存器地址#define BIT_LED XBYTE0xEFFF /位码寄存器#define DAC XBYTE0xBFFF /DAC0832地址#define ADC XBYTE0X7FFF /ADC0809地址#define fosc 11.0592 /晶振频率#define time02500 /定时2500uS#define time1 10000static unsigned char idata ad8; /定义数据存储区 unsigned int data time6=630,830,1130,1330,1730,2030; /定义一个时间区间数组unsigned char data yali=5; /压力设定值初始化unsigned char data display_bit,display_buffer8; /缓存区显示数组unsigned char data time0_h,time0_l,time1_h,time1_l;unsigned int idata time0_times,time1_times;unsigned char get_code(unsigned char i); /取段码函数void display(void); /数码管显示函数unsigned int flag=0; /调时功能键标志位置为0unsigned int flash=0; /闪烁标志位,进入中断后置1/ds1302变量及函数定义开始sbit SCL_DS1302 =P10; sbit IO_DS1302 =P11;sbit RST_DS1302 =P12;sbit DS1=P13; /DS1定义为变频泵sbit DS2=P14; /DS2定义为小流量泵sbit DS3=P15; /DS3定义为夜间泵sbit S5=P16; /功能键sbit ad_busy=P17; /AD转换完成查询端口EOCunsigned char bdata data_ds1302; sbit bit_data0=data_ds13020; sbit bit_data7=data_ds13027; unsigned char bdata x;sbit x0=x0;sbit x7=x7;void initial_ds1302();unsigned char read_ds1302(char command);void open_write_bit();void close_write_bit();void read_time();void set_time();/功能函数void delay(int y); /延时函数unsigned char panduan(); /判定是否在变频泵工作区间unsigned char night(); /判定是否在0:00-6:30之间,开启夜间指示void adc0809(unsigned char idata*x); /AC转换函数void operate(); /对输入函数进行处理,并赋予到输出函数void minute(void); void hour(void);/ds1302变量及函数定义结束void main() char flags=0;char flags1=0;double q; BIT_LED=0; DS1=1;DS2=1;DS3=1;TMOD=0X01; / 定时器0 方式1time0_times=65536-time0*fosc/12;time0_h =(time0_times/256 );time0_l =(time0_times%256);time1_times=65536-time1*fosc/12;time1_h =(time1_times/256 );time1_l =(time1_times%256);TH0=time0_h;TL0=time0_l; /高8位和低8位时间常数IP=0X02; /设置为定时中断的优先级最高IT0=1; TR0=EA=ET0=EX0=EX1=1;initial_ds1302(); /上电启用,否则不走时display_bit=0x01; display_buffer0=0X00;display_buffer1=0X00;display_buffer2=0X00;display_buffer3=0X00;display_buffer4=0X02; display_buffer5=0X01; /将06时00分00秒设置为当前时间set_time(); /将数组中的时间置入DS1302do if(S5=1) /我们定义S5为压力显示切换键,按S5后屏蔽下面语句read_time(); adc0809(ad); /ad转换if(S5=1)flags=panduan(); /判断是否在变频泵工作区间 if(flags=1) DS1=0;DS2=1;DS3=1;operate();delay(10000); else /如果不是在变频泵开启区间,则判断是否处在夜间 DS1=1; /关变频泵 if(S5=1) flags1=night(); /判断是否处在夜间 if(flags1=1) DS3=0; q=ad6*0.0196; /0.0196=5/255。数字量转换成模拟量 if(qyali) /如果当前压力小于设定压力,则点亮小流量泵 DS2=0; else DS2=1; else /都不是则三个灯关闭 DS1=1;DS2=1;DS3=1; if(S5=0) /S5按键按下后显示当前压力 delay(20000); display_buffer5=ad6/51; /分离当前压力整数位(我们定义压力从05)display_buffer3=(ad6-display_buffer5*51)/5; /分离当前压力的小数点后第一位 display_buffer2=(ad6*10-display_buffer5*10*51-display_buffer3*51)*10/51; /分离小数点后第二位 display_buffer4=16; /送入字符-来代替小数点 while(1);void tiaoshi(void) interrupt 0 /调时中断服务子程序flash=1; /调时闪烁标志位,开始闪烁doif(S5=0) delay(20000); /延时去抖 if(S5=0) delay(20000); flag+; /S5在中断里定义为功能键,没按下调分钟,按下一次调小时,按下第二次退出中断if(flag=3)flag=0;set_time();elseif(flag=0) /S5没按下则调分钟minute();else if(flag=1) /S5按下一次调小时hour(); while(flag!=2);if(flag=2)flag=0;set_time();read_time();flash=0; /闪烁标志位置0,停止闪烁void minute(void) /调分钟子程序if(T0=0) delay(20000); if(T0=0) /T0为分钟加功能键 delay

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论