单片机组合实验一——中断控制流水灯

题目

4×4键盘中(中断),当按键按下时,蜂鸣器响一声,然后8个led完成3种花式(每种亮三次)

代码

#include"reg51.h"
#include"intrins.h"
#define led P0
#define key P1
typedef unsigned int u16;
typedef unsigned char u8;
sbit key1=P3^2;             //位定义
sbit buzzer=P2^0;           //位定义
u16 keyvalue;               //键值

void delay (u16 i)          //延时函数(约10微秒)
{
	while(i--);
}

void int0_init()            //中断初始化函数
{
	EA=1;                     //中断总允许位
	EX0=1;                    //外部中断0允许位
	IT0=1;                    //下降沿触发
	EX1=1;                    //外部中断1允许位
	IT1=1;                    //下降沿触发
}

u16 key_scan()             //键盘扫描函数
{
	key=0xf0;                //列扫描
	if(key!=0xf0) 
	{
		delay(1000);           //消抖
		if(key!=0xf0)
		{
			switch(keyvalue)     //判断几列
			{
				case(0xe0):keyvalue=1; break;
				case(0xd0):keyvalue=2; break;
				case(0xb0):keyvalue=3; break;
				case(0x70):keyvalue=4; break;
			}
		}
	}
	
	key=0x0f;              //行扫描
	if(key!=0x0f)
	{
		delay(1000);         //消抖
		if(key!=1000)
		{
			switch(key)        //判断第几行
			{
				case(0x0e):keyvalue=keyvalue;break;
				case(0x0d):keyvalue=keyvalue+4;break;
				case(0x0b):keyvalue=keyvalue+8;break;
				case(0x07):keyvalue=keyvalue+12;break;
			}
		}
	}
	
	return keyvalue;
}


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

void int0() interrupt 0   //中断服务函数  分组是0
{
	u16 i;
	if(key1==0)
	{
		delay(1000);           //消抖
		if(key1==0)
		{
			buzzer=0;               //打开蜂鸣器
			delay(100000);
			buzzer=1;
			for(i=0;i<3;i++)       //三种led模式
				{
					led=0xa5;
					delay(100000);
					led=~led;
					delay(100000);
					led=0xf0;
					delay(100000);
					led=~led;
					delay(100000);
					led=0xee;
					delay(100000);
					led=~led;
					delay(100000);
				}
		}
	}
}


仿真图

在这里插入图片描述
在这里插入图片描述

元器件

AT89C51 (AT89C52)
LED
BUZZER (蜂鸣器)
BUTTON (按键)
AND (与门)
POWER (电源)

备注

蜂鸣器的电压是12V 所以使用电压需要修改为12V

发布了7 篇原创文章 · 获赞 2 · 访问量 104

猜你喜欢

转载自blog.csdn.net/weixin_44871327/article/details/104448273