找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2076|回复: 3
收起左侧

51单片机超声波水位测量的液位数据转换问题

[复制链接]
ID:425510 发表于 2018-11-15 22:09 | 显示全部楼层 |阅读模式
这是具体C语言文字,问下    S=(time*1.87)/10;  这是怎么转换计算的,而且现在液晶显示屏显示的S是传感器到液位的距离,怎么填写C语言转换成为液位的液面高度。急急急
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #include "LCD1602.h"
  4. #include "STCEEPROM.h"
  5. sbit  RX = P3^6;  //定义超声波端口
  6. sbit  TX = P3^7;

  7. sbit LED = P2^0;  //LED
  8. sbit SPEAK = P2^1; //蜂鸣器
  9. sbit Motor = P2^2; //水泵

  10. sbit KEY1 = P1^3;  //设置按键
  11. sbit KEY2 = P1^4;  //加按键
  12. sbit KEY3 = P1^5;  //减按键

  13. unsigned int  time=0;//计时变量
  14. unsigned int  timer=0;//计时变量
  15. unsigned int S=0;//当前值
  16. unsigned int SET_H=100,SET_L=10;//最高值和最低值
  17. bit  flag =0; //测量标志位
  18. unsigned char Table[3],Table1[5];//显示数组
  19. unsigned char KEY_flag=0; //按键选择标志
  20. //延时函数
  21. void Delay_ms(int jj)  //延时函数
  22. {
  23.         int ii;        //延时变量
  24.         while(jj--)//延时n毫秒
  25.                 for(ii=0;ii<116;ii++);//延时1毫秒
  26. }
  27. void Conut(void)         //测量函数
  28.         {
  29.          time=TH0*256+TL0;         //距离计数
  30.          TH0=0;         //定时器清零
  31.          TL0=0;         //定时器清零

  32.          S=(time*1.87)/10;     //算出来是CM、转换
  33.          if((S>=700)||flag==1) //超出测量范围显示“-”
  34.          {         
  35.           flag=0; //数据无效标志
  36.          }
  37.          else
  38.          {
  39.           Table1[0]= S/1000+0X30;        //显示当前值
  40.           Table1[1]= S/100%10+0X30;        //显示当前值
  41.           Table1[2]= S/10/10+0X30;        //显示当前值
  42.           Table1[3]= '.';                        //显示当前值
  43.           Table1[4]= S%10+0X30;           //显示当前值
  44.           LCD1602_Disp_ZF(0x88,Table1,5); //显示当前值
  45.         }
  46. }
  47. void main(void)        //主函数
  48. {
  49.     LCD1602_init();//液晶初始化
  50.         //////////////////////0123456789ABCDEF
  51.     LCD1602_Disp_ZF(0x80,"  Now S:     CM ",16);
  52.                                                      //0123456789ABCDEF
  53.     LCD1602_Disp_ZF(0x80+0X40,"Set H:    L:    ",16);
  54.         TMOD=0x11;                   //设T0为方式1,GATE=1;
  55.         TH0=0;                           //定时器清零
  56.         TL0=0;             //定时器清零
  57.         TH1=0xf8;                   //2MS定时
  58.         TL1=0x30;                   //2MS定时
  59.         ET0=1;             //允许T0中断
  60.         ET1=1;                           //允许T1中断
  61.         TR1=1;                           //开启定时器
  62.         EA=1;                           //开启总中断
  63.         EA=0;//关闭中断
  64.         SET_H = ISP_READ(0x2c00)*256+ISP_READ(0x2c01);//读取存储的最大值
  65.         SET_L = ISP_READ(0x2c02)*256+ISP_READ(0x2c03);//读取存储的最小值
  66.         EA=1; //开启总中断
  67.         while(1)//函数循环
  68.         {
  69.                 while(!RX);                    //当RX为零时等待
  70.                 TR0=1;                            //开启计数
  71.                 while(RX);                        //当RX为1计数并等待
  72.                 TR0=0;                                //关闭计数
  73.                 Conut();  //计算显示距离函数
  74.                 /////////////////////////////////////
  75.                 if((S/10>SET_H)||(S/10>SET_H)) //水位过低过高报警,
  76.                 {
  77.                         LED=0;SPEAK=0; //报警
  78.                 }
  79.                 else
  80.                 {
  81.                         LED=1;SPEAK=1; //不报警
  82.                 }
  83.                 ////////////////////////////////
  84.                 if((S/10>SET_H)) //水位过低打开水泵
  85.                 {
  86.                         Motor; //打开
  87.                 }
  88.                 else
  89.                 {
  90.                         LED=1;SPEAK=1; //关闭
  91.                 }        
  92.                 if(!KEY1) //切换设置最大值和最小值
  93.                 {
  94.                         Delay_ms(10);//延时去抖动
  95.                         if(!KEY1)//切换设置最大值和最小值
  96.                         {
  97.                                 KEY_flag++;        //模式选择
  98.                                 ISP_ERASE(0x2c00);                //注意:字节编程时必须要先要擦除整个扇区        
  99.                                 ISP_PROGRAM(0x2c00, SET_H/256);        //记忆存储
  100.                                 ISP_PROGRAM(0x2c01, SET_H);//记忆存储
  101.                                 ISP_PROGRAM(0x2c02, SET_L/256);//记忆存储
  102.                                 ISP_PROGRAM(0x2c03, SET_L);        //记忆存储
  103.                         }
  104.                         while(!KEY1);//等待按键抬起
  105.                 }
  106.                 if(!KEY2)//设置加
  107.                 {
  108.                         Delay_ms(10);//延时去抖动
  109.                         if(!KEY2) //设置加
  110.                         {
  111.                                 if(KEY_flag%2==0)SET_H++; //设置加
  112.                                 if(KEY_flag%2==1)SET_L++; //设置加
  113.                         }
  114.                 }
  115.                 if(!KEY3) //设置减
  116.                 {
  117.                         Delay_ms(10);//延时去抖动
  118.                         if(!KEY3) //设置减
  119.                         {
  120.                                 if(KEY_flag%2==0)SET_H--; //设置减
  121.                                 if(KEY_flag%2==1)SET_L--;//设置减
  122.                         }
  123.                 }
  124.           Table[0]= SET_H/100+0X30;//显示最大值
  125.           Table[1]= SET_H%100/10+0X30;
  126.           Table[2]= SET_H%10+0X30;
  127.           LCD1602_Disp_ZF(0x86+0x40,Table,3);
  128.           Table[0]= SET_L/100+0X30;         //显示最小值
  129.           Table[1]= SET_L%100/10+0X30;
  130.           Table[2]= SET_L%10+0X30;
  131.           LCD1602_Disp_ZF(0x8C+0x40,Table,3);
  132.         }
  133. }

  134. /********************************************************/
  135.      void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  136.   {
  137.     flag=1;                                                         //中断溢出标志
  138.   }
  139. /********************************************************/
  140.    void  zd3()  interrupt 3         
  141.   {
  142.          TH1=0xf8;//2毫秒定时初始化
  143.          TL1=0x30;//2毫秒定时初始化
  144.          timer++;//计数
  145.          if(timer>=100)//计数100次,200毫秒
  146.          {
  147.           timer=0;
  148.           TX=1;                                        //200MS  启动一次模块
复制代码



回复

使用道具 举报

ID:351567 发表于 2019-1-13 18:07 | 显示全部楼层
麻烦楼主把文件发给我学习
回复

使用道具 举报

ID:18297 发表于 2019-1-13 19:53 | 显示全部楼层
----------超声波传感器位置

-----------液面位置

------------底部
个人认为原理应该是这样的。固定超声波传感器的位置,可以测量超声波传感器到底部的位置为Hcm。
读取超声波到液面的位置为hcm。可以计算你的液位到底部的位置=(H-h)cm。

至于S=(time*1.87)/10这个公式是超声波传感器的测量原理。将距离转换为测量超声波的传送时间。
距离=系数(恒定)*时间
可以参看超声波传感器模块的具体参数。
注意在C语言中的S的变量类型定义,一般定义为foat。
这个功能能否实现,本人没有实践。超声波测量模块倒是使用过的。

回复

使用道具 举报

ID:213173 发表于 2019-1-14 09:53 | 显示全部楼层
传感器到罐底的距离是常量,传感器到液面距离是变量,液位高度=传感器到罐底的距离减去传感器到液面距离。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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