![]() |
有一个极其简单的办法,52单片机,T0, T1计数器都有一个门控状态,将被测信号加到比如说 T0的控制门INT0 端上,TO设定为对内部时钟计数。于是一个周期过后T0的计数值就对应着输入脉冲的“正宽度时间”。如果想测量输入负脉冲宽度,将输入倒向后脉冲加到T1的控制门INT1 上,T1对内部时钟计数,于是就可以得到负脉冲宽度时间。 由于是单片机确定的硬件特性,基本没有软件的附加误差。 |
先声明一个全局变量用来记录时间,再声明一个标志,用来判定启动还是停止 1,信号端口要使用中断,中断被触发之后,根据端口电平判断是上升还是下降,用来确定是启动还是停止 如果是启动,那就清除时间变量,并标志为启动 如果是停止,那就标志停止,在主程序中读取时间变量 2,写一个定时器中断,可以是500uS或者1mS,在中间中根据标志来对时间变量进行累加 这就可以了呀 |
中断可以试试 |
这个相当于测量一个跳变信号的持续时间吧,用外部中断加定时器,时间会准确一点.测量出来的时间还要加上程序语句运行的时间,当然这个可以在程序中做较正.还有就是信号源的跳变是否在下降沿有坡度式下降,如果不是即时跳变,那么可能CPU没有那么快识别跳变过程,那样可能把跳变过程中的一段时间也加上了 |
外部中断了解一下,你这种情况要使用双沿中断 |
试试外部中断(上升沿和下降沿)加定时器计数。 void INT0_Isr() interrupt 0 { if (P32) //判断上升沿和下降沿 { TR0 = 0; //关定时器 tempL=TH0<<8|TL0; //读取脉冲低电平持续时间 TL0 = 0x00; //设置定时初始值 TH0 = 0x00; //设置定时初始值 TR0 = 1; //开定时器 } else { TR0 = 0; //关定时器 tempH=TH0<<8|TL0; //读取脉冲高电平持续时间 TL0 = 0x00; //设置定时初始值 TH0 = 0x00; //设置定时初始值 TR0 = 1; //开定时器 } } |
看不太懂,是有一个固定的方波A跟一个随机出现的信号B,然后要知道B出现时是在方波的什么相位跟宽度吗?如果是这样,用2根INT脚,一根量A一根量B,A出现时启动timer,直到B触发结束timer,应该比用while计时准确很多。 |
不是定时器可以设定为计数器受某个引脚控制码? |