实验:要求是开机的时候led1灯点亮闪烁,用杜邦线给P32(外部中断0)接低电平时,led2灯点亮,led1灯熄灭。去除杜邦线P32回到高电平时,led1点亮闪烁,led2灯熄灭。
问题:现在问题是当给P32低电平的时候led2点亮了,但led1没有熄灭,而是闪烁的速度变慢了?P32回到高电平时,led2还是一直亮着?
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void delay(uint);
sbit led2=P2^7; //中断时点亮这LED灯
sbit led1=P2^0;
void main()
{
EA=1;
EX0=1;
led1=0; //点亮LED灯
delay(1000); //延时
led1=1; //熄灭LED灯
delay(1000); ////延时
}
void exter0() interrupt 0
{
led2=0;
}
void delay(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=1000;y>0;y--);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
书上说,要是不设置触发方式就默认是低电平触发的。
//这个在理论上是多余的 但是单片机运行的比较快 会给我们错觉 按下按键触发中断时 感觉上是按了一次 实际上处理了好几次
//感觉上正在执行中断代码 实际上在一段很短的时间内 执行了N个中断 b*N个while里的点led1 现象就是led1在那里闪
//led点亮也是要有电流 且持续一段时间才可以的 时间不足会暗或闪 呼吸灯就是这么搞得 可以利用占空比控制你的led成为呼吸灯
//所以实际应用要用好点的按键不要用生锈的、程序上注意消抖、等等
sbit KEY1 = P3^2;// p32可能是接的按键
。。。。。。。。(此处略去几个字)
void main()
{
EA=1;
EX0=1;
IT0=0;
while(1)
{
if(flag==1)//正常执行循环点灯
{
led2=1;
led1=0; //点亮LED灯
delay(1000); //延时
led1=1; //熄灭LED灯
delay(1000); ////延时
}
}
}
void exter0() interrupt 0
{
Delay(2); //为了按键按下消抖
if(KEY1 == 0) //低电平了
{
flag=0;// while循环里 led1不可以亮了
led2=0;//点led
flag=1;//while又起作用了
}
Delay(30); 为了按键抬起消抖
}
........(此处略去一些字)
还可以利用定时中断让led1闪烁,在外中断里控制定时中断的使能
一周热门 更多>