大家好小弟现在做一个红外线探测是否有物体通过的东东,现在对红外线发射这块产生问题,请大家帮忙给看看。
以上是原理图,通过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); } } |