moke 发表于 2024-9-15 17:34:08

单片机IO如何检测输入信号是高/低电平还是连续方波?

大家好,

如标题,现在需要根据IO口输入是高电平,低电平,还是方波,来决定另一个IO需要输出什么。

举例:
假设P31口检测到输入高电平,则P55输出低电
P31输入低电平,则P55输出高电平
P31输入1Hz方波,则P55输出5Hz方波

如果只是检测P31输入高低电平,则比较简单,现在加入了一个方波,感觉有点复杂了,不知道代码怎么写了。


DebugLab 发表于 2024-9-16 16:48:50

1Hz是0.5s变化一次,可以计算时间,1s不变化就是电平,1s之内有变化就是方波

moke 发表于 2024-9-16 19:43:52

如果1秒内刚好发生电平变化呢,怎么判断是从高电平转为低电平,还是方波

王昱顺 发表于 2024-9-16 20:05:01

moke 发表于 2024-9-16 19:43
如果1秒内刚好发生电平变化呢,怎么判断是从高电平转为低电平,还是方波

每次变化后清零1s计时器,重新开始计时。
因为方波没变化前的一段也属于电平信号,想要不误识别,就只能做延迟切换,检测到电平变换就开始等1s时间,有变化就识别为方波,没变化就识别为电平

Lkck8210 发表于 2024-9-17 10:42:27

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]
查看完整版本: 单片机IO如何检测输入信号是高/低电平还是连续方波?