找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1012|回复: 4
收起左侧

单片机流水灯程序仿真中断只执行一次,第二次无法执行?

[复制链接]
ID:1064239 发表于 2023-4-17 00:20 | 显示全部楼层 |阅读模式
设置的流水灯按键key2启动后key1对应的P3.2中断启动进去后停止了,但是在启动按键key2执行流水灯后中断就感觉失效了无法停止,并且两个按钮同时按下不松开的情况下竟然去执行key2的流水灯了,第二个问题除了main()函数调用使其中断结束后不执行程序还有什么办法使中断结束后不回到程序执行吗?
单片机源程序如下:
  1. #include<reg51.h>
  2. #include <intrins.h>
  3. sbit key1=P3^2;        //定义P3.2口为按键key1
  4. sbit key2=P3^3;        //定义P3.3口为按键key2
  5. sbit led1=P1^0;        //定义P1.0口为电源指示灯红灯
  6. sbit led2=P1^1;        //定义P1.1口为电源指示灯绿灯

  7. char a[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};        //初始化数组对应流水灯端口
  8. int i,k;

  9. void delay(int x)        //延时函数
  10. {char i;
  11.         while(x--)
  12.         {        for(i=0;i<120;i++);        }}

  13. void exint0() interrupt 0        //中断函数
  14. {
  15. if(key1==0)
  16. {
  17. delay(100);  //按键防抖

  18.   if(key1==0)  //判断执行中断
  19.   {         
  20.      P2=0Xff; //P2口复位
  21.      led1=0; //红色电源指示灯亮起
  22.          led2=1; //绿色电源指示灯停止
  23.          key2=1;//初始化P3.3按键
  24.          i=0; //初始化数值
  25.          k=0; //初始化数值
  26.          main();//返回主函数。--使其中断结束后不在回到程序继续执行                       
  27. }
  28. }
  29. }               

  30. void interr()//中断函数打开
  31. {
  32.          EA=1;                //开启总中断
  33.          EX0=1;                //开启外部中断P3.2
  34.          IT0=0;                //设置外部中断触发模式,1是下降沿触发,0是低电平触发
  35. }

  36. main()
  37. {
  38. interr();//初始化中断函数
  39. i=k=0;//初始化数值
  40. led1=0; //红色电源指示灯亮起
  41. led2=1; //绿色电源指示灯停止

  42.                
  43. while(1)//程序循环扫描
  44. {

  45.   if(key2==0)//判断P3.3接口按键是否启动
  46.   {         
  47.      interr();//初始化中断函数
  48.            i=0; //初始化数值
  49.             led2=0; //绿色电源指示灯亮起
  50.      led1=1; //红色电源指示灯停止
  51.      k=1; //初始化数值
  52.          
  53.            while(k)//初始化数值K为1后-开始循环流水灯
  54.          {
  55.          for(i=0; i<8; i++)        //循环判断         向下循环点亮LED
  56.         {
  57.             P2=a[i];  // 右移数组,点亮下一位LED
  58.            delay(400); //延时函数
  59.        }
  60.       
  61.        for(i=6;i>0; i--)  //循环判断  向上循环点亮LED
  62.        {
  63.             P2=a[i]; // 左移数组,点亮上一位LED
  64.             delay(400);  //延时函数
  65.        }
  66.     }}
  67. }
  68. }

复制代码


流水灯仿真.zip

57.7 KB, 下载次数: 2

回复

使用道具 举报

ID:213173 发表于 2023-4-17 07:22 | 显示全部楼层
中断调用主函数?编译能通过?
回复

使用道具 举报

ID:161164 发表于 2023-4-17 09:41 | 显示全部楼层
  1. #include<reg51.h>
  2. #include <intrins.h>
  3. sbit key1=P3^2;        //定义P3.2口为按键key1
  4. sbit key2=P3^3;        //定义P3.3口为按键key2
  5. sbit led1=P1^0;        //定义P1.0口为电源指示灯红灯
  6. sbit led2=P1^1;        //定义P1.1口为电源指示灯绿灯

  7. char a[8]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};       //初始化数组对应流水灯端口
  8. int i,j,k;

  9. void delay(int x)        //延时函数
  10. {
  11.         char i;
  12.         while(x--)
  13.         {
  14.                 for(i=0; i<120; i++);
  15.         }
  16. }

  17. void exint0() interrupt 0        //中断函数
  18. {
  19.         P2=0Xff; //P2口复位
  20.         led1=0; //红色电源指示灯亮起
  21.         led2=1; //绿色电源指示灯停止
  22.         i=0; //初始化数值
  23.         k=0; //初始化数值
  24. }

  25. void interr()//中断函数打开
  26. {
  27.         EA=1;                //开启总中断
  28.         EX0=1;                //开启外部中断P3.2
  29.         IT0=0;                //设置外部中断触发模式,1是下降沿触发,0是低电平触发
  30. }

  31. main()
  32. {
  33.         int cnt = 0;
  34.         interr();//初始化中断函数
  35.         i=j=k=0;//初始化数值
  36.         led1=0; //红色电源指示灯亮起
  37.         led2=1; //绿色电源指示灯停止


  38.         while(1)//程序循环扫描
  39.         {

  40.                 if(key2==0)//判断P3.3接口按键是否启动
  41.                 {
  42.                         k=1; //初始化数值
  43.                 }
  44.                 if(k)//初始化数值K为1后-开始循环流水灯
  45.                 {
  46.                         if(cnt == 0)
  47.                         {
  48.                                 cnt = 400;
  49.                                 if(!j)
  50.                                 {
  51.                                         P2=a[i];  // 右移数组,点亮下一位LED
  52.                                         i++;
  53.                                         if(i>=8)
  54.                                         {
  55.                                                 i=6;
  56.                                                 j=1;
  57.                                         }
  58.                                 }
  59.                                 else
  60.                                 {
  61.                                         P2=a[i];  // 右移数组,点亮下一位LED
  62.                                         i--;
  63.                                         if(i<=0)
  64.                                         {
  65.                                                 i=0;
  66.                                                 j=0;
  67.                                         }
  68.                                 }
  69.                         }
  70.                         else
  71.                         {
  72.                                 cnt--;
  73.                                 delay(1); //延时函数
  74.                         }
  75.                 }
  76.         }
  77. }

复制代码


回复

使用道具 举报

ID:1064239 发表于 2023-4-17 09:52 来自手机 | 显示全部楼层
wulin 发表于 2023-4-17 07:22
中断调用主函数?编译能通过?

主函数不是说不需要声明可以随意调用吗?
回复

使用道具 举报

ID:1064239 发表于 2023-4-17 09:56 | 显示全部楼层

谢谢大佬的参考程序,我好好研究一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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