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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機手持式超聲測距儀設計(TFT彩屏+US-100源碼)

[復制鏈接]
跳轉到指定樓層
樓主
      學校舉行的設計大賽已經結束,雖然在這次比賽中并沒有獲得比較好的成績,但總算是基本完成了設計的樣品,在這里想分享下我的設計過程,希望能對一些人有所幫助,也希望能學到更多東西。
      首先是這次設計的主題,設計的是手持式超聲測距儀,用到的主要硬件有51單片機、1.44寸的TFT彩屏、蜂鳴器、US-100超聲波頭。然后想法是想把測到的距離通過彩屏來顯示。
實物部分:

代碼部分:
      第一部分是啟用超聲波頭的函數:


這里的之所以要這么多個_nop_();是因為US-100超聲波頭發射超聲波時,Trig管腳需要接收到一個10us以上的高電平才會發射超聲波,這里一個_nop_();延遲1us。
     第二部分則是對返回來的數據進行處理:


代碼里面的注釋寫的比較清楚,這里就不詳細講。這里提一下我寫的代碼這個是顯示兩位小數,單位是M,根據超聲波頭的精度,是可以寫到3位小數,根據資料,誤差是在0.003m左右,然后這里是不用對溫度進行處理,因為這個超聲波頭里面就自帶溫度檢測,測出來的時間已經修正了,是按照波速340m/s來算的。
       第三部分就是TFT彩屏的初始化、寫數據、寫命令、讀數據等函數,這里就不介紹了。
       第四部分就是TFT彩屏上顯示文字和字符的函數,文字通過字模轉化來顯示,這里采用16*16的點陣,而字符是通過ASCII碼的順序來顯示,是8*16點陣,這里顯示文字和字符分開用了兩種方法,詳細說明在代碼注釋中有。
       第五部分就是加了蜂鳴器,這部分的代碼也比較簡單,只是讓蜂鳴器在測量完成時響一聲提示測距完成,所以這里也不做過多介紹。
       最后給大家提供改進的幾個思路,可以考慮增加藍牙測距的模式,通過手機打開藍牙,寫一個APP,在手機這個APP上控制測距并將數據返回到手機中,這個想法是在比賽中見到的,當然也還有很多很好的想法(這就是在比賽中被完爆的原因),像外殼加了磁體等吸附裝置可以吸附在任意位置測距,超聲波頭裝在舵機上可以旋轉等,這里就不一一舉出了。有問題或建議的可以提出來交流,最后希望我整理的這些能對大家有所幫助。

單片機源程序:
  1. #include<reg51.h>
  2. #include<absacc.h>
  3. #include<intrins.h>
  4. #include<string.h>
  5. #include<tft.h>

  6. sbit Trig = P3^1;        //定義超聲波引腳
  7. sbit Echo = P3^0;
  8.                                  
  9. unsigned int  time=0;
  10. unsigned long S=0;
  11. bit      flag =0;
  12. unsigned char disbuff[4]           ={ 0,0,0,0,};


  13. void fengmingqi()                //蜂鳴器加啟用超聲波函數
  14. {                        
  15.        u8 i,j=100;
  16.            while(j)         
  17.            {
  18.            for (i=0;i<80;i++)
  19.            {
  20.               beep=1;
  21.                   delay(1);
  22.                   beep=0;
  23.                   delay(1);
  24.            }
  25.                 for (i=0;i<100;i++)
  26.            {
  27.               beep=1;
  28.                   delay(2);
  29.                   beep=0;
  30.                   delay(2);
  31.            }
  32.            j--;
  33.            }
  34.                 StartModule();
  35.              while(!Echo);               
  36.              TR0=1;                           
  37.              while(Echo);               
  38.              TR0=0;                                
  39.          Conut();

  40.            while(1){         //讓蜂鳴器響一下
  41.            beep=1;
  42.            }
  43.                
  44. }


  45. void Conut(void)                                         //計算距離
  46.         {                                                                 //通過計時器計算,計時器的單位是1us,所以下面S是=(time*340)/2/10000(單位是cm)
  47.          time=TH0*256+TL0;
  48.          TH0=0;
  49.          TL0=0;
  50.          S=(time*1.7)/100;     //算出來是CM
  51.          if((S>=450)||(S<2)||flag==1) //超出測量范圍顯示“-”
  52.          {         
  53.           flag=0;
  54.          
  55.           Fast_DrawFont_GBK16(40,70,RED,WHITE,"超出范圍");
  56.          }
  57.          else
  58.          {

  59.           disbuff[0]=S%1000/100;
  60.           disbuff[1]=S%1000%100/10;
  61.           disbuff[2]=S%1000%10 %10;                                                         //這里可以通過fmod函數計算第三位小數,然后自行添加就好
  62.           switch (disbuff[0])                                                                 //通過switch給出數值
  63.           {
  64.               case (0):        Display_ASCII8X16(40, 70,"0"); break;
  65.                   case (1):        Display_ASCII8X16(40, 70,"1"); break;
  66.                   case (2):        Display_ASCII8X16(40, 70,"2"); break;
  67.                   case (3):        Display_ASCII8X16(40, 70,"3"); break;
  68.                   case (4):        Display_ASCII8X16(40, 70,"4"); break;
  69.           };
  70.           Display_ASCII8X16(50, 70,".");
  71.           switch (disbuff[1])
  72.           {
  73.               case (0):        Display_ASCII8X16(60, 70,"0"); break;
  74.                   case (1):        Display_ASCII8X16(60, 70,"1"); break;
  75.                   case (2):        Display_ASCII8X16(60, 70,"2"); break;
  76.                   case (3):        Display_ASCII8X16(60, 70,"3"); break;
  77.                   case (4):        Display_ASCII8X16(60, 70,"4"); break;
  78.                   case (5):        Display_ASCII8X16(60, 70,"5"); break;
  79.                   case (6):        Display_ASCII8X16(60, 70,"6"); break;
  80.                   case (7):        Display_ASCII8X16(60, 70,"7"); break;
  81.                   case (8):        Display_ASCII8X16(60, 70,"8"); break;
  82.                   case (9):        Display_ASCII8X16(60, 70,"9"); break;
  83.           };
  84.           switch (disbuff[2])
  85.           {
  86.               case (0):        Display_ASCII8X16(70, 70,"0"); break;
  87.                   case (1):        Display_ASCII8X16(70, 70,"1"); break;
  88.                   case (2):        Display_ASCII8X16(70, 70,"2"); break;
  89.                   case (3):        Display_ASCII8X16(70, 70,"3"); break;
  90.                   case (4):        Display_ASCII8X16(70, 70,"4"); break;
  91.                   case (5):        Display_ASCII8X16(70, 70,"5"); break;
  92.                   case (6):        Display_ASCII8X16(70, 70,"6"); break;
  93.                   case (7):        Display_ASCII8X16(70, 70,"7"); break;
  94.                   case (8):        Display_ASCII8X16(70, 70,"8"); break;
  95.                   case (9):        Display_ASCII8X16(70, 70,"9"); break;
  96.           };
  97.            Display_ASCII8X16(80, 70,"M");

  98.          }
  99.         }

  100. void zd0() interrupt 1                  //T0中斷用來計數器溢出,超過測距范圍
  101.   {
  102.     flag=1;                                                         //中斷溢出標志
  103.   }

  104. void  StartModule()                          //啟動模塊
  105.   {
  106.           Trig=1;                                             //啟動一次模塊
  107.           _nop_();
  108.           _nop_();
  109.           _nop_();
  110.           _nop_();
  111.           _nop_();
  112.           _nop_();
  113.           _nop_();
  114.           _nop_();
  115.           _nop_();
  116.           _nop_();
  117.           _nop_();
  118.           _nop_();
  119.           _nop_();
  120.           _nop_();
  121.           _nop_();
  122.           _nop_();
  123.           _nop_();
  124.           _nop_();
  125.           _nop_();
  126.           _nop_();
  127.           _nop_();
  128.           Trig=0;
  129.   }





  130. void Font_Test(void)                //顯示文字
  131. {
  132.         LCD_Clear(WHITE);
  133.         Fast_DrawFont_GBK16(24,20,BLACK,WHITE,        "洞穴測距儀");
  134.         delay(1000);        
  135. }



  136. void main()                           //主函數
  137. {
  138. #ifdef MCU_STC12
  139.         P3M1 &= ~(1<<2),        P3M0 |=  (1<<2);        //P3.2 set as push-pull output mode
  140. #endif
  141.            lcd_initial();
  142.            LCD_Clear(WHITE);
  143.            bl=1;
  144.        TMOD=0x01;                  
  145.            TH0=0;
  146.            TL0=0;         
  147.            ET0=1;            
  148.            EA=1;                                   
  149.            Font_Test();
  150.            daoshu3s();
  151.            fengmingqi();
  152. }

  153. uchar code Zk_ASCII8X16[]=
  154. {
  155.   0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,// .
  156.   0x00,0x00,0x00,0x02,0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,// /
  157. ……………………

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




全部資料51hei下載地址:
手持式超聲測距儀.zip (678.51 KB, 下載次數: 30)


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久久久久久 | 久久人体视频 | 一区二区三区四区电影 | 久久中文免费视频 | 日韩国产精品一区二区三区 | 亚洲精品久久久久久一区二区 | 国产精品福利视频 | 亚洲精品一区二区三区蜜桃久 | 欧美日韩久久精品 | 亚洲最新在线 | 欧美日韩在线观看视频 | 国产精品久久久久久一区二区三区 | 欧美成人猛片aaaaaaa | 欧美日韩一区在线播放 | 成人午夜精品 | 99久久婷婷国产综合精品首页 | 久久久综合精品 | 99在线免费观看视频 | 精品国产乱码一区二区三区a | 久热久 | 中文字幕免费视频 | 日韩免费中文字幕 | 日韩乱码在线 | 亚洲国产欧美一区 | 青青久久 | 成人免费网站在线 | 国产精品久久国产精品 | 日本高清视频网站 | 久久久久久久一区二区三区 | 亚洲欧美bt | 午夜在线影院 | 精品久久久久久久人人人人传媒 | 久久综合色综合 | www.五月天婷婷 | 日韩中文字幕2019 | 国产成人一区二区三区电影 | 国产精品欧美一区二区三区不卡 | 国产激情91久久精品导航 | 日韩一二三区视频 | 国产福利在线 | 亚洲欧美在线视频 |