找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6546|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

超聲波測(cè)距單片機(jī)C程序+原理圖+PCB源文件

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


Altium Designer畫的超聲波測(cè)距原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機(jī)源程序如下:
  1. #include <reg52.h>         //STC89C52頭文件
  2. #define uchar unsigned char   
  3. #define uint unsigned int
  4. unsigned int  time=0;
  5. unsigned int  timer=0;
  6. unsigned long S=0;         //距離變量
  7. bit  flag =0;                 //超聲波模塊量程溢出標(biāo)志(>5米時(shí)置1)
  8. sbit echo=P1^0;               //超聲波模塊的發(fā)射端
  9. sbit trig=P1^1;               //超聲波模塊的接收端
  10. sbit ds=P2^2;                //DS18B20的信號(hào)線
  11. sbit P24=P2^4;
  12. sbit P25=P2^5;
  13. sbit P26=P2^6;            
  14. sbit P27=P2^7;
  15. sbit P07=P0^7;            
  16. int temp;   
  17. //八位共陽(yáng)極
  18. unsigned char code shuzu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  19. /*********************************************************/
  20. //毫秒級(jí)延時(shí)
  21. void delayms(unsigned char z)  
  22. {
  23.        unsigned char a,b;
  24.        for(a=z; a>0; a--)
  25.                 for(b=110; b>0; b--);
  26. }
  27. /*********************************************************/
  28. /*********************************************************/
  29. //微秒級(jí)延時(shí)
  30. void delayus(unsigned char z)  
  31. {
  32.        while(z)
  33.          z--;
  34. }
  35. /********************************************************/
  36. void delay_ms(unsigned int ms)  //1ms延時(shí)
  37. {
  38.     uchar a;
  39.     while(ms--)
  40. for(a=123;a>0;a--);
  41. }
  42. /*********************************************************/
  43. //DS18B20初始化
  44. void ds18b20init()
  45. {
  46.            ds=0;
  47.            delayus(80);                //延時(shí)480-960us
  48.            ds=1;
  49.            delayus(4);                 //等待應(yīng)答
  50. }
  51. /*********************************************************/
  52. //DS18B20讀命令子程序(讀一字節(jié))
  53. uchar dushuju()
  54. {
  55.      uchar i,dat,m;
  56.      for(i=8;i>0;i--)
  57.      {
  58.            ds=0;
  59.            delayus(1);
  60.            ds=1;
  61.            delayus(2);
  62.            m=ds;
  63.            dat=(m<<7)|(dat>>1);   //讀出的數(shù)據(jù)最低位在最前面,剛好一個(gè)字節(jié)在dat里
  64.            delayus(8);
  65.       }
  66.     return dat;
  67. }
  68. /*********************************************************/
  69. //DS18B20寫命令子程序(寫一字節(jié))
  70. void xiemingling(uint shuju)
  71. {
  72.        uint i;
  73.        bit m;
  74.        for(i=8;i>0;i--)
  75.        {
  76.           m=shuju&0x01;
  77.           shuju=shuju>>1;
  78.           if(m)                           //寫1
  79.           {
  80.                    ds=0;
  81.                    delayus(2);
  82.                    ds=1;
  83.                    delayus(8);
  84.           }
  85.           else                     //寫0
  86.           {
  87.                    ds=0;
  88.                    delayus(8);
  89.                    ds=1;
  90.                    delayus(2);
  91.           }
  92.        }
  93. }

  94. /*********************************************************/  
  95. //DS18B20開始獲取溫度并轉(zhuǎn)換
  96. void zhuanhuan()
  97. {
  98.            ds18b20init();
  99.            delayms(1);
  100.            xiemingling(0xcc);        //寫跳過讀ROM指令
  101.            xiemingling(0x44);       //寫溫度轉(zhuǎn)換命令
  102. }
  103. /*********************************************************/
  104. //DS18B20讀寄存器中存儲(chǔ)的溫度數(shù)據(jù)
  105. int duwendu()
  106. {
  107.            uint a,b;
  108.            ds18b20init();
  109.            delayms(1);
  110.            xiemingling(0xcc);                     //跳過ROM,忽略64位ROM地址
  111.            xiemingling(0xbe);                    //讀內(nèi)部RAM中的9字節(jié)的溫度數(shù)據(jù)
  112.            a=dushuju();                            //讀低8位
  113.            b=dushuju();                           //讀高8位
  114.            b=b<<8;                                //高8位左移8位
  115.            temp=b|a;                             // 高8位和低8位組合為1個(gè)字
  116.            temp=temp*0.0625;              //溫度在寄存器中位12位,分辨率為0.0625度
  117.            return temp;
  118. }

  119. /*********************************************************/
  120. //顯示子程序
  121. void xianshi(unsigned long num)
  122. {
  123.           unsigned char bai,shi,ge;
  124.           bai=num/100;                        //分離三位距離數(shù)據(jù)
  125.           shi=num%100/10;                     
  126.           ge=num%10;                        
  127.                          P24=0;
  128.                          P0=shuzu[ge];
  129.                          delay_ms(1);
  130.                          P24=1;

  131.                          P25=0;
  132.                          P0=shuzu[shi];
  133.                          P07=1;
  134.                          delay_ms(1);
  135.                          P25=1;

  136.                          P26=0;
  137.                          P0=shuzu[bai];
  138.                          delay_ms(1);
  139.                          P26=1;

  140.         //                 P24=0;
  141. //                         P0=shuzu[bai];
  142. //                         P07=1;
  143.         //                 delay_ms(1);
  144. //                         P24=1;

  145. }

  146. /*********************************************************/

  147. //計(jì)算距離子程序
  148. void Conut()
  149. {
  150.         float a;
  151.         time=TH0*256+TL0;             //這是最后計(jì)算到的時(shí)間,但應(yīng)該再乘以12/11.092
  152.                                                    //時(shí)間應(yīng)該是time*12/11.0592
  153.         TH0=0;                                   //定時(shí)器0的初始值位0           
  154.         TL0=0;
  155.         a=(331.5+0.607*temp);    //聲速與溫度的函數(shù)關(guān)系:聲速=331.5+0.607*溫度
  156.         S=(time*a/200)/100;        //算出來是cm     
  157.         if (S>=500)                     //最大距離為5m,即500cm
  158.         S=888;
  159.         if (flag==1)                     //判斷是否溢出
  160.         {
  161.           S=888;
  162.           flag=0;
  163.           TH0=0;
  164.           TL0=0;
  165.        }
  166. }

  167. /********************************************************/
  168. //初始化定時(shí)器0和定時(shí)器1
  169. void T0_init()
  170. {
  171.           TMOD=0x11;   
  172.            TH0=0;            
  173.            TL0=0;         
  174.            TH1=0xf8;        //定時(shí)器1賦初值,應(yīng)該是2ms
  175.            TL1=0x30;
  176.            ET0=1;            
  177.            ET1=1;     
  178.            TR1=1;      
  179.            EA=1;
  180. }
  181. void  main( )
  182. {  
  183.      unsigned int i;
  184.      T0_init();   
  185.      while(1)
  186.      {
  187.          duwendu();                               //獲取溫度后計(jì)算相應(yīng)聲速,從而計(jì)算距離
  188.          while(!echo);                            //當(dāng)echo為0時(shí)等待
  189.          TR0=1;                                    //開啟定時(shí)器0
  190.          while(echo);                            //當(dāng)echo為1計(jì)數(shù)并等待
  191.          TR0=0;                                   //關(guān)閉定時(shí)器0
  192.          Conut();                                  //計(jì)算距離
  193.          for(i=150;i>0;i--)              
  194.          {
  195.                   xianshi(S);                      //數(shù)碼管顯示
  196.          }
  197.      }
  198. }
  199. /********************************************************/
  200. void zd0() interrupt 1   
  201. {
  202.     flag=1;                                            //中斷溢出標(biāo)志
  203. }                       
  204. /********************************************************/
  205. void  zd3()  interrupt 3   
  206. ……………………

  207. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
超聲波測(cè)距原理圖和PCB源文件.zip (1.61 MB, 下載次數(shù): 172)
超聲波測(cè)距程序.zip (25.32 KB, 下載次數(shù): 130)





評(píng)分

參與人數(shù) 3黑幣 +90 收起 理由
9526 + 5 很給力!
huqi9881 + 5 絕世好帖!
admin + 80 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:384567 發(fā)表于 2018-9-3 15:33 | 只看該作者
不錯(cuò)不錯(cuò)
回復(fù)

使用道具 舉報(bào)

板凳
ID:393881 發(fā)表于 2018-9-5 10:05 | 只看該作者
很有幫助的帖子。棒棒噠
回復(fù)

使用道具 舉報(bào)

地板
ID:229133 發(fā)表于 2018-9-8 16:59 | 只看該作者
有用,不錯(cuò)
回復(fù)

使用道具 舉報(bào)

5#
ID:791371 發(fā)表于 2020-6-28 16:14 | 只看該作者
很有幫助的帖子。棒棒噠
回復(fù)

使用道具 舉報(bào)

6#
ID:550671 發(fā)表于 2020-11-23 17:37 | 只看該作者
PCB打開沒有,原理圖有。
回復(fù)

使用道具 舉報(bào)

7#
ID:550671 發(fā)表于 2020-11-26 15:59 | 只看該作者
請(qǐng)問,P1,P2,P3是什么元器件??
回復(fù)

使用道具 舉報(bào)

8#
ID:843473 發(fā)表于 2020-12-2 23:53 來自手機(jī) | 只看該作者
找了很多,還是這個(gè)比較全
回復(fù)

使用道具 舉報(bào)

9#
ID:800086 發(fā)表于 2020-12-29 09:30 | 只看該作者
不錯(cuò)可以學(xué)習(xí),簡(jiǎn)單很實(shí)用。謝謝分享
回復(fù)

使用道具 舉報(bào)

10#
ID:927552 發(fā)表于 2021-5-27 12:16 | 只看該作者
云燁yy 發(fā)表于 2020-11-23 17:37
PCB打開沒有,原理圖有。

你解決了嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表