打印
[51单片机]

关于外部中断信号检测问题

[复制链接]
2966|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjqlovelyy|  楼主 | 2013-10-1 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zjqlovelyy 于 2013-10-4 20:16 编辑


void Int0() interrupt 0  //外部中断0的中断函数
{
Delay(1);  //延时消抖
if(K3==0)   //K3定义为  sbit K3 = P3^2;
  KeyValue=1;
}
比如上面的一段代码,P3.2口没有接线,在P3.2口里面的电平信号的改变是怎么样的? 对于外部中断还是不太理解。又如定时/计数器中断这个比较好理解。

相关帖子

沙发
wangch_sh| | 2013-10-1 09:49 | 只看该作者
没接线应该不会改变。接了有电平变化或者上升沿或者下降沿才会改变。

使用特权

评论回复
板凳
zjqlovelyy|  楼主 | 2013-10-1 09:55 | 只看该作者
本帖最后由 zjqlovelyy 于 2013-10-1 16:00 编辑
wangch_sh 发表于 2013-10-1 09:49
没接线应该不会改变。接了有电平变化或者上升沿或者下降沿才会改变。

就好比如这个程序,执行结果是使Led闪烁,实际上,没接线,仍然可以闪烁
/*********************************************************************************
*实验名   :外部中断实验
*注意                        :由于P3.2口跟红外线共用,所以做按键实验时为了不让红外线影响实验效果,最好把红外线先
*取下来。
*实验效果        :K3按下LED左循环,K4按下LED变右循环
*
*********************************************************************************/
#include<reg51.h>
#include<intrins.h>

#define GPIO_LED        P2
//外部中断的IO
sbit K3=P3^2;
sbit K4=P3^3;

void IntConfiguration();
void Delay(unsigned int n);
unsigned char KeyValue=0;
/*******************************************************************************
* 函数名         : main
* 函数功能                   : 主函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void main(void)
{
        GPIO_LED=0Xfe;
        IntConfiguration();
        while(1)
        {
                if(KeyValue)
                        GPIO_LED=_crol_(GPIO_LED,1);
                else
                        GPIO_LED=_cror_(GPIO_LED,1);
                Delay(2000);               
        }        
}
/*******************************************************************************
* 函数名         : IntConfiguration()
* 函数功能                   : 设置外部中断
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void IntConfiguration()
{
        //设置INT0
        IT0=1;//跳变沿出发方式(下降沿)
        EX0=1;//打开INT0的中断允许。
        //设置INT1
        IT1=1;
        EX1=1;
        
        EA=1;//打开总中断        
}
/*******************************************************************************
* 函数名         : Delay(unsigned int n)
* 函数功能                   : 延时
* 输入           : n
* 输出                  : 无
*******************************************************************************/

void Delay(unsigned int n)   //延时50us误差 0us
{
    unsigned char a,b;
                for(;n>0;n--)
                {
            for(b=1;b>0;b--)
        for(a=22;a>0;a--);
                }
}
/*******************************************************************************
* 函数名         : Int0()        interrupt 0
* 函数功能                   : 外部中断0的中断函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/

void Int0()        interrupt 0                //外部中断0的中断函数
{
        Delay(1);         //延时消抖
        if(K3==0)
                KeyValue=1;
}
/*******************************************************************************
* 函数名         : Int1() interrupt 2
* 函数功能                   : 外部中断1的中断函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/

void Int1() interrupt 2                //外部中断1的中断函数
{
        Delay(1);                //延时消抖
        if(K4==0)
                KeyValue=0;        
}

使用特权

评论回复
地板
wangch_sh| | 2013-10-1 13:27 | 只看该作者
不接能闪烁吗/

使用特权

评论回复
5
zjqlovelyy|  楼主 | 2013-10-1 15:59 | 只看该作者
wangch_sh 发表于 2013-10-1 13:27
不接能闪烁吗/

没接线。可以闪烁

使用特权

评论回复
6
zjqlovelyy|  楼主 | 2013-10-2 11:57 | 只看该作者
没人了麽?   自己顶起吧

使用特权

评论回复
7
yirongfu| | 2013-10-2 13:08 | 只看该作者
仅从所贴代码来看,K3按下后,不按K4,KeyValue一直为1,那么main里头的
if(KeyValue)
  GPIO_LED=_crol_(GPIO_LED,1);
就会一直执行,而且是每Delay(2000)就移位一次,所以出现楼主所说的情况。

有仿真器的话,一跟踪就能发现问题

使用特权

评论回复
8
NE5532| | 2013-10-2 18:10 | 只看该作者
zjqlovelyy 发表于 2013-10-2 11:57
没人了麽?   自己顶起吧

楼主,你main里面的if判断,不是左移就是右移,没有既不左移,也不右移的状态啊,两个按钮,不是把KeyValue赋值为1,就是赋值为0,你说他能停下来么??楼主画下流程图就会发现自己的错误了。

使用特权

评论回复
9
生活的时尚| | 2013-10-3 15:05 | 只看该作者
路过看看啊

使用特权

评论回复
10
zjqlovelyy|  楼主 | 2013-10-4 20:08 | 只看该作者
本帖最后由 zjqlovelyy 于 2013-10-4 20:17 编辑
NE5532 发表于 2013-10-2 18:10
楼主,你main里面的if判断,不是左移就是右移,没有既不左移,也不右移的状态啊,两个按钮,不是把KeyVal ...

说错了,是一直左移,我想我明白了

使用特权

评论回复
11
zjqlovelyy|  楼主 | 2013-10-4 20:10 | 只看该作者
yirongfu 发表于 2013-10-2 13:08
仅从所贴代码来看,K3按下后,不按K4,KeyValue一直为1,那么main里头的
if(KeyValue)
  GPIO_LED=_crol_(G ...

不,我K3接的是P3的2口,K4接的是P3的3口,然后那两个口是没有接线的(即没接按键的)

使用特权

评论回复
12
zjqlovelyy|  楼主 | 2013-10-4 20:18 | 只看该作者
谢谢大家,我想我明白了。

使用特权

评论回复
13
yirongfu| | 2013-10-5 11:50 | 只看该作者
zjqlovelyy 发表于 2013-10-4 20:10
不,我K3接的是P3的2口,K4接的是P3的3口,然后那两个口是没有接线的(即没接按键的) ...

那一样,会执行
else
  GPIO_LED=_cror_(GPIO_LED,1);

两处易出问题的地方:
1。之前说的,按键动作只有一次,但会被执行无数次(除非未贴出代码的其它地方有处理)
2。if else语句对可能产生的状态组合欠考虑

使用特权

评论回复
14
我来看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

粉丝