找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机两外部中断嵌套,执行优先级怎么设置?求代码解读或提示

[复制链接]
跳转到指定楼层
楼主
ID:253829 发表于 2017-11-26 17:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机两外部中断嵌套,执行优先级怎么设置?自己的设置没用,求代码解读,或提示点。谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:111634 发表于 2017-11-26 19:19 | 只看该作者
先学理论,打基础,否则,问题多多,事倍功半。
回复

使用道具 举报

板凳
ID:164602 发表于 2017-11-27 09:19 | 只看该作者
我有一个程序,是有关这个内容的,你看看。

//#include <STC89.H>
#include<reg52.h>
#include"LY.h"//延时函数头文件
#include<intrins.h>       

#define GPIO_LED P2
#define GPIO_DIG P0

sbit k1=P3^1;
sbit k2=P3^0;

sbit Beep =  P1^5 ;

void IntConfiguration();//中断设置子函数
void delay(unsigned int i) ;

unsigned char code DIG_CODE[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsigned char p;

void main(void)
{
        unsigned char n;
        unsigned char m;

        IntConfiguration();
        p=0xff;
        GPIO_LED=p;

        while(1)
        {       

                if(k1==0)//独立按键k1
                {
                        Delay10ms(1);
                        if(k1==0)
                        {
                                if(p==0xff)
                                {
                                        p=0x00;
                                        GPIO_LED=p;
                                }
                                else
                                {
                                        p=0xff;
                                        GPIO_LED=p;
                                }
                            while((m<50)&&(k1==0))
                            {
                                    Delay10ms(1);
                                    m++;
                            }
                            m=0;
                        }

                }

                if(k2==0)//独立按键k2
                {
                        Delay10ms(1);
                        if(k2==0)
                        {
                                if(p<0x80)
                                {
                                    p=0x7f;
                                        GPIO_LED=p;
                                        Delay10ms(50);
                                        for(n=0;n<7;n++)
                                    {
                                            p=_cror_(p,1);
                                                GPIO_LED=p;
                                                Delay10ms(50);
                                        }
                                }
                                else
                                {
                                    p=0xfe;
                                        GPIO_LED=p;
                                        Delay10ms(50);
                                        for(n=0;n<7;n++)
                                    {
                                            p=_crol_(p,1);
                                                GPIO_LED=p;
                                                Delay10ms(50);
                                        }

                                }
                            while((m<50)&&(k2==0))
                            {
                                    Delay10ms(1);
                                    m++;
                            }
                            m=0;
                        }
                }

        }               
}

void delay(unsigned int i)//延时19.3us,主要用于发声音
{
    unsigned char j;
    for(i; i > 0; i--)
        for(j = 100; j > 0; j--);
}

void IntConfiguration()//中断设置子函数
{
        IT0=1;
        EX0=1;
        PX0=0;//低优先级
        IT1=1;
        EX1=1;
        PX1=1;//高优先级
        EA=1;
}

void Int0(void)        interrupt 0//外部中断0的中断服务函数
{
        unsigned int n;
        n=0;
        while(n<1500)
    {
            Beep= 1;
            delay(5);
            Beep= 0;
            delay(5);
        n++;
        }
        IE0=0;
}

void Int1(void) interrupt 2//外部中断1的中断服务函数
{
        unsigned char x,i,j;
        p=GPIO_LED;//保存原来的P2口值
        x=25;//延时时间长短                         
        i=0; //循环次数
        j=0xe3;//点亮数码管的最右位
        while (i<16)
        {
                GPIO_LED=j;                               
                GPIO_DIG=DIG_CODE[i];
                Delay10ms(x);
                if (j==0xff)
                {
                        j=0xdf;                       
                }
                j=j+0x04;
                i=i+1;
        }
        GPIO_DIG=0x00;
        GPIO_LED=p;
        IE1=0;
}

执行效果是:
按k3(外部中断0)响蜂鸣器,按k4(外部中断1),显示数码管。
按k3后,蜂鸣器响,马上按K4,会立即去显示数码管,显示完毕,再回来继续响蜂鸣器,说明外部中断1优先级高,可以打断外部中断0的程序。按k4显示数码管,再按k3,没有反应,等显示完毕,才响蜂鸣器,也说明外部中断1优先级高,不会被低优先级的外部中断0打断程序。
回复

使用道具 举报

地板
ID:254068 发表于 2017-11-27 10:54 | 只看该作者
厉害了  楼主
回复

使用道具 举报

5#
ID:253829 发表于 2017-12-2 09:11 | 只看该作者
谢谢了!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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