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