专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
点亮LED
2019-04-15 15:58
发布
生成海报
站内文章
/
PIC单片机
12499
0
1419
这节课的标题是点亮
LED
,但是需要大家了解的单片机基础知识的内容也非常多,特别是对于初学者,刚开始要在头脑中建立一个单片机的概念,课程最后通过点亮一个
LED
小灯来增加初学者对实验的好奇心和自信心。
1.1
单片机的内部资源
在这里我所讲到的单片机内部资源,和传统单片机书籍讲单片机内部结构不同,我这里讲到的内部资源,是指我们作为单片机用户,单片机提供给我们可使用的一些内容。总结起来,主要是三大资源
:
1、
FLASH(
程序存储空间,早期单片机是
OTP
ROM)
2、
RAM(
数据存储空间
)
3、
SFR(
特殊功能寄存器
)
在早期的技术里边,主要是用
OTP
ROM(
One Time Programable
Read
-
Only Memory
,即一次可编程只读存储器
)
来存储单片机的程序,随着技术的发展,
FLASH
的
以其可重复擦写且
大容量低成本
的优点
成为
绝大
多数单片机的程序存储器。对于单片机来说
FLASH
最大的意义是断电后数据不丢失,这个概念类似于我们电脑的硬盘,你看我们保存了电影、文档、音乐等文件,我们把电源关掉后,下次重新开电脑,所有的文件都还照样存在。
RAM
是单片机的数据存储空间,用来
存储
程序
运行过程
中
产生的和需要的
数据,和我们电脑的内存是一个概念,其实最典型的比喻是我们的计算器,我们用计算器计算个加减法,一些中间的数据都会保存在
RAM
里边,关电后数据丢失,所以我们每次打开计算器,都是从归零开始计算。但是他的优点第一是读写速度非常快,第二是理论上是
可
无限次写
入
的,
即寿命无限,
不管
程序
怎么运行怎么读写它都不会坏
的
。
第三个资源是
SFR
,特殊功能寄存器。这个概念大家可能刚开始理解不了,但是一定要记住。单片机有很多很多功能,每个功能都会配一个
或多个
SFR
,我们就是通过
对
SFR
的读写
来实现单片机
的多种多样的功能
的。
讲到这里,我们来了解一下
51
单片机。通常我们一说到
51
单片机,指的都是兼容
Intel MCS-51
体系架构的一系列单片机。全球有众多的半导体厂商推出了无数款这一系列的单片机,比如
Atmel
的
AT89C52
,
NXP(Philips)
的
P89V51
,宏晶科技的
STC89C52
,具体型号千差万别,但他们的基本操作都是一样的,程序开发环境也是一样的。这里我们要分清楚
51
这个统称和具体的单片机型号之间的关系。
单片机内部资源的三个主要部分我们清楚了,那么我们选择
STC89C52RC
这款单片机来进行学习。
STC89C52RC
单片机是宏晶科技
出品
的一款
51
内核的单片机,
具有标准的
51
体系结构,全部的
51
标准
功能,程序
下载方式
简单,方便学习,我们就用它来学习单片机。它的资源呢,
Flash
程序空间是
8K
字节
(1K=1024
字节,
1
字节
= 8
位
)
,
RAM
数据空间是
512
字节,
SFR
我们后边需要逐一提到并且应用。
1.2
单片机最小系统
为什么称之为单片机最小系统呢?单片机最小系统,也叫做单片机最小应用系统,是指用最少的原件组成单片机可以工作的系统。单片机最小系统的三要素就是电源、晶振、复位电路,如图
2-1
所示。
图
2-1
单片机最小系统电路
备注:本教材中的大部分电路图示例都节选自我们的
KST-51
开发板原理图,但也有部分电路图示例与
KST-51
开发板无关,而仅是用其来说明一些具体问题。读者可自行对照
KST-51
开发板原理图,以下不再做特殊说明。
1.2.1
电源
这个很好理解,电子设备都需要供电,就连我们的家用电器
(
手电筒
^_^)
也不例外。主流单片机的电源现在是
5V
和
3.3V
这两个标准,当然现在还有对电压要求更低的单片机系统。
我们所学的
STC89C52RC
,它
需要
5V
的供电系统,我们的开发板是使用
USB
口出来的
5V
直流电压直接供电的。从图
2-1
可以看到,供电电路在
40
脚和
20
脚的位置上,
40
脚接的是
VCC
,代表的是电源正极,
20
脚接的是
GND
,代表的是电源的负极。
VCC
和
GND
之间还有个电容,作用我们下节课介绍。
这个地方我们还要普及一个看原理图的知识。电路原理图是为了表达这个电路的工作原理而存在的,很多器件在绘制的时候更多考虑是方便分析原理,不是表达各个器件实际位置的。比如上边的单片机引脚图,引脚的位置我们是可以随意放的,但是每个引脚上有一个引脚标号
(在表示芯片的方框的内部)
,这个引脚标号代表的才是单片机真正的引脚位置,如图
2-2
所示。一般情况下,这种双列直插的封装的芯片,左上角是
1
脚,逆时针旋转引脚号依次增加,一直到右上角是最大脚位,
咱们现在选用的
单片机一共
40
个引脚,因此右上角就是
40
。
图
2-2
单片机封装图
1.2.2
晶振
晶振,又
叫晶体振荡器,从这个名字我们就可以看出来,它注定一生都要
不停振动
的。他起到的作用是为单片机系统提供
基准
时钟信号,类似于我们部队训练时喊口令的人,单片机内部所有的工作都是以这个时钟信号为步调基准来进行工作的。
STC89C52RC
单片机的
18
脚和
19
脚是晶振的引脚,我们接了一个
11.0592M
的晶振
(它每秒钟震荡
11,059,200
次
)
,外加两个
20pF
的电容
,电容的作用是帮助晶振起振,并维持震荡信号的稳定
。
1.2.3
复位电路
在图
2-1
左侧是一个复位电路,接到了单片机的
9
脚
RST(Reset)
复位引脚上,这个复位电路如何起到的作用我们后边再讲,现在着重讲一下复位对单片机的作用。单片机复位一般是
3
种情况,上电复位、手动复位、程序自动复位。
我们假如我们的单片机程序有
100
行,当某一次运行到第
50
行的时候,突然停电了,这个时候单片机内部有的区域数据会丢失掉,有的区域数据没丢失,那么下次打开设备的时候,我们希望单片机能正常运行。所以上电后,单片机要进行一个内部的初始化过程,这个过程就可以理解为上电复位
,上电复位保证单片机每次都从一个固定的相同的状态开始工作
。这个过程
跟
我们打开电脑电源开电脑的过程是一致的。
当我们的程序运行,遭受到意外干扰而导致程序死机,或者程序跑飞的时候,我们
就可以
按下一个复位按键,让程序重新初始化重新运行,这个过程就叫做手动复位,最典型的就是我们电脑的重启按钮。
当我们的程序死机或者跑飞的时候,我们的单片机往往有一套自动复位机制,比如看门狗,具体应用以后再了解。在这种情况下,如果程序长时间
失去响应
,单片机看门狗模块会自动复位重启单片机。还有一些情况是我们程序故意重启复位单片机。
电源、晶振、复位构成了单片机最小系统的三要素,也就是说,一个单片机具备了这三个条件,就可以运行我们下载的程序了,其他的比如
LED
小灯、数码管、液晶等设备都是属于单片机的外设,我们最终完成我们想要的功能就是通过对单片机编程来控制这些外设实现的。
1.3
LED
小灯
LED
小灯通常我们也叫做发光二极管,它的种类很多,参数也不尽相同,我们板子上用的是最普通的贴片发光二极管。这种二极管通常的
正向导通
电压是
1.8V
到
2.2V
之间,
工作
电流
一般在
1m
A
~
20m
A
之间。其中,当电流在
1m
A
~
5m
A
之间变化时,随着通过发光二极管
(LED)
的电流越来越大,我们的肉眼会感觉到这个小灯越来越亮,当电流从
5m
A
~
20m
A
之间变化时,我们看到的发光二极管的亮度基本上没有什么太大变化了。当电流超过
20m
A
时,
LED
就会有烧坏的危险了,电流越大,烧坏的也就越快。
所以我们在使用过程中应该特别注意他
在
电流参数
上的
设计
要求
。
那么下面我们来看一下这个发光二极管在我们的开发板上的设计应用。
图
2-3 USB
接口电路
图
2-3
是我们开发板上的
USB
接口电路,通过
USB
线,电脑给我们的开发板供电和下载程序以及实现电脑和开发板之间的通信。从图上可以看出,
USB
座共有
6
个接口,其中
2
脚和
3
脚是数据通信引脚,
1
脚和
4
脚是电源引脚,
1
脚是
VCC
正电源,
4
脚是
GND
即地线
。
5
脚和
6
脚是外壳,我们直接接到了
GND
上,大家可以观察一下开发板上的这个
USB
口的座的
6
个引脚。
我们现在主要来看
1
脚
VCC
和
4
脚
GND
。
1
脚通过
F1(
自恢复保险丝
)
接到右侧,在正常工作的情况下,保险丝可以直接看成导线,因此左右两边都是
USB
电源
+5V
,自恢复保险丝的作用是,当你后级电路哪个地方有发生短路的时候,保险丝会自动切断电路,保护我们的板子以及电脑的
USB
口,当电路正常后,保险丝会恢复畅通,正常工作。
右侧有
2
条支路,第一条是在
+5V
和
GND
接了一个
470uF
的电容,电容是隔离直流的,所以这条支路是没有电流的,电容的作用,我们下节课再介绍,这节课我们主要看第二条支路。我们把第二条支路摘取出来就是这个样子了。
图
2-4 Led
小灯电路
(1)
发光二极管是二极管中的一种,因此和普通二极管一样,这个二极管有阴极和阳极,习惯上
也称之为正极和
负极,这样方便在电路上观察,方向必须接对了才会有电流通过让
LED
小灯发光。刚才我提到了我们接入的
VCC
电压是
5V
,发光二极管自身压降大概可认为是
2V
,那么在右边
RES
这个电阻上承受的电压就是
3V
。那么现在我们要求电流范围是
1~20m
A
的话,就可以根据伏安特性,把这个电阻的上限和下限值求出来。
(VCC - 2)/I= R
当电流是
1m
A
的时候,电阻值是
3K
;当电流是
20m
A
的时候,电阻值是
150
欧,也就是
RES
的取值范围是
150~3000
欧姆。这个电阻值大小的变化,直接可以限制整条通路的电流的大小,因此这个电阻我们通常称之为“限流电阻”。在图
2-3
中,我们用的电阻是
1K
,这条
支
路电流的大小,我想大家可以轻松计算出来了,而这个发光二极管在这里的作用,就是个电源指示灯,使用
USB
线将开发板和电脑连起来,这个灯就会亮了。
同理,我们在板子后级开关控制的地方,又添加了一个
LED10
发光二极管,作用就是当我们打开开关时,这个二极管
才
会
亮起
。
图
2-5 USB
供电电路
大家注意,这里的开关虽然只有一个,但是是
2
路
的
,
2
路开关并联更能确保给后级提供更大的电流。电容
C19
和
C10
,都是隔离断开直流的,作用我们下节课介绍,这里大家可以忽略。
那么下面呢,我们把图
2-4
进行一下变化,把右侧的
GND
去掉,改成一个单片机的
IO
口,如图
2-6
所示。
图
2-6 LED
小灯电路
(2)
图
2-4
由于电源从
正极
到负极有电压差,并且电路是导通的,所以就会有电流通过,
LED
小灯因为有了电流通过,所以就会直接发光。我们把右侧的
原
GND
处
接到单片机
P0.0
引脚上,那么如果我们单片机输出一个低电平,也就
是跟
GND
一样的
0V
电压,就可以让
LED
小灯和图
2-4
一样发光。
因为我们的单片机是可以编程控制的,我们可以让
P0.0
这个引脚输出一个高电平,就是
跟
VCC
一样的
5V
电压,那
么
这个时候,左侧
VCC
电压和右侧的
P0.0
的电压是一致的,那就没有电压差,没有电压差就不会产生电流,没有电流
LED
小灯就不会亮,也就是会处于熄灭状态。下面,我们就用我们的编程软件来实现控制小灯的亮和灭。
1.4
程序代码编写
这是我们第一个实验程序,因此大家还是得耐心点,先来了解一下一些
51
单片机特有的程序语法以及
Keil
软件的基本
操作
步骤。
1.4.1
特殊功能寄存器和位定义
我们主要是用
C
语言来对单片机编程,有的单片机也有那么几条很特殊的独有的编程语句,
51
单片机就有,先介绍
2
条。
第一条语句是:
sfr P0 = 0x80
;
SFR
这个关键字,是
51
单片机特有的,他的作用是
定义一个
单片机特殊功能寄存器
(special function register)
。
51
单片机内部有很多个小模块,每个模块有
8
个开关。每个模块呢,都有一个房间和唯一的房间号。那么
P0
就是一个功能模块,就住在了
0x80
这个房间里,我们就是通过设置
P0
的内部这个模块的
8
个开关,来让单片机的
P0
这
8
个
IO
口输出高电平或者低电平的。
第二条语句是:
sbit LED = P0^0;
这个
sbit
,就是对刚才所说的
SFR
里边的
8
个开关其中
的
一个进行定义。经过上边第二条语句后,以后只要在程序里写
LED
,就代表了
P0.0
口
(
“
^
”
这个
符号在数字键
6
上边
)
,注意这个
P
必须大写
,也就是说我们给
P0.0
又取了一个更形象的名字叫做
LED
。
了解了这两个语句后,我们来大概看一下单片机的
特殊功能
寄存器。注意,每个型号的单片机都会配
有生产厂商所写
的数据手册
(
Datasheet
)
,所以我们来看一下
STC89C52RC
的数据手册,从
21
页到
24
页,全部是对特殊功能寄存器的介绍
以及地址映射列表
。我们在使用这个寄存器之前,必须对这个寄存器的地址进行说明。是不是花花绿绿的太多了,记不住啊,这个没关系的,不需要你记住,了解一下,后边大部分我会慢慢给大家解释,少部分需要用到的时候,自己过来查手册就可以了,做技术不是为了应付考试,你可以随时翻阅手册查找你需要的资料。
继续往下看,在
22
页
最下边有一个表格
表
2-1 IO
口特殊功能寄存器
我们来看一下表
2-1
,其中
P4
口是扩展出来的功能,我们暂时先不看,只看前边的
P0
,
P1
,
P2
,
P3
这
4
个,每个
Px
口本身又有
8
个控制端口。大家可以结合我们的开发板原理图或者图
2-1
来看,那么这样就确定了我们的单片机一共有
32
个
IO
口
(IO
,
In
put
和
Out
put
,
分别是输入和输出
)
。
其中
P0
口所在的地址是
0x80
,一共有从
7
到
0
这
8
个
IO
口控制位,后边有个
Reset Value(
复位值
)
,这个很重要,我们看寄存器必看的一个参数,
8
个控制位复位值全部都是
1
。这里也就告诉了我们,这个单片机上电复位的时候,所有的引脚的值默认是高电平,我们在设计电路的时候也要充分的考虑这个问题。
那么上边那
2
条语句,我们
写
sfr
的时候,必须要根据手册里的这个地址
(add)
去写,
sbit
的时候,就可以直接将一个字节其中某一位取出来。我们编程的时候,也有
现成的写
好寄存器地址的
头
文件,我们直接
包含该头
文件就可以了,不需要逐一去写了。
1.4.2
新建一个工程
对于单片机程序来说,每个功能程序,都必须要有一个配套的工程文件
(Project)
,即使是点亮
LED
这样简单的功能程序也不例外,因此我们首先要新建
一个
工程,打开我们的
Keil
软件后,点击:
Project-->New uVision Project...
然后会出现一个新建工程的界面,如图
2-7
所示。
图
2-7
新建一个工程
我们首先改一下路径,改到了我们预先建立好的
LED
文件夹内,这样方便我们今后管理我们的程序,不同的功能程序放到不同的文件夹下,并且给这个工程起一个名字叫做
LED
,
软件
会自动
加
扩展名为
.uvproj
。
我们直接点保存就可以了,工程会自动
保存
成
LED.uvproj
文件,下次你要打开
LED
这个工程,可以直接找到文件夹,双击这个
.uvproj
文件就可以直接打开了。
图
2-8
保存工程
保存之后会弹出一个对话框,这个对话框让我们选择单片机型号。因为
Keil
这软件是
外
国人开发的,所以我们国内的
STC89C52RC
没有上榜,但是只要选择同类
型号
就
可
一样编程和应用,因为
51
内核是
Intel
公司创始的,所以这里我们直接选择
Intel
公司名下的
80/
87C52
来代替
,这个选项的选择对于我们后边的编程是没有什么影响的,所以大家跟着我来选就可以了
。
图
2-9
单片机型号选择
点
OK
之后,会弹出一个对话框,如果
2-10
所示,这个地方会有部分启动代码,如果点“否”编译器会自动处理这个问题,如果点“是”,这部分代码会提供给我们用户,我们用户
就
可以自己去处理这部分代码,那这部分代码在我们初学
51
的这个时间段,我们一般是不需要去修改的,但是随着技术的提高和知识的扩展,我们有可能会了解这块内容,因此这个地方我们选一下“是
”
,让这段代码出现,但是我们暂时不需要修改它,大家知道这么回事就可以了。
图
2-10
初始化文件选择
这样工程就建立好了,如图
2-11
所示,如果我们点击
Target 1
左边的加号,会出现我们刚才加入的初始化文件
STARTUP.A51
,这个我们先不管。
图
2-11
工程文件
工程有了之后,我们要建立编写代码的文件,点击
File-->New
,新建一个文件,也就是我们编写程序的平台。然后点
File-->Save
或者直接点击那个
Save
的快捷键,可以保存文件并且命名为
LED.C
,这个地方必须加上
.C
了,因为如果写汇编语言,这个地方的扩展名是
.ASM
,头文件就是
.H
等等,我们编写的是
C
语言程序,这个地方必须自己添加文件的扩展名
.C
,如图
2-13
所示。
图
2-12
新建文件
图
2-13
保存文件
现在我们就可以在我们建立好的文件中输入我们编写的程序了,在编写之前还有个工作要做。我们每做一个功能程序,必须要新建一个工程,一个工程代表了单片机要实现的一个功能。但是一个工程,有时候我们可以把我们的程序分多个文件写,所以每写一个文件,我们都要添加到我们所建立的工程中去,鼠标右键点
Source Group 1
,点
Add Files to Group
‘
Source Group 1
’
,
图
2-14
添加文件
(
一
)
图
2-15
添加文件
(
二
)
单击
LED.C
然后点
Add
,或者双击
LED.C
都可以将文件加入到这个工程下,然后点
Close
,关闭添加。 这个时候大家会看到在
Source Group 1
下边又多了一个
LED.C
文件。
1.4.3
编写点亮小灯的程序
忙活了半天,准备工作做了那么多,终于要编写我们的代码了。如果有学过
C
语言的话,你应该很轻松的跟着我的编程自己写出来,如果没学过
C
语言也没关系,你先照着我的抄,我会在合适的位置写出来对
C
语言语法的一些解释,这样抄几次后再看看解释,就应该很明确了。
#include
//
包含
特殊功能
寄存器
定义
的
头
文件
sbit LED = P0^0;
//
位地址声明
,
注意:
sbit
必须小写
、
P
大写
!
v
oid
main()
//
任何一个
C
程序都是从
main
函数开始执行
的
{
LED = 0;
}
按照正常的逻辑,程序这样写就可以了,但是在实际单片机应用中,存在一个问题。比如我们的程序空间可以写
100
行代码,但是我们程序只有
50
行代码,当运行完了
50
行,再继续运行时,第
51
行的程序不是我们想运行的程序
,而是不确定的未知内容
,所以我们通常要在程序中加一个死循环,让程序停留在我们希望的这个状态下,不要乱运行,有以下两种写法可以参考:
参考程序一:
参考程序二:
#include
#include
sbit LED = P0^0;
sbit LED = P0^0;
v
oid
main()
void main()
{
{
while(1) LED = 0;
{
while(1);
LED = 0;
}
}
}
这两个程序都可以实现点亮
LED
小灯的功能,看起来第二种比较简洁一些。针对于图
2-6
,我们这个程序能够完全把小灯点亮,但是这个程序却点不亮我们板子上的小灯,这是为什么呢?
这里我们大家就要培养一个意识了,我们做单片机编程,实际上算是硬件底层驱动程序开发,这种程序的开发,是离不开电路图的,必须根据我们的电路图来进行程序的编写。如果我们设计电路板的电路图和图
2-6
一样的话,我们那个程序可以成功点亮,但是如果不一样,
就
不能点亮小灯。
我们的开发板上,还有一个
74HC138
作为
8
个
LED
小灯的总开关,而
P0.0
仅仅是个分开关。如同我们家里
总是有一个
供电
总闸
,
然后
每个
电灯又
有一个专门的开关,我们刚才的程序仅仅打开了那个电灯的开关,但是没有打开那个总
电闸
,所以程序需要加上这部分代码。因为这节课要介绍的内容比较多,所以我们把
74HC138
的原理以及为什么要加额外的代码
在
下节课统一介绍,这节课我们直接加上这部分代码,大家知道有这么一回事就可以了。
#include
//
包含寄存器的库文件
sbit LED = P0^0;
//
位地址声明
,
注意:
sbit
必须小写!
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
v
oid
main()
{
ENLED = 0;
ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
ADDR3 = 1; //74HC138
开启三极管
LED = 0;
//
点亮小灯
while(1);
//
程序停止在这里
}
写了这么多啰嗦的语句,刚开始大家可能觉得很麻烦,为什么有的书上程序很简单就可以点亮小灯,我们这里要这样来做。大家要了解一点,就是我们做这个学习板呢,虽然仅仅提供给大家简单学习使用,但是我们也得按照实际产品的开发模式去设计,所以综合考虑因素很多,大家学到后边就会明白
它的设计价值
了,这里大家只要跟着我们去做就可以了。
程序编好了,我们要对我们的程序编译进行编译
,
生成我们需要的可以下载到单片机里的文件,在编译之前,我们先要勾选一个选项,
Project-->Options for Target
‘
Target1
’
...
,或者直接点图
2-16
中的快捷图标:
图
2-16 Options for Target
在
弹出的对话框中,点击
Output
选项页
,
勾选其中的
“
Create HEX File
”
复选框
,然后点
OK
。
图
2-17
创建
HEX
选项配置
设置好以后呢,点击“
Project-->rebuild all target files
”
,或者鼠标点击图
2-18
上的快捷图标。
图
2-18
编译程序
编译完成后,在我们的
Keil
下方的
Output
窗口会出现相应的提示,大家注意看图
2-19
,这个窗口告诉我们编译完成后的情况,
data=9.0
,指的是
我们的程序使用了
单片机
内部的
256
字节
RAM
资源中的
9
个字节
,
code=29
的意思是
使用了
8K
代码
Flash
资源
中的
29
个字节。当提示“
0 Error, 0 warning
”表示我们的程序没有错误和警告,就会出现“
creating hex file from
“
LED
”
,意思
是从当前工程生成了
一个
HEX
文件,我们下载给单片机的就是这个
HEX
文件。如果出现有错误和警告提示的话,就是
Error
和
warning
不是
0
,那么我们要对我们的程序进行
检查,
找出问题
,
解决好了再进行编译产生
HEX
才可以。
图
2-19
编译输出信息
这样就编译好了,下边我们就可以把我们编译
好
的程序文件下载到单片机里边了。
1.5
程序下载
首先,我们要把硬件连接好,把板子插到我们的电脑上,通过设备管理器里找到是哪个
COM
口,这些基础的知识我在测试视频里都介绍过了,就不多说了,说一下
STC-ISP
下载软件的设置,如图
2-20
所示。
图
2-20
程序下载设置
下载软件一共有
5
个步骤
:
第一步,选择单片机型号,我们现在用的单片
Ta的文章
更多
>>
嵌入式linux驱动开发之点亮led
0 个评论
MP系统下的三种中断模式
0 个评论
点亮LED
0 个评论
《计算机组成与原理》读书笔记3
0 个评论
Vivado+FPGA学习之第一次上电
0 个评论
热门文章
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮