标题: 单片机外部中断结束后,程序运行错误 [打印本页]

作者: 1225751467    时间: 2018-5-8 21:56
标题: 单片机外部中断结束后,程序运行错误
#include<reg52.h>
unsigned char a;
void main()
{
    a=0xf0;
    EA=1;
    EX0=1;
    IT0=0;
    while(1)
    {
        P1=a;
    }
}
void int0() interrupt 0
{
    a=0x0f;
}
外部中断的低电平撤销后,P1的值变不回来,请问这是怎么回事,需要怎么改?


作者: zhongbo1991    时间: 2018-5-8 23:01
单片机保持最后的状态,所以a还是等于0x0f,
while(1)
{if(IT0!=0)
   {a=0xf0;}
   P1=a;
}
你试试,我也是刚学的
作者: 1225751467    时间: 2018-5-9 08:17
zhongbo1991 发表于 2018-5-8 23:01
单片机保持最后的状态,所以a还是等于0x0f,
while(1)
{if(IT0!=0)

很感谢,但还是回不来
作者: wulin    时间: 2018-5-9 09:04
void int0() interrupt 0
{
    a=~a;
}
作者: HC6800-ES-V2.0    时间: 2018-5-9 09:12
你的程序没有问题:外部中断0发生后,P1口的值变化了的。
我已经在我的板子上试验通过了。说明中断没有问题。

变不回来,因为你的程序没有让它变回来啊。
要变原来的值,你的主循环中,就要有设置语句才行。
可能你理解中断的执行有误解:中断发生后,回到原来程序发生中断时的位置,不是让程序从头再来一次!
按你的程序,只能是回到主循环内,你的a就是初值是之前定义的,当然就执行不到了。
作者: blossom99    时间: 2018-5-11 01:39
IT0=0,你的意思是按下按键P1=0x0f,松开按键P1=0xf0?
这回试试行不行······
#include<reg52.h>
unsigned char a;
void main()
{
    EA=1;
    EX0=1;
    IT0=0;
    while(1)
    {
        a=0xf0;
        P1=a;
    }
}
void int0() interrupt 0
{
    a=0x0f;
    P1=a;
}
有一个疑问,这里IT0=0,不是低电平一直中断吗,P1的值怎么会改变(当一直中断的时候)?是在给高电平后中断结束,P1才被重新赋值的吧
所以你的P1一直是中断语句中赋予的值,其实中断中重复了那么多次赋值,仅仅是赋值给a而已,和P1没有关系的
作者: 1225751467    时间: 2018-5-11 18:22
wulin 发表于 2018-5-9 09:04
void int0() interrupt 0
{
    a=~a;

十分感谢,谢谢
作者: 1225751467    时间: 2018-5-11 18:23
HC6800-ES-V2.0 发表于 2018-5-9 09:12
你的程序没有问题:外部中断0发生后,P1口的值变化了的。
我已经在我的板子上试验通过了。说明中断没有问 ...

谢谢大佬解答
作者: 1225751467    时间: 2018-5-11 18:25
blossom99 发表于 2018-5-11 01:39
IT0=0,你的意思是按下按键P1=0x0f,松开按键P1=0xf0?
这回试试行不行······
#include

我是用一根线将3.2接到gnd了,然后把线拔掉,理论上要退出中断啊,这个程序是a的赋值把我搞晕了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1