找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1790|回复: 5
打印 上一主题 下一主题
收起左侧

新手求解决单片机中断问题

[复制链接]
跳转到指定楼层
楼主
ID:681346 发表于 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;
        }        
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:681346 发表于 2020-1-4 23:50 | 只看该作者
希望有大佬回答一下
回复

使用道具 举报

板凳
ID:155507 发表于 2020-1-5 07:13 | 只看该作者
通常在中断子程序中是不调用延时子程序的,这样会增加中断处理时间,则下次中断有可能不会被触发,就会延误响应中断了,导致定时器时间出错。
回复

使用道具 举报

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

使用道具 举报

5#
ID:681346 发表于 2020-1-6 17:21 | 只看该作者
aking991 发表于 2020-1-5 08:57
就是中断里执行程序问题,中断的权限比你跑马灯高,所以会一直在中断里,加上你中断中作了很多事且时间长, ...

谢谢。
回复

使用道具 举报

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

好的,谢谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表