参考教程:[2-1] 点亮一个LED_哔哩哔哩_bilibili
1、LED(发光二极管)原理:
(1)LED的电路符号:左边是正极,右边是负极(正极的电压高于负极,电流从正极流向负极,即为有正向电流,LED在此条件下可以被点亮)
(2)开发板中的LED模块:LED正极接电源VCC(VCC提供正向5V电压);红框内的是限流电阻,如果不加限流电阻,那么流过LED的电流会很大,可能会对LED造成破坏;LED负极对接MCU的引脚(引脚输出的电平由P2寄存器控制,图中的P20-P27其实是P2的8位分别控制0-7这8个引脚),如果引脚输出高电平,LED不会被点亮,如果引脚输出低电平,LED才会有正向电流,从而会被点亮。
2、通过写代码点亮LED的原理:程序通过CPU给寄存器进行配置,寄存器通过驱动器向外部引脚输出高电平or低电平。
3、点亮第一个LED灯:
(1)在main.c文件中输入以下代码,然后点击“编译”。
#include <REGX52.H> //头文件
void main()
{
P2 = 0xFE; //给P2寄存器配置成1111 1110从而控制只有1个LED被点亮
while(1)
{
//可以写一个死循环让这段代码一直执行
//没有死循环的话,其实void main()包含的代码也是一直重复执行
}
}
(2)注意要在“Output”中勾选“Create HEX File”,这样才能得到编译生成的.hex文件。
(3)拿到编译产生的文件后,打开STC-ISP,选择相应的单片机型号(这个在开发板的芯片上有写,一定要选择对应型号)以及串口号,再选择“打开程序文件”,找到刚刚生成的.hex文件,接着就可以把该文件下载到开发板中完成点灯。
4、让8个LED灯进行闪烁:
(1)由于程序本身的执行速度很快,仅靠编写两句不同的代码配置P2寄存器是无法观察到LED闪烁的现象的,这时就需要借助延时函数。在STC-ISP中可以直接生成延时函数,其中系统频率要与开发板的晶振相同(我的晶振频率是11.0592MHz),指令集改为STC-Y1(右侧适用系列符合情况就行),然后就能得到延时函数。
(2)在main.c文件中输入以下代码,然后点击“编译”。
#include <REGX52.H> //一般写程序前都先添加这个头文件
#include <INTRINS.H> //_nop_()需要这个头文件
void Delay500ms() //借助STC-ISP生成的500ms延时函数(开发板不同,这个函数也会不同!)
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2 = 0xF0; //前4个LED灯亮,后4个LED灯灭
Delay500ms(); //在两句代码间调用延时函数,那么程序将在这里暂停500ms,然后再继续往下执行
P2 = 0x0F; //前4个LED灯灭,后4个LED灯亮
Delay500ms(); //程序将在这里再暂停500ms,然后再继续往下执行,否则灯灭后会马上再亮
}
}
(3)按照上一例的操作将生成的.hex文件写进开发板,即可观察LED闪烁的现象。
5、让8个LED灯轮流闪烁(流水灯):
#include <REGX52.H>
#include <INTRINS.H> //_nop_()需要这个头文件
void Delay500ms() //借助STC-ISP生成的500ms延时函数(开发板不同,这个函数也会不同!)
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 129;
k = 119;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2 = 0xFE; //1111 1110,第一盏LED灯被点亮
Delay500ms();
P2 = 0xFD; //1111 1101,第二盏LED灯被点亮
Delay500ms();
P2 = 0xFB; //1111 1011,第三盏LED灯被点亮
Delay500ms();
P2 = 0xF7; //1111 0111,第四盏LED灯被点亮
Delay500ms();
P2 = 0xEF; //1110 1111,第五盏LED灯被点亮
Delay500ms();
P2 = 0xDF; //1101 1111,第六盏LED灯被点亮
Delay500ms();
P2 = 0xBF; //1011 1111,第七盏LED灯被点亮
Delay500ms();
P2 = 0x7F; //0111 1111,第八盏LED灯被点亮
Delay500ms();
}
}
(2)按照上一例的操作将生成的.hex文件写进开发板,即可观察LED流水的现象。
6、让8个LED灯轮流闪烁(进阶版):
(1)在main.c文件中输入以下代码,然后点击“编译”。
#include <REGX52.H>
#include <INTRINS.H> //_nop_()需要这个头文件
void Delay1ms(unsigned int xms) //对借助STC-ISP生成的1ms延时函数进行修改
{
while(xms) //让这个1ms延时函数重复执行xms次
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
xms--; //smx作为计数器
}
}
void main()
{
P2 = 0xFE; //1111 1110,初始状态为第一个LED灯亮
while(1)
{
if(P2 == 0xFF) //一轮循环结束,重置为初始状态(第一个LED灯亮)
P2 = 0xFE;
Delay1ms(500); //500ms延时(根据需求可以传入不同的延时时间)
P2 = P2 << 1; //下一个LED灯亮(P2中的0左移)
P2 += 1; //第一轮循环结束前亮过的LED灯不能再亮(左移会导致第一位为0,需要将其修改为1)
}
}
(2)按照上一例的操作将生成的.hex文件写进开发板,即可观察LED流水的现象。