提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
本文使用普中科技的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版权协议,转载请附上原文出处链接和本声明。