🎊专栏【51单片机】
🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。
🎆音乐分享【如愿】
大一同学小吉,欢迎并且感谢大家指出我的问题🥰
目录
🍔同一个灯
🏳️🌈效果
🏳️🌈代码
🏳️🌈问题分析
⭐注意
⭐P3_1=0,表示按下按键
⭐为什么while(P3_1==0);后面要加上分号呢?
⭐两个Delay(20)的作用
⭐P2_0=~P2_0;
🍔不同灯
🏳️🌈效果
🏳️🌈代码
🏳️🌈原因
🍔流水灯
🏳️🌈效果
🏳️🌈代码
🏳️🌈解释
🍔同一个灯
🏳️🌈效果
led灯闪烁
🏳️🌈代码
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_1==0)//按下
{
Delay(20);
while(P3_1==0);//仍然按下
Delay(20);
P2_0=~P2_0;
}
}
}
着重分析下面的代码
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0) ;
Delay(20);
P2_0=~P2_0;
}
}
🏳️🌈问题分析
⭐注意
1.在这个程序里面,最好用类似于P3_1=0的代码,不要用类似于P2=0xFE的代码,因为后者很容易迷糊
(如果是流水灯,可以用P2=0xFE)
2.Delay()函数里面用的是自动延时代码,可以由软件自动生成,如果不明白是怎么肥四,可以参考下面这篇文章
【51单片机】使用STC烧录软件自动生成延时代码_在下 小吉的博客-CSDN博客
⭐P3_1=0,表示按下按键
⭐为什么while(P3_1==0);后面要加上分号呢?
在观察现象的时候发现,按一次松手,灯亮了,再按一次松手,灯灭了
所以,这样子主要是为了一直按着按键的时候,防止灯亮
(而且不能改为P3_1=0,因为这里必须是循环语句或者判断语句)
⭐两个Delay(20)的作用
如图
第一个Delay(20)是作用于前面抖动的部分
第二个Delay(20)是作用于后面抖动的部分(防止松手时影响灯的亮度)
⭐P2_0=~P2_0;
就是控制LED的开关状态,使其可以闪烁
🍔不同灯
🏳️🌈效果
多个led灯亮
🏳️🌈代码
#include <REGX52.H>
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
unsigned char LEDNum=0;
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
LEDNum++;
P2=~LEDNum;
}
}
}
🏳️🌈原因
请看下图
P2=~LEDNum;由于二进制数字的变化,所以会引起灯的变化
🍔流水灯
🏳️🌈效果
WeChat_20230425133443
🏳️🌈代码
#include <REGX52.H>
unsigned char LEDNum;
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
void main()
{
while(1)
{
if(P3_1==0)
{
Delay(20);
while(P3_1==0);
Delay(20);
if(LEDNum>=8)
LEDNum=0;
P2=~(0x01<<LEDNum);
LEDNum++;
}
if(P3_0==0)//多个按键操作
{
Delay(20);
while(P3_0==0);
Delay(20);
if(LEDNum==0)//反方向的流水灯
LEDNum=7;
else
LEDNum--;
P2=~(0x01<<LEDNum);
}
}
}
🏳️🌈解释
🥰如果大家有不明白的地方,或者文章有问题,欢迎大家在评论区讨论,指正🥰