请教!用单片机一个输入口实现上升沿,下降沿都计数。

[复制链接]
6768|11
 楼主| gpff 发表于 2009-4-15 15:10 | 显示全部楼层 |阅读模式
用单片机一个输入口,通过光藕接收开关量输入,开关压下计数为1,开关弹起计数为2,再压下为3 ......
czha1 发表于 2009-4-15 15:26 | 显示全部楼层

jb

jb
jnb
sssbang 发表于 2009-4-15 17:24 | 显示全部楼层

用微分电路然后接施密特试试

韩秋婷 发表于 2009-4-15 17:30 | 显示全部楼层

看来楼主想用中断方式,

把51扔了,换成其它mcu轻松实现
王紫豪 发表于 2009-4-15 19:23 | 显示全部楼层

检测上升沿然后 *2 哦

NE5532 发表于 2009-4-15 22:29 | 显示全部楼层

楼主忘了自己用的啥单片机

51?进中断以后根据当前电平把触发沿改了就是了
PIC或者AVR,用端口变化中断,啥都省了。
ayb_ice 发表于 2009-4-15 22:34 | 显示全部楼层

异或逻辑可以解决这个问题

lyjian 发表于 2009-4-16 08:13 | 显示全部楼层

4楼

用中断方式,51也能轻松实现
N多51,硬件功能比其他MCU强的多得是
带PCA功能的51满街都是
开关频率不高的话直接用软件实现
lufeijian 发表于 2009-4-16 23:35 | 显示全部楼层

楼主要多动脑才行!很简单的,

    其实你的要求就是只要电平跳变就记数,每跳变一次记一个数,方法很多了:用一个标志,CPU不停的反复查询被检则的端口,当端口为高平,查看标志有效就计数,然后清除标志;当端口电平为低,查看标志无效就计数,然后打上标志.
天雨粟 发表于 2009-4-19 14:59 | 显示全部楼层

办法真多,学习!

5楼紫豪兄的办法是我的第一感觉,何以呢?两次按下,逻辑上讲,中间必有一个弹上,所以统计次数*2-1即可;

6楼NE5532老师的办法堪称妙手:
//IT0=1;
void inter0(void) interrupt 0{
++cnt;
while(!INT0);
++cnt;
}

9楼的办法也是正解,佩服!展开如下:
while(1){
if(test_port==1&&flag==1)
    cnt++;
flag=0;//屏蔽高电平继续计数并允许低电平计数
if(test_port==0&&flag==0)
   cnt++
flag=1;//屏蔽低电平继续计数并允许高电平计数

}
huangqi412 发表于 2009-4-19 15:17 | 显示全部楼层

中断中每次取反方向就可以啦,

McuPlayer 发表于 2009-4-20 06:12 | 显示全部楼层

王紫豪的idea最有创意

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

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部