💖作者简介:大家好,我是泽奀。全栈领域新星创作者🥇 📝个人主页:weixin_52632755的博客_泽奀_CSDN博客 🎉点赞➕评论➕收藏 == 养成习惯😋 📖本系列:也会跟着我男神哔哩哔哩江科大的视频为主! https://blog.csdn.net/weixin_52632755/category_11316267.html
目录
二极管灯在电路图当中所表示的一个符号,在电路图当中左边是正极、右边是负极。
这个是二极管实物里面的一些知识点
首先要有一个单片机是MCU那么单片机里面就有一个CPU(代码都是在这里面执行的),我们外部都是有引脚都是P2口的引脚。那么CPU是怎么样控制引脚的呢?那么就要说说寄存器里面其实就是存储器以八个为一组的,就比如说是单片机里面就有一个寄存器它是P2口的寄存器,那么它就有八位每一位背后都有一根导线在通过驱动器增大它的电流,然后在连到我们这个IO口的端口上后面其实也都是一样的。这种东西就叫做是驱动器。那么我们的CPU可以通过我们的这个软件直接访问我们的这个寄存器:假设我们给它写①那么我们这个就可以通驱动器就可以给我们的IO口置高电平,那么如果是写零的话那么我们的IO口就是低电平0,同理。给高低电平是不是就是给P2口当中转换的寄存器,我们的硬件电路都是这个样子的。
那么如果我们要让第一个LED灯点亮,其余的全是灭的话该怎么办。很简单给第一个LED灯低电平0,其余的LED都给上一个高电平1。这样你的LED灯就可以实现点亮第一个了。 P2 = 1111 1110 这种写法是❌(因为它会默认你是十进制) , P2 = 0xFE 这样才是✔。 所以这里就会遇到一个问题进制的转换,只是需要把二进制转换成十六进制就可以了 。
如果还不了解的话,可以看看原码,补码和反码 - wqbin - 博客园 这篇博客😉
#include <REGX52.H>
int main(void)
{
P2=0xFE; //1111 1110
while(1)
{
}
}
那么如果我们想要控制LED灯 亮灭亮灭 亮灭亮灭 怎么办呢?其实很容易。 P2 = 0x55;// 0101 0101 其它保持不变这样就可以了😁
介绍:点亮LED小灯的程序就是让LED = 0(低电平)。熄灭小灯的程序也是非常容易的,就是LED = 1(高电平)。这样点亮和熄灭都会了,那么如果在亮和灭之间加个延迟呢,反复不停的点亮和熄灭小灯,那么就可以实现这个LED灯闪烁了。 这里解答大家可能会有的疑问:
#include <REGX52.H>
#include <INTRINS.H> //_nop_();需要的头文件
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main(void)
{
while(1)
{
P2=0xFE; //1111 1110
Delay500ms(); //调用函数
P2=0xFF; //1111 1111
Delay500ms(); //调用函数
}
}
前面学习了点亮一个LED灯又学了LED小灯闪烁,现在我们就可以进一步的去学习让LED灯依次一个接上一个的开始亮起来,也就是我们常常说的流水灯的实现了。 通过下面的这个程序我们不难看出来,可以通过P2来控制所有的8个LED灯的亮灭状态。从下面的程序当中我们可以看出依次给P2赋值的是:0xFE、0xFD、0xFB、0xF7、0xEF、0xDF、0xBF、0x7F
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main(void)
{
while(1)
{
P2=0xFE;//1111 1110
Delay500ms();
P2=0xFD;//1111 1101
Delay500ms();
P2=0xFB;//1111 1011
Delay500ms();
P2=0xF7;//1111 0111
Delay500ms();
P2=0xEF;//1110 1111
Delay500ms();
P2=0xDF;//1101 1111
Delay500ms();
P2=0xBF;//1011 1111
Delay500ms();
P2=0x7F;//0111 1111
Delay500ms();
}
}
为什么说这个是高阶操作呢?是因为这个程序我们想让流水灯延迟多少行秒就可以延迟多少行秒,注意这个延迟毫秒并不只是改变之前延迟500ms,它是可以在每个延迟函数阶段,分别延迟出不同的速度,上面的这样一开仿佛就单一,而这个是进行变化的。
#include <REGX52.H>
void Delay1ms(unsigned int xms); //@12.000MHz
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
int main(void)
{
while(1)
{
P2=0xFE;//1111 1110
Delay1ms(1000);
P2=0xFD;//1111 1101
Delay1ms(900);
P2=0xFB;//1111 1011
Delay1ms(800);
P2=0xF7;//1111 0111
Delay1ms(700);
P2=0xEF;//1110 1111
Delay1ms(600);
P2=0xDF;//1101 1111
Delay1ms(500);
P2=0xBF;//1011 1111
Delay1ms(300);
P2=0x7F;//0111 1111
Delay1ms(100);
}
}