欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8216|回復: 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 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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電池組供電組成是裝在哪的,學渣看不懂啊大哥

你好,請問問題解決了嗎,能共享一下嗎
回復

使用道具 舉報

7#
無效樓層,該帖已經被刪除
ID:927341 發表于 2021-6-20 20:16 | 顯示全部樓層
代碼里面沒有,頭文件呀
回復

使用道具 舉報

ID:927341 發表于 2021-6-20 20:17 | 顯示全部樓層

能不能分享一下代碼里面的頭文件,謝謝
回復

使用道具 舉報

10#
無效樓層,該帖已經被刪除
ID:927341 發表于 2021-6-22 11:33 | 顯示全部樓層

你好,請問一下,這個的源程序可以分享一下嗎
回復

使用道具 舉報

ID:927341 發表于 2021-6-22 12:21 | 顯示全部樓層
程序里面的頭文件可以分享一下嗎
回復

使用道具 舉報

13#
無效樓層,該帖已經被刪除
14#
無效樓層,該帖已經被刪除
15#
無效樓層,該帖已經被刪除
16#
無效樓層,該帖已經被刪除
17#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表