基于51单片机的节日彩灯

1.要求
1.1-每次按下一个按键时,加快8只LED发光二极管的流水显示速度;
1.2-每次按下另一个按键时,降低8只LED的流水显示速度;
1.3-拓展两个功能,拉幕式闪烁与闭幕式闪烁。
2.设计思路
2.1-基本的流水功能是采用的数组来实现的,先把八个LED哪个LED亮哪个LED灭用0和1表示出来(本例I/O输出0,LED点亮,I/O输出1,LED熄灭),并且换算成16进制的0-F,然后将这些16进制的数装在数组里面,要将哪个LED点亮或者熄灭,就只需要对应去去取数组里面的数就行了,所以使用了一个全局变量j,用它去取数组里面的数值,实现了功能切换LED流水的连续性。
2.2-用按键控制速度,采用定时器中断来实现,定时50ms,每隔50ms就进入定时器中断,对按键的状态进行扫描,如果扫描到按键的状态发生了改变,则说明有按键按下,就会进入按键判断的函数,进一步判断是哪一个按键的状态发生了改变。
3.程序流程图
在这里插入图片描述
4.程序代码

#include<reg51.h>

#define uint unsigned int
#define uchar unsigned char
#define LED_Port P1//定义LED端口

sbit k1=P3^0;//定义按键k1
sbit k2=P3^1;//定义按键k2
sbit k3=P3^2;//定义按键k3
sbit k4=P3^3;//定义按键k4

uint j=0;//全局变量j
uint speed=0;//全局变量speed

/********流水方式数组********/
uint LED1[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/********拉幕式与闭幕式数组********/
uint LED2[8]={0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7};

/********函数声明********/	
void delay(uint a);
void timer0Init();
void speed1();	
void speed2();
void speed3();
void speed4();

void delay(uint a)//延时函数,a=1,大约延时1ms
{
	uint i,j;
	for(i=a;i>0;i--)
		for(j=123;j>0;j--);
}
	
void timer0Init()//定时器0初始化
{
	EA=1;
	ET0=1;
	TMOD=0x01;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	TR0=1;
}
void timer0() interrupt 1//定时器0中断服务函数
{
	TR0=0;
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	TR0=1;
	if(k1==0){speed=1;while(!k1);}
	if(k2==0){speed=2;while(!k2);}
	if(k3==0){speed=3;while(!k3);}
	if(k4==0){speed=4;while(!k4);}
}
/********慢速流水********/
void speed1()
{
	while(1)
	{
		LED_Port=LED1[j];
		delay(200);
		if(speed!=1)break;
		j++;
		if(j>7)j=0;
	}	
}
/********快速流水********/
void speed2()
{
	while(1)
	{
		LED_Port=LED1[j];
		delay(50);
		if(speed!=2)break;
		j++;
		if(j>7)j=0;
	}	
}
/********快闪********/
void speed3()
{
	while(1)
	{
		LED_Port=0xff;
		delay(150);
		if(speed!=3)break;
		LED_Port=0x00;
		delay(100);
		if(speed!=3)break;
	}	
}
/********拉幕式与闭幕式********/
void speed4()
{
	j=4;
	while(1)
	{
		LED_Port=LED2[j];
		delay(250);
		if(speed!=4)break;
		j++;
		if(j>7)j=0;
	}
}
void main()
{
	timer0Init();
	while(1)
	{
		if(speed==1){speed1();}
		if(speed==2){speed2();}
		if(speed==3){speed3();}
		if(speed==4){speed4();}
	}
}

5.仿真电路
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值