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

下載本文檔

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

文檔簡介

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

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

3、值#define low_res_add2 0x00b0 /短距測距的補充測距時的結(jié)果補償值unsigned int counter_buf; /超聲波測距當中,用于保存timerb計數(shù)的變量,相當于時長unsigned int ext1_irq_flag=0; /外部中斷標志變量,用于ext1的irq中斷程序和測距程序同步/=/ 語法格式: void initial_ult(void)/ 實現(xiàn)功能: 超聲波測距模組的初始化子程序/ 參數(shù): 無/ 返回值: 無/=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;/=/ 語法格式: void delay_ult(unsigned int timers)/

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

6、0 短距測距/ 返回值: 所測得的距離,以厘米為單位/=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、; /將當前的系統(tǒng)時鐘設(shè)置暫時保存起來 *p_systemclock = 0x0088; /將系統(tǒng)時鐘設(shè)置為49mhz,分頻比為1,強振模式 if(type) /根據(jù)type即測距類型,選擇不同的測距參數(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) /如計數(shù)值大于10000,表示超時 exit_flag = 0; /exit ui

9、resoult = measure2_ult(type);/再進行一次補充的測距,將會加長40khz信號發(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è)置 return uiresoult;/=/ 語法格式: void ext1_i

10、rq_ult(void)/ 實現(xiàn)功能: 超聲波測距模組的測距程序的ext1中斷服務(wù)程序,在ext1的irq中斷/ 中調(diào)用/ 參數(shù): 無/ 返回值: 無/=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ā)生標志 ext1_irq_flag = 1; /通知測距程

11、序,外部中斷已發(fā)生/=/ 語法格式: unsigned int measure2_ult(void)/ 實現(xiàn)功能: 補充進行一次遠距的測量,以保證能夠獲取測量結(jié)果/ 參數(shù): type 選擇測距類型,/ type=1 中距測距/ type=0 短距測距/ 返回值: 所測得的距離,以厘米為單位/=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ā)生標志 if(type) /根據(jù)type即測距類型,選擇不同的測距參數(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) /如計數(shù)值大于10000,表示超時 exit_flag = 0; /exit uiresoult = 0; /error return data 0 *p_timerb_ctrl = 0x0006; /stop timerb return uiresoult;/=/ 語法格式: unsigned int measure_times(unsigned int type)/ 實現(xiàn)功能: 組合進行共6次的測距程序,包括對6次測量結(jié)果的取平均值處理/ 參數(shù): type 選擇測距類型,/ type=1 中距測距/ type=0 短距測距/ 返回

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

溫馨提示

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

評論

0/150

提交評論