|
|
學(xué)校舉行的設(shè)計(jì)大賽已經(jīng)結(jié)束,雖然在這次比賽中并沒(méi)有獲得比較好的成績(jī),但總算是基本完成了設(shè)計(jì)的樣品,在這里想分享下我的設(shè)計(jì)過(guò)程,希望能對(duì)一些人有所幫助,也希望能學(xué)到更多東西。
首先是這次設(shè)計(jì)的主題,設(shè)計(jì)的是手持式超聲測(cè)距儀,用到的主要硬件有51單片機(jī)、1.44寸的TFT彩屏、蜂鳴器、US-100超聲波頭。然后想法是想把測(cè)到的距離通過(guò)彩屏來(lái)顯示。
實(shí)物部分:
微信圖片_20181216201052.png (728.05 KB, 下載次數(shù): 40)
下載附件
2018-12-16 20:12 上傳
微信圖片_20181216201042.jpg (85.39 KB, 下載次數(shù): 38)
下載附件
2018-12-16 20:11 上傳
代碼部分:
第一部分是啟用超聲波頭的函數(shù):
捕獲.PNG (49.93 KB, 下載次數(shù): 40)
下載附件
2018-12-16 19:42 上傳
這里的之所以要這么多個(gè)_nop_();是因?yàn)閁S-100超聲波頭發(fā)射超聲波時(shí),Trig管腳需要接收到一個(gè)10us以上的高電平才會(huì)發(fā)射超聲波,這里一個(gè)_nop_();延遲1us。
第二部分則是對(duì)返回來(lái)的數(shù)據(jù)進(jìn)行處理:
捕獲1.PNG (32.79 KB, 下載次數(shù): 48)
下載附件
2018-12-16 19:48 上傳
代碼里面的注釋寫(xiě)的比較清楚,這里就不詳細(xì)講。這里提一下我寫(xiě)的代碼這個(gè)是顯示兩位小數(shù),單位是M,根據(jù)超聲波頭的精度,是可以寫(xiě)到3位小數(shù),根據(jù)資料,誤差是在0.003m左右,然后這里是不用對(duì)溫度進(jìn)行處理,因?yàn)檫@個(gè)超聲波頭里面就自帶溫度檢測(cè),測(cè)出來(lái)的時(shí)間已經(jīng)修正了,是按照波速340m/s來(lái)算的。
第三部分就是TFT彩屏的初始化、寫(xiě)數(shù)據(jù)、寫(xiě)命令、讀數(shù)據(jù)等函數(shù),這里就不介紹了。
第四部分就是TFT彩屏上顯示文字和字符的函數(shù),文字通過(guò)字模轉(zhuǎn)化來(lái)顯示,這里采用16*16的點(diǎn)陣,而字符是通過(guò)ASCII碼的順序來(lái)顯示,是8*16點(diǎn)陣,這里顯示文字和字符分開(kāi)用了兩種方法,詳細(xì)說(shuō)明在代碼注釋中有。
第五部分就是加了蜂鳴器,這部分的代碼也比較簡(jiǎn)單,只是讓蜂鳴器在測(cè)量完成時(shí)響一聲提示測(cè)距完成,所以這里也不做過(guò)多介紹。
最后給大家提供改進(jìn)的幾個(gè)思路,可以考慮增加藍(lán)牙測(cè)距的模式,通過(guò)手機(jī)打開(kāi)藍(lán)牙,寫(xiě)一個(gè)APP,在手機(jī)這個(gè)APP上控制測(cè)距并將數(shù)據(jù)返回到手機(jī)中,這個(gè)想法是在比賽中見(jiàn)到的,當(dāng)然也還有很多很好的想法(這就是在比賽中被完爆的原因),像外殼加了磁體等吸附裝置可以吸附在任意位置測(cè)距,超聲波頭裝在舵機(jī)上可以旋轉(zhuǎn)等,這里就不一一舉出了。有問(wèn)題或建議的可以提出來(lái)交流,最后希望我整理的這些能對(duì)大家有所幫助。
單片機(jī)源程序:
- #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() //蜂鳴器加啟用超聲波函數(shù)
- {
- 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) //計(jì)算距離
- { //通過(guò)計(jì)時(shí)器計(jì)算,計(jì)時(shí)器的單位是1us,所以下面S是=(time*340)/2/10000(單位是cm)
- time=TH0*256+TL0;
- TH0=0;
- TL0=0;
- S=(time*1.7)/100; //算出來(lái)是CM
- if((S>=450)||(S<2)||flag==1) //超出測(cè)量范圍顯示“-”
- {
- 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; //這里可以通過(guò)fmod函數(shù)計(jì)算第三位小數(shù),然后自行添加就好
- switch (disbuff[0]) //通過(guò)switch給出數(shù)值
- {
- 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中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
- {
- flag=1; //中斷溢出標(biāo)志
- }
- void StartModule() //啟動(dòng)模塊
- {
- Trig=1; //啟動(dòng)一次模塊
- _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, "洞穴測(cè)距儀");
- delay(1000);
- }
- void main() //主函數(shù)
- {
- #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,// /
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png (41.41 KB, 下載次數(shù): 43)
下載附件
2018-12-16 21:22 上傳
全部資料51hei下載地址:
手持式超聲測(cè)距儀.zip
(678.51 KB, 下載次數(shù): 30)
2018-12-16 20:15 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|