单片机IO如何检测输入信号是高/低电平还是连续方波?
大家好,如标题,现在需要根据IO口输入是高电平,低电平,还是方波,来决定另一个IO需要输出什么。
举例:
假设P31口检测到输入高电平,则P55输出低电
P31输入低电平,则P55输出高电平
P31输入1Hz方波,则P55输出5Hz方波
如果只是检测P31输入高低电平,则比较简单,现在加入了一个方波,感觉有点复杂了,不知道代码怎么写了。
1Hz是0.5s变化一次,可以计算时间,1s不变化就是电平,1s之内有变化就是方波 如果1秒内刚好发生电平变化呢,怎么判断是从高电平转为低电平,还是方波 moke 发表于 2024-9-16 19:43
如果1秒内刚好发生电平变化呢,怎么判断是从高电平转为低电平,还是方波
每次变化后清零1s计时器,重新开始计时。
因为方波没变化前的一段也属于电平信号,想要不误识别,就只能做延迟切换,检测到电平变换就开始等1s时间,有变化就识别为方波,没变化就识别为电平 void main()
{
u16 SqureWaveCkh = 0;
u16 SqureWaveOut = 0;
while(1)
{
if(Flag1ms)//1ms标志位
{
Flag1ms=0;
if(P31 != P31_Old)//电平变化
{
SqureWaveCkh = 0;
SqureWaveEn = 1;
}else{
if(SqureWaveCkh<500)
{
SqureWaveCkh++;
if(SqureWaveCkh==500)
SqureWaveEn = 0;
}
}
P31_Old = P31;
if(SqureWaveEn)
{
if(++SqureWaveOut>=2500)
{
SqureWaveOut = 0;
P55 = !P55;
}
}else{
P55 = !P31;
SqureWaveOut = 0;
}
}
}
}
页:
[1]