您现在所在的是:

单片机论坛

回帖:8个,阅读:9073 [上一页] [1] [下一页]
27947
guanyumou 版主
文章数:10552
年度积分:1130
历史总积分:27947
注册时间:2008/7/13
发站内信
2018论坛优秀版主
2018春节活动(三)
2017论坛优秀版主
2017国庆活动(二)
2017春节活动(三)
发表于:2011/7/4 9:12:08
#0楼
51单片机中如何检测一个数字量输入的上升沿或者下降沿信号?
比如我把P2.0作为一个数字量输入,接一个按钮!怎么检测这个按钮的上升沿或者下降沿呢?
基于各种组态软件\触摸屏\PLC\单片机\变频器Modbus TCP\RTU\ASCII通信编程服务,需要请直接
联系!腾讯扣扣149034219
19254
pqsh 版主
文章数:7424
年度积分:1084
历史总积分:19254
注册时间:2006/8/22
发站内信
2018论坛解答高手
发表于:2011/7/4 12:00:57
#1楼
先保存上次的状态,检测本次状态,如果不同,就是沿,然后保存本次状态.一般地,沿应该是有时效的,也许是在主程序循环里,也许用定时器.
如果我忘了我
请帮忙记得我
pqsh@163,326199298@v&q同号
27947
guanyumou 版主
文章数:10552
年度积分:1130
历史总积分:27947
注册时间:2008/7/13
发站内信
2018论坛优秀版主
2018春节活动(三)
2017论坛优秀版主
2017国庆活动(二)
2017春节活动(三)
发表于:2011/7/4 15:40:17
#2楼
不太明白!还请指教!
基于各种组态软件\触摸屏\PLC\单片机\变频器Modbus TCP\RTU\ASCII通信编程服务,需要请直接
联系!腾讯扣扣149034219
986
家民
文章数:28
年度积分:50
历史总积分:986
注册时间:2006/11/7
发站内信
发表于:2011/7/4 19:26:44
#3楼
如检测上升沿:JB  P2.0,  AA    意思是P2.0脚是1跳转AA处。
2181
jog0821
文章数:250
年度积分:50
历史总积分:2181
注册时间:2010/6/16
发站内信
发表于:2011/7/4 22:25:04
#4楼
不明白LZ的意思,是用示波器去检测按键脉冲,还是用单片机去检测(也叫输入)。
天道酬勤!
40344
tigermu 版主
文章数:14902
年度积分:1302
历史总积分:40344
注册时间:2004/8/12
发站内信
2018论坛优秀版主
2018春节活动(二)
2017论坛优秀版主
2017国庆活动(一)
2016论坛优秀版主
2016国庆活动(一)
2015论坛优秀版主
西门子logo体验(三)
英威腾PLC体验(三)
2015春节活动
2014论坛优秀版主
2013论坛优秀版主
2012论坛优秀版主
2010年度论坛贡献奖
发表于:2011/7/5 9:05:07
#5楼
中断或者定时查询。记录初始状态,然后不断比较,发现不同,延时消抖,确认。
清泉石上,明月松间。
27947
guanyumou 版主
文章数:10552
年度积分:1130
历史总积分:27947
注册时间:2008/7/13
发站内信
2018论坛优秀版主
2018春节活动(三)
2017论坛优秀版主
2017国庆活动(二)
2017春节活动(三)
发表于:2011/7/5 21:42:58
#6楼
不用中断!!
基于各种组态软件\触摸屏\PLC\单片机\变频器Modbus TCP\RTU\ASCII通信编程服务,需要请直接
联系!腾讯扣扣149034219
758
hDragon
文章数:19
年度积分:50
历史总积分:758
注册时间:2011/3/30
发站内信
发表于:2011/7/22 9:45:34
#7楼
参考程序
按照你的要求写的程序,你可以参考一下:
#define NOEDGE (0)
#define UPEDGE (1)
#define DOWNEDGE                (2)

#define HIGH (1)
#define LOW (0)

sbit Key =P2^0;

unsigned char OldState,aEdge=NOEDGE;

void main(void)
{
OldState=Key;
while(1){
 switch(OldState&0x01){
  case HIGH:
if(Key==LOW)
 {aEdge=DOWNEDGE; OldState=Key;}
break;
  case LOW:
if(Key==HIGH)
 {aEdge=UPEDGE; OldState=Key;}
break;
  default:  aEdge=NOEDGE;
 }
if(aEdge==UPEDGE)
 {
  //上升沿处理的代码
  aEdge=NOEDGE; //此行保证一个沿只处理一次
 }
else if(aEdge==DOWNEDGE)
 {
  //下降沿处理的代码
  aEdge=NOEDGE; //此行保证一个沿只处理一次
 }
}
}
27947
guanyumou 版主
文章数:10552
年度积分:1130
历史总积分:27947
注册时间:2008/7/13
发站内信
2018论坛优秀版主
2018春节活动(三)
2017论坛优秀版主
2017国庆活动(二)
2017春节活动(三)
发表于:2011/10/30 20:48:22
#8楼
以下是引用hDragon在2011/7/22 9:45:34的发言:
按照你的要求写的程序,你可以参考一下:
#define NOEDGE  (0)
#define UPEDGE  (1)
#define DOWNEDGE                 (2)

#define HIGH  (1)
#define LOW  (0)

sbit Key   =P2^0;

unsigned char OldState,aEdge=NOEDGE;

void main(void)
{
 OldState=Key;
 while(1){
  switch(OldState&0x01){
   case HIGH:
    if(Key==LOW) 
     {aEdge=DOWNEDGE; OldState=Key;}
    break;
   case LOW:
    if(Key==HIGH) 
     {aEdge=UPEDGE; OldState=Key;}
    break;
   default:  aEdge=NOEDGE;
  }
 if(aEdge==UPEDGE)
  {
   //上升沿处理的代码
   aEdge=NOEDGE; //此行保证一个沿只处理一次
  }
 else if(aEdge==DOWNEDGE)
  {
   //下降沿处理的代码
   aEdge=NOEDGE; //此行保证一个沿只处理一次
  }
 }
}
有参考价值

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

78.0005