RYMCU

NO2.点亮你的第一个LED-NEBULA-VSCODE

devcui 3 年前
# nebula-vscode

所属作品集

本章的标题名为“点亮你的第一个 LED”,从功能上讲是一项非常简单的工作。其实本章包含的内容比较多,包括单片机硬件知识的介绍、C 语言程序的编写、程序的下载、LED 功能的验证等。通过本章可以建立起对单片机开发的整套流程,培养学习单片机的兴趣。本章包括以下内容:

1.单片机硬件知识介绍。

2.C 语言程序的编写。

3.程序下载验证。

1.单片机硬件介绍

1.1 单片机内部资源

这里我们讲解单片机的内部资源,作为单片机开发者最主要的工作就是要熟练的运用单片机的各种内部资源。总结起来单片机的内部资源主要包括以下几个方面:

  • 1.程序存储器----Flash
    • Flash,程序存储器顾名思义就是用来存储单片机应用程序的,我们在编写好代码之后,通过计算机将程序下载到 flash 程序存储器中,功能类似于计算机的硬盘。因此,flash 存储器的容量大小决定了单片机应用程序的大小,容量越大能存储的代码量就越大,也就是能存储复杂度更高的程序代码,该款开发板选用的单片机 FLASH 的容量为 8K 字节。FLASH 程序存储器的一个重要特点为断电后程序不会丢失,一旦将代码下载到了 FLASH 中,将永远存留在里面。这就是为什么我们每次给单片机重新加电后,程序还会继续运行而不需要重新下载的原因。
  • 2.数据存储器----RAM
    • 数据存储器 RAM,顾名思义就是用来存储数据的,单片机在运行过程中产生的变量、数据都是存储在 RAM 当中的,功能类似于计算机的内存。因此,RAM 的大小决定了单片机程序中能产生数据量的多少,该款开发板选用的单片机的 RAM 容量为 512 字节。他的特点为断电之后数据不会保持,但是读写的速度非常快,而且寿命长,理论上读写的次数是无限的。
  • 3.特殊功能寄存器----SFR
    • 特殊功能寄存器 SRF,这个是单片机特有的寄存器。单片机的每一个功能都会对应一个或多个特殊功能寄存器,我们在程序中控制这些特殊功能寄存器就能实现某些功能了。例如单片机的定时器、串口都有对用的特殊功能寄存器 SFR。作为初学者需要先在心中建立一个特殊功能寄存器的概念,等到后面具体实现什么功能的时候再来详细的学习 SFR 的使用。
  • 4.输入输出口
  • 5.定时器
  • 6.串口
  • 7.中断源

1.2 单片机最小系统

什么是单片机最小系统?最小系统指的是需要最少的硬件就能使单片机运转起来的电路。单片机通用最小系统的三要素:电源电路、晶振电路、复位电路。RY-51 开发板单片机最小系统如图 3-1 所示。下面我们结合 RY-51 开发板原理图就三要素进行一一介绍。

image.png

  • 电源
    • 让单片机运行起来的第一件事就是给单片机进行供电,就像我们使用电脑一样首先得按下电源开关。不同的单片机供电电压的大小是不一样的,主流的单片机的供电电压分为 5V、3.3V、1.5V。我们开发板选用的单片机 STC89C52 是 5V 供电的,如图 3-1 所示单片机的第 40 引脚,20 引脚分别为单片机的正极和负极。40 引脚接着 VCC,20 引脚连接的 GND,通常我们用 VCC,GND 分别表示电源正、负。因为开发板是直接通过 USB 接口将电源引至 VCC 的,因此 VCC 对应的 5V 电压。
  • 晶振
    • 晶振电路为单片机提供时间基准,晶振震荡一下,单片机的程序往下运行一次。因此,在单片机上电后,晶振一直在不停的震荡,保证单片机程序一直在往下运行。晶振电路如图 3-1 左下角所示。由两个 30pf 的电容(C13、C15)和晶体振荡器 Y2 组成。晶振电路的 X1,X2 脚分别接到单片机的 18,19 两个晶振输入管脚。晶振震荡的频率越快,单片机执行的速度就越快,所以晶振的频率决定了单片机的运行速度。我们开发板选用的晶振频率为 11.0592MHz,即 1 秒钟震荡 11.0592 x 10^6^ 次。
  • 复位
    • 复位电路顾名思义是指该电路可以使单片机程序从头开始运行,功能类似于计算机的重启按钮。当单片机程序跑飞或者进入某个死循环后,通过复位电路可以使程序从头开始执行。单片机的第 9 管脚 RST 为复位输入管脚,图 3-1 左上角为复位电路,由按键 K22、电容 C10 和电阻 R8 组成,当按下 K22 时,可以使单片机进入复位状态。

1.3 LED 基础知识

LED 又称发光二极管,Light-Emitting Diode 是一种将电能转换为光能的电子元器件,具有单向导通特性。LED 的发光原理是一个很复杂的过程,根据材料的不同可以发出不同颜色的光,我们在这里只是利用发光二极管的发光特性,对原理不进行详细的介绍。实物图如 3-2 所示,左边为直插式的发光二极管,共有 2 个管脚,一个为正极,一个为负极。右边为贴片式发光二极管,两端分别为 2 个管脚。

image.png

通常给 LED 正向施加一个电流可以控制 LED 发光,电流越大 LED 越亮,正常发光电流一般为 1~20mA,当电流超过 20mA 时容易烧毁 LED。正向导通电压一般为:1.8-2V。LED 的典型应用原理如图 3-3 所示。

image.png

如图 3-3 所示,在电源 VCC 与地 GND 之间串联的一个阻值 1K 的电阻 R2,LED 小灯 L2。其中,R2 称之为限流电阻,选定一个合适的电阻才能使 LED 正常发光。根据 LED 正常发光的条件我们来计算 R2 阻值的范围。假设 VCC 为 5V,LED 正向导通电压为 2V,LED 发光电流为 1~20mA。根据欧姆定理:

R2MAX=(5V-2V)/1mA=3kΩ

R2min=(5V-2V)/20mA=150Ω

经计算的限流电阻 R2 的范围为 150Ω~3KΩ,我们这里选择的电阻为 1K,满足正常发光的要求。

通过典型电路不难发现,只要给 VCC 上电,LED 就会一直点亮。那么怎么样才能控制 LED 小灯,根据我的需要点亮或者熄灭呢?如果我们在这个典型电路上进行个小的改动,将 GND 替换成单片机的管脚 P1.0,如图 3-4 右边部分所示。

image.png

在单片机里面通过程序控制管脚 P1.0,就可以实现 LED 亮灭的控制。如果在单片机程序中使 P1.0 输出低电平,0V,那么 LED 就会导通点亮。如果使 P1.0 输出高电平,5V,那么 LED 两端没有压差,未导通,熄灭。根据这个原理我们就可以实现对 LED 亮灭的控制了。

2.C 语言程序编写

2.1 特殊功能寄存器声明

前面讲过用单片机实现某些功能的时候,实际上是在单片机程序里面对他对应的特殊功能寄存器 SFR 的控制。那么这里首先要找出 P1.0 管脚对应的寄存器。寄存器对应表可以从单片机的技术文档中找到,如图 3-5 所示。

image.png

如图所示,端口 Port 1 为一个 8 位的寄存器,该寄存器的地址为 90H,该寄存器的最高位对应单片机的 P1.7 管脚,依次往下排列,寄存器的最低位对应的单片机的 P1.0 管脚。单片机的每一个寄存器都会有一个独立的地址,例如 Port 0 对应的地址为 80H,在 C 语言编程中就是通过地址来找到寄存器的。单片机 C 语言程序的编写中需要对特殊功能寄存器进行声明,寄存器声明语句如下:

sfr P1 = 0x90

该语句表示,地址为 90H 的寄存器命名为 P1,声明后在程序中“P1”可以当作一个变量来使用。其中”sfr”为语句声明的关键字,“0x”在 C 语言中表示十六进制,“;”表示该语句的结束。

sbit led0 = P1^0

该语句为位声明语句,表示寄存器 P1 的第 0 位,即最低位命名为“led0”,这个名字不是固定的可以根据个人喜好来定义,例如也可以叫“led”。由图 3-5 可知,寄存器 P1 最低位对应的管脚为 P1.0。因此,在程序中对变量 led0 进行赋值,就可以实现对 LED 小灯的控制了。

2.2 代码

// 头文件
#include <STC89xx.h>

// 定义_RY1 变量值为0x90,实际就是寄存器的 P1 HEAD位置
#define _RY1 0x90

// 声明寄存器位置
SFR(RY1, 0x90);

// 类似 sbit led0 = P1^0
// 通过寄存器位置获取 P1-0 针脚的地址,将地址赋予LED1
SBIT(LED1, _RY1, 0);

// 通过寄存器位置获取 P1-0 针脚的地址,将地址赋予LED2
SBIT(LED2, _RY1, 1);

// 通过寄存器位置获取 P1-0 针脚的地址,将地址赋予LED3
SBIT(LED3, _RY1, 2);

void main()
{
	// 死循环
    while (1)
    {
	// LED1关闭
        LED1 = 0xFF;
	// LED2亮起
        LED2 = 0x00;
	// LED3亮起
        LED3 = 0x00;
    }
}

2.3 建立第一个工程

如何使用 PlatformIO 建立项目工程

2.4 程序下载验证

如图,点击 upload 将程序烧录至我们的单片机中,当提示 Cycling power: done 时,我们需要拨动电源开关,进行关闭在重新开启(重新上电)的操作

image.png

重新上电后程序写入单片机中,观察 LED 吧。

2.5 小结

本章介绍了单片机的内部资源,单片机的最小系统以及 led 的基础知识。介绍了 C 语言程序的编写,建立了点亮 LED 小灯的程序,并将程序下载到了单片机中。虽然整个程序的功能比较简单,但让我们熟悉了整个单片机开发的流程,对单片机开发在脑海中形成了一个初步的概念。对于初学者来说可能整个过程有点枯燥乏味,随着我们后续慢慢的详细展开,会对单片机形成一个很深的理解。

所属作品集

后发布评论