电子设计竞赛P题简易水情检测系统.docx
《电子设计竞赛P题简易水情检测系统.docx》由会员分享,可在线阅读,更多相关《电子设计竞赛P题简易水情检测系统.docx(21页珍藏版)》请在冰点文库上搜索。
电子设计竞赛P题简易水情检测系统
2017年全国大学生电子设计竞赛
简易水情监测系统(P题)
2017年8月12日
摘要
水是生命之源,我们在日常生活中所要饮用的水的Ph值应在6.5—8.5之间,Ph值的标准是以氢离子的标准定位的,小于7的是显酸性的,大于7的是显碱性的,直饮水的标准刚好显中性,但是看上去同样都是无色无味的各种水的Ph值其实是有很大差异的,对人体健康的影响也完全不同。
本课题要设计的容器中液体高度、液体Ph值和测量供电电池组的输出电压,并在液晶显示器上显示所测量的数据。
从而可以直接的看出容器中的水位高度,液体Ph值,供电电池组的输出电压。
本次设计以STC89C52RC芯片组为核心,辅以相关外围电路,本设计以单片机为核心的水情检测系统,系统由6V电池组供电,除单片机外,采用杜邦线来连接LCD12864液晶显示器、PCF8591模块、液位传感器,Ph值传感器。
本系统可直接用于水库、池塘、河流等,进行Ph值得测量和水位的检测。
关键词:
液体高度;液体Ph值;输出电压;单片机STC89C52RC
简易水情监测系统(P题)
【专科组】
一、系统方案
本系统主要由STC89C52RC芯片组为核心、PCF8591模块、液位传感器模块、Ph值传感器模块、6V电池组供电组成,下面分别论证这几个模块的选择。
1、方案的论证与选择
方案一:
由STC89C52RC芯片组为核心、PCF8591模块、重力传感器模块、Ph值传感器模块、6V电池组供电组成,
方案二:
由STC89C52RC芯片组为核心、PCF8591模块、超声破传感器模块、Ph值传感器模块、6V电池组供电组成,
方案三:
由STC89C52RC芯片组为核心、PCF8591模块、液位传感器模块、Ph值传感器模块、6V电池组供电组成,
分析方案一,使用重力传感器,但重力传感器不能在水库,河流等复杂地区使用,只能用于实验阶段,所以放弃方案一。
分析方案二,使用超声波传感器,超声波传感器在水库,河流等复杂地区不好固定,所以方案二也不考虑。
方案三使用液位传感器模块,方便参赛使用,最后选择方案三。
二、系统理论分析与计算
1、系统理论的分析
(1)LCD12864显示器
LCD12864显示器显示原理,12864LCD显示块是所说的点阵液晶显示模块,就是由128*64个液晶显示点组成的一个128列*64行的阵列,所以也就叫成了12864。
每个显示点都对应着有一位二进制数,0表示灭,1表示亮。
存储这些点阵信息的RAM被称为显示数据存储器。
如果要显示某个图形或汉字就是将相应的点阵信息写入到对应的存储单元中。
图形或汉字的点阵信息是由自己设计,这时候问题的关键是显示点在液晶屏上的位置与其在存储器中的地址之间的关系。
显示点在64*64液晶屏上的位置由列号(line,0~63)与行号(line,0~63)确定。
512*8bitsRAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。
每个存储单元存储8个液晶点的显示信息。
由于多数液晶显示模块的驱动电路是由一片行驱动器和两片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8bits显示数据RAM。
左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。
(少数厂商为了简化用户设计,在模块中增加译码电路,使得128*64液晶屏就是一个整屏,只需一个片选信号。
)
如如果点亮12864的屏中(20,30)位置上的液晶点,因列地址30小于64,该点在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,该点在RAM中页地址为2,在字节中的序号为4;所以将二进制数据00010000(也可能是00001000,高低顺序取决于制造商)写入Xpage=2,Yaddress=29的存储单元中即点亮(20,30)上的液晶点。
这是为了为了使液晶点位置信息与存储地址的对应关系更直观关,将64*64液晶屏从上至下8等分为8个显示块,每块包括8行*64列个点阵。
每列中的8行点阵信息构成一个8bits二进制数,存储在一个存储单元中。
(需要注意:
二进制的高低有效位顺序与行号对应关系因不同商家而不同)存放一个显示块的RAM区称为存储页。
即64*64液晶屏的点阵信息存储在8个存储页中,每页64个字节,每个字节存储一列(8行)点阵信息。
因此存储单元地址包括列地址(Yaddress,0~63)和页地址(Xpage,0~7)。
(2)水位传感器
水位传感器工作原理,用静压测量原理:
当液位变送器投入到被测液体中某一深度时,传感器迎液面受到的压力公式为:
Ρ=ρ.g.H+Po式中:
P:
变送器迎液面所受压力
ρ:
被测液体密度
g:
当地重力加速度
Po:
液面上大气压
H:
变送器投入液体的深度
同时,通过导气不锈钢将液体的压力引入到传感器的正压腔,再将液面上的大气压Po与传感器的负压腔相连,以抵消传感器背面的Po,
使传感器测得压力为:
ρ.g.H,显然,通过测取压力P,可以得到液位深度。
功能特点:
稳定性好,满度、零位长期稳定性可达0.1%FS/年。
在补偿温度0~70℃范围内,温度飘移低于0.1%FS,在整个允许工作温度范围内低于0.3%FS。
具有反向保护、限流保护电路,在安装时正负极接反不会损坏变送器,异常时送器会自动限流在35MA以内。
固态结构,无可动部件,高可靠性,使用寿命长。
安装方便、结构简单、经济耐用。
(3)Ph值测量
Ph值传感器工作原理,在传感器内部的pH放大器是一个能通过数据采集器监测的有标准pH电极的电路。
传感器连接线的末端是一个BTA插头或一个5-针的DIN插头来与数据采集器连接。
在pH7的缓冲溶液中,它将产生一个1.75伏特的电压。
pH值每增加1,电压增加0.25伏。
pH值每减少1,电压降低0.25伏。
这个冻胶填充的pH值传感器的设计测量范围为:
0到14。
它在玻璃感应电极头延长出一个冻胶体,是初中、高中、大学中进行科学研究、环境测量的良好的设备。
冻胶填充的参考半电化池是密封的,所以它无需重充。
(4)电池组
干电池属于化学电源中的原电池,是一种一次性电池,它碳棒以为正极,以锌筒为负极,把化学能转变为电能供给外电路。
在化学反应中由于锌比锰活泼,锌失去电子被氧化,锰得到电子被还原。
普通干电池大都是锰锌电池,中间是正极碳棒,外包石墨和二氧化锰的混合物,再外是一层纤维网.网上涂有很厚的电解质糊,其构成是氯化氨溶液和淀粉,另有少量防腐剂.最外层是金属锌皮做的筒,也就是负极,电池放电就是氯化氨与锌的电解反应,释放出的电荷由石墨传导给正极碳棒,锌的电解反应是会释放氢气的,这气体是会增加电池内阻的,而和石墨相混的二氧化锰就是用来吸收氢气的.但若电池连续工作或是用的太久,二氧化锰就来不及或已近饱和没能力再吸收了,此时电池就会因内阻太大而输出电流太小而失去作用.但此时若将电池加热,或放置一段时间,它内部的聚集氢气就会受热放出或缓慢放出.二氧化锰也到了还原恢复,那电池就又有活力了!
虽然干电池的应用范围这么广,在使用完后若不妥善处理好,它对环境也会造成不可挽回的污染,一节电池可能会污染数十立方米的水。
因此在使用完干电池后,一定要将电池进行回收,而不能随处弄丢。
2、水位高度的计算
由于本次使用的水位传感器量程有限,故以容器150mm高度线做为0刻度线,水位传感器检测数据+150mm为最终结果,具体高度以12864液晶显示屏显示为准。
3、Ph值的计算
在pH7的缓冲溶液中,它将产生一个1.75伏特的电压。
pH值每增加1,电压增加0.25伏。
pH值每减少1,电压降低0.25伏。
4、供电电池组电压的计算
本次电池组由4节干电池组成,电压为6V,因部分元器件最高工作电压为5V,故使用1K电阻对其进行分压,使其最后输出电压降为5V。
三、电路与程序设计
1、电路的设计
(1)系统总体框图
系统总体框图如图所示
系统总体框图
(2)水位检测子系统框图
1、水位检测子系统框图
水位检测子系统框图
(3)PH检测子系统框图
1、PH检测子系统框图
PH检测子系统框图
2、程序的设计
(1)程序功能描述与设计思路
1、程序功能描述
根据题目要求软件部分主要实现键盘的设置和显示。
1)键盘实现功能:
设置频率值、频段、电压值以及设置输出信号类型。
2)显示部分:
显示电压值、频段、步进值、信号类型、频率。
2、程序设计思路
(2)程序流程图
1、主程序流程图
2、水位检测子程序流程图
3、PH检测子程序流程图
4、电压检测子程序流程图
四、测试方案与测试结果
1、测试方案
(1)硬件测试
搭建基本框架,将各个模块连接在STC89C52单片机上。
(2)软件仿真测试
根据题目要求,用ISIS仿真软件画出原理图,进行仿真。
(3)硬件软件联调
将总程序录在STC89C52单片机芯片中,把所有需要的元器件都接在系统上,测试各部分功能。
2、测试条件与仪器
测试条件:
检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。
测试仪器:
水位传感器、PH传感器、钢尺、PH试纸、万用表。
3、测试结果及分析
(1)测试结果
经PH计和PH试纸、钢尺、和万用表检测结果与水位、PH、电压传感器检测结果的对比,误差均没有超过题目要求的最大允许误差。
(2)测试分析与结论
根据测试数据,可以得出以下结论:
1、加入液体后,在1分钟内可以完成水位测量并显示,误差小于5mm。
2、在2分钟内可以完成PH值的测量,并显示出来,误差小于0.5。
3、电池组输出电压可以准确测量并显示,误差不大于0.01V。
综上所述,本设计达到设计要求。
附录1:
电路原理图
附录2:
源程序
#include
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineucharunsignedchar
#defineuintunsignedint
#definePCF85910x90//PCF8591地址
bitwrite=0;//写24c02的标志
//串行数据输入端
typedefunsignedcharuint8;
typedefunsignedintuint16;
#definePCF85910x90//PCF8591地址
unsignedcharcodesmg1[]="0123456789.mmVV";
unsignedintval;
unsignedcharge,shi,bai;
#defineSLAVEADDR0x98//定义器件地址
#definenops()do{_nop_();_nop_();_nop_();_nop_();_nop_();}while(0)//定义空指令
sbitSCL=P2^1;//I2C时钟
sbitSDA=P2^0;//I2C数据
sbitRS=P2^6;
sbitRW=P2^5;
sbitEN=P2^7;
ucharcodetable1[]="水情检测系统";
ucharcodetable2[]="水位:
";
ucharcodetable3[]="Ph值:
";
ucharcodetable4[]="电压:
";
voiddelay(uint16n)
{
while(n--);
}
voiddelay1()//延时4-5个微秒
{;;}
voiddelay_1ms(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--)
;
}
voidstart()//开始信号
{
SDA=1;
delay1();
SCL=1;
delay1();
SDA=0;
delay1();
}
voidstop()//停止信号
{
SDA=0;
delay1();
SCL=1;
delay1();
SDA=1;
delay1();
}
voidrespons()//应答相当于一个智能的延时函数
{
uchari;
SCL=1;
delay1();
while((SDA==1)&&(i<250))
i++;
SCL=0;
delay1();
}
voidinit()//初始化
{
SDA=1;
delay1();
SCL=1;
delay1();
}
ucharread_byte()
{
uchari,k;
SCL=0;
delay1();
SDA=1;
delay1();
for(i=0;i<4;i++)
{
SCL=1;
delay1();
k=(k<<1)|SDA;//先左移一位,再在最低位接受当前位
SCL=0;
delay1();
}
returnk;
}
voidwrite_byte(uchardate)//写一字节数据
{
uchari,temp;
temp=date;
for(i=0;i<4;i++)
{
temp=temp<<1;//左移一位移出的一位在CY中
SCL=0;//只有在scl=0时sda能变化值
delay1();
SDA=CY;
delay1();
SCL=1;
delay1();
}
SCL=0;
delay1();
SDA=1;
delay1();
}
voidwrite_add(ucharcontrol,uchardate)
{
start();
write_byte(PCF8591);//10010000前四位固定接下来三位全部被接地了所以都是0最后一位是写所以为低电平
respons();
write_byte(control);
respons();
write_byte(date);
respons();
stop();
}
ucharread_add(ucharcontrol)
{
uchardate;
start();
write_byte(PCF8591);
respons();
write_byte(control);
respons();
start();
write_byte(PCF8591+1);//把最后一位变成1,读
respons();
date=read_byte();
stop();
returndate;
}
voiduart_init(void)
{
ET1=0;
TMOD=0x21;//定时器1工作在方式2(自动重装)
SCON=0x50;//10位uart,允许串行接受
TH1=0xFD;
TL1=0xFD;
TR1=1;
}
voiddelayms(uintx)
{
uinti,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
voidwrite_com(ucharcom)
{
RS=0;
RW=0;
EN=0;
delayms
(1);
P0=com;
delayms
(1);
EN=1;
delayms(5);
EN=0;
delayms(5);
}
voidwrite_dat(uchardat)
{
RS=1;
RW=0;
EN=0;
delayms
(1);
P0=dat;
delayms
(1);
EN=1;
delayms(5);
EN=0;
delayms(5);
}
voidinit1()
{
delayms(100);
write_com(0x30);
write_com(0x30);
delayms
(1);
write_com(0x0e);
delayms
(1);
write_com(0x0c);
delayms
(1);
write_com(0x06);
delayms
(1);
write_com(0x01);
delayms
(1);
}
voidhanzi(uchar*ch)
{
while(*ch!
=0)
write_dat(*ch++);
delayms(50);
}
voiddisplay1()
{
uchari;
write_com(0x80);
for(i=0;i<16;i++)
{
write_dat(table1[i]);
delayms(5);
}
}
voiddisplay2()
{
uinti,val=45;
bai=val%1000/100;
shi=val%100/10;
ge=val%10;
write_com(0x90);
for(i=0;i<6;i++)
{
write_dat(table2[i]);
delayms(5);
}
write_dat(smg1[bai]);
delayms(5);
write_dat(smg1[shi]);
delayms(5);
write_dat(smg1[ge]);
delayms(5);
write_dat(smg1[12]);
delayms(5);
write_dat(smg1[12]);
delayms(5);
}
voiddisplay3()
{
uinti;
write_com(0x88);
for(i=0;i<6;i++)
{
write_dat(table3[i]);
delayms(5);
}
write_dat(smg1[6]);
delayms(5);
write_dat(smg1[10]);
delayms(5);
write_dat(smg1[3]);
delayms(5);
}
voiddisplay4()
{
uinti;
write_com(0x98);
for(i=0;i<6;i++)
{
write_dat(table4[i]);
delayms(5);
}
write_dat(smg1[4]);
delayms(5);
write_dat(smg1[10]);
delayms(5);
write_dat(smg1[8]);
delayms(5);
write_dat(smg1[0]);
delayms(5);
write_dat(smg1[14]);
delayms(5);
write_dat(smg1[15]);
delayms(5);
}
voidmain()
{
//uint8ans;
uart_init();
init();
init1();
display1();
display2();
display3();
display4();
while
(1);
}