全部資料下載地址(內容經典):
18.超聲波測距實驗.zip
(37.46 KB, 下載次數: 43)
2017-8-8 16:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
- /*******************************************************************************
- * 文件名稱:超聲波測距實驗
- * 實驗目的:1.掌握超聲波測距原理
- * 2.掌握51單片機定時器工作模式和配置方法
- * 程序說明:無
- * 日期版本:2012-9-6/V1.0a
- *******************************************************************************/
- #include "reg52.h" //定義51單片機特殊功能寄存器
- #include "intrins.h"
- #include "absacc.h"
- #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();\
- _nop_();_nop_();_nop_();_nop_(); _nop_();}
- sbit TX = P1^0; //發射引腳
- sbit RX = P1^1; //接收引腳
- code unsigned char tab[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,\
- 0xff};
- unsigned char dspbuf[8] = {10,10,10,10,10,10,10,10}; //顯示緩沖區
- unsigned char dspcom = 0;
- unsigned int intr = 0;
- bit s_flag;
- unsigned int t = 0;
- void send_wave(void);
- void display(void);
- void main(void)
- {
- unsigned int distance;
- TMOD |= 0x11; //配置定時器工作模式
- TH0 = (65536-2000)/256;
- TL0 = (65536-2000)%256;
- TH1 = 0;
- TL1 = 0;
-
- EA = 1;
- ET0 = 1; //打開定時器0中斷
- TR0 = 1; //啟動定時器
- while(1)
- {
- /** 200毫秒更新一次數據 */
- if(s_flag)
- {
- s_flag = 0;
- /** 關閉定時器0中斷:計算超聲波發送到返回的時間 */
- // ET0 = 0;
- send_wave(); //發送方波信號
- TR1 = 1; //啟動計時
- while((RX == 1) && (TF1 == 0)); //等待收到脈沖
- TR1 = 0; //關閉計時
- //發生溢出
- if(TF1 == 1)
- {
- TF1 = 0;
- distance = 9999; //無返回
- }
- else
- {
- /** 計算時間 */
- t = TH1;
- t <<= 8;
- t |= TL1;
- distance = (unsigned int)(t*0.017); //計算距離
- }
- TH1 = 0;
- TL1 = 0;
- }
- /** 數據處理 */
-
- dspbuf[5] = distance/100;
- dspbuf[6] = distance%100/10;
- dspbuf[7] = distance%10;
- }
- }
- //定時器0中斷服務函數
- void isr_timer_0(void) interrupt 1 //默認中斷優先級 1
- {
- TH0 = (65536-2000)/256;
- TL0 = (65536-2000)%256; //定時器重載
-
- display(); //2ms執行一次
- if(++intr == 200)
- {
- s_flag = 1;
- intr = 0;
- }
- }
- //顯示函數
- void display(void)
- {
- XBYTE[0xE000] = 0xff; //去除鬼影
- XBYTE[0xC000] = (1<<dspcom);
- XBYTE[0xE000] = tab[dspbuf[dspcom]];
-
- if(++dspcom == 8){
- dspcom = 0;
- }
- }
- //TX引腳發送40KHz方波信號驅動超聲波發送探頭
- void send_wave(void)
- {
- unsigned char i = 8; //發送8個脈沖
-
- do
- {
- TX = 1;
- somenop;
- TX = 0;
- somenop;
- }
- while(i--);
- }
復制代碼
|