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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6476|回復: 9
打印 上一主題 下一主題
收起左側

超聲波測距單片機C程序+原理圖+PCB源文件

  [復制鏈接]
跳轉到指定樓層
樓主


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


單片機源程序如下:
  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;                 //超聲波模塊量程溢出標志(>5米時置1)
  8. sbit echo=P1^0;               //超聲波模塊的發射端
  9. sbit trig=P1^1;               //超聲波模塊的接收端
  10. sbit ds=P2^2;                //DS18B20的信號線
  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. //八位共陽極
  18. unsigned char code shuzu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  19. /*********************************************************/
  20. //毫秒級延時
  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. //微秒級延時
  30. void delayus(unsigned char z)  
  31. {
  32.        while(z)
  33.          z--;
  34. }
  35. /********************************************************/
  36. void delay_ms(unsigned int ms)  //1ms延時
  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);                //延時480-960us
  48.            ds=1;
  49.            delayus(4);                 //等待應答
  50. }
  51. /*********************************************************/
  52. //DS18B20讀命令子程序(讀一字節)
  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);   //讀出的數據最低位在最前面,剛好一個字節在dat里
  64.            delayus(8);
  65.       }
  66.     return dat;
  67. }
  68. /*********************************************************/
  69. //DS18B20寫命令子程序(寫一字節)
  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開始獲取溫度并轉換
  96. void zhuanhuan()
  97. {
  98.            ds18b20init();
  99.            delayms(1);
  100.            xiemingling(0xcc);        //寫跳過讀ROM指令
  101.            xiemingling(0x44);       //寫溫度轉換命令
  102. }
  103. /*********************************************************/
  104. //DS18B20讀寄存器中存儲的溫度數據
  105. int duwendu()
  106. {
  107.            uint a,b;
  108.            ds18b20init();
  109.            delayms(1);
  110.            xiemingling(0xcc);                     //跳過ROM,忽略64位ROM地址
  111.            xiemingling(0xbe);                    //讀內部RAM中的9字節的溫度數據
  112.            a=dushuju();                            //讀低8位
  113.            b=dushuju();                           //讀高8位
  114.            b=b<<8;                                //高8位左移8位
  115.            temp=b|a;                             // 高8位和低8位組合為1個字
  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;                        //分離三位距離數據
  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. //計算距離子程序
  148. void Conut()
  149. {
  150.         float a;
  151.         time=TH0*256+TL0;             //這是最后計算到的時間,但應該再乘以12/11.092
  152.                                                    //時間應該是time*12/11.0592
  153.         TH0=0;                                   //定時器0的初始值位0           
  154.         TL0=0;
  155.         a=(331.5+0.607*temp);    //聲速與溫度的函數關系:聲速=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. //初始化定時器0和定時器1
  169. void T0_init()
  170. {
  171.           TMOD=0x11;   
  172.            TH0=0;            
  173.            TL0=0;         
  174.            TH1=0xf8;        //定時器1賦初值,應該是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();                               //獲取溫度后計算相應聲速,從而計算距離
  188.          while(!echo);                            //當echo為0時等待
  189.          TR0=1;                                    //開啟定時器0
  190.          while(echo);                            //當echo為1計數并等待
  191.          TR0=0;                                   //關閉定時器0
  192.          Conut();                                  //計算距離
  193.          for(i=150;i>0;i--)              
  194.          {
  195.                   xianshi(S);                      //數碼管顯示
  196.          }
  197.      }
  198. }
  199. /********************************************************/
  200. void zd0() interrupt 1   
  201. {
  202.     flag=1;                                            //中斷溢出標志
  203. }                       
  204. /********************************************************/
  205. void  zd3()  interrupt 3   
  206. ……………………

  207. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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





評分

參與人數 3黑幣 +90 收起 理由
9526 + 5 很給力!
huqi9881 + 5 絕世好帖!
admin + 80 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:384567 發表于 2018-9-3 15:33 | 只看該作者
不錯不錯
回復

使用道具 舉報

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

使用道具 舉報

地板
ID:229133 發表于 2018-9-8 16:59 | 只看該作者
有用,不錯
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

9#
ID:800086 發表于 2020-12-29 09:30 | 只看該作者
不錯可以學習,簡單很實用。謝謝分享
回復

使用道具 舉報

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

你解決了嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 韩日一区二区三区 | 亚洲成人动漫在线观看 | 久久久久久久一区二区三区 | 中文视频在线 | 日日操操操| 久久久人成影片一区二区三区 | 国产精品一区二区三区在线 | 就操在线 | 国产日产精品一区二区三区四区 | 日韩精品一区在线 | 日韩视频中文字幕 | 干一干操一操 | 日韩二三区 | 亚洲精品在线91 | 亚洲精品888 | 日本精品一区二区三区视频 | 欧美a级成人淫片免费看 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 午夜在线精品偷拍 | 91高清在线观看 | 久久久久亚洲 | 国产乱人伦精品一区二区 | 资源首页二三区 | 国产91久久久久久久免费 | 我要看黄色录像一级片 | 91精品国产92 | 羞羞免费网站 | 免费在线看黄 | 亚洲天堂成人在线视频 | 久久av综合 | 一级黄色生活视频 | 亚洲高清在线 | 中文欧美日韩 | 欧美视频一区二区三区 | 国产精品久久久久久吹潮 | 亚州一区二区三区 | 中文字幕不卡在线观看 | 麻豆av在线免费观看 | 久久综合影院 | 黄色在线免费观看 | 国产露脸对白88av |