控制/MCU
本章的标题名为“点亮你的第一个 LED”,从功能上讲是一项非常简单的工作。其实本章包含的内容比较多,包括单片机硬件知识的介绍、C 语言程序的编写、程序的下载、LED 功能的验证等。通过本章可以建立起对单片机开发的整套流程,培养学习单片机的兴趣。本章包括以下内容:
这里我们讲解单片机的内部资源,作为单片机开发者最主要的工作就是要熟练的运用单片机的各种内部资源。总结起来单片机的内部资源主要包括以下几个方面:
我们这里先介绍前三个的功能及作用:
程序存储器 Flash,程序存储器顾名思义就是用来存储单片机应用程序的,我们在编写好程序代码之后,通过计算机将程序下载到 flash 程序存储器中,功能类似于计算机的硬盘。因此,flash 存储器的容量大小决定了单片机应用程序的大小,容量越大能存储的代码量就越大,也就是能存储复杂度更高的程序代码,该款开发板选用的单片机 Flash 的容量为 8K 字节。
FLASH 程序存储器的一个重要特点为断电后程序不会丢失,一旦将代码下载到了 FLASH 中,将永远存留在里面。这就是为什么我们每次给单片机重新加电后,程序还会继续运行而不需要重新下载的原因。
数据存储器 RAM,顾名思义就是用来存储数据的,单片机在运行过程中产生的变量、数据都是存储在 RAM 当中的,功能类似于计算机的内存。因此,RAM 的大小决定了单片机程序中能产生数据量的多少,该款开发板选用的单片机的 RAM 容量为 512 字节。他的特点为断电之后数据不会保持,但是读写的速度非常快,而且寿命长,理论上读写的次数是无限的。
特殊功能寄存器 SFR,这个是单片机特有的寄存器。单片机的每一个功能都会对应一个或多个特殊功能寄存器,我们在程序中控制这些特殊功能寄存器就能实现某些功能了。例如单片机的定时器、串口都有对用的特殊功能寄存器 SFR。作为初学者需要先在心中建立一个特殊功能寄存器的概念,等到后面具体实现什么功能的时候再来详细的学习 SFR 的使用。
什么是单片机最小系统?最小系统指的是需要最少的硬件就能使单片机运转起来的威廉希尔官方网站 。单片机通用最小系统的三要素:电源威廉希尔官方网站 、晶振威廉希尔官方网站 、复位威廉希尔官方网站 。RY-51 开发板单片机最小系统如图 3-1 所示。下面我们结合 RY-51 开发板原理图就三要素进行一一介绍。
图 3-1 单片机最小系统原理图
电源
让单片机运行起来的第一件事就是给单片机进行供电,就像我们使用电脑一样首先得按下电源开关。不同的单片机供电电压的大小是不一样的,主流的单片机的供电电压分为 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 106 次。
复位
复位威廉希尔官方网站 顾名思义是指该威廉希尔官方网站 可以使单片机程序从头开始运行,功能类似于计算机的重启按钮。当单片机程序跑飞或者进入某个死循环后,通过复位威廉希尔官方网站 可以使程序从头开始执行。单片机的第 9 管脚 RST 为复位输入管脚,图 3-1 左上角为复位威廉希尔官方网站 ,由按键 K22、电容 C10 和电阻 R8 组成,当按下 K22 时,可以使单片机进入复位状态。
LED 又称发光二极管,Light-Emitting Diode 是一种将电能转换为光能的电子元器件,具有单向导通特性。LED 的发光原理是一个很复杂的过程,根据材料的不同可以发出不同颜色的光,我们在这里只是利用发光二极管的发光特性,对原理不进行详细的介绍。实物图如 3-2 所示,左边为直插式的发光二极管,共有 2 个管脚,一个为正极,一个为负极。右边为贴片式发光二极管,两端分别为 2 个管脚。
通常给 LED 正向施加一个电流可以控制 LED 发光,电流越大 LED 越亮,正常发光电流一般为 1-20mA,当电流超过 20mA 时容易烧毁 LED。正向导通电压一般为:1.8~2V。LED 的典型应用原理图如图 3-3 所示。
图 3-3 LED 典型应用原理图
如图 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 右边部分所示。
图 3-4 单片机控制 LED 威廉希尔官方网站
在单片机里面通过程序控制管脚 P1.0,就可以实现 LED 亮灭的控制。如果在单片机程序中使 P1.0 输出低电平,0V,那么 LED 就会导通点亮。如果使 P1.0 输出高电平,5V,那么 LED 两端没有压差,未导通,熄灭。根据这个原理我们就可以实现对 LED 亮灭的控制了。
前面讲过用单片机实现某些功能的时候,实际上是在单片机程序里面对他对应的特殊功能寄存器 SFR 的控制。那么这里首先要找出 P1.0 管脚对应的寄存器。寄存器对应表可以从单片机的技术文档中找到,如图 3-5 所示。
图 3-5 SFR 映射表
如图所示,端口 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 小灯的控制了。
程序代码设计如图 3-6 所示:
图 3-6 程序代码设计
下面我们就程序代码进行逐一分析:
如图所示,01,02 两条语句为寄存器及位声明语句,每条语句均以”;”结束。其中字母“P”必须为大写,初学者容易忽视的地方。“//”后面的内容为语句的注释内容,是为了方便程序阅读的,在编译过程中,编译器会自动忽略。
03 为空格,作用为方便程序的阅读,是程序结构更加明朗,方便理解,因此在编写程序中可以适当的增加空格。
04,05,07 为程序主函数入口的固定写法,每一个 C 语言程序都必须有一个主函数,而且是唯一的一个。程序下载到单片机内部后,就是从 04 这条语句开始执行的。”void”表示主函数没有返回值,05,07 为大括号,执行的程序语句必须包含在大括号内部。”main()”之后是不需要”;”来作为结束的。
06 语句为赋值语句,将 0 赋值给 led0,因此对应的单片机 P1.0 管脚为低电平,从而控制 LED 小灯点亮。
到这里我们就完成了点亮 LED 灯程序的编写,只需要建立工程,把程序下载到单片机中就可以了。对于有 C 语言基础的同学来说上面的程序是很容易理解的,对于初学者也没有关系,按照介绍一个字一个字的把程序抄一遍,慢慢的便熟能生巧了。
下面我们对程序两个方面进行改进,我们这里程序比较简单,只有一条寄存器声明语句,对于复杂的程序来说,需要声明许多条,多条声明语句写在程序里既不方便阅读也容易出错。其实 keil 软件已经把所有的寄存器声明都写到了”reg52.h”文件中,我们只要把头文件包含到程序中就可以了:
#include
另外,当程序运行完 06 语句,后面就没有语句可执行了,当程序下载到单片机后程序有可能跑飞了,我们这里把 06 语句放在一个 while()死循环中,让程序一直循环执行 06 语句。改进的程序如下图:
图 3-7 改进程序
下面我们讲解如何利用 Keil4 软件建立点亮 LED 小灯的工程。首先单击桌面 Keil4 软件桌面快捷方式启动软件,进入软件主界面:
图 3-8 keil4 主界面
如图 3-8 所示,点击菜单中“project”,在下拉菜单中选中“New uViison Project”并单击:
图 3-9 设定工程文件存储路径
如图 3-9 所示,选定工程的存储路径,我们这里是在计算机 D 盘目录下新建了一个名为“点亮 LED 小灯工程”的文件夹,将他作为工程文件的存储路径,这里你可以根据自己的特点选择路径。同时将工程命名为”LED”,也就是在图 3-9“文件名(N):”处输入“LED”,设置好后点击“保存(S)”按钮:
图 3-10 芯片选择界面
如图 3-10 所示,进入了芯片选择界面,我们开发板上用单片机为 STC 公司的 STC89C52 芯片。但是在该界面中并没有 STC 公司选项,由于 51 系列单片机内核都是通用的,因此我们这里选用 Atmel 公司的单片机型号来代替,点击左侧 Atmel 的下拉框:
图 3-11 单片机型号选择界面
如图 3-11 所示,单击选择“AT89C52”型号芯片,其他默认设置,单击“OK”按钮进入下一步:
图 3-12 系统开始代码添加选项
图 3-12 为系统开始代码添加选项,单击“否”编译器会自动处理,单击“是”工程中会添加相关的文件,作为初学者两个选项都是会有影响,我们这里选择“是”。
图 3-13 工程主界面
如图 3-13 所示进入工程主界面,到目前为止已经建立好了名为 LED 的工程,接下来给该工程添加文件:
图 3-14 给工程添加文件
点击“File” ->“New…”,如图 3-14 所示,新建好文件之后,点击“File”->“Save As…”,出现对话框如下图所示:
图 3-15 新建文件并命名为。C 格式
如图 3-15 所示,将文件保存到工程文件夹”点亮 LED 小灯工程”目录下。同时将文件名称命名为“led.c”,这里一定要注意文件的名称为“.c”格式的,稍后我们的程序代码就是在这个“.c”格式的文件中编辑的,单击“保存”,进入程序主界面。
图 3-16 程序主界面并编辑代码
如图 3-16 所示,在主界面代码编辑区将前面介绍的程序代码输入,编辑完之后点击菜单栏的保存快捷按钮。到目前为止,文件建立好了并且代码已经编辑完成,接下来将“led.c”文件添加到我们的工程中来:
图 3-17 添加文件到工程
如图 3-17 所示,右键点击“Source Group1“,在下拉菜单中单击”Add Files to Group 1……”。
图 3-18 添加文件
如图 3-18 所示,选中“led.c”单击“Add”按钮将文件添加到工程中,添加好后单击“Close”关闭对话框。
接下来设置 Keil4 软件输出文件格式,如图 3-19 所示。
图 3-19 输出文件设置
单击上图中快捷键按钮,进入输出文件对话框。
图 3-20 输出文件格式选择对话框
如图 3-20 所示,选中”output”子选项下,勾选“Create HEX File”,其他保持默认,点击“OK”,完成设置。该操作的目的为让我们通过 Keil4 软件编译程序的时候生产”.HEX”格式的文件,这个文件就是我们最终要下载到单片机中的文件。下面我们讲解程序的编译以及查看”.HEX”文件生成情况。
图 3-21 工程编译
如图 3-20 所示,点击左上角的编译快捷按钮,当编译完成之后,左下角会出现编译过程的相关信息,如果程序没有语法错误,会出现“0 Error(s),0Warning(s).”字样。如图所示“creating hex file from “LED”…”表明已经成功生成了 LED.HEX 文件了,可以打开工程目录文件夹便可以找到这个文件,如下图所示。
图 3-22 工程目录
将图 3-22 所示的 LED.hex 文件下载到单片机就完成了整个工程。接下来我们讲解程序下载。
程序下载的详细操作步骤请参考第 2 章第 2.3 小节,在下载之前务必先安装好 USB 转串口驱动软件。最终下载界面如下图所示。
图 3-23 程序下载界面
本章介绍了单片机的内部资源,单片机的最小系统以及 led 的基础知识。介绍了 C 语言程序的编写,建立了点亮 LED 小灯的程序,并将程序下载到了单片机中。虽然整个程序的功能比较简单,但让我们熟悉了整个单片机开发的流程,对单片机开发在脑海中形成了一个初步的概念。对于初学者来说可能整个过程有点枯燥乏味,随着我们后续慢慢的详细展开,会对单片机形成一个很深的理解。
全部0条评论
快来发表一下你的评论吧 !