凌陽(yáng)超聲波測(cè)距_第1頁(yè)
凌陽(yáng)超聲波測(cè)距_第2頁(yè)
凌陽(yáng)超聲波測(cè)距_第3頁(yè)
凌陽(yáng)超聲波測(cè)距_第4頁(yè)
凌陽(yáng)超聲波測(cè)距_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、/=/ 文件名稱: ultrasonic_app.c/ 功能描述: 超聲波測(cè)距模組v2.0的功能接口函數(shù)/ 維護(hù)記錄: 2006-02-21 v2.0/=#include spce061a.h#define long_send_timer 1000 /中距測(cè)距時(shí)的40khz信號(hào)發(fā)射時(shí)長(zhǎng)#define long_send_timer2 3000 /中距測(cè)距的補(bǔ)充測(cè)距時(shí)的40khz信號(hào)發(fā)射時(shí)長(zhǎng)#define long_wait_delay 600 /中距測(cè)距的防余波干擾延時(shí)時(shí)長(zhǎng)#define long_wait_delay2 1500 /中距測(cè)距的補(bǔ)充測(cè)距時(shí)的防余波干擾延時(shí)時(shí)長(zhǎng)#define lo

2、ng_res_add 0x00b0 /中距測(cè)距的結(jié)果補(bǔ)償值#define long_res_add2 0x0220 /中距測(cè)距的補(bǔ)充測(cè)距時(shí)的結(jié)果補(bǔ)償值#define low_send_timer 250 /短距測(cè)距時(shí)的40khz信號(hào)發(fā)射時(shí)長(zhǎng)#define low_send_timer2 1000 /短距測(cè)距的補(bǔ)充測(cè)距時(shí)的40khz信號(hào)發(fā)射時(shí)長(zhǎng)#define low_wait_delay 180 /短距測(cè)距的防余波干擾延時(shí)時(shí)長(zhǎng)#define low_wait_delay2 400 /短距測(cè)距的補(bǔ)充測(cè)距時(shí)的防余波干擾延時(shí)時(shí)長(zhǎng)#define low_res_add 0x0034 /短距測(cè)距的結(jié)果補(bǔ)償

3、值#define low_res_add2 0x00b0 /短距測(cè)距的補(bǔ)充測(cè)距時(shí)的結(jié)果補(bǔ)償值unsigned int counter_buf; /超聲波測(cè)距當(dāng)中,用于保存timerb計(jì)數(shù)的變量,相當(dāng)于時(shí)長(zhǎng)unsigned int ext1_irq_flag=0; /外部中斷標(biāo)志變量,用于ext1的irq中斷程序和測(cè)距程序同步/=/ 語(yǔ)法格式: void initial_ult(void)/ 實(shí)現(xiàn)功能: 超聲波測(cè)距模組的初始化子程序/ 參數(shù): 無(wú)/ 返回值: 無(wú)/=void initial_ult(void) unsigned int uitemp; / 初始化端口主要是iob8和iob9 ui

4、temp = *p_iob_dir; uitemp = uitemp|0x0200; uitemp = uitemp&0xfeff; *p_iob_dir = uitemp; uitemp = *p_iob_attrib; uitemp = uitemp|0x0200; uitemp = uitemp&0xfeff; *p_iob_attrib = uitemp; uitemp = *p_iob_buffer; uitemp = uitemp|0x0300; *p_iob_data = uitemp;/=/ 語(yǔ)法格式: void delay_ult(unsigned int timers)/

5、實(shí)現(xiàn)功能: 超聲波測(cè)距模組的延時(shí)子程序/ 參數(shù): unsigned int timers 延時(shí)的時(shí)長(zhǎng)(僅是一個(gè)相對(duì)量)/ 返回值: 無(wú)/=void delay_ult(unsigned int timers) unsigned int i; for(i=0;i1; /除二 uitemp = (unsigned int)ultemp; return uitemp;/=/ 語(yǔ)法格式: unsigned int measure_ult(unsigned int type)/ 實(shí)現(xiàn)功能: 超聲波測(cè)距模組的測(cè)距程序,完成一次測(cè)距/ 參數(shù): type 選擇測(cè)距類型,/ type=1 中距測(cè)距/ type=

6、0 短距測(cè)距/ 返回值: 所測(cè)得的距離,以厘米為單位/=unsigned int measure2_ult(unsigned int type);unsigned int measure_ult(unsigned int type) unsigned int exit_flag = 1; unsigned int uitemp; unsigned int uiresoult; unsigned int uisend_timer,uiwait_timer,uires_add; unsigned int uisystem_clock; uisystem_clock = *p_systemclock

7、; /將當(dāng)前的系統(tǒng)時(shí)鐘設(shè)置暫時(shí)保存起來(lái) *p_systemclock = 0x0088; /將系統(tǒng)時(shí)鐘設(shè)置為49mhz,分頻比為1,強(qiáng)振模式 if(type) /根據(jù)type即測(cè)距類型,選擇不同的測(cè)距參數(shù) uisend_timer = long_send_timer; uiwait_timer = long_wait_delay; uires_add = long_res_add; else uisend_timer = low_send_timer; uiwait_timer = low_wait_delay; uires_add = low_res_add; *p_timerb_data

8、= 0xfed2; *p_timerb_ctrl = 0x03c0; /enable 40khz out delay_ult(uisend_timer); /delay for send the signal *p_timerb_ctrl = 0x0006; /stop 40khz out *p_timerb_data = 0x0000; *p_timerb_ctrl = 0x0001; /timerb work as a counter at 192khz while(*p_timerb_data10000) /如計(jì)數(shù)值大于10000,表示超時(shí) exit_flag = 0; /exit ui

9、resoult = measure2_ult(type);/再進(jìn)行一次補(bǔ)充的測(cè)距,將會(huì)加長(zhǎng)40khz信號(hào)發(fā)射的量 *p_timerb_ctrl = 0x0006; /stop timerb uitemp = *p_timerb_data; *p_watchdog_clear = 0x0001; *p_int_ctrl = *p_int_ctrl_new&(0x0100); /關(guān)掉外部中斷 _asm(irq off); /關(guān)掉總中斷 *p_systemclock = uisystem_clock; /恢復(fù)系統(tǒng)時(shí)鐘的設(shè)置 return uiresoult;/=/ 語(yǔ)法格式: void ext1_i

10、rq_ult(void)/ 實(shí)現(xiàn)功能: 超聲波測(cè)距模組的測(cè)距程序的ext1中斷服務(wù)程序,在ext1的irq中斷/ 中調(diào)用/ 參數(shù): 無(wú)/ 返回值: 無(wú)/=void ext1_irq_ult(void) counter_buf = *p_timerb_data; /save the timerb counter *p_timerb_ctrl = 0x0006; /stop timerb *p_int_ctrl = *p_int_ctrl_new&(0x0100); /關(guān)掉外部中斷 *p_int_clear = 0xffff; /清除中斷發(fā)生標(biāo)志 ext1_irq_flag = 1; /通知測(cè)距程

11、序,外部中斷已發(fā)生/=/ 語(yǔ)法格式: unsigned int measure2_ult(void)/ 實(shí)現(xiàn)功能: 補(bǔ)充進(jìn)行一次遠(yuǎn)距的測(cè)量,以保證能夠獲取測(cè)量結(jié)果/ 參數(shù): type 選擇測(cè)距類型,/ type=1 中距測(cè)距/ type=0 短距測(cè)距/ 返回值: 所測(cè)得的距離,以厘米為單位/=unsigned int measure2_ult(unsigned int type) unsigned int exit_flag = 1; unsigned int uiresoult; unsigned int uisend_timer,uiwait_timer,uires_add; *p_tim

12、era_ctrl = 0x0006; /stop timera *p_int_ctrl = *p_int_ctrl_new&(0x0100); /關(guān)掉外部中斷 _asm(irq off); /關(guān)掉總中斷 *p_int_clear = 0xffff; /清除掉中斷發(fā)生標(biāo)志 if(type) /根據(jù)type即測(cè)距類型,選擇不同的測(cè)距參數(shù) uisend_timer = long_send_timer2; uiwait_timer = long_wait_delay2; uires_add = long_res_add2; else uisend_timer = low_send_timer2; ui

13、wait_timer = low_wait_delay2; uires_add = low_res_add2; *p_timerb_data = 0xfed2; *p_timerb_ctrl = 0x03c0; /enable 40khz out delay_ult(uisend_timer); /delay for send the signal *p_timerb_ctrl = 0x0006; /stop 40khz out *p_timerb_data = 0x0000; *p_timerb_ctrl = 0x0001; /timerb work as a counter at 192k

14、hz while(*p_timerb_data10000) /如計(jì)數(shù)值大于10000,表示超時(shí) exit_flag = 0; /exit uiresoult = 0; /error return data 0 *p_timerb_ctrl = 0x0006; /stop timerb return uiresoult;/=/ 語(yǔ)法格式: unsigned int measure_times(unsigned int type)/ 實(shí)現(xiàn)功能: 組合進(jìn)行共6次的測(cè)距程序,包括對(duì)6次測(cè)量結(jié)果的取平均值處理/ 參數(shù): type 選擇測(cè)距類型,/ type=1 中距測(cè)距/ type=0 短距測(cè)距/ 返回

15、值: 所測(cè)得的距離,以厘米為單位/=unsigned int measure_times(unsigned int type) unsigned int uiresoult=0,uimeasure_index=0,i; unsigned int uitemp_buf6,uitemp; unsigned int uisystem_clock; for(;uimeasure_indexuitemp_bufi-1) uitemp_bufi = uitemp_bufi-1; uitemp_bufi-1 = uitemp; else uitemp_bufi = uitemp; break; /退出排序

16、i-; /兩次測(cè)量之間的延時(shí)等待,利用以下代碼軟仿真時(shí)的cycles數(shù)結(jié)合設(shè)置的cpuclk進(jìn)行計(jì)算,大概72ms uisystem_clock = *p_systemclock; /將之前的系統(tǒng)時(shí)鐘的設(shè)置用變量保存 *p_systemclock = 0x000b; /設(shè)置為fsys=24.576mhz 分頻比為8 for(i=0;i5;i+) delay_ult(1000); /調(diào)用延時(shí)程序 *p_watchdog_clear = 0x0001; *p_systemclock = uisystem_clock; /恢復(fù)系統(tǒng)時(shí)鐘設(shè)置 /此處延時(shí)結(jié)束 /對(duì)6次測(cè)距的結(jié)果進(jìn)行處理 if(uitemp_buf5=0)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論