基于51单片机点亮一个LED灯(一)

描述

不论学习什么单片机,最简单的外设莫过于IO口的高低电平控制。而对于一个IO口的高低电平控制入门阶段将是从点亮一个LED开始的。

本章将介绍在如何创建号的工程模板上,通过控制51单片机的GPIO口,点亮一个LED灯。

发光二极管

发光二极管(Light Emitting Diode)简称LED,是一种会发光的半导体组件且具备二极管的电子特性,具有正向导通的特性

发光二极管的参数

正向导通电压:

发光二极管通常的正向导通电压是1.8V到2.2V之间

工作电流:

工作电流一般在1mA~20mA之间

其中,当电流在1mA ~ 5mA之间变化时,随之通过LED的电流越来 越大,肉眼可以感觉到这个小灯越来越亮,而当电流从5mA~20mA之间变化时,肉眼看到发光二极管的亮度变化不是很明显。当电流超过20mA时,LED就会有烧坏的危险。通常在led管脚上串联一个电阻,目的是为了限制通过LED的电流不要太大,起到了限流的作用。

如何识别原理图

拿到一块开发板的同时,我们还需要查阅它的原理图,读懂它的电路连接方式。

如下图:

GPIO

从上图可以看出,图中的P5.5表示两处是连接在一起的。表示连接在单片机的第19引脚,对应为STC15W的5.5串口。

在例如图中的LED流水灯,LED控制管脚连接在单片机的IO口上。LED采用共阳接法,及所有的LED阳极(既正极,阴极为负极)管脚接在电源VCC,同时LED还串联着一个电阻接到单片机的P2口上。根据电路常识,要LED发光,既对应的单片机IO口需要的电平为低电平。反之,高电平则熄灭。

GPIO其他也是在原理图上的都可以以此类推。

软件设计

对单片机原理图有所理解之后,接下来就是对单片机进行程序的编写以及烧录。

问题一:如何点亮LED。

GPIO

第一次要实现的功能就是点亮D1位置的LED,如图所示,D1位置的发光二极管连接在单片机的P2.0 IO口,即让P2.0输出低电平

GPIO

GPIO

#include < reg51.h >//引入包51单片机的一个头文件


sbit   LED_D1=P2^0;// 将单片机的P2.0IO口定义为LED_D1


int main()
{
  while(1)
  {
      LED_D1=0;  // “0”即为低电平,“1”即为高电平,

  }


}

当编译器编译成功没有报错的时候,在软件界面下方会显示以上的编译结果信息,表示没有任何问题。

当代码编写没有任何问题的时候,接下里就需要对单片机进行烧录。

首先,在状态栏点击魔术棒-->Output-->打勾“Create HEX File”-->生成目标文件 ”.hex“ 文件。

在程序目录下可以查看目标文件——“.hex”文件。

GPIO

也可以通过点击下图所示位置,更改文件位置或者查看文件目录。

GPIO

打开烧录软件

第一步:选择对应的单片机芯片

第二部:查看COM口(也就是单片机连接电脑,所查的USB口)

第三步:打开程序文件,也就是刚刚上一步所生成的目标文件——.hex文件。

第四步:在下图“4”位置会显示经过解码的程序文件。

第五步:点击“下载/编程”按钮

第六步:在下图,位置“6”会显示操作成功的文字。既烧录成功。

注意:在每一次烧录时,应该对单片机进行一次断电上电,该步骤称为单片机的冷启动,才能继续烧录程序。

GPIO

此时单片机上的LED灯为发光。

GPIO

问题二:如果要点亮所有的LED,需要怎么做呢?

GPIO

源码复制

#include < reg51.h >//引入包51单片机的一个头文件


sbit   LED_D1=P2^0;// 将单片机的P2.0IO口定义为LED_D1
sbit   LED_D2=P2^1;// 将单片机的P2.0IO口定义为LED_D2
sbit   LED_D3=P2^2;// 将单片机的P2.0IO口定义为LED_D3
sbit   LED_D4=P2^3;// 将单片机的P2.0IO口定义为LED_D4
sbit   LED_D5=P2^4;// 将单片机的P2.0IO口定义为LED_D5
sbit   LED_D6=P2^5;// 将单片机的P2.0IO口定义为LED_D6
sbit   LED_D7=P2^6;// 将单片机的P2.0IO口定义为LED_D7
sbit   LED_D8=P2^7;// 将单片机的P2.0IO口定义为LED_D8、


int main()
{
  while(1)
  {
      LED_D1=0;  // “0”即为低电平,“1”即为高电平,
      LED_D2=0;
      LED_D3=0;
      LED_D4=0;
      LED_D5=0;
      LED_D6=0;
      LED_D7=0;
      LED_D8=0;
  }  
}

进行同样的烧录下载后,效果如下

GPIO

经手机调整曝光度后的效果。

问题三:如何简化程序。

显然这种写法会显得很累赘,假如有100个LED灯,那么不就是需要写100次的“sbit LED_D1=P2^0”,显然是不可能的。这种叫位操作。在某一些方面这一写法很方便,但是在如上面的情况就显得很麻烦。

GPIO

源码复制

#include < reg51.h >int main(){  while (1)  {    P2=0;//或者P2=0X00  }}

其中“P2”就等同于

GPIO

而“P2=0;”则等同于

GPIO

或者可以将程序中的“P2=0;”写成“P2=0x00;”,“0x”表示的是16进制,转成二进制则为“0000 0000”,现在的手机计算机都可以实现进制的转换。

那如果用以上的写法,单独的控制某一个LED的亮灭需要怎么做呢?则需要我们需要点亮(熄灭)的LED,在对位的位置置“0”(“1”)。

例如:我们要D4LED熄灭,采用以上写法,则值需要在D4 LED置“1”即可,转换成十六进制则为“0x10”。

GPIO

注意:进制的转换,应从最低位开始算起。

程序编写以及烧录结果

GPIO

源码复制

#include < reg51.h >
int main()
{
  while (1)
  {
    P2=0x08;
  }
}

GPIO

其他的以此类推。

问题四:如何让LED闪烁起来。

程序编写以及烧录结果。

GPIO

源码复制

#include < reg51.h >//引入包51单片机的一个头文件
sbit LED_D1=P2^0;
int main()
{
  int i;
  while(1)
  {
    i=10000;
     LED_D1=0;
    while(i--);
     LED_D1=1;
    while(i--);

  }
}
LED_D1=0;
    while(i--);
    //两句代码的含义为 LED_D1保持低电平一段时间,该时间为 while(i--);
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分