4375|17

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

C51,怎么统计与分析多路脉冲?(比较初级,请多指教) [复制链接]

C51,怎么统计与分析多路脉冲?(比较初级,请多指教)。

有两路外部脉冲输入,脉冲周期相同,同时以他们的高低电平的不同可以取到00,01,10,11,两路四个组合的值。

请教:这两路输入在电路上怎么与C51连接? 程序上又怎么实现脉冲的计数以及对这两路出现的两路四个组合的值?

多谢!!!

最新回复

16楼的高手提出的方法很好,只要你的脉冲波不要长时间保持高电平或低电平的话用这个方法就简单多了,不过16楼的兄弟说用外部低电平中断,我觉得采用跳变外部中断会更好、、  详情 回复 发表于 2009-8-23 19:31
点赞 关注

回复
举报

88

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
程序,用Keil C,就行。再谢!
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
两个IO口作为输入。
定时器定时读取两个IO口状态,计数及统计状态。定时器中断周期至少是脉冲周期的1/2。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

4
 
对我的Keil C 程序肯定是,do... while...的循环去读两个IO口作为输入:

do
{
....
}
while(1)

我怎么正好知道我的一个do..while...循环中,正好读到的是脉冲的一个周期呢?

楼上(to shuiyan),你说的定时器中断周期设置,对这个是一个什么样的关系与影响?

多谢!
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
如果脉冲的频率不是很高,脉冲宽度不是很窄,可以通过中断对脉冲计数,2个脉冲信号分别接到2个外部中断上。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 
接IO口,用时钟终端
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
脉冲宽度为100 ms 左右。

其实,可能会用到更多输入,所以接IO口是可取的。现在我们讨论以两路脉冲输入为例。

用时钟中断?是如何处理的呢?能不能给一些代码?

多谢!
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

8
 
8051的片子定时器/计数器不够的话

一个用来定时

一个用来计脉冲,另一组脉冲挂中断上

呵呵
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
定时器中断周期设置,对这两路IO脉冲输入,是一个什么样的关系与影响?

能不能给一些Keil C 代码?

多谢!
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

10
 
对响应时间有要求么? 信号发生变化后,必须在多少时间内检测到信号的变化?
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

11
 
to: Great_Bug

没有对响应时间有要求。当然,在系统里这部分相应时间越快越好啦。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

12
 
可以对每一个I/O,设置一个状态机....
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

13
 
to Great_Bug:

设什么状态?能具体点么?用什么去处这个状态?

多谢!
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

14
 
比如,状态0,状态1,状态0到1,状态1到0...S0,S1,S01,S10
switch (state_io_0)
{
   case S0:
      //在输入 为0 的时候要做的事情
       break;
   case S1:
      //在输入 为1 的时候要做的事情
       break;
   case S01:
      //在输入 从0跳到1 的时候要做的事情
       break;
   case S10:
      //在输入 从1跳到0 的时候要做的事情
        break;
    default:
      // 错误状态处理
       break;
}
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

15
 
比如,状态0,状态1,状态0到1,状态1到0...S0,S1,S01,S10
switch (state_io_0)
{
  case S0:
      //在输入 为0 的时候要做的事情
      if (1 == io_0)
     {
        state_io_0 = S01;
     }
      break;
  case S1:
      //在输入 为1 的时候要做的事情
      if (0 == io_0)
     {
        state_io_0 = S10;
     }
      break;
  case S01:
     //在输入 从0跳到1 的时候要做的事情
      state_io_0 = S1;
      break;
  case S10:
     //在输入 从1跳到0 的时候要做的事情
      state_io_0 = S0;
      break;
  default:
      // 错误状态处理
      break;
}

这样完整和清楚些.....
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

16
 
楼主这个问题比较难办,如果两个直接接到I/O口上来做的话,单片机的读频率要与脉冲频率相同,而且要求要很高,否则久了就有可能出现一个周期被读两次或者漏读,这跟串口通讯非常类似。
楼上有高手说把两个脉冲直接接到外部中断来计数,如果出现两个脉冲连续都是00,那么应该是计不出来的吧。
想请教下楼主,两个脉冲是哪来的,如果是其他CPU发送出来的话,就弄个定时器跟发送脉冲的CPU定时一样,就像设置串口波特率一样,实现同步;如果是由时钟提供传送,则可以把这个时钟接到单片机外部中断口,两个脉冲信号接两个I/O口,每次外部中断中断一次,可以计数一个,同时读取两个I/O口的状态组合。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

17
 
同意楼上的观点,读频率要与脉冲频率相同,否则会出现错误。我提出一个解决办法不知道可不可行。
既然时间一长,就会出现读频率要与脉冲频率不同步的情况,那么可以除了将两个脉冲信号接到普通IO口外,还要将其中任意一个IO口连接到外部中断。当这个io口产生低电平,则利用外部中断程序来调整定时器,从而调整读频率尽量与脉冲频率同步。这样就不需要专门的时钟脉冲信号了。不知道可行否。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

18
 
16楼的高手提出的方法很好,只要你的脉冲波不要长时间保持高电平或低电平的话用这个方法就简单多了,不过16楼的兄弟说用外部低电平中断,我觉得采用跳变外部中断会更好、、
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表