51单片机中断控制遇到问题
时间:10-02
整理:3721RD
点击:
今天刚刚看完郭天祥的中断视频,然后试着用低电平的触发方式去运行数码管,然后用蜂鸣器响作为中断事件,用普中的开发板,P3^4接蜂鸣器,数码管2 4 6 8亮循环0到9,写完程序烧录进去后,把P3^2接地后蜂鸣器响起,数码管数字没有暂停,而是以很慢的速度继续循环,这是为什么?我的意图是P3^2接地后蜂鸣器响,数码管暂停循环,P3^2接高后数码管继续循环。
#include<reg51.h>
#define uint unsigned int
sbit fmq=P3^4;
void delay(uint z);
uint code duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
uint code weixuan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void xianshi();
uint i;
void main()
{
while(1)
{
EA=1;
EX0=1;
IT0=0;
xianshi();
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void zhongduan() interrupt 1
{
fmq=~fmq;
}
void xianshi()
{
for(i=0;i<8;i++)
{
P2=0x55;
P0=duanxuan[i];
delay(1000);
}
}
#include<reg51.h>
#define uint unsigned int
sbit fmq=P3^4;
void delay(uint z);
uint code duanxuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
uint code weixuan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void xianshi();
uint i;
void main()
{
while(1)
{
EA=1;
EX0=1;
IT0=0;
xianshi();
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void zhongduan() interrupt 1
{
fmq=~fmq;
}
void xianshi()
{
for(i=0;i<8;i++)
{
P2=0x55;
P0=duanxuan[i];
delay(1000);
}
}
你这个外部中断压根就没有控制数码管的暂停与启动啊,数码管在while(1)不停的循环显示。
定义一个标志,在中断中改变这个标志,在while(1)中查询这个标志,来执行和暂停数码管刷新
又是中断问题,按键不要用外部中断就没问题了,不是标志位问题,是单片机本身的问题,有些单片机这样写没问题的,就是进出中断时的那一刻单片机需要执行一条指令后才能再次就如中断,导致while(1)里面的程序还在走一步再执行一个中断又执行一个指令又进入中断,所以出现数码管变慢,声音还是响的。
先说中断问题外部中断0的中断号是0吧