大家好小弟現(xiàn)在做一個紅外線探測是否有物體通過的東東,現(xiàn)在對紅外線發(fā)射這塊產(chǎn)生問題,請大家?guī)兔o看看。
以上是原理圖,通過p3.3使用PWM控制紅外線發(fā)射,CON4的1、2腳接紅外線LED,3腳接一體化接收管的輸出腳并于INT0連接,4腳接接收管的地,接收管的電源單獨提供一5V。 程序是這樣的:用T0定時為80us中斷一次用于產(chǎn)生一個PWM波,通過P3.7腳輸出一個可調(diào)的0-5V的電壓,并且定時取反T1的ET1中斷標志位,用于調(diào)制38K的載波;T1定時為13us中斷一次,中斷后使P3.3取反一次,產(chǎn)生38K的載波;INT0中斷用于接收計數(shù)中斷方式為邊沿觸法。 我的問題是:根據(jù)資料顯示調(diào)制波可在幾百微秒內(nèi)實現(xiàn),但我測試結(jié)果是T0中斷計時到24ms時取反一次ET1才能在INT0就得到連續(xù)的計數(shù),如果小于24ms了先是計幾十個或幾百個數(shù)然后就停止了,我用搖控試過,一直點一個鍵,完全可以連續(xù)計數(shù)。我想可以能是發(fā)射電路或程序的問題了,請大家?guī)兔纯茨抢镉袉栴},怎么處理。小弟在此謝過了。急盼回復(fù)。 下面是小弟的程序: void PWM_38K_T1() interrupt 3 using 1 //T1中斷函數(shù)產(chǎn)生38K載波 { RF=~RF; //sbit RF="P3"^3 }
void PWM_Vol_T0() interrupt 1 using 0 //T0中斷用于產(chǎn)生PWM電壓和38K載波調(diào)制 { //PWM電壓產(chǎn)生----------------------------------------------------------- if(++zkb_count>500) zkb_count=0 ;
if(zkb_count<vol_value) RD=1; //RD為P3.7口,直接使用原單片機管腳復(fù)用定義名稱 else RD=0;
//-----------------------------------------------------------------------
//外紅調(diào)制波生產(chǎn)-------------------------------------------------------- //24ms停止T1一次,產(chǎn)生用于紅外接收器接收的調(diào)制波 if(++test_t1>300) { ET1=~ET1; test_t1=0; } }
void ext_init () interrupt 0 using 3 //INT0中斷函數(shù) { ++HW_INT0_count;
} 然后在主函數(shù)里初始化以后就顯示HW_INT0_count main() { 初始化; while(1) { display(HW_INT0_count); } } |