本章小结 C51单片机指令系统概述 C51单片机寻址方式 C51单片机指令系统

Slides:



Advertisements
Similar presentations
现代电子技术实验 ——综合实验之单片机部分
Advertisements

第7章 AT89S51单片机的 串行口 1.
第三章 计算机系统 的组成与工作原理 本章学习目标 理解模型机的结构及工作过程 掌握单片机的结构 掌握单片机I/O口的使用
第5章 中断系统 5.1 中断的概念 5.2 MCS-51单片机的中断流程 5.3 MCS-51的中断响应条件和中断处理
本章内容: 中断的概念 MCS-51单片机中断系统 外部事件中断及应用
第四章 指令系统及汇编语言程序设计.
8051 指令.
第四章 指令系统及汇编语言程序设计.
本章分为四节,主要介绍: 4.1 程序编制的方法和技巧 4.2 源程序的编辑和汇编 4.3 基本程序结构 4.4 常用程序举例.
项目2 2个LED发光二极管控制 知识与能力目标 熟悉单片机的I/O口功能与特性。
得技通电子 问题 1 右何者非為假指令 (1) XRL (2) EQU (3) MACRO (4) ORG.
单片机原理与应用.
第9章 串行扩展技术 (课时:6学时).
第9章 数模转换器与模数转换器 本章学习目标 了解数模转换器的工作原理及性能指标 掌握模数转换器的应用 掌握数模转换器的应用.
第2章 MCS-51单片机指令系统与汇编语言程序设计
報告者:朱耿育 紀翔舜 組員:詹以群 張永傑 指導老師:梁新潁
复 习 一. 计算机中的数和编码 1. 2,10,16进制数及其之间的转换(整数) 按权展开,除x取余 2
第二部分 微机原理 第4章 汇编语言 程序设计 主讲教师:喻红.
单片机应用技术 项目一 循环彩灯装置 第6讲 指令功能及汇编语言程序设计(一) 《单片机应用技术》精品课程组 湖北职业技术学院机电工程系.
本章内容: 中断的概念 MCS-51单片机中断系统 外部事件中断及应用
6.3 定时器/计数器的应用 初始化 初始化的内容如下:
第8章 模拟接口 8.1 模拟接口概述 8.2 DAC及其接口 8.3 ADC及其接口.
第二部分 微机原理 第3章 MCS-51的 指令系统 主讲教师:喻红.
一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置. 一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置.
第14章 单片机应用系统抗干扰 与可靠性设计 1.
第6章 MCS - 51单片机内部定时器/ 计数器 及串行接口 6.1 定时器/计数器的结构及工作原理 6.2 方式和控制寄存器
單晶片微電腦控制實習 使用計時中斷作走馬燈 計時器的基礎實習 國立大甲高工 電機科 2018年11月21日
第十一章 复位、时钟和省电方式控制.
第3章 AT89C51指令系统 3.1基本概念内部结构和引脚功能 指令、指令系统、机器代码
逻辑运算类指令 包括与、或、非、异或、清0及移位等共24条;一般不影响PSW中的标志位;助记符有:ANL、ORL、XRL、RL、RLC、RR、RRC、CLR和CPL共9种。 一、逻辑与指令 ANL A,Rn ;A←(A)∧( Rn) ANL A,direct;A←(A)∧(direct)
单片机原理及应用 MCS-51系列单片机的基本硬件结构 MCS-51指令系统 MCS-51单片机的系统扩展与应用.
单片机原理及应用 ——基于Proteus与Keil C 哈工大出版社
4.A/D与D/A转换器 1).DAC0832与MCS-51接口
第2章 单片机的结构原理与 简单应用 (课时:10学时).
第八章 MCS-51与数码显示器和键盘的接口 一、MCS-51与数码显示器接口 数码显示器是单片机应用产品中最常用的廉价的输 出设备,它由8个发光二极管按一定规律排列而成, 当某一发光二极管导通时,则会被点亮,控制不同 组合的二极管导通,就能显示出各种字符。 1.显示器的结构.
本 章 重 点 单片机的简单I/O扩展 8255A可编程并口芯片 8279可编程键盘/显示器接口芯片 单片机键盘接口技术
单片机原理 单 片 机 单片机接口技术 单片机应用技术.
第七章 定时/计数器.
第三章 指令系统.
第3章 指令系统及程序设计举例 3.1 指令格式与寻址方式 一、指令格式 1. 指令 操作码 目标操作数,源操作数
周国运 Keil C51应用 主 页:
第10章 综合实训 课题一 水温控制系统设计 一、实训目的 二、课题要求 熟悉常用温度传感器AD590的特性及接口电路的设计方法;
第2章 单片机系统组成原理 2.1 MCS-51单片机组成原理 2.2 单片机复位电路设计 2.3 MCS-51存储器配置
6.1 输入/输出 6.2 CPU与外设数据传送方式 6. 3 MCS-51中断系统 6. 4 中断应用举例
单元五 MCS-51单片机内部资源 5.1 任务九 单片机计数并显示 5.2 任务十 单片机流水灯控制 5.3 任务十一 两台单片机数据互传
本 章 重 点 单片机的结构特点 单片机的存储器特点 I/O端口的特点 CPU时序 课时安排:3个课时.
一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置. 一、任务描述 二、任务分析 三、任务演示 四、相关知识 五、任务布置.
第四章 指令系统及汇编语言程序设计.
第4章 中断技术 一个完整的微机系统是由硬件和软件共同构成的。微机系统的硬件有CPU、存储器和I/O口,外设组成。CPU与存储器之间的信息交换比较简单,而CPU与外设之间进行信息交换之前必须确定外设是否准备好,即选择I/O传送方式。I/O传送方式有4种:无条件、查询、中断和DMA。本章学习中断传送方式的有关内容。
数码管数字时钟电路的设计 1. 系统硬件电路的设计
第3章 MCS-51指令系统 介绍MCS—51系列单片机的寻址方式 介绍MCS—51系列单片机的指令系统
第4章 80C51系列指令系统 教学目的:熟悉80C51系列单片机的寻址方式及 每一种寻址方式对应的寻址空间;掌 握每一条指令功能。
本章内容 MCS-51单片机指令系统的格式 MCS-51单片机寻址方式 指令系统的分析
5-6 串列埠模式0輸出埠擴充實習.
单片机原理与应用 主讲人:张荣刚 福建师范大学福清分校.
CPU中的专用寄存器(SFR) 一、累加器Acc 二、通用寄存器B 三、程序计数器PC 四、堆栈指针SP 五、数据指针DPTR
3.1 指令系统简介 一、几个概念 二、汇编语言指令格式 三、指令的分类 四、指令的符号说明 主讲:吴政江 下一页.
第三章 计算机系统的组成与工作原理.
汽车单片机应用技术 学习情景1: 汽车空调系统的单片机控制 主讲:向楠.
四、手工汇编 完成汇编的方法有两种:手工汇编和汇编程序汇编 1.手工汇编步骤 A
单片机原理与应用.
3. 逻辑运算指令 A、简单逻辑操作指令 CLR A. (不影响CY、AC、 OV标志) CPL A
单片机原理及应用 (C语言版) 第8章 单片机系统扩展
简单芯片扩展I/O接口 8155可编程接口芯片及其使用 键盘及显示器接口设计 A/D和D/A转换接口技术
单片机应用技术 (C语言版) 第4章 C51程序设计入门
单片机应用技术 (C语言版) 第3章 MCS-51指令系统及 汇编程序设计
第二章 MCS-51单片机程序设计 第一章 8086程序设计 第三章 微机基本系统的设计 第四章 存贮器与接口 第五章 并行接口
第4章 MCS-51汇编语言程序设计 教学基本要求: (1)、了解MCS-51汇编语言程序设计的特点;
第1章 微型计算机基础.
Presentation transcript:

本章小结 5.1 80C51单片机指令系统概述 5.2 80C51单片机寻址方式 5.3 80C51单片机指令系统

单片机应用系统也是由硬件和软件组成的,这是与一般的数字逻辑电路系统的不同之处。 机器语言是计算机唯一能识别的语言,用汇编语言和高级语言编写的程序(称为源程序)最终都必须翻译成机器语言的程序(称为目标程序),计算机才能识别。 汇编语言是能够利用单片机所有特性直接控制硬件的唯一语言,对于一些需要直接控制硬件的场合,汇编语言是必不可少的。 但汇编语言不是一种结构化的程序设计语言,对于较复杂的单片机应用系统,它的编写效率很低。

为了提高软件的开发效率,许多软件公司致力于单片机高级语言C编译器的开发研究,许多型号的单片机内部ROM已经达到64KB甚至更大,且具备在系统编程(ISP, In System Programmable)功能,进一步推动了C语言在单片机应用系统开发中的应用。 尽管C语言是一种强大而方便的开发工具,但开发人员要达到用C语言快速编出高效且易于维护的单片机系统应用程序,首先必须对C语言有较透彻的掌握,其次还应该对实际单片机硬件系统有深入的理解。

5.1 80C51单片机指令系统概述 实际上汇编语言源程序是由一条条指令(Instruction)组成的,所以首先介绍指令和指令系统。

5.1.1 指令的概念 指令是指挥计算机执行某种操作的命令。一条指令可用两种语言形式表示,即机器语言和汇编语言指令。机器语言指令用二进制代码表示,称指令码,又称机器码,计算机能直接识别并加以分析和执行。汇编语言指令用助记符表示,称汇编语言指令,它便于程序员编写和阅读程序,但不能为计算机识别和执行,必须翻译成机器语言指令。 把用汇编语言编写的源程序翻译成机器语言指令的过程称为汇编。这种翻译工具称为汇编程序或汇编器。

5.1.2 指令系统说明 一台计算机所有指令的集合,称为该计算机的指令系统,它是表征计算机性能的重要标志。每台计算机都有它自己特有的指令系统。

要让计算机做事,就得向计算机发出指令。但计算机只能懂得数字,如对80C51,要将数据5B送到P1口,必须在ROM中某一位置(如1000H)写上这样的机器码: 1000H 75905B 该指令中75表示操作码,90和5B表示操作数,该机器码的意思是将立即数5B送到P1口,P1口锁存器的内部RAM地址为90。指令的第一种格式就是机器码指令格式,也就是说是数字的形式。

但这种形式非常难记,于是有另一种格式,助记符格式如下: MOV P1, #5BH 用助记符表示指令的格式称为汇编指令格式。

80C51汇编语言典型的指令格式为: 操作码 [操作数] ;[注释] 注释不参加汇编,不影响汇编结果,应该养成编写程序时加上注释的良好习惯。 例如,一条传送指令的书写格式为: MOV A, 38H ; (38H)→A

80C51汇编语言需用40多种助记符表征30多种指令功能。由于功能助记符需定义诸如内部数据存储器、程序存储器、外部数据存储器等,同一种功能需用几个助记符表示(如 数据传送指令MOV、MOVX、MOVC等)。通过这些助记符,与指令中的源地址、目的地址组合成80C51的111条指令。

5.1.3 80C51指令系统助记符 80C51单片机指令系统操作码助记符按功能可分为五大类 1)数据传送类指令(7种助记符) 2)算术运算类指令(8种助记符) 3)逻辑运算类指令(10种助记符) 4)控制转移类指令(18种助记符) 5)位操作指令(1种助记符) 详见主教材114页

5.1.4 指令系统中的特殊符号 Rn:当前选中的寄存器区的8个工作寄存器R0~R7(n = 0~7)。 5.1.4 指令系统中的特殊符号 Rn:当前选中的寄存器区的8个工作寄存器R0~R7(n = 0~7)。 Ri:当前选中的寄存器区中可作为地址寄存器的两个寄存器R0和R1(i = 0, 1)。

5.1.4 指令系统中的特殊符号(续) Direct:内部数据存储单元的8位地址。包含0~127内部存储单元地址和128~255部分存储单元特殊功能寄存器地址。 #data:指令中的8位常数。 #data16:指令中的16位常数。 addr16:用于LCALL和LJMP指令中的16位目的地址,目的地址可指向64KB程序存储器空间。 addr11:用于ACALL和AJMP指令中的11位目的地址,目的地址必须放在与下条指令第一个字节同一个2KB程序存储器的空间之中。

5.1.4 指令系统中的特殊符号(续) rel:8位带符号的偏移字节,用于所有的条件转移和SJMP等指令中,偏移字节位于下条指令的第一个字节开始的-128~+127范围内。 @:间接寄存器寻址或基址寄存器的前缀。 /:为操作的前缀,声明对该位取反。 DPTR:数据指针。 Bit:内部RAM和特殊功能寄存器的直接寻址位。

5.1.4 指令系统中的特殊符号(续) A:累加器ACC。 B:特殊功能寄存器B,用于乘法和除法指令中。 C:进位标志位。 5.1.4 指令系统中的特殊符号(续) A:累加器ACC。 B:特殊功能寄存器B,用于乘法和除法指令中。 C:进位标志位。 (x):某地址单元中的内容。 ((x)):由(x)寻址的单元中的内容。 →:表示数据的传送方向。 :表示数据交换。

5.2 80C51单片机寻址方式 5.2.1 寄存器寻址方式 80C51单片机共有7种寻址方式: MOV A, R2 其机器码的二进制数为EA(11101010),其最低3位(010)即为工作寄存器R2的地址。 5.2.1 寄存器寻址方式 寄存器寻址是对由指令选定的工作寄存器(R0~R7)进行读/写,由指令操作码字节的最低3位指明所寻址的工作寄存器。

5.2.2 直接寻址方式 直接寻址方式是由指令直接给出操作数地址。 直接寻址方式可访问三种地址空间: 5.2.2 直接寻址方式 直接寻址方式是由指令直接给出操作数地址。 直接寻址方式可访问三种地址空间: ●特殊功能寄存器地址空间,这是唯一能寻址特殊功能寄存器的寻址方式。 ●内部数据存储器RAM的00~7F地址空间。 ●特定的位地址空间。 E562 MOV A,62H

5.2.3 寄存器间接寻址方式 寄存器间接寻址方式以寄存器中的内容为地址,该地址中的内容为操作数的寻址方式。 5.2.3 寄存器间接寻址方式 寄存器间接寻址方式以寄存器中的内容为地址,该地址中的内容为操作数的寻址方式。 寄存器间接寻址的存储器空间包括内部数据RAM和外部数据RAM。 内部数据RAM共有128B(52子系列有256B),因此用1字节的R0或R1可寻址整个空间。 MOV A, @R0

外部数据RAM最大可达64KB,仅用R0或R1无法寻址整个空间。为此,在80C51单片机指令中,当用R0或R1对外部数据RAM作间接寻址时,由P2端口提供高8位外部RAM地址,由R0或R1提供低8位地址。 MOVX A, @R1

对外部数据RAM的第二种寻址方式是用16位的DPTR作为寄存器间接寻址。如: MOVX A, @DPTR 是把DPTR所指向的片外RAM单元中的内容送到A中。

寄存器间接寻址的其他例子如下: MOV @R0,A ; A内部RAM中以R0为地址的单元 MOVX A,@R1 ; 外部RAM中地址为P2 R1的单元内容A MOVX @DPTR,A ; A外部RAM中以DPTR为地址的单元 PUSH ACC ; SP+1SP,ACC以SP为地址的内部RAM单元 POP 20H ;以SP为地址的内部RAM中的内容20H内部RAM ;单元,SP-1SP

5.2.4 立即寻址方式 立即寻址方式由指令直接给出操作数寻址。通常紧跟指令操作码之后的一个或两个字节数,就是寻址所需的操作数。这类指令大都是2B指令,如 7462 MOV A,#62H ;62H A,“#”为立即数指示符号

仅有一条是3B指令。它提供2B的立即数,如: 902CA5 MOV DPTR,#2CA5H ;2CA5H DPTR

5.2.5 变址间接寻址方式 基址寄存器加变址寄存器间接寻址方式,是80C51指令集所独有的,它是以程序计数器PC或数据指针DPTR作为基址寄存器,以累加器A作为变址寄存器,这二者内容之和为有效地址。 JMP @A+DPTR MOVC A,@A+PC MOVC A,@A+DPTR 这种寻址方式特别适用于查表。DPTR为16位字宽,可指向64KB的任何单元;@A+PC可指向以PC当前值为起始地址的256B单元

5.2.6 相对寻址方式 相对寻址方式以PC的当前值为基准,加上指令中给出的相对偏移量(rel)形成有效转移地址。相对偏移量是一个带符号的8位二进制数,常以补码的形式出现。 JC rel ;设rel=75H, Cy=1

5.2.7 位寻址方式 位寻址方式对位地址中的内容作位操作的寻址。由于单片机中只有内部RAM和特殊功能寄存器的部分单元有位地址(两者统一编址,地址空间为00H~FFH),因此位寻址只能对有位地址的这两个空间做寻址操作。 位寻址是一种直接寻址方式,由指令给出直接位地址。但与直接寻址不同之处在于,位寻址只给出位地址,而不是字节地址。 SETB 20H ;120H位 MOV 32H, C ;进位位C32H位 ORL C, 5AH ;C | 5AH位C

表5.1 80C51操作数寻址方式和相应寻址空间 寻 址 方 式 寻 址 范 围 寄存器寻址 R0~R7 ACC、B、CY(位)、DPTR(双字节)、AB(双字节) 直接寻址 内部RAM的低128B 特殊功能寄存器 内部RAM中20H~2FH的128位 专用寄存器中的128个可寻址位 寄存器间接寻址 内部数据存储器RAM(@R0、@R1、@SP) 内部数据存储单元的低4位(@R0、@R1) 外部数据存储器(@R0、@R1、DPTR) 立即寻址 程序存储器(操作码常数) 变址寻址 程序存储器(@DPTR+A、@PC+A)

5.3 80C51单片机指令系统 5.3.1 数据传送类指令 1. 内部数据传送指令 5.3.1 数据传送类指令 1. 内部数据传送指令 内部数据传送是指在工作寄存器R0~R7、内部数据存储器RAM、累加器A、16位数据指针DPTR、内部特殊功能寄存器SFR之间的数据传送。共有18条指令。详见主教材121-123页。

2. 外部数据传送指令 外部数据传送是指片外数据RAM和累加器A之间的相互数据传送。 片外数据存储器只能使用寄存器间接寻址方式,有4条指令,详见主教材123-124页。

3. 程序存储器数据传送指令(查表指令) 由于对程序存储器只能读而不能写,因此其数据传送是单向的,即从程序存储器读取数据,且只能向累加器A传送。这类指令共有2条,详见主教材124页。 4. 交换指令 数据交换的传送操作是指两个数据空间的数据交换操作。有全交换XCH、半交换XCHD和自交换SWAP,共5条指令,详见主教材125页。 数据传送类指令一览表见主教材125页表5.2

表5.2 数据传送类指令一览表 指令助记符 功 能 简 述 字 节 数 振荡器周期数 MOV A, Rn 寄存器送累加器 1 12 表5.2 数据传送类指令一览表 指令助记符 功 能 简 述 字 节 数 振荡器周期数 MOV A, Rn 寄存器送累加器 1 12 MOV Rn, A 累加器送寄存器 MOV A, @Ri 内部RAM送累加器 MOV @Ri, A 累加器送内部RAM MOV A, #data 立即数送累加器 2 MOV A, direct 直接寻址字节送累加器 MOV direct, A 累加器送直接寻址字节 MOV Rn, #data 立即数送寄存器 MOV direct, #data 立即数送直接寻址字节 3 24 MOV @Ri, #data 立即数送内部RAM

MOV direct, Rn 寄存器送直接寻址字节 2 24 MOV Rn, direct 直接寻址字节送寄存器 MOV direct, @Ri 内部RAM送直接寻址字节 MOV @Ri, direct 直接寻址字节送内部RAM MOV direct, direct 直接寻址字节送直接寻址字节 3 MOV DPTR, #data16 16位立即数送数据指针

指令助记符 功 能 简 述 字 节 数 振荡器周期数 MOVX A, @Ri 外部RAM送累加器(8位地址) 2 24 MOVX @Ri, A 累加器送外部RAM(8位地址) 1 MOVX A, @DPTR 外部RAM送累加器(16位地址) MOVX @DPTR, A 累加器送外部RAM(16位地址) MOVCA, A+DPTR 程序代码送累加器(相对数据指针) MOVC A, @A+PC 程序代码送累加器(相对程序计数器)

XCH A, Rn 累加器与寄存器交换 1 24 XCH A, @Ri 累加器与内部RAM交换 12 XCH A, direct 累加器与直接寻址字节交换 2 XCHD A, @Ri 累加器与内部RAM低4位交换 SWAP A 累加器高4位与低4位交换 POP direct 栈顶弹至直接寻址字节 PUSH direct 直接寻址字节压入栈顶

5.3.2 算术运算类指令 算术运算指令的主要功能是实现算术加、减、乘、除等运算。 1. ADD类指令 5.3.2 算术运算类指令 算术运算指令的主要功能是实现算术加、减、乘、除等运算。 1. ADD类指令 ADD类指令是不带进位的加法运算指令,共有4条 ADD A,Rn ; A+RnA, Rn寄存器内容加到A中 ADD A,direct ; A+(direct) A, 直接地址内容加到A中 ADD A,@Ri ; A+(Ri)A, 间址内容加到A中 ADD A,#data ; A+dataA, 立即数加到A中

ADDC类指令是带进位的加法运算指令,共有4条 ADDC A,Rn ; A+Rn+CYA, Rn寄存器内容和进位位状态一并加到A中 ADDC A,direct ; A+(direct)+CY A, 直接地址内容和进位位状态一并加到A中 ADDC A, @Ri ; A+(Ri)+CY A, 间址内容和进位位状态一并加到A中 ADDC A, #data ; A+data+CY A, 立即数和进位位状态一并加到A中

【例5.6】 编写计算1234H+0FE7H的程序,将结果存入内部RAM 4lH和40H单元,40H存低8位,4lH中存高8位。 程序如下: MOV A, #34H ;被加数低8位数34H送A ADD A, #0E7H ;加数低8位数E7H与之相加, A=lBH, CY=1 MOV 40H, A ;A40H, 即34H+E7H结果存入40H中, (40H)=1BH MOVA, #12H ;被加数高8位数12H送A ADDC A, #0FH ;加数高8位0FH和CY与A相加, A=22H MOV 4lH, A ;高8位与进位位之和存入4lH中, (41H)=22H ;总和为221BH, 总结果在4lH, 40H单元中

SUBB类指令是带借位减法指令,其功能是将A中的被减数减去源操作数指出的内容,再减去借位标志CY(原进位标志)状态,差值在A中。 SUBB A, Rn ; A-Rn-CYA, A减寄存器Rn内容及进位 标志存到A中 SUBB A, direct ; A- (direct)-CYA, A减寄存器直接地址内 容及进位标志存到A中 SUBB A, @Ri ; A-(Ri)-CYA, A减间址内容及进位位状 态一并存到A中 SUBB A, #data ; A-data-CYA, A减立即数及进位位状态 一并加到A中 减法运算在计算机中实际是补码相加方式。

4. 乘(MUL)和除(DIV)指令 MUL AB ; A×B A和B, 结果是16位, 高8位存入B中, 低8位在A中 DIV AB ; A/BA和B,商存入A,余数存入B

5. INC(加1)和DEC(减1)类指令 INC A ; A+1A, A加1 INC Rn ; Rn+1Rn, Rn中内容加1 INC direct ; (direct)+1(direct), 直接地址中内容加1 INC @Ri ; (Ri)+1(Ri), Ri间址中的内容加1 INC DPTR ; DPTR+1DPTR, 数据指针加1 DEC A ; A-1A, A减1 DEC Rn ; Rn-1Rn, Rn中内容减1 DEC direct ; (direct)-1(direct), 直接地址中的内容减1 DEC @Ri ; (Ri)-1(Ri), Ri间址中的内容减1

功能是把A中二进制码自动调整成二-十进制码(BCD码)。用于队BCD码的加法结果进行调整。 6. 十进制调整指令 DA A 功能是把A中二进制码自动调整成二-十进制码(BCD码)。用于队BCD码的加法结果进行调整。 例如: MOV A, #05H ; 05HA ADD A, #08H ; A+08HA DA A ; 调整 结果:A = 13(BCD码)。

表5.3 算术操作类指令一览表 (主教材128页) 指令助记符 功能简述 字节数 振荡器周期数 ADD A, Rn 累加器加寄存器 1 12 表5.3 算术操作类指令一览表 指令助记符 功能简述 字节数 振荡器周期数 ADD A, Rn 累加器加寄存器 1 12 ADD A, @Ri 累加器加内部RAM ADD A, direct 累加器加直接寻址字节 2 ADD A, #data 累加器加立即数 ADDC A, Rn 累加器加寄存器和进位位 ADDC A, @Ri 累加器加内部RAM和进位位 ADDC A, #data 累加器加立即数和进位位 ADDC A, direct 累加器加直接寻址字节和进位位 INC A 累加器加1 INC Rn 寄存器加1 INC direct 直接寻址字节加1 INC @Ri 内部RAM加1 INC DPTR 数据指针加1 24 DA A 十进制调整 (主教材128页)

表5.3 算术操作类指令一览表(续) (主教材128页) 指令助记符 功能简述 字节数 振荡器周期数 DA A 十进制调整 1 12 表5.3 算术操作类指令一览表(续) 指令助记符 功能简述 字节数 振荡器周期数 DA A 十进制调整 1 12 SUBB A, Rn 累加器减寄存器和借位 SUBB A, @Ri 累加器减内部RAM和借位 SUBB A, #data 累加器减立即数和借位 2 SUBB A, direct 累加器减直接寻址字节和借位 DEC A 累加器减1 DEC Rn 寄存器减1 DEC @Ri 间接RAM减1 DEC direct 直接寻址字节减1 MUL AB 累加器A乘寄存器B 48 DIV AB 累加器A除以寄存器B (主教材128页)

5.3.3 逻辑运算类指令 这类指令主要用于对两个操作数按位进行逻辑操作,结果送到累加器A或直接寻址单元。这类指令所能执行的操作主要有:与、或、异或以及移位、取反、清除等。执行这些指令时一般不影响程序状态字寄存器PSW,仅当目的操作数为ACC时对奇偶标志位有影响。逻辑运算类指令共有24条。

1. 逻辑与(ANL)指令 逻辑与指令的功能是将源操作数内容和目的操作数内容按位相与,结果存入目的操作数指定单元,源操作数不变,执行后影响奇偶标志位P。 ANL A, Rn ; A & RnA ANL A, direct ; A & (direct)A ANL A, @Ri ; A & (Ri)A ANL A, #data ; A & dataA ANL direct, A ; (direct) & A(direct) ANL direct, #data ; (direct) & data(direct)

2. 逻辑或(ORL)指令 逻辑或指令的功能是将源操作数内容与目的操作数内容按位逻辑或,结果存入目的操作数指定单元中,源操作数不变,执行后影响奇偶标志位P。 ORL A, Rn ; A | RnA ORL A, direct ; A | (direct)A ORL A, @Ri ; A | (Ri)A ORL A, #data ; A | dataA ORL direct, A ; (direct)| A(direct) ORL direct, #data ; (direct) | data(direct)

3. 逻辑异或(XRL)指令 异或指令的功能是将两个操作数的指定内容按位异或,结果存于目的操作数指定单元中。异或原则是相同为0,相异为1,执行后影响奇偶标志位P。 XRL A, Rn ; A ^ RnA XRL A, direct ; A ^ (direct)A XRL A, @Ri ; A ^ (Ri)A XRL A, #data ;A ^ dataA XRL direct, A ; (direct) ^ A(direct) XRL direct, #data ; (direct) ^ data(direct)

4. 循环移位指令 循环移位指令的功能是,将累加器A中内容循环移位或者和进位位一起移位,指令共4条。 RL A ; A中内容循环左移, 执行本指令一次左移一位 RR A ; A中内容循环右移, 执行本指令一次右移一位 RLC A ; A与CY内容一起循环左移一位, 执行本指令 ;一次左移一位 RRC A ; A与CY内容一起循环右移一位, 执行本指令 ;一次右移一位 循环操作具体见主教材131页

表5.4 逻辑运算类指令一览表见主教材132页

5.3.4 控制转移类指令 1. 无条件转移类指令 LJMP add16 ; addl6PC无条件跳转到addl6地址可在64KB范 围内转移, 称为长转移指令 AJMP add11 ; addl1PC无条件转向到addl1地址可在2KB范围 内转移, 称为绝对转移指令 SJMP rel ; PC+2+relPC相对转移, rel是偏移量, 它是8位 有符号数, 范围-128~+127即向后跳转128B, 向前 可跳转127B JMP @A+DPTR ; A+DPTRPC, 属散转指令, 无条件转向 A与DPTR内容相加后形成的新地址

这类指令先测试某一条件是否满足,满足规定的条件时,程序转移到指定地址,否则将继续执行下一条指令。条件是由条件转移指令本身提供(或规定)的。 2. 条件转移类指令 JZ rel JNZ rel CJNE A, direct, rel CJNE A, #data, rel CJNE Rn, #data, rel CJNE @Ri, #data, rel DJNZ Rn, rel DJNZ direct, rel 这类指令先测试某一条件是否满足,满足规定的条件时,程序转移到指定地址,否则将继续执行下一条指令。条件是由条件转移指令本身提供(或规定)的。

3. 调用、返回、空操作指令 LCALL addr16 ACALL addr11 RET RETI NOP

表5.5 控制程序转移类指令一览表 (主教材135页) 指令助记符 功 能 简 述 字 节 数 振荡器周期数 ACALL addr11 表5.5 控制程序转移类指令一览表 (主教材135页) 指令助记符 功 能 简 述 字 节 数 振荡器周期数 ACALL addr11 2KB内绝对调用 2 21 AJMP addr11 2KB内绝对转移 24 LCALL addr16 64KB内长调用 3 LJMP addr16 64KB内长转移 SJMP rel 相对短转移 JMP @A+DPTR 相对长转移 1 RET 子程序返回 RETI 中断返回 JZ rel 累加器为0转移 JNZ rel 累加器为非0转移 CJNE A,#data,rel 累加器与立即数不等转移 CJNE A,direct,rel 累加器与直接寻址字节不等转移 CJNE Rn,#data,rel 寄存器与立即数不等转移 CJNE @Ri,#data,rel 内部RAM与立即数不等转移 DJNZ Rn,rel 寄存器减1不为0转移 DJNZ direct,rel 直接寻址字节减1不为0转移 NOP 空操作 12

5.3.5 位操作指令 单片机都具有较强的位处理功能,可以对片内位地址区及某些特殊功能寄存器的位进行位操作。在80C51的硬件结构中,有个位处理器(布尔处理器),它具有一套处理位变量的指令集,包括位变量传送、逻辑运算、控制程序转移等指令。

在80C51单片机的内部数据存储器中,20H~2FH为位操作区域,其中每位都有自己的位地址(参见主教材90-91页第4章部分),可以对每一位进行操作。位地址空间为00H~7FH,共16  8=128位,如主教材中136页表5.6所示。对于字节地址能被8整除的特殊功能寄存器的每一位,也具有可寻址的位地址,如主教材中137页表5.7所示。

表5.8 布尔变量操作类一览表 主教材中139页 指令助记符 功能简述 字节数 振荡器周期数 MOV C, bit 直接寻址位送CY 2 表5.8 布尔变量操作类一览表 主教材中139页 指令助记符 功能简述 字节数 振荡器周期数 MOV C, bit 直接寻址位送CY 2 12 MOV bit, C CY送直接寻址位 CLR C CY清0 1 CLR bit 直接寻址位清0 CPL C CY取反 CPL bit 直接寻址位取反 SETB C CY置位 SETB bit 直接寻址位置位 ANL C, bit CY逻辑与直接寻址位 24 ANL C, /bit CY逻辑与直接寻址位的反 ORL C, bit CY逻辑或直接寻址位 ORL C, /bit CY逻辑或直接寻址位的反 JC rel CY置位转移 JNC rel CY清0转移 JB bit, rel 直接寻址位为1转移 JNB bit, rel 直接寻址位为0转移 3 JBC bit, rel 直接寻址位为1转移并清该位

5.4 80C51汇编语言程序设计 前面几节中介绍了80C51单片机的指令系统,所有汇编指令均能翻译成机器码, 即有一条汇编指令, 就有一条机器指令码与之对应。如何使用单片机的汇编指令编写程序,是本节所要介绍的内容。下面先了解一下汇编语言的特点和语句格式。

1. 汇编语言的特点 ※ 汇编语言编写的程序占用存储空间小,运行速度快,能编写出最优化的程序。 ※ 使用汇编语言编程比使用高级语言困难。 ※ 汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能直接管理和控制硬件设备。 ※ 汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用。

汇编语句由标号、操作码、操作数和注释四个部分所组成,其中方括号中是可选择部分,视需要而定。 2. 汇编语言的语句格式 80C51汇编语言的语句格式表示如下: [<标号>:]<操作码>[<操作数>];[<注释>] 汇编语句由标号、操作码、操作数和注释四个部分所组成,其中方括号中是可选择部分,视需要而定。

编写汇编语言程序时,还会用到另一类指令,这类指令仅供汇编程序将源程序翻译成目标程序时使用,本身并不形成机器码,这类指令称为伪指令。

3. 汇编语言源程序的汇编方式 把用汇编语言书写的源程序翻译成机器语言目标程序的过程称为汇编。汇编通常划分为三种方式:手工汇编、自汇编及交叉汇编。 在一般简易型开发装置中,常常采用交叉汇编的方法。

5.4.1 伪指令 设置起始地址ORG(Origin) 定义字节DB或DEFB(Define Byte) 5.4.1 伪指令 设置起始地址ORG(Origin) 定义字节DB或DEFB(Define Byte) 定义字DW或DEFW(Define Word) 为标号赋值EQU(Equate) 结束汇编END

5.4.2 汇编语言程序设计举例 建立数学模型 给出数学模型的解题算法 画出流程图 写出源程序 编译成目标程序 运行调试目标程序

【例5.14】 循环程序设计:将地址从50H开始的16个单元清0,如图所示。 内容 5FH 00H … 54H 53H 52H 51H 50H R0

(1)流程图如图所示。

(2)源程序: 该程序将MOV @R0, #00H操作重复进行了16次, 故为典型的循环程序。 DATA_ADDR EQU #50H ;数据块首地址 COUNT EQU #10H ;循环次数 NUMBER EQU #00H ;赋值0 ORG 100H  MOV R0,DATA_ADDR ;数据块首地址DATA_ADDR赋给地址指针R0  MOV R2, COUNT ;循环次数0AH赋给计数器R2  LOOP: MOV @R0, NUMBER ;给((R0))单元赋值NUMBER INC R0 ;地址指针R0加1 DEC R2 ;计数器R2减1 CJNE R2, #00H, LOOP ;判R2是否为0,非0转LOOP继续清0 SJMP $ ;R2为0,循环结束 该程序将MOV @R0, #00H操作重复进行了16次, 故为典型的循环程序。

5.5 80C51单片机C51程序设计语言 随着80C51单片机硬件性能的提升,尤其是片内程序存储器容量的增大和时钟工作频率的提高,已基本克服了高级语言产生代码长、运行速度慢、不适合单片机使用的致命缺点。由此C51已经得到广泛的推广和应用, 采用C51程序设计语言,编程者只需了解变量和常量的存储类型与80C51单片机存储空间的对应关系,而不必深入了解单片机的硬件和接口。C51编译器会自动完成变量的存储单元的分配。

1. C语言编程与汇编语言编程相比的优势 1)编程调试灵活方便 2)生成的代码编译效率高 3)完全模块化 4)可移植性好 5)便于项目维护管理

2. C51语言编译器与标准ANSI C编译器的主要区别

C51的特点和功能主要是80C51单片机自身特点引起的。 数据类型:由于80C51系列器件包含了位操作空间和丰富的位操作指令,因此 C51比ANSI C多一种位类型

数据存储类型:80C51系列单片机有程序存储器和数据存储器。数据存储器又分片内和片外数据存储器。片内数据存储器还分直接寻址区和间接寻址区,分别对应code、data、idata、xdata以及根据80C51系列特点而设定的pdata类型。

数据运算操作和程序控制:从数据运算操作和程序控制语句以及函数的使用上来讲,它们几乎没有什么明显的区别。只是在函数的使用上,由于单片机系统的资源有限,它的编译系统不允许太多的程序嵌套。 C51与标准ANSI C库函数:部分库函数不适合单片机处理系统,因此被排除在外,如字符屏幕和图形函数。

5.5.1 C51的标识符和关键字 标识符用来标识源程序中某个对象的名字,这些对象可以是语句、数据类型、函数、变量、数组等。 标识符区分大小写,第一个字符必须是字母或下划线。 C51中有些库函数的标识符是以下划线开头的,所以一般不要以下划线开头命名标识符。 ANSI C标准关键字和C51编译器的扩展关键字一览表见主教材145-147页。

5.5.2 C51编译器能识别的数据类型 数 据 类 型 长 度 大 小 unsigned char 1B 0~255 char 长 度 大 小 unsigned char 1B 0~255 char -128~+127 unsigned int 2B 0~65535 int -32768~+32767 unsigned long 4B 0~4294967295 long -2147483648~+2147483647 float 1.175494E-38~3.402823E+38 * 1B~3B 对象的地址 bit 位 0或1 sfr sfr16 sbit

5.5.3 变量的存储种类和存储器类型 变量是一种在程序执行过程中,其数值不断变化的量。同ANSI C一样,C51规定变量必须先定义后使用。C51对变量的进行定义的格式如下: [存储种类] 数据类型 [存储器类型] 变量名表 其中,存储种类和存储器类型是可选项。

存储种类是指变量在程序执行过程中的作用范围。变量的存储种类有四种,分别为: 自动(auto) 外部(extern) 静态(static) 寄存器(register)

使用外部种类存储符extern定义的变量称为外部变量。在一个函数体内,要使用一个已在该函数体外或别的程序模块文件中定义过的外部变量时,该变量在本函数体内要用extern说明。 当片内RAM资源紧张时,不建议将外部变量放在片内RAM。

使用存储种类说明符static定义的变量称为静态变量。静态变量分为局部静态变量和全局静态变量。 局部静态变量是在两次函数调用之间仍能保持其值的局部变量。有些程序要求在多次调用之间仍然保持变量的值,使用自动变量无法作用到这一点。使用全局变量有时会带来意外的副作用,这时可采用局部静态变量。

【例5.15】局部静态变量的使用——计算并输出1~8的阶乘值。

使用存储种类说明符register定义的变量称为寄存器变量。80C51访问寄存器的速度最快,通常将使用频率最高的那些变量定义为寄存器变量。C51编译器能自动识别程序中使用频率最高的变量,并自动将其作为寄存器变量,用户无需专门声明。

2. 存储器类型 定义变量时,除了说明存储种类外,还允许说明变量的存储器类型。存储器类型和存储种类是完全不同的概念,存储器类型指明该变量所处的单片机的内存空间。C51编译器可识别以下存储器类型,如下表所示。

存储器类型 描 述 data 直接寻址的片内数据存储器低128B,访问速度最快 bdata 可位寻址的片内数据存储器(地址20H~2FH共16B)允许位和字节混合访问 idata 间接寻址片内数据存储器256B。允许访问片内全部地址 pdata 分页寻址片外数据存储器256B,使用指令MOVX @Rn访问,需要2个指令周期 xdata 寻址片外数据存储器64KB,使用指令MOVX @DPTR访问 code 寻址程序存储器区64KB,使用指令MOVC @A+DPTR访问

如果在变量定义时省略了存储器类型标识符,C51编译器会选择默认的存储器类型。默认的存储器类型由SMALL、COMPACT和LARGE存储模式指令决定。

1)data区 对data区的寻址是最快的,所以应该把使用频率高的变量放在data区,由于空间有限,必须注意使用data区,data区除了包含程序变量外,还包含了堆栈和寄存器组data区。 在SMALL存储模式下,未说明存储器类型时,变量默认被定位在data区。

2)bdata区 当在DATA区的位寻址区定义变量,这个变量就可进行位寻址,并且声明位变量。这对状态寄存器来说十分有用,因为它可以单独使用变量的每一位,而不一定要用位变量名引用位变量。 3)idata区 idata区也可以存放使用比较频繁的变量,使用寄存器作为指针进行寻址。在寄存器中设置8位地址进行间接寻址,与外部存储器寻址比较,它的指令执行周期和代码长度都比较短。

4)pdata和xdata区 在这两个区声明变量和在其他区的语法是一样的,pdata区只有256B,而xdata区可达65536B 5)code区 code区即80C51的程序代码区,所以代码区的数据是不可改变的,80C51的代码区不可重写。一般代码区中可存放数据表,跳转向量和状态表

3. 存储模式 C51编译器允许采用三种存储模式:小编译模式SMALL、紧凑编译模式COMPACT、大编译模式LARGE。

一个变量的存储器模式确定了未声明存储器类型的变量在内存中的地址空间。在SMALL模式下,该变量在80C51单片机的内部RAM中;在COMPACT和LARGE模式下,该变量在80C51单片机的外部RAM中。 建议在编写源程序时,把存储模式设定为SMALL,再在程序中把xdata、pdata和idata等类型变量进行专门声明。

5.5.4 绝对地址的访问 1. 使用指针 采用指针的方法,可实现在C51程序中对任意指定的存储器地址进行操作。 5.5.4 绝对地址的访问 1. 使用指针 采用指针的方法,可实现在C51程序中对任意指定的存储器地址进行操作。 uchar idata ivar1; uchar xdata *xdp; /*定义一个指向xdata存储器空间的指针*/ char data *dp; /*定义一个指向DATA存储器空间的指针*/ uchar idata *idp; /*定义一个指向idata存储器空间的指针*/ xdp=0x1000; /*xdata指针赋值,指向xdata存储器地址1000H处*/ *xdp=0x5A; /*将数据5AH送到xdata的1000H单元*/ dp=0x61; /*DATA指针赋值,指向DATA存储器地址61H处*/ *dp=0x23; /*将数据23H送到DATA的61H单元*/ idp=&ivar1; /*idp指向idata区变量ivar1*/ *idp=0x16; /*等价于ivar1=0x16*/

2. 使用C51运行库中预定义宏 #define CBYTE((unsigned char volatile *)0x50000L) #define DBYTE((unsigned char volatile *)0x40000L) #define PBYTE((unsigned char volatile *)0x30000L) #define XBYTE((unsigned char volatile *)0x20000L) #define CWORD((unsigned int volatile *)0x50000L) #define DWORD((unsigned int volatile *)0x40000L) #define PWORD((unsigned int volatile *)0x30000L) #define XWORD((unsigned int volatile *)0x20000L) 例如 ui_var1 = XWORD [0x0002]; /*访问外部 RAM 0004H~0005H地址的内容*/ uc_var1 = XBYTE [0x0002]; /*访问外部 RAM 0002H地址的内容*/

3. 使用C51扩展关键字 _at_ 使用_at_对指定的存储器空间的绝对地址进行定位,一般格式如下: [存储器类型] 数据类型 标识符 _at_ 常数 例如 uchar xdata xram[0x8000] _at_ 0x0000; /*在外部RAM空间0000H处定义了一个一维数组 使用_at_定义的变量只能为全局变量。

5.5.5 中断服务程序 80C51的中断系统十分重要,C51编译器允许在C语言源程序中声明中断和编写中断服务程序,从而减轻了采用汇编程序编写中断服务程序的繁琐程度。

通过使用interrupt关键字来实现。定义中断服务程序的一般格式如下: void 函数名( ) interrupt n [using m] using m指明该中断服务程序所对应的工作寄存器组,取值范围:0~3。指定工作寄存器组的缺点是所有被中断调用的过程都必须使用同一个寄存器组,否则参数传递会发生错误。通常不设定using m。

关键字interrupt后面的n是中断号,n的取值范围:0~31。编译程序从8n+3处产生中断向量,即在程序存储器8n+3地址处形成一条长跳转指令,转向中断号n的中断服务程序。 中 断 源 中 断 向 量 外部中断0 0003H 1 定时器0 000BH 2 外部中断1 0013H 3 定时器1 001BH 4 串行口 0023H

设置一个定时器中断服务程序的例子如下: #include <reg51.h> #include <stdio.h> #define RELOADTH 0x3C #define RELOADTL 0xB0 extern unsigned int time0_counter; void timer0(void) interrupt 1{ TR0=0;  /*停止定时器0*/ TH0=RELOADTH; /* 50ms后溢出*/ TL0=RELOADTL; TR0=1; /*启动T0*/ time0_counter++; /*中断次数计数器加1*/ printf(“time0_counter=%05d\n”,time0_counter); } 使用C51编写中断服务程序,程序员无需关心ACC、B、DPH、DPL、PSW等寄存器的保护,C51编译器会根据上述寄存器的使用情况在目标代码中自动增加压栈和出栈。

5.6 C51的运算符和表达式 运算符就是完成某种特定运算的符号。运算符按其表达式中与运算符的关系可分为单目运算符、双目运算符和三目运算符。

5.6.1 赋值运算符 使用“=”的赋值语句格式如下: 变量 = 表达式; 5.6.1 赋值运算符 使用“=”的赋值语句格式如下: 变量 = 表达式; 需要注意“==”与“=”两个符号的区别,有时编译报错,往往就是错在if(b = 0xff)之类的语句中,错将“==”用为“=”。“==”符号是用来进行相等关系的运算。

5.6.2 算术运算符 + 加或取正值运算符 - 减或取负值运算符 * 乘运算符 / 除运算符 5.6.2 算术运算符 + 加或取正值运算符 - 减或取负值运算符 * 乘运算符 / 除运算符 % 模(取余)运算符,如8 % 5 = 3,即8除以5的余数是3

5.6.3 关系运算符 C51中有6种关系运算符: > 大于 < 小于 >= 大于等于 <= 小于等于 5.6.3 关系运算符 C51中有6种关系运算符: > 大于 < 小于 >= 大于等于 <= 小于等于 == 测试等于 != 测试不等于

5.6.4 逻辑运算符 逻辑与:条件式1 && 条件式2。 逻辑或:条件式1 || 条件式2。 逻辑非:!条件式。

5.6.5 位运算符 C51中共有6种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 按位取反 << 左移 5.6.5 位运算符 C51中共有6种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 按位取反 << 左移 >> 右移

5.6.6 复合运算符 复合运算符就是在赋值运算符“=”的前面加上其他运算符。以下是C51语言中的复合赋值运算符: 5.6.6 复合运算符 复合运算符就是在赋值运算符“=”的前面加上其他运算符。以下是C51语言中的复合赋值运算符: += 加法赋值 >>= 右移位赋值 -= 减法赋值 &= 逻辑与赋值 *= 乘法赋值 |= 逻辑或赋值 /= 除法赋值 ^= 逻辑异或赋值 %= 取模赋值 ~= 逻辑非赋值 <<= 左移位赋值

5.6.7 指针和地址运算符 指针是C语言中十分重要的概念,也是学习C51语言中的一个难点。C51语言中提供的两个专门用于指针和地址的运算符: * 取内容 & 取地址 取内容和取地址运算的一般形式分别为: 变量 = * 指针变量 指针变量 = & 目标变量

5.7 C51的库函数 C51的强大功能及其高效率的重要体现之一在于,其提供了丰富的可直接调用的库函数。使用库函数使程序代码简单、结构清晰、易于调试和维护,下面介绍C51的库函数系统。

5.7.1 本征库函数和非本征库函数 C51提供的本征函数在编译时直接将固定的代码插入当前行,而不是用ACALL和LCALL语句实现的,这样就大大提供了函数访问的效率,而非本征函数则必须由ACALL及LCALL调用。

C51的本征库函数只有9个,数目虽少,但都非常有用,现罗列如下: _crol_,_cror_:将char型变量循环向左(右)移动指定位数后返回。 _iror_,_irol_:将int型变量循环向左(右)移动指定位数后返回。 _lrol_,_lror_:将long型变量循环向左(右)移动指定位数后返回。 _nop_:相当于插入汇编指令NOP。 _testbit_:相当于JBC bitvar测试该位变量并跳转同时清除。 _chkfloat_: 测试并返回源点数状态。 使用上述函数时,源程序开头必须包含 #inclucle <intrins.h>一行。

5.7.2 几类重要的库函数 C51提供了丰富的库函数资源,包括大量的关于I/O操作、内存分配、字符串操作、据类型转换、数学计算等函数库。它们是以执行代码的形式出现,供用户在连接定位时用。在用预处理器命令#include包含相应的头文件后,就可以在程序中使用这些函数。

1. 内部函数intrins.h 这个库中提供的是一些用汇编语言编写的函数。用汇编语言编写非常直接简单且目代码很短,而用C51编写则代码很长。这些函数主要有: _crol_/_cror_ 无符号字符型变量左/右移位函数 _irol_/_iror_ 无符号整型变量左/右移位函数 _lrol_/_lror_ 无符号长整型变量左/右移位函数 _nop_ 空操作函数 _testbit_ 位测试函数

举例: #inclucle <intrins.h> void main() { unsigned int y; y=0x00ff; y=_irol_(y,4); } 运行后,y=0x0ff0。

2. 绝对地址访问函数absacc.h 用预处理器伪指令#define为各空间的绝对地址定义宏数组名如下: #define CBYTE((unsigned char*)0x500000L)/*code空间*/ #define DBYTE((unsigned char*)0x400000L)/*data空间*/ #define PBYTE((unsigned char*)0x300000L)/*pdata空间*/ #define XBYTE((unsigned char*)0x200000L)/*xdata空间*/ 以上存取对象是char类型字节。

DBYTE[0x10] 表示data空间绝对地址16处的字节对象,XWORD[0xff] 表示xdata空间绝对地址255处的字对象。 #define CWORD((unsigned int*)0x500000L)/*code空间*/ #define DWORD((unsigned int*)0x400000L)/*data空间*/ #define PWORD((unsigned int*)0x300000L)/*pdata空间*/ #define XWORD((unsigned int*)0x200000L)/*xdata空间*/ 以上存取对象是int类型字。 DBYTE[0x10] 表示data空间绝对地址16处的字节对象,XWORD[0xff] 表示xdata空间绝对地址255处的字对象。

3. 缓冲区处理函数string.h 1)计算字符串s的长度 strlen 原型:extern int strlen(char *s); 说明:返回s的长度,不包括结束符NULL。 举例: #include <string.h> main() { char *s="Golden Global View"; printf("%s has %d chars",s,strlen(s)); getchar(); return 0; }

2)由src所指内存区域复制count个字节到dest所指 内存区域。 memcpy 原型:extern void *memcpy(void *dest, void *src, unsigned int count); 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。 举例: #include <string.h> main() { char *s="Golden Global View"; char d[20]; memcpy(d,s,strlen(s)); d[strlen(s)]=0; printf("%s",d); getchar(); return 0; }

3)由src所指内存区域复制count个字节到dest所指内存区域 原型:extern void *memmove(void *dest, const void *src, unsigned int count); 说明:与memcpy工作方式相同,但src和dest所指内存区域可以重叠,但复制后src内容会被更改。函数返回指向dest的指针。 4)比较内存区域buf1和buf2的前count个字节 原型:extern int memcmp(void *buf1, void *buf2, unsigned int count);

5)把buffer所指内存区域的前count个字节设置成字符c 原型:extern void *memset(void *buffer, int c, int count); 说明:返回指向buffer的指针。 #include <string.h> main() { char *s="Golden Global View"; memset(s,'G',6); printf("%s",s); getchar(); return 0; }

6)从buf所指内存区域的前count个字节查找字符ch 原型:extern void *memchr(void *buf, char ch, unsigned count); 说明:当第一次遇到字符ch时停止查找。如果成功,返回指向字符ch的指针;否则返回NULL。

5.8 C51的应用技巧 灵活选择变量的存储器类型 避免使用浮点变量 灵活设置变量,高效利用存储器 为变量分配内部存储区 使用库函数 使用宏替代函数 存储器模式的确定 详见主教材169页

本章小结 指令是指挥计算机执行某种操作的命令。一台计算机所有指令的集合,称为该计算机的指令系统,它是表征计算机性能的重要标志,每台计算机都有它自己特有的指令系统。 用助记符表示的指令称为汇编语言指令,汇编语言源程序是由一条条汇编语言指令组成的。汇编语言指令格式为: 标号:指令助记符 操作数 ;注解

操作数与寻址方式对照表 操 作 数 寻 址 方 式 表 示 符 号 立即数 立即寻址 #data 寄存器 寄存器寻址 R0~R7 存储单元 操 作 数 寻 址 方 式 表 示 符 号 立即数 立即寻址 #data 寄存器 寄存器寻址 R0~R7 存储单元 直接寻址 direct 寄存器间接寻址 ((Ri)) 变址间接寻址 (PC)+(A)或(DPTR)+(A) 位操作数 位寻址 bit 相对偏移量 相对寻址 rel

80C51单片机的指令按功能可分为传送、算术、逻辑、位处理和转移指令。 传送指令是完成片内数据存储器传送、片外数据存储器传送、程序存储器传送工作的指令。用于片内数据传送的操作数有:#data、A、Rn、direct、@Ri。读者只有深刻理解记忆这5种操作数的含义、寻址方式与使用方法后,才能真正掌握80C51单片机指令系统。

算术运算指令有加法、减法、乘法、除法,指令的助记符分别为ADD、SUBB、MUL、DIV。在算术运算指令中目的操作数必须是累加器A,而源操作数S=#data、Rn、direct、@Ri。因此在进行算术运算前必须将被加数、被减数、被乘数、被除数送入累加器A。

逻辑运算指令包括逻辑运算和移位指令。 在双操作数的逻辑运算指令中累加器A总是作为目的操作数,而源操作数S=#dat a、Rn、direct、@Ri。 A循环左移指令为: RL A,A带进位循环左移指令为:RLC A, A循环右移指令RR A和A带进位循环右移指令为:RRC A。

4. 位处理指令 位处理指令分为位传送、位修改、位逻辑三类。

C51即80C51单片机的C语言。采用C51程序设计语言,编程者只需了解变量(常量)的存储器类型与80C51单片机存储空间的对应关系,而不必深入了解80C51单片机寻址方式,C51编译器会自动完成变量(常量)的存储单元的分配,并产生最为合适的目标代码。主教材174页表5.16 示出了存储器、存储器类型和访问速度和寻址方式对照表。

[存储种类] 数据类型 [存储器类型] 变量名表 C51规定变量必须先定义后使用。C51对变量进行定义的格式如下: [存储种类] 数据类型 [存储器类型] 变量名表 存储种类是可选项,有4种,分别为:自动(auto)、外部(extern)、静态(static)和寄存器(register)。 存储器类型指明该变量所处的单片机的内存空间。分别为bdata、data、idata、xdata 。

80C51单片机的机器指令只支持字节和位变量,尽可能选择的变量类型应该是char或bit,它们只占用1B或1位。除了根据变量长度来选择变量类型以外,还要考虑该变量是否会用于负数的场合,如果程序中可以不需要负数,那么可把变量都定义成无符号类型的。