找回密码
 立即注册
查看: 464|回复: 6

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-02-27 22:09:00

2

主题

2

回帖

76

积分

注册会员

积分
76
发表于 2024-9-15 17:34:08 | 显示全部楼层 |阅读模式
大家好,

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

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

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


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:09:43
已绑定手机

77

主题

4851

回帖

8390

积分

超级版主

DebugLab

积分
8390
发表于 2024-9-16 16:48:50 | 显示全部楼层
1Hz是0.5s变化一次,可以计算时间,1s不变化就是电平,1s之内有变化就是方波
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-02-27 22:09:00

2

主题

2

回帖

76

积分

注册会员

积分
76
发表于 2024-9-16 19:43:52 | 显示全部楼层
如果1秒内刚好发生电平变化呢,怎么判断是从高电平转为低电平,还是方波

点评

可以多测几秒  发表于 2024-9-16 20:57
每次变化后清零1s计时器,重新开始计时。 因为方波没变化前的一段也属于电平信号,想要不误识别,就只能做延迟切换,检测到电平变换就开始等1s时间,有变化就识别为方波,没变化就识别为电平  详情 回复 发表于 2024-9-16 20:05
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:460
  • 最近打卡:2025-05-03 07:38:35
已绑定手机
已实名认证

110

主题

2224

回帖

5470

积分

版主

积分
5470
发表于 2024-9-16 20:05:01 | 显示全部楼层
mo*** 发表于 2024-9-16 19:43
如果1秒内刚好发生电平变化呢,怎么判断是从高电平转为低电平,还是方波

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-9-17 10:42:27 | 显示全部楼层
  1. void main()
  2. {
  3.         u16 SqureWaveCkh = 0;
  4.         u16 SqureWaveOut = 0;
  5.         while(1)
  6.         {
  7.                 if(Flag1ms)//1ms标志位
  8.                 {
  9.                         Flag1ms=0;
  10.                         if(P31 != P31_Old)//电平变化
  11.                         {
  12.                                 SqureWaveCkh = 0;
  13.                                 SqureWaveEn = 1;
  14.                         }else{
  15.                                 if(SqureWaveCkh<500)
  16.                                 {
  17.                                         SqureWaveCkh++;
  18.                                         if(SqureWaveCkh==500)
  19.                                                 SqureWaveEn = 0;
  20.                                 }
  21.                         }
  22.                         P31_Old = P31;
  23.                         if(SqureWaveEn)
  24.                         {
  25.                                 if(++SqureWaveOut>=2500)
  26.                                 {
  27.                                         SqureWaveOut = 0;
  28.                                         P55 = !P55;
  29.                                 }
  30.                         }else{
  31.                                 P55 = !P31;
  32.                                 SqureWaveOut = 0;                               
  33.                         }
  34.                 }
  35.         }
  36. }
复制代码
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 03:53 , Processed in 0.111765 second(s), 81 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表