我如何使用中断来重置程序或在函数调用期间返回主程序

问题描述 投票:0回答:1

我已经尝试了所有方法,并且知道(void(code *)(void))0)();,但您知道是否使用它并不能清除中断,因此您无法再次使用它。解决方法是什么,我必须根据硬件使用外部中断。我研究了无数小时,并浏览了几本书。我开始相信这不可能吗?代码:

#include <reg51.h>
void delay();
int i,a;
sbit btn=P3^2;
sbit sw1=P0^1;
void mode1();
void reset (void);

void main()
{
    EA=1;
    EX0=1;
    ET0=1;
    EX1=1;

while(1){
    EA=1;
    EX0=1;
    ET0=1;
    EX1=1;
        if(sw1){
            mode1();
        }
        P1=0x01;
    }
}

void ex0() interrupt 0{
    if(!btn){
        //reset();
        Enable_Watchdog(); 
    }
}
/*
void reset (void){
(//(void (code *) (void)) 0x0000) ();
    (void (code *)(void)) 0) ();
}
    */

void mode1(){

    unsigned char repeat1 = 0x80;
    unsigned char repeat0 = 0x01;
    int g=0;
    int i =0;
    int j=0;
    EA=1;
    EX0=1;
    ET0=1;
    EX1=1;
        //how many leds it must go accross minus 1 since repeat 1 and 0

        while(sw1){
        EA=1;
        EX0=1;
        ET0=1;
        EX1=1;
        for(i =0; i <7; i++){
                P1=repeat1 >> i;
                delay();
            }
        for(j=0; j<7; j++){
            P1=repeat0 << j;
            delay();
        }
    }
}


void delay(){
    int k, j;
    for(k=0; k<0xff; k++)
        for(j=0;j<0xff;j++);

}



c microcontroller 8051
1个回答
0
投票

您在问题代码中已经拥有的看门狗有什么问题?它将起作用,但需要进行精加工:

void ex0() interrupt 0
{
    if(!btn)
    {
        EA = 0;   // Disable interrupts
        Enable_Watchdog(); 
        for(;;);  // Wait for reset
    }
}

很显然,直到复位看门狗超时为止,因此,如果您不使用看门狗,则将其设置为尽可能短的时间。

如果可以的话,更好的解决方案是将GPIO连接到复位引脚(带上拉)并直接对其进行复位。复位时,GPIO将进入三态,因此通过上拉释放复位。初始化GPIO时需要注意不要立即将其拉低。最好将其保留为三态输入,直到您真正想要进行重置为止。

© www.soinside.com 2019 - 2024. All rights reserved.