各位大佬,本人最近在玩單片機想做個超聲波測距,一直沒有弄好,不知道是哪里出了問題,用萬用表測超聲波模塊HC-SRO4的回波在200m的檔位時有電壓但是單片機就是不產生外部中斷,用的是外部中斷T1,輸入引腳接的是P33,單片機芯片是STC89C52RC,程式運行仿真時在打開EX1=1時執行了下一個陳述句后馬上就進入了外部中斷函式,不知道什么問題,因為只進行一次就沒管他,不知道是不是這個問題。下面是我的程式
#include<reg52.h> //包含頭檔案,一般情況不需要改動,頭檔案包含特殊功能暫存器的定義#include <intrins.h>unsigned char data dis_digit;#define uchar unsigned char //定義一下方便使用#define uint unsigned int#define ulong unsigned longvoid conversion() ;void isr_t0(void); //中斷服務函式宣告void delay ( z);//延時函式宣告unsigned char counter,j; //定義一個變數counter用來計數bit succeed_flag; //測量成功標志unsigned char ge,shi,bai,temp,flag,outcomeH,outcomeL,i; //自定義暫存器unsigned char ge_data ,shi_data,bai_data,temp_data ,x,y,z;uint distance_data; /*sbit IN1=P3^1;sbit IN2=P3^0;sbit ENA=P3^2;*/sbit IN3=P1^2;sbit IN4=P1^1;sbit ENB=P1^0;sbit vcc = P3^1;sbit Trig = P3^2; //產生脈沖引腳sbit Echo = P3^3; //回波引腳sbit gnd = P3^4;uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//數碼管0-9sbit ENB=P3^2;//******************************************************************************************************************void main(void) //主函式{ uint distance_data; PX1=1; counter=0; i=0; vcc=1; gnd=0; Echo=0; Trig=0; IT1=1; TR0=0; TMOD=0x11; TH0=0xdc; TL0=0x00; EA=1; //總中斷打開 ET0=1; //定時器中斷打開 TR0=1; dis_digit = 0xfd; while(1) //程式回圈 { if(succeed_flag==1) { distance_data=https://bbs.csdn.net/topics/outcomeH; //測量結果的高8位 distance_data<<=8; //放入16位的高8位 distance_data=distance_data|outcomeL;//與低8位合并成為16位結果資料 distance_data*=12; //因為定時器默認為12分頻 distance_data/=58; //微秒的單位除以58等于厘米 conversion(); } //為什么除以58等于厘米, Y米=(X秒*344)/2 // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58 /* if(succeed_flag==0) { distance_data=0; //沒有回波則清零 } */ } }//*******************************************************************************************************************void isr_t0(void) interrupt 1 //中斷服務函式{ TH0=0xdc;TL0=0x00;counter++; /*產生一個20us的脈沖,每1s產生一次*/ while(counter==100) { TH1=0; //定時器1清零 TL1=0; //定時器1清零 Trig=1; delay(3); Trig=0; //產生一個20us的脈沖,在Trig引腳 TR1=1; //啟動定時器1 EX1=1; //打開外部中斷 succeed_flag=0; counter=0; } /*數碼管顯示*/ P1 = 0x00; // 先關閉所有數碼管 i++; switch(i) { case 1: P0=bai;break; case 2: P0=shi;break; // 顯示代碼傳送到P0口 case 3: P0=ge ;break; } if(i==3) i=0; P1 = dis_digit; // dis_digit = _crol_(dis_digit,1); // 位選通值左移, 下次中斷時選通下一位數碼管 if (dis_digit == 0xef) dis_digit = 0xfd;}//**************************************************************************************//***************************************************************//外部中斷0,用做判斷回波電平INTO_() interrupt 2 // 外部中斷是2號 { outcomeH =TH1; //取出定時器的值 outcomeL =TL1; //取出定時器的值 succeed_flag=1; //至成功測量的標志 EX1=0; //關閉外部中斷 }//***************************************************************//********************************************void conversion( ) { temp_data=distance_data; bai_data=temp_data/100 ; temp_data=temp_data%100; //取余運算 shi_data=temp_data/10 ; temp_data=temp_data%10; //取余運算 ge_data=temp_data; bai_data=SEG7[bai_data]; shi_data=SEG7[shi_data]; ge_data =SEG7[ge_data]; EA=0; bai = bai_data; shi = shi_data; ge = ge_data ; EA=1; }//************************************************//**************************void delay ( z) { unsigned int x,y; for(x=z;x>0;x--) for(y=10;y>0;y--); }//*****
uj5u.com熱心網友回復:
超聲波傳感器 距離遠近會輸出不同間隔的脈沖,只需要統計出脈沖間隔就能算出距離,是不是幅度沒有達到觸發的level ,還是中斷沒有正確回傳uj5u.com熱心網友回復:
我的觸發方式是下降沿觸發,應該是只要有下降沿就觸發,超聲波模塊的回波端我測是有電壓的所以模塊應該沒問題,應該就是單片機不進入外部中斷。我在程式里加了Echo=1;Echo=0;正常來說仿真執行完這兩句后應該進入外部中斷,但是沒有進去,不知道是不是中斷沒有定義好。轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/140502.html
標籤:單片機/工控
