久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3783|回復: 1
打印 上一主題 下一主題
收起左側

基于51單片機的水位測量儀仿真與源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:308354 發表于 2018-4-15 01:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
不是特別完美,大家可以參考下。具體見附件
單片機的水位測量儀仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機的水位測量儀源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>       
  3. #include<math.h>                         //頭文件
  4. #define uchar unsigned char                 //宏定義
  5. #define uint unsigned int

  6. sbit beep=P1^4;
  7. sbit Relay=P2^0;
  8. sbit LED_H=P1^6;
  9. sbit LED_L=P1^7;
  10. sbit LED_IN=P1^5;
  11. sbit LED_OK=P1^6;

  12. sbit K1=P3^0;
  13. sbit K2=P3^1;
  14. sbit K3=P3^2;

  15. uchar H_lim=11,L_lim=7;
  16. uchar ad_dat1=0;   //讀取濾波后的AD值
  17. uchar Water_dat=0;
  18. uchar set_flag=0;
  19. /***************************************************
  20.                 函數名稱:延時子函數
  21.             函數功能:按鍵消抖
  22. ***************************************************/
  23. void delayms(uint xms)
  24. {
  25.         uint i,j;
  26.         for(i=xms;i>0;i--)
  27.                 for(j=110;j>0;j--);
  28. }

  29. //******************adc0832****************************//
  30. sbit  Clk= P1^1;
  31. sbit  DATI=P1^0;
  32. sbit  DATO= P1^0;
  33. sbit  CS= P1^2;
  34. uint  dat = 0x00;      //AD值

  35. //AD轉換子程序
  36. uint adc0832(unsigned char CH)
  37. {
  38.   uchar i,test,adval;
  39.   adval = 0x00;
  40.   test = 0x00;
  41.    //初始化
  42.   Clk = 0;      
  43.   DATI = 1;
  44.   _nop_();   _nop_();
  45.   CS = 0;
  46.   _nop_();
  47.   Clk = 1;
  48.   _nop_();  _nop_();
  49.   //通道選擇
  50. if(CH == 0x00)     
  51.    {
  52.        Clk = 0;
  53.        DATI = 1;      //通道0的第一位
  54.        _nop_();
  55.        Clk = 1;
  56.        _nop_();  _nop_();

  57.        Clk = 0;
  58.        DATI = 0;      //通道0的第二位
  59.        _nop_();  _nop_();

  60.        Clk = 1;
  61.        _nop_();
  62.     }
  63.     else
  64.     {
  65.        Clk = 0;
  66.        DATI = 1;      //通道1的第一位
  67.         _nop_();  _nop_();

  68.        Clk = 1;
  69.         _nop_();  _nop_();

  70.        Clk = 0;
  71.        DATI = 1;      //通道1的第二位
  72.       _nop_();
  73.       Clk = 1;
  74.       _nop_();
  75.     }
  76.       Clk = 0;   _nop_();

  77.       DATI = 1;
  78.    for( i = 0;i < 8;i++ )      //讀取前8位的值
  79.     {
  80.        _nop_();
  81.        adval <<= 1;
  82.        Clk = 1;
  83.        _nop_();  _nop_();

  84.        Clk = 0;           _nop_();

  85.        if (DATO)
  86.           adval |= 0x01;
  87.       else
  88.           adval |= 0x00;
  89.     }
  90.   for (i = 0; i < 8; i++)      //讀取后8位的值
  91.       {
  92.            test >>= 1;
  93.            if (DATO)
  94.               test |= 0x80;
  95.            else
  96.               test |= 0x00;
  97.           _nop_();
  98.           Clk = 1;
  99.           _nop_();  _nop_();

  100.           Clk = 0;   _nop_();

  101.       }
  102. //比較前8位與后8位的值,如果不相同舍去。若一直出現顯示為零,請將該行去掉
  103.   if (adval == test)     
  104.      dat = test;
  105.      _nop_();  _nop_();
  106.      CS = 1;        //釋放ADC0832
  107.      DATO = 1;
  108.      Clk = 1;
  109.       return dat;

  110. }



  111. /*液晶顯示程序*/


  112. sbit EN=P2^7;
  113. sbit RS=P2^5;
  114. sbit RW=P2^6;
  115. unsigned char LCD1602_Table[]="0123456789:-";
  116.                                                 // 0123456789abcdef
  117. unsigned char DIS1_TAB[]={"Water level:  cm"};
  118. unsigned char DIS2_TAB[]={"  H:  cm L:  cm "};
  119. void write_date(uchar date)
  120. {
  121.         EN=0;
  122.         RS=1;
  123.         P0=date;
  124.         EN=0;
  125.         delayms(5);
  126.         EN=1;
  127. }
  128. void write_com(uchar date)
  129. {
  130.         EN=0;
  131.         RS=0;
  132.         P0=date;
  133.         EN=0;
  134.         delayms(5);
  135.         EN=1;
  136. }
  137. void init_1602()
  138. {
  139.         unsigned char i;
  140.         RW=0;
  141.         write_com(0x38);
  142.         write_com(0x0c);
  143.         write_com(0x06);
  144.         write_com(0x01);
  145.         write_com(0x80);
  146.         for(i=0;i<16;i++)
  147.         write_date(DIS1_TAB[i]);
  148.         write_com(0x80+0x40);
  149.         for(i=0;i<16;i++)
  150.         write_date(DIS2_TAB[i]);
  151. }
  152. void display()
  153. {
  154.         static uchar i=0;
  155.         if(set_flag>0)
  156.         {
  157.                 if(i<20)
  158.                 i++;
  159.                 else
  160.                 i=0;
  161.         }
  162.         write_com(0x80+12);
  163.         write_date(LCD1602_Table[Water_dat%100/10]);
  164.         write_date(LCD1602_Table[Water_dat%10]);
  165.         write_com(0x80+0x40+4);
  166.         if((set_flag==1)&&(i<10))
  167.         {
  168.                 write_date(' ');
  169.                 write_date(' ');       
  170.         }       
  171.         else
  172.         {
  173.                 write_date(LCD1602_Table[H_lim/10]);
  174.                 write_date(LCD1602_Table[H_lim%10]);       
  175.         }                                          
  176.        
  177.         write_com(0x80+0x40+11);
  178.         if((set_flag==2)&&(i<10))
  179.         {
  180.                 write_date(' ');
  181.                 write_date(' ');       
  182.         }       
  183.         else
  184.         {
  185.                 write_date(LCD1602_Table[L_lim/10]);
  186.                 write_date(LCD1602_Table[L_lim%10]);
  187.         }                
  188. }

  189. //水位計算
  190. void Water_Calculate()
  191. {
  192.         if(ad_dat1<33)
  193.         {
  194.                 Water_dat=10-((33-ad_dat1)/3);               
  195.         }
  196.         else
  197.         {
  198.                 Water_dat=10+((ad_dat1-33)/3);       
  199.         }                       
  200. }

  201. void key()
  202. {
  203.         if(K1==0)
  204.         {
  205.                 delayms(10);
  206.                 if(K1==0)
  207.                 {
  208.                         set_flag++;
  209.                         if(set_flag>2)
  210.                         set_flag=0;
  211.                         while(!K1);
  212.                 }
  213.         }
  214.         switch(set_flag)
  215.         {
  216.                 case 1:
  217.                         if(K2==0)
  218.                         {
  219.                                 delayms(10);
  220.                                 if(K2==0)
  221.                                 {
  222.                                         if(H_lim<99)
  223.                                         H_lim++;
  224.                                         while(!K2);
  225.                                 }
  226.                         }
  227.                         else if(K3==0)
  228.                         {
  229.                                 delayms(10);
  230.                                 if(K3==0)
  231.                                 {
  232.                                         if(H_lim>0)
  233.                                         H_lim--;
  234.                                         while(!K3);
  235.                                 }
  236.                         }
  237.                 break;
  238.                 case 2:
  239.                          if(K2==0)
  240.                         {
  241.                                 delayms(10);
  242.                                 if(K2==0)
  243.                                 {
  244.                                         if(L_lim<99)
  245.                                         L_lim++;
  246.                                         while(!K2);
  247.                                 }
  248.                         }
  249.                         else if(K3==0)
  250.                         {
  251.                                 delayms(10);
  252.                                 if(K3==0)
  253.                                 {
  254.                                         if(L_lim>0)
  255.                                         L_lim--;
  256.                                         while(!K3);
  257.                                 }
  258.                         }
  259.                 break;
  260.                 default: break;

  261.         }
  262.        
  263. }
  264. /*主函數*/
  265. void main()
  266. {
  267.         uint AD_DAT=0;
  268.         float ad_buf=0;
  269.         uchar i=0;
  270.         LED_OK=0;
  271.         init_1602();
  272.         while(1)
  273.         {
  274.                 if(i<10)                                 // 濾
  275.                 {
  276.                         i++;
  277.                         AD_DAT+=adc0832(0);                // 波
  278.                 }
  279. ……………………

  280. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
水位檢測.zip (72.08 KB, 下載次數: 110)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:334818 發表于 2018-5-21 13:54 | 只看該作者
很實用,給力
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www.久久| 成人av一区二区亚洲精 | 国产精品激情在线 | 亚州国产| 91天堂| 欧美成年黄网站色视频 | 亚洲综合色网 | caoporn国产精品免费公开 | 超碰av在线 | 欧美aaaaaaaaaa | 精品一二区 | 亚洲国产精品成人综合久久久 | 欧美精品网 | 国产精品一区在线 | 亚洲中午字幕 | 亚洲午夜视频在线观看 | 在线日韩欧美 | 久久亚洲国产 | 在线免费观看成人 | 免费一区二区在线观看 | a级网站 | 狠狠入ady亚洲精品经典电影 | 中文字幕成人在线 | 欧美一级片在线看 | 国产第一亚洲 | 亚洲一区二区三区高清 | 四虎永久影院 | 亚洲国产精品一区二区久久 | 欧美一级片在线看 | 久久久久久免费毛片精品 | 福利精品| 国产成人av电影 | 国产精品久久久久久久粉嫩 | 中文字幕av在线 | 久久久成人精品 | 精品免费国产一区二区三区四区 | 国产综合久久久 | 色吊丝2288sds中文字幕 | 亚洲成人毛片 | 国产午夜精品一区二区三区嫩草 | 久久精品免费看 |