程序由脉冲信号发送与检测、逻辑判断、报警等模块组成。程序初始化时将定时器T0、T1设置为工作方式1,作计数器用。P1.0为脉冲信号输出端,P3.4、P3.5为计数器的输入端。在2ms的时间内P1.0发出10个脉冲信号 ,如果两路红外线均没有被挡住的话 ,则P3.4、P3.5两端均... 程序由脉冲信号发送与检测、逻辑判断、报警等模块组成。程序初始化时将定时器T0、T1设置为工作方式1,作计数器用。P1.0为脉冲信号输出端,P3.4、P3.5为计数器的输入端。在2ms的时间内P1.0发出10个脉冲信号 ,如果两路红外线均没有被挡住的话 ,则P3.4、P3.5两端均输入10个脉冲 ,T0、T1两个计数器的计值均为10,如果有那一路被挡住了,则对应的计数器的计数值为0或者小于10。接下来程序对T0、T1的计数值进行判断,从而得出两路红外线被挡住的情况 ,由于要检测两路红外线被挡住的次序,因此程序要不断返回到初始状态进行循环检测。如果经过若干轮的检测后发现先挡住红外线光束1,然后才挡住红外线光束2,则程序转向报警部分。对于其它情况 程序则回到初始状态进行下一轮的检测。单片机寄存器R1的值作两路红外线被挡住的次序的标志值 ,当红外线光束2被先挡住时R1被置1,当红外线光束2没有被先挡住时R1被置0。在程序的报警部分 ,T0被设置成0.25ms的定时器 ,控制P1.1端输出2kHz的脉冲信号,脉冲信号输出0.5秒、停止0.5秒 ,循环60次后程序又返回到初始状态,报警时间为1分钟。
红外线光束2被先挡住时R1被置1,
红外线光束2没有被先挡住时R1被置0。
--每一个脉冲信号,你都这么检测?
--那么,你还用计数器干什么?
--有一个脉冲,就可以判别出来运动方向。
--你用 10 个脉冲,计数,是干什么?
--------------
另外,即使你要计算输入脉冲的个数,也不应该用计数器。
应该用外部中断。