找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3198|回复: 1
收起左侧

基于51单片机的水位测量仪仿真与源码

[复制链接]
ID:308354 发表于 2018-4-15 01:19 | 显示全部楼层 |阅读模式
不是特别完美,大家可以参考下。具体见附件
单片机的水位测量仪仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.jpg

单片机的水位测量仪源程序如下:
  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)
回复

使用道具 举报

ID:334818 发表于 2018-5-21 13:54 | 显示全部楼层
很实用,给力
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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