文章目录
- 前言
- LED模块的原理
- 点亮一个LED灯
- LED灯的闪烁
- LED流水灯
前言
大家好,这里是诡异森林。我使用的是普中科技的A2的51开发板,适合新手入门。用到的应用是Keil5和Stc-isp,第一个软件主要用来写代码的,第二个是将代码程序输送到单片机上,当然上面还提供一些经常使用的函数模块。
LED模块的原理
上图是LED模块的原理图,LED是基于数字信号控制LED灯的亮灭。在这里,是一行由8个LED灯组成的模块。电流会向LED发送高电平信号,使LED处于熄灭状态,我们可以通过改变信号的状态来决定它的亮灭。
首先电路从正极(VCC)出发,然后通过一个1k欧的电阻(限流作用),然后流入发光二极管的正极,负极流出,最后到电路中的P2口。
这个P2口是与芯片链接的。
如上图,P2是寄存器,CPU可通过程序来直接控制寄存器;寄存器通过驱动器控制电压,当驱动器为1时,为高电平(5V),为0时低电平(0V),所以程序可以通过二进制1/0来控制电路的高低电平,进而控制LED的亮灭。
点亮一个LED灯
在电路中,能识别的信号就是正负极,我们用1/0的二进制数字信号来进行表示,在写程序中,习惯用16进制来进行表示。
当电路接通后,电路中的LED默认为高电平(1),我们需要把它改为低电平(0),LED灯才会被点亮,所以我们可以这么写:
#include <REGX52.H>
//这是一个51单片机的头文件
int main()
{
P2=0xFE;//P2已被包含在文件中,表示寄存器,可控制LED
//二进制为 1111 1110
}
效果:
LED灯的闪烁
我们可以通过程序让它不断形成高低电平,那么LED灯将会闪烁。所以可以用while循环,但这里要注意的是,由于led引脚的电平持续在0、1之间变化,变化频率非常快,在MHz量级,导致的结果就是百直接看不到灯闪烁。所以我们还需要一个延迟函数减缓它的闪烁频率。
#include <REGX52.H>
#include <INTRINS.H>//包括nop函数
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();//单周期指令,可由晶振频率来延迟时间
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main()
{
while(1)
{
P2=0xFE;
//亮 1111 1110
Delay500ms();
//延迟500毫秒
P2=0xFF;
//灭 1111 1111
Delay500ms();
}
}
LED流水灯
当我们明白这些原理之后,就可以通过控制每一个LED灯来跑流水灯了。
代码:
#include <REGX52.H>
void Delay1ms(unsigned int x) //@11.0592MHz
{
unsigned char i, j;
while(x--)//可通过循环来延迟时间频率
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
int main()
{
int i;
char hex[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
//写一个数组表示不同灯亮起
while(1)
{
for( i=0;i<8;i++)
{
P2=hex[i];
Delay1ms(500-50*i);
//时间频率越来越快
}
}
}