51单片机入门LED点亮的背后
Posted 小辉_Super
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机入门LED点亮的背后相关的知识,希望对你有一定的参考价值。
上一节提到了51单片机开发环境的搭建,这节我们开始正式进入51单片机的学习——点亮LED。
所有的控制类芯片学习的第一个实践就是点亮LED,这是最简单、最基本的操作,但这个实现过程却可能攘括了单片机的整个工作流程,所以要想学好单片机,点灯实验是一定要掌握的。
- 先简单介绍本文将用到的硬件及软件:
硬件平台:普中51开发板-单核A2
软件:Keil5(C51)、STC-ISP(或其他ISP软件)、Proteus8.9(用于仿真,非必须)
LED是什么
发光二极管,简称为LED,是一种常用的发光器件,它在照明领域应用广泛。 发光二极管可高效地将电能转化为光能,在现代社会具有广泛的用途,如照明、平板显示、医疗器件等。
这种电子元件早在1962年出现,早期只能发出低光度的红光,之后发展出其他单色光的版本,时至今日能发出的光已遍及可见光、红外线及紫外线,光度也提高到相当的光度。而用途也由初时作为指示灯、显示板等;
随着技术的不断进步,发光二极管已被广泛地应用于显示器和照明。——百度百科
说直接点LED就是一种灯,需要接上一定的电压(正极+负极)即可点亮。
下图是LED的电路图形符号,左边是正极,右边是正极。
我之前写过一篇文章详细介绍LED,感兴趣的可以看看,传送门:🚀(点我)
51单片机点灯的原理
- 如果不使用单片机,而是直接用5V(51单片机的IO高电平为5V)电源点亮LED,那么我们可以直接在LED两端接上电源和地(见下图)。
由于LED存在额定电流(大约在10mA左右,电流太大会烧坏LED),所以我们要串联一个电阻(470欧姆即可)。
- 如果用51单片机点亮LED,我们可以选择用单片机IO端连接LED的负极或正极,如果接LED的负极(如下图),那么IO端默认电平需要设置为高电平(即默认灯灭),LED另一个引脚需要接
VCC
(5V),下图中R5
(10k电阻)作用是上拉(保证在不稳定情况下IO端为高电平),当需要点亮LED时,将51单片机对应的IO(如下图的P2.0)拉低即可。
如果IO端接LED正极,那么单片机IO端默认电平需要设置为低电平,上拉电阻需要改成下拉(接地),LED的另一端(负极)接GND
,点亮LED时,需要将单片机对应IO拉高。
实验代码
在写代码前,我们需要先创建一个Keil工程,创建工程的步骤已经在上一节讲述,传送门:🚀(点我)。这里就不进行赘述。
点灯的代码如下:
#include <reg52.h> //此文件中定义了单片机的一些特殊功能寄存器
sbit led_out = P2^0; //将单片机的P2.0端口定义为led_out
/******************************************************************************
* @ 函数名 : main
* @ 功 能 : 主函数
* @ 参 数 : 无
* @ 返回值 : 无
******************************************************************************/
void main()
led_out = 0; //P2.0端口设置为低电平(点亮LED)
while(1)
reg52.h
:<reg52.h>表示你调用了52或者51单片机的资源,也就是可以直接对单片机的相关寄存器与引脚进行操作,里面涉及和很多内容,这里只要知道它是一个必须加的一个头文件即可。sbit led_out = P2^0;
:sbit
是定义特殊功能寄存器的位变量(bit
和sbit
都是C51扩展的变量类型,即C51特有的,而不是C语言标准变量类型),这里我们只需要把sbit当成一个类型即可,就像char、int,只不过char指的是一个字节,而sbit指的是字节里的一个位。
上面还提到特殊功能寄存器(SFR),SFR是80C51单片机中各功能部件对应的寄存器,用于存放相应功能部件的控制命令,状态或数据,SFR(sfr
)也是一种扩充数据类型,占用一个内存单元(1字节)。上面式子中的P2
就是一个SFR,在reg52.h
中(见下图),定义了P2
寄存器的地址,如果我们对P2
进行赋值,就等同于对51单片机的特殊功能寄存器赋值,而P2
对应的功能就是单片机P2.0~P2.7这8个IO引脚的状态(高低电平)。
知道了sbit
和P2
的含义,那么理解sbit led_out = P2^0;
就不难了,即定义P2.0引脚的状态为led_out
,P2^0
也是C51的特有用法。
^
在C语言中是按位异或的作用,但在C51中它多了一个作用,即可以指定寄存器的某一位,前面提到P2
是一个1字节的变量,它有8个位,分别对应P2.0~2.7
,如果直接对P2赋值,那就等同于同时控制单片机的8个IO端口状态,但是使用P2^x
(0<=x<=7),就能单独控制单片机的某一个IO端口。
led_out = 0;
:从上面的内容我们可以得知led_out
代表了单片机端口P2.0
的状态,所以我们对它赋值,就等同于控制P2.0
这个IO的电平状态,通过查看开发板的原理图(如下图),我们发现如果将P2.0端口置为低电平,那么LED1的正负极就能形成压差,从而实现点亮LED。
while(1)
:这是一个死循环,由于单片机上电后要不停的工作,所以我们不能让main
函数结束,而是让它不停地执行while
函数内部的工作(本实验while
循环为空)。
编译+烧录
程序编写完成后,接下来的操作就是编译+烧录了,这些步骤已经在本系列第一篇文章中讲述,传送门:🚀(点我)。不过这里还是会简单描述一下操作过程:
- 点击编译按钮,如果怕出现意外,可以点第三个(重新编译),编译完成后
Build Output
窗口会显示编译结果,如果没有错误和警告,且生成了hex
文件,说明编译成功。
- 将刚才生成的
hex
文件烧录到单片机中,即可看到LED被点亮了。
实验效果
- 实际效果:可以看到右边的LED1被点亮。(不知道是不是开发板坏了,亮了一个数码管)
- 仿真效果:与P2.0连接的LED被点亮。
如果文章对你有帮助,请留下你的点赞吧👍,这是我继续更新的最大动力🚀。
以上是关于51单片机入门LED点亮的背后的主要内容,如果未能解决你的问题,请参考以下文章