51单片机按键控制流水灯

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文使用普中科技的51单片机开发板,单片机型号为STC89c52,使用Keil5编译程序、用stc-isp将keil5生成的hex文件下载至单片机,本文实现了按键控制流水灯。


一、硬件设计

1、LED灯原理图

在这里插入图片描述

2、按键原理图

在这里插入图片描述

3、单片机原理图

在这里插入图片描述

二、软件设计

1.延时程序

代码如下(示例):

void Delay_10us(u16 i)
{
	while(i--);
}

2.按键扫描

代码如下(示例):

u8 key_scan(u8 mode)
{
	u8 key=1;
	if (mode) key=1;
	if (key==1&&(K1==0||K2==0||K3==0||K4==0))
	{
		Delay_10us(1000);
		key=0;
	if (K1==0)
	{
		return KEY1_PRESS;
	}
	else if(K2==0)
	{
		return KEY2_PRESS;
	}
	else if(K3==0)
	{
		return KEY3_PRESS;
	}
	else if(K4==0)
	{
		return KEY4_PRESS;
	}
	}
	else if (K1==1&&K2==1&&K3==1&&K4==1)
		key=1;
		return UNPRESS;
}

3.LED程序

LED灯从D1至D8流水灯,延时1s

for(i=0;i<8;i++)
				{
					P2=~(0x01<<i);
					Delay_10us(100000);
				}

LED灯从D8至D1流水灯,延时1s

		for(i=0;i<8;i++)
			{
				P2=~(0x80>>i);
				Delay_10us(100000);
			}

LED灯从D1至D8依次延时1s点亮

	for(i=0;i<8;i++)
					{
						P2=(0xfe<<i);
						Delay_10us(100000);
					}

LED灯从D8至D1依次延时1s点亮

for(i=0;i<8;i++)
				{
					P2=(0x7f>>i);
					Delay_10us(100000);
				}

4.实验程序

void main()
{
	u8 i;
	u8 key;
	while(1)
	{
		key=key_scan(0);
		switch (key)
		{
			case 1:
			
					for(i=0;i<8;i++)
				{
					P2=~(0x01<<i);
					Delay_10us(100000);
				}
				P2=0xff;
						break;
			case 2:
					for(i=0;i<8;i++)
			{
				P2=~(0x80>>i);
				Delay_10us(100000);
			}
			P2=0xff;
			break;
			case 3:
					for(i=0;i<8;i++)
					{
						P2=(0xfe<<i);
						Delay_10us(100000);
					}
					P2=0xff;
			break;
			case 4:
				for(i=0;i<8;i++)
				{
					P2=(0x7f>>i);
					Delay_10us(100000);
				}
				P2=0xff;
				break;	
			default:
				P2=0xff;
			break;
		}
	}
}

三、实验现象

按下K1键,LED灯从D1至D8延时1s实现流水灯;按下K2键,LED灯从D8至D1延时1s实现流水灯;按下K3键,LED灯从D1至D8依次延时1s点亮;按下K4键,LED灯从D1至D8依次延时1s点亮。
实验现象已录频,上传至B站,链接为:https://www.bilibili.com/video/BV1LY4y1E79S?spm_id_from=333.999.0.0&vd_source=3ddc279d1298712e50e9538566687875


版权声明:本文为weixin_56994997原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。