1、题目名称:水流速度实时检测及报警装置 摘要: 本装置由8位MCU为主控器,通过拉力传感器,对水流情况进行采样得到电信号,通过AD转换,把电信号转换为数字信号,数字信号经过MCU处理反馈到LCD1602液晶,液晶显示的就是实时的水流速度此时绿灯闪烁。若水流速度超过某一预定值,则开始报警,液晶会显示:Dangerous! Please away!,红灯闪烁,蜂鸣器响。若拉力传感器的工作电压下降到某一预定值,则液晶会显示:Volatage! Off normal!,黄灯闪烁。关键词: MCU AD 报警 电压不稳211 方案论证与比较11.1 采样方法方案论证11.2 芯片选择方案论证22 理论分析
2、与计算22.1 采样分析22.2 功耗分析33 系统设计63.1 硬件设计63.2 过程设计74系统测试84.1 仿真测试84.2 模拟测试95 结论11参考文献:11附录:11附1:元器件明细表:11附2:程序清单121 方案论证与比较1.1 采样方法方案论证方案一、用涡轮电机作为水流速度传感器,水流速度越大,电机旋转越快,输出电压(直流涡轮电机)或电压频率(交流涡轮电机)也会越大,若是直流涡轮电机,则用AD对电压信号进行采样,若为交流涡轮电机,则用MCU的内部计数器对其频率信号进行采样。 方案二、根据斯托克斯定律,水流对放入其中的小球的冲击力与水流速度成正比,这样我们可以通过拉力传感器把水
3、流速度与冲击力之间的线性关系反馈给AD,这样就可以间接地得到水流速度。考虑到实际应用,所以我们选择方案二。1.2芯片选择方案论证考虑到不需要非常高的精度和严格的时间限制,所以我们选择AT89C51为中央控制器,选择ADC0804为模拟信号采集处理芯片。考虑到MCU的IO口数量的有限性,我们采用分时复用的方法进行扩展,所以我们选用两片74LS573锁存器。考虑到功耗问题,不能对监测电压进行实时采样,我们选用与非门74LS00芯片。考虑到数据记录的便捷性,需要记录某一段时间的水流速度,我们选用LCD1602.2理论分析与计算2.1 采样分析根据斯托克斯定律f=6rv,f为小球所受到的水流的冲击力的
4、(等于粘滞力),其中为液体的粘滞系数,r为小球的半径,v为水流的速度,可得到fv,由于ADC0804的VIN+与VIN-之间的输入阻抗约为2M,可看做无穷大所以给定一个电位器RV1,在一定误差范围内,设它的触头与参考点之间的电压为Vg,若在触头上安装一个弹簧弹簧受到的力为F,因为F=kx,其中k为弹簧的弹性系数,x为弹簧的形变量,则FxVg,若水流的冲击力f=F,则vVg,即水流速度v与采集上的电压Vg成正比,如图2.1.1,我们限定Vg的相对误差0.1%,则RV11.1K,我们取RV1=1K。所涉及的电路图如图2.1.2.图2.1.22.2 功耗分析由于整个系统里LCD1602和发光二极管的
5、功耗较大,危险报警模块只需要外部电压有一个跳变延就可以实现其功能,功耗几乎为零,但电压监测模块需要实时采样电压信号,若直接并到MCU的中断输入口,则单片机的中断寄存器工作于临界状态,既不稳定又耗电量高,所以我们对一些基本的电子元器件进行了测试,最终找到与非门74LS00的输入输出关系上有个跳变,用这一个跳变信号就可以进入电压不稳定处理环节,已达到降低功耗的目的。74LS00输入(B)为2管脚,1管脚接VCC,3管脚作为输出(Y),如图2.2.1,图2.2.2用Matlbe对测量数据进行分析。所涉及的电路图如图2.2.3图2.2.1图2.2.2图2.2.33系统设计3.1 硬件设计电路图如图3.
6、1.1电路图的搭接按照芯片技术资料中的典型接法进行搭接。图3.1.13.2 软件设计程序流程图采集信号处理信号显示水流速度秒位加1水速是否超标YN开始电压是否正常进入危险报警环节报警结束NY结束显示电压不正常图3.2.1程序设计的依据是芯片技术资料。4系统测试4.1 仿真测试我们首先采用Keil uVision4与Protues 7.8连调的方法对这个设计方案进行了仿真测试,其中设计中的水速反馈模块用一个电位器代替,两个中断入口分别用两个接地开关代替,仿真效果如图4.1先编写使LCD1602显示时钟的程序,让LCD1602显示时钟,然后把控制ADC0804的程序嵌入到时钟程序中的“秒”延时里,
7、这样就可以让MCU既可以控制LCD1602的显示又可以控制ADC0804的信号处理。 图4.1.14.2 模拟测试 仿真测试成功之后我们又进行了模拟测试。测试效果如图4.2.1. . .图4.2.1 模拟成功之后我们按照电路图进行了焊接和制作。5总结课题设计比较合理,突出实际应用,能达到各项预期指标。参考文献:51单片机技术及应用系统开发,清华大学出版社;基于C语言编程MCS-51单片机原理与应用,清华大学出版社;单片机应用技术-一体化教程,王小立,朱志主编;电机学Stephen j.Chaphamn著,刘新正,苏少平,高琳,丁文译,电子工业出版社附录:附1:元器件明细表:名称型号量程数量个价
8、格元备注MCUAT89C5151125mm 透明塑料吸盘22液晶LCD160213.5锁存器74LS57310.8模数转换器ADC08048位115DIP 16封装单丝尼龙线(鱼线)5米闭锁开关3不闭锁开关1与非门74LS00位13.40.56共阴, 排电阻8*10K,8*1K各一个排针86排线83晶体振荡器12M贴片电容20PF2蜂鸣器1附2:程序清单#include#include#include#define uchar unsigned char#define uint unsigned int uchar code table=0123456789;uchar code table1
9、=00:00:00 0.00m/s;uchar code table2=2012/12/09 Norm;uchar code table3= Dangerous! ;uchar code table4= Please away! ;uchar code table5= Volatage! ;uchar code table6= Off normal! ;uchar code table7=I LIKE LZJTU! ;uchar code table8= I LIKE MCU!;sbit en=P24;sbit rw=P25;sbit rs=P26;sbit adcs=P20;sbit adr
10、d=P21;sbit adwr=P22;sbit gle=P23;sbit rle=P27;sbit p30=P30;sbit p31=P31;sbit p34=P34;sbit p35=P35;sbit p36=P36;sbit p37=P37; uint x,y; uchar fen0=0,fen1=0,shi0=0,shi1=0,miao0,miao1; float range,temp2,temp3; uchar b,n,n1,m,m1,bai,shi,ge,c,c1,c2,c3,m8,m7,m9; uint temp;void delay(uint z)uint x,y;for(x=
11、z;x0;x-) for(y=0;y0;m-) wdat(table7n); n+; n=0; wcom(0xc0); for(m=16;m0;m-) wdat(table8n); n+; delay(65535); wcom(0x80); n=0; for(m=16;m0;m-) wdat(table1n); n+; wcom(0xc0); for(m1=16;m10;m1-) wdat(table2n1); n1+; while(1) for(m2=0;m20;m1-) wdat(table2n1); n1+; wcom(0x87); wdat(tablen2); n2+; for(m3=
12、39;m30;m3-) for(m4=6;m40;m4-) show(5); / led; / m3=3; /m4=2; ledoff(); if(m2=10) n2=0; /wcom(0x87); /wdat(tablen2); wcom(0x86); wdat(tablen3+1); n3+; if(n3=6) n3=0; wcom(0x86); wdat(tablen3); wcom(0x84); wdat(tablefen0+1); fen0+; if(fen0=10) fen0=0; wcom(0x84); wdat(tablefen0); wcom(0x83); wdat(tabl
13、efen1+1); fen1+; if(shi0=10) shi0=0; wcom(0xc5); wdat(table0); wcom(0xc4); wdat(tableshi1+1); shi1+; c+; if(c=2&shi0=4) /* wcom(0xc9); wdat(tablem5+1); if(m5=10) m5=0; wcom(0xc8); wdat(tablem6); m6+; */ shi1=0; shi0=0; fen1=0; fen0=0; n2=0; n3=0; m=0; wcom(0x80); for(n=0;n7;n+) wdat(table1n); void d
14、anger() interrupt 0 / uchar table4= Please away! ; uchar m5,m6,m7; ledoff(); gle=0; rle=1; / for(m5=0;m516;m5+) / /wdat(table3m5); / / init(); /wcom(0xc0); for(m7=0;m716;m7+) ledon(); wcom(0xc0); for(m6=0;m616;m6+) wdat(table3m6); /ledoff(); delay(8000); ledoff(); wcom(0xc0); for(n=0;n16;n+) wdat(table4n); /ledoff(); delay(8000); /return ; / RETI ; / while(1); /return 0; rle=0; void vinstable() interrupt 2 ledoff(); /wcom(0x80); / wcom(0xc0); for(n=0;n6;n-) wcom(0xc0); for(m7=0;m716;m7+) wdat(table5m7); p37=1; delay(10000); wcom(0xc0); for(m8=0;m816;m8+) wdat(table6m8); p37=0; delay(10000);