C51--Task05 外部中断实验

一、外部中断控制蜂鸣器开关

具体任务:

当按键按下时蜂鸣器持续鸣叫,按键弹起时蜂鸣器静音。

代码:

#include<reg52.h>

//位定义蜂鸣器
sbit BEEP=P1^0;

//中断配置函数
static void InitInterrupt()
{
 IT0=1;//外部中断0为下降沿触发
 EX0=1;//外部中断0中断允许
 EA=1;//总中断允许
}

//主函数
void main()
{
 InitInterrupt();//调用配置中断
 while(1)
 {
 }
}

//外部中断服务函数
void External0_Handler() interrupt 0
{
 BEEP=~BEEP;
}

二、外部中断计数器

具体任务:

采用外部中断判断KEY1按下,每次按下按键后记录按动次数加1,并且能在数码管上显示,能够从0计数至9999

代码:

#include<reg52.h>

//位定义数码管
sbit SegmentG1=P2^3;
sbit SegmentG2=P2^2;
sbit SegmentG3=P2^1;
sbit SegmentG4=P2^0;
sbit KEY1 = P3^2;

//定义数组0~9
static unsigned char s_arrNumber[] ={0x03, 0x9F, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x09};

//延时函数
static void DelayNms(int nms)
{
  unsigned int i,j;
  for(i=0;i<nms;i++)
  {
    for(j=0;j<123;j++)
    {
      
    }
  }
}

//中断配置函数
static void InitInterrupt()
{
 IT0=1;//外部中断0为下降沿触发
 EX0=1;//外部中断0中断允许
 EA=1;//总中断允许
}

//主函数
void main()
{
  InitInterrupt();//调用中断配置
	while(1)
  {
	}
 
}

//外部中断服务函数
void External0_Handler() interrupt 0
{
 static unsigned int a,b,i,j= 0;//要定义为静态变量!

	i++;
  if(10==i)
  {
    i=0;
    j++;
  }
  else if(10==j)
  {
    j=0;
    b++;
  }
  else if(10==b)
  {
    b=0;
    a++;
  }
  
		
  while(0==KEY1)
  {
   P0 = s_arrNumber[i];
   SegmentG4 = 0;
   DelayNms(5);
   SegmentG4 = 1;
   P0 = s_arrNumber[j];
   SegmentG3 = 0;
   DelayNms(5);
   SegmentG3 = 1;
   P0 = s_arrNumber[b];
   SegmentG2 = 0;
   DelayNms(5);
   SegmentG2 = 1;
   P0 = s_arrNumber[a];
   SegmentG1 = 0;
   DelayNms(5);
   SegmentG1 = 1;
  }
}
		
    


三、按键识别长按短按操作

具体任务:

短按KEY1时实现顺序流水,长按KEY1时实现倒序流水。

代码:

#include <reg52.h>

//位定义
sbit LED1 = P2^4;
sbit LED2 = P2^5;
sbit LED3 = P2^6;
sbit LED4 = P2^7;
sbit KEY1 = P3^2;//后面如果用到了所以位定义不能省略


//延时函数
static void DelayNms(int nms)
{
  unsigned int i,j;
  for(i=0;i<nms;i++)
  {
    for(j=0;j<123;j++)
    {
    }
  }
}

//中断配置函数
static void InitInterrupt(void)
{
  IT0 = 1;//外部中断0下降沿触发
  EX0 = 1;//外部中断0中断允许
  EA =  1;//总中断允许
}

//主函数
void main()
{
	InitInterrupt();
  while(1)
  {
  }
}

//外部中断服务函数
void External0_Handle(void)interrupt 0
{
  if(0==KEY1)
  {
    DelayNms(500);//表至少持续了500ms的长按
      if(0==KEY1)//仍然被按下
      {
        while(1)//执行长按循环
        {
          LED1 = 0;
          DelayNms(500);
          LED2 = 0;
          DelayNms(500);
          LED3 = 0;
          DelayNms(500);
          LED4 = 0;
          DelayNms(500);
          LED1 = 1;
          DelayNms(500);
          LED2 = 1;
          DelayNms(500);
          LED3 = 1;
          DelayNms(500);
          LED4 = 1;
          DelayNms(500);
        }
      }
  }
  while(1)//否则进入另一个循环
  {
    LED4 = 0;
    DelayNms(500);
    LED4 = 1;
    
    LED3 = 0;
    DelayNms(500);
    LED3 = 1;
    
    LED2 = 0;
    DelayNms(500);
    LED2 = 1;
    
    LED1 = 0;
    DelayNms(500);
    LED1 = 1;
  }
}

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值