找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机流水灯中断嵌套,低优先级中断完成后如何返回主程序

[复制链接]
跳转到指定楼层
楼主
ID:1096060 发表于 2023-10-14 16:20 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要求:在 Proteus 里实现两级中断嵌套:当K1和K2都未按下时,P1口8只 LED 呈流水灯显示,当按一下 K 1时,产生一个低优先级外中断0请求(跳沿触发),进入外中断0中断服务程序,标号为偶数的 LED 和奇数 LED 交替闪烁10次。此时按一下 K 2时,产生一个高优先级的外中断1请求(跳沿触发),进入外中断1中断服务程序,使8只 LED 全部闪烁。当显示5次后,再从外中断1返回继续执行外中断0中断服务程序,直至偶数和奇数 LED 交替闪烁10次完成,然后再次返回主程序,8只 LED 呈流水灯显示。设置外中断0为低优先级,外中断1为高优先级

我的单片机代码:
#include <REGX51.H>
#include "intrins.h"
#define uchar unsigned char
sbit K1=P3^2;//定义按键
sbit K2=P3^3;
void Delay(unsigned int i)//延时函数                                       
{        unsigned int j;
         for(;i>0;i--)               
         for(j=0;j<125;j++)               
         {;}//空函数                                                                        
}
void main()//主函数
{
        unsigned char display [9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯显示数据数组
        unsigned char a;
        for(;;)               
        {
                EA=1;//总中断允许
                 EX0=1;//允许外部中断0中断
                 EX1=1;//允许外部中断1中断
                 IT0=1;//选择外部中断0为跳沿触发方式
                 IT1=1;//选择外部中断1为跳沿触发方式
                 PX0=0;//外部中断0为低优先级
                 PX1=1;//外部中断1为高优先级        
                for(a=0;a<9;a++)               
                 {                                                
                         Delay(400);//延时
                         P1=display[a];//已定义的流水灯显示数据送到P1口
                 }        
         }
}
void int0_isr(void) interrupt 0 using 0        //外中断0的中断服务函数
{
  unsigned char m=0;
  for(m=0;m<10;m++)//标号为偶数的LED和奇数LED交替闪烁10次
  {
    P1=0x55;//标号为偶数的LED灯点亮
    Delay(500);//延时
        P1=0xaa;//标号为奇数的LED灯点亮
        Delay(500);//延时
  }
}
void int1_isr(void) interrupt 2 using 1        //外中断1的中断服务函数
{
  unsigned char n=0;
  for(n=0;n<5;n++)//8位LED全亮全灭5次
  {
    P1=0;//8位LED全亮
        Delay(500);//延时
        P1=0xff;//8位LED全灭
        Delay(500);//延时
  }  
}

基本能完成题目要求,但是最后低优先级中断完成后无法返回主程序,求助怎么办。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:332444 发表于 2023-10-15 04:15 | 只看该作者
把中断设置代码放到主循环外,删除using 0和using 1即可。
回复

使用道具 举报

板凳
ID:332444 发表于 2023-10-15 09:17 | 只看该作者
  1. #include <REGX51.H>
  2. #include "intrins.h"
  3. #define uchar unsigned char
  4. sbit K1=P3^2;//定义按键
  5. sbit K2=P3^3;
  6. void Delay(unsigned int i)//延时函数                                       
  7. {        unsigned int j;
  8.          for(;i>0;i--)               
  9.          for(j=0;j<125;j++)               
  10.          {;}//空函数                                                                        
  11. }
  12. void main()//主函数
  13. {
  14.         unsigned char display [9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯显示数据数组
  15.         unsigned char a;

  16.                 EA=1;//总中断允许
  17.                  EX0=1;//允许外部中断0中断
  18.                  EX1=1;//允许外部中断1中断
  19.                  IT0=1;//选择外部中断0为跳沿触发方式
  20.                  IT1=1;//选择外部中断1为跳沿触发方式
  21.                  PX0=0;//外部中断0为低优先级
  22.                  PX1=1;//外部中断1为高优先级        
  23. for(;;)
  24. {
复制代码


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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