找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7295|回复: 8
打印 上一主题 下一主题
收起左侧

51单片机简易水情检测系统设计 附源程序

  [复制链接]
跳转到指定楼层
楼主
ID:597842 发表于 2019-8-8 17:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
系统方案

本系统主要由STC89C52RC芯片组为核心、PCF8591模块、液位传感器模块、Ph值传感器模块、6V电池组供电组成,下面分别论证这几个模块的选择。

1、方案的论证与选择

方案一:由STC89C52RC芯片组为核心、PCF8591模块、重力传感器模块、Ph值传感器模块、6V电池组供电组成,

方案二:由STC89C52RC芯片组为核心、PCF8591模块、超声破传感器模块、Ph值传感器模块、6V电池组供电组成,

方案三:由STC89C52RC芯片组为核心、PCF8591模块、液位传感器模块、Ph值传感器模块、6V电池组供电组成,

分析方案一,使用重力传感器,但重力传感器不能在水库,河流等复杂地区使用,只能用于实验阶段,所以放弃方案一。

分析方案二,使用超声波传感器,超声波传感器在水库,河流等复杂地区不好固定,所以方案二也不考虑。

方案三使用液位传感器模块,方便参赛使用,最后选择方案三。


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 以内。
  固态结构,无可动部件,高可靠性,使用寿命长。
  安装方便、结构简单、经济耐用。
3Ph值测量
Ph值传感器工作原理,在传感器内部的 pH 放大器是一个能通过数据采集器监测的有标准 pH 电极的电路。传感器连接线的末端是一个BTA 插头或一个 5-针的 DIN 插头来与数据采集器连接。  在 pH 7 的缓冲溶液中,它将产生一个 1.75 伏特的电压。pH 值每增加1,电压增加0.25 伏。pH 值每减少1,电压降低 0.25 伏。  这个冻胶填充的 pH 值传感器的设计测量范围为:0 到 14。它在玻璃感应电极头延长出一个冻胶体,是初中、高中、大学中进行科学研究、环境测量的良好的设备。冻胶填充的参考半电化池是密封的,所以它无需重充。
2水位高度的计算
    由于本次使用的水位传感器量程有限,故以容器150mm高度线做为0刻度线,水位传感器检测数据+150mm为最终结果,具体高度以12864液晶显示屏显示为准。
3Ph的计算  
   在 pH 7 的缓冲溶液中,它将产生一个 1.75 伏特的电压。pH 值每增加1,电压增加 0.25 伏。pH 值每减少1,电压降低 0.25 伏。
4供电电池组电压的计算  

   本次电池组由4节干电池组成,电压为6V,因部分元器件最高工作电压为5V,故使用1K电阻对其进行分压,使其最后输出电压降为5V。

三、电路与程序设计
1电路的设计
1系统总体框图

系统总体框图如图所示

       系统总体框图

2水位检测子系统框图

1、水位检测子系统框图

水位检测子系统框图

3PH检测子系统框图

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。

3、电池组输出电压可以准确测量并显示,误差不大于0.01V。

综上所述,本设计达到设计要求。


附录1:电路原理图



单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <I2C.H>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. #define  PCF8591 0x90    //PCF8591 地址

  9. bit write=0;  //写24c02的标志
  10.     //串行数据输入端


  11. typedef unsigned char uint8;
  12. typedef unsigned int uint16;

  13. #define  PCF8591 0x90    //PCF8591 地址                                                         

  14. unsigned char code smg1[]="0123456789.mmVV";
  15. unsigned int  val;
  16. unsigned char ge,shi,bai;

  17. #define SLAVEADDR  0x98                 //定义器件地址
  18. #define nops()  do{_nop_();_nop_();_nop_();_nop_();_nop_();} while(0) //定义空指令

  19. sbit SCL = P2^1;       //I2C  时钟
  20. sbit SDA = P2^0;       //I2C  数据
  21. sbit RS=P2^6;
  22. sbit RW=P2^5;
  23. sbit EN=P2^7;
  24. uchar code table1[] = "  水情检测系统  ";
  25. uchar code table2[] = "水位: ";
  26. uchar code table3[] = "Ph值: ";
  27. uchar code table4[] = "电压: ";
  28. void delay(uint16 n)
  29. {
  30.         while (n--);
  31. }
  32. void delay1()   //延时4-5个微秒
  33. {;;}

  34. void delay_1ms(uint z)
  35. {
  36.   uint x,y;
  37.   for(x=z;x>0;x--)
  38.             for(y=110;y>0;y--)
  39.                   ;
  40. }

  41. void start()//开始信号
  42. {
  43.   SDA=1;
  44.      delay1();
  45.    SCL=1;
  46.      delay1();
  47.    SDA=0;
  48.      delay1();
  49. }

  50. void stop()      //停止信号
  51. {
  52.   SDA=0;
  53.      delay1();
  54.    SCL=1;
  55.      delay1();
  56.    SDA=1;
  57.      delay1();
  58. }


  59. void respons()//应答  相当于一个智能的延时函数
  60. {
  61.          uchar i;
  62.    SCL=1;
  63.      delay1();
  64.    while((SDA==1)&&(i<250))
  65.             i++;
  66.        SCL=0;
  67.      delay1();
  68. }

  69. void init()      //初始化
  70. {
  71.    SDA=1;
  72.      delay1();
  73.    SCL=1;
  74.      delay1();   
  75. }

  76. uchar read_byte()
  77. {
  78.     uchar i,k;
  79.          SCL=0;
  80.      delay1();
  81.    SDA=1;
  82.      delay1();
  83.    for(i=0;i<4;i++)
  84.     {
  85.           SCL=1;
  86.              delay1();
  87.            k=(k<<1)|SDA;//先左移一位,再在最低位接受当前位
  88.               SCL=0;
  89.              delay1();
  90.    }
  91.   return k;

  92. }

  93. void write_byte(uchar date)       //写一字节数据
  94. {
  95.         uchar i,temp;
  96.       temp=date;
  97.          for(i=0;i<4;i++)
  98.     {
  99.           temp=temp<<1; //左移一位 移出的一位在CY中
  100.            SCL=0;                      //只有在scl=0时sda能变化值
  101.                  delay1();
  102.            SDA=CY;
  103.             delay1();
  104.            SCL=1;
  105.              delay1();            
  106.    }   
  107.    SCL=0;
  108.      delay1();
  109.    SDA=1;
  110.      delay1();
  111. }



  112. void write_add(uchar control,uchar date)
  113. {
  114.          start();
  115.    write_byte(PCF8591);        //10010000  前四位固定 接下来三位全部被接地了 所以都是0 最后一位是写 所以为低电平
  116.          respons();
  117.          write_byte(control);
  118.        respons();
  119.          write_byte(date);
  120.   respons();
  121.          stop();

  122. }

  123. uchar read_add(uchar control)
  124. {
  125.    uchar date;
  126.         start();
  127.    write_byte(PCF8591);
  128.        respons();
  129.          write_byte(control);
  130.        respons();
  131.          start();
  132.    write_byte(PCF8591+1);      //把最后一位变成1,读
  133.       respons();
  134.          date=read_byte();
  135.   stop();
  136.     return date;

  137. }

  138. void uart_init(void)
  139. {
  140.     ET1=0;
  141.     TMOD = 0x21;        // 定时器1工作在方式2(自动重装)
  142.     SCON = 0x50;        // 10位uart,允许串行接受

  143.     TH1 = 0xFD;
  144.     TL1 = 0xFD;

  145.     TR1 = 1;
  146. }
  147. void delayms(uint x)
  148. {
  149.   uint i,j;
  150.   for(i=x;i>0;i--)
  151.     for(j=110;j>0;j--);
  152. }

  153. void write_com(uchar com)
  154. {
  155.                             RS=0;
  156.                             RW=0;
  157.                             EN=0;
  158.                 delayms(1);
  159.                             P0=com;
  160.                             delayms(1);
  161.                             EN=1;
  162.                             delayms(5);
  163.                             EN=0;
  164.                             delayms(5);
  165. }

  166. void write_dat(uchar dat)
  167. {
  168.                             RS=1;
  169.                             RW=0;
  170.                             EN=0;
  171.                 delayms(1);
  172.                             P0=dat;
  173.                             delayms(1);
  174.                             EN=1;
  175.                             delayms(5);
  176.                             EN=0;
  177.                             delayms(5);
  178. }

  179. void init1()
  180. {
  181.               delayms(100);
  182.               write_com(0x30);
  183.               write_com(0x30);
  184.               delayms(1);
  185.               write_com(0x0e);
  186.               delayms(1);
  187.               write_com(0x0c);
  188.               delayms(1);
  189.               write_com(0x06);
  190.               delayms(1);            
  191.               write_com(0x01);
  192.               delayms(1);
  193. }

  194. void hanzi(uchar *ch)
  195. {
  196.               while(*ch!=0)
  197.               write_dat(*ch++);
  198.               delayms(50);
  199. }

  200. void display1()
  201. {
  202.               uchar i;
  203.               write_com(0x80);
  204.               for(i=0; i<16; i++)
  205.               {
  206.                             write_dat(table1[i]);
  207.                             delayms(5);
  208.               }
  209. }

  210. void display2()
  211. {
  212.               uint i,val=45;
  213.               bai=val%1000/100;
  214.     shi=val%100/10;
  215.     ge=val%10;
  216.               write_com(0x90);
  217.               for(i=0; i<6; i++)
  218.               {
  219.                             write_dat(table2[i]);
  220.                             delayms(5);
  221.               }
  222.                             write_dat(smg1[bai]);
  223.                             delayms(5);
  224.                             write_dat(smg1[shi]);
  225.                             delayms(5);
  226.                             write_dat(smg1[ge]);
  227.                             delayms(5);
  228.                             write_dat(smg1[12]);
  229.                             delayms(5);
  230.                             write_dat(smg1[12]);
  231.                             delayms(5);
  232.             

  233. }

  234. void display3()
  235. {
  236.               uint i;
  237.               write_com(0x88);
  238.               for(i=0; i<6; i++)
  239.               {
  240.                             write_dat(table3[i]);
  241.                             delayms(5);
  242.               }
  243.                             write_dat(smg1[6]);
  244.                             delayms(5);
  245.                             write_dat(smg1[10]);
  246.                             delayms(5);
  247.                             write_dat(smg1[3]);
  248.                             delayms(5);
  249. }
  250. void display4()
  251. {
  252.               uint i;
  253.               write_com(0x98);
  254.               for(i=0; i<6; i++)
  255.               {
  256.                             write_dat(table4[i]);
  257.                             delayms(5);
  258.               }
  259.                             write_dat(smg1[4]);
  260.                             delayms(5);
  261.                             write_dat(smg1[10]);
  262.                             delayms(5);
  263.                             write_dat(smg1[8]);
  264.                             delayms(5);
  265.                             write_dat(smg1[0]);
  266.                             delayms(5);
  267.                             write_dat(smg1[14]);
  268.                             delayms(5);
  269.                             write_dat(smg1[15]);
  270.                             delayms(5);
  271. }

  272. void main()
  273. {
  274.               //uint8 ans;
  275.               uart_init();
  276.               init();
  277.               init1();
  278.               display1();
  279.               display2();
  280.               display3();
  281.               display4();

  282.               while(1);

  283.             
  284. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:449081 发表于 2019-8-23 16:46 | 只看该作者
棒很好很有用
回复

使用道具 举报

板凳
ID:607879 发表于 2019-9-5 14:16 | 只看该作者
请问液位传感器模块、Ph值传感器模块、6V电池组供电组成是装在哪的,学渣看不懂啊大哥
回复

使用道具 举报

地板
ID:607879 发表于 2019-9-5 14:51 | 只看该作者
图片有些模糊,能将元器件的型号规格 列一下吗,谢谢
回复

使用道具 举报

5#
ID:712010 发表于 2020-4-4 14:23 来自手机 | 只看该作者
木炭 发表于 2019-9-5 14:16
请问液位传感器模块、Ph值传感器模块、6V电池组供电组成是装在哪的,学渣看不懂啊大哥

你好,请问问题解决了吗,能共享一下吗
回复

使用道具 举报

6#
ID:927341 发表于 2021-6-20 20:16 | 只看该作者
代码里面没有,头文件呀
回复

使用道具 举报

7#
ID:927341 发表于 2021-6-20 20:17 | 只看该作者

能不能分享一下代码里面的头文件,谢谢
回复

使用道具 举报

8#
ID:927341 发表于 2021-6-22 11:33 | 只看该作者

你好,请问一下,这个的源程序可以分享一下吗
回复

使用道具 举报

9#
ID:927341 发表于 2021-6-22 12:21 | 只看该作者
程序里面的头文件可以分享一下吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表