跟外部的按键消抖一样处理就可以了。
void ext0() interrupt 0
{
delay(10);//
flag=0;//按键有效标志=0为无效
if(P3_2)
{
while(!P3_2);//等待按键抬起
flag=1;
}
}
外部中断的一般都是采用延时程序,而且延时程序一般是利用定时器做10~15ms的延时去抖,来实现的,而且时间不是特别精确,单片机书上和有关资料上应该都有我写一个参考一下:
void DelayMS(unsigned char a)
{int i;
for(;a>0;a--)
for(i=110;i>0;i--);
}延时约为a毫秒,不过不够准确,可以通过keil软件或者汇编来确立更精确的延时时间!
在中断执行前先做判断:用if语句看看引脚的电平,如果没有跳变,那么再延时判断,如果还没有跳变那么再延时,如此重复;
等到电平跳变了,延时看看是不是电平收其他非 *** 作性因素引起的,比如说电源抖动,延时之后再判断如果的确是跳变了,可以进行中断后的 *** 作了!
你写的上面有好几个错误,中断你打开的是外部中断1,那你为就应该把IT0=1;改为IT1=1;同时延时程序在前面声明应为void delayms(uint xms);main函数里你也应该把scan()放到while(1)里面。
#include<reg51h>
#include<intrinsh>
#define uchar unsigned char
uchar key;
void ext0() interrupt 0
{
if(P1&0x01)key=1;
else if(P1&0x02)key=2;
else if(P1&0x04)key=3;
else if(P1&0x08)key=4;
else key=0;
}
void delay(uchar a)
{
uchar i;
while(a--)for(i=0;i<120;i++);
}
main()
{
uchar led,i,j;
while(1)
{
switch(key)
{
case 1:
led=0xfe;
for(i=0;i<10;i++)
for(j=0;j<8;j++)
{
P1=led;
led=_crol_(led,1);
delay(200);
}
break;
case 2:
led=0x7f;
for(i=0;i<10;i++)
for(j=0;j<8;j++)
{
P1=led;
led=_cror_(led,1);
delay(200);
}
break;
case 3:
led=0x0f;
for(i=0;i<10;i++)
{
P1=led;
delay(200);
led=~led;
P1=led;
delay(200);
led=~led;
}
break;
case 4:
for(i=0;i<10;i++)
{
P1=0x00;
delay(200);
P1=0xff;
delay(200);
}
break;
}
}
}
外部中断的中断源与直接按钮的区别在于触发方式不同。根据查询相关公开信息显示,外部中断的中断源通常由外部设备或信号触发,而直接按钮则是由人为手动按下触发。在模拟外部中断的中断源时,需要将外部设备或信号与处理器的中断引脚相连接,并配置相应的中断服务程序。当外部设备或信号触发时,处理器会自动跳转到相应的中断服务程序中执行相应的处理。而直接按钮则是通过将按钮与处理器的GPIO口相连接,并在程序中监测该GPIO口的状态变化,从而实现按钮按下时的相应处理。
抱歉,之前没看到用中断,现在在程序上稍作修改
P3口为控制口(中断int0——p32),P1口为输出口,p2口提供高电平,LED为共阳极,程序如下:
#include <reg51h>
#define uchar unsigned char
#define uint unsigned int
sbit k1=P2^0;
sbit k2=P2^1;
sbit k3=P2^2;
sbit LED_1=P1^0;
sbit LED_2=P1^1;
sbit LED_3=P1^2;
void relay(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
while(1)
{
EA=1;
ET0=1;
while(P3^2==0)
{
if(k1==0)
{
LED_1=0;
relay(100);
}
if(k2==0)
{
LED_2=0;
relay(100);
}
if(k3==0)
{
LED_3=0;
relay(100);
}
}
}
程序完毕!
下面是电路图:
以上就是关于51单片机的外部中断如何写按键消抖c程序!全部的内容,包括:51单片机的外部中断如何写按键消抖c程序!、51单片机,用按键实现外部中断,软件如何去抖、用按键控制数码管(摁一次加一或减一)用外部中断 c语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)