本节书摘来自异步社区《51单片机应用开发范例大全(第3版)》一书中的第1章,第1.1节,作者 张杰,宋戈,黄鹤松,员玉良,更多章节内容可以访问云栖社区“异步社区”公众号查看。
第1章 单片机C语言开发基础
单片微型计算机(Single Chip Micro Computer)现已正名为微控制器(MCU,Micro Controller Unit),单片机的称谓只是其习惯称呼。它把组成微型计算机的各功能部件(包括*处理单元CPU、随机存储器RAM、只读存储器ROM、I/O接口电路、定时器/计数器以及串行口等)集成在一块电路芯片上。由于单片机的硬件结构与指令系统的功能都是按工业控制要求而设计的,因此常用在工业检测、控制装置中。
1.1 MCS-51单片机硬件基础
MCS-51是指美国Intel公司生产的一系列单片机的总称。这一系列单片机包括很多种,如8031、8051、8751、8032、8052、8752等。其中8051是最早、最典型的产品,该系列其他单片机都是以8051为核心发展起来的,都具有8051的基本结构和软件特征。8051单片机内部包含了作为微型计算机所必需的基本功能部件,各部件相互独立地集成在同一块芯片上。其基本功能特性如下:
- 8位CPU;
- 32条双向可独立寻址的I/O线;
- 4KB程序存储器(ROM),外部可扩充至64KB;
- 128B数据存储器(RAM),外部可扩充至64KB;
- 两个16位定时/计数器;
- 5个中断源;
- 全双工的串行通信口;
- 具有布尔运算能力。
下面详细介绍8051单片机的基本工作原理和内部各功能模块等基础知识。
1.1.1 8051引脚
标准8051单片机有几种不同的封装形式。本书以目前市场上最常见,也是最廉价的PDIP40(塑料双列直插40引脚)封装的8051为主要描述对象,其引脚排列如图1-1所示。
40个引脚功能说明如下。
(1)主电源引脚VSS和VCC。
- VSS(20脚):地线。
- VCC(40脚):5V电源。
(2)外接晶振引脚XTAL1和XTAL2。
- XTAL1(19脚):外接晶体引线端。当使用芯片内部时钟时,此端用于外接石英晶体和微调电容;当使用外部时钟时,对于HMOS单片机,此引脚接地;对于CHMOS单片机,此引脚作为外部振荡信号的输入端。
- XTAL2(18脚):外接晶体引线端。当使用芯片内部时钟时,此端用于外接石英晶体和微调电容;当采用外部时钟时,对于HMOS单片机,此引脚接外部振荡源;对于CHMOS单片机,该引脚悬空不接。
(4)输入/输出引脚P0口、P1口、P2口、P3口。
- P0口(P0.0~P0.7、39脚~32脚):8位双向并行I/O接口。扩展片外存储器或I/O口时,作为低8位地址总线和8位数据总线的分时复用接口,它为双向三态。P0口能以吸收电流的方式驱动8个LSTTL负载。
- P1口(P1.0~P1.7、1脚~8脚):8位准双向并行I/O接口。P1口每一位都可以独立设置成输入输出位。P1口能驱动(吸收或输出电流)4个LSTTL负载。
- P2口(P2.0~P2.7、21脚~28脚):8位准双向并行I/O接口。扩展外部数据、程序存储器时,作为高8位地址输出端口。P2口可以驱动(吸收或输出电流)4个LSTTL负载。
- P3口(P3.0~P3.7、10脚~17脚):8位准双向并行I/O口。P3口除了作为一般的准双向口使用外,每个引脚还有特殊功能。P3口能驱动(吸收或输出电流)4个LSTTL负载。
1.1.2 51单片机功能结构
这里主要介绍组成8051系列单片机的基本功能结构,如图1-2所示。
从图1-2中可以看到,8051单片机主要包含*处理器(CPU)、程序存储器(ROM)、数据存储器(RAM)、定时器/计数器、并行接口、串行接口和中断系统几大功能模块及数据总线、地址总线和控制总线等,将在后面的小节中详细介绍。
此外,8051单片机还有8位内部总线,作为数据、地址及控制信号传输的高速通道,负责将各个外围模块以及核心区域的各功能部件(累加器A、算术/逻辑运算单元ALU、程序计数器PC、程序状态字寄存器PSW、数据指针DPTR、ROM、RAM、特殊功能寄存器SFR等)联系起来。
1.1.3 *处理器(CPU)
*处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入/输出功能等操作。它由运算器、控制器(定时控制部件)和专用寄存器组3部分部件组成。
1.运算器(ALU)
运算器的功能是进行算术运算和逻辑运算。可以对半字节、单字节等数据进行操作,既能够完成加、减、乘、除等四则运算,也可以完成加1、减1、BCD码十进制调整、比较等算术运算和与、或、异或、求补、循环等逻辑运算。
8051运算器还包含有一个布尔处理器,用来处理位操作,以进位标志位C为累加器,可执行置位、复位、取反、等于1转移、等于0转移、等于1转移且清0以及进位标志位与其他可寻址的位之间进行数据传送等位操作。也能使进位标志位与其他可寻址的位之间进行逻辑与、或操作。
2.控制器
(1)时钟电路。
8051片内设有一个由反向放大器所构成的振荡电路,XTAL1和XTAL2分别为振荡电路的输入和输出端,时钟可以由内部方式产生或外部方式产生。内部方式时钟电路如图1-3所示。在XTAL1和XTAL2引脚上外接定时元件,内部振荡电路就产生自激振荡。定时元件通常采用石英晶体和电容组成的并联谐振回路。晶振频率可以在1.2MHz~12MHz之间选择,电容在5pF~30pF之间选择,电容的大小可起频率微调作用。
外部方式的时钟很少用,若要用时,只要将XTAL1接地,XTAL2接外部振荡器就行,如图1-4所示。对外部振荡信号无特殊要求,只要保证脉冲宽度,一般采用频率低于12MHz的方波信号。
时钟频率越高,单片机控制器的控制节拍就越快,运算速度也越快,但同时消耗的功率也更大,对外界的干扰也更强。因此,不同型号、不同场合的单片机所需要的时钟频率是不一样的。
(2)振荡周期、时钟周期、机器周期和指令周期。
一条指令译码产生的一系列微操作信号在时间上有严格的先后次序,这种次序就是计算机的时序。8051的主要时序将在后续章节中介绍,这里先介绍其基本时序周期。
- 振荡周期是为单片机提供时钟信号的振荡源的周期,是时序中最小的时间单位。
- 时钟周期是振荡源信号经二分频后形成的时钟脉冲信号。
- 机器周期是完成一个基本操作所需的时间。一个机器周期包含6个时钟周期,也就等于12个振荡周期。
- 指令周期是指CPU执行一条指令所需要的时间,是时序中的最大时间单位。由于单片机执行不同指令所需的时间不同,因此不同指令所包含的机器周期数也不相同,一个指令周期通常含有1~4个机器周期。
振荡周期、时钟周期、机器周期和指令周期的关系如图1-5所示。
3.专用寄存器组
专用寄存器组主要用来指示当前要执行的内存地址、存放操作数和指示指令执行后的状态等,是任何一台计算机的CPU不可或缺的组成部件。8051的专用寄存器组主要包括累加器(ACC)、通用寄存器(B)、程序状态字(PSW)、堆栈指示器(SP)、数据指针(DPTR)和程序计数器(PC)等,下面分别对这些寄存器进行介绍。
(1)累加器(ACC)。
累加器是最常用的特殊功能寄存器,是一个二进制8位寄存器,运算大部分单操作数指令的操作数取自累加器,双操作数指令的一个操作数取自累加器。加、减、乘、除算术运算指令的运算结果都存放在累加器ACC或A、B寄存器中。指令系统中用A或ACC作为累加器的助记符。
【实例1】使用累加器进行简单加法运算:
MOV A,#02H ;A←02H
ADD A,#06H ;A←A+06H
指令“MOV A,#02H”是把加数2预先送到累加器A,为指令“ADD A,#06H”的执行做准备,因此,指令“ADD A,#06H”执行前累加器A中为加数2,在执行后变为两数之和8。
(2)通用寄存器(B)。
B寄存器是乘除法指令中常用的寄存器。乘法指令的两个操作数分别取自A和B,其结果存放在B(高8位)、A(低8位)寄存器中。除法指令中,被除数取自A,除数取自B,商数存放于A,余数存放于B。在其他指令中,B寄存器可作为RAM中的一个单元来使用。
【实例2】使用B寄存器进行简单乘法运算:
MOV A,#02H ; A←2
MOV B,#06H ; B←6
MUL AB ; BA←A*B=6*2
前面两条是传送指令,是进行乘法前的准备指令,乘法指令执行前累加器A和通用寄存器B中分别存放了两个乘数,乘法指令执行后,积的高8位自动存放在B中,低8位自动存放在A中。
(3)程序状态字(PSW)。
程序状态字是一个8位寄存器,包含了程序的状态信息,寄存器各位代表的含义如图1-6所示。
其中PSW1未用。其他各位说明如下。
- CY(Carry):进位标志。在执行某些算术和逻辑指令时,可以被硬件或软件置位或清零。具体地说在加法运算时,若累加器A中最高位A.7有进位,则CY=1,否则CY=0;在减法运算时,若A.7有借位,则CY=1,否则CY=0;CPU在进行移位操作时也会影响这个标志位。在布尔处理机中被认为是位累加器,其重要性相当于一般*处理机中的累加器A。
- AC(Auxiliary Carry):辅助进位标志。当进行加法或减法操作而产生由低4位数(BCD码一位)向高4位数进位或借位时,AC将被硬件置位,否则就被清零。AC被用于BCD码调整。
- F0(Flag zero):用户标志位。F0是用户定义的一个状态标志,用软件来使其置位或清零。该标志状态一经设定,可由软件测试F0,以控制程序的流向。
- RS1,RS0(Registers Selection):寄存器区选择控制位。8051共有8个8位工作寄存器,分别命名为R0~R7。工作寄存器R0~R7常常被用来进行程序设计,但其在RAM中的实际物理地址是可以根据需要选定的。RS1和RS0就是为了这个目的提供给用户使用的,用户通过改变RS1和RS0的状态可以方便地决定R0~R7的实际物理地址。可以用软件来置位或清零以确定工作寄存器区。RS1和RS0与寄存器区的对应关系如表1-1所示。
- OV(Overflow):溢出标志。可以指示运算过程中是否发生了溢出,当执行算术指令时由硬件置位或清零。溢出标志常用于作加减运算时OV=1表示加减运算的结果超出了目的寄存器A所能表示的带符号数(2的补码)的范围(−128~+127)。当执行加法指令ADD时,位6向位7有进位而位7不向CY进位时,或位6不向位7进位而位7向CY进位时,溢出标志OV置位,否则清零。无符号数乘法指令的执行结果也会影响溢出标志:若置于累加器A和寄存器B的两个数的乘积超过255时,OV=1,否则OV=0。此积的高8位放在B内,低8位放在A内。因此,OV=0意味着只要从A中取得乘积即可,否则要从B、A寄存器对中取得乘积。除法指令也会影响溢出标志:当除数为0时,OV=1,否则OV=0。
- P(Parity):奇偶标志。每个指令周期都由硬件来置位或清“0”,以表示累加器A中值为1的位数的奇偶数。若1的位数为奇数,P置“1”,否则P清“0”。P 标志位对串行通信中的数据传输有重要的意义,在串行通信中常用奇偶校验的办法来检验数据传输的可靠性。在发送端可根据P的值对数据的奇偶置位或清零。通信协议中规定采用奇偶校验的办法,则P=0时,应对数据(假定由A取得)的奇偶位置位,否则就清零。
【实例3】通过设置RS1、RS0选择工作寄存器区1:
CLR PSW.4 ; PSW.4←0
SETB PSW.5 ; PSW.5←1
(4)堆栈指针(SP)。
栈指针SP一个8位特殊功能寄存器,其作用为指示堆栈顶部在内部RAM中的位置。系统复位后,SP初始化为07H,使得堆栈事实上由08H单元开始。考虑到08H~1FH单元分属于工作寄存器区1~3,若程序设计中要用到这些区,则最好把SP值设置为1FH或更大的值,SP的初始值越小,堆栈深度就可以越深。堆栈指针的值可以由软件改变,因此堆栈在内部RAM中的位置比较灵活。
(5)数据指针(DPTR)。
数据指针DPTR是一个16位特殊功能寄存器,其高位字节寄存器用DPH表示,低位字节寄存器用DPL表示,既可以作为一个16位寄存器DPTR来处理,也可以作为两个独立的8位寄存器DPH和DPL来处理。DPTR主要用来存放16位地址,当对64KB外部存储器寻址时,可作为间址寄存器使用。
【实例4】使用数据指针DPTR访问外部数据数据存储器:
MOV DPTR, #data16 ; DPTR←data16
MOVX A, @ DPTR ; A←((DPTR))
MOVX @ DPTR, A ; (DPTR)←A
(6)程序计数器(PC)。
程序计数器(PC)用来存放即将要执行的指令地址,共16位,可对64KB的程序存储器直接寻址。读取存储在外部程序存储器中的指令时,PC内容的低8位经P0口输出,高8位经P2口输出。
【实例5】使用程序计数器PC查表:
MOV A, #data ;A←data
MOVC A, @ A+DPTR ; PC←(PC)+1 ,A←((A)+(PC))
1.1.4 存储器结构
MCS-51单片机的存储器编址方式采用与工作寄存器、I/O口锁存器统一编址的方式,程序存储器和数据存储器空间是互相独立的,各有自己的寻址系统和控制信号,物理结构也不同。程序存储器为只读存储器(ROM),数据存储器为随机存储器(RAM)。
从物理地址空间看,MCS-51有4个存储器地址空间,即片内程序存储器和片外程序存储器以及片内数据存储器和片外数据存储器,其组织结构如图1-7所示。
1.程序存储器
程序存储器用来存放程序和表格常数。程序存储器以程序计数器PC作地址指针,通过16位地址总线,可寻址的地址空间为64KB。片内、片外统一编址。
在8051/8751片内,带有4KB的ROM/EPROM程序存储器。因此当接高电平时,将从内部ROM开始运行整个程序,其中外部程序存储器地址空间为1000H-FFFFH。若将接低电平,可用于调试外部ROM内的程序,即把要调试的程序放在与内部ROM空间重叠的外部程序存储器内,进行调试和修改。
在程序存储器中有些特殊的单元在使用中应加以注意。其中一组特殊单元是0000H~0002H单元,系统复位后,PC为0000H,单片机从0000H单元开始执行程序,该单元是系统执行程序的起始地址,通常在该单元中存放一条跳转指令,而用户程序从跳转地址开始存放程序。
另一组特殊单元是0003H~002AH,这40个单元专门用于存放中断处理程序,按中断的类型被均匀地分为5段,其定义如下。
- 0003H~000AH:外部中断0中断地址区。
- 000BH~0012H:定时/计数器0中断地址区。
- 0013H~001AH:外部中断1中断地址区。
- 001BH~0022H:定时/计数器1中断地址区。
- 0023H~002AH:串行中断地址区。
2.数据存储器
MCS-51单片机的数据存储器无论在物理上或逻辑上都分为两个地址空间,一个为内部数据存储器,访问内部数据存储器用MOV指令;另一个为外部数据存储器,访问外部数据存储器用MOVX指令。
MCS-51系列单片机各芯片内部都有数据存储器,是最灵活的地址空间,分成物理上独立的且性质不同的几个区。8051内部有128个8位用户数据存储单元和128个专用寄存器单元,这些单元是统一编址的,专用寄存器只能用于存放控制指令数据。所以,用户能使用的RAM只有00H~7FH(0~127)单元组成的128字节地址空间,可存放读写的数据或运算的中间结果;80H~FFH(128~255)单元组成的高128字节地址空间的特殊功能寄存器(又称SFR)区只能访问,而不能用于存放用户数据。
注意
8032/8052单片机将80H~FFH(128~255)单元组成的高128字节地址空间作为RAM区。
对于片内RAM的低128字节(00H~7FH)还可以分成工作寄存器区、可位寻址区和一般RAM区3个区域,其功能特点如下。
- 工作寄存器区:在00H~1FH安排了四组工作寄存器,每组占用8个RAM字节,记为R0~R7。在某个时刻,CPU只能使用其中的一组工作寄存器,工作寄存器的选择由程序状态字(PSW)中的两位来确定。
- 可位寻址区:占用20H~2FH 16字节,从20H单元的第0位到2FH单元的第7位至共128位,位地址00H~7FH分别与之对应。这个区域除了可作为一般的RAM单元按字节读写外,还可对每个字节的每一位进行操作,一般存放需要按位操作的数据。
- 一般RAM区:地址为30H~7FH,共80字节,可作为一般用途的RAM,如存放程序变量等。
特殊功能寄存器中只有一部分是定义了的,对其他没有定义的地址进行操作会导致不确定的结果。8051内部特殊功能寄存器符号及地址如表1-2所示,其中带“*”号的特殊功能寄存器都是可以位寻址的,并可以用“寄存器名.位”来表示,如ACC.0、B.7等。
MCS-51可以扩展64KB外部数据存储器,这对很多应用领域已足够使用,对外部数据存储器的访问采用MOVX指令,用间接寻址方式,R0、R1和DPTR都可用作间址寄存器。
1.1.5 定时/计数器
8051片内有两个16位的可编程定时器/计数器T0和T1,用于定时或计数产生中断控制程序执行,它们各由两个独立的8位寄存器组成,用于存放定时或计数时的时间常数。T0由两个8位寄存器TH0和TL0组成,其中TH0为高8位,TL0为低8位。和T0类同,T1也由TH1和TL1两个8位寄存器组成,其中TH1为高8位,TL1为低8位。TH0、TL0、TH1和TL1均为SFR特殊功能寄存器,用户可以通过指令对他们进行数据存取。
T0和T1有定时器和计数器两种工作模式,在每种模式下又分为若干工作方式。在定时器模式下,T0和T1通过对每个机器周期的计数,即一个机器周期定时器加1,当定时器的数值与TH0/1和TL0/1中的时间常数相等时,执行指定动作。在计数器模式下,T0和T1的计数脉冲可以从P3.4和P3.5引脚上输入,在输入引脚的电平由高到低出现跳变时计数器加1。对T0和T1的控制由两个8位特殊功能寄存器完成:一个称为定时器方式选择寄存器TMOD,用于确定是定时器工作模式还是计数器工作模式;另一个叫做定时器控制寄存器TCON,用于决定定时器或计数器的启动、停止以及进行中断控制。
1.1.6 并行端口
I/O端口也叫做I/O通道或I/O通路,是MCS-51单片机对外部实现控制和信息交换的必经之路。I/O端口有串行和并行之分,串行I/O端口一次只能传送一位二进制信息,并行I/O端口一次能传送一组二进制信息。
MCS-51单片机有P0、P1、P2、P3等4个8位双向I/O端口,每一条I/O线都能独立地用做输入和输出,其内部结构和功能如下。
- P0口:P0的位结构如图1-8所示。电路中包含一个数据输出锁存器和两个三态数据输入缓冲器,另外还有一个数据输出的驱动和控制电路。这两组端口用来作为CPU与外部数据存储器、外部程序存储器和I/O扩展口的总线接口,而不像P1、P3直接用做输出口。该8位都为漏级开路输出,每个引脚可以驱动8个LS型TTL负载且内部没有上拉电阻,执行输出功能时外部必须接上拉电阻(10k即可);若要执行输入功能,必须先输出高电平方能读取该端口所连接的外部数据;若系统连接外部存储器,则P0可作为地址总线(A0~A7)及数据总线(D0~D7)。
- P1口:P1的位结构如图1-9所示。P1口为8位准双向口,每一位均可单独定义为输入或输出口,当作为输出口时1写入锁存器,overline{rm{Q}}=0,T2截止,内部上拉电阻将电位拉至“1”,此时该端口输出为1;当0写入锁存器时,overline{rm{Q}}=1,T2导通,输出为0。作为输入口时,锁存器置1,overline{rm{Q}}=0,T2截止,此时该位既可以把外部电路拉成低电平,也可由内部上拉电阻拉成高电平。需要说明的是,作为输入口使用时有两种情况,其一是首先是读锁存器的内容,进行处理后再写到锁存器中,这种操作即读—修改—写操作,如JBC(逻辑判断)、CPL(取反)、INC(递增)、DEC(递减)、ANL(与逻辑)和ORL(逻辑或)等指令均属于这类操作;其二是读P1口线状态时打开三态门G2将外部状态读入CPU。
- P2口:P2的位结构如图1-10所示,电路结构与P0口相似,但内部有30k上拉电阻,执行输出功能时不必连接外部上拉电阻。每个引脚可以驱动4个LS型TTL负载;若要执行输入功能,必须先输出高电平方能读取该端口所连接的外部数据;若系统连接外部存储器的地址线超过8条时,则P2口可作为地址总线(A15~A8)引脚。
- P3口:P3的位结构如图1-11所示,内部有30k上拉电阻,执行输出功能时不必连接外部上拉电阻。该8位都为漏级开路输出,每个引脚可以驱动4个LS型TTL负载。若要执行输入功能,必须先输出高电平,方能读取该端口所连接的外部数据。
在实际应用中,P3口的第二功能更为重要,表1-3列出了P3口的各位的第二功能。
每个I/O端口内部都有一个8位数据输出锁存器和一个8位数据输入缓冲器,4个数据输出锁存器与端口号P0、P1、P2和P3同名,都是特殊功能寄存器。因此,CPU数据从并行I/O端口输出时可以得到锁存,数据输入时可以得到缓冲。
4个并行I/O端口作为通用I/O口使用时,共有写端口、读端口和读引脚3种操作方式。写端口实际上就是输出数据,是将累加器A或其他寄存器中数据传送到端口锁存器中,然后由端口自动从端口引脚线上输出。读端口不是真正的从外部输入数据,而是将端口锁存器中输出数据读到CPU的累加器。读引脚才是真正的输入外部数据的操作,是从端口引脚线上读入外部的输入数据。
1.1.7 串行端口
8051有一个全双工的可编程串行I/O端口。这个串行I/O端口既可以在程序控制下将CPU的8位并行数据编程串行数据一位一位地从发送数据线TXD发送出去,也可以把串行接收到的数据变成八位并行数据送给CPU,而且这种串行发送和串行接收可以单独进行,也可以同时进行。
8051串行发送和串行接收利用了P3口的第二功能,即利用P3.1引脚作为串行数据的发送线TXD,利用P3.0引脚作为串行数据的接收线RXD,如表1-3所示。串行I/O口的电路结构还包括串行口控制器SCON、电源及波特率选择寄存器PCON和串行数据缓存器SBUF等,这些寄存器都属于特殊功能寄存器(SFR)。其中PCON和SCON用于设置串行口工作方式和确定数据的发送和接收波特率,串行数据缓冲器SBUF用于存放欲发送或已接收的数据。SBUF实际上由两个相互独立的发送缓冲器和接收缓冲器组成,当要发送的数据传送到SBUF时,进的是发送缓冲器;当要从SBUF读数据时,则取自接收缓冲器,取走的是刚接收到的数据。
1.1.8 中断系统
8051的中断系统可以接受5个独立的中断源的中断请求,这5个中断源即2个外部中断、2个定时器/计数器中断和1个串行口中断。
外部中断源产生的中断请求信号可以从P3.2和P3.3引脚上输入,有电平或边沿两种触发方式;内部中断源T0和T1的两个中断是在其从全“1”变为全“0”溢出时自动向中断系统提出的;内部串行口中断源的中断请求是在串行口每发送完一个8位二进制数据或接收到一组输入数据(8位)后自动向中断系统提出的。
8051的中断系统主要由IE(Interrupt Enable,中断允许)控制器和中断优先级控制器IP等电路组成。其中,IE用于控制5个中断源中哪些中断请求被允许向CPU提出,哪些中断源的中断请求被禁止,IP用于控制5个中断源的中断请求的优先级。
1.1.9 总线
MCS-51单片机属总线型结构,其总线通常分为地址总线、数据总线和控制总线等3种,其功能分别如下。
- 地址总线(AB):地址总线宽度为16位,由P0口经地址锁存器提供低8位地址(A0~A7);P2口直接提供高8位地址(A8~A15),地址信号是由CPU发出的单方向信号。
- 数据总线(DB):数据总线宽度为8位,用于传送数据和指令,由P0口提供。
- 控制总线(CB):随时掌握各种部件的状态,并根据需要向有关部件发出命令。
在访问外部存储器时,P2口输出高8位地址,P0输出低8位地址,由ALE(地址锁存允许)信号将P0口(地址/数据总线)上的低8位锁存到外部地址锁存器中,从而为P0口接收数据做准备。