|
超聲波測距實驗單片機源程序如下:
- /*******************************************************************************
- * 文件名稱:超聲波測距實驗
- * 實驗?zāi)康模?.掌握超聲波測距原理
- * 2.掌握51單片機定時器工作模式和配置方法
- * 程序說明:設(shè)計延時函數(shù),需要根據(jù)單片機的時鐘頻率進行調(diào)整,本例工作于11.0592MHz
- * 硬件說明:IAP15F2K61S2@11.0592MHz
- *******************************************************************************/
- #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; //發(fā)射引腳
- 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}; //顯示緩沖區(qū)
- 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毫秒更新一次數(shù)據(jù) */
- if(s_flag)
- {
- s_flag = 0;
- /** 關(guān)閉定時器0中斷:計算超聲波發(fā)送到返回的時間 */
- // ET0 = 0;
- send_wave(); //發(fā)送方波信號
- TR1 = 1; //啟動計時
- while((RX == 1) && (TF1 == 0)); //等待收到脈沖
- TR1 = 0; //關(guān)閉計時
- //發(fā)生溢出
- if(TF1 == 1)
- {
- TF1 = 0;
- distance = 9999; //無返回
- }
- else
- {
- /** 計算時間 */
- t = TH1;
- t <<= 8;
- t |= TL1;
- distance = (unsigned int)(t*0.017); //計算距離
- }
- TH1 = 0;
- TL1 = 0;
- }
- /** 數(shù)據(jù)處理 */
-
- dspbuf[5] = distance/100;
- dspbuf[6] = distance%100/10;
- dspbuf[7] = distance%10;
- }
- }
- //定時器0中斷服務(wù)函數(shù)
- void isr_timer_0(void) interrupt 1 //默認中斷優(yōu)先級 1
- {
- TH0 = (65536-2000)/256;
- TL0 = (65536-2000)%256; //定時器重載
-
- display(); //2ms執(zhí)行一次
- if(++intr == 200)
- {
- s_flag = 1;
- intr = 0;
- }
- }
- //顯示函數(shù)
- void display(void)
- {
- XBYTE[0xE000] = 0xff; //去除鬼影
- XBYTE[0xC000] = (1<<dspcom);
- XBYTE[0xE000] = tab[dspbuf[dspcom]];
-
- if(++dspcom == 8){
- dspcom = 0;
- }
- }
- //TX引腳發(fā)送40KHz方波信號驅(qū)動超聲波發(fā)送探頭
- //使用軟件延時注意RC振蕩器頻率
- void send_wave(void)
- {
- unsigned char i = 8; //發(fā)送8個脈沖
-
- do
- {
- TX = 1;
- somenop;somenop;somenop;somenop;somenop;somenop;
- somenop;somenop;somenop;somenop;
- TX = 0;
- somenop;somenop;somenop;somenop;somenop;somenop;
- somenop;somenop;somenop;somenop;
- }
- while(i--);
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
18.超聲波測距實驗.zip
(45.03 KB, 下載次數(shù): 16)
2018-4-21 19:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|