在我们学完C语言后,我们可以做一些小开发,尤其对于电子信息工程的学生来说,单片机无疑是最好的选择,它可以实现软硬件的交互,实现一些特定的功能,在零基础刚入门的同学可以从51单片机开始,再去学习stm32,废话不多说,直接上教程。
一、LED模块原理图
我们在学习单片机LED点亮前首先要了解它的原理,下面这张图就是LED模块的原理图。
首先我们LED阳极接入电源VCC(通常为5V),当GPIO输出低电平时,电流从电源通过LED和限流电阻(470Ω)流向GPIO引脚,最后点亮LED灯。
二、进制的转换
在学习数字电子基础的时候,我们就已经接触了数制的转换,通常使用的最多的是二进制转换十六进制,我们通常使用0输出低电平,1输出高电平。
在单片机开发中我们使用十六进制兼顾效率和硬件的兼容性,寄存器配置通常也是用十六进制表示,十六进制是以0x开头的。
三、点亮一个LED灯
我们点亮一个D3举例,让它输出低电平
代码如下:
#include <REGX52.H>
void main()
{
P2 = 0xFB;//1111 1011
}
在使用P2这个变量时我们需要包含8051单片机的头文件,主要用于定义单片机内部特殊功能寄存器的地址和位操作。控制连接在P2口可通过控制电平来实现LED的亮灭。
四、控制LED灯的闪烁
如果想实现LED灯的闪烁,需要使用到软件延时器可以更直观的看到LED灯的闪烁
_nop_()是一个空操作函数,通常用于实现精确的短延时或时序调整。它的名称来源于汇编指令NOP,执行时不进行任何实际操作,仅消耗一个机器周期的时间。在使用这个函数之前需要包含一个头文件<INTRINS.H>
代码如下:
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms(void) //@12.000MHz
{
unsigned char data i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while(1)
{
P2 = 0xFE;//1111 1110
Delay500ms();
P2 = 0xFF;//1111 1111
Delay500ms();
}
}
这个程序控制D1led亮灭间隔500毫秒,如果想控制其他LED只需要输出低电平即可。
五、LED流水灯
要实现流水灯,通常是通过控制P0-P7端口的电平变化,使LED依次点亮或熄灭,我们可以通过移位操作的方法来实现LED流水灯的效果。
代码如下:
#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms(void) //@12.000MHz
{
unsigned char data i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
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();
}
}
要想实现流水灯的效果还有很多种方法,这里只列出了最简单的一种方法。