《51单片机入门:LED点亮的秘密》

上一节提到了51单片机开发环境的搭建,这节我们开始正式进入51单片机的学习——点亮LED。
所有的控制类芯片学习的第一个实践就是点亮LED,这是最简单、最基本的操作,但这个实现过程却可能攘括了单片机的整个工作流程,所以要想学好单片机,点灯实验是一定要掌握的。

文章目录

  • LED是什么
  • 51单片机点灯的原理
  • 实验代码
  • 编译+烧录
  • 实验效果
  • 先简单介绍本文将用到的硬件及软件:
    硬件平台:普中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是定义特殊功能寄存器的位变量(bitsbit都是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引脚的状态(高低电平)。
    知道了sbitP2的含义,那么理解sbit led_out = P2^0;就不难了,即定义P2.0引脚的状态为led_outP2^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被点亮。
    【Proteus软件的安装和使用可以参考我的另一篇博客(带安装包下载链接),传送门:🚀(点我)

  • 如果文章对你有帮助,请留下你的点赞吧👍,这是我继续更新的最大动力🚀。


    物联沃分享整理
    物联沃-IOTWORD物联网 » 《51单片机入门:LED点亮的秘密》

    发表评论