标题: 新手求解决单片机中断问题 [打印本页]

作者: 权0408    时间: 2020-1-4 23:47
标题: 新手求解决单片机中断问题
单片机主程序一加入中断,就无法执行死循环里面的命令。
程序如下:10、设计一控制系统并仿真:包括3个按键(A、B、C键)、8个LED和2位7段数码管。
按A键后开始1个LED灯左循环,第二轮2LED个灯左循环,第三轮3LED个灯左循环,第四轮回到一个灯左循环;
同时7段数码管循环显示0-9。按B、C键分别用于增加和减少跑马灯及数码管的显示速度。
添加中断后,数码管会亮,但是跑马灯就不会再显示了。注释掉中断,跑马灯就又可以了。

单片机源程序如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dsy_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};   //共阴

sbit ka=P3^4;
sbit kb=P3^5;
sbit kc=P3^6;
sbit LE2=P2^6;
sbit LE3=P2^7;

int a=0;        //控制是否开始跑马灯
int n=5;        //控制闪烁的频率

void delay(uint x)
{
        uchar t;
        while(x--)
        for(t=0;t<120;t++);
}



void key()
{
        if(ka==0)
        {
                delay(20);
                if(ka==0)
                {
                        a=1;        
                }
                while(!ka);
        }
}

void key2()
{
        if(kb==0)
        {
                delay(20);
                if(kb==0)
                {
                        n--;        
                }
                while(!kb);
        }
        if(kc==0)
        {
                delay(20);
                if(kc==0)
                {
                        n++;        
                }
                while(!kc);
        }               
}

void init()
{
          TMOD=0x10;
        TH1=0xd8;
        TL1=0xf0;
        EA=1;
        ET1=1;
        TR1=1;
        TF1=0;
}

void main()
{
        int i;
        int b;
        int led;
    init();        
        P3=0xff;
        while(1)
        {
                key();
                if(a==1)
           {        
                while(1)
                {
                        led=0xfe;                                //一个灯循环左移               
                        for(i=0;i<8;i++)
                        {
                                P1=led;
                                led=_crol_(led,1);
                                key2();
                                for(b=0;b<n;b++)
                                {
                                        delay(40);
                                }
                        }
                        led=0xfc;                                //两个灯循环左移                        
                        for(i=0;i<8;i++)
                        {
                                P1=led;
                                led=_crol_(led,1);
                                key2();
                                for(b=0;b<n;b++)
                                {
                                        delay(40);
                                }
                        }
                        led=0xf8;                                //三个灯循环左移                        
                        for(i=0;i<8;i++)
                        {
                                P1=led;
                                led=_crol_(led,1);
                                key2();
                                for(b=0;b<n;b++)
                                {
                                        delay(40);
                                }
                        }
                 }
                }        
        }
}

void timer() interrupt 3
{
        int c;
        LE2=0;
        LE3=0;
        TH1=0xd8;
        TL1=0xf0;
        TF1=0;
        for(c=0;c<9;c++)
        {
                LE3=1;
                P0=0xdf;
                LE3=0;
                LE2=1;
                P0=dsy_code[c];
                delay(100);
                LE2=0;
                LE3=1;
                P0=0xef;
                LE3=0;
                LE2=1;
                P0=dsy_code[0];
                delay(20);
                LE2=0;
        }        
}


作者: 权0408    时间: 2020-1-4 23:50
希望有大佬回答一下
作者: angmall    时间: 2020-1-5 07:13
通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,则下次中断有可能不会被触发,就会延误响应中断了,导致定时器时间出错。

作者: aking991    时间: 2020-1-5 08:57
就是中断里执行程序问题,中断的权限比你跑马灯高,所以会一直在中断里,加上你中断中作了很多事且时间长,所以当然不会执行跑马灯,建议中断里作的事情越少越好,你可以在中断时置一个标志位,然后在主程序中检测到这个标志位置位后再执行你要执行的东西,但由于单片机是单线程的,总是要一个一个跑才可以,所以要控制时间,执行函数越少越好。
作者: 权0408    时间: 2020-1-6 17:21
aking991 发表于 2020-1-5 08:57
就是中断里执行程序问题,中断的权限比你跑马灯高,所以会一直在中断里,加上你中断中作了很多事且时间长, ...

谢谢。
作者: 权0408    时间: 2020-1-6 17:21
angmall 发表于 2020-1-5 07:13
通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,则下次中断有可能不会被触发,就会延误 ...

好的,谢谢。




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