不过你贴的程序看不到引导码的处理过程,或者说没法知道startflag怎么置1的。最好也贴出来。
如果你这个接收程序的中断处理部分完整的话,可以确定所用的单片机不具有修改触发边沿的功能。只能根据第一个下降沿(引导码)和第一个用户码之间的时间来处理(减去0电平的时间)。
从程序上看,
if(startflag)
只是判断可能是起始标记。
if(irtime>32&&irtime<63)
//引导码
8-16ms间
bitnum=0
这个判断是否为引导码。如果是,则将数组键置0,准备开始存储数据。即:
irdata[bitnum]=irtime
irtime=0//这个就不说了
bitnum++//这个本来也不该说的,不过结合前面的引导码判断,就有问题了:
1、如果遥控器发射过程中红外线被挡住,irtime会很长···还需要继续存储么?
2、如果接收被干扰,会插入高电平,irtime
不确定···
3·······
简单说,判断过于简单,没法实用的。
话说,你自己有能力写个好的,为嘛还参考别人的?
startflag为接收状态标志(0未接收,1接收),初始状态为0,未接收数据;
当有接收到红外信号,外部中断产生中断,这时候从startflag=0进入else
{irtime=0
startflag=1
}
清零计数,同时接收状态改成1
,进入if(startflag)开始接收数据
,只要接收标志为1,就会一直处于接收数据中,irok=1应为接收完毕标志,在主函数处理接收数据后,
应该有清零startflag,irtime标志的动作才对;
如果主函数没有清零startflag,那么startflag仅在首次上电的时候为0
,才会进入else
{irtime=0
startflag=1
}
,以后会一直保持1,只要有外部中断,只会进入if(startflag){...}
;判断这个startflag只为首次上电,第一次进入外部中断
在开始接收数据前清零irtime而已(irtime应该在中断一直计数着,不是0)
;即首次上电irtime不为0,此时产生外部中断
说明有接收到红外信号,马上清零irtime重新开始计数,判断引导码
总的来说
判断startflag
只为清零irtime
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)