打印

请教学习中断遇到的问题

[复制链接]
2329|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jd吕凯|  楼主 | 2010-10-18 17:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#define uchar unsigned char
sbit LED0=P1^0;
sbit LED1=P1^1;
void delay_ms(int s);
void main()
{IT1=1;
EA=1;
EX1=1;
LED0=0;
while(1)
}
void INT_1() interrupt 2
{EX1=0;
LED0=1;
LED1=~LED1;
while(P3&0x08==0x00);
EX1=1;}

这是我在看了点中断的知识自己写的,我搞不懂为什么我把主程序里最后一行的while循环去掉后,在中断程序里LED0=1就不能将灯关掉了。而且去掉这个循环的话仍然还能反复进入中断呢?实在是一点不懂,希望得到前辈及高手解答!

相关帖子

沙发
dvp005| | 2010-10-18 18:46 | 只看该作者
while(1);  不能少啊, 不然你的MAIN 函数结束在哪里呢? 中断一般就是设置好优先级,触发方式,出中断时,记着清中断标志位。没有什么的,多练习吧。

使用特权

评论回复
板凳
zdhlixiang2006| | 2010-10-18 18:47 | 只看该作者
没有while我真无法想像程序是怎么运行的

使用特权

评论回复
地板
chen3bing| | 2010-10-18 20:14 | 只看该作者
没有while循环,你的中断函数返回到哪里去呢?

使用特权

评论回复
5
artxun| | 2010-10-18 20:26 | 只看该作者
没有while循环的话,你的主程序只执行了一次,就停在那里了。连外部中断也没有机会响应了

使用特权

评论回复
6
免证入网| | 2010-10-18 22:35 | 只看该作者
不是停,是直接结束了。就像一个被调用的函数一样,很快执行完。

使用特权

评论回复
7
jd吕凯|  楼主 | 2010-10-19 15:44 | 只看该作者
谢谢大家!我还是想知道为什么是这样?就是说能不能说详细点,我知道,也许你们的意思就是它就是这样的,习惯了就好了。但我实在不喜欢这样去模仿别人的。还希望有热心的帮我解释一下!我重点想说的是:虽然我去掉了while循环,但中断仍然能够进入啊,而且出来后再反复进入都没问题。就是在中断里LED0不能灭掉了。

使用特权

评论回复
8
liuyuxiier| | 2010-10-19 16:34 | 只看该作者
是这样的,去掉循环后,main函数会不断的被执行,这时你的程序可以理解成这样
while(1)
{
main();
}
而你的main函数里有 led0=0;会不断的被执行
所以你中断函数的LED0=1虽然被执行了,但是时间很短,人眼可能分辨不出来
希望对你有帮助

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
不亦心 + 1
9
jd吕凯|  楼主 | 2010-10-19 16:58 | 只看该作者
8# liuyuxiier
原来是这样?非常感谢……

使用特权

评论回复
10
免证入网| | 2010-10-19 22:19 | 只看该作者
还有像七楼所说那样的事?那你延时长点看看怎么样,程序为:main (){p1.1=0;delay(20000);p1.1=1;delay(20000);}按照七楼意思应该可以看到是不停闪烁,但是我估计只会有一会儿亮。然后把两个p1.1语句位置交换再试。估计只会闪一下。

使用特权

评论回复
11
免证入网| | 2010-10-19 22:20 | 只看该作者
对不起,是八楼

使用特权

评论回复
12
liuyuxiier| | 2010-10-20 08:41 | 只看该作者
11# 免证入网
你可以试一下啊~单片机就是这样的,如果MAIN函数执行完的话,他会重新再来一次的,因为他不可能停止在那里的~只能重新再来了~

使用特权

评论回复
13
不亦心| | 2010-10-20 08:58 | 只看该作者
C:0x0000    020003   LJMP     C:0003
C:0x0003    787F     MOV      R0,#0x7F
C:0x0005    E4       CLR      A
C:0x0006    F6       MOV      @R0,A
C:0x0007    D8FD     DJNZ     R0,C:0006
C:0x0009    758107   MOV      SP(0x81),#0x07
C:0x000C    020016   LJMP     main(C:0016)
C:0x000F    00       NOP      
C:0x0010    00       NOP      
C:0x0011    00       NOP      
C:0x0012    00       NOP      
C:0x0013    020020   LJMP     INT_1(C:0020)
     6: void main()
     7: {IT1=1;
C:0x0016    D28A     SETB     IT1(0x88.2)
     8: EA=1;
C:0x0018    D2AF     SETB     EA(0xA8.7)
     9: EX1=1;
C:0x001A    D2AA     SETB     EX1(0xA8.2)
    10: LED0=0;
C:0x001C    C290     CLR      LED0(0x90.0)
    11: while(1);
    12: }
C:0x001E    80FE     SJMP     C:001E
    13: void INT_1() interrupt 2
    14: {EX1=0;
C:0x0020    C2AA     CLR      EX1(0xA8.2)
    15: LED0=1;
C:0x0022    D290     SETB     LED0(0x90.0)
    16: LED1=~LED1;
C:0x0024    B291     CPL      LED1(0x90.1)
    17: while(P3&0x08==0x00);
C:0x0026    D2AA     SETB     EX1(0xA8.2)
C:0x0028    32       RETI     
C:0x0029    00       NOP      


C:0x0000    020003   LJMP     C:0003
C:0x0003    787F     MOV      R0,#0x7F
C:0x0005    E4       CLR      A
C:0x0006    F6       MOV      @R0,A
C:0x0007    D8FD     DJNZ     R0,C:0006
C:0x0009    758107   MOV      SP(0x81),#0x07
C:0x000C    020016   LJMP     main(C:0016)
C:0x000F    00       NOP      
C:0x0010    00       NOP      
C:0x0011    00       NOP      
C:0x0012    00       NOP      
C:0x0013    02001F   LJMP     INT_1(C:001F)
     6: void main()
     7: {IT1=1;
C:0x0016    D28A     SETB     IT1(0x88.2)
     8: EA=1;
C:0x0018    D2AF     SETB     EA(0xA8.7)
     9: EX1=1;
C:0x001A    D2AA     SETB     EX1(0xA8.2)
    10: LED0=0;
    11: //while(1);
C:0x001C    C290     CLR      LED0(0x90.0)
    12: }
C:0x001E    22       RET      
    13: void INT_1() interrupt 2
    14: {EX1=0;
C:0x001F    C2AA     CLR      EX1(0xA8.2)
    15: LED0=1;
C:0x0021    D290     SETB     LED0(0x90.0)
    16: LED1=~LED1;
C:0x0023    B291     CPL      LED1(0x90.1)
    17: while(P3&0x08==0x00);
C:0x0025    D2AA     SETB     EX1(0xA8.2)
C:0x0027    32       RETI     
C:0x0028    00       NOP

使用特权

评论回复
14
不亦心| | 2010-10-20 09:09 | 只看该作者
建议LZ自己反汇编看看

不然别人说什么你信什么,容易被误导。。。
23456L估计自己都没有调试过

使用特权

评论回复
15
免证入网| | 2010-10-20 10:11 | 只看该作者
关键是程序计数器加1后指向哪里了。我没试过,如果真是不停的执行主函数那么10楼的结果是应该不停的闪烁的。

使用特权

评论回复
16
免证入网| | 2010-10-20 12:35 | 只看该作者
看13楼反汇编,说明的确执行完了,返回了。这个根本不用自己调试。

使用特权

评论回复
17
qingqiu647| | 2010-10-20 14:48 | 只看该作者
while(1)后面的分号;不能省

使用特权

评论回复
18
jd吕凯|  楼主 | 2010-10-20 15:47 | 只看该作者
真的非常感谢每个人的帮助!我重新试了一下,去掉while后main函数是循环执行的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

169

帖子

1

粉丝