51单片机的外部中断如何写按键消抖c程序!

51单片机的外部中断如何写按键消抖c程序!,第1张

跟外部的按键消抖一样处理就可以了。

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语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10001447.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存