您的位置: proteus仿真社区 >> 论坛 >> 仿真求助专区 >> 查看帖子
字体: 小 中 大 | 打印 发表于: 2008-7-16 13:14 作者: fzpxp 来源: proteus仿真社区
INT.rar(2008-07-16 13:14:25, Size: 35 KB, Downloads: 4)
QUOTE:
原帖由 fzpxp 于 2008-7-16 13:14 发表 正在学习中断,写了个程序,实现目的: 有外部中断P3.2时点亮P1.0 无中断时数码管一,循环显示0-F. 不知道为什么我按下P3.2时,有中断,这时P1.0也点亮了,但是这时数码管还是循环显示,只是循环显示的延时明显加长了,松开按钮P1.0灭,循环正常. 请问我程序哪里有错? ...
EXT0-INT.rar(2008-07-16 14:26:50, Size: 21.5 KB, Downloads: 3)
原帖由 fzpxp 于 2008-7-16 15:49 发表 运行您的程序一点问题都没有,我对比了一下才发现中断程序中,有延时就一切正常 void zhongduan() interrupt 0 {D1=0; delay(200); } 如果没有delay(200);这句就会象我第一次提的问题那样: 虽然已经中断(D1亮了),但是数码管没有停止循环,他还在循环,只是比没中断前循环的慢了,还是想不明白,延时会影响到什么?
最新回复
budhy (2008-7-16 14:26:50)
QUOTE:
哪儿也没错,就是你设计目标不明确。给你修改了,自己看看。
(2008-07-16 14:26:50, Size: 21.5 KB, Downloads: 3)
fzpxp (2008-7-16 15:49:24)
void zhongduan() interrupt 0
{D1=0;
delay(200);
}
如果没有delay(200);这句就会象我第一次提的问题那样:
虽然已经中断(D1亮了),但是数码管没有停止循环,他还在循环,只是比没中断前循环的慢了,还是想不明白,延时会影响到什么?
budhy (2008-7-18 18:32:25)
QUOTE:
delay(200)是防止中断程序屡次运行。当中断程序屡次运行时就发生你原本的现象。fzpxp (2008-7-26 09:45:51)
liaoguobao00 (2008-8-02 12:51:37)
3楼说法不是问题的本质,应该在主程序中加一句IT=1;这句的意思是下降沿触发,所以当你按下开关不放时也只有一次下降沿,程序只中断一次,数码管保持显示不变,灯亮,当再点一次开关时,灯灭,数码管接着循环显示。
程序如下,只改了很细微的地方,用心看哦!
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code seg[]=
{0xC0,0xF9,0xA4,0xB0,
0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,
0xC6,0xA1,0x86,0x8E};
sbit D1=P1^0;
void delay(uint i)
{ uint j;
for(i;i>0;i--)
for(j=50;j>0;j--);
}
bit j;
void xunhuan()
{ uint i;
P2=0x01;
for(i=0;i<16;i++)
{if(j==0){
P0=seg;
delay(500);}
}
}
void zhongduan() interrupt 0
{
D1=~D1;
j=~j;
}
void main()
{ D1=1;
EA=1;
IT0=EX0=1;
P0=0xFF;
while(1)
{
xunhuan();
}
}
fzpxp (2008-8-12 11:13:04)
另外每次中断出现j变一次位,也就是每隔一个中断周期,给数码管赋值一次,这样不对吧?