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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3092|回復(fù): 2
收起左側(cè)

51單片機(jī)超聲波測距代碼與實測數(shù)據(jù)

[復(fù)制鏈接]
ID:442272 發(fā)表于 2018-12-8 17:31 | 顯示全部樓層 |閱讀模式
超聲波測距 數(shù)值顯示
0.jpg
單片機(jī)源程序如下:

  1. #include <reg52.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <intrins.h>
  5. #include <string.h>

  6. #define uchar        unsigned char
  7. #define uint        unsigned int
  8. #define ulong        unsigned long

  9. sbit DQ = P2^7;  //定義18B20引腳
  10. /*
  11. sbit G1 = P2^0;//數(shù)碼管1
  12. sbit G2 = P2^1;//數(shù)碼管2
  13. sbit G3 = P2^2;//數(shù)碼管3
  14. sbit G4 = P2^3;//數(shù)碼管4
  15. sbit key1=P3^5;//按鍵1
  16. */
  17. sbit G1 = P1^0;//數(shù)碼管1
  18. sbit G2 = P1^1;//數(shù)碼管2
  19. sbit G3 = P1^2;//數(shù)碼管3
  20. sbit G4 = P1^3;//數(shù)碼管4
  21. sbit key1=P1^4;//按鍵1

  22. sbit RX=P3^2;//回波引腳
  23. sbit TX=P3^3;//產(chǎn)生脈沖引腳

  24. uchar keyvalue=0;//鍵值
  25. uint keycount=0;//計時
  26. float time=0;//反射時間
  27. float C,T;//速度,溫度
  28. unsigned int  timer=0;//計時
  29. unsigned long S=0;//測量的距離

  30. bit flag =0;//中斷溢出標(biāo)志
  31. unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};//段碼0-9
  32. unsigned char const positon[4]={ 0xfe,0xfd,0xfb,0xf7};//位選
  33. unsigned char disbuff[4] ={ 0,0,0,0,},posit=0;//自定義變量
  34. unsigned char tx[10]={0,0,0x2E,0,0,0,0,0xDF,0x43,0x0A};//存儲溫度
  35. /********************************************************************
  36. * 名稱 : Delay()
  37. * 功能 : 微秒級延時函數(shù)
  38. * 輸入 : num
  39. * 輸出 : 無
  40. ***********************************************************************/
  41. void Delay(int num)//延時函數(shù)
  42. {
  43.         while(num--) ;
  44. }
  45. /********************************************************************
  46. * 名稱 : Delaynms()
  47. * 功能 : 毫秒級延時函數(shù)
  48. * 輸入 : num
  49. * 輸出 : 無
  50. ***********************************************************************/
  51. void Delaynms(unsigned int di) //延時
  52. {
  53.         unsigned int da,db;
  54.          for(da=0;da<di;da++)
  55.                    for(db=0;db<100;db++);
  56. }
  57. /********************************************************************
  58. * 名稱 : Init_DS18B20()
  59. * 功能 : 初始化ds1820
  60. * 輸入 : 無
  61. * 輸出 : dat
  62. ***********************************************************************/        
  63. void Init_DS18B20(void)//初始化ds1820
  64. {
  65.         unsigned char x=0;
  66.         DQ = 1;    //DQ復(fù)位
  67.         Delay(8);  //稍做延時
  68.         DQ = 0;    //單片機(jī)將DQ拉低
  69.         Delay(80); //精確延時 大于 480us
  70.         DQ = 1;    //拉高總線
  71.         Delay(14);
  72.         x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  73.         Delay(20);
  74. }
  75. /********************************************************************
  76. * 名稱 : ReadOneChar()
  77. * 功能 : 從DS18B20讀取一節(jié)數(shù)據(jù)
  78. * 輸入 : 無
  79. * 輸出 : dat
  80. ***********************************************************************/
  81. unsigned char ReadOneChar(void)//讀一個字節(jié)
  82. {
  83.         unsigned char i=0;
  84.         unsigned char dat = 0;
  85.         for (i=8;i>0;i--)
  86.         {
  87.                 DQ = 0; // 給脈沖信號
  88.                 dat>>=1;
  89.                 DQ = 1; // 給脈沖信號
  90.                 if(DQ)
  91.                 dat|=0x80;
  92.                 Delay(4);
  93.         }
  94.         return(dat);
  95. }

  96. /********************************************************************
  97. * 名稱 : WriteOneChar()
  98. * 功能 : 對DS18B20寫一節(jié)數(shù)據(jù)
  99. * 輸入 : dat
  100. * 輸出 : 無
  101. ***********************************************************************/
  102. void WriteOneChar(unsigned char dat)//寫一個字節(jié)
  103. {
  104.         unsigned char i=0;
  105.         for (i=8; i>0; i--)
  106.         {
  107.                 DQ = 0;
  108.                 DQ = dat&0x01;
  109.                 Delay(2);
  110.                 DQ = 1;
  111.                 dat>>=1;
  112.         }
  113.         
  114. }
  115. /********************************************************************
  116. * 名稱 : ReadTemperature()
  117. * 功能 : 讀取數(shù)據(jù)  轉(zhuǎn)換溫度
  118. * 輸入 : 無
  119. * 輸出 : 無
  120. ***********************************************************************/
  121. void ReadTemperature(void)//讀取溫度
  122. {
  123.         unsigned char a=0;
  124.         unsigned char b=0;
  125.         unsigned char Data_L=0;
  126.         unsigned char num=0;

  127.         Init_DS18B20();

  128.         WriteOneChar(0xCC); // 跳過讀序號列號的操作
  129.         WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換
  130.         Init_DS18B20();
  131.         WriteOneChar(0xCC); //跳過讀序號列號的操作
  132.         WriteOneChar(0xBE); //讀取溫度寄存器

  133.         a=ReadOneChar();  //讀低8位
  134.         b=ReadOneChar(); //讀高8位

  135.   tx[0] = (a/16+b*16)/10;      //整數(shù)部分


  136.         tx[1] = (a/16+b*16)%10;

  137.   Data_L=a&0X0F;
  138.   for(num=3;num<7;num++)                 //小數(shù)部分
  139.   {
  140.      Data_L=Data_L*10;                                 //10           //100                //40                 //80
  141.      tx[num]=Data_L/16;                         //0          //6                        //2                         //5
  142.      Data_L=Data_L%16;                                 //10           //4                        //8
  143.         }

  144. }
  145. /********************************************************************
  146. * 名稱 : Display(void)               
  147. * 功能 : 數(shù)碼管顯示距離
  148. * 輸入 : 無
  149. * 輸出 : 無
  150. ***********************************************************************/
  151. void Display(void)                                 
  152.         {
  153.          if(posit==0)
  154.          {
  155.            P0=(discode[disbuff[posit]])&0x7f;
  156.          }
  157.          else
  158.          {
  159.           P0=discode[disbuff[posit]];
  160.          }
  161.           P2=positon[posit];
  162.           if(++posit>=4)
  163.           posit=0;
  164.         }
  165. /********************************************************************
  166. * 名稱 : Conut(void)
  167. * 功能 : 計算距離
  168. * 輸入 : 無
  169. * 輸出 : 無
  170. ***********************************************************************/
  171. void Conut(void)
  172.         {
  173.          uchar i;
  174.          time=TH0*256+TL0;
  175.          TH0=0;
  176.          TL0=0;
  177.          if(time>290)//補(bǔ)償
  178.          {
  179.                   i=time/290;
  180.                   time=time+i*25;
  181.          }
  182.          ReadTemperature();         //讀取溫度               
  183.          T=(tx[0]*1000+tx[1]*100+tx[3]*10+tx[4]);//溫度
  184.          C=331.4+0.607*T/100;//當(dāng)時溫度對應(yīng)的聲波速度
  185.          
  186.          S=time*C/2/1000; //算出來是MM
  187.          //S=time/58*10;//(time*1.7)/100;     //算出來是CM        
  188.          if((S>=7000)||flag==1) //超出測量范圍顯示“-”
  189.          {         
  190.           flag=0;
  191.           disbuff[0]=10;           //“-”
  192.           disbuff[1]=10;           //“-”
  193.           disbuff[2]=10;           //“-”
  194.                 disbuff[3]=10;           //“-”
  195.          }
  196.          else
  197.          {
  198.                                 disbuff[0]=S/1000;
  199.                                 disbuff[1]=S%1000/100;
  200.                                 disbuff[2]=S%100%100/10;
  201.                                 disbuff[3]=S%100%100%10;
  202.          }
  203.          
  204.         }
  205. /********************************************************************
  206. * 名稱 : zd0()
  207. * 功能 : T0中斷用來計數(shù)器溢出,超過測距范圍
  208. * 輸入 : 無
  209. * 輸出 : 無
  210. ***********************************************************************/
  211. void zd0() interrupt 1         
  212.   {
  213.     flag=1;                                                         //中斷溢出標(biāo)志
  214.   }
  215. /********************************************************************
  216. * 名稱 : zd3()
  217. * 功能 : T1中斷用來掃描數(shù)碼管和計800MS啟動模塊
  218. * 輸入 : 無
  219. * 輸出 : 無
  220. ***********************************************************************/
  221. void  zd3()  interrupt 3
  222.   {
  223.                  TH1=0xf8;
  224.            TL1=0x30;
  225.                  timer++;
  226.                  if(keyvalue==1)
  227.                      keycount++;
  228.                 Display();//數(shù)碼管顯示
  229.   }
  230. /********************************************************************
  231. * 名稱 : scankey()
  232. * 功能 : 按鍵掃描
  233. * 輸入 : 無
  234. * 輸出 : 無
  235. ***********************************************************************/
  236. void scankey()
  237. {
  238.         if(key1==0)//按鍵按下
  239.         {
  240.                 Delaynms(5);//消抖
  241.                 if(key1==0)//再次檢測按鍵
  242.                 {
  243.                         keyvalue=1;
  244.                         while(!key1);//等待釋放
  245.                 }
  246.         }
  247.                
  248. }
  249. /********************************************************************
  250. * 名稱 : timeInit()
  251. * 功能 : 定時器初始化
  252. * 輸入 : 無
  253. * 輸出 : 無
  254. ***********************************************************************/
  255. void  timeInit()
  256. {
  257.           TMOD=0x11;                   //設(shè)T0為方式1,GATE=1;
  258.                 TH0=0;
  259.                 TL0=0;         
  260.                 TH1=0xf8;                   //2MS定時
  261.                 TL1=0x30;
  262.                 ET0=1;             //允許T0中斷
  263.                 ET1=1;                           //允許T1中斷
  264.                 //TR1=1;                           //開啟定時器
  265.                 EA=1;                           //開啟總中斷
  266. }
  267. /********************************************************************/
  268. /********************************************************************/
  269. /* 名稱 : main()
  270. /* 功能 : 主函數(shù)
  271. /* 輸入 : 無
  272. /* 輸出 : 無
  273. /********************************************************************/
  274. /********************************************************************/
  275. void main(void)
  276. {  
  277.         uchar  ab=0,i;
  278.         Init_DS18B20();//18b20初始化
  279.         timeInit();//定時器初始化
  280.         while(1)
  281.         {         
  282.     scankey();//按鍵掃描        
  283.                 if(keyvalue==1)
  284.                 {
  285.                         TR1=1;                           //開啟定時器        
  286.                         if(RX==1)//當(dāng)RX為零時等待        
  287.                         {
  288.                         TR0=1;                            //開啟計數(shù)
  289.                         ab=1;
  290.                         }
  291.                         if(RX==0&&ab==1)                        //當(dāng)RX為1計數(shù)并等待
  292.                         {
  293.                         TR0=0;                                //關(guān)閉計數(shù)
  294.                         Conut();                        //計算
  295.                         ab=0;
  296.                         }

  297.                 }
  298.          if(timer>=400&&ab==0)
  299.                  {
  300.                         timer=0;
  301.                         TX=1;                                        //800MS  啟動一次模塊
  302.                         _nop_();
  303.                         _nop_();
  304.                         _nop_();
  305.                         _nop_();
  306.                         _nop_();
  307.                         _nop_();
  308.                         _nop_();
  309.                         _nop_();
  310.                         _nop_();
  311.                         _nop_();
  312.                         _nop_();
  313.                         _nop_();
  314.                         _nop_();
  315.                         _nop_();
  316.                         _nop_();
  317.                         _nop_();
  318.                         _nop_();
  319.                         _nop_();
  320.                         _nop_();
  321.                         _nop_();
  322.                         _nop_();
  323.                         TX=0;
  324.                         
  325.                  }
  326.                
  327.                 if(keycount>=4800)
  328.                                 {
  329.                                         keyvalue=0;
  330.                                         keycount=0;
  331.                                         TR1=0;
  332.                                         P2=0xff;
  333.                                 }
  334.                
  335.         }
  336.         
  337. }
復(fù)制代碼

回復(fù)

使用道具 舉報

ID:1 發(fā)表于 2018-12-9 00:56 | 顯示全部樓層
補(bǔ)全原理圖或者詳細(xì)說明一下電路連接即可獲得100+黑幣
回復(fù)

使用道具 舉報

ID:803357 發(fā)表于 2021-5-16 17:16 | 顯示全部樓層
if(time>290)那部分怎么理解?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天堂中文在线观看 | 精品国产青草久久久久福利 | 国内精品一区二区 | 亚洲欧美久久 | 久草www | 日韩成人免费视频 | 国产精品日韩欧美一区二区三区 | 一区二区三区国产好 | 欧美日韩亚洲一区 | 性一交一乱一透一a级 | 伊人亚洲 | 男女视频在线观看免费 | www.jizzjizz| 成人精品一区二区户外勾搭野战 | 国产精品久久久久久久久久久久 | 91精品久久久久久久久中文字幕 | 欧美精品一区二区三区蜜臀 | 午夜影院在线免费观看视频 | 欧美嘿咻| 欧美一级免费看 | 国产精品日韩在线观看一区二区 | 亚洲一区二区三 | 国产视频欧美 | 午夜影视免费片在线观看 | 亚洲精品乱码久久久久久蜜桃 | 在线成人福利 | 国产精品一区二区日韩 | 日韩一区在线视频 | 国产精品99久久久久 | 亚洲人成在线观看 | 91精品国产一区二区三区 | 日韩成人 | 亚洲精品在线视频 | 欧美美女一区二区 | 成人在线电影在线观看 | 草b视频 | 91视频免费观看 | 免费激情 | 精品无码久久久久国产 | 国产美女黄色 | 亚洲 中文 欧美 日韩 在线观看 |