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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2455|回復: 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  啟動一次模塊
復制代碼



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

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: a级片www | 精品视频网 | 97精品一区二区 | 欧美日韩在线不卡 | 亚洲国产高清高潮精品美女 | 男女在线免费观看 | 全免一级毛片 | 国产成人综合在线 | 日产精品久久久一区二区福利 | 国产成人午夜电影网 | 日本精品一区二区三区在线观看视频 | 九九热免费观看 | 久久精品二区 | 欧美日日日日bbbbb视频 | 亚洲精品自拍视频 | 国产精品乱码一区二区三区 | 欧美啊v在线观看 | 成人视屏在线观看 | 中文在线一区二区 | 一级黄色片一级黄色片 | 日韩一区二区三区视频 | 奇色影视 | 天天玩天天干天天操 | 91毛片在线看| 91精品国产91久久久久游泳池 | 国产视频久久久 | www.成人在线视频 | 国产有码| 久久黄色精品视频 | 日日摸日日添日日躁av | 日本二区在线观看 | 激情欧美一区二区三区中文字幕 | 精品一区久久 | 日韩欧美一区二区三区免费看 | 青青久视频 | 成人黄色电影在线播放 | 亚洲 欧美 另类 综合 偷拍 | www.中文字幕av | 成人在线免费观看视频 | 91网视频| 18gay男同69亚洲网站 |