0 - 计算机基础知识
0.0 单片机
1.单片机定义
全称单片微型计算机(Single ChipMicrocomputer)又称微控制器MCU(Micro Controller Unit),是将计算机的基本部分微型化,使之集成在一块芯片上的微机。片内含有CPU、ROM、RAM、并行I/O、串行I/O、定时器/计数器、中断控制、系统时钟及系统总线等,它本身就是一个嵌入式系统,同时它也可作更大的嵌入式系统的核心。为适应不同的应用需求,一个系列的单片机都有多种衍生产品,其处理器核心一样,只是存储器、接口配置不一样,使功能与应用匹配,以减少功耗和成本
2.单片机发展趋势
-
单片机的字长由4位、8位、16 位发展到 32位
-
运行速度不断提高
-
单片机内的存储器变化
-
I/O端口多功能化
-
功耗越来越低
-
结合专用集成电路ASIC、精简指令集和RISC技术,使单片机发展成为嵌入式的处理器,深入到数字信号处理、图象处理、人工智能、机器人等领域
3.51单片机类型
-
基本型(普通型):基本型的代表产品是8051,其基本特性如下:
-
一个8位CPU和指令系统
-
128字节的片内RAM
-
21个特殊功能寄存器
-
32线并行I/O口
-
2个16位定时/计数器
-
一个全双工串行口
-
5个中断源、2个中断优先级的中断结构
-
4KB片内ROM
-
一个片内时钟振荡器和时钟电路
-
片外可扩展64KBROM和64KBRAM
-
-
增强型: 有8052AH、8032AH、8752BH,此类型单片机的内ROM和RAM容量比基本型的增大一倍,同时把16位计数增为3个.87C54内部ROM增加到16KB,87C58增加到32KB
-
低功耗型: 型号带有“C”字的单片机采用CHMOS工艺,其特点是功耗低,另外, 87C51还有两级程序存储器保密系统,可防止非法拷贝程序
-
在系统可编程(ISP)型: 用户只要连接好下载电路,就可以在不拔下 51 芯片的情况下,直接在系统进行编程。编程期间,系统是不能运行程序的。该系列产品还带有看门狗
-
在应用可编程(IAP)型: 允许应用程序在运行时可以通过自己的程序代码对自己进行编程,达到更新程序的目的。它通常在系统芯片中采用多个可编程的程序存储区来实现这一功能的
-
JTAG 调试型: 支持在系统、全速、非嵌入式调试和编程,不占用任何片内资源
0.1 微型计算机的基本结构和工作原理
0.1.1 微型计算机的系统结构
1.微型计算机系统结构:硬件(元件、器件、电路)、软件(程序)
-
CPU : 计算机的控制核心,它的功能是执行指令,完成算数运算、逻辑运算,并对整机进行控制
-
存储器: 用于存储程序和数据。它由成千上万个单元组成,每个单元存放一个8位二进制数(指令码或数据),每个存储单元有一个编号(地址)
-
输入/输出接口: 又称I/O接口,是CPU和外设之间相连的逻辑电路,外设必须通过接口才能和CPU相连。不同的外设所用接口不同。每个I/O接口也有一个地址,CPU通过对不同的I/O接口进行操作来完成对外设的操作
-
总线 :CPU 、存储器、I/O接口和之间相连的一组线
2.微型计算机的三总线结构
-
数据总线(DB): 用于传送程序或数据的总线
-
地址总线(AB): 用于传送地址以识别不同的存储单元或I/O接口的一组线
-
控制总线(CB): 用于控制数据总线上数据流送的方向、对象等的一组线
0.1.2 微型计算机的基本工作原理
1.微机的工作原理: 存储程序、执行程序
2.微机的基本工作过程: 取指令,译码,执行
3.单片机: 微型计算机的一种,是将计算机主机(CPU、存储器和I/O接口)集成在一小块硅片上的微机,又称微控制器。它专为工业测量与控制而设计,具有三高优势(集成度高、可靠性高、性价比高)
4.单片机的特点: 小而全(体积小,功能全),主要应用于工业检测与控制、计算机外设、智能仪器、仪表、通信设备、家用电器等,特别适合于嵌入式微型机应用系统
5.嵌入式工程师的任务: 根据应用对象的需求,完成硬件和软件的设计,即选择合适的单片机,进行接口、存储器等电路的系统设计,并设计程序,以控制应用系统按程序的指令完成规定的工作
0.2 计算机中的数制与码制
0.2.1 计算机中的数
1.不同进制数的表示
-
B(binary)表示二进制数制;
-
D(decimal)或不带字母表示十进制数制;
-
H(hexadecimal)表示十六进制数制。
2.不同进位记数制对照表
十进制 | 二进制(B) | 十六进制(H) |
---|---|---|
0 | 0000 | 0 |
1 | 0001 | 1 |
2 | 0010 | 2 |
3 | 0011 | 3 |
4 | 0100 | 4 |
5 | 0101 | 5 |
6 | 0110 | 6 |
7 | 0111 | 7 |
8 | 1000 | 8 |
9 | 1001 | 9 |
10 | 1010 | A |
11 | 1011 | B |
12 | 1100 | C |
13 | 1101 | D |
14 | 1110 | E |
15 | 1111 | F |
3.进制转换
计算机基础进制转换(二进制、八进制、十进制、十六进制)_计算机进制转换方法-CSDN博客
4.计算机中数的几个概念
(1)机器数与真值
机器数:机器中数的表示形式,它将数的正、负符号和数值部分一起进行二进制编码,其位数通常为8的整数倍
真值:机器数所代表的实际数值的正负和大小,是人们习惯表示的数
(2)数的单位
位(bit):一个二进制数中的1位,其值不是1便0
字节(Byte):一个字节,就是一个8位的二进制数
字(Word):两个字节,就是一个16位的二进制数
双字:两个字,即四个字节,一个32位二进制数
0.2.2 计算机中的有符号数的表示
1.有符号数与无符号数
-
有符号数: 机器数的最高位为符号位,符号位为“0”表示正数,符号位为“1” 表示负数。
- 注:只有8位、16位或32位机器数的最高位才是符号位。有符号数有原码、反码和补码3种表示方式
-
无符号数: 机器数的最高位没有符号意义,只有数值意义
2.原码
-
表示:数值部分用其绝对值,正数的符号位用“0”表示,负数的符号位用“1”表示
-
示例:
X1=+5=+00000101B [X1]原=00000101B
X2=-5=-00000101B [X2]原=10000101B
-
范围:
-
8位原码数的范围为FFH~7FH(-127~127)。原码数00H和80H的数值部分相同、符号位相反,它们分别为+0和-0
-
16位原码数的数值范围为FFFFH~7FFFH(-32767~32767)。原码数0000H和8000H的数值部分相同、符号位相反,它们分别为+0和-0
-
3.反码
-
表示:正数的反码与原码相同;负数反码:符号位不变,数值部分按位取反
-
示例
X1=+4 [X1]原=00000100B=04H [X1]反=00000100B=04H
X2=-4 [X2]原=10000100B=84H [X2]反=11111011B= FBH
4.补码
-
常规求补码法
a. 表示:正数的补码与原码相同;负数补码为其反码加1
b. 示例:
X1=+4: [X1]原=[X1]反=[X1]补= 00000100=04H
X2= - 4:[X2]原 =10000100 [X2]反 = 11111011 [X2]补 = [X2] 反+1= 1111100=FCH
c.范围:
- 8位补码数的数值范围为 -128~127(80H~7FH)
- 16位补码数的数值范围为 -32768~32767( 8000H~7FFFH )
-
快速求补码法
a. 表示:将负数原码的最前面的1和最后一个1之间的每一位取反
b. 示例:
x=-4: [x]原 = 10000100 [x]补 = 11111100=FCH
-
模-|X|求补码
a. 表示:一个数的补数=模-该数,这里补数是对任意的数而言,包括正、负数。而补码是针对符号机器数而言。设有原码机器数X, X>0 则 [X]补=[X]原 ;X<0 则 [X]补= 模 - |X|
b. 示例
对八位二进制数:
X1=+4:[X1]补 = 00000100=04H;
X2=-4:[X2]补 = 100H-4=FCH
对于16二进制位数:
X2=+4: [X2]补= 0004H;
X2=-4: [X2]补 = 10000H-4=FFFCH
-
说明
-
计算机中,凡是符号数一律用补码表示
-
根据两数互为补的原理,对补码求补码就可以得到其原码,将原码的符号位变为正、负号,即是它的真值
-
一个用补码表示的机器数,若最高位为0,则其余几位即为此数的绝对值;若最高位为1,其余几位不是此数的绝对值,必须把该数求补(按位取反(包括符号位)加1),才得到它的绝对值
-
当数采用补码表示时,就可以把减法转换为加法。由于数的八位限制,最高位的进位是自然丢失的(在计算机中。进位被存放在进位标志CY中的)
-
用补码相加完成两数相减,相减若无借位,化为补码相加就会有进位;相减若有借位,化作补码相加就不会有进位。
-
补码运算后的结果为补码,需再次求补才能得到运算结果的真值
-
5.减法与补码
例1:64-10=64+(-10)=54
[64]补=40H=0100 0000B
[10]补=0AH=0000 1010B [-10]补=1111 0110B
例2: 34-68=34+(-68)=-34
34=22H=0010 0010B
68=44H=0100 0100B [-68]补=1011 1100B
0.2.3 进位和溢出
1.溢出含义
当两个补码数相加结果超出补码表示范围,就会产生溢出,导致结果错误
2.溢出标志
计算机中设立了溢出标志位OV,通过最高位的进位(符号位的进位)CY和次高位进位(低位向符号位的进位)CY-1异或产生
3.进位与溢出
-
进位CY:当运算结果超出计算机位数的限制(8位、16位),会产生进位,它是由最高位计算产生的,在加法中表现为进位,在减法中表现为借位。对于含有负数的计算,CY取反,对于两个数的加法,则是正常
-
溢出OV:两个补码数相加结果超出补码表示范围而产生,OV= CY⊕CY-1
0.2.4 BCD码
1.BCD码概念
将十进制数变为二进制数,出现了BCD码,即二进制代码表示的十进制数。故名思意,它即是逢十进一,又是一组二进制代码。用4位二进制数编码表示1位十进制数称为压缩的BCD码,8位二进制数可以放2个十进制数位。也可以用8位二进制数表示1个十进制数位,这种BCD码称为非压缩的BCD码
2.BCD编码表
十进制数 | 压缩BCD码 | 非压缩BCD码 |
---|---|---|
0 | 0000B(0H) | 0000 0000B(00H) |
1 | 0001B(1H) | 0000 0001B(01H) |
2 | 0010B(2H) | 0000 0010B(02H) |
3 | 0011B(3H) | 0000 0011B(03H) |
4 | 0100B(4H) | 0000 0100B(04H) |
5 | 0101B(5H) | 0000 0101B(05H) |
6 | 0110B(6H) | 0000 0110B(06H) |
7 | 0111B(7H) | 0000 0111B(07H) |
8 | 1000B(8H) | 0000 1000B(08H) |
9 | 1001B(9H) | 0000 1001B(09H) |
10 | 0001 0000B(10H) | 0000 0001 0000 0000(0100H) |
11 | 0001 0001B(11H) | 0000 0001 0000 0001(0101H) |
28H | 0010 1000B(28H) | 0000 0010 0000 1000(0208H) |
3.BCD码运算
(1)调整原因:BCD码运算应该得到BCD码结果,由于计算机是按二进制运算,结果不为BCD码,因此要进行十进制调整
(2)调整方式:当计算结果有非BCD码或产生进位/借位时,加法进行 +6、减法进行 -6 调整运算
(3)示例
1 - 51单片机结构
1.1 51单片机内部结构
1.1.1 概述
1.51单片机部件
-
一个8位的CPU;
-
一个片内振荡器及时钟电路;
-
4KB ROM程序存储器;
-
128 字节RAM数据存储器。
-
可寻址64KB外部数据存储器和64KB外部程序存储器空间的控制电路;
-
32条可编程的I/O线(四个8位并行I/O端口);
-
两个16位定时器/计数器;
-
一个可编程全双工串行口;
-
五个中断源、两个优先级嵌套中断结构。
2.51单片机内部结构框图
1.1.2 CPU
1.运算器
-
进行算术运算:加、减、乘、除、加1、减1、BCD码十进制调整等
-
逻辑运算:与、或、异或、求反等逻辑操作
-
位操作:内部有布尔处理器,它以进位标志位C为位累加器,用来处理位操作。可对位置 “1”、对位清“0”、位判断等
-
操作结果的状态信息送至状态寄存PSW
2.程序计数器PC
程序计数器PC是16位的自动加1的寄存器,用来存放即将要执行的指令地址,可对64KB程序存储器直接寻址。执行指令时,PC内容的低8位经P0口输出,高8位经P2口输出,取出指令码后,PC寄存器内容自动加1,指向下一指令码地址
3.指令寄存器
指令寄存器中存放指令代码。CPU执行指令时,由程序存储器中读取的指令代码送入指令存储器,经指令译码器译码后由定时与控制电路发出相应的控制信号,完成指令功能
1.2 存 储 器
1.存储器组成
存储器用来存放程序和数据,半导体存储器由一个一个单元组成,每个单元有一个编号(称为地址),一个单元存放一个8位数据,当一个数据多于8位就需要两个单元存放
2.计算机的存储器地址结构形式有两种:
普林斯顿结构: RAM和ROM连续编址在同一地址空间
哈佛结构: RAM和ROM分别编址在不同一地址空间,RAM和ROM可以有相同的地址,CPU靠不同的指令区别
3.51单片机的储存器
采用哈佛结构,它将ROM(程序存储器)和RAM (数据存储器)分开编址,各有自己的寻址方式、控制信号和指令。程序存储器用来存放程序和始终要保留的常数。数据存储器存放程序运行中所需要数据(常数和变量)或运算结果
4.51单片机的四个存储器地址空间(物理空间)
- 片内数据存储器
- 片外数据存储器
- 片内程序存储器
- 片外程序存储器
注意:
引脚EA的接法(EA引脚接地还是接+5V)决定了程序储存器的0000~0FFFH 4KB地址范围是在单片机片内还是片外,如果接+5V(EA=1),程序从片内开始执行;如果接地(EA=0),程序从片外开始执行,而不管片内是否实际存在程序存储器
5.由于片内、片外程序存储器统一编址,因此从逻辑上看, 8XX51有三个存储器空间:
- 片内数据存储器
- 片外数据存储器
- 片内、片外统一编址的程序存储器
1.2.1 程序存储器
1.程序存储器作用: 用来存放编制好的始终保留的固定程序和表格常数
2.程序存储器寻址空间
程序储存器以程序计数器 PC 作为地址指针,通过16位地址总线,可寻址的地址空间为
64KB
3.单片机的程序存储器
在8051/8751/89C51 片内,分别内置最低地址空间的4KB ROM/EPROM/EEPROM程序储存器(内部程序储器),而在8031片内,则无内部程序储存器,必须外部扩展EPROM。51单片机中64KB内、外程序储存器的地址是统一编排的
4.程序存储器运行
对于内部有ROM的单片机(51、52系列),
E
A
‾
\overline{EA}
EA引脚接高电平,使程序从内部ROM开始执行。
当PC值超出内部ROM的容量时,会自动转向外部程
序存储器1000H后的地址空间执行。外部程序存储器地址空间为1000H~FFFFH
5.程序存储器访问指令: 访问程序存储器使用MOVC指令
6.程序存储器特殊地址
地址 | 用途 |
---|---|
0000H | 复位操作后的程序入口 |
0003H | 外部中断0服务程序入口 |
000BH | 定时器0中断服务程序入口 |
0013H | 外部中断1服务程序入口 |
001BH | 定时器1中断服务程序入口 |
0023H | 串行口中断服务程序入口 |
7.程序转移
由于两入口地址之间的存储空间有限,当系统中有中断程序时,通常在这些入口地址开始的两三个单元中,放一条转移类指令,使相应的程序绕过中断服务程序人口地址,转到指定的程序存储器区域中执行
1.2.2 外部数据存储器
1.访问指令: 使用 MOVX 指令和相同的寄存器间址访问
2.扩展: 51单片机最多可扩展64KB外部数据存储器
1.2.3 内部数据存储器
1.内部数据存储器特点
-
内部数据存储器是使用最多的地址空间
-
指令(算术运算、逻辑运算、位操作运算等)的操作数只能在此地址空间或特殊功能寄存器地址空间
2.内部数据存储器可作空间
-
存放随机读写的数据
-
通用寄存器区
-
堆栈区
-
运算操作数存放区
3.内部数据存储器和特殊功能寄存器(SFR)的地址分配
- 基本型51子系列中有128字节RAM,占地址00-7FH,SFR占地址80H-FFH
- 增强型52子系列中有256字节RAM,占地址00-FFH,其中80H-FFH地址的RAM和SFR 80H-FFH占的地址是重合的,访问SFR用直接地址(称为直接寻址)访问RAM采用寄存器间接寻址
4.片内 RAM 的分配
(1)地址 0~1FH的前32个单元称为寄存器区
-
用途:① 作通用寄存器R0~R7 ② R0与R1可作间址寄存器使用
-
注意:
-
32个单元的寄存器区分为四组(0~3组),每组有8个8位寄存器 R0~R7,使用时只能选其中一组寄存器
-
寄存器的选组由程序状态字PSW的RS1和RS0位定
-
初始化时或复位时,自动选中0组。一旦选中一组,其它三组只能作为数据存储器使用, 而不能作为寄存器使用。设置多组寄存器可以方便保护现场
-
RS1 | RS0 | 选寄存器组 |
---|---|---|
0 | 0 | 0组 |
0 | 1 | 1组 |
1 | 0 | 2组 |
1 | 1 | 3组 |
(2)20H~2FH为位地址区
共16个单元,每单元有八个位,每位有一个位地址, 共128位,位地址范围为00H~7FH,该区既可位寻址,
又可字节寻址,是位地址还是字节地址要看目的地址的类型,位标志位则是位寻址,寄存器则是字节寻址
(3)除选中的寄存组以外的存储器均可以作为通用RAM区
(4)除选中的寄存组以外的存储器均可以作为堆栈区
-
8XX51单片机的堆栈设在内部RAM区,深度不大于128字节,初始化时SP指向07H
-
对51基本型单片机只有00H~7FH单元128字节的RAM区
-
对52增强型的单片机有00H~FFH的256字节RAM区
1.3 特殊功能寄存器
1.特殊功能寄存器概念
共有21个字节的特殊功能寄存器,用英文
缩写SFR (Special Fuction Register)
2.用途
-
累加器A 、状态标志寄存器PSW
-
单片机内部的专用寄存器(如TMOD、IE等)
-
并行口、串行口映射寄存器(如P0、P1、SCON等)
3.地址空间:
-
21个特殊功能寄存器不连续的分布在80H~FFH 地址空间
-
地址为X0H和X8H是可位寻址的寄存器
4.特殊功能寄存器作用
A—累加器,自带有全零标志Z,A=0则Z=1;A≠0则 Z=0。该标志常用于程序分支转移的判断条件
B—寄存器,常用于乘除法运算
PSW—程序状态字。主要起着标志寄存器的作用
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
CY | AC | F0 | RS1 | RS0 | OV | - | P |
- CY:进位/借位标志(程序中写为C) CY=1,有进/借位 ;CY=0,无进/借位
- AC:辅助进位/借位标志,反映高半字节与低半字节之间的进位/借位
- F0:用户标志位。可由用户设定其含义
- RS1,RS0:工作寄存器组选择位
- OV:溢出标志,反映补码运算的运算结果有无溢出,有溢出 OV=1,无溢出OV=0
- P:奇偶标志运算结果有奇个“ 1”,P=1;运算结果有偶个“ 1” ,P=0
SP—堆栈指针,51单片机的堆栈设在片内RAM,
对堆栈的操作包括压入(PUSH)和弹出(POP)两种方式
DPTR——数据指针寄存器
存放16位地址值,用间接寻址或变址寻址的方式对片外数据RAM或程序存储器进行64KB范围内的数据操作
DPTR可分成DPL(低8位)和DPH(高8位) 两个8位寄存器分别使用
P0 P1 P2 P3——I/O端口寄存器,四个并行I/O端口映射入SFR中的寄存器
IP——中断优先级控制寄存器
IE——中断允许控制寄存器
TMOD——定时器/计数器方式控制寄存器
TCON——定时器/计数器控制寄存器
TH0,TL0 定时器/计数器0
TH1,TH1 定时器/计数器1
SCON——串行端口控制寄存器
SBUF——串行数据缓冲器
PCON——电源控制寄存器
1.4 时钟电路与复位电路
1.4.1 时钟电路
1.时钟作用:用来提供单片机内各种微操作时间基准
2.8XX51单片机的时钟信号两种电路形式: 内部振荡方式和外部振荡方式
3.内部振荡方式
-
在引脚 X T A L 1 XTAL_1 XTAL1和$ XTAL_2$外接晶体振荡器(简称晶振)或陶瓷谐振器
-
部振荡方式所得的时钟信号比较稳定,实用电路中使用较多
4.外部振荡方式
把已有的时钟信号引入单片机
适宜用于使单片机的时钟与外部信号保持一致
1.4.2 基本时序单位
1.单片机的时序单位
-
振荡周期:晶振的振荡周期,又称时钟周期,为最小的时序单位
-
机器周期(MC):1个机器周期由12个振荡周期组成。是计算机执行一种基本操作的时间单位
-
指令周期:执行一条指令所需的时间。一个指令周期由1~4个机器周期组成,依据指令不同而不同
-
振荡周期和机器周期是单片机计算其他时间值(例如,波特率、定时器的定时时间等)的 基本时序单位
例:单片机外接晶振频率12MHz时的各种时序单位:
振荡周期=1/fosc=1/12MHz=0.0833us
机器周期=12/fosc=12/12MHz=1us
指令周期=(1~4)机器周期=1~4us
1.4.3 复位电路
1.基本含义
使单片机的片内电路初始化,使单片机从一种确定的状态开始运行
2.复位实现
当51系列单片机的复位引脚 RST出现 5ms以上 的高电平时,单片机就完成了复位操作。如果RST 持续为高电平,单片机就处于循环复位状态
3.复位操作2种基本形式
上电复位:一接通电源后,自动实现复位。
开关复位:在电源接通的条件下,单片机运行期间或发生死机状态时控制其退出程序,通过操作按钮开关使其复位
4.复位后状态
单片机的复位操作使SFR寄存器进入初始化, 但不会改变片内RAM区中的内容
2 - 51单片机的指令系统
1.51单片机汇编语言指令格式
操作符 目的操作数,源操作数 ;注释
2.1 寻址方式
**1.存放数据的存储器空间:**内部RAM、特殊功能寄存器SFR、外部RAM和程序存储器ROM
2.1.1 立即寻址
**1.基本含义:**指令中直接给出操作数的寻址方式称为立即寻址
2.立即数
立即数前面加 “#“号表示。如8位数(#30H )或 16 位数(#2000H)
3.示例
MOV A,#30H
; 数30H送 A寄存器(A←30H) ,执行后 A=30H
MOV DPTR ,#2000H
; DPTR ← 2000H,执行后 DPTR = 2000
2.1.2 直接寻址
1.基本含义: 操作数的地址直接出现在指令中
2.寻址对象:
①内部数据存储器RAM:使用它的地址
②特殊功能寄存器SFR:既可使用它的地址,也可以直接使用寄存器名
3.示例
MOV A,40H
; A=56H,内部RAM (40H)→A
MOV P0 ,41H
;内部RAM (41H)→P0(80H),(80H)=(41H)=78H
PUSH ACC
;A的内容压入堆栈,A为直接寻址
2.1.3 寄存器寻址
1.基本含义: 操作数存放在寄存器中
2.寻址对象: A ,B ,DPTR ,R0~R7
3.示例
MOV A ,R0
;R0→A ,A、R0均为寄存器寻址。
MUL AB
;A*B→ BA ,A、B为寄存器寻址
MOV B,R0
; R0→B,R0为寄存器寻址,B为直接寻址
ADD A,ACC
;A+A→A,A和 ACC同为累加器,A为寄存器寻址,ACC为直接寻址
2.1.4 寄存器间址(寄存器间接寻址)
1.基本含义: 操作数存放在以寄存器内容为地址的单元中。 在寄存器前加前缀标志“@”
2.示例
MOV R0,#20H
; R0存放地址号码
MOV @R0,A
;A→(20H) 地址的内部RAM
3.注意
-
只有R0 ,R1和DPTR可以作为间址寄存器(前面 可以加“@”),使用前必须予以赋值,明确具体地址
-
当用@R0 或@R1寻址时,究竟是对内部RAM还是对外部RAM寻址,取决于用MOV还是用MOVX作操作符
-
寄存器间接寻址的存储器空间包括内部数据存储器和外部数据存储器
-
由于内部数据存储器共有128字节,因此用一字的R0或R1可间接寻址整个空间。而外部数据存储器最大可达64KB,仅R0或R1无法寻址整个空间。因此,需由 P2端口提供外部 RAM 高8位地址,由R0或R1提供低8位地址,由此共同寻址64KB范围。也可用16 位的DPTR作寄存器间接寻址64KB存储空间
2.1.5 变址寻址
**1.基本含义:**以DPTR或PC的内容加上A的内容之和为地址寻找操作数的寻址方式
2.程序:
MOVC A,@A+ DPTR
; (A+ DPTR) → A
MOVC A,@A+ PC
; (A+ PC) → A
2.1.6 相对寻址
1.基本含义: 以PC寄存器加上偏移量形成新的PC值作为转移地址的寻址方式,仅用于相对转移指令
2.程序:
SJMP 08H
;08H+ PC → PC
2.1.7 位寻址
1.基本含义: 对位地址中的内容作位操作的寻址方式称为位寻址。
2.寻址对象:
-
片内RAM中20H~2FH中的128个位
-
SFR中的可位寻址的位
3.示例
MOV C,20H
;20H位的内容送CY标志位,C称为位累加器
2.2 数据传送与交换指令
计算机中的传送指令实际是将源操作数的内容拷贝到目的操作数。因此,源操 作数的内容不变,而目的操作数原来的内 容会被新拷贝的内容代替。数据传送与交换指令类指令包括数据传送、数据交换、堆栈操作等指令
2.2.1 传送类指令
1.内部RAM 、SFR之间的传送MOV指令
MOV A, { R n d i r @ R i # d a t a \left\{\begin{array}{l} Rn \\ dir \\ @ R i \\ \# data \end{array}\right. ⎩ ⎨ ⎧Rndir@Ri#dataMOV dir, { A R n dir @ R i # d a t a \left\{\begin{array}{c} A \\ Rn \\ \operatorname{dir} \\ @ R i \\ \# data \end{array}\right. ⎩ ⎨ ⎧ARndir@Ri#dataMOV Rn , { A d i r # d a t a \left\{\begin{array}{l} A \\ dir \\ \#data \end{array}\right. ⎩ ⎨ ⎧Adir#dataMOV @Ri, { A d i r # d a t a \left\{\begin{array}{l} A \\ dir \\ \#data \end{array}\right. ⎩ ⎨ ⎧Adir#dataMOV DPTR,#data16
2.外部存储器和A累加器之间的传送
注意:
-
以Ri 间址时,外部数据存储器的低8位地址在Ri中,高8位地址由P2口指示
-
程序存储器不分内部和外部都使用MOVC指令
-
访问程序存储器指令MOVC(又称查表指令)只能从程序存储器读取数据到A累加器,不能写,只能使用变址间接寻址方式,主要用于查表程序,直接求取常数表中的函数值
-
DPTR为基址寄存器,查表范围为 64KB 程序存储器任意空间
-
PC为基址寄存器,常数表只能在查表指令后 256B 范围内
3.堆栈操作指令
(1)基本概念
51单片机的堆栈设在内部RAM区,深度不大于128字节。寄存器SP为堆栈指针,有入栈和出栈操作
(2)堆栈操作特点
-
初始化时SP指向07H。若不重置,数据从08H单元开始压入,执行一次指令,压入1个字节
-
入栈和出栈实际是数据的传送,只不过每执行一次,SP自动加 1(入栈)和自动减 1(出栈)
-
遵循后进先出 (先进后出)的原则
(3)堆栈指令
入栈指令:PUSH dir
;SP←SP+1 ,(SP) ←(dir )
出栈指令:POP dir
;(dir )←(SP) ,SP←SP-1
2.2.2 交换指令
1. 字节交换指令
(1)指令
X C H A , { R n ; R n ⇆ A d i r ; dir ⇆ A @ R i ;(Ri) ⇆ A \mathrm{XCH} \quad \mathrm{A},\left\{\begin{array}{ll} \mathrm{Rn} & ; \mathrm{Rn} \leftrightarrows \mathrm{A} \\ \mathrm{dir} & \text {; dir } \leftrightarrows \mathrm{A} \\ @ \mathrm{Ri} & \text {;(Ri) } \leftrightarrows \mathrm{A} \end{array}\right. XCHA,⎩ ⎨ ⎧Rndir@Ri;Rn⇆A; dir ⇆A;(Ri) ⇆A
**(2)说明:**XCH指令中一个操作数必须是A
2. 低半字节交换指令
X C H D A , @ R i ; A 0 ∼ 3 ⇆ ( R i ) 0 ∼ 3 \mathrm{XCHD} \quad \mathrm{A}, @Ri \quad ;A_{0 \sim 3} \leftrightarrows(R i)_{0 \sim 3} XCHDA,@Ri;A0∼3⇆(Ri)0∼3
3. A 的高、低半字节交换指令
S W A P A ; A 4 ∼ 7 ⇆ A 0 ∼ 3 (常用) \mathrm{SWAP} \quad \mathrm{A} \quad ;\mathrm{A}_{4 \sim 7} \leftrightarrows \mathrm{A}_{0 \sim 3} \text { (常用) } SWAPA;A4∼7⇆A0∼3 (常用)
2.3 算术运算和逻辑运算指令
1.算术运算:
加、减、乘、除运算,包括有进位/借位和没有进位/借位的加、减指令
2.逻辑运算:
按位进行的与(逻辑乘)、或(逻辑加)、非(取反)、异或等运算
2.3.1 算术运算和逻辑运算指令对 PSW 的影响
1.测试标志位: P(奇偶)、OV(溢出)、CY(进位)、AC(辅助进位)
2.影响
-
P(奇偶)标志仅对累加器 A 操作的指令有影响。即A中奇数个“1”,P=1;偶数个“1”,P=0
-
传送指令、加1、减1指令、逻辑运算指令不影响CY、OV、AC标志位
-
加、减运算指令影响P、OV、CY、AC4个测试标志位,乘、除指令使CY=0,当乘积大于255,或除数为0时,OV=1
2.3.2 以A为目的操作数的算术、逻辑运算指令(共 24 条)
1.运算指令
加: ADD 进位加: A D D C 借位减: S U B B 与: A N L 或: O R L 异或: X R L } A , { @Ri d i r R n # data \left.\begin{array}{ll} \text { 加: } & \text { ADD } \\ \text { 进位加: } & \mathrm{ADDC} \\ \text { 借位减: } & \mathrm{SUBB}\\ \text { 与: } & \mathrm{ANL} \\ \text { 或: } & \mathrm{ORL} \\ \text { 异或: } & \mathrm{XRL} \end{array}\right\} \quad \mathrm{A},\left\{\begin{array}{l} \text { @Ri } \\ \mathrm{dir} \\ \mathrm{Rn} \\ \# \text { data } \end{array}\right. 加: 进位加: 借位减: 与: 或: 异或: ADD ADDCSUBBANLORLXRL⎭ ⎬ ⎫A,⎩ ⎨ ⎧ @Ri dirRn# data
2.说明
-
ADDC进位加为两数相加后还需加进位位(CY),
SUBB借位减为两数相减后还需减去进位位(CY),减指 令没有不带借位的指令,所以在多字节减法程序中,最低 位字节作减法时,注意要先清 CY -
由于指令系统没有ADD A,A指令,源操作数A作直接寻址时写为ACC
2.3.3 以dir为目的操作数逻辑运算指令(6条)
1.运算指令
与 ANL 或 ORL 异或 XRL } dir , { A # data \left.\begin{array}{ll} \text { 与 } & \text { ANL } \\ \text { 或 } & \text { ORL } \\ \text { 异或 } & \text { XRL } \end{array}\right\} \operatorname{dir}, \quad\left\{\begin{array}{l} \text { A } \\ \# \text { data } \end{array}\right. 与 或 异或 ANL ORL XRL ⎭ ⎬ ⎫dir,{ A # data
2.3.4 加1、减1指令(9条)
1.加 1 指令( 不影响CY、OV、AC标志位 )
INC { A ; A + 1 → A @ R i ; ( R i ) + 1 → ( R i ) d i r ; ( d i r ) + 1 → ( d i r ) R n ;Rn + 1 → R n D P T R ;DPTR + 1 → D P T R \text { INC }\left\{\begin{array}{ll} \mathrm{A} & ; \mathrm{A}+1 \rightarrow \mathrm{A} \\ @ \mathrm{Ri} & ;(\mathrm{Ri})+1 \rightarrow(\mathrm{Ri}) \\ \mathrm{dir} & ;(\mathrm{dir})+1 \rightarrow(\mathrm{dir}) \\ \mathrm{Rn} & \text {;Rn }+1 \rightarrow \mathrm{Rn} \\ \mathrm{DPTR} & \text {;DPTR }+1 \rightarrow \mathrm{DPTR} \end{array}\right. INC ⎩ ⎨ ⎧A@RidirRnDPTR;A+1→A;(Ri)+1→(Ri);(dir)+1→(dir);Rn +1→Rn;DPTR +1→DPTR
2.减 1 指令( 不影响CY、OV 、AC标志位 )
D E C { A ; A − 1 → A @ R i ; ( R i ) − 1 → ( R i ) dir ; ( dir ) − 1 → dir R n ; R n − 1 → R n \mathrm{DEC}\left\{\begin{array}{ll} \mathrm{A} & ; \mathrm{A}-1 \rightarrow \mathrm{A} \\ @ \mathrm{Ri} & ;(\mathrm{Ri})-1 \rightarrow(\mathrm{Ri}) \\ \text { dir } & ;(\text { dir })-1 \rightarrow \text { dir } \\ \mathrm{Rn} & ; \mathrm{Rn}-1 \rightarrow \mathrm{Rn} \end{array}\right. DEC⎩ ⎨ ⎧A@Ri dir Rn;A−1→A;(Ri)−1→(Ri);( dir )−1→ dir ;Rn−1→Rn
2.3.5 十进制调整指令
1.调整原因
计算机完成二进制加法其和也为二进制,如果是十进制相加(即BCD码相加)想得到十进制的结果,就必须进行十进制调整(即BCD 码调整)
2.调整指令: DA A
;将A中二进制相加和调整成BCD码
3.调整方法:
-
和的低4位大于9或有辅助进位AC=1,则低4位加6
-
和的高4位大于9或有进位CY=1,则高4位加6
4.注意
指令根据相加和及标志自行进行判断,因此该指令应紧跟在加指令之后,至少在加指令和该指令之间不能有影响标志的指令
DA A
指令只对一个字节和调整,如为多字节相加必须进行多次调整。此指令不能对减法结果进行调整
5.示例
(1)完成56+17的编程
MOV A,#56 ;A=38H
MOV B,#17 ;B=11H
ADD A,B ;A=49H为相加结果
SJMP $
A=49H=73 ,结果正确,而49H不是人们习惯的 十进制结果,必须转换如果使用BCD码编程,使用DA A指令调整
MOV A,#56H ; A=56H
MOV B,#17H ; B=17H
ADD A,B ; A=6dH
DA A ; A=73H
SJMP $
2.3.6 专对A的指令
-
A取反: C P L A ; A ‾ → A \mathrm{CPL} \space \mathrm{A} ; \overline{\mathrm{A}} \rightarrow \mathrm{A} CPL A;A→A
-
A清零: CLR A ; 0 → A 0 \rightarrow \mathrm{A} 0→A
-
A 左环移: RL A ;
-
A 右环移: RR A ;
-
A 左大环移: RLC A ;
-
A 右大环移: RRC A ;
2.3.7 乘、除法指令
1.乘法指令
MUL AB
;A×B→ BA
对标志的影响:CY=0; 当乘积大于255 ,OV置1
2 .除法指令
DIV AB
;A÷B→商在A中,余数在B中
对标志的影响:使CY=0 , 若除数B=00H,则指令执行后,溢出标志OV=1,且A ,B内容不变
2.4 控制转移指令
1.子程序调用:
有长调用(64KB地址范围)和 短调用( 2KB地址范围)
2.控制转移指令
-
无条件转移:无需判断,执行该指令就转移到目的地址
-
条件转移:需判断标志位是否满足条件,满足条件转移到目的地址,否则顺序执行
-
绝对转移:转移的目的地址用绝对地址指示,通常为无条件转移
-
相对转移:转移的目的地址用相对于当前PC的偏差(偏移量)指示,通常为条件转移
-
绝对转移的目的地址用绝对地址指示、8XX51单片机程序绝对转移的转移范围为64K。相对转移是偏移量指示,偏移量是个8位补 码有符号数,所以相对转移的范围不能超过+127~-128
2.4.1 调用程序和返回类指令
1.长调用
(1)指令:LCALL addr16
;addr16→ PC0~PC15
(2)说明:
-
指令功能:
①保护断点,即当前PC(本指令的下一条指令的首地址)压入堆栈
②子程序的入口地址 addr16 送PC,转子程序执行。
-
本指令为64KB地址范围内的调子程序指令,子程
序可在64KB地址空间的任一处。 -
本指令的机器码为3字节 12 addr16。addr16 是转移的目的地址。
2.短调用
(1)指令:ACALL addr11
;addr11→ PC0~PC10
(2)说明:
-
指令的功能
①保护断点,即当前PC压入堆栈。
② addr11→ PC0~10,而PC11~15保持原值不变。
-
本指令为2KB地址范围的调子程序指令,子程序
入口距当前PC不得超过2KB地址范围。
3.子程序返回指令
-
RET
;从调用子程序返回。 功能:从栈顶弹出断点到PC。 -
RETI
; 从中断服务程序返回。
功能:从栈顶弹出断点到PC,并恢复中断优 先级状态触发器
2.4.2 转移指令
1.无条件转移指令
(1)短转移
-
指令:
AJMP addr11
;addr11→ PC0~PC10 -
说明:
本指令为2KB地址范围内的转移指令。对转移目的地址的要求与ACALL指令对子程序入口地址的要求相同
(2)长转移
-
指令:
LJMP addr16
;addr16→ PC0~PC15 -
说明: 本指令为64KB程序存储空间的全范围转移指令。 转移地址可为16位地址中的任意值
(3)间接转移(常用于多路转移)
-
指令:
JMP @A+DPTR
;A+DPTR→ PC -
**说明:**因为AJMP指令是2字节指令,所以A 必须为偶数
(4)无条件相对转移
-
指令:
SJMP rel
;PC+rel→ PC -
说明: 该指令功能为PC+rel→ PC,其中rel 为转移的偏移量,转移可以向前转(目的地址小于源地址),也可以向后转(目的地址大于源地址),因此偏移量rel 是 1字节有符号数,用补码表示,转移范围为离PC -128~+127字节
2. 条件转移指令
(1)累加器A为零(非零)转移
JZ rel
; A=0 则转移( PC+rel→ PC)
; A≠0 程序顺序执行,机器码为60rel
JNZ rel
; A≠0 则转移( PC+rel→ PC)
; A=0 程序顺序执行,机器码为70re
(2)减 1 不等于零转移
DJNZ Rn,rel
;Rn-1→Rn,Rn≠0,则转移(PC+rel→PC)
;Rn=0,程序顺序执行
DJNZ dir,rel
;(dir) - 1→(dir),(dir)≠0,则转移(PC+rel→PC)
;(dir)=0,程序顺序执行
(3)比较转移指令
CJNE A,dir,rel ;A≠dir,转移(PC+rel→PC)
;A=dir,程序顺序执行
CJNE A,#data,rel ;A≠#data,转移(PC+rel→PC)
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
说明
① CJNE指令都是3字节指令,作减操作,不回 送结果,影响CY标志
② 若第一操作数大于或等于第二操作数,则标 志CY=0。若第一操作数小于第二操作数,则
CY=1
这几条指令除实现两操作数相等与否的判断外, 利用对CY的判断,还可完成两数大小的比较
2.4.3 空操作指令
1.指令:NOP
;机器码 00
2.操作: 该指令经取指,译码后不进行任何操作(空操作) 而转到下一条指令,常用于生产一个机器周期的延时, 或上机修改程序时作填充指令,以方便增减指令
2.5 位操作指令
1.位地址的表达方式
-
用直接位地址表示,如D4H。
-
用 “ · ”操作符号表示,如PSW.4,或D0H.4
-
用位名称表示,如RS1。
-
用BIT自定义名表示。如ABC BIT D4H,其中 ABC定义为D4H位的位名
2.特点: 位操作指令的对象只能是C和直接位地址,位的逻辑运算指令的目的操作数只能是C
3.指令
3 - 51 单片机汇编语言程序设计
3.1 概述
1.基本编译语言
无论哪种嵌入式系统,都有两种编程语言——汇编语言和高级语言(主要是 C语言)
2.运行
无论是高级语言还是汇编语言,源程序都要转换成目标程序(机器语言)计算机才能执行
3.2 伪 指 令
1. 起始指令
(1)指令:ORG nn
(2)功能: 定义程序或数据块的起始地址。指示此语句后面的程序或数据块以nn为起始地址,连续存放在程序存储器中
2.汇编结束
(1)指令:END
(2)功能: 指示源程序段结束。END 指令放在程序的最后。
3.3 顺序程序设计
1.顺序程序(简单程序):程序走向只有一条路径。
2.例题
【例3-3】设变量放在片内RAM的20H单元,取值范围为00H,01H,02H,03H,04H,05H,要求编查表程序,查出变量的平方值,并放入片内RAM的21H单元
分析 在程序存储器的一指定地址单元中安排一张平方表,以DPTR指向表首址,A存放变量值,利用查表指令MOVC A,@A+DPTR即可求得。表中数据用BCD码存放,合乎人们的习惯。程序如下:
ORG 0000H
MOV DPTR,#TAB2;DPTR指向平方表首址
MOV A,20H
MOVC A,@A+DPTR;查表
MOV 21H,A
SJMP $
TAB2:DB 00H,01H,04H,09H,16H,25H;平方表
END
查表技术是汇编语言程序设计的一个重要技术,通过查表避免了复杂的计算和编程
3.4 分支程序的设计
1.基本含义
由条件转移指令构成程序判断框部分,形成分支结构,通常转移条件取决标志位
3.4.1 多分支散转程序的设计
1.基本含义
根据不同的输入条件或不同的运算结果,转向不同的处理程序,称之为散转程序。这类程序通常利用JMP @A+DPTR间接转移指令实现转移
2.设计方法
-
查转移地址表:
将转移地址列成表格,将表格的内容作转移的目标地址 -
查转移指令表:
将转移到不同程序的转移指令列成表格,判断条件后查表,转到表中指令执行
3.5 循环程序设计
1.循环次数的控制方式
-
第一种方法:先判断再处理, 即先判断满不满足循环条件,如不满足,就不循环,多以循环条件控制
-
第二种方法:先处理再判断,即循环执行一遍后,下一轮还需不需要进行,多以计循环次数控制。循环可以有单重循环和多重循环,在多重循环中,内、外循环不能交叉,也不允许外循环跳入内循环
2.示例程序
例 3-9 设计一个延时10ms的延时子程序,已知单片机使用的晶振为6MHz
分析
延时时间与两个因素有关:晶振频率和循环次数。由于晶振采用6MHz,一个机器周期是2μs,用单循环可以实现1ms延时,外循环10次即可达10ms延时。
内循环如何实现1ms延时呢,程序中可先以未知数MT代替,从附录A查每条指令机器周期计算程序的执行时间
答案
内循环DL1到指令 DJNZ R1,DL1
的计算:
(
1
+
1
+
2
)
×
2
μ
S
×
M
T
=
1000
μ
S
(1+1+2) \times 2 \mu S \times M T=1000 \mu \mathrm{S}
(1+1+2)×2μS×MT=1000μS
M
T
=
125
=
7
D
H
\mathrm{MT}=125=7 \mathrm{DH}
MT=125=7DH
将7DH代入上面程序的MT, 计算总的延时时间:
{
1
+
[
1
+
(
1
+
1
+
2
)
×
125
+
2
]
×
10
}
×
2
μ
s
=
10062
μ
s
=
10.062
m
s
\{1+[1+(1+1+2) \times 125+2] \times10\} \times 2 \mu \mathrm{s} =10062 \mu \mathrm{s}=10.062 \mathrm{ms}
{1+[1+(1+1+2)×125+2]×10}×2μs=10062μs=10.062ms
3.6 位操作程序设计
1.基本含义
MCS-51单片机有着优异的位逻辑功能,可以方便的实现各种复杂的逻辑运算.这种用软件替代硬件的方法,可以大大简化甚至完全不用硬件,但比硬件要多花运算时间
2.示例
例3-14 编写一程序,以实现图3-7中的逻辑运算电路
其中P1.1和P2.2分别是端口线上的信息,TF0和IE1分别是定时器定时溢出标志和外部中请求标志, 25H和26H分别是两个位地址, 运算结果由端口线P1.3输出
START:MOV C,P2.2
ORL C,TF0
ANL C,P1.1
MOV F0,C
MOV C,IE1
ORL C,/25H
ANL C,F0
ANL C,/26H
MOV P1.3,C
SJMP $
3.7 子程序
1.基本含义
-
当一段程序需多次应用,或为多人应用时,这段程序编为子程序
-
子程序是构成单片机应用程序必不可少的部分,通过ACALL和LCALL两条子程序调用指令,可以十分方便地用来调用任何地址处的子程序。
-
子程序节省占用的存储单元,使程序简短、清晰,善于灵活的使用子程序,是程序设计的重要技巧之一。
-
子程序必须以RET指令结尾.
2.注意
-
保护现场:如果在调用前主程序已经使用了某些存储单元或寄存器,在调用时,这些寄存器和存储单元又有其他用途,就应先把这些单元或寄存器中的内容压入堆栈保护,调用完后再从堆栈中弹出以便加以恢复。如果有较多的寄存器要保护,应使主、子程序使用不同的寄存器组
-
设置入口参数和出口参数
-
用之前主程序要按子程序的要求设置好地址单元或存储器(称为入口参数),以便子程序从指定的地址单元或存储器获得输入数据;
置好地址单元或存储器(称为入口参数),以便子程序从指定的地址单元或存储器获得输入数据; -
子程序经运算或处理后的结果存放到指定的地址单元或寄存器(称为出口参数),主程序调用后从指定的地址单元或寄存器读取运算或处理后的结果,只有这样,才能完成子程序和主程序间的数据的正确传递。
-
-
子程序中可包括对另外子程序的调用,称为子程序嵌套