水质监测系统.doc
《水质监测系统.doc》由会员分享,可在线阅读,更多相关《水质监测系统.doc(29页珍藏版)》请在冰点文库上搜索。
赣南师范学院
水质自动监测系统的设计
学院:
物理与电子信息工程学院
专业班级:
08电子信息工程
成员姓名:
李勇杨琰赖兴君
张细平张冬冬占玲玲
指导老师:
许粮管立新
2010年月日
摘要
水质监测系统主要是用于对水质的检测,这样的系统在我们的生活中得到广泛的运用,比如我们的自来水厂就有很多这样的系统。
而目前使用的水质监测系统主要是通过工业电供电,价格也比较昂贵。
所以本次设计的新颖点在于太阳能供电以及和手机,电脑进行信息的交流。
本次水质监测系统的设计主要是利用单片机和GSM模块来达到对水质的监测。
对水质主要的监测指标有:
PH,水位,温度,清晰度等。
通过单片机对水中这些指标的检测之后,通过GSM模块把检测到的信息发送到手机以及电脑上进行存档,可以根据存档的信息可以判断出水质的好坏。
从而做出相应的措施。
本系统的优点具有节能,环保,电路简单等。
关键词:
水质,GSM,水质监测
第一章绪论
1.1课题背景
本课题的背景是基于江西省鄱阳湖生态经济区的建设。
鄱阳湖经济区的建设是江西省的重要规划。
它以江西鄱阳湖为核心,以鄱阳湖城市圈为依托,以保护生态、发展经济为重要战略构想,把鄱阳湖生态经济区建设成为全国生态文明与经济社会发展协调统一、人与自然和谐相处的生态经济示范区和中国低碳经济发展先行区。
国务院已于2009年12月12日正式批复《鄱阳湖生态经济区规划》,标志着建设鄱阳湖生态经济区正式上升为国家战略。
这也是新中国成立以来,江西省第一个纳入为国家战略的区域性发展规划,是江西发展史上的重大里程碑,对实现江西崛起新跨越具有重大而深远的意义。
所以针对这种情况,鄱阳湖水质的质量就很重要,因为这影响到周围居民的健康饮水。
于是我们选择这个课题用于研究鄱阳湖水质的变化。
用相应的传感器定时检测指定水域中水的PH值和清晰度等水质状况,将检测得到的数据通过无线通讯的方式传送到水质监测中心,可以知道鄱阳湖水质的好坏。
同时本系统也可以用于检测其它区域的地表水、地下水以及饮用水的水质状况等。
具有一定的实用价值。
1.2水质自动监测系统的介绍
本系统是实现水质无人自动监测功能。
该系统可以分为三个部分:
第一是太阳能供电部分;第二是水质数据采集处理部分;第三是无线数据发送接收部分。
第一个部分用太阳能提供系统的电源,既可避免每次更换电池的麻烦,又可以利用自然界充足的太阳能,起到了节能以及环保的效果,符合现代开发新能源的思路。
第二个部分采集数据系统。
第三个部分的无线通讯,将数据采集系统采集的数据编码转换后通过无线通信系统发送到监测中心。
并且可以在电脑上做成一个表格,把每一天发送过来的数据记录下来,用于对比和观察。
这样不用人工去记录数据,可以方便的显示出准确的水质数据以减轻工作人员的工作强度。
通过本系统测出的数据可以较客观的反映水质的情况。
从总体来看,本系统的创新性和先进性体现在利用了太阳能供电以及数据的无线发送和接收。
第二章系统功能的介绍
2.1系统框架
本系统分为三个部分:
第一是太阳能供电部分;第二是水质数据采集处理部分;第三是无线数据发送接收部分。
第一个部分用太阳能提供系统的电源,既可避免每次更换电池的麻烦,又可以利用自然界充足的太阳能,起到了节能以及环保的效果,符合现代开发新能源的思路。
第二个部分采集数据系统。
第三个部分的无线通讯,将数据采集系统采集的数据编码转换后通过无线通信系统发送到监测中心。
根据以上的描述,可得系统的框架图如下:
图1
2.2太阳能电源部分的设计
2.2.1太阳能电源的原理
我们这个系统利用太阳能供电,主要是利用太阳能电池的原理。
太阳能电池是通过光电效应或者光化学效应直接把光能转化成电能的装置。
它的原理是:
太阳光照在半导体p-n结上,形成新的空穴-电子对,在p-n结电场的作用下,空穴由n区流向p区,电子由p区流向n区,接通电路后就形成电流。
这就是太阳能电池的工作原理。
太阳能发电方式太阳能发电有两种方式,一种是光—热—电转换方式,另一种是光—电直接转换方式。
而太阳能电池是一种直接把光转换为电的装置。
这是利用了光电效应,将太阳辐射能直接转换成电能。
太阳能电池是一种由于光生伏特效应而将太阳光能直接转化为电能的器件,是一个半导体光电二极管,当太阳光照到光电二极管上时,光电二极管就会把太阳的光能变成电能,产生电流。
当许多个电池串联或并联起来就可以成为有比较大的输出功率的太阳能电池方阵了。
太阳能电池是一种大有前途的新型电源,具有永久性、清洁性和灵活性三大优点.太阳能电池寿命长,只要太阳存在,太阳能电池就可以一次投资而长期使用。
2.2.2太阳能电池的电路图
太阳能电池的原理电路图如下:
图2
2.3单片机数据处理部分
2.3.1STC89C52RC的介绍
(1)主要功能
STC89C52RC是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元。
STC89C52RC有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,STC89C52RC可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
(2)功能特性
·兼容MCS51指令系统8k可反复擦写(>1000次)FlashROM
·32个双向I/O口256x8bit内部RAM
·3个16位可编程定时/计数器中断时钟频率0-24MHz
·2个串行中断可编程UART串行通道
·2个外部中断源共8个中断源
·2个读写中断口线
·低功耗空闲和掉电模式软件设置睡眠和唤醒功能
(3)引脚图
图3
(4)引脚介绍
STC89C52RC的40个引脚,从功能上来看可分为下面三个部分:
①电源和时钟引脚
·Vcc:
电源端
·GND:
接地端
·XTAL1:
振荡反相放大器及内部时钟发生器的输入端
·XTAL2:
振荡反相放大器的输出端
②控制线或其他电源的复用引脚
·RET:
复位输入端
·ALE/PROG:
外部扩展电路低字节地址允许锁存和EPROM编程输入端
·PSEN(低电平有效):
程序存储器外部取指控制信号
·EA/Vpp:
外部访问允许端和12V的编程允许电源
③输入/输出引脚
·P0:
8位漏极开路双向I/O口。
外接存储器时,作为扩展电路低8位的地址和总线复用口
·P1:
8位具有内部提升电阻的双向I/O口
·P2:
8位具有内部提升电阻的双向I/O口。
外接扩展电路高8位地址线
·P3:
8位具有内部提升电阻的双向I/O口,P3口除了作为一般的I/O口外,更重要的是它的第二功能。
2.3.2水温测量的设计
(1)水温测量的原理
水温的测量可以用温度传感器,温度传感器有数字信号输出和模拟信号输出两种。
而我们这次设计所用的温度传感器是数字信号输出的。
这种温度传感器是DS18B20,DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
DS18B20的管脚排列如下图:
图4
从上面的图4可以看出,DS18B20只有三个引脚,它只需要一个数据线就可以完成与单片机的双向通讯,其测量温度的范围为温范围-55℃~+125℃,可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。
DS18B20所测得温度与温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
DS18B20测温原理如图5所示。
图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。
高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。
计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。
图3中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
图5DS18B20测温原理框图
(2)DS18B20与单片机连接的电路图
因为DS18B20“一线总线”接口的温度传感器,所以只需要使用单片机的一个IO口就可以实现与DS18B20的双向通信,这里我们用得IO口是P1.4,用P1.4口去实现与DS18B20的通信。
温度值由P1.4传入到单片机,单片机再经过处理后发送到液晶显示和手机以及电脑上。
图6
(3)驱动DS18B20的程序
DS18B20温度传感器的驱动程序如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P1^4;
ucharpanduan;
voiddelay1(uintcount)//delay
{
uinti;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
voidrestds1820(void)//sendresetandinitializationcommand
{
uinti;
DQ=0;
i=103;
while(i>0)i--;
DQ=1;
delay1(200);
}
函数名:
向ds18b20写一个字节的数据
voidwritebyte(uchardat)//writeabytetods18b20
{
//uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
writebit(testb);
}
}
*
函数名:
向ds18b20写一个位的数据
voidwritebit(charbits)
{
uinti;
if(bits)//write1
{
DQ=0;
i++;i++;
DQ=1;
i=8;while(i>0)i--;
}
else
{
DQ=0;//write0
i=8;while(i>0)i--;
DQ=1;
i++;i++;
}
delay1
(2);
}
函数名:
向ds18b20读一个位的数据
bittmpreadbit(void)//readabit
{
uinti;
bitdat;
DQ=0;i++;//i++fordelay
DQ=1;i++;i++;
dat=DQ;
i=8;while(i>0)i--;
delay1
(2);
return(dat);
}
函数名:
向ds18b20读一个字节的数据
ucharreadbyte(void)//readabytedate
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
函数名:
控制转换,读出温度
uinttem()//DS18B20beginchange
{
uintTemp;//
ucharget[10],k,H,L;
restds1820();//dsreset();
delay1
(1);
delay1(10);
writebyte(0xcc);
writebyte(0x44);
delay1(15);
restds1820();
delay1(11);
writebyte(0xcc);
writebyte(0xbe);
for(k=0;k<2;k++)
{
get[k]=readbyte();
}
H=get[1];
L=get[0];
Temp=H*256+L;
panduan=(Temp&0xf000)==0xf000;
if(panduan)
{
A_Temp=(-1)*Temp/16;
}
elseA_Temp=Temp/16;
return(A_Temp);
}
2.3.3PH测量的设计
(1)PH测量的原理
PH是溶液中氢离子浓度的负对数,用来表示溶液的酸碱性。
湖水中水的PH值从一定的程度上反映了水质的好坏。
因为水中的PH值可以体现出水中的酸碱度。
PH值越大,碱性越强,PH值越小,酸性越强,PH值等于7左右为中性。
水中的PH对于生活在水中的动植物有着重要的影响。
它就是水产养殖的晴雨表。
PH的测量主要是测量水中H+和OH-的含量。
当水中的H+大于OH-,则水是酸性(PH小于7);当水中的H+小于OH-,则水是碱性(PH值大于7);当水中的H+等于OH-,则水是中性(PH值等于7)。
但是总的来说,水中的PH值主要是由水中的氢离子数量的多寡,决定了水的PH值。
PH测量可以用PH电极进行测量,其中PH电极是利用了原电池的原理,就是电极内有参比电极和测量电极,四复合电极里有温度补偿和溶液接地。
它的基本原理是使化学反应能量转化成为电能。
此电池的电压称为电动势(EMF),此电势由两个半电池构成,其中一个半电池称作测量电极,它的电位与特定的离子活度有关;另一个半电池为参比半电池,通常称作参比电极,它是一般与测量溶液相通,并且与测量溶液仪表相连。
(2)PH测量的电路图
(3)PH测量的程序
2.3.4浑浊度的测量
(一)浑浊度测量的原理
浑浊度为水样光学性质的一种表达语,是由于水中存在不溶性物质引起的,它使光散射和吸收,而不是直线透过水样。
它是反映天然水和饮用水的物理性状的一项指标,用以表示水的清澈或浑浊程度,是衡量水质良好程度的重要指标之一。
目前我国测定水的浑浊度有以下方法:
(1)透射式(包括分光光度计与目视法):
根据朗伯一比尔定律,以透过光的强度来确定水样的浑浊度,水样浑浊度与透光率的负对数呈线性关系,浑浊度越高,透光率越小。
但受到天然水中存在的黄色的干扰,湖泊、水库水还因含有藻类等有机吸光物质,对测定也有干扰。
选用680rim波长,可避免黄色和绿色的干扰。
(2)散射浊度仪:
根据瑞利(Rayleigh)公式(Ir/Io=KD,h为散射光强度,10为人射光强度),测定某一角度上的散射光的强度,以达到测定水样浑浊度的目的。
当入射光被粒径为人射光波长1/15~l/20的颗粒物所散射,强度符合瑞利公式,粒径大于l/2入射光波长的颗粒对光进行反射。
这两种情况均可用Ir∝D来表示,一般采用90度角的光作为特征光来测定浑浊度。
(3)散射-透射式浊度仪:
应用Ir/It=KD或Ir/(Ir+It)=KD(Ir为散射光
强度,It为透射光强度),测定透射光和反射光的强度之和,来对样品浑浊度进行测定。
因同时测定了透射和散射光的强度,所以在入射光强度相同的情况下具有较高的灵敏度。
根据以上三种方法的叙述,利用它们当中的原理,我们在本系统中测浑浊度的方法是利用光敏三极管和红外发光二极管。
测量的时候让液体处于光敏三极管和红外发光二极管中间。
根据光敏三极管输出的电压大小可以判断出其水质的浑浊度。
因为如果水中的杂质很多,则光敏三极管接收到的红外线就少,则其输出的电压就会变小,而如果水中的杂质少,则光敏三极管接收到的光线强,其输出的电压信号也更强,从而可以体现出其水的浑浊度。
(二)浑浊度测量电路
根据其原理的描述,我们可以得到如下的电路图:
图8浑浊度检测电路
从图中我们可以看到,在光敏三极管的发射机我们把其转化为电压信号进行输出,然后再经过ADC转换电路将其送至单片机中。
这样就可以完成浑浊度的测量。
具体的框架如下图:
图9
2.3.5水位的测量
(1)水位测量的原理
本系统水位的测量是用超声波测距器。
超声波测距器的设计比较方便,计算处理也比较简单,并且测量结果比较精确。
超声波测距器系统的设计框图如下:
图10
超声波系统设计的硬件电路可以分为单片机系统及显示电路,超声波发射电路和超声波接收电路三个部分。
其中单片机系统和显示电路部分与温度,PH浑浊度共用。
重点介绍超声波发射电路和超声波检测接收电路。
超声波发射电路的原理图如下图:
图11
从图11中可以看出,发射电路主要是由反相器74ls04输出高电平和超声波换能器构成,单片机的P1.0端口输出的40KHz方波信号一路经过一级反向器后送到超声波的一个电极,另一路经过两级反向器后发送到超声波换能器的另一个电极,用这种推挽形式将方波信号加到超声波换能器两端可以提高超声波的发射强度。
输出端采用两个反相器并联,用于提高驱动能力。
超声波检测接收电路的电路图如下:
图12
集成电路CX20106A是一种红外线接收的专用芯片,常用于电视机红外接收器。
考虑到红外遥控器常用的频率是38KHz与测距的超声波频率40KHz接近,可以利用它制作超声波测试接收电路。
(2)水位测试的程序
主函数程序首先对系统环境初始化,设置定时器T0工作模式为16位定时器模式,置位总中断允许位EA并将显示端口P0和P2清0.然后有超声波发生子程序送出一个超声波脉冲,为了避免超声波从发射器直接传送到接收器引起的直射波触发,需要延时约为0.1ms后才打开外部中断0接收返回的超声波信号。
由于采用的是12MHz的晶振,计数器每一个数就是1us,当主程序检测到接收成功的标志位后,将T0中的数按照式子1-1计算,即可得被测物体与测距器之间的距离,设计时间取20℃时的声速344m/s,则有:
d=(v×t)/2=172T/10000cm(1-1)
其中:
T为计数器T0的计数值。
测出的结果后将以十进制BCD码方式送往LED显示约为0.5S,然后再发送超声波脉冲重复测量过程。
由以上的描述可以得到主程序的流程图如下:
图13
(3)用C编写的程序如下:
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
ucharcodeled_mod[]={0x0c,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
ucharcodeled_bit[]={0x01,0x02,0x04,0x08};
uchardispram[4];
uchartestok;
ulongtime;
externvoidcs_t(void);
voidinit(void)
{
P0=0xff;
P2=0xff;
TMOD=0x01;
EA=1;
}
voidcs_r(void)interrupt0 //超声接收子程序
{
TR0=0;
EX0=0;
ET0=0;
testok=1;
}
voidovertime(void)interrupt1 //超时清除子程序
{
EX0=0;
TR0=0;
ET0=0;
testok=2;
}
voiddelay01Ms(void) //0.1ms延时子程序
{
#pragmaasm
MOV R7,#01H
DEL:
MOV R6,#30H
DJNZ R6,$
DJNZ R7,DEL
#pragmaendasm
return;
}
voiddelay1Ms(uintt) //1ms延时子程序
{
uintx,y;
for(x=t;x>0;x--)
for(y=0;y<122;y++);
}
voiddisplay(void) //4位共阳LED动态扫描显示程序
{
ucharj;
for(j=0;j<4;j++)
{
P2=led_bit[j];
P0=led_mod[dispram[j]];
delay1Ms(5);
}
}
voidjisuan(void) //计时及计算子程序
{
if(testok==1)
{
time=(TH0<<8)|TL0;
time=time*172;
time=time/10000;
dispram[0]=(uchar)(time%10);
time=time/10;
dispram[1]=(uchar)(time%10);
time/=10;
dispram[2]=(uchar)(time%10);
dispram[3]=(uchar)(time/10);
if(dispram[3]==0)
dispram[3]=10;
}
else
{
dispram[0]=10;
dispram[1]=10;
dispram[2]=10;
dispram[3]=10;
}
}
voidmain() //主函数
{
init();
while
(1)
{
cs_t();
delay01Ms();
testok=0;
EX0=1;
ET0=1;