學校舉行的設計大賽已經結束,雖然在這次比賽中并沒有獲得比較好的成績,但總算是基本完成了設計的樣品,在這里想分享下我的設計過程,希望能對一些人有所幫助,也希望能學到更多東西。
首先是這次設計的主題,設計的是手持式超聲測距儀,用到的主要硬件有51單片機、1.44寸的TFT彩屏、蜂鳴器、US-100超聲波頭。然后想法是想把測到的距離通過彩屏來顯示。
實物部分:
微信圖片_20181216201052.png (728.05 KB, 下載次數: 40)
下載附件
2018-12-16 20:12 上傳
微信圖片_20181216201042.jpg (85.39 KB, 下載次數: 38)
下載附件
2018-12-16 20:11 上傳
代碼部分:
第一部分是啟用超聲波頭的函數:
捕獲.PNG (49.93 KB, 下載次數: 40)
下載附件
2018-12-16 19:42 上傳
這里的之所以要這么多個_nop_();是因為US-100超聲波頭發射超聲波時,Trig管腳需要接收到一個10us以上的高電平才會發射超聲波,這里一個_nop_();延遲1us。
第二部分則是對返回來的數據進行處理:
捕獲1.PNG (32.79 KB, 下載次數: 48)
下載附件
2018-12-16 19:48 上傳
代碼里面的注釋寫的比較清楚,這里就不詳細講。這里提一下我寫的代碼這個是顯示兩位小數,單位是M,根據超聲波頭的精度,是可以寫到3位小數,根據資料,誤差是在0.003m左右,然后這里是不用對溫度進行處理,因為這個超聲波頭里面就自帶溫度檢測,測出來的時間已經修正了,是按照波速340m/s來算的。
第三部分就是TFT彩屏的初始化、寫數據、寫命令、讀數據等函數,這里就不介紹了。
第四部分就是TFT彩屏上顯示文字和字符的函數,文字通過字模轉化來顯示,這里采用16*16的點陣,而字符是通過ASCII碼的順序來顯示,是8*16點陣,這里顯示文字和字符分開用了兩種方法,詳細說明在代碼注釋中有。
第五部分就是加了蜂鳴器,這部分的代碼也比較簡單,只是讓蜂鳴器在測量完成時響一聲提示測距完成,所以這里也不做過多介紹。
最后給大家提供改進的幾個思路,可以考慮增加藍牙測距的模式,通過手機打開藍牙,寫一個APP,在手機這個APP上控制測距并將數據返回到手機中,這個想法是在比賽中見到的,當然也還有很多很好的想法(這就是在比賽中被完爆的原因),像外殼加了磁體等吸附裝置可以吸附在任意位置測距,超聲波頭裝在舵機上可以旋轉等,這里就不一一舉出了。有問題或建議的可以提出來交流,最后希望我整理的這些能對大家有所幫助。
單片機源程序:
- #include<reg51.h>
- #include<absacc.h>
- #include<intrins.h>
- #include<string.h>
- #include<tft.h>
- sbit Trig = P3^1; //定義超聲波引腳
- sbit Echo = P3^0;
-
- unsigned int time=0;
- unsigned long S=0;
- bit flag =0;
- unsigned char disbuff[4] ={ 0,0,0,0,};
- void fengmingqi() //蜂鳴器加啟用超聲波函數
- {
- u8 i,j=100;
- while(j)
- {
- for (i=0;i<80;i++)
- {
- beep=1;
- delay(1);
- beep=0;
- delay(1);
- }
- for (i=0;i<100;i++)
- {
- beep=1;
- delay(2);
- beep=0;
- delay(2);
- }
- j--;
- }
- StartModule();
- while(!Echo);
- TR0=1;
- while(Echo);
- TR0=0;
- Conut();
- while(1){ //讓蜂鳴器響一下
- beep=1;
- }
-
- }
- void Conut(void) //計算距離
- { //通過計時器計算,計時器的單位是1us,所以下面S是=(time*340)/2/10000(單位是cm)
- time=TH0*256+TL0;
- TH0=0;
- TL0=0;
- S=(time*1.7)/100; //算出來是CM
- if((S>=450)||(S<2)||flag==1) //超出測量范圍顯示“-”
- {
- flag=0;
-
- Fast_DrawFont_GBK16(40,70,RED,WHITE,"超出范圍");
- }
- else
- {
- disbuff[0]=S%1000/100;
- disbuff[1]=S%1000%100/10;
- disbuff[2]=S%1000%10 %10; //這里可以通過fmod函數計算第三位小數,然后自行添加就好
- switch (disbuff[0]) //通過switch給出數值
- {
- case (0): Display_ASCII8X16(40, 70,"0"); break;
- case (1): Display_ASCII8X16(40, 70,"1"); break;
- case (2): Display_ASCII8X16(40, 70,"2"); break;
- case (3): Display_ASCII8X16(40, 70,"3"); break;
- case (4): Display_ASCII8X16(40, 70,"4"); break;
- };
- Display_ASCII8X16(50, 70,".");
- switch (disbuff[1])
- {
- case (0): Display_ASCII8X16(60, 70,"0"); break;
- case (1): Display_ASCII8X16(60, 70,"1"); break;
- case (2): Display_ASCII8X16(60, 70,"2"); break;
- case (3): Display_ASCII8X16(60, 70,"3"); break;
- case (4): Display_ASCII8X16(60, 70,"4"); break;
- case (5): Display_ASCII8X16(60, 70,"5"); break;
- case (6): Display_ASCII8X16(60, 70,"6"); break;
- case (7): Display_ASCII8X16(60, 70,"7"); break;
- case (8): Display_ASCII8X16(60, 70,"8"); break;
- case (9): Display_ASCII8X16(60, 70,"9"); break;
- };
- switch (disbuff[2])
- {
- case (0): Display_ASCII8X16(70, 70,"0"); break;
- case (1): Display_ASCII8X16(70, 70,"1"); break;
- case (2): Display_ASCII8X16(70, 70,"2"); break;
- case (3): Display_ASCII8X16(70, 70,"3"); break;
- case (4): Display_ASCII8X16(70, 70,"4"); break;
- case (5): Display_ASCII8X16(70, 70,"5"); break;
- case (6): Display_ASCII8X16(70, 70,"6"); break;
- case (7): Display_ASCII8X16(70, 70,"7"); break;
- case (8): Display_ASCII8X16(70, 70,"8"); break;
- case (9): Display_ASCII8X16(70, 70,"9"); break;
- };
- Display_ASCII8X16(80, 70,"M");
- }
- }
- void zd0() interrupt 1 //T0中斷用來計數器溢出,超過測距范圍
- {
- flag=1; //中斷溢出標志
- }
- void StartModule() //啟動模塊
- {
- Trig=1; //啟動一次模塊
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- Trig=0;
- }
- void Font_Test(void) //顯示文字
- {
- LCD_Clear(WHITE);
- Fast_DrawFont_GBK16(24,20,BLACK,WHITE, "洞穴測距儀");
- delay(1000);
- }
- void main() //主函數
- {
- #ifdef MCU_STC12
- P3M1 &= ~(1<<2), P3M0 |= (1<<2); //P3.2 set as push-pull output mode
- #endif
- lcd_initial();
- LCD_Clear(WHITE);
- bl=1;
- TMOD=0x01;
- TH0=0;
- TL0=0;
- ET0=1;
- EA=1;
- Font_Test();
- daoshu3s();
- fengmingqi();
- }
- uchar code Zk_ASCII8X16[]=
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,// .
- 0x00,0x00,0x00,0x02,0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,// /
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (41.41 KB, 下載次數: 43)
下載附件
2018-12-16 21:22 上傳
全部資料51hei下載地址:
手持式超聲測距儀.zip
(678.51 KB, 下載次數: 30)
2018-12-16 20:15 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|