找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3137|回复: 11
收起左侧

关于单片机外部中断程序调试,为什么没有执行?

[复制链接]
ID:961087 发表于 2021-9-9 14:57 | 显示全部楼层 |阅读模式
本帖最后由 王披风 于 2021-9-9 17:18 编辑

第一次运用单片机的外部中断,但不知道什么原因中断里边的程序并没有执行,串口也打开了,是在开发板上进行调试的,单片机是STC89C52RC程序如下:
#include <REGX52.H>
#define uint  unsigned int
#define uchar  unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar num,num1;
uchar  table1[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d};
uchar  table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar  table3[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};        

void delayms(uint xms)
{
      uint i,j;
          for(i=xms;i>0;i--)
            for(j=110;j>0;j--);
}

void extern0()interrupt 0
{

            for(num1=0;num1<8;num1++)
            {
                     P1=table3[num1];
                          delayms(1000);
                 }
                 P1=0xff;         


}        


void main()
{
          IT0=0;
                EX0=1;
                EA=1;
         while(1)
         {
            for(num=0;num<6;num++)
            {        
                                wela=1;
                          P0=table2[num];
                                wela=0;
                          P0=0xff;

                          dula=1;
                                P0=table1[num];
                                dula=0;
                                delayms(500);
                                                   
                        }         
                }
}
IMG_20210909_145254.jpg

TX-1C增强版原理图.pdf

943.37 KB, 下载次数: 10

回复

使用道具 举报

ID:792340 发表于 2021-9-9 16:54 来自手机 | 显示全部楼层
你那个电路图有没有?还有就是把IT0=1,设置成下降沿触发方式
回复

使用道具 举报

ID:961087 发表于 2021-9-9 17:19 | 显示全部楼层
电ac 发表于 2021-9-9 16:54
你那个电路图有没有?还有就是把IT0=1,设置成下降沿触发方式

改了,我之前自己调试的时候就改正过,我把原理图放在了附件可以看下,
回复

使用道具 举报

ID:961087 发表于 2021-9-9 17:28 | 显示全部楼层
电ac 发表于 2021-9-9 16:54
你那个电路图有没有?还有就是把IT0=1,设置成下降沿触发方式

你好,这个方法我以前自己调试的时候设置过,但是还是没有用,我把原理图放在了附录,感谢指点
回复

使用道具 举报

ID:686482 发表于 2021-9-9 18:26 | 显示全部楼层
这个是要实现什么功能?
回复

使用道具 举报

ID:686482 发表于 2021-9-9 18:26 | 显示全部楼层
这个是要实现什么功能呢?
回复

使用道具 举报

ID:94031 发表于 2021-9-9 18:38 | 显示全部楼层
中断占得时间应尽量短,你在外中断里又是for,又是延时是不对的,完全可以在中断设置标志,在主循环里做处理。
回复

使用道具 举报

ID:213173 发表于 2021-9-9 21:59 | 显示全部楼层
用杜邦线一端接地另一端触碰P3.2触发外部中断,同时按下S2、S14也可触发外部中断。数码管交替显示012345和6789Ab。
  1. #include <REG51.H>
  2. #define uint  unsigned int
  3. #define uchar  unsigned char
  4. sbit dula=P2^6;
  5. sbit wela=P2^7;
  6. //顺序共阴极数码管段码表,段码a-h顺序接PX0-PX7
  7. uchar code table[]={//共阴数码管段码"0~f-."
  8.                 0x3f,0x06,0x5b,0x4f,
  9.                 0x66,0x6d,0x7d,0x07,
  10.                 0x7f,0x6f,0x77,0x7c,
  11.                 0x39,0x5e,0x79,0x71,0x40,0x80};
  12. uchar num,num1;
  13. uchar  table1[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d};
  14. uchar  table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
  15. uchar  table3[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};        
  16. bit flag;

  17. void delayms(uint xms)
  18. {
  19.         uint i,j;
  20.         for(i=xms;i>0;i--)
  21.                 for(j=110;j>0;j--);
  22. }

  23. void extern0()interrupt 0
  24. {
  25.         flag=~flag;
  26. }        


  27. void main()
  28. {
  29.         IT0 = 1;//set INT0 int type (1:Falling 0:Low level)
  30.         EX0 = 1;
  31.         EA  = 1;
  32.         while(1)
  33.         {
  34.                 P0=0x00;//消隐
  35.                 dula=1;//锁存
  36.                 dula=0;
  37.                 P0=~(0x01<<num);//位码
  38.                 wela=1;//锁存
  39.                 wela=0;
  40.                 if(!flag)                              
  41.                         P0=table[num];//段码
  42.                 else
  43.                         P0=table[num+6];//段码
  44.                 dula=1;//锁存
  45.                 dula=0;
  46.                 delayms(1);
  47.                 num=++num%6;
  48.         }
  49. }
复制代码
回复

使用道具 举报

ID:123289 发表于 2021-9-10 09:10 | 显示全部楼层
当按键按下时,会有弹动,会发出N次中断申请。你如何保证每次按下,只中断一次呢?
回复

使用道具 举报

ID:961087 发表于 2021-9-10 09:23 | 显示全部楼层
wulin 发表于 2021-9-9 21:59
用杜邦线一端接地另一端触碰P3.2触发外部中断,同时按下S2、S14也可触发外部中断。数码管交替显示012345和6 ...

感谢大佬,我自己的程序按了S2和S14中断也打开了,谢谢指点,茅塞顿开呀,感觉打开了新天地。非常感谢
回复

使用道具 举报

ID:961087 发表于 2021-9-10 09:30 | 显示全部楼层
xuyaqi 发表于 2021-9-9 18:38
中断占得时间应尽量短,你在外中断里又是for,又是延时是不对的,完全可以在中断设置标志,在主循环里做处 ...

#include <REGX52.H>
#define uint  unsigned int
#define uchar  unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar num,num1;
uchar  table1[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d};
uchar  table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar  table3[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
bit flag;

void delayms(uint xms)
{
      uint i,j;
          for(i=xms;i>0;i--)
            for(j=110;j>0;j--);
}

void extern0()interrupt 0
{
        flag=~flag;
}       


void main()
{
          IT0=1;
                EX0=1;
                EA=1;
         while(1)
         {
            for(num=0;num<6;num++)
            {       
                                wela=1;
                          P0=table2[num];
                                wela=0;
                          P0=0xff;

                                P0=0x00;
                          dula=1;
                                P0=table1[num];
                                dula=0;
                                delayms(500);
                         if(flag=~flag)
                        {
                                 for(num1=0;num1<8;num1++)
                                {
                                         P1=table3[num1];
                                         delayms(500);
                                }
                         P1=0xff;       
                               
                        }                               
          
         
                        }         
                       
                }
}
这样改了一下,我发现外部中断不用写也是同样的调试结果,反而是程序在主程序中顺序执行了,并没有用到这个外部中断。
回复

使用道具 举报

ID:961087 发表于 2021-9-10 09:34 | 显示全部楼层
wulin 发表于 2021-9-9 21:59
用杜邦线一端接地另一端触碰P3.2触发外部中断,同时按下S2、S14也可触发外部中断。数码管交替显示012345和6 ...

想请问一下,怎么不用硬件操作,直接在在主程序中打开外部中断,自动开启,下边这个程序我以为是我自己用到了标志位,可是我发现我在板子上看结果,发现我把主程序的外部中断打开给注释了,还是一样的结果,所以我不知道是不是我自己压根都没用到外部中断。只是程序在主程序中顺序执行了。大佬解答一下,这个问题困惑好久了。
#include <REGX52.H>
#define uint  unsigned int
#define uchar  unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar num,num1;
uchar  table1[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d};
uchar  table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar  table3[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
bit flag;

void delayms(uint xms)
{
      uint i,j;
          for(i=xms;i>0;i--)
            for(j=110;j>0;j--);
}

void extern0()interrupt 0
{
        flag=~flag;
}       


void main()
{
          IT0=1;
                EX0=1;
                EA=1;
         while(1)
         {
            for(num=0;num<6;num++)
            {       
                                wela=1;
                          P0=table2[num];
                                wela=0;
                          P0=0xff;

                                P0=0x00;
                          dula=1;
                                P0=table1[num];
                                dula=0;
                                delayms(500);
                         if(flag=~flag)
                        {
                                 for(num1=0;num1<8;num1++)
                                {
                                         P1=table3[num1];
                                         delayms(500);
                                }
                         P1=0xff;       
                               
                        }                               
          
         
                        }         
                       
                }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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