51检测下降沿或上升执行一次的程序如何实现? 点击:1487 | 回复:7



quickorslow

    
  • 精华:0帖
  • 求助:2帖
  • 帖子:29帖 | 61回
  • 年度积分:27
  • 历史总积分:170
  • 注册:2004年11月29日
发表于:2010-04-13 16:40:38
楼主

各位,我想实现输入从1变0时,执行一次加1,下次再从1变0时再加1,输入从0变1时不执行,这样的程序用51单片机c语言怎么实现,我以前做plc的,单片机实在是不知道该如何编写,谢谢各位能指点一下。是不是每个输入都要在加个变量,输入等于1时赋1,等于0时把他也赋0,在程序执行条件时加进去,如果输入多的话,感觉太麻烦了啊

int a;

int n;

sbit key1=p1^1;

main()

{ n=0;

a=0

while(1)

  { if (key1==1&&a==0)

    { n=n+1;

      a=1;}

   if(key1==0)

   { a=0}

   }

}

我的程序这样写对吗,大家是这样处理这样情况吗



楼主最近还看过



周公

  • 精华:10帖
  • 求助:0帖
  • 帖子:119帖 | 5549回
  • 年度积分:0
  • 历史总积分:6446
  • 注册:2002年11月26日
发表于:2010-04-13 22:19:02
1楼
用两个中断,其中一个反相后输入,都设置为下降沿作用。

quickorslow

  • 精华:0帖
  • 求助:2帖
  • 帖子:29帖 | 61回
  • 年度积分:27
  • 历史总积分:170
  • 注册:2004年11月29日
发表于:2010-04-14 10:11:12
2楼

不是只有两个口可以做输入输出中断吗,我想多要点输入可以吗

浅醉闲眠

  • [版主]
  • 精华:3帖
  • 求助:3帖
  • 帖子:219帖 | 13148回
  • 年度积分:152
  • 历史总积分:116149
  • 注册:2002年6月21日
发表于:2010-04-15 10:10:12
3楼
那就扫描端口或用8259A做中断扩展。                                                                                 

周公

  • 精华:10帖
  • 求助:0帖
  • 帖子:119帖 | 5549回
  • 年度积分:0
  • 历史总积分:6446
  • 注册:2002年11月26日
发表于:2010-04-21 08:45:55
4楼
可以再使用T0、T1做中断,将内部数预置为0FFFFH、打开相应中断即可。

asdfzxcv7571

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:192
  • 历史总积分:194
  • 注册:2010年4月24日
发表于:2010-04-24 12:09:18
5楼

楼主说的多几个输入是同时进行的,还是每间隔一段时间输入一次啊?如果是每间隔一段时间输入一次的话,不就是输入一个脉冲嘛,用外部中断0或外部中断1都可以接收到脉冲的负跳变(即输入从1变0时)而触发中断程序。只要在中断程序里设置变量自加就可以了。

aidehua1988

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2010年4月23日
发表于:2010-04-24 12:21:24
6楼
用8259A做中断输入扩展,初始化设置为下降沿有效,然后根据中断类型码向51单片机写入中断服务程序即自增1程序,即可,此时中断产生一次就自增1

關羽

  • [版主]
  • 精华:5帖
  • 求助:21帖
  • 帖子:728帖 | 5626回
  • 年度积分:78
  • 历史总积分:82244
  • 注册:2004年5月28日
发表于:2011-07-04 09:29:12
7楼
如果不使用内部中断呢??怎么实现??这个问题在PLC里可是个很容易实现的哦!!期待高手的回答!

热门招聘
相关主题

官方公众号

智造工程师