2020年 08月 06日 星期四
您的位置: 威廉希尔主页 > 单片机技术 >

单片机技术及应用

来源:未知     作者:威廉希尔     发布时间:2020-08-05 15:34         

  单片机技术及应用_计算机软件及应用_IT/计算机_专业资料。如有你有帮助,请购买下载,谢谢! 单片机技术及应用 电气工程学院 彭世林 0页 如有你有帮助,请购买下载,谢谢! 目录 第 1 章微型计算机基础知识........................

  如有你有帮助,请购买下载,谢谢! 单片机技术及应用 电气工程学院 彭世林 0页 如有你有帮助,请购买下载,谢谢! 目录 第 1 章微型计算机基础知识....................................... 错误!未定义。 1.1 微型计算机的组成及工作原理........................... 错误!未定义。 1.2 典型单片机产品简介.................................... 错误!未定义。 1.3 单片机的应用模式...................................... 错误!未定义。 1.4 单片机的应用.......................................... 错误!未定义。 1.5 数制与编码............................................ 错误!未定义。 1.6 计算机数值数据表示与运算............................. 错误!未定义。 第 2 章 MCS-51 系列单片机芯片结构 ............................... 错误!未定义。 2.1 MCS—51 系列单片机的结构原理 .......................... 错误!未定义。 2.2 MCS—51 单片机的存储器 ................................ 错误!未定义。 2.3 MCS-51 单片机输入/输出(I/O)口 ...................... 错误!未定义。 2.4 单片机的工作方式...................................... 错误!未定义。 第 3 章 MCS-51 单片机指令系统 ................................... 错误!未定义。 3.1 MCS-51 单片机指令格式 ................................. 错误!未定义。 3.2 寻址方式.............................................. 错误!未定义。 3.3 指令系统.............................................. 错误!未定义。 第 4 章 汇编语言程序设计........................................ 错误!未定义。 4.1 汇编语言程序设计概述................................... 错误!未定义。 4.2 顺序程序设计........................................... 错误!未定义。 4.3 分支程序设计........................................... 错误!未定义。 4.4 循环程序设计........................................... 错误!未定义。 4.5 子程序设计............................................. 错误!未定义。 第 5 章 单片机存储器扩展技术.................................... 错误!未定义。 5.1 存储器系统基本知识..................................... 错误!未定义。 5.3 访问外部程序、数据存储器的时序......................... 错误!未定义。 5.4 存储器扩展的编址技术................................... 错误!未定义。 5.5 程序存储器(EPROM)的扩展.............................. 错误!未定义。 5.6 数据存储器的扩展....................................... 错误!未定义。 第 6 章 单片机的中断与定时系统................................. 错误!未定义。 6.1 中断的基本概念......................................... 错误!未定义。 6.2 MCS-51 单片机的中断系统 .............................. 错误!未定义。 6.3 MCS-51 单片机的定时器/计数器 .......................... 错误!未定义。 6.3 MCS-51 单片机的定时器/计数器 .......................... 错误!未定义。 6.4 中断系统的应用举例.................................... 错误!未定义。 第 7 章 单片机 I/O 口扩展及应用................................. 错误!未定义。 7.1 I/O 口扩展概述 ........................................ 错误!未定义。 7.2 简单 I/O 口扩展........................................ 错误!未定义。 7.3 8255 可编程通用并行接口芯片 ........................... 错误!未定义。 1页 如有你有帮助,请购买下载,谢谢! 7.4 8155 可编程通用并行接口芯片 ........................... 错误!未定义。 第 8 章 单片机串行数据通信...................................... 错误!未定义。 8.1 串行通信的基础知识.................................... 错误!未定义。 8.2 MCS-51 单片机串行通信的控制寄存器 ...................... 错误!未定义。 8.3 MCS-51 单片机串行通信工作方式 ......................... 错误!未定义。 9.1 MCS-51 单片机与 D/A 转换器的接口和应用 .................. 错误!未定义。 第 9 章 单片机应用系统设计..................................... 错误!未定义。 2页 如有你有帮助,请购买下载,谢谢! 第 1 章微型计算机基础知识 难点 ? 微型计算机的组成 ? 8051 与 80C51 的区别 ? 计算机中数据的表示方法及其运算过程 要求 掌握 ? 微处理器、微机、微机系统的概念 ? 典型的单片机产品系列及各系列之间的区别 ? 单片机系统的一般开发过程 ? 计算机中数据的表示方法及其运算过程 了解 ? 微型计算机的基本工作过程 ? ATMEL 公司单片机系列 ? 单片机系统的应用方向 1.1 微型计算机的组成及工作原理 1.1.1 微型计算机中的基本概念 1. 微处理器(Microprocessor) 微处理器通常指中央处理器,简写为 CPU。它由算术逻辑运算部件(ALU)、寄 存器、程序计数器、控制器、内部总线等组成。它采用大规模集成电(LSI)和超大 规模集成电(VLSI)制作,具有体积小、功能强等特点。 典型的微处理器有 Intel 公司的 80X86 和 Pentium 系列,Zilog 公司的 Z 系列, Motorola 公司的 M6800 系列,IBM 公司的 PowerPC604 和 PC620,以及 NEC 公司 的 UPD78 系列等。不同类型的 CPU 其特性不尽相同,如指令系统、运算速度、内 部寄存器、存储寻址能力等,这些特性在微机应用系统设计选型中常常涉及。 2. 微型计算机 微型计算机又简称微机,从结构上分析,以 CPU 为中心,再配置上 RAM、ROM、 3页 如有你有帮助,请购买下载,谢谢! 输入/输出接口和总线便构成了微机。微型计算机具有运算、存储和与外部设备进 行数据交换等功能,还可配有适当的外部设备,如键盘、显示器等。微型计算机的 这一灵活的应用特点,是目前应用最广泛的。概括地说,微型计算机可分为单片微 处理机和通用微型计算机两大类。 (1)单片微处理机 单片微处理机就是把 CPU、存储器、定时器/计数器和输入/输出接口等部件都 集成在一个电芯片上,并具备一套功能完善的指令系统,有的型号的单片微处理 机同时还具备数/模和模/数转换等功能部件。通常这些高性能的芯片都能应用在不 同场合地处理程序,故简称单片机或单片处理机。 典型的单片处理机有 Intel 公司的 MCS-51、MCS-96 系列,Motorola 公司的 MC68HC11,Rockwell 公司的 65 系列等。有些高性能的单片机还支持高级语言,它 们广泛应用在家用电器、智能化仪器和工业控制等领域。 (2)通用微型计算机 将不同用途的外设接口设计为的适配卡作为微机的接口配件,在微机内则 采取总线插槽的形式,为外部设备提供总线接口。这样,在一台基本主机上就可以 根据应用的要求,配置不同用途的外部设备。这种微机被称为通用微型计算机。 3. 微型计算机系统 在通用微型计算机上配上相应的软件系统,就构成了能适应不同应用要求的微 型计算机系统。因此,在科学计算、企业管理、家庭和娱乐等方面得到了广泛应用。 1.1.2 微机基本结构 微型计算机的基本组成如图 1-1 所示,它由中央处理器(CPU)、存储器 (Memory)、输入输出接口(I/O 接口)和系统总线(BUS)构成 。 图 1-1 微型计算机的基本组成 1.1.3 微型计算机的基本工作过程 每种型号的 CPU 都有自己的指令系统,每条指令一般由指令操作码(指令 的操作类型)和操作数(指令的操作对象)两部分组成。用户根据要完成的任务预 4页 如有你有帮助,请购买下载,谢谢! 先编好程序,再通过输入设备(如键盘)将程序送入存储器中。微型计算机开始工作 后,首先将该程序在存储器中的起始地址送入微处理器中的程序计数器(PC)中,微 处理器根据 PC 中的地址值找到对应的存储单元,并取出存放在其中的指令操作码 送入微处理器中的指令寄存器(IR)中,由指令译码器(ID)对操作码进行译码,并由微 操作控制电发出相应的微操作控制脉冲序列去取出指令的剩余部分(如果指令不 止 1 个字节的长度),同时执行指令赋予的操作功能。在取指过程中,每取出 1 个单 元的指令,PC 自动加 1,形成下一个存储单元的地址。以上为一条指令的执行过程, 如此不断重复上述过程,直至执行完最后一条指令为止。 综上所述,微型计算机的基本工作过程是执行程序的过程,也就是 CPU 自动从 程序存放的第 1 个存储单元起,逐步取出指令、分析指令,并根据指令的操作 类型和操作对象,执行指令的相关操作。如此重复,周而复始,直至执行完程 序的所有指令,从而实现程序的基本功能,这就是微型计算机的基本工作原理。 1.2 典型单片机产品简介 1.2.1 MCS-51 单片机系列 MCS-51 系列单片机是 Intel 公司在 1980 年推出的高性能 8 位单片机,在目前单片机市场中, 8 位单片机仍占主导地位。MCS-51 系列单片机以其良好的性能价格比,仍是目前单片机开发和 应用的主流机型。 MCS-51 可分为两个子系列和 4 种类型,如表 1-1 所示。按资源的配置数量,MCS-51 系列 分为 51 和 52 两个子系列,其中 51 子系列是基本型,而 52 子系列属于增强型。 表 1-1 MCS-51 系列单片机分类 80C51 单片机系列是在 MCS-51 系列的基础上发展起来的。早期的 80C51 只是 MCS-51 系列众多芯片中的一类,但是随着后来的发展,80C51 已经形成的系列,并且成为当前 8 位单片机的典型代表。 l 80C51 与 8051 的比较 (1)MCS-51 系列芯片采用 HMOS 工艺,而 80C51 芯片则采用 CHMOS 工艺。CHMOS 工艺是 COMS 和 HMOS 的结合, (2)80C51 芯片具有 COMS 低功耗的特点。例如 8051 芯片的功耗为 630mW,而 80C51 的 功耗只有 120mW,这样低的功耗,用一粒纽扣电池就可以工作。低功耗对单片机在便携式、手 提式或野外作业的仪器仪表设备上使用十分有利。 (3)从 80C51 在功能增强方面分析,主要在以下几个方面做了增强。首先,为进一步降 低功耗,80C51 芯片增加了待机和掉电两种工作方式,以单片机在掉电情况下能以最 低的消耗电流维持。 (4)此外,在 80C51 系列芯片中,内部程序存储器除了 ROM 型和 EPROM 型外,还有 E2PROM 型,例如 89C51 就有 4KB E2PROM。并且随着集成技术的提高,80C51 系列片内程序 存储器的容量也越来越大,目前已有 64KB 的芯片了。另外,许多 80C51 芯片还具有程序存储 器保密机制,以防止应用程序泄密或被复制。 5页 如有你有帮助,请购买下载,谢谢! 1.2.2 MCS-96 系列单片机 MCS-96 系列单片机是 Intel 公司在 1983 年推出的 16 位单片机,它与 8 位机相比,具有集 成度高、运算速度快等特点。它的内部除了有常规的 I/O 接口、定时器/计数器、全双工串行 口外,还有高速 I/O 部件、多 A/D 转换和脉宽调制输出(PWM)等电,其指令系统比 MCS-51 更加丰富。 MCS-96 系列单片机的主要性能如表 1-2 所示。 表 1-2 MCS-96 系列单片机主要性能 1.2.3 ATMEL 公司单片机 表 1-3 AT89C51 系列单片机主要性能 ATMEL 公司于 1992 年推出了全球第一个 3V 超低压 F1ash 存储器,并于 1994 年以 E2PROM 技术与 Intel 公司的 80C31 内核进行技术交换,从此拥有了 80C31 内核的使用权,并将 ATMEL 特有的 Flash 技术与 80C31 内核结合在一起,生产出 AT89C51 系列单片机。 ATMEL 公司的 AT89C51 系列单片机均以 MCS-51 系列单片机作为内核,同时,该系列的 各种型号的产品又具有十分突出的个体特色,已经成为广大 MCS-51 系列单片机用户进行电子 设计与开发的优选单片机品种,表 1-3 列出了 AT89C51 系列单片机的主要性能。 AT89C51 系列单片机是一种低功耗高性能 CMOS 型 8 位单片机,它除了具有与 MCS-51 系 列单片机完全兼容的若干特性外,最为突出的优点就是其片内集成了 4KB 的 F1ashPEROM(Programmable Erasable Read Only Memory)用来存放应用程序,这个 Flash 程序存 储器除允许用一般的编程器离线编程外,还允许在应用系统中实现在线编程,并且还提供了对 程序进行加密的功能。AT89C51 系列单片机的另一个特点是工作速度更高,晶振频率 可高达 24MHz,1 个机器周期仅 500ns,比 MCS-51 系列单片机快了 1 倍。AT89C51 系列单片 机除了 40 脚 DIP 封装品种外,还提供了 TQFP、SOIC 和 PQFP 等多种封装形式的产品,它同 时提供商业级、工业级、汽车用产品和军用级等四类产品。 1.3 单片机的应用模式 1.3.1 单片机应用系统的结构 单片机应用系统的结构通常分为以下三个层次。 (1)单片机:通常指应用系统主处理机,即所选择的单片机器件。 (2)单片机系统:指按照单片机的技术要求和嵌入对象的资源要求而构成的基本系统。时钟 电、复位电和扩展存储器等与单片机共同构成了单片机系统。 (3)单片机应用系统:指能满足嵌入对象要求的全部电系统。在单片机系统的基础上加上 面向对象的接口电,如前向通道、后向通道、人机交互通道(键盘、显示器、打印机等)和串 行通信口(RS232)以及应用程序等。 单片机应用系统三个层次的关系如图 1.2 所示。 图 1.2 单片机应用系统三个层次的关系 6页 如有你有帮助,请购买下载,谢谢! 1.3.2 单片机系统的开发过程 通常开发一个单片机系统可按以下 6 个步骤进行。 (1) 明确系统设计任务,完成单片机及其外围电的选型工作。 (2) 设计系统原理图和 PCB 板,经仔细检查 PCB 板后送工厂制作。 (3) 完成器件的安装焊接。 (4) 根据硬件设计和系统要求编写应用程序。 (5) 在线)使用编程器烧写单片机应用程序,运行单片机系统。 1.4 单片机的应用 单片机具有体积小、重量轻、价格便宜、功耗低、控制功能强、运算速度快、控制灵活、 抗干扰能力强、电源电压范围宽等特点,故在国民经济建设、军事及家用电器、自动测控系统、 智能仪表、机器人等领域均得到了广泛的应用。 根据目前的情况,单片机的应用大致可分成以下几类: 1.单片机在机、电、仪一体化等智能产品中的应用 单片机具有小巧、低功耗、控制功能强的优点。把它做到产品的内部,取代部分电子元器 件,可使产品体积缩小,功能增强,实现不同程度的智能化,这是其它任何计算机无法比拟的。 =日常生活中含单片机的电器产品 电子秤、便携式心率监护仪、中频电疗仪、高级玩具、电视机、洗衣机、电冰箱、电磁炉、 微波炉、空调、家用防盗报警器等产品中都有单片机的用武之地。 =智能化的仪器仪表 这是国内目前应用单片机最多、最活跃的领域。在各类仪器仪表中(包括温度、湿度、流 量、流速、电压、频率、功率、厚度、角度、长度、硬度、元素测定等),引入单片机,使仪器 仪表数字化、智能化、微型化,功能大大提高。 如:精密数字温度计、湿度控制仪、智能流量监测控制仪、便携式流速仪、频率计、智能 电度表、智能示波器、智能转速数字显示、黑匣子等。 2.单片机在工业测控中的应用 单片机 I/O 线多,位指令丰富,逻辑操作能力强,特别适用于实时控制,既可作单机控制, 又可作多级控制的前沿处理机,应用领域相当广泛。 如:汽车工业中的应用(点火控制、、牵引、转向、防盗等方面控制)、液压机的控制、 报警系统中的应用、烟叶水份测量仪、水电厂单元微机系统、啤酒生产线、汽车生产线、 集体供暖锅炉自动控制、数控机床等方面。 3.单片机在通信技术中的应用 比较高档的单片机都具有通信接口,为单片机在计算机网络与通信设备中的应用创造了很 好的条件。 7页 如有你有帮助,请购买下载,谢谢! 如:在通信中完成频率合成、系统、信道搜索及自动调谐等任务、无线遥控、调制解 调器、移动电话、程控交换技术、电线.常用数制 在日常生活中人们最熟悉的是十进制数,但在计算机中,采用二进制数“0”和“1”可以 很方便的表示机内的数据与信息。 (1)十进制数 我们熟悉的十进制数有两个主要特点: · 有十个不同的数字符号:0、1、2、…、9; · 低位向高位进、借位的规律是“逢十进一”“借一当十”的计数原则进行计数。 例如:1234.45=1×103+2×102+3×101+4×100+4×10-1+5×10-2 式中的 10 称为十进制数 的基数, 103、102、101、100、10-1 称为各数位的权。十进制数用 D 结尾表示。 (2)二进制数 在二进制中只有两个不同数码:0 和 1,进位规律是“逢二进一”“借一当二”的计数原则 进行计数。二进制数用 B 结尾表示。 例如,二进制数.01 可表示为(.01)2==1×27+1×26+0×25+1×24+1×23+0×22+1×21+ 1×20+0×2-1+1×2-2 (3)八进制数 在八进制中有 0、1、2…、7 八个不同数码,采用“逢八进一”“借一当八”的计数原则进 行计数。八进制数用 Q 结尾表示。 例如,八进制数(503.04)Q 可表示为(503.04)Q=5×82+0×81+3×80+0×8-1+4×8-2 (4)十六进制数 在十六进制中有 0、1、2…、9、A、B、C、D、E、F 共十六个不同的数码,采用“逢十六 进一”“借一当十六”的计数原则进行计数。十六进制数用 H 结尾表示。 例如十六进制数(4E9.27)H 可表示为(4E9.27)H=4×162+14×161+9×160+2×16-1+7 ×16-2 2.不同进制数之间的相互转换 表 1-4 列出了二、八、十、十六进制数之间的对应关系,熟记这些对应关系对后续内容的 学习会有较大的帮助。 表 1-4 各种进位制的对应关系 十进制 二进制 八进制 十六进制 十进制 二进制 八进制 十六进制 0 0 0 0 9 1001 11 9 1 1 1 1 10 1010 12 A 8页 如有你有帮助,请购买下载,谢谢! 2 10 2 2 11 1011 13 B 3 11 3 3 12 1100 14 C 4 100 4 4 13 1101 15 D 5 101 5 5 14 1110 16 E 6 110 6 6 15 1111 17 F 7 111 7 7 16 10000 20 10 8 1000 10 8 17 10001 21 11 (1)二、八、十六进制数转换成为十进制数 根据各进制的定义表示方式,按权展开相加,即可转换为十进制数。 【例 1-1】将(10101)B,(72)Q,(49)H 转换为十进制数。 (10101)B=1×24+0×23+1×22+0×21+1×20=37 (72)Q=7×81+2×80=58 (49)H=4×161+9×160=73 (2)十进制数转换为二进制数 十进制数转换二进制数,需要将整数部分和小数部分分开,采用不同方法进行转换,然后用小 数点将这两部分连接起来。 ① 整数部分:除 2 取余法。 具体方法是:将要转换的十进制数除以 2,取余数;再用商除以 2,再取余数,直到商等于 0 为止,将每次得到的余数按倒序的方法排列起来作为结果。 【例 1-2】将十进制数 25 转换成二进制数 ② 小数部分:乘 2 取整法。 具体方法是:将十进制小数不断地乘以 2,直到积的小数部分为零(或直到所要求的位数) 为止,每次乘得的整数依次排列即为相应进制的数码。最初得到的为最高有效数位,最后得到 的为最低有效数字。 【例 1-3】将十进制数 0.625 转换成二进制数。 【例 1-4】将十进制数 25.625 转换成二进制数,只要将上例整数和小数部分组合在一起即可, 即(25.625)D=(11001.101)B 例如:将十进制 193.12 转换成八进制数。 (3) 二进制与八进制之间的相互转换 由于 23=8,故可采用“合三为一”的原则,即 从小数点 开始向左、右两边各以 3 位为一组进行二-八转换: 若不足 3 位的以 0 补足,便可以将二进制数转换为八进制 数。反之, 每位八进制数用三位二进制数表示,就可将八进 制数转换 为二进制数。 【例 1-5】将(.01011101)2 转换为八进制数。 即 (.01011101)B =(245.272)Q 【例 1-6】将(756.34)Q 转换为二进制数。 7 5 6.3 4 111 101 110 . 011 100 9页 如有你有帮助,请购买下载,谢谢! 即 (756.34)Q=(0.0111)B (4) 二进制与十六进制之间的相互转换 由于 24=16,故可采用“合四为一”的原则,即从小数点开始向左、右两边各以 4 位为一组 进行二—十六转换,若不足 4 位的以 0 补足,便可以将二进制数转换为十六进制数。反之,每 位十六进制数用四位二进制数表示,就可将十六进制数转换为二进制数。 【例 1-7】将(11.1)B 转换为十六进制数。 0001 1111 1100 0111 . 1001 0101 1000 1 F C 7.9 5 8 即 (1.1)B =(1FC7.958)H 【例 1-8】将(79BD.6C)H 转换为二进制数。 7 9 B D.6 C 0111 1001 1011 1101 . 0110 1100 即 (79BD.6C)H=(.011011)B 1.5.2 常用的信息编码 1. 二—十进制 BCD 码(Binary-Coded Decimal) 二—十进制 BCD 码是指每位十进制数用 4 位二进制数编码表示。由于 4 位二进制数可以表 示 16 种状态,可丢弃最后 6 种状态,而选用 0000~1001 来表示 0~9 十个数符。这种编码又叫 做 8421 码。见表 1-5 所示。 表 1-5 十进制数与 BCD 码的对应关系 十进制数 BCD 码 十进制数 BCD 码 0 0000 10 00010000 1 0001 11 00010001 2 0010 12 00010010 3 0011 13 00010011 4 0100 14 00010100 5 0101 15 00010101 6 0110 16 00010110 7 0111 17 00010111 8 1000 18 00011000 9 1001 19 00011001 【例 1-9】将 69.25 转换成 BCD 码。 6 9.2 5 0110 1001 . 0010 0101 结果为 69.25=(01101001.00100101)BCD 【例 1-10】将 BCD 码 1000.01010110 转换成十进制数。 1001 0111 1000 . 0101 0110 9 7 8. 5 6 结果为(1000.01010110)BCD=978.56 10 页 如有你有帮助,请购买下载,谢谢! 2.字符编码(ASCII 码) 计算机使用最多、最普遍的是 ASCII(American Standard Code For Information Interchange) 字符编码,即美国信息交换标准代码,如表 1.6 所示。 ASCII 码的每个字符用 7 位二进制数表示,其排列次序为 d6d5d4d3d2d1d0, d6 为高位,d0 为低位。而一个字符在计算机内实际是用 8 位表示。正常情况下,最高一位 d7 为“0”。7 位二 进制数共有 128 种编码组合,可表示 128 个字符,其中数字 10 个、大小写英文字母 52 个、其 他字符 32 个和控制字符 34 个。 表 1-6 七位 ASCII 代码表 d3 d2 0 d6 d5d4 位 d1d0 位 000 001 010 011 100 101 110 111 0000 NUL DEL SP 0 @ P ` p 0001 SOH DC1 ! 1 A Q a q 0010 STX DC2 ″ 2 B R b r 0011 ETX DC3 # 3 C S c s 0100 EOT DC4 ﹩ 4 D T d t 0101 ENQ NAK % 5 E U e u 0110 ACK SYN ﹠ 6 F V f v 0111 BEL ETB ' 7 G W g w 1000 BS CAN ﹙ 8 H X h x 1001 HT EM ﹚ 9 I Y i y 1010 LF SUB ﹡ : J Z j z 1011 VT ESC + ﹔ K [ k ﹛ 1100 FF FS , < L \ l | 1101 CR GS - = M ] m } 1110 SO RS · > N ↑ n ~ 1111 SI HS / ﹖ O ← o DEL 要确定某个字符的 ASCII 码,在表中可先查到它的,然后确定它所在的相应列和 行,最后根据列确定高位码(d6d5d4),根据行确定低位码(d3d2d1d0),把高位码与低位码合 在一起就是该字符的 ASCII 码。例如数字 9 的 ASCII 码为 00111001B,即十六进制为 39H;字 符 A 的 ASCII 码为 01000001,即十六进制为 41H 等等。 数字 0~9 的 ASCII 码为 30H~39H。 大写英文字母 A~Z 的 ASCII 码为 41H~5AH。 小写英文字母 a~z 的 ASCII 码为 61H~7AH。 对于 ASCII 码表中的 0、A、a 的 ASCII 码 30H、41H、61H 应尽量记住,其余的数字和字 母的 ASCII 码可按数字和字母的顺序以十六进制的规律写出。 ASC 码主要用于微机与外设的通信。当微机接收键盘信息、微机输出到打印机、显示器等 信息都是以 ASCII 码形式进行数据传输。 3.奇偶校验码 11 页 如有你有帮助,请购买下载,谢谢! 奇偶校验是一种常用的简单校验方法,如在计算机内作存储器读写校验、ASCII 字符传送 中的校验等。 奇偶校验码是在传送的代码上附加一个校验位,作为代码的比较校验。这样在接收方,先 对信息代码按双方的校验求奇偶校验码,然后再与收到的附加校验位作比较,若相等则认 为接收的代码是正确的,否则为错。 奇偶校验就是鉴别代码中有奇数个“1,还是有偶数个“1。例如,有效信息为 1011001, 若采用偶校验码记为“0”的线”的线。有效代码的最后的那个数位,就是奇偶校验位。当接受方收到这组代码后, 便根据奇、偶校验的约定和有效代码中“1”的个数形成校验码,然后再与接收的校验位作比较。 比较相等的话,说明接受的信息正确;反之,则认为出现了错误。 奇偶校验只能发现一位错,但不能确定出错的,对偶数个错位便为力了。但在实 际应用中,一位出错的概率比多位出错的概率高,因此,奇偶校验码还是很实用的。 1.6 计算机数值数据表示与运算 1.6.1 二进制数在计算机内的表示 1. 机器数 在计算机中,因为只有“0”和“1”两种形式,所以数的正、负号,也必须以“0”和 “1”表示。通常把一个数的最高位定义为符号位,用 0 表示正,1 表示负,称为数符:其余位 仍表示数值。把在机器内存放的正、负号数码化的数称为机器数,把机器外部由正、负号表示 的数称为线】线)B 的机器数为,存放在机器中,如图 1.3 所示。 图 1.3 机器数 要注意的是,机器数表示的范围受到字长和数据的类型的。字长和数据类型定了, 机器数能表示的数值范围也就定了。 例如,若表示一个整数,字长为 8 位,则最大的正数为 01111111,最高位为符号位,即 最大值为 127。若数值超出 127,就要“溢出”。最小负数为,最高位为符号位,即最小值为-128。 2. 数的定点和浮点表示 计算机内表示的数,主要分成定点小数、定点整数与浮点数三种类型。 (1)定点小数是指小数点准确固定在数据某一个上的小数。一般把小数点固定在最高 数据位的左边,小数点前边再设一位符号位。按此规则,任何一个小数都可以写成: N=NSN-1N-2···N-M, NS 为符号位 即在计算机中用 M+1 个二进制位表示一个小数,最高(最左)一个二进制位表示符号(如用 0 表示正号,则 1 就表示负号),后面的 m 个二进制位表示该小数的数值。小数点不用明确表示出 来,因为它总是定在符号位与最高数值位之间。对用 m+1 个二进制位表示的小数来说,其值的 范围N≤1—2-M。定点小数表示法主要用在早期的计算机中。 (2)整数的表示法 12 页 如有你有帮助,请购买下载,谢谢! 整数所表示的数据的最小单位为 1,可以认为它是小数点定在数值最低位右面的一种表示 法。整数分为带符号和不带符号两类。对带符号的整数,符号位放在最高位。可以写成: N=NSNnNn-1···N2 N1 N0, NS 为符号位 对于用 n+l 位二进制位表示的带符号整数,其值的范围为: N≤2n-1。 对于不带符号的整数,所有的 n+1 个二进制位均看成数值,此时数值表示范围为, 0≤N ≤2n+1-1。在计算机中,一般用 8 位、16 位和 32 位等表示数据。一般定点数表示的范围和精度 都较小,在数值计算时,大多数采用浮点数。 (3)浮点数的表示方法 浮点表示法对应于科学(指数)计数法,如数 110.011 可表示为 N=110.011=1.10011×2+10=11001.1×2-10=0.110011×2+11 在计算机机中一个浮点数由两部分构成:阶码和尾数,阶码是指数,尾数是纯小数。其存 储格式如图 1.4 所示。 阶符 阶码 数符 尾数 图 1.4 浮点数存储格式 阶码只能是一个带符号的整数,它用来尾数中的小数点应当向左或向右移动的位 数,阶码本身的小数点约定在阶码最右面。尾数表示数值的有效数字,其本身的小数点约定在 数符和尾数之间。在浮点数表示中,数符和阶符都各占一位,阶码的位数随数值表示的范围而 定,尾数的位数则依数的精度要求而定。 【例 1-12】设尾数为 4 位,阶码为 2 位,则二进制数 N=211×l011 的浮点数表示形式为: 应当注意:浮点数的正、负是由尾数的数符确定,而阶码的正、负只决定小数点的, 即决定浮点数的绝对值大小。 3. 带符号数的表示 在计算机中,带符号数可以用不同方法表示,常用的有原码、反码和补码。 (1)原码 【例 1-13】当机器字长 n=8 时: [+1]原=0 0000001, [-1]原=1 0000001 [+127]原=0 1111111, [-127]原=1 111111l 由此可以看出,在原码表示法中: ? 最高位为符号位,正数为 0,负数为 1,其余 n-1 位表示数的绝对值。 ? 在原码表示中,零有两种表示形式,即:[+0]=00000000,[-0]=。 (2)反码 【例 1-14】当机器字长 n=8 时: [+1]反=00000001, [-1]反= [+127]反=01111111, [-127]反= 由此看出,在反码表示中: ? 正数的反码与原码相同,负数的反码只需将其对应的正数按位求反即可得到。 ? 机器数最高位为符号位,0 代表正号,1 代表负号。 ? 反码表示方式中,零有两种表示方法: [+0]反=00000000, [-0]反=。 (3)补码 13 页 如有你有帮助,请购买下载,谢谢! 【例 1-15】当机器字长 n=8 时, [+1]补=00000001, [-1]补= [+127]补=01111111, [-127]补= 由此看出,在补码表示中: ? 正数的补码与原码、反码相同,负数的补码等于它的反码加 l。 ? 机器数的最高位是符号位,0 代表正号,1 代表负号。 ? 在补码表示中,0 有唯一的编码: [+0]补=[-0]补=00000000。 补码的运算方便,二进制的减法可用补码的加法实现,使用较广泛。 【例 1-16】假定计算机字长为 8 位,试写出 122 的原码、反码和补码。 [122]原=[122]反=[122]补=01111010B 【例 1-17】假定计算机字长为 8 位,试写出-45 的原码、反码和补码。 [-45]原=B [-45]反=B [-45]补=B 对于用补码表示的负数,首先认定它是负数,而后用求它的补码的方法可得到它的绝对 值,即可求得该负数的值。例如,补码数()B 是一个负数,求该数的补码为(00001101)B,该数相 应的十进制数为 13,故求出()B 为(-13)D。 【例 1-18】试写出原码的真值。 (原码)补=(原码)反+1=B=-39 1.6.2 补码的运算 在微处理机中,使用补码进行运算是十分方便的,它使同一个微处理机中既能运算带符 号数又能运算不带符号的数。而且,在采用补码表示带符号数的情况下,两个数的减法可以用 加法来实现。下面我们将会看到这一点。 一个数,是带符号的数还是不带符号的数是人为的。而对微处理机来说,它对输入 的二进制数进行运算时,并不知道输入的二进制数是带符号的数还是不带符号的数。但是,当 用不带符号的数或用补码数来解释带符号的数时,微处理机运算的结果都是正确的。 【例 1-19】有两个二进制数和 00001110,当它们是不带符号的数时,则它们分别表示(132)10 和(14)10。将这两个二进制数相加: 得到一个无符号的二进制数,该数为十进制数 146。也就是说,按照无符号数去解释, 运算的结果是正确的。 同样上述两个数,如果它们是带符号的数,其十进制值分别为(-124)10 和(+14)10。 两个带符号的数()2 和(00001110)2 相加,得到带符号的数()2,此结果用符号数进行解释,刚好为 (-110)10,其结果也是正确的。 在微处理器中,一般都不设置专门的减法电。遇到两个数相减时,处理器就自动地将 减数取补,而后将被减数和减数的补码相加来完成减法运算。例如,(69)10-(26)10=?可以写成 (69)10+(-26)10。利用(69)10 的原码和(-26)10 的补码相加,即可以得到正确的结果。 在进行带符号数的加减运算时,应把参与运算的数据转换成补码形式进行运算。当使用 8 位二进制数表示带符号的数时,它所能表示的数值范围在(-128)10~(+127)10 之间,如果相加结 14 页 如有你有帮助,请购买下载,谢谢! 果超出了这个范围,就会导致错误发生。 [X+Y]补=[X]补+[Y]补 [X-Y]补=[X]补+[-Y]补 由上述可以看到,采用补码法进行运算时,在微处理器中只用加法电就可以实现加法 或减法运算。但是,必须强调指出,在进行两个同符号的数(即两数同为正数或同为负数)相加 时,一定要特别注意其结果不能超出所的数值范围,否则将产生溢出。 【例 1-20】两个带符号的数(01000001)2(十进制数+65)与(01000011)2(十进制数+67) 例中是两个正数相加,但结果却是一个负数——符号位为 1。显然,这个结果是错误的, 出现这种错误的原因就在于这两个数相加的结果超过了 8 位二进制带符号数所能表示的数值范 围。 【例 1-21】两个负数()2 和()2 的相加情况。 由于用 8 位二进制数来表示带符号的数,故忽略作为进位位的第九位。按 8 位二进 制数来解释这两个符号数的相加,其结果为一个正数。很明显,结果是错误的。 以上两种情况叫做补码运算的溢出。当两个同符号的数相加时,如果相加的结果超过了 微处理机所能表示的数值范围,就将发生溢出,其结果就是错误的。因此,在微处理机中设有 专门的电 用以判断运算结果是否产生溢出,并以某种标志告诉人们这次运算的结果是否存在 溢出。只要溢出没有发生,运算的结果总是正确的。 此外,在微处理机中还会遇到不带符号数的运算。 【例 1-22】两个无符号数()2 和(00000011)2 相加: 从相加计算的结果来看,如果微处理机只有 8 位,也就是用 8 位二进制数来解释运算的 结果,则将出现错误。因此,在微处理机中设有专门的一位,称为进位位,它将用于保存第九 位以防丢失信息。当考虑了这一位以后,用 9 位二进制数来解释相加的结果,则计算的结果仍 然是正确的。总之,由于微处理机中有专门的进位位,无符号数的加法运算总可以得到正确的 结果。 1.6.3 逻辑运算 (1)“与”运算。“与”运算的运算规则是: 0?0=0 0?1=0 1?0=0 1?1=1 【例 1-23】 二进制数 01011101B 和 B 相与。 (2)“或”运算。“或”运算的运算规则是: 0? 0=0 0?1=1 1?0=1 1?1=1 【例 1-24】二进制数和 01010000 相或。 (3)“异或”运算。“异或”运算的运算规则是: 0?0=0 0?1=1 1?0=1 1?1=0 【例 1-25】二进制数和 01101110 相异或。 15 页 如有你有帮助,请购买下载,谢谢! 第 2 章 MCS-51 系列单片机芯片结构 ? 单片机的内部结构 ? 程序状态字 PSW ? 单片机 P3 口的第二功能 ? 单片机的指令时序 要求 掌握: ? 单片机的引脚信号功能定义 ? 单片机的工作寄存器、PSW 及程序存储器中的中断入口地址 ? 单片机各 I/O 口的特点 ? 单片机的复位电、时钟电及指令时序 了解: ? MCS-51 系列单片机的主要型号 ? 单片机的系统结构和内部结构 ? 单片机的低功耗方式 2.1 MCS—51 系列单片机的结构原理 2.1.1 MCS-51 单片机逻辑结构 MCS-51 单片机采用的是冯.诺伊曼提出的经典计算机体系结构框架,即一台计算机是由运 算器、控制器、存储器、输入设备和输出设备共五个基本部分组成。MCS-51 单片机在一块芯 片上集成了 CPU、RAM、ROM、定时器/计数器和多功能 I/O 口等。MCS-51 单片机的系统结构 框图如图 2.1 所示。 由图 2.1 可以看出,单片机内部主要包含下列几个部件: ? 一个 8 位 CPU; ? 一个时钟电; ? 4Kbyte 程序存储器; ? 128byte 数据存储器; ? 两个 16 位定时/计数器; ? 64Kbyte 扩展总线 页 如有你有帮助,请购买下载,谢谢! ? 四个 8-bit 并行 I/O 端口; ? 一个可编程串行接口; ? 五个中断源,其中包括两个优先级嵌套中断。 2.1.2 MCS-51 单片机内部结构 图 2.1 MCS-51 单片机系统结构框图 MCS-51 单片机芯片内部结构框图如图 2.2 所示。 图 2.2 MCS-51 单片机芯片内部结构 1. CPU CPU 即中央处理器的简称,是单片机的核心部件,它完成各种运算和控制操作,CPU 由运 算器和控制器两部分电组成。 (1)运算器电 运算器电包括 ALU(算术逻辑单元)、ACC(累加器)、B 寄存器、状态寄存器、暂存器 1 和暂存器 2 等部件,运算器的功能是进行算术运算和逻辑运算。运算电以 ALU 为核心单元, 可以完成半字节、单字节以及多字节数据的运算操作,其中包括加、减、乘、除、十进制调整 等算术运算以及与、或、异或、求补和循环等逻辑操作,运算结果的状态由状态寄存器保存。 (2)控制器电 控制器电包括程序计数器 PC、PC 加 1 寄存器、指令寄存器、指令译码器、数据指针 DPTR、 堆栈指针 SP、缓冲器以及定时与控制电等。控制电完成指挥控制工作,协调单片机各部分 正常工作。程序计数器 PC 用来存放即将要执行的指令地址,它可以完成 64K 的外部存储器寻 址,执行指令时,PC 内容的高 8 位经 P2 口输出,低 8 位经 P0 口输出。数据指针 DPTR 为 16 位数据指针,它可以对 64K 的外部数据存储器和 I/O 口进行寻址,它的低 8 位为 DPL(地址 82H), 高 8 位为 DPH(地址为 83H)。堆栈指针 SP 在片内 RAM(128 字节)中开辟栈区,并随时 栈顶地址,它按先进后出的原则存取数据,上电复位后,SP 指向 07H。 2. 定时器/计数器 MCS-51 单片机片内有两个 16 位的定时/计数器,即定时器 0 和定时器 1。它们可以用于 定时控制、延时以及对外部事件的计数和检测等。 3. 存储器 MCS-51 系列单片机的存储器包括数据存储器和程序存储器,其主要特点是程序存储器和 数据存储器的寻址空间是相互的,物理结构也不相同。对 MCS-51 系列(8031 除外)而 言,有 4 个物理上相互的存储器空间:即内、外程序存储器和内、外数据存储器。对于 8051 其芯片有 256 个 RAM 单元,其中后 128 个单元被专用寄存器占用,只有前 128 个单元供 用户使用。 17 页 如有你有帮助,请购买下载,谢谢! 4. 并行 I/O 口 MCS-51 单片机共有 4 个 8 位的 I/O 口(P0、P1、P2 和 P3),每一条 I/O 线都能地用 作输入或输出。P0 口为三态双向口,能带 8 个 TTL 门电,P1、P2 和 P3 口为准双向口,负载 能力为 4 个 TTL 门电。 5. 串行 I/O 口 MCS-51 单片机具有一个采用通用异步工作方式的全双工串行通信接口,可以同时发送和 接收数据。它具有两个相互的接收、发送数据缓冲器,两个缓冲器共用一个地址(99H), 发送缓冲器只能写入,不能读出,接收缓冲器只能读出,不能写入。 6. 中断控制系统 MCS-51 单片机的中断功能较强,以满足控制应用的需要。8051 共有 5 个中断源,即外中 断 2 个,定时/计数中断 2 个,串行中断 1 个。所有中断分为高级和低级两个中断优先级。 7. 时钟电 MCS-51 芯片内部有时钟电,但晶体振荡器和微调电容必须外接。时钟电为单片机产 生时钟脉冲序列,振荡器的频率范围为 1.2MHz~12MHz,典型取值为 6MHz。 8. 总线 以上所有组成部分都是通过总线连接起来,从而构成一个完整的单片机。系统的地址信号、 数据信号和控制信号都是通过总线传送的,总线结构减少了单片机的连线和引脚,提高了集成 度和可靠性。 2.1.3 引脚信号 图 2.3 为 MCS-51 系列单片机引脚图及逻辑符号,它们为标准的 40 脚 DIP 封装。这些引 脚的功能描述如下: (a)引脚图 (b)逻辑符号 图 2.3 MCS-51 外形 1. 电源引脚 Vcc 和 Vss Vcc:电源端,接+5V。 Vss:接地端。 通常在 Vcc 和 Vss 引脚之间接 0.1μ 高频滤波电容。 18 页 如有你有帮助,请购买下载,谢谢! 2. 时钟电引脚 XTAL1 和 XTAL2 XTAL1:接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,若使用外 部 TTL 时钟时,该引脚必须接地。 XTAL2:接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出,若使用 外部 TTL 时钟时,该引脚为外部时钟的输入端。 3. 地址锁存允许 ALE 在系统扩展时,ALE 用于控制地址锁存器锁存 P0 口输出的低 8 位地址,从而实现数据与 低位地址的复用。当单片机上电正常工作后,ALE 端就周期性地以时钟频率的 1/6 的固定频率 向外输出正脉冲信号,ALE 的负载能力为 8 个 LSTTL 器件。 4. 外部程序存储器读选通信号 是读外部程序存储器的选通信号,低电平有效。CPU 从外部存储器取指令时,它在每 个机器周期中两次有效。 5. 程序存储器地址允许输入端 /VPP 当 为高电平时,CPU 执行片内程序存储器指令,但当 PC 中的值超过 0FFFH 时,将自 动转向执行片外程序存储器指令。当 为低电平时,CPU 只执行片外程序存储器指令。对于 8031,由于其无片内 ROM,故 必须接低电平。 6. 复位信号 RST 该信号高电平有效,在输入端保持两个机器周期的高电平后,就可以完成复位操作。此外, 该引脚还有掉电功能,若在该端接+5V 备用电源,在使用中若 Vcc 掉电,可片内 RAM 中信息不丢失。 7. 输入/输出口引脚 P0、P1、P2 和 P3 P0 口(P0.0~P0.7):该端口为漏极开的 8 位准双向口,负载能力位 8 高 LSTTL 负载, 它为 8 位地址线):它是一个内部带上拉电阻的 8 位准双向 I/O 口,P1 口的驱动能力为 4 个 LSTTL 负载。 P2 口(P2.0~P2.7):它为一个内部带上拉电阻的 8 位准双向 I/O 口,P2 口的驱动能力也为 4 个 LSTTL 负载。在访问外部程序存储器时,它作存储器的高 8 位地址线 口同样是内部带上拉电阻的 8 位准双向 I/O 口,P3 口除了作为一般 的 I/O 口使用之外,其还具有特殊功能。 2.2 MCS—51 单片机的存储器 19 页 如有你有帮助,请购买下载,谢谢! MCS-51 的存储器结构与常见的微型计算机的配置方式不同,它把程序存储器和数据存 储器分开,各有自己的寻址系统、控制信号和功能。程序存储器用来存放程序和始终要保留的 ,数据存储器通常用来存放程序运行中所需要的或变量。MCS-51 的存储器结构如图 2.4 所示。在本节中我们将对单片机的内部数据存储器、内部程序存储器和外部存储器分别作一 介绍。 图 2.4 MCS-51 存储器配置 2.2.1 内部数据存储器 对于 8051 单片机,其内部共有 256 个数据存储器单元,其中低 128 字节(00H~7FH) 正的用户 RAM 区,其空间分配如图 2.5 所示;高 128 字 节(80H~FFH)为特殊功能寄存器区。 1. 内部数据存储器低 128 单元 在低 128 字节存储单元中,前 32 个单元(00H~1FH) 作为工作寄存器使用,这 32 个寄存器分作 4 组,每组由 8 个 通用寄存器(R0~R7)组成,组号依次为 0、1、2 和 3。通 过对程序状态字中 RS1 和 RS0 的设置,可以决定选用哪一组 工作寄存器,通常没有选中的单元也可作为一般的数据缓存使 用。系统上电复位时,默认选中第 0 组寄存器。在表 2-1 中给 出了工作寄存器地址表。 表 2-1 工作寄存器地址表 组号 RS1 RS0 R0 R1 R2 R3 R4 R5 R6 R7 0 00 00H 01H 02H 03H 04H 05H 06H 07H 1 01 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH 2 10 10H 11H 12H 13H 14H 15H 16H 17H 3 11 18H 19H 1AH 1BH 1CH 1DH 1EH 1FH 工作寄存器中 R0 和 R1 可以进行直接寻址或间接寻址,而 R2~R7 只可以进行直接寻址。通 用寄存器为 CPU 提供了数据就近存取的便利,大大提高了单片机的处理速度。 在工作寄存器后的 16 个数据单元(20H~2FH),它们既可以作为一般的数据单元使用,由 可以按位对每个单元进行操作,因此这 16 个数据单元又称作位寻址区。位寻址区共计 128 位, 其位地址为 00H~0FH,位地址表如表 2-2。 表 2-2 内部 RAM 位寻址区的位地址 单元地址 MSB(最高有效位) 位地址 LSB (最低有效位) 2FH 7FH 7EH 7DH 7CH 7BH 7AH 79H 78H 2EH 77H 76H 75H 74H 73H 72H 71H 70H 2DH 6FH 6EH 6DH 6CH 6BH 6AH 69H 68H 20 页 如有你有帮助,请购买下载,谢谢! 2CH 67H 66H 65H 64H 63H 62H 61H 60H 2BH 5FH 5EH 5DH 5CH 5BH 5AH 59H 58H 2AH 57H 56H 55H 54H 53H 52H 51H 50H 29H 4FH 4EH 4DH 4CH 4BH 4AH 49H 48H 28H 47H 46H 45H 44H 43H 42H 41H 40H 27H 3FH 3EH 3DH 3CH 3BH 3AH 39H 38H 26H 37H 36H 35H 34H 33H 32H 31H 30H 25H 2FH 2EH 2DH 2CH 2BH 2AH 29H 28H 24H 27H 26H 25H 24H 23H 22H 21H 20H 23H 1FH 1EH 1DH 1CH 1BH 1AH 19H 18H 22H 17H 16H 15H 14H 13H 12H 11H 10H 21H 0FH 0EH 0DH 0CH 0BH 0AH 09H 08H 20H 07H 06H 05H 04H 03H 02H 01H 00H 在内部 RAM 的低 128 个单元中,剩余的 80 个数据单元即 30H~7FH 正的用户 RAM 区, 对于这些区域,用户只能以存储单元的形式来使用,通常在应用中也把堆栈开辟在这段区域。 2. 内部数据存储器高 128 单元 内部数据存储器的高 128 个单元是为专用寄存器提供的,因此该区也称作特殊功能寄存器区 (SFR),它们主要用于存放控制命令、状态或数据。除去程序计数器 PC 外,还有 21 个特殊功 能寄存器,其地址空间为 80H~FFH,特殊功能寄存器见表 2-3。这 21 个寄存器中有 11 个特殊 功能寄存器具有位寻址能力,它们的字节地址刚好能被 8 整除。下面将对部分专用寄存器作简 要介绍。 表 2-3 MCS-51 单片机特殊功能寄存器表 符号 名称 地址 *ACC 累加器 E0H *B B 寄存器 F0H *PSW 程序状态字 D0H SP 栈指针 81H DPTR 数据指针(DPH,DPL) 83H, 82H *P0 P0 口锁存寄存器 80H *P1 P1 口锁存寄存器 90H *P2 P2 口锁存寄存器 A0H *P3 P3 口锁存寄存器 B0H *IP 中断优先级控制寄存器 B8H *IE 中断允许控制寄存器 A8H TMOD 定时/计数器工作方式、状态寄存器 89H +*T2CON 定时/计数器 2 控制寄存器 C8H *TCON 定时/计数器控制寄存器 88H TH0 定时/计数器 0(高字节) 8CH TL0 定时/计数器 0(低字节) 8AH TH1 定时/计数器 1(高字节) 8DH 21 页 如有你有帮助,请购买下载,谢谢! TL1 +TH2 +TL2 +RCAP2H +RCAP2L *SCON SBUF PCON 定时/计数器 1(低字节) 定时/计数器 2(高字节) 定时/计数器 2(低字节) 定时/计数器 2 记录寄存器(高字节) 定时/计数器 2 记录寄存器(低字节) 串行口控制寄存器 串行数据缓冲寄存器 电源控制寄存器 8BH CDH CCH CBH CAH 98H 99H 97H 注:凡是“*”号的特殊功能寄存器既可按位寻址,也可直接按字节寻址,凡是标有“+”号的特殊功能寄 存器仅 8032/8052 型才有。 ? 累加器 ACC 累加器为 8 位寄存器,是程序中最常用的专用寄存器,在指令系统中累加器的助记符为 A。 大部分单操作数指令的操作取自累加器,很多双操作数指令的一个操作数也取自累加器。加、 减乘和除等算术运算指令的运算结果都存放在累加器 A 或 AB 寄存器中,在变址寻址方式中累 加器被作为变址寄存器使用。在 MCS-51 中由于只有一个累加器,而单片机中的大部分数据操 作都是通过累加器进行的,故累加器的使用是十分频繁的。 ? B 寄存器 B 寄存器为 8 位寄存器,主要用于乘除指令中。乘法指令的两个操作数分别取自累加器 A 和寄存器 B,其中 B 为乘数,乘法结果的高 8 位存放于寄存器 B 中。除法指令中,被除数取自 A,除数取自 B,除法的结果商数存放于 A,余数存放于 B 中。在其它指令中,B 寄存器也可 作为一般的数据单元来使用。 ? 程序状态字 PSW 程序状态字是一个 8 位寄存器,它包含程序的状态信息。在状态字中,有些位状态是根据 指令执行结果,由硬件自动完成设置的,而有些状态位则必须通过软件方法设定。PSW 中的每 个状态位都可由软件读出,PSW 的各位定义如表 2.4。 表 2.4 PSW 的各状态位定义 位序 PSW.7 PSW.6 PSW.5 PSW.4 PSW.3 PSW.2 PSW.1 PSW.0 位标志 CY AC F0 RS1 RS0 OV / P (1) CY:进位标志位 在执行某些算术和逻辑指令时,可以被硬件或软件置位或清零。在算术运算中它可作为进 位标志,在位运算中,它作累加器使用,在位传送、位与和位或等位操作中,都要使用进位标 志位。 (2) AC:辅助进位标志 进行加法或减法操作时,当发生低四位向高四位进位或借位时,AC 由硬件置位,否则 AC 位被置“0”。在进行十进制调整指令时,将借助 AC 状态进行判断。 (3) F0:用户标志位 该位为用户定义的状态标记,用户根据需要用软件对其置位或清零,也可以用软件测试 F0 22 页 如有你有帮助,请购买下载,谢谢! 来控制程序的跳转。 (4) RS1 和 RS0:寄存器区选择控制位 该两位通过软件置“0”或“1”来选择当前工作寄存器区,RS1 和 RS0 的选择见表 2.2。 (5) OV:溢出标志位 当执行算术指令时,由硬件置位或清零来溢出状态。在带符号的加减运算中,OV=1 表示加减运算结果超出了累加器 A 所能表示的符号数有效范围(-128~+127),即运算结果 是错误的,反之,OV=0 表示运算正确,即无溢出产生。 无符号数乘法指令 MUL 的执行结果也会影响溢出标志,若置于累加器 A 和寄存器 B 的两 个数的乘积超过了 255,则 OV=1,反之 OV=0。由于乘积的高 8 位存放于 B 中,低 8 位存放 于 A 中,OV=0 则意味着只要从 A 中取得乘积即可,否则要从 BA 寄存器对中取得乘积结果。 在除法运算中,DIV 指令也会影响溢出标志,当除数为 0 时,OV=1,否则 OV=0。 (6) P:奇偶标志位 每个指令周期由硬件来置位或清零用以表示累加器 A 中 1 的个数的奇偶性,若累加器中 1 的个数为奇数则 P=1,否则 P=0。 ? 数据指针 DPTR 数据指针 DPTR 为一个 16 位的专用寄存器,其高位用 DPH 表示,其低位用 DPL 表示,它 即既可以作为一个 16 位的寄存器来使用,也可作为两个 8 位的的寄存器 DPH 和 DPL 使用。DPTR 在访问外部数据存储器时既可用来存放 16 位地址,也可作地址指针使用。如 MOVX @DPTR, A。 ? I/O 端口 P0~P3 P0~P3 为四个 8 位的特殊功能寄存器,分别是四个并行 I/O 端口的锁存器,当 I/O 端口的 某一位用作输入时,对应的锁存器必须先置“1”。 ? 定时器/计数器 在 MCS-51 中,除 8032/8052 外都只有两个 16 位定时器/计数器 T0 和 T1,它们由两个相 互的 8 位寄存器组成 TH 和 TL,共有四个的寄存器 TH0、TL0、TH1 和 TL1,只可对 这四个寄存器寻址,而不能作为一个 16 位寄存器来寻址。 ? 串行数据缓冲寄存器 串行数据缓冲器 SBUF 用于存放将要发送或已接收的数据,它由发送缓冲器和接收缓冲器 组成,将要发送的数据被送入 SBUF 时进入发送缓冲器,反之进入接收缓冲器。 2.2.2 外部数据存储器 在 MCS-51 中,其片外数据存储器和 I/O 口与片内数据存储器空间 0000FH~FFFFH 是重 叠的。在 8051 单片机中采用 MOV 和 MOVX 两种指令来区分片内外 RAM 空间,其中片内 RAM 使用 MOV 指令,片外 RAM 和 I/O 口使用 MOVX 指令。 2.2.3 程序存储器 在 MCS-51 系列中,程序存储器被用来存放程序、或表格等。在 8051 中,其片内有 4K 字节的 ROM 存储单元,地址为 0000H~0FFFH。8751 有 4K 字节的 EPROM,而 8052 和 8752 则有 8K 字节的片内存储器。8031 和 8032 无片内程序存储器,所以片内程序存储器的有无是区 23 页 如有你有帮助,请购买下载,谢谢! 分芯片的主要标志。 对于 8051 和 8751 除了片内的 4K 字节的程序存储器外,片外还有 16 位地址扩展总线K 字节的程序存储器,两者统一进行编址,当 接“1”时,片内程序存储器占用 0000H~ 0FFFH,故外部程序存储器寻址范围为 1000H~FFFFH。当 接“0”时,MCS-51 单片机均 从片外存储器取指,这时片外程序存储器可以从 0000H 开始编址,对于 8031 和 8032 由于无片 内程序存储器,它们的 端必须接“0”。 在程序存储器中,以下 6 个单元具有特殊含义: 0000H:单片机复位后,PC=0000H,程序从 0000H 开始执行指令。 0003H:外部中断 0 入口地址。 000BH:定时器 0 中断入口地址。 0013H:外部中断 1 入口地址。 001BH:定时器 1 中断入口地址。 0023H:串行口中断入口地址。 在系统中断相应之后,将自动转各中断入口地址处执行程序,而中断服务程序一般无法存 放于几个单元之内,因此在中断入口地址处往往存放一条无条件转移指令进行跳转,以便执行 中断服务程序。 2.3 MCS-51 单片机输入/输出(I/O)口 在 MCS-51 单片机中有 4 个双向的 8 位 I/O 口 P0~P3,在无片外存储器的系统中,这 四个 I/O 口的每一位都可以作为准双向通用 I/O 口使用。在具有片外存储器的系统中,P0 口作 为地址线 位以及双向数据总线 位地址线 个口除了按字节寻址外, 还可以按位寻址。 2.3.1 P0 口 图 2.6 给出了 P0 口的逻辑结构,它由一个锁存器、两个三态输入缓冲器、一个多复用 开关以及控制电和驱动电等组成。 图 2.6 P0 口位结构 P0 口可以作为输入输出口,在实际应用中它通常作为地址/数据复用总线。在访问外部 存储器时,P0 口为线 口输出地址/数据信息时,此时控制信号为高 电平“1”,模拟开关 MUX 将地址/数据线 接通,同时与门输出有效,于是输出 的地址/数据信息通过与门后将去驱动 T1,同时通过反相器后驱动 T2。若地址/数据线”,反之 T1 截止,T2 导通,P0 口输出为“0”。当数据从 P0 口输入时,读引脚使三态缓冲器打开,端口上的数据经缓冲器后送到内部总线 口作为通用 I/O 口时,CPU 向端口输出数据,此时 MUX 开关与锁存器的 相连, 写信号与触发器的时钟线相连,于是内部总线上的数据经反相后出现在 端,再经 T2 反相后输 出到 P0 端口,输出数据经过两次倒相后相位不变,但是由于 T2 为漏极开输出,故此时必须 外接上拉电阻。 24 页 如有你有帮助,请购买下载,谢谢! 当 P0 口作输入时,由于信号即加载在 T2 上由被送入三态缓冲器,若该接口此前刚锁存 过数据“0”,则 T2 是导通的,T2 的输出被钳位在“0”电平,此时输入的“1”无法读入,所 以当 P0 口作为通用 I/O 口时,在输入数据前,必须向端口写“1”,使 T2 截止。不过当在访问 外部存储器时,CPU 会自动向 P0 口写“1”。 有时我们需要先将端口的数据读入,经过修改后再输出到端口,如果此时 P0 口的负载 正好是晶体管的基极,并且其输出为“1”,这必然导致该引脚为低,若此时读取引脚信号,则 会将刚输出的“1”误读为“0”,为了避免这类误读的错误,于是单片机还提供了读锁存器的功 能。例如执行 INC P0 时,CPU 先读 P0 锁存器中数据,然后再执行加 1 操作,最后将结果送回 P0 口。这样单片机从结构上满足了“读-修改-写”这类操作的需要。 2.3.2 P1 口 P1 口是一个准双向口,通常作为 I/O 口使用,其位结构图如图 2.7。由于在其输出端接 有上拉电阻,故可以直接输出而无需外接上拉电阻。同 P0 口一样,当作输入时,必须先向对应 的锁存器写“1”,使场效应管截止,同时值得一提的是它可以被任何数字逻辑电驱动,其中 包括 TTL 电,MOS 电和 OC 电。 图 2.7 P1 口位结构 2.3.3 P2 口 P2 口位结构图如图 2.8。P2 通用为一个准双向口,其位结构与 P0 口相似。当系统外接 片外存储器时,它输出高 8 位地址,此时 MUX 在 CPU 的控制下接通地址信号。同时它还可作 为通用 I/O 口使用,此时 MUX 接通锁存器的 Q 端。对于 8031 单片机来说,P2 口通常用作地 址信号输出。 图 2.8 P2 口位结构 2.3.4 P3 口 P3 口的位结构图如图 2.9。P3 口为双功能口,当 P3 口作为通用 I/O 口使用时,它为准 双向口,且每位都可定义为输入或输出口,其工作原理同 P1 口类似。 图 2.9P3 口位结构 P3 口还具有第二功能,其引脚描述如表 2-5。对于输出而言,此时相应位的锁存器必须 输出为“1”,这样才能有效输出第二功能。对于输入而言,无论该位是作为通用输入口还是作 为第二功能输入口,相应的锁存器和选择输出功能端都应置“1”,这个工作在开机或复位时完 成。 表 2-5 P3 口特殊功能 25 页 如有你有帮助,请购买下载,谢谢! 口线 特殊功能 RXD TXD T0 T1 信号名称 串行输入口 串行输出口 外部中断 0 输入口 外部中断 1 输入口 定时器 0 外部输入口 定时器 1 外部输入口 写选通输出口 读选通输出口 2.4 单片机的工作方式 2.4.1 复位及复位电 在 MCS-51 中,最常见的复位电为图 2.10 所示的上电复位电,它能有效的实现上 电复位和手动复位。RST 引脚是复位信号输入端,复位信号为高电平有效,其有效时间应持续 24 个振荡周期以上才能完成复位操作,若使用 6MHz 晶振,则需持续 4μ S 以上才能完成复位 操作。图 2.10 中,在通电瞬间,由于 RC 的充电过程,在 RST 端出现一定宽度的正脉冲,只要 该正脉冲保持 10ms 以上,就能使单片机自动复位,在 6MHz 时钟时,通常 CR 取 22μ F,R1 取 200Ω ,R2 取 1KΩ ,这时能可靠的上电复位和手动复位。 图 2.10 上电复位电 CPU 在第二个机器周期内执行内部复位操作,以后每个机器周期重复一次,直至 RST 端电平变低。在单片机复位期间,AlE 和 信号都不产生。复位操作将对部分专用寄存器 产生影响,复位后,这些内部寄存器状态如表 2-6。 表 2-6 部分专用寄存器复位状态 寄存器 PC B SP P0~P3 IE TCON TH0,TH1 SBUF 值 0000H 00H 07H 0FFH 000000 00H 00H 不定 寄存器 ACC PSW DPTR IP TMOD TL0,TL1 SCON PCON 值 00H 00H 0000H X00000 00H 00H 00H 0X0000 26 页 如有你有帮助,请购买下载,谢谢! 2.4.2 时钟电和时序 1. 时钟电 在 MCS-51 单片机片内有一个高增益的反相放大器,反相放大器的输入端为 XTAL1, 输出端为 XTAL2,由该放大器构成的振荡电和时钟电一起构成了单片机的时钟方式。根据 硬件电的不同,单片机的时钟连接方式可分为内部时钟方式和外部时钟方式,如图 2.11 所示。 (a)内部方式时钟电 (b)外接时钟电 图 2.11 时钟电 在内部方式时钟电中,必须在 XTAL1 和 XTAL2 引脚两端跨接石英晶体振荡器和两个 微调电容构成振荡电,通常 C1 和 C2 一般取 30pF,晶振的频率取值在 1.2MHz~12MHz 之间。 对于外接时钟电,要求 XTAL1 接地,XTAL2 脚接外部时钟,对于外部时钟信号并无特殊要 求,只要一定的脉冲宽度,时钟频率低于 12MHz 即可。 晶体振荡器的振荡信号从 XTAL2 端送入内部时钟电,它将该振荡信号二分频,产生 一个两相时钟信号 P1 和 P2 供单片机使用。时钟信号的周期称为状态时间 S,它是振荡周期的 2 倍,P1 信号在每个状态的前半周期有效,在每个状态的后半周期 P2 信号有效。CPU 就是以 两相时钟 P1 和 P2 为基本节拍协调单片机各部分有效工作的。 2. 指令时序 我们将单片机的基本操作周期称作机器周期,一个机器周期由 6 个状态组成,每个状态 由两个时相 P1 和 P2 构成,故一个机器周期可依次表示为 S1P1,S1P2,…,S6P1,S6P2,即 一个机器共有 12 个振荡脉冲。为了大家便于分析 CPU 的时序,在此先对以下几个概念作一介 绍。 (1)振荡周期 振荡周期指为单片机提供定时信号的振荡源的周期或外部输入时钟的周期。 (2)时钟周期 时钟周期又称作状态周期或状态时间 S,它是振荡周期的两倍,它分为 P1 节拍和 P2 节 拍,通常在 P1 节拍完成算术逻辑操作,在 P2 节拍完成内部寄存器之间的传送操作。 (3)机器周期 一个机器周期由 6 个状态组成,如果把一条指令的执行过程分作几个基本操作,则将完成 一个基本操作所需的时间称作机器周期。单片机的单周期指令执行时间就为一个机器周期。 (4)指令周期 指令周期即执行一条指令所占用的全部时间,通常为 1~4 个机器周期。 在图 2.12 中给出了 MCS-51 单片机的典型取指、执行时序。由图可知,在每个机器周期 内,地址锁存信号 ALE 两次有效,一次在 S1P2 与 S2P1 之间,另一次在 S4P2 和 S5P1 之间。 图 2.12 MCS-51 单片机取指、执行时序 27 页 如有你有帮助,请购买下载,谢谢! 从图 2.12 我们可以看出,对于单周期指令,当操作码被送入指令寄存器后,指令的执行 从 S1P2 开始。若对于双字节单周期指令,则在同一机器周期的 S4 期间读入第二个字节。如果 是单字节单周期指令,则在 S4 期间仍然保持读操作,但所进行的读操作为无效操作,同时程序 计数器 PC 并不加 1。 在图 2.12(a)和(b)给出了单字节单周期和双字节单周期指令的时序,这些操作都在 S6P2 结束时完成指令操作。 在图 2.12(c)中给出了单字节双周期指令时序,在两个机器周期内进行了四次读操作,由 于是单字节指令,故后面的三次读操作是无效的。 在图 2.12(d)中给出了访问外部数据存储器指令 MOVX 的时序,它是一条单字节双周 期指令。在执行 MOVX 指令期间,外部数据存储器被访问且选通时跳过两次取指操作,其中在 第一个机器周期 S5 开始送出片外数据存储器的地址后,进行读、写数据,在此期间并无 ALE 信号,故第二周期不产生取指操作。 2.4.3 单片机的低功耗方式 对于 MCS-51 系列机型来说,它们有待机方式和掉电方式两种低功耗方式。通过 设置电源控制寄存器 PCON 的相关位可以确定当前的低功耗方式。PCON 寄存器格式如下: 位序 B7 B6 B5 B4 B3 B2 位符号 SMOD / / / GF1 GF0 其中 SMOD:波特率倍增位 GF0,GF1:通用标志位 PD:掉电方式位,PD=1 为掉电方式 IDL:待机方式位,IDL=1 为待机方式 B1 B0 PD IDL 1.待机方式 将 PCON 寄存器的 IDL “1”,单片机则进入待机方式。此时,振荡器仍然处于工作 状态,并且向中断逻辑、串行口和定时器/计数器电提供时钟,但是向 CPU 提供时钟的电 被断开,因此 CPU 停止工作。通常在待机方式下,单片机的中断仍然可以使用,这样可以通过 中断触发方式退出待机模式。 2. 掉电方式 将 PCON 寄存器的 PD “1”,单片机则进入掉电方式。如果单片机检测到电源 电压过低,此时除进行信息外,还需将 PD 位被置“1”,使单片机进入掉电方式。此 时,单片机停止工作,但是内部 RAM 中的数据仍被保存。如果单片机有备用电源如 80C51, 待电源正常后,硬件复位信号维持 10ms 后使单片机推出掉电方式。 28 页 如有你有帮助,请购买下载,谢谢! 第 3 章 MCS-51 单片机指令系统 难点 ? MCS-51 单片机的寻址方式 ? 数据传送指令和算术运算指令的使用 ? 位操作和控制转移类指令的使用 要求 掌握: ? MCS-51 单片机的寻址方式 ? 指令系统的基本格式 ? 指令系统的操作功能 了解: ? 指令系统的基本格式 ? 操作数的使用方法 ? 指令系统的操作过程 3.1 MCS-51 单片机指令格式 计算机的指令系统是表征计算机性能的重要指标,每种计算机都有自己的指令系统。MCS —51 单片机的指令系统是一个具有 255 种代码的集合,绝大多数指令包含两个基本部分:操作 码和操作数。操作码表明指令要执行的操作的性质;操作数说明参与操作的数据或数据所存放 的地址。 MCS—51 指令系统中所有程序指令是以机器语言形式表示,可分为单字节、双字节、三字 节 3 种格式。 用二进制编码表示的机器语言由于阅读困难,且难以记忆。因此在微机控制系统中采用汇 编语言指令来编写程序。本章介绍 MCS—51 指令系统就是以汇编语言来描述的。 表 3-1 汇编指令与指令代码 代码字节 单字节 单字节 双字节 三字节 指令代码 84 A3 7410 B440 rel 汇编指令 DIV AB INC DPTR MOV A,#10H CJNE A,#40H,LOOP 指令周期 四周期 双周期 单周期 双周期 29 页 如有你有帮助,请购买下载,谢谢! 一条汇编语言指令中最多包含 4 个区段,如下所示: 标号: 操作码 目的操作数,源源操作数 ;注释 标号与操作码之间“:”隔开; 操作码与操作数之间用“空格”隔开; 目的操作数和源源操作数之间有“,”分隔; 操作数与注释之间用“;”隔开。 标号是由用户定义的符号组成,必须用英文大写字母开始。标号可有可无,若一条指令中 有标号,标号代表该指令所存放的第一个字节存储单元的地址,故标号又称为符号地址,在汇 编时,把该地址赋值给标号。 操作码是指令的功能部分,不能缺省。MCS—51 指令系统有 42 种助记符,代表了 33 种不同的功能。例如 MOV 是数据传送的助记符。 操作数是指令要操作的数据信息。根据指令的不同功能,操作数的个数有 3、2、1 或没有操作数。例如 MOV A,#20H,包含了两个操作数 A 和#20H,它们之间用“,”隔开。注释可有可无,加入注释主要为了便 于阅读,程序设计者对指令或程序段作简要的功能说明,在阅读程序或调试程序时将会带来很多方便。 3.2 寻址方式 所谓寻址方式,通常是指某一个 CPU 指令系统中的寻找操作数所在地址的方式,或 者说通过什么的方式找到操作数。寻址方式的方便与快捷是衡量 CPU 性能的一个重要方面, MCS—51 单片机有七种寻找方式。 3.2.1 立即数寻址 立即寻址方式是操作数包括在指令字节中,指令操作码后面字节的内容就是操作数本身, 其数值由程序员在编制程序时指定,以指令字节的形式存放在程序存储器中。立即数只能作为 源操作数,不能当作目的操作数。 例如: MOV A,#52H ;A?52H MOV DPTR,#5678H ;DPTR?5678H 立即寻址示意图如 3.1 所示。 图 3.1 立即寻址示意图 3.2.2 直接寻址 在指令中含有操作数的直接地址,该地址指出了参与操作的数据所在的字节地址或位地址。 例如: MOV A,52H MOV 52H,A MOV 50H,60H MOV IE,#40H ;把片内 RAM 字节地址 52H 单元的内容送累加器 A 中。 ;把 A 的内容传送给片内 RAM 的 52H 单元中。 ;把片内 RAM 字节地址 60H 单元的内容送到 50H 单元中。 ;把立即数 40H 送到中断允许寄存器 IE。IE 为专用功能寄存器,其字节 地 30 页 如有你有帮助,请购买下载,谢谢! 址为 0A8H。该指令等价于 MOV 0A8H,#40H。 INC 60H ;将地址 60H 单元中的内容自加 1。 图 3.2 直接寻址方式示意图 在 MCS-51 单片机指令系统中,直接寻址方式可以访问 2 种存储空间: (1)内部数据存储器的低 128 个字节单元(00H~7FH) (2)80H~FFH 中的(SFR)特殊功能寄存器。 这里要注意,指令 MOV A,#52H 与 MOV A,52H 指令的区别,后者表示把片内 RAM 字节地址为 52H 单元的内容传送到累加器(A)。 3.2.3 寄存器寻址 由指令指出某一个寄存器中的内容作为操作数,这种寻址方式称为寄存器寻址。寄存器一般 指累加器 A 和工作寄存器 R0~R7。例如: MOV A,Rn ;A?(Rn) 其中 n 为 0~7 之一,Rn 是工作寄存器。 MOV Rn,A ;Rn?(A) MOV B,A ;B?(A) 寄存器寻址方式的寻址范围包括: · 寄存器寻址的主要对象是通用寄存器,共有 4 组 32 个通用寄存器,但寄存器寻址只能使 用当前寄存器组。因此指令中的寄存器名称只能是 R0~R7。在使用本指令前,需通过对 PSW 中 RS1、RS0 位的状态设置,来进行当前寄存器组的选择。 · 部分专用寄存器。累加器 A、B 寄存器以及数据指针 DPTR 等。 3.2.4 寄存器间接寻址方式 由指令指出某一个寄存器的内容作为操作数,这种寻址方式称为寄存器间接寻址。这里要注意,在寄存器间 接寻址方式中,存放在寄存器中的内容不是操作数,而是操作数所在的存储器单元地址。 寄存器间接寻址只能使用寄存器 Ro 或 Rl 作为地址指针,来寻址内部 RAM(00H~FFH)中 的数据。寄存器间接寻址也适用于访问外部 RAM,可使用 R0,Rl 或 DPTR 作为地址指针。寄 存器间接寻址用符号“@”表示。例如: MOV R0,#60H ;R0?60H MOV A, @R0 ;A ? ((R0)) MOV A ,@R1 ;A ? ((R1)) 指令功能是把 Ro 或 R1 所指出的内部 RAM 地址 60H 单元中的内容送累加器 A。假定 (60H)=3BH,则指令的功能是将 3BH 这个数送到累加器 A。 例如, MOV DPTR,#3456H ;DPTR?3456H MOVX A,@DPTR ;A ?((DPTR)) 是把 DPTR 寄存器所指的那个外部数据存储器(RAM)的内容传送给 A,假设(3456H) =99H,指令运行后(A)=99H。 同样,MOVX @DPTR,A;MOV @R1,A;也都是寄存器间接寻址方式。寄存器 间接寻址方式的示意图如图 3.3 所示。 图 3.3 寄存器间接寻址方式示意图 3.2.5 位寻址 MCS-51 单片机中设有的位处理器。位操作指令能对内部 RAM 中的位寻址区(20H~ 31 页 如有你有帮助,请购买下载,谢谢! 2FH)和某些有位地址的特殊功能寄存器进行位操作。也就是说可对位地址空间的每个位进行 位状态传送、状态控制、逻辑运算操作。例如指令 SETB TR0 ;TR0?1 CLR 00H ;(00H)?0 MOV C,57H ;将 57H 位地址的内容传送到位累加器 C 中 ANL C,5FH ;将 5FH 位状态与进位位 C 相与,结果在 C 中 3.2.6 基址寄存器加变址寄存器间接寻址 这种寻址方式用于访问程序存储器中的数据表格,它以基址寄存器(DPTR 或 PC)的内容 为基本地址,加上变址寄存器 A 的内容形成 16 位的地址,访问程序存储器中的数据表格。例 如; MOVC A,@A + DPTR MOVC A,@A + PC JMP @A+DPTR MOVC A,@A+DPTR 图 3.4 变址寻址方式示意图 3.2.7 相对寻址 相对寻址以程序计数器 PC 的当前值作为址,与指令中给出的相对偏移量 rel 进行相 加,把所得之和作为程序的转移地址。这种寻址方式用于相对转移指令中,指令中的相对偏移 量是一个 8 位带符号数,用补码表示。可正可负,转移的范围为-128~+127。使用中应注意 rel 的范围不要超出。例如: JZ LOOP DJNE R0,DISPLAY 3.3 指令系统 3.3.1 指令分类 MCS-51 指令系统有 42 种助记符,代表了 33 种功能,指令助记符与各种可能的寻址方式相 结合,共构成 111 条指令。在这些指令中,单字节指令有 49 条,双字节指令有 45 条,三字节 指令有 17 条;从指令执行的时间来看,单周期指令有 64 条,双周期指令有 45 条,只有乘法、 除法两条指令的执行时间是 4 个机器周期。 按指令的功能,MCS-51 指令系统可分为下列 5 类: (1)数据传送类指令(29 条) (2)算术运算类指令(24 条) (3)逻辑运算及移位类指令(24 条) (4)位操作类指令(17 条) (5)控制转移类指令(17 条) 在分类介绍指令前,先把描述指令的一些符号的意义作一简单介绍。 Rn―当前选定的寄存器区中的 8 个工作寄存器 R0~R7,即 n=0~7。 32 页 如有你有帮助,请购买下载,谢谢! Ri―当前选定的寄存器区中的 2 个寄存器 R0、R1,i=0、1。 Direct—8 位内部 RAM 单元的地址,它可以是一个内部数据区 RAM 单元(00H~7FH)或 特殊功能寄存器地址(I/O 端口、控制寄存器、状态寄存器 80H~0FFH)。 #data—指令中的 8 位。 #data16—指令中的 16 位。 addr16—16 位的目的地址,用于 LJMP、LCALL,可指向 64KB 程序存储器的地址空间。 addr11—11 位的目的地址,用于 AJMP、ACALL 指令。目的地址必须与下一条指令的第一 个字节在同一个 2KB 程序存储器地址空间之内。 rel—8 位带符号的偏移量字节,用于 SJMP 和所有条件转移指令中。偏移量相对于下一条 指令的第一个字节计算,在—128~+127 范围内取值。 bit—内部数据 RAM 或特殊功能寄存器中的可直接寻址位。 DPTR—数据指针,可用作 16 位的地址寄存器。 A—累加器 B—寄存器,用于 MUL 和 DIV 指令中。 C—进位标志或进位位。 @—间接寄存器或基址寄存器的前缀,如@Ri,@DPTR。 /—位操作的前缀,表示对该位取反。 (X)—X 中的内容。 ((X))—由 X 寻址的单元中的内容。 ←—箭头左边的内容被箭头右边的内容所替代。 3.3.2 数据传送类指令 数据传送类指令一般的操作是把源操作数传送到指令所指定的目标地址。指令执行后,源 操作数保持不变,目的操作数为原操作数所替代 数据传送类指令用到的助记符有:MOV,MOVX,MOVC,XCH,XCHD,PUSH,POP, SWAP。 数据一般传送指令的助记符“MOV”表示 格式: MOV [目的操作数],[源操作数] 功能:目的操作数?(源操作数中的数据) 源操作数可以是:A、Rn、direct、@Ri、#data 目的操作数可以是:A、Rn、direct、@Ri 数据传送指令一般不影响标志,只有一种堆栈操作可以直接修改程序状态字 PSW,这样, 可能使某些标志位发生变化。 1. 以累加器为目的操作数的内部数据传送指令 MOV MOV MOV MOV A,Rn A,direct A,@Ri A,#data ;A?(Rn) ;A?(direct) ;A?((Ri)) ;A?data 这组指令的功能是:把源操作数的内容送入累加器 A。例如:MOV A,#10H,该指令执行 33 页 如有你有帮助,请购买下载,谢谢! 时,将立即数 10H(在 ROM 中紧跟在操作码后)送入累加器 A 中。 2. 数据传送到工作寄存器 Rn 的指令 MOV MOV MOV Rn,A Rn,direct Rn,#data ;Rn?(A) ;Rn?(direct) ;Rn?data 这组指令的功能是:把源操作数的内容送入当前工作寄存器区的 R0~R7 中的某一个寄存 器。指令中 Rn 在内部数据存储器中的地址由当前的工作寄存器区选择位 RS1、RS0 确定,可以 是 00H~07H、08H~0FH、10H~17H、18H~1FH。例如:MOV R0,A,若当前 RS1、RS0 设置为 00(即工作寄存器 0 区),执行该指令时,将累加器 A 中的数据传送至工作寄存器 R0(内 部 RAM 00H)单元中。 3. 数据传送到内部 RAM 单元或特殊功能寄存器 SFR 的指令 MOV direct,A ;direct?(A) MOV direct,Rn ;direct?(Rn) MOV direct1,direct2 ;direct1?(direct2) MOV direct,@Ri ;direct?((Ri)) MOV direct,#data ;direct?#data MOV @Ri,A ;(Ri?(A) MOV @Ri,direct ;(Ri)?(direct) MOV @Ri,#data ;(Ri)?data MOV DPTR,#data16 ;DPTR?data16 这组指令的功能是:把源操作数的内容送入内部 RAM 单元或特殊功能寄存器。其中第三 条指令和最后一条指令都是三字节指令。第指令的功能很强,能实现内部 RAM 之间、特 殊功能寄存器之间或特殊功能寄存器与内部 RAM 之间的直接数据传送。最后一条指令是将 16 位的立即数送入数据指针寄存器 DPTR 中。 片内数据 RAM 及寄存器的数据传送指令 MOV、PUSH 和 POP 共 18 条,如图 3.5 所示。 图 3.5 片内RAM及寄存器的数据传送指令 4. 累加器 A 与外部数据存储器之间的传送指令 MOVX A,@DPTR ;A?(DPTR) MOVX A,@Ri ;A?((Ri)) MOVX @DPTR,A ;(DPTR)?A MOVX @Ri,A ;(Ri)? A 这组指令是:在累加器 A 与外部数据存储器 RAM 单元或 I/O 口之间进行数据传送前两条 指令执行时,P3.7 引脚上输出 有效信号,用作外部数据存储器的读选通信号;后两条指令 34 页 如有你有帮助,请购买下载,谢谢! 执行时,P3.6 引脚上输出 有效信号,用作外部数据存储器的写选通信号。DPTR 所包含的 16 位地址信息由 P0(低 8 位)和 P2(高 8 位)输出,而数据信息由 P0 口传送,P0 口作分时 复用的总线。由 Ri 作为间接寻址寄存器时,P0 口上分时 Ri 指定的 8 位地址信息及传送 8 位数 据,指令的寻址范围只限于外部 RAM 的低 256 个单元。 片外数据存储器数据传送指令 MOVX 共 4 条,如图 3.6 所示。 图 3.6 片外数据存储器数据传送指令 5. 程序存储器内容送累加器 MOVC A,@A+PC MOVC A,@A+DPTR 这是两条很有用的查表指令,可用来查找存放在外部程序存储器中的表格。第一条指 令是以 PC 作为基址寄存器,A 的内容作为无符号数和 PC 的内容(下一条指令的起始地址)相 加后得到一个 16 位的地址,并将该地址指出的程序存储器单元的内容送到累加器 A。这条指令 的优点是不改变特殊功能寄存器 PC 的状态,只要根据 A 的内容就可以取出表格中的。缺 点是表格只能放在该条指令后面的 256 个单元之中,表格的大小受到了,而且表格只能被 一段程序所利用。 第二条指令是以 DPTR 作为基址寄存器,累加器 A 的内容作为无符号数与 DPTR 内容相加, 得到一个 16 位的地址,并把该地址指出的程序存储器单元的内容送到累加器 A。这条指令的执 行结果只与指针 DPTR 及累加器 A 的内容有关,与该指令存放的地址无关,因此,表格的大小 和可以在 64KB 程序存储器中任意安排,并且一个表格可以为各个程序块所公用。 程序存储器查表指令 MOVC 共 2 条,如图 3.7 所示。 6. 堆栈操作指令 图 3.7 片外数据存储器数据传送指令 PUSH direct POP direct 在 MCS-51 单片机的内部 RAM 中,可以设定一个先进后出、后进先出的区域,称其为堆 栈。在特殊功能寄存器中有一个堆栈指针 SP,它指出栈顶的。进栈指令的功能是:首先将 堆栈指针 SP 的内容加 1,然后将直接地址所指出的内容送入 SP 所指出的内部 RAM 单元;出 栈指令的功能是:将 SP 所指出的内部 RAM 单元的内容送入由直接地址所指出的字节单元,接 着将 SP 的内容减 1。 例如:进入中断服务程序时,把程序状态寄存器 PSW、累加器 A、数据指针 DPTR 进栈保 护。设当前 SP 为 60H。则程序段 PUSH PSW PUSH ACC PUSH DPL PUSH DPH 执行后,SP 内容修改为 64H,而 61H、62H、63H、64H 单元中依次栈入 PSW、A、DPL、DPH 35 页 如有你有帮助,请购买下载,谢谢! 的内容,当中断服务程序结束之前,如下程序段(SP 保持 64H 不变) POP DPH POP DPL POP ACC POP PSW 指令执行之后,SP 内容修改为 60H,而 64H、63H、62、61H 单元的内容依次弹出到 DPH、 DPL、A、PSW 中。 MCS-51 提供一个向上的堆栈,因此 SP 设置初值时,要充分考虑堆栈的深度,要留出适当 的单元空间,满足堆栈的使用。 7. 字节交换指令 数据交换主要是在内部 RAM 单元与累加器 A 之间进行,有整字节和半字节两种交换。 (1) 整字节交换指令 XCH XCH XCH A,Rn A,direct A,@Ri (2)半字节交换指令 ;(A)?(Rn) ;(A)?(direct) ;(A)?((Ri)) 字节单元与累加器 A 进行低 4 位的半字节数据交换。只有一条指令。 XCHD A,@Ri (3)累加器高低半字节交换指令 只有一条指令: SWAP A 【例 3-1】(R0)=30H,(A)=65H,(30H)=8FH 执行指令:XCH A,@R0 ;(R0)=30H,(A)=8FH,(30H)=65H XCHD A,@R0 ;(R0)=30H,(A)=6FH,(30H)=85H SWAP A ;(A)=56H 数据交换指令 XCH、XCHD、和 SWAP 共 5 条,如图 3.8 所示。 图 3.8 数据交换指令 3.3.3 算术运算类指令 算术运算类指令共有 24 条,包括加、减、乘、除 4 种基本算术运算指令,这 4 种指令能对 8 位的无符号数进行直接运算,借助溢出标志,可对带符号数进行补码运算;借助进位标志, 可实现多精度的加、减运算,同时还可对压缩的 BCD 码进行运算,其运算功能较强。算术指令 36 页 如有你有帮助,请购买下载,谢谢! 用到的助记符共有 8 种:ADD、ADDC、INC、SUBB、DEC、DA 、MUL、DIV。 算术运算指令执行结果将影响进位标志(Cy),辅助进位标志(Ac)、溢出标志位(Ov)。 但是加 1 和减 1 指令不影响这些标志。对标志位有影响的算术运算指令见表 3-10 中,×表示指 令运算的结果使该标志位或复位。 1. 加法指令 加法指令分为普通加法指令、带进位加法指令和加 1 指令。 (1)普通加法指令 ADD A,Rn ;A?(A)+(Rn) ADD A,direct ;A?(A)+(direct) ADD A,@Ri ;A?(A)+((Ri)) ADD A,#data ;A?(A)+ data 这组指令的功能是将累加器 A 的内容与第二操作数相加,其结果放在累加器 A 中。相加过 程中如果位 7(D7)有进位,则进位标志 Cy 置“1”,否则清“0”;如果位 3(D3)位有进位, 则辅助进位标志 Ac 置“1”,否则清“0”。 对于无符号数相加,若 Cy 置“1”,说明和数溢出(大于 255)。对于带符号数相加时,和 数是否溢出(大于+127 或小于-128),则可通过溢出标志 OV 来判断,若 OV 置为“1”,说明和 数溢出。 【例 3-2】(A)=85H,R0=20H,(20H)=0AFH,执行指令: ADD A,@R0 结果:(A)=34H;Cy=1;AC=1;OV=1。 对于加法,溢出只能发生在两个加数符号相同的情况。在进行带符号数的加法运算时,溢 出标志 OV 是一个重要的编程标志,利用它可以判断两个带符号数相加,和数是否溢出。 (2)带进位加法指令 ADDC A,Rn ;A?(A)+(Rn)+(Cy) ADDC A,direct ;A?(A)+(direct)+(Cy) ADDC A,@Ri ;A?(A)+((Ri))+(Cy) ADDC A,#data ;A?(A)+ data+(Cy) 这组指令的功能与普通加法指令类似,唯一的不同之处是,在执行加法时,还要将上一次 进位标志 Cy 的内容也一起加进去,对于标志位的影响也与普通加法指令相同。 【例 3-3】(A)=85H,(20H)=0FFH,Cy=1 执行指令: ADDC A,20H 结果:(A)=85H;Cy=1;AC=1;OV=0。 (3)增量指令 INC A ;A?(A)+1 INC Rn ;Rn ?(Rn)+1 INC direct ;direct ?(direct)+1 INC @Ri ;(Ri)?((Ri))+1 INC DPTR ;DPTR ?(DPTR)+1 37 页 如有你有帮助,请购买下载,谢谢! 这组指令的功能是:将指令中指出的操作数的内容加 1。若原来的内容为 0FFH,则加 1 后 将产生溢出,使操作数的内容变成 00H,但不影响任何标志。最后一条指令是对 16 位的数据指 针寄存器 DPTR 执行加 1 操作,指令执行时,先对低 8 位指针 DPL 的内容加 1,当产生溢出时 就对高 8 位指针 DPH 加 1,但不影响任何标志。 【例 3-4】(A)=12H,(R3)=0FH,(35H)=4AH,(R0)=56H,(56H)=00H 执行如下指令:INC A ;执行后(A)=13H INC R3 ;执行后(R3)=10H INC 35H ;执行后(35H)=4BH INC @R0 ;执行后(56H)=01H (4)十进制调整指令 DA A 这条指令对累加器 A 参与的 BCD 码加法运算所获得的 8 位结果进行十进制调整,使累加 器 A 中的内容调整为二位压缩型 BCD 码的数。使用时必须注意,它只能跟在加法指令之后, 不能对减法指令的结果进行调整,且其结果不影响溢出标志位。 执行该指令时,判断 A 中的低 4 位是否大于 9,若满足大于则低 4 位做加 6 操作; 同样,A 中的高 4 位大于 9 则高 4 位加 6 操作。 例如:有两个 BCD 数 36 与 45 相加,结果应为 BCD 码 81,程序如下: MOV A,#36H ADD A,#45H DA A 这段程序中,第一条指令将立即数 36H(BCD 码 36H)送入累加器 A;第二条指令进行如 下加法: 得结果 7BH;第指令对累加器 A 进行十进制调整,低 4 位(为 0BH)大于 9,因此要 加 6,最后得到调整的 BCD 码 81。 2. 减法指令 (1)带进位减法指令 SUBB A,Rn ;A?(A)-(Rn)-(Cy) SUBB A,direct ;A?(A)-(direct)-(Cy) SUBB A,@Ri ;A?(A)-(Ri)-(Cy) SUBB A,#data ;A?(A)-data-(Cy) 这组指令的功能是:将累加器 A 的内容与第二操作数及进位标志相减,结果送回到累加器 A 中。在执行减法过程中,如果位 7(D7)有借位,则进位标志 Cy 置“1”,否则清“0”;如果 位 3(D3)有借位,则辅助进位标志 AC 置“1”,否则清“0”。若要进行不带借位的减法操作, 则必须先将 Cy 清“0” (2)减 1 指令 DEC A ;A?(A)-1 DEC Rn ;Rn?(Rn)-1 DEC direct ;direct?(direct)-1 DEC @Ri ;(Ri)?((Ri))-1 38 页 如有你有帮助,请购买下载,谢谢! 这组指令的功能是:将指出的操作数内容减 1。如果原来的操作数为 00H,则减 1 后将产 生溢出,使操作数变成 0FFH,但不影响任何标志。 3. 乘法指令 乘法指令完成单字节的乘法,只有一条指令: MUL AB 这条指令的功能是:将累加器 A 的内容与寄存器 B 的内容相乘,乘积的低 8 存放在累加器 A 中,高 8 位存放于寄存器 B 中,如果乘积超过 0FFH,则溢出标志 OV 置“1”,否则清“0”, 进位标志 Cy 总是被清“0”。 【例 3-5】(A)=50H,(B)=0A0H,执行指令: MUL AB 结果:(B)=32H,(A)=00H(即乘积为 3200H),Cy=0,OV=1。 4. 除法指令 除法指令完成单字节的除法,只有一条指令: DIV AB 这条指令的功能是:将累加器 A 中的内容除以寄存器 B 中的 8 位无符号整数,所得商的整 数部分放在累加器 A 中,余数部分放在寄存器 B 中,清进位标志 Cy 和溢出标志 OV 为“0”。 若原来 B 中的内容为 0,则执行该指令后 A 与 B 中的内容不定,并将溢出标志置“1”,在任何 情况下,进位标志 Cy 总是被清“0”。 算术运算类指令包括:ADD、ADDC、SUBB、MUL、DIV、INC、DEC 和 DA,如图 3.9 所示。 图 3.9 算术运算类指令 3.3.4 逻辑运算指令 逻辑运算指令共有 24 条,分为简单逻辑操作指令、逻辑与指令、逻辑或指令和逻辑异或指 令。逻辑运算指令用到的助记符有 CLR、CPL、ANL、ORL、XRL、RL、RLC、RR、RRC。 1. 简单逻辑操作指令 CLR A CPL A RL A RLC A RR A RRC A ;对累加器 A 清“0” ;对累加器 A 按位取反 ;累加器 A 的内容向左循环移 1 位 ;累加器 A 的内容带进位标志向左循环移 1 位 ;累加器 A 的内容向右循环移 1 位 ;累加器 A 的内容带进位标志向右循环移 1 位 循环左移指令示意图:RL A 39 页 如有你有帮助,请购买下载,谢谢! 循环右移指令示意图:RR A 带进位的循环左移指令示意图:RLC A 带进位的循环右移指令示意图:RRC A 这组指令的功能是:对累加器 A 的内容进行简单的逻辑操作除了带进位的移位指令外,其 他都不影响 Cy、AC、OV 等标志。示意图可以帮助我们进一步理解循环移位指令。 2.逻辑与指令 ANL A,Rn ;A?(A)?(Rn) ANL ANL A,direct A,@Ri ;A?(A)?(direct) ;A?(A)?((Ri)) ANL A,#data ;A?(A)? data ANL ANL direct,A direct,#data ;direct?(direct)?(A) ;direct?(direct)? data 这组指令的功能是:将两个操作数的内容按位进行逻辑与操作,并将结果送回目的操作数的 单元中。 【例 3-6】(A)=37H,(R0)=0A9H 执行指令: ANL A,R0 结果:(A)=21H 3. 逻辑或指令 ORL A,Rn ;A?(A)?(Rn) ORL A,direct ;A?(A)?(direct) ORL A,@Ri ;A?(A)?((Ri)) ORL A,#data ;A?(A)? data ORL direct,A ;direct ?(direct)?(A) ORL direct,#data ;direct ?(direct)? data 这组指令的功能是:将两个操作数的内容按位进行逻辑或操作,并将结果送回目的操作数的单元中。 【例 3-7】(A)=37H,(P1)=09H 执行指令: ORL P1,A 结果:(A)=3FH 4. 逻辑异或指令 XRL XRL XRL XRL A,Rn A,direct A,@Ri A,#data ;A?(A)?(Rn) ;A?(A)?(direct) ;A?(A)?((Ri)) ;A?(A)? data 40 页 如有你有帮助,请购买下载,谢谢! XRL XRL direct,A direct,#data ;direct ?(direct)?(A) ;direct ?(direct)?data 这组指令的功能是:将两个操作数的内容按位进行逻辑异或操作,并将结果送回目的操作数的单元中。 图 3.10 逻辑运算类指令 3.3.5 控制转移类指令 控制转移指令共有 17 条,不包括按布尔变量控制程序转移指令。其中有 64K 范围的长调 用、长转移指令;2KB 范围的绝对调用和绝对转移指令;有全空间的长相对转移和一页范围内 的短相对转移指令;还有多种条件转移指令。由于 MCS-51 提供了较丰富的控制转移指令,因 此在编程上相当灵活方便。这类指令用到的助记符共有 10 种:AJMP、LJMP、SJMP、JMP、 ACALL、LCALL、JZ、JNZ、CJNE、DJNZ。 1. 无条件转移指令 (1)绝对转移指令 AJMP addr11 这是 2KB 范围内的无条件跳转指令,执行该指令时,先将 PC+2,然后将 addr11 送入 PC10~ PC0,而 PC15~PC11 保持不变。这样得到跳转的目的地址。需要注意的是,目标地址与 AJMP 后一条指令的第一个字节必须在同一个 2KB 区域的存储器区域内。这是一条二字节指令,其指 令格式为: A10 A9 A8 A7 A6 A5 操作过程可表示为:PC?(PC)+2 00001 A4 A3 A2 A1 A0 PC10~0?addr11 例如程序存储器的 2070H 地址单元有绝对转移指令: 2070H AJMP 16AH(000B) 因此指令的机器代码为: 00100001 01101010 程序计数器 Pc 当前=PC+2=2070H+02H=2072H,取其高 5 位 00100 和指令机器代码给出的 11 位地址 000 最后形成的目的地址为:0010 0001 0110 1010B=216AH。 (2)相对转移指令 SJMP rel 执行指令时,先将 PC+2,再把指令中带符号的偏移量加到 PC 上,得到跳转的目的地址送 入 PC。 目标地址=源地址+2+rel 源地址是 SJMP 指令操作码所在的地址。相对偏移量 rel 是一个用补码表示的 8 位带符号数, 转移范围为当前 PC 值的-128~+127 共 256 个单元。 41 页 如有你有帮助,请购买下载,谢谢! 若偏移量 rel 取值为 FEH(-2 的补码),则目标地址等于源地址,相当于动态停机,程序终 止在这条指令上,停机指令在调试程序时很有用。MCS-51 没有专用的停机指令,若要求动态 停机可用 SJMP 指令来实现: HERE:SJMP HERE; 动态停机(80H,FEH) 或写成:HERE SJMP $ ;“$”表示本指令首字节所在单元的地址,使用它可省略标 号。 (3)长跳转指令 LJMP addr16 ;PC ?addr16 执行该指令时,将 16 位目标地址 addr16 装入 PC,程序无条件转向指定的目标地址。转移 指令的目标地址可在 64KB 程序存储器地址空间的任何地方,不影响任何标志。 (4)间接转移指令(散转指令) JMP @A+DPTR ;PC ?(A)+(DPTR) 这条指令的功能是把累加器 A 中的 8 位无符号数与数据指针 DPTR 的 16 位数相加(模 216), 相加之和作为下一条指令的地址送入 PC 中,不改变 A 和 DPTR 的内容,也不影响标志。间接 转移指令采用变址方式实现无条件转移,其特点是转移地址可以在程序运行中加以改变。例如, 当把 DPTR 作为址且确定时,根据 A 的不同值就可以实现多分支转移,故一条指令可完成 多条条件判断转移指令功能。这种功能称为散转功能,所以间接指令又称为散转指令。 2. 条件转移指令 JZ rel JNZ rel ;(A)=0 转移 ;(A)≠0 转移 这类指令是依据累加器 A 的内容是否为 0 的条件转移指令。条件满足时转移(相当于一条 相对转移指令),条件不满足时则顺序执行下面一条指令。转移的目标地址在以下一条指令的起 始地址为中心的 256 个字节范围之内(-128~+127)。当条件满足时, PC←(PC)+2+ rel,其中(PC)为该条件转移指令的第一个字节的地址。 3. 比较转移指令 在 MCS-51 中没有专门的比较指令,但提供了下面 4 条比较不相等转移指令; CJNE A,direct,rel ;(A)?(direct)转移 CJNE A,#data,rel ;(A)? data 转移 CJNE CJNE Rn,#data,rel @Ri,#data,rel ;(Rn)? data 转移 ;((Ri))? data 转移 这组指令的功能是:比较前面两个操作数的大小,如果它们的值不相等则转移。转移地址 的计算方法与上述两条指令相同。如果第一个操作数(无符号整数)小于第二个操作数,则进 位标志 Cy 置“1”,否则清“0”,但不影响任何操作数的内容。 4. 减 1 不为 0 转移指令 DJNZ Rn,rel DJNZ direct,rel ;Rn?(Rn)-1?0 转移 ;direct ?(direct)-1?0 转移 42 页 如有你有帮助,请购买下载,谢谢! 这两条指令把源操作数减 1,结果回送到源操作数中去,如果结果不为 0 则转移。 5. 调用及返回指令 在程序设计中,通常把具有一定功能的公用程序段编成子程序,当子程序需要使用子程序时用调用指令, 而在子程序的最后安排一条子程序返回指令,以便执行完子程序后能返回主程序继续执行。 (1)绝对调用指令 ACALL addr11 这是一条 2KB 范围内的子程序调用指令,其指令格式为; A10 A9 A8 1 0 0 0 1 A7 A6 A5 A4 A3 A2 A1 A0 执行该指令时,PC ?PC+2 SP?(SP)+1,(SP)?(PC)7~0 SP?(SP)+1,(SP)?(PC)15~8 PC10~0?addr11 (2)长调用指令 LCALL addr16 这条指令无条件调用位于 16 位地址 addr16 的子程序。执行该指令时,先 将 PC+3 以获得下条指令的首地址,并把它压入堆栈(先低字节后高字节),SP 内容加 2,然后 将 16 位地址放入 PC 中,转去执行以该地址为入口的程序。LCALL 指令可以调用 64KB 范围内 任何地方的子程序。指令执行后不影响任何标志。其操作过程如下: PC ?PC+3 SP?(SP)+1,(SP)?(PC)7~0 SP?(SP)+1,(SP)?(PC)15~8 PC10~0?addr16 (3)子程序返回指令 RET 子程序返回指令是把栈顶相邻两个单元的内容弹出送到 PC,SP 的内容减 2,程序返回 PC 值 所指的指令处执行。RET 指令通常安排在子程序的末尾,使程序能从子程序返回到主程序。 (4)中断返回指令 RETI 这是指令的功能与 RET 指令相类似。通常安排在中断服务程序的最后。 (5) 空操作指令 NOP ;PC ?PC+1 空操作也是 CPU 控制指令,它没有使程序转移的功能。只消耗一个机器周期的时间。常用 于程序的等待或时间的延迟。 图 3.11 条件转移类指令 3.3.6 位操作指令 MCS-51 单片机内部有一个性能优异的位处理器,实际上是一个一位的位处理器,它有自 43 页 如有你有帮助,请购买下载,谢谢! 己的位变量操作运算器、位累加器(借用进位标志 Cy)和存储器(位寻址区中的各位)等。 MCS-51 指令系统加强了对位变量的处理能力,具有丰富的位操作指令。位操作指令的操作对 象是内部 RAM 的位寻址区,即字节地址为 20H~2FH 单元中连续的 128 位(位地址为 00H~ 7FH),以及特殊功能寄存器中可以进行位寻址的各位。位操作指令包括布尔变量的传送、逻辑 运算、控制转移等指令,它共有 17 条指令,所用到的助记符有 MOV、CLR、CPL、SETB、ANL、 ORL、JC、JNC、JB、JNB、JBC 共 11 种。 在布尔处理机中,进位标志 Cy 的作用相当于 CPU 中的累加器 A,通过 Cy 完成位的传送 和逻辑运算。指令中位地址的表达方式有以下几种: (1)直接地址方式:如 0A8H; (2)点操作符方式:如 IE.0; (3)位名称方式:如 EX0 (4)用户定义名方式;如用伪指令 BIT 定义: WBZD0 BIT EX0 经定义后,允许指令中使用 WBZD0 代替 EX0 以上 4 种方式都是指允许中断控制寄存器 IE 中的位 0(外部中断 0 允许位 EX0),它的位 地址是 0A8H,而名称为 EX0,用户定义名为 WBDZ0。 1. 位数据传送指令 MOV C,bit ;Cy?(bit) MOV bit,C ;bit?(Cy) 这组指令的功能是:把源操作数指出的布尔变量送到目的操作数指定的位地址单元,其中 一个操作数必须为进位标志 Cy, 另一个操作数可以是任何可直接寻址位。 2. 位变量修改指令 CLR C ;Cy ?0 CLR bit ;bit ?0 CPL C ;Cy ?(Cy) CPL bit ;bit ?(bit) SETB C ;Cy ?1 SETB bit ;bit ?1 这组指令对操作数所指出的位进行清“0”、取反、置“1”的操作,不影响其它标志。 3. 位变量逻辑与指令 ANL C,bit ANL C,/bit 4. 位变量逻辑或指令 ;Cy ?(Cy)?(bit) ;Cy ?(Cy)?(/bit) ORL C,bit ;Cy ?(Cy)?(bit) 44 页 如有你有帮助,请购买下载,谢谢! ORL C,/bit ;Cy ?(Cy)?(/bit) 位操作类指令如图 3.12 所示。 5. 位变量条件转移指令 图 3.12 位操作类指令 JC rel ;若(Cy)=1,则转移 PC←(PC)+2+rel JNC rel ;若(Cy)=0,则转移 PC←(PC)+2+rel JB bit,rel ;若(bit)=1,则转移 PC←(PC)+3+rel JNB bit,rel ;若(bit)=0,则转移 JBC bit,rel ;若(bit)=1,则转移 PC←(PC)+3+rel PC←(PC)+3+rel,并 bit←0 这组指令的功能是:当某一特定条件满足时,执行转移操作指令(相当于一条相对转移指 令);条件不满足时,顺序执行下面的一条指令。前面 4 条指令在执行中不改变条件位的布尔值, 最后一条指令,在转移时将 bit 清“0”。 图 3.13 位条件转移指令 以上介绍了 MCS-51 指令系统,理解和掌握本章内容,是应用 MCS-51 单片机的一个重要 前提。 【例 3-8】指出下列程序段的每条指令的源操作数是什么寻址方式,并写出每步运算的结果。(相 关单元的内容)设程序存储器(1050H)=5AH: MOV A,#0FH MOV 30H,#0F0H MOV R2,A MOV R1,#30H MOV A,@R1 MOV DPTR,#1000H MOV A,#50H MOVC A,@ A+ DPTR ;A=0FH ,立即寻址 ;(30H)=F0H,立即寻址 ;R2=0FH ,寄存器寻址 ;R1=30H ,立即寻址 ;A=F0H ,寄存器间接寻址 ;DPTR=1000H,立即寻址 ;A=50H,立即寻址 ;A=5AH,基址变址寻址 45 页 如有你有帮助,请购买下载,谢谢! JMP @A+DPTR CLR C MOV 20H,C ;PC 目标=105AH,基址变址寻址 ;C=0,寄存器寻址 ;(20H)=0,寄存器寻址 【例 3-9】用数据传送指令实现下列要求的数据传送。 (1)R0 的内容输出到 R1。 (2)内部 RAM 20H 单元的内容传送到 A 中。 (3)外部 RAM 30H 单元的内容送到 R0。 (4)外部 RAM 30H 单元的内容送内部 RAM20H 单元。 (5)外部 RAM 1000H 单元的内容送内部 RAM 20H 单元。 (6)程序存储器 ROM 2000H 单元的内容送 R1。 (7)ROM 2000H 单元的内容送内部 RAM 20H 单元。 (8)ROM 2000H 单元的内容送外部 RAM 30H 单元。 (9)ROM 2000H 单元的内容送外部 RAM 1000H 单元。 解:(1) MOV A,R0 MOV R1,A (2) MOV A,20H (3) MOV R0,#30H 或 MOV R1,#30H MOVX A,@R0 MOV R0,A MOVX A,@R1 MOV R0,A (4) MOV R0,#30H MOVX A,@R0 MOV 20H,A (5) MOV DPTR,#1000H MOVX A,@1000H 或 MOV R1,#30H MOVX A,@R1 MOV 20H,A MOV 20H,A (6) MOV DPTR,#2000H CLR A MOVC A,@A+DPTR MOV R1,A (7) MOV DPTR,#2000H CLR A MOVC A,@A+DPTR MOV 20H,A (8) MOV DPTR,#2000H CLR A MOVC A,@A+DPTR MOV R0,#30H MOVX @R0,A (9) MOV DPTR,#2000H 46 页 CLR A MOVC A,@A+DPTR MOV DPTR,#1000H MOVX @DPTR,A 如有你有帮助,请购买下载,谢谢! 47 页 如有你有帮助,请购买下载,谢谢! 第 4 章 汇编语言程序设计 难点 ? 分支程序设计 ? 循环程序设计 ? 参数传递 要求 掌握: ? 伪指令 ? 程序流程图 ? 程序的三种基本结构 了解: ? 常用的编程算法 ? 手工汇编过程 4.1 汇编语言程序设计概述 所谓程序设计,就是按照给定的任务要求,编写出完整的计算机程序。要完成同样的任务, 使用的方法或程序并不是唯一的。因此,程序设计的质量将直接影响到计算机系统的工作效率、 运行可靠性。 前面我们学过了汇编语言形式的指令系统,本章重点介绍汇编语言程序结构以及如何利用 汇编语言指令进行程序设计的方法。 4.1.1 汇编语言程序设计步骤 使用汇编语言设计一个程序大致上可分为以下几个步骤。 (1) 分析题意,明确要求。解决问题之前,首先要明确所要解决的问题和要达到的目的、 技术指标等。 (2) 确定算法。根据实际问题的要求、给出的条件及特点,找出规律性,最后确定所采用 的计算公式和计算方法,这就是一般所说的算法。算法是进行程序设计的依据,它决定了程序 48 页 如有你有帮助,请购买下载,谢谢! 的正确性和程序的指令。 (3) 画程序流程图,用图解来描述和说明解题步骤。程序流程图是解题步骤及其算法进一 步具体化的重要环节,是程序设计的重要依据,它直观清晰的体现了程序的设计思。流程图 是用预先约定的各种图形、流程线及必要的文字符号构成的,标准的流程图符号如图 4.1 所示。 图 4.1 常用的流程图符号 (4) 分配内存工作单元,确定程序与数据区的存放地址。 (5) 编写源程序。流程图设计后,程序设计思比较清楚,接下来的任务就是选用合适的 汇编语言指令来实现流程图中每一框内的要求,从而编制出一个有序的指令流,这就是源程序 设计。 (6) 程序优化。程序优化的目的在于缩短程序的长度,加快运算速度和节省存储单元。如 恰当的使用循环程序和子程序结构,通过改进算法和正确使用指令来节省工作单元及减少程序 执行的时间。 (7) 上机调试、修改和最后确定源程序。只有通过上机调试并得出正确结果的程序,才能认 为是正确的程序。对于单片机来说,没有自开发的功能,需要使用仿真器或利用仿真软件进行 仿真调试,修改源程序中的错误,直至正确为止 4.2.2 伪指令语句 伪指令并不是真正的指令,也不产生相应的机器码,它们只是在计算机将汇编语言转换为 机器码时,指导汇编过程,告诉汇编程序如何汇编。下面介绍一些 MCS-51 汇编程序常用的伪 指令。 (1) 汇编起始伪指令 ORG 格式:[标号:] ORG 16 位地址 功能:程序块或数据块存放的起始地址。如: ORG 8000H START: MOV A ,#30H …… 该指令第一条指令从地址 8000H 单元开始存放,即标号 START 的值为 8000H。 (2) 汇编结束伪指令 END 49 页 如有你有帮助,请购买下载,谢谢! 格式:[标号:] END [表达式] 功能:结束汇编。 汇编程序遇到 END 伪指令后即结束汇编。处于 END 之后的程序,汇编程序不予处理。 例如: ORG 2000H START: MOV A ,# 00H …… END START 表示标号 START 开始的程序段结束。 (3) 等值指令 EQU 格式:字符名称 EQU 项 这里使用的“字符名称”不是标号,不能用“:”来作分隔符;其中的“项”可以是一个数 值,也可以是一个已经有定义的名字或可以求值的表达式。该指令的功能是将一个数或特定的 汇编符号赋予的字符名称。用 EQU 指令赋值以后的字符名称可以用作数据地址、代码地址、 位地址或直接当作一个立即数使用。因此,给字符名称所赋的值可以是 8 位数,也可以是 16 位 二进制数。 例如, TEST EQU R0 MOV A,TEST 这里将 TEST 等值为汇编符号 R0,在指令中 TEST 就可代替 R0 来使用。又例如, AB EQU 16 DELY EQU 1234H MOV A , AB LCALL DELY 50 页 如有你有帮助,请购买下载,谢谢! 这里 AB 赋值以后当作直接地址使用,而 DELY 被定义为 16 位地址,是一个子程序的入口。 使用 EQU 伪指令时必须先赋值,后使用;而不能先使用,后赋值。 (4) 定义字节指令 DB 格式:[标号:] DB 8 位二进制数表 DB 命令是从指定的地址单元开始,定义若干个 8 位内存单元的内容。主要是在程序存储 器的某一部分存入一组 8 位二进制数,或者是将一个数据表格存入程序存贮器。这个伪指令在 汇编以后,将影响程序存贮器的内容。例如, ORG 1000H TAB; DB 23H,73, “6”, “B” TABl: DB 110B 以上伪指令经汇编以后,将对从 1000H 开始的若干内存单元赋值: (1000H)=23H (1001H)=49H (1002H)=36H (1003H)=42H (1004H)=06H 其中 36H 和 42H 分别是字符 6 和 B 的 ASCII 码,其余的十进制数(73)和二进制数(110B) 也都换算为十六进制数了。 (5) 定义字命令 DW 格式:[标号:] DW 16 位二进制数表 定义字命令 DW 是从制定地址开始定义若干个 16 位数据。 一个 16 位数要占两个单元的存储器,其中高 8 位存入低地址单元,低 8 位存入高地址单元, 例如, ORG 1000H TAB: DW 1234H , 0ABH , 10 汇编后: 51 页 如有你有帮助,请购买下载,谢谢! (1000H) = 12H (1001H) = 34H (1002H) = 00H (1003H) = ABH (1004H) = 00H (1005H) = 0AH DB、DW 伪指令都只对程序存储器起作用,不能用来对数据存储器的内容进行赋值或进行其它初始化的工 作。 4.2 顺序程序设计 顺序结构程序是一种最简单、最基本的程序 ( 也称为简单程序 ) ,它是一种无分支的直线形程序,按照程 序编写的顺序依次执行。 【例 4-1 】 两个 8 位无符号数相加,和仍为 8 位。 假设两个无符号数 X 1 , X 2 分别存放于内部 RAM60H 、 61H 单元中,求其和并将和送入 62H 单元。 程序如下: ORG CLR MOV MOV 1NC ADDC 1NC MOV END 0000H C R0 , # 60H A , @R0 R0 A , @R0 R0 @R0 , A ;设 R0 为数据指针 ;取 X 1 ; X 1 +X 2 ;保存结果 【例 4-2 】两个无符号双字节数相加。设被加数存放在内部存储器 30H (高位字节)、 31H (低位字节) 单元,加数存放在内部存储器 40H (高位字节)、 41H (低位字节)单元,和存入 30H (高位字节)、 31H (低位字节)单元。 程序如下: ORG CLR MOV MOV MOV 0000H C R0 , #31H R1 , #41H A , @R0 ;将 C 清零 ;送被加数首址 ;送加数首址 ;取被加数低字节 52 页 如有你有帮助,请购买下载,谢谢! ADD MOV DEC DEC MOV ADDC MOV END A , @R1 @R0 , A R0 R1 A , @R0 A , @R1 @R0 , A ;两个低字节相加 ;低字节和存人被加数低字节 ;修改指针,指向被加数高字节 ;修改指针,指向加数高字节 ;取被加数高字节 ;高字节相加 ;存结果 【例 4-3 】编写 16 位二进制数求补程序 二进制数的求补可归结为“求反加 1 ”的过程,求反可用 CPL 指令实现;加 1 时应注意,加 1 只能加 在低 8 位的最低位上。因为现在是 16 位数,有两个字节,因此要考虑进位问题,即低 8 位取反加 1 ,高 8 位取反后应加上低 8 位加 1 时可能产生的进位,还要注意这里的加 1 不能用 INC 指令,因为 INC 指令不 影响 CY 标志。 程序如下: ORG MOV CPL ADD MOV MOV CPL ADDC MOV END 0200H A ,R0 A A ,#01H R2 ,A A ,R1 A A ,#00H R3 ,A ;低 8 位送 A ;取反 ;加 l ;存结果 ;高 8 位送 A ;取反 ;加进位 ;存结果 【例 4-4】编程将 20H 单元中的 8 位无符号二进制数转换成 3 位 BCD 码,并存放在 22H(百位) 和 21H(10 位,个位)两个单元中。 解 在 MCS—51 系列单片机中有除法指令,比较方便。因 8 位二进制数对应的十进制 数为 0~255,所以先将原数除以 100,商就是百位数的 BCD 码;余数作为被除数再除以 10, 商为 10 位数的 BCD 码;最后的余数就是个位数的 BCD 码,将 10 位、个位的 BCD 码合并到 一个字节中,将结果存人即可。 程序如下: ORG MOV MOV 1000H A ,20H B ,# 64H ;取数送 A ;除数 100 送 B 中 53 页 如有你有帮助,请购买下载,谢谢! DIV MOV MOV MOV DIV SWAP ORL MOV END AB 22H ,A A,B B , #0AH AB A A,B 21H , A ;商(百位数 BCD 码)在 A 中,余数在 B 中 ;百位数送 22H ;余数送 A 做被除数 ;除数 10 送 B 中 ;十位数 BCD 码在 A 中,个位数在 B 中 ;十位数 BCD 码移至高 4 位 ;并入个位数的 BCD 码 ;十位、个位 BCD 码存人 21H 4.3 分支程序设计 在很多实际问题中,都需要根据不同的情况进行不同的处理。这种思想体现在程序设计中,就是根据不同 条件而转到不同的程序段去执行,这就构成了分支程序。分支程序的结构有两种,如图 4.2 所示。 图 4.2 分支程序结构 图 4.2(a) 结构使用条件转移指令来实现分支,当给出的条件成立时,执行程序段A,否则执 行程序段B。 图 4.2 (b) 结构使用散转指令 JMP 来实现多分支转移,它首先将分支程序按序号的值来实现 分支转移。 分支程序的特点是改变程序的执行顺序,跳过一些指令,去执行另外一些指令。应注意:对每 一个分支都要单独编写一段程序,每一分支的开始地址赋给一个标号。 在编写分支程序时,关键是如何判断分支的条件。在 MCS-51 系列单片机中可以直接用来判断 分支条件的指令并不多,只有累加器为零(或不为零)、比较条件转移指令 CJNE 等,MCS-51 单片机还提供了位条件转移指令,如 JC,JB 等。把这些指令结合在一起使用,就可以完成各种 各样的条件判断。分支程序设计的技巧,就在于正确而巧妙的使用这些指令。 【例 4-5】设补码 X 放在内部 RAM30H 单元中,函数 Y 与 X 有如下的关系式: 试编写程序,根据 X 的值求出 Y,并放回原单元。 解 取出 X 后先做取值范围的判断,用累加器 A 状态转移指令判断 X 是否为 0,用位状态转 移指令判断 X 是大于 0 还是小于 0。程序流程图如图 4.3 所示。 程序如下: MOV A,30H JZ ZER0 JNB ACC.7,PLUS ADD A,#5 MOV 30H,A PLUS: SJMP $ ZERO: MOV 30H,#20H SJMP $ END 【例 4-6】内部 RAM40H 和 41H 单元中各有一无符号数,比较其大小,将大数存放于内部 RAM60H 单元,小数存放于内部 RAM61H 单元,如两数相等,则分别送往这 2 个单元。 54 页 如有你有帮助,请购买下载,谢谢! 解 用比较不等转移指令 CJNE 比较力两个无符号书,先确定它们是否相等,若不相等时再根 据借位标志确定这两个无符号书的大小。程序框图如图 4.4 所示。 程序如下: MOV A, 40H MOV 61H, 41H CJNE A, 41H, LOOP AJMP AGEQ LOOP: JNC AGEQ ;A≥(41H)则无借位 XCH A, 61H ;A<(41H)有借位 AGEQ: MOV 60H, A ;A 与(61H)交换 SJMP $ END 【例 4-7】某温度控制系统,采集的温度值(Ta)放在累加器 A 中。此外,在内部 RAM54H 单 元存放控制温度下(T54),在 55H 单元存放控制温度上(T55)。若 Ta T55,程序转 向 JW(降温处理程);若 TaT54,则程序转向 SW(升温处理程序);T55≥Ta≥T54,则程序 转向 FH(返回主程序)。 程序如下: CJNE A , 55H , ;Ta≠T55,转向 LOOPl LOOP1 AJMP FH ;Ta=T55,返回 LOOPl: JNC JW ;若(CY)=0,表明 TaT55,转降温处理 程序 CJNE A , 54H , ;Ta≠T54,转向 LOOP2 LOOP2 AJMP FH ;Ta=54,返回 LOOP2: JC SW ;若(CY)=1,表明 TaT54,转升温处理 程序 FH: RET ;T55≥Ta≥T54,返回主程序 【例 4-8】将 ASCII 码制转换为十六进制数。如果不是十六进制数得 ASCII 码,用户标志 1。 解:由 ASCII 码表知,30H~39H 为 0~9 的 ASCII 码,41H~46H 为 A~F 的 ASCII 码。在这 一范围的 ASCII 码减去 37H 就可以获得对应的十六进制。设 ASCII 码放在累加器 A 中,转换 结果放回 A 中。程序流程图如图 4.5 所示 程序如下: START:CLC C SUBB A, #30H JC NASC CJNE A, # 0AH,NN MM: JC ASC SUBB A, # 07H CJNE A, # 0AH, NN NN: JC NASC CJNE A, # 10H, LL 55 页 如有你有帮助,请购买下载,谢谢! LL: JC ASC NASC: SETB F0 ASC: RET 【例 4-9】N 分支程序,N≤8。要求程序根据其运行中所产生的寄存器 R3 的值,来决定如何进行分支。 解:为实现 N 分支,可以多次使用比较转移指令:CJNE R3, #data , rel 流程图如图 4.6 所时,但这样比 较次数太多,当 N 较大时,执行速度就较慢。 我们可以用变址寻址的转移指令 JMP@A+DPTR 使问题得到解决。首先安排存放一个转移分支入口 的地址表,把入口地址表的首地址送到 DPTR,再把 R3 的内容送累加器 A。现以 4 个分支为例写出程序。假设 4 个分支的不同功能分别是给不同的。 程序如下: MOV A ,R3 MOV DPTR ,#BRTAB MOVC A ,@A+DPTR JMP @A+DPTR BRTAB DB BR0-BRTAB DB BRl-BRTAB DB BR2-BRTAB DB BR3-BRTAB BR0: SETB P1.0 SJMP BRK BR1: SETB P1.1 SJMP BRK BR2: SETB P1.2 SJMP BRK BR3: SETB P1.3 BRK: SJMP BRK 4.4 循环程序设计 顺序程序和分支程序中的指令,最多只执行一次。在实际问题中重复地做某些事的情况是 很多的,用计算机来做这些事就要重复地执行某些指令。重复地执行某些指令,最好用循环程 序实现。 循环程序一般由 4 部分组成。 (1)置循环初值。即设置循环过程中有关工作单元的初始值,如置循环次数、地址 指针及工作单元清零等。 (2)循环体。即循环的工作部分,完成主要的计算或操作任务,是重复执行的程序 段。 56 页 如有你有帮助,请购买下载,谢谢! 这部分程序应特别注意,因为它要重复执行许多次,若能少写一条指令,实际上就 是少执行某条指令若干次,因此,应注意优化程序。 (3)循环修改。每循环一次,就要修改循环次数、数据及地址指针等。 (4)循环控制。根据循环结束条件,判断是否结束循环。 如果在循环程序的循环体中不再包含循环程序,即为单重循环程序。如果在循环体 中还包含有循环程序,那么这种现象就称为循环嵌套,这样的程序就称为二重循环程序 或三重以至多重循环程序。在多重循环程序中,只允许外重循环嵌套内重循环程序,而 不允许循环体互相交叉,也不允许从循环程序的外部跳入循环程序的内部。 图 4.7(a)结构是“先执行后判断”,适用于循环次数已知的情况。其特点是一进入循环, 先执行循环处理部分,然后根据循环次数判断是否结束循环。 图 4.7(b)结构是“先判断后执行”,适用于循环次数未知的情况。其特点是将循环控制 部分放在循环的入口处,先根据循环控制条件判断是否结束循环,若不结束,则执行循环 操作;若结束,则退出循环。 图 4.7 循环程序结构框图 【例 4-10】多个单字节数求知。 已知有 10 个单字节数,依次存放在内部 RAM 40H 单元开始的数据存储区中,求和并将结 果存人寄存器 R2、R3 中(高位存 R2,低位存 R3)。 本题中,要重复进行加法运算,因此采用循环结构程序。循环次数就是数据块字节数,这 是已知的。在置初值时,将数据块长度置人寄存器 R5;将数据块首地址送人寄存器 R0,即以 R0 作为数据块的地址指针,采用间接寻址方式:每做一次加法之后,修改地址指针,以便取出 下一个数来相加,并且使计数器 R5 减 l。到 R5 减为 0 时,求和结束。程序流程图如图 4.8 所示。 SUM: SUM: LP: LP1: ORG MOV MOV MOV MOV ADD JNC INC INC DJNZ MOV 2000H R0,#40H R5,#0AH A,#00H R2,A A,@R0 LP1 R2 R0 R5,LP R3,A ;设地址指针 ;计数器初值送 R5 ;若有进位,和的高八位+1 ;地址指针+1 ;判循环结束条件 ;存和的低八位 57 页 如有你有帮助,请购买下载,谢谢! END 【例 4-11】从内存 BLOCK 单元开始有一个无符号数的数据块,其长度为 LEN,试求出 其最大值,并存入 MAX 单元。 这是一个搜索问题。这里采用依次进行比较和取代的方法来寻找最大值。具体做法 是 :先 取 出 第 一 个 数 作 为 基 准 ,和 第 二 个 数 比 较 ,若 比 较 结 果 基 准 数 大 ,不 作 变 动 ;若 比 较 结 果 基 准 数 小 ,则 用 大 数 来 代 替 原 基 准 数 ,然 后 再 和 下 一 个 数 作 比 较 。到 比 较 结 束 时,基准数就是所求的最大值。 为了进行两数的比较,采用两数相减以后判断 CY 的值来确定哪个数大,这比用 CJNE 指令更简单。比较时将基准数放在累加器 A 中。若 A 中先放人零,比较次数等于 LEN; 若 A 中先放人第一个数,则比较次数等于 LEN-1。采用 R2 作为计数器,R1 作为地址指 针。程序流程如图 4.9 所示。 4.5 子程序设计 在用汇编语言编程时,应考虑到恰当地使用子程序,使整个程序的结构清楚,而且阅读和 理解方便。使用子程序还可以减少源程序和目标程序的长度。在多次调用同样的程序段时,采 用子程序就不必每次重复书写同样的指令,而只需书写一次。当然从程序的执行来看,每调用 一次子程序都要附加断点、进栈和出栈等操作,增加程序的执行时间。但一般来说,付出 这些代价总是值得的。 在汇编语言源程序中使用子程序时,一般要注意两个问题:参数传递和现场。参数传 递一般可采用以下方法: ·传递数据。将数据通过工作寄存器 R0~R7 或累加器来传送。即主程序和子程序在交接 处,上述寄存器和累加器存储的是同一参数。 ·传送地址。数据存放在数据寄存器中,参数传递时只通过 R0、R1、DPTR 传递数据所存 放的地址。 ·通过堆栈传递参数。在调用之前,先把要传送的参数压入堆栈,进入子程序之后,再将 压入堆栈的参数弹出到工作寄存器或者其他内存单元。 ·通过位地址传送参数。在进入汇编子程序时,特别是进入中断服务子程序时还应注意现 场问题,即对于那些不需要进行传递的参数,包括内存单元的内容、工作寄存器的内容, 以及各标志的状态等都不应因凋用子程序而改变。方法就是在进入子程序时,将需要的数 据推入堆栈,而空出这些数据所占用的工作单元,供在子程序中使用。在返回调用程序之前, 则将推入堆栈的数据弹出到原有的工作单元,恢复其原来的状态,使调用程序可以继续往下执 行。由于堆栈操作是“先入后出”,因此,先压入堆栈的参数应该后弹出,才能恢复原来的 58 页 如有你有帮助,请购买下载,谢谢! 状态。例如: SUBROU: PUSH ACC PUSH B PUSH R0 POP R0 POP B POP PSW POP ACC RET 至于每个具体的子程序是否需要现场,以及哪些参数应该,则应视具体情况而定。 调用子程序过程由调用指令完成,MCS-51 单片机有两条调用指令:ACALL addr11 和 ACAL addrl6。指令中的地址为子程序的入口地址,在汇编语言中通常用标号来代表。在执行 这二条指令时,单片机将当前的 PC 值压入堆栈。子程序的最后是返回指令 RET,这条指令将 堆栈的内容传入 PC 中,程序返回调用的地方继续运行。 在子程序执行过程中调用其他子程序,这种现象称为子程序嵌套。MCS-51 单片机允许多 重嵌套。 【例 4-15】单字节二进制数据转换为 BCD 码子程序 SBTOD。 功能:将单字节二进制数转换为三位 BCD 码。 入口:R2 中存放要转换的二进制数。 出口:(R0)给出百位 BCD 码的存放地址。(R0)+1 给出十位和个位 BCD 码的存放地址,高 半字节放十位,低半字节放个位。 占用寄存器:A,B,R0,R2。 程序如下: SBTOD: MOV PUSH SP,#60H ACC 59 页 如有你有帮助,请购买下载,谢谢! MOV MOV DIV MOV MOV XCH DIV SWAP ADD INC MOV POP RET A,R2 B,#64H AB @R0,A A,#0AH A,B A,B A A,B R0 @R0,A ACC ;取数 ;除以 100,(A)为百位数 ;存人(R0)单元 ;余数(B)送 A ;除以 10,得十位和个位 ;十位数放于高半字节 ;个位数放于低半字节 ;个位存入(R0)+1 单元 【例 4-16】将内部数据存储器某一单元中的一个字节的十六进制数转换成两位 ASCII 码,结果 存放在内部数据存储器的两个连续单元中。 假设一个字节的十六进制数在内部数据存储器 40H 单元,结果存于 41H、42H 单元中,用 堆栈进行参数传递。 程序如下: MAIN: MOV MOV MOV SWAP PUSH LCALL SP,#55H R1,#41H A,40H A ACC HEASC ASCII 码程序 ;R1 为存结果指针 ;取要转换的数据 ;先转换高位字节 ;压栈 ;调用低半字节转换成 HEASC: POP MOV INC PUSH LCALL POP MOV END MOV DEC DEC ACC @ R1 , A R1 40H HEASC ACC @ R1, A R0, SP R0 R0 ; 要转换的数据出栈 ;存高半字节转换结果 ;存低半字节转换结果 60 页 如有你有帮助,请购买下载,谢谢! TAB: XCH AND ADD MOVC XCH RET DB A, @R0 A, # 0FH A, #2 A, @A+PC A, @R0 ;取被转换数据 ;保留低半字节 ;修改 A ;查表 ;结果送回堆栈 30H,31H,32H,… 【例 4-17】求两个无符号数据块中的最大值。数据块的首地址分别为 60H 和 70H,每个数据块 的第一个字节都存放数据块的长度,结果存人 5FH 单元。 解 本例可采用分别求出两个数据块的最大值,然后比较其大小的方法,求最大值的过程 可采用子程序。 子程序名称:QMAX。 子程序入口条件:R1 中存有数据块首地址。出口条件:最大值在 A 中, 下面分别编写主程序和子程序。 主程序: ORG MOV MOV ACALL MOV MOV ACALL CJNE NEXT: MOV LP: 2000H SP,#2FH R1,#60H QMAX 40H,A R1,#70H QMAX A,40H,NEXT JNC LP A,40H MOV SJMP 5FH,A $ ;设堆栈指针 ;取第一数据块首地址送 R1 中 ;第一次调用求最大值子程序 ;第一个数据块的最大值暂存 40H ;取第二数据块首地址送 R1 中 ;第二次调用求最大值子程序 ;两个最大值进行比较 ;A 大,则转 LP ;A 小,则把 40H 中内容送人 A 子程序: QMAX: LP1: ORG MOV MOV CLR INC 2200H A,@R1 R2,A A R1 ;取数据块长度 ;R2 做计数器 ;A 清零,准备做比较 ;指向下一个数据地址 61 页 LP3: LP4: CLR SUBB JNC MOV SJMP ADD DJNZ RET C A,@R1 LP3 A,@R1 LP4 A,@R1 R2,LP1 如有你有帮助,请购买下载,谢谢! ;0+cY,准备做减法 ;用减法做比较 ;若 A 大,则转 LP3 ;A 小,则将大数送 A 中 ;五条件转 LP4 ;恢复 A 中值 ;计数器减 1,不为零,转继续比较 ;比较完,子程序返回 62 页 如有你有帮助,请购买下载,谢谢! 第 5 章 单片机存储器扩展技术 难点 ? 存储器扩展的编址技术 ? 系统总线的构成 ? 程序存储器、数据存储器的扩展 要求 掌握: ? 存储器扩展的编址技术 ? 系统总线的扩展形成 ? 扩展存储器与单片机的应用连接 了解: ? 存储器的分类 ? 存储器的性能指标 ? 访问外部程序、数据存储器的时序过程 5.1 存储器系统基本知识 按照存储介质不同,可以将存储器分为半导体存储器、磁存储器、激光存储器。 这里我们只讨论构成内存的半导体存储器。 按照存储器的存取功能不同,半导体存储器可分为只读存储器(Read Only Memory 简称 ROM)和随机存储器(Random Access Memory 简称 RAM) 1. 只读存储器(ROM) ROM 的特点是把信息写入存储器以后,能长期保存,不会因电源断电而丢失信息。计算机 在运行过程中,只能读出只读存储器中的信息,不能再写入信息。一般地,只读存储器用来存 放固定的程序和数据,如微机的程序、汇编程序、用户程序、数据表格等。根据编程方式 的不同,ROM 共分为以下 5 种: (1)掩模工艺 ROM 63 页 如有你有帮助,请购买下载,谢谢! 这种 ROM 是芯片制造厂根据 ROM 要存贮的信息,设计固定的半导体掩模版进行生产的。 一旦制出成品之后,其存贮的信息即可读出使用,但不能改变。这种 ROM 常用于批量生产, 生产成本比较低。微型机中一些固定不变的程序或数据常采用这种 ROM 存贮。 (2)可一次性编程 ROM(PROM) 为了使用户能够根据自己的需要来写 ROM,厂家生产了一种 PROM。允许用户对其进行一 次编程──写入数据或程序。一旦编程之后,信息就永久性地固定下来。用户可以读出和使用, 但再也无法改变其内容。 (3)紫外线擦除可改写 ROM(EPROM) 可改写 ROM 芯片的内容也由用户写入,但允许反复擦除重新写入。EPROM 是用电信号编 程而用紫外线擦除的只读存储器芯片。在芯片外壳上方的中央有一个圆形窗口,通过这个窗口 照射紫外线就可以擦除原有的信息。由于阳光中有紫外线的成分,所以程序写好后要用不透明 的标签封窗口,以避免因阳光照射而程序。EPROM 的典型芯片是 Intel 公司的 27 系列产品, 按存储容量不同有多种型号,例如 2716(2KB?8)、2732(4KB?8)、2764(8KB?8)、27128 (16KB?8)、27256(32KB?8)等,型号名称后的数字表示其存储容量。 (4)电擦除可改写 ROM(EEPROM 或 E2PROM) 这是一种用电信号编程也用电信号擦除的 ROM 芯片,它可以通过读写操作进行逐个存储 单元读出和写入,且读写操作与 RAM 存储器几乎没有什么差别,所不同的只是写入速度慢一 些。但断电后却能保存信息。典型 E2PROM 芯片有 28C16、28C17、2817A 等。 (5)快擦写 ROM(flash ROM) E2PROM 虽然具有既可读又可写的特点,但写入的速度较慢,使用起来不太方便。而 flash ROM 是在 EPROM 和 E2PROM 的基础上发展起来的一种只读存储器,读写速度都很快,存 取时间可达 70ns,存储容量可达 16MB?128MB。这种芯片可改写次数可从 1 万次到 100 万次。 典型 flash ROM 芯片有 28F256、28F516、AT89 等。 2. 随机存储器 RAM(也叫读写存储器) 读写存储器 RAM 按其制造工艺又可以分为双极型 RAM 和金属氧化物 RAM。 (1) 双极型 RAM 双极型 RAM 的主要特点是存取时间短,通常为几到几十纳秒(ns)。与下面提到的 MOS 型 RAM 相比,其集成度低、功耗大,而且价格也较高。因此,双极型 RAM 主要用于要 求存取时间短的微型计算机中。 64 页 如有你有帮助,请购买下载,谢谢! (2) 金属氧化物(MOS)RAM 用 MOS 器件构成的 RAM 又分为静态读写存储器(SRAM)和动态读写存储器(DRAM)。 ?静态 RAM(SRAM) 静态 RAM 的基本存储单元是 MOS 双稳态触发器。一个触发器可以存储一个二进制信息。 静态 RAM 的主要特点是,其存取时间为几十到几百纳秒(ns),集成度比较高。目前经常使用 的静态存储器每片的容量为几 KB 到几十 KB。SRAM 的功耗比双极型 RAM 低,价格也比较便 宜。 ?动态 RAM(DRAM) 动态 RAM 的存取速度与 SRAM 的存取速度差不多。其最大的特点是集成度特别高。其功 耗比 SRAM 低,价格也比 SRAM 便宜。DRAM 在使用中需特别注意的是,它是靠芯片内部的 电容来存贮信息的。由于存贮在电容上的信息总是要泄漏的,所以,每隔 2ms 到 4ms,DRAM 要求对其存贮的信息刷新一次。 ?集成 RAM(i RAM) 集成 RAM――Integrated RAM,缩写为 i RAM,这是一种带刷新逻辑电的 DRAM。由于 它自带刷新逻辑,因而简化与微处理器的连接电,使用它和使用 SRAM 一样方便。 ?非易失性 RAM(NVRAM) 非易失性 RAM――Non-Volatile RAM,缩写为 NVRAM,其存储体由 SRAM 和 EEPROM 两部分组合而成。正常读写时,SRAM 工作;当要保存信息时(如电源掉电),控制电将 SRAM 的内容复制到 EEPROM 中保存。存入 EEPROM 中的信息又能够恢复到 SRAM 中。 NVRAM 既能随机存取,又具有非易失性,适合用于需要掉电的场合。 1. 存贮容量 不同的存储器芯片,其容量不一样。通常用某一芯片有多少个存贮单元,每个存贮单元存 贮若干位来表示。例如,静态 RAM6264 的容量为 8KB?8bit,即它有 8K 个单元(1K=1024), 每个单元存贮 8 位(一个字节)数据。 2. 存取时间 存取时间即存取芯片中某一个单元的数据所需要的时间。在计算机工作时,CPU 在读写 RAM 时,它所提供的读写时间必须比 RAM 芯片所需要的存取时间长。如果不能满足这一点, 微型机则无法正常工作。 65 页 如有你有帮助,请购买下载,谢谢! 3. 可靠性 微型计算机要正确地运行,必然要求存储器系统具有很高的可靠性。内存的任何错误就足 以使计算机无法工作。而存储器的可靠性直接与构成它的芯片有关。目前所用的半导体存储器 芯片的平均故障间隔时间(MTBF)大概是(5?106∽1?108)小时左右。 4. 功耗 使用功耗低的存储器芯片构成存储器系统,不仅可以减少对电源容量的要求,而且还可以 提高存贮系统的可靠性。 5.3 访问外部程序、数据存储器的时序 单片机通过外部三总线来访问外部存储器,其过程可用 CPU 操作时序来说明。 控制信号有 ALE 和 ,P0 与 P2 口用作 16 位地址线 位数据线(传送指令代 码)。操作时序如图 5.3 所示,其操作过程如下。 (1) 在 S1P2 时刻产生 ALE 信号。 (2) 由 P0、P2 口送出 16 位地址,由于 P0 口送出的低 8 位地址只保持到 S2P2,所以要利用 ALE 的下降沿信号将 P0 口送出的低 8 位地址信号锁存到地址锁存器中。而 P2 口送出的高 8 位地址在 整个读指令的过程中都有效,因此不需要对其进行锁存。从 S2P2 起,ALE 信号失效。 (3) 从 S3P1 开始, 开始有效,对外部程序存储器进行读操作,将选中的单元中的指令 代码从 P0 口读入,S4P2 时刻, 失效。 (4) 从 S4P2 后开始第二次读入,过程与第一次相似。 图 5.3 MCS-51 系列单片机访问外部程序存储器的时序图 对外部数据存储器的访问是通过执行 MOVX 指令来实现的,MOVX 指令是一种单字节双 周期指令,从取指到执行需要 2 个机器周期的时间。 访问外部数据存储器的时序,分为读时序和写时序两种。控制信号用到 ALE、 、 , P0、P2 口作 16 位地址线 位数据线。读和写两种操作过程是基本相同的,惟一的不同 66 页 如有你有帮助,请购买下载,谢谢! 之处是,读时序用到的是 信号,写时序用到的是 其相应的操作时序如图 5.4 所示。 信号。下面以读时序为例进行介绍, 图 5.4 MCS-51 系列单片机访问外部数据存储器的时序图 访问外部数据存储器的操作过程如下: (1) 从第 1 次 ALE 有效到第 2 次 ALE 开始有效期间,P0 口送出外部 ROM 单元的低 8 位地 址,P2 口送出外部 ROM 单元的高 8 位地址,并在 有效期间,读入外部 ROM 单元中的 指令代码。 (2) 在第 2 次 ALE 有效后,P0 口送出外部 RAM 单元的低 8 位地址,P2 口送出外部 RAM 单元高 8 位地址。 (3) 在第 2 个机器周期,第 1 次 ALE 信号不再出现,此时 也失效,并在第 2 个机器 周期的 S1P1 时, 信号开始有效,从 P0 口读入选中 RAM 单元中的内容。 5.4 存储器扩展的编址技术 进行存储器扩展时,可供使用的编址方法有两种,即:线选法和译码法。 所谓线选法,就是直接以系统的地址作为存储芯片的片选信号,为此只需把高位地址线与 存储芯片的片选信号直接连接即可。特点是简单明了,不需增加另外电。缺点是存储空间不 连续。适用于小规模单片机系统的存储器扩展。 【例 5-1】现有 2K*8 位存储器芯片,需扩展 8K*8 位存储结构采用线选法进行扩展。 扩展 8KB 的存储器结构需 2KB 的存储器芯片 4 块。2K 的存储器所用的地址线 根地址线和片选信号与 CPU 的连接如表 5-1 所示。 表 5-1 80C51 与存储器的线 页 如有你有帮助,请购买下载,谢谢! 80C51 存储器 P0 口经锁存器锁存形成 A0~A7 与 A0~A7 相连 P2.0、P2.1、P2.2 与 A8~A10 相连 P0 口 与 D0~D7 相连 P2.3 与存储器 1 的片选信号 相 连 P2.4 与存储器 2 的片选信号 相 连 P2.5 与存储器 3 的片选信号 相 连 P2.6 与存储器 3 的片选信号 相 连 扩展存储器的硬件连接如图 5.5 所示。 图 5.5 线选法连线图 这样得到四个芯片的地址分配如表 5-2 所示 表 5-2 所示 线 …. A0 0 …. 0 1 0 1 1 1 0 1 …. 1 芯片 0 1 1 0 1 0 …. 0 2 0 1 1 0 1 1 …. 1 芯片 0 1 0 1 1 0 …. 0 3 0 1 0 1 1 1 …. 1 芯片 0 0 1 1 1 0 …. 0 4 0 0 1 1 1 1 …. 1 所谓译码法就是使用译码器对系统的高位地址进行译码,以其译码输出作为存 储芯片的片选信号。这是一种最常用的存储器编址方法,能有效地利用空间, 特点是存储空间连续,适用于大容量多芯片存储器扩展。 地址范围 7000H---77FFH 6800H---6FFFH 5800H---5FFFH 3800H—3FFFH 68 页 如有你有帮助,请购买下载,谢谢! 常用的译码芯片有:74LS139(双 2-4 译码器)和 74LS138(3-8 译码器) 等,它们的 CMOS 型芯片分别是 74HC139 和 74HC138。 ? 74LS139 译码器 74LS139 是 2-4 译码器,即对 2 个输入信号进行译码,得到 4 个输出状态。 其中: 为使能端,低电平有效。 A、B 为选择端,即译码信号输入。 ~ 为译码输出信号,低电平有效。 74LS139 的线 线 入端 选择 BA ×× 输出端 1111 0 000111 0 011011 0 101101 0 111110 ? 74LS138 译码器 74LS138 是 3-8 译码器,即对 3 个输入信号进行译码,得到 8 个输出状态。 其中:G1、 、 为使能端,用于引入控制信号。 、 低 电平有效,G1 高电平有效。 图 5.6 译码器管脚图 69 页 如有你有帮助,请购买下载,谢谢! 74LS138 的线 所示。 输入 使能 端 选择 输出端 G1 G2A G2B C B A 1 0 0 00 0 0 1 1 1 1 1 1 1 1 0 0 00 1 1 0 1 1 1 1 1 1 1 0 0 01 0 1 1 0 1 1 1 1 1 1 0 0 01 1 1 1 1 0 1 1 1 1 1 0 0 10 0 1 1 1 1 0 1 1 1 1 0 0 10 1 1 1 1 1 1 0 1 1 1 0 0 11 0 1 1 1 1 1 1 0 1 1 0 0 11 1 1 1 1 1 1 1 1 0 有一不满足条 ×× × 1 1 1 1 1 1 1 1 件 【例 5-2】现有 2K*8 位存储器芯片,需扩展 8K*8 位存储结构采用译码法进行扩展。扩展 8KB 的存储器结构需 2KB 的存储器芯片 4 块。2K 的存储器所用的地址线 根地址线 和片选信号与 CPU 的连接如表 5-5 所示。 表 5-5 80C51 与存储器的线 页 如有你有帮助,请购买下载,谢谢! P2.3、P2.4 作为 译码地址,译码输 存储器芯片的片 P2.6、P2.7 悬空。扩 5.7 所示。 图 5.7 采用 储器连线图 这样得到四 配如表 5-6 所示。 80C51 P0 口经锁存器锁存形成 A0~A7 P2.0、P2.1、P2.2 P0 口 P2.4 P2.3 0 0 0 1 1 0 1 1 存储器 与 A0~A7 相连 与 A8~A10 相连 与 D0~D7 相连 译码输出与存储器的片选信号连接 与存储器 1 的片选 信号 相连 与存储器 2 的片选 信号 相连 与存储器 3 的片选 信号 相连 与存储器 4 的片选 信号 相连 二-四译码器的 出作为扩展 4 个 选 信 号 , P2.5 、 展连线KB 存 个芯片的地址分 表 5-6 译码方式地址分配表 P2.7 P2.6 P2.5 P2.4 P2.3 0 0 000 芯片 1 0 0 000 0 0 001 芯片 2 0 0 001 0 0 010 芯片 3 0 0 0 1 0 0 0 0 1 1 芯片 4 0 0 0 1 1 P2.2 …. P0 0 …. 0 1 …. 1 0 …. 0 1 …. 1 0 …. 0 1 …. 1 0 …. 0 1 …. 1 地址范围 0000H---07FFH 0800H---0FFFH 1000H---17FFH 1800H—1FFFH 5.5 程序存储器(EPROM)的扩展 单片机在原理设计上程序存储器和数据存储器的地址空间是相互的,而且程序存储器 一般采用 EPROM 芯片,最大可扩展到 64KB 字节。 5.5.1 程序存储器扩展使用的典型芯片 71 页 如有你有帮助,请购买下载,谢谢! 以 2764 作为单片机程序存储器扩展的典型芯片为例进行说明。 1. 2764 的引线bit 的 EPROM 芯片,其管脚图如图 5.8 所示 ·A12~A0??13 位地址信号输入线 位数据,表明芯片的每个存贮单元存放一个字节(8 位 二进制数)。 · 为输入信号。当它有效低电平时,能选中该芯片,故 又称为 选片信号。 · 为输出允许信号。当 为低电平时,芯片中的数据可由 D7~ D0 输出。 · 为编程脉冲输入端。当对 EPROM 编程时,由此加入编程脉冲。读时 为 高电平。 图 5.8 EPROM2764 管脚图 2. 2764 的连接使用 图 5.9 SRAM6264 管脚图 ·地址线)一一相连。 存储器低 8 位地址线 口经过地址锁存器锁存得到的地址信号一一相连。 由于 P0 口是地址和数据分时复用的通道口,所以为了把地址信息分离出来保存,为外接存 储器提供低 8 位地址信息,一般须外加地址锁存器,并由 CPU 发出地址允许锁存信息 ALE 的 下降沿将地址信息锁存入地址锁存器中。单片机的 P2 口用作高位地址线及片选地址线 口输出具有锁存功能,故不必外加地址锁存器。 ·数据线)直接一一相连。 ·控制线的连接 系统扩展时常用到下列信号: 72 页 如有你有帮助,请购买下载,谢谢! (片外程序存储器取指信号)? (存储器输出信号)相连。 ALE(地址锁存允许信号) ? 通常接至地址锁存器锁存信号相连。 存储器 片选信号 ? 接地或用高位地址选通。 (片外/片内程序存储器选择信号), =0 选择片外程序存储器。 图 5.10 为系统扩展一片 EPROM 的最小系统。 图 5.10 单片 ROM 扩展连线图 存储器映像分析 分析存储器在存储空间中占据的地址范围,实际上就是根据连接情况确定其最低地址和最 高地址。图 5.10 所示,由于 P2.7、P2.6、P2.5 的状态与 2764 芯片的寻址无关,所以 P2.7、P2.6、P2.5 可为任意。从 000 到 111 共有 8 种组合,其 2764 芯片的地址范围是: 最低地址:0000H(A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A 0= 0000 0000 0000 0000) 最高地址:FFFFH (A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A 0=×××1 1111 1111 1111) 共占用了 64KB 的存储空间,造成地址空间的重叠和浪费。 5.6 数据存储器的扩展 数据存储器主要用来存取要处理的数据,在 MCS-51 系列单片机产品中片内数据存储器容量一般为 128~256 个字节。当数据量较大时,就需要在外部扩展 RAM 数据存储器。扩展容量最大可达 64KB 字节。 5.6.1 数据存储器的扩展概述 单片机与数据存储器的连接方法和程序存储器连接方法大致相同,简述如下: 1. 地址线的连接,与程序存储器连法相同。 2. 数据线的连接,与程序存储器连法相同。 3. 控制线的连接,主要有下列控制信号: 存储器输出信号 和单片机读信号 相连即和 P3.7 相连。 73 页 如有你有帮助,请购买下载,谢谢! 存储器写信号 和单片机写信号 相连即和 P3.6 相连。 ALE:其连接方法与程序存储器相同。 使用时应注意,访问内部或外部数据存储器时,应分别使用 MOV 及 MOVX 指令。 外部数据存储器通常设置二个数据区: (1) 低 8 位地址线寻址的外部数据区。此区域寻址空间为 256 个字节。CPU 可以使用下列读写指令来访问 此存贮区。 读存储器数据指令:MOVX A ,@Ri 写存储器数据指令:MOVX @Ri,A 由于 8 位寻址指令占字节少,程序运行速度快,所以经常采用。 (2) 6 位地址线寻址的外部数据区。当外部 RAM 容量较大,要访问 RAM 地址空间大于 256 个字节时,则 要采用如下 16 位寻址指令。 读存储器数据指令:MOVX A ,@DPTR 写存储器数据指令:MOVX @DPTR ,A 由于 DPTR 为 16 位的地址指针,故可寻址 64K RAM 字节单元。 5.6.2 数据存储器扩展使用的典型芯片 1. 数据存储器 SRAM 芯片 数据存储器扩展常使用随机存储器芯片,用的较多的是 Intel 公司的 6116 容量为 2KB 和 6264 容量为 8KB。 其性能见表 5-7 所示 下面以 6264 芯片为例进行说明,管脚图如图 5.9 所示。该芯片的主要引脚为: ·A12~A0 ??13 根地址线 根数据线 为片选信号。当 为低电平,CE2 为高电平时,选中 该芯片。 74 页 如有你有帮助,请购买下载,谢谢! · 为输出允许信号。当 OE 为低电平时,芯片中的数据可由 D7~D0 输出。 · 为数据写信号。 其工作方式如表 5-8 所示 2. 数据存储器扩展方法 (1) 单片数据存储器扩展 80C51 与 6264 的连接如表 5-9 所示。 表 5-9 80C51 与 6264 的线 经锁存器锁存形成 A0~A7 P2.0、P2.1、P2.2、P2.3、P2.4 D0~D7 6264 A0~A7 A8~A12 D0~D7 数据存储器扩展的硬件连接如图 5.11 所示。 图 5.11 单片 RAM 扩展连线) 多片数据存储器扩展 例如:用 4 片 6116 进行 8KB 数据存储器扩展,用译码法实现。 80C51 与 6116 的线、P2.1、P2.2 D0~D7 6116 A0~A7 A8~A10 D0~D7 二四译码器译码形成 译码控 A11 A12 制片选 0 0 ?CS4 0 1 ?CS3 1 0 ?CS2 1 1 ?CS1 75 页 如有你有帮助,请购买下载,谢谢! 存储器扩展电连接如图 5.12 所示。 图 5.12 多片 RAM 扩展连线图 闪速存储器(FLASHMEMORY),是可编程可擦除的 ROM(简称 PEROM),具有掉电情况下 信息可保存,且可以在线写入(写入前自动擦除)等特点,写入时可以按页连续字节写入,读出 也是快速的。它有比 EEPROM 更优越的性能和更低的价格。 下面以 AT29C256 芯片为例介绍闪速存储器的有关知识和使用。 1. 引脚功能和读写操作 AT29C256 芯片的容量为 32KB,引脚数量为 28 条,其引脚排列如图 5.13 所示。 主要引脚功能如下: A0~A14:地址线:三态双向数据线。 :片选信号线,低电平输入有效。 :输出允许(读允许)信号线,低电平输入有效。 :写允许信号线,低电平输入有效。 (1)读操作。当 =0, =0, =1 时,被选中单元的内容读出到双向数据线 上。当 处于高电平,输出线)写操作。外部数据写入 29C256 芯片时,数据要先装入其内部锁存器,装入时 =0, =1, =0,数据写入以页为单位进行,即要改写某一单元的内容,图 5.13 AT29C256 芯片 引脚排列图整页都要重写,没有被装入的字节内容被写成 0FFH,在写入过程中,在 或上 升沿之后的 150ns 内, 和 要再次有效,以便写入新的字节,整个写入周期中 和 应 64 次有效。当某次 和 上升沿后 150ns 内,没有 和 下降沿,则装入周期结 束,开始内部写入周期。 2. 主要性能 AT29C256 芯片的主要性能如表 5-11 所示。 表 5-11 AT290256 芯片主要性能 76 页 如有你有帮助,请购买下载,谢谢! 读 取 读 操 作 擦 除 页 写 入 擦除 读 写 维 持 电 时间 电压 电压 时间 时间 电流 流 90ns 5V 5V 10ns 10ns 80mA 0.3mA 3. MCS-51 单片机与 AT29C256 的接口 图 5.14 是 80C51 单片机与 AT29C256 芯片典型的接口电图。图 5.14 中,80C51 单片机的 和 相“与”后与 AT29C256 芯片的 端相连,80C51 的 与 AT29C256 芯片的 相连,可实现对 AT29C256 芯片的读写信号的选通,以上扩展的方法与数据存储器的扩展 方法相同,单片机访问它时,也使用 MOVX 指令。 图 5.14 80C51 单片机与 AT29C256 芯片的接口电 77 页 如有你有帮助,请购买下载,谢谢! 第 6 章 单片机的中断与定时系统 难点 中断优先级控制原则 中断响应过程 定时器/计数器的查询方式和中断方式的区别 要求 掌握: 中断控制的专用寄存器 中断响应过程 定时器/计数器的定时和计数功能 定时器/计数器的控制寄存器 定时器/计数器的工作方式 0、方式 1 和方式 2 了解: 中断的概念 单片机的单步执行方式 了解计时器/计数器 6.1 中断的基本概念 在 CPU 与外设交换信息时,存在着一个快速的 CPU 与慢速的外设之间的矛盾。为解决 这个问题,发展了中断的概念。 单片机在某一时刻只能处理一个任务,当多个任务同时要求单片机处理时,这一要求应该 怎么实现呢?通过中断可以实现多个任务的资源共享。 中断现象在现实生活中也会经常遇到,例如,你在看书——手机响了——你在书上作个记 号——你接通电话和对方聊天——谈话结束——从书上的记号处继续看书。这就是一个中断过 程。通过中断,你一个人在一特定的时刻,同时完成了看书和打电话两件事情。用计算机语言 来描述,所谓的中断就是,当 CPU 正在处理某项事务的时候,如果或者内部发生了紧急 事件,要求 CPU 暂停正在处理工作而去处理这个紧急事件,待处理完后,再回到原来中断的 地方,继续执行原来被中断的程序,这个过程称作中断。 从中断的定义我们可以看到中断应具备中断源、中断响应、中断返回这样三个要素。中断 源发出中断请求,单片机对中断请求进行响应,当中断响应完成后应进行中断返回,返回被中 断的地方继续执行原来被中断的程序。 6.2 MCS-51 单片机的中断系统 78 页 如有你有帮助,请购买下载,谢谢! 6.2.1 MCS-51 单片机的中断源 MCS-51 单片机的中断源共有两类,它们分别是:外部中断和内部中断 1. 外部中断源 外部中断 0( ):来自 P3.2 引脚,采集到低电平或者下降沿时,产生中断请求。 外部中断 1( ):来自 P3.3 引脚,采集到低电平或者下降沿时,产生中断请求。 2. 内部中断源 定时器∕计数器 0( T0 ):定时功能时,计数脉冲来自片内;计数功能时,计数脉冲来自 片外 P3.4 引脚。发生溢出时,产生中断请求。 定时器∕计数器 1( T1 ):定时功能时,计数脉冲来自片内;计数功能时,计数脉冲来自 片外 P3.5 引脚。发生溢出时,产生中断请求。 串行口:为完成串行数据传送而设置。单片机完成接受或发送一组数据时,产生中断请求。 6.2.2 中断控制的专用寄存器 MCS-51 单片机为用户提供了四个专用寄存器,来控制单片机的中断系统。 1. 定时器控制寄存器(TCON) 该寄存器用于保存外部中断请求以及定时器的计数溢出。进行字节操作时,寄存器地址为 88H。按位操作时,各位的地址为 88H~8FH。寄存器的内容及位地址表示如下: 位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 位符号 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 IT0 和 IT1——外部中断请求触发方式控制位 IT0 (IT1)=1 脉冲触发方式,下降沿有效 IT0 (IT1)=0 电平触发方式,低电平有效 IE0 和 IE1——外中断请求标志位 当 CPU 采样到 (或 )端出现有效中断请求时,IE0(IE1)位由硬件置“1”。 当中断响应完成转向中断服务程序时,由硬件把 IE (或 IE )清零。 TR0 和 TR1——定时器运行控制位 TR0 (TR1 )=0 定时器/计数器不工作 TR0 (TR1 )=1 定时器/计数器开始工作 TF0 和 TF1——计数溢出标志位 当计数器产生计数溢出时,相应的溢出标志位由硬件置“1”。当转向中断服务时,再由 硬件自动清“0”。计数溢出标志位的使用有两种情况:采用中断方式时,作中断请求标志位来 使用;采用查询方式时,作查询状态位来使用。 2. 串行口控制寄存器(SCON) 79 页 如有你有帮助,请购买下载,谢谢! 进行字节操作时,寄存器地址为 98H。按位操作时,各位的地址为 98H~9FH。寄存器的内 容及位地址表示如下: 位地 址 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H 位符 号 SM0 SM1 SM2 R EN TB8 RB8 TI RI 其中与中断有关的控制位共 2 位: TI——串行口发送中断请求标志位 当发送完一帧串行数据后,由硬件置“1”;在转向中断服务程序后,用软件清“0”。 RI——串行口接收中断请求标志位 当接收完一帧串行数据后,由硬件置“1”;在转向中断服务程序后,用软件清“0”。串 行中断请求由 TI 和 RI 的逻辑或得到。就是说,无论是发送标志还是接收标志,都会产生串行 中断请求。 3. 中断允许控制寄存器(IE) 进行字节操作时,寄存器地址为 0A8H。按位操作时,各位的地址为 0A8H~0AFH。寄存器 的内容及位地址表示如下: 位地址 0AFH 0AEH 0ADH 0ACH 0ABH 0AAH 0A9H 0A8H 位符号 EA / / ES ET1 EX1 ET0 EX0 其中与中断有关的控制位共 6 位: EA——中断允许总控制位 EA=0 中断总,所有中断 EA=1 中断总允许,总允许后中断的或允许由各中断源的中断允许控制位进行设置。 EX0 和 EX1——外部中断允许控制位 EX0(EX1)=0 外部中断 EX0(EX1)=1 允许外部中断 ET0 和 ET1——定时器/计数器中断允许控制位 ET0(ET1)=0 定时器/计数器中断 ET0(ET1)=0 允许定时器/计数器中断 ES——串行中断允许控制位 ES=0 串行中断 ES=1 允许串行中断 可见,MCS-51 单片机通过中断允许控制寄存器对中断的允许()实行两级控制。即 以 EA 位作为总控制位,以各中断源的中断允许位作为分控制位。当总控制位为时,关闭 整个中断系统,不管分控制为状态如何,整个中断系统为状态;当总控制位为允许时,开 放中断系统,这时才能由各分控制位设置各自中断的允许与。 MCS-51 单片机复位后(IE)=00H,因此中断系统处于状态。单片机在中断响应后不 会自动关闭中断。因此在转中断服务程序后,应根据需要使用有关指令中断,即以软件方 式关闭中断。 4. 中断优先级控制寄存器(IP) MCS-51 单片机的中断优先级控制比较简单,因为系统只定义了高、低 2 个优先级。高优 先级用“1”表示,低优先级用“0”表示。各中断源的优先级由中断优先级寄存器(IP)进行 80 页 如有你有帮助,请购买下载,谢谢! 设定。IP 寄存器地址 0B8H,位地址为 0BFH~0B8H。寄存器的内容及位地址表示如下: 位地址 0BFH 0BEH 0BDH 0BCH 0BBH 0BAH 0B9H 0B8H 位符号 / / / PS PT1 PX1 PT0 PX0 其中: PX0——外部中断 0 优先级设定位; PT0——定时中断 0 优先级设定位; PX1——外部中断 1 优先级设定位; PT1——定时中断 1 优先级设定位; PS——串行中断优先级设定位。 以上各位设置为“0”时,则相应的中断源为低优先级;设置为“1”时,则相应的中断源 为高优先级。 优先级的控制原则是: 低优先级中断请求不能打断高优先级的中断服务;但高优先级中断请求可以打断低优先级 的中断服务,从而实现中断嵌套。 如果一个中断请求已被响应,则同级的其它中断服务将被。即同级不能嵌套。 如果同级的多个中断同时出现,则按 CPU 查询次序确定哪个中断请求被响应。其查询次序 为:外部中断 0→定时中断→外部中断→定时中断→串行中断。 中断优先级控制,除了中断优先级控制寄存器之外,还有两个不可寻址的优先级状态触发 器。其中一个用于某一高优先级中断正在进行服务,从而屏蔽其它高优先级中断;另一个 用于某一低优先级中断正在进行服务,从而屏蔽其它低优先级中断,但不能屏蔽高优先级 的中断。此外,对于同级的多个中断请求查询的次序安排,也是通过专门的内部逻辑实现的。 上述四个专用寄存器的用途可以用图 6.1 说明。 图 6.1 MCS-51 中断系统 6.3 MCS-51 单片机的定时器/计数器 MCS-51 单片机内部共有两个 16 位可编程的定时器/计数器,即定时器 T0 和定时器 T1 它 们既有定时功能又有计数功能。 6.3.1 结构 定时器/计数器的基本结构如图 6.3 所示。基本部件是两个 8 位计数器(其中 TH1 和 TL1 是 T1 的计数器,TH0 和 TL0 是 T0 的计数器)。 图 6.3 定时器/计数器结构 在作定时器使用时,输入的时钟脉冲是由晶体振荡器的输出经 12 分频后得到的,所以定时 器也可看作是对单片机机器周期的计数器(因为每个机器周期包含 12 个振荡周期,故每一个机 器周期定时器加 1,可以把输入的时钟脉冲看成机器周期信号)。故其频率为晶振频率的 1/12。 如果晶振频率为 12MHz,则定时器每接收一个输入脉冲的时间为 1us。 当它用作对外部事件计数时,接相应的外部输入引脚 T0(P3.4)或 T1(P3.5)。在这种情 81 页 如有你有帮助,请购买下载,谢谢! 况下,当检测到输入引脚上的电平由高跳变到低时,计数器就加 1(它在每个机器周期的 S5P2 时采样外部输入,当采样值在这个机器周期为高,在下一个机器周期为低时,则计数器加 1)。 6.2.4 中断响应过程 中断响应过程为,中断源发出中断请求→对中断请求进行响应→执行中断服务程序→返回 主程序。这个过程可分为三个阶段来完成。 1. 中断采样 对于外部中断请求,中断请求信号来自于单片机外部,计算机要想知道有没有中断请求发 生,必须对信号进行采样。 ① 电平触发方式的外中断请求(IT0/IT1=0)采样到高电平时,表明没有中断请求,IE0 或 IE1 继续为“0”。采样到低电平时,IE0/IE1 由硬件自动置“1”,表明有外中断请求发生。 ② 脉冲触发式的外中断请求(IT0/IT1=1)在相邻的机器周期采样到的电平由高电平变为 低电平时,则 IE0/IE1 由硬件自动置“1”,否则为“0”。 2. 中断查询 由 CPU 测试 TCON 和 SCON 中的各个中断标志位的状态,确定有那个中断源发生请求, 查询时按优先级顺序进行查询,即先查询高优先级再查询低优先级。如果同级,按以下顺序查 询: →→ → →S 如果查询到有标志位为“1”,表明有中断请求发生,接着就从相邻的下一机器周期开始进 行中断响应。 3. 中断响应 当 CPU 查询到中断请求时,由硬件自动产生一条 LCALL 指令,LCALL 指令执行时,首先 将 PC 内容压入堆栈进行断点,再把中断入口地址装入 PC,使程序转向相应的中断区入口 地址。LCALL 指令的形式如下: LCALL addr16 ;addr16:中断入口地址 入口地址已由系统设定,如下: 中断源 入口地址 0003H T0 000BH 0013H T1 001BH S 0023H 从表中可以看出,每个中断区只有 8 个单元,很难安排下一个中断程序,一般是在中断入 口地址处加一条跳转指令,跳转到用户的服务程序入口。编写中断服务程序的格式一般如下: ORG 0000H SJMP MAIN ORG 0003H AJMP 1NJERRVP 82 页 如有你有帮助,请购买下载,谢谢! MAIN: ··· HERE: SJMP HERE 1NJERRVP: ··· ;中断响应程序 RETI 并不是所有的请求都被响应,当遇到下列情况之一时不响应这些中断请求: (1)CPU 正在处理一个同级或者高级的中断服务 (2)当前指令还没有执行完毕 (3)当前指令是 RET、RETI 或者是访问 IP、IE 的指令,执行完这些指令后,还必须再执 行一条指令,才响应中断请求。 注意:MCS-51 单片机对中断查询结果不作记忆,当有新的查询结果出现时,因为以上 原因而被拖延的查询结果将不复存在,其中断请求也就不能再被响应了。 6.2.5 中断请求的撤销 中断响应后,TCON 和 SCON 的中断请求标志位应及时撤销。否则意味着中断请求仍 然存在,有可能造成中断的重复查询和响应,因此需要在中断响应完成后,撤销其中断标志。 1. 定时中断请求的撤销 硬件自动把 TF0(TF1)清 0,不需要用户参与。 2. 串行中断请求的撤销 需要软件清零。 3. 外部中断请求的撤销 (1)脉冲触发方式的外中断请求撤销 中断标志位的清零是自动的,脉冲信号过后就不存在了,因此其撤销是自动的。 (2)电平触发方式的外中断请求撤销 中断标志位的清零是自动的,但是如果低电平持续存在,在以后的机器周期采样时,又会 把中断请求标志位(IE 0 /IE 1)置位。为此,需要外加电,把中断请求信号从低电平强制为 高电平。电如图 6.2 所示: 图 6.2 电平触发方式的外中断请求撤销 通过直接置位端 使中断请求信号强制从低电平变为高电平,要实现此功能需要在中断 入口地址处加入如下两条指令: ORL P1, ANL P1, #01H #0FEH 6.2.6 MCS-51 单步执行工作方式 所谓单步执行就是按一次键,CPU 执行一条指令。假设利用外部中断 0 实现。需要做两项 准备工作。 (1)建立单步执行的外部电,不按键时产生低电平,按键时产生高电平。 83 页 如有你有帮助,请购买下载,谢谢! (2)设置 为电平触发方式。 编写 的中断服务程序 P WAI T1: WAI T2: I MAI N: V ORG SJM 0000H MAIN ORG JNB JB RET 0003H P3.2 WAIT1 P3.2 WAIT2 , ;若 P3.2 为低电平,则 原地踏步 , ;若 P3.2 为高电平,则 原地踏步 MO IE, #81H CLR IT0 6.3 MCS-51 单片机的定时器/计数器 MCS-51 单片机内部共有两个 16 位可编程的定时器/计数器,即定时器 T0 和定时器 T1 它 们既有定时功能又有计数功能。 6.3.1 结构 定时器/计数器的基本结构如图 6.3 所示。基本部件是两个 8 位计数器(其中 TH1 和 TL1 是 T1 的计数器,TH0 和 TL0 是 T0 的计数器)。 图 6.3 定时器/计数器结构 在作定时器使用时,输入的时钟脉冲是由晶体振荡器的输出经 12 分频后得到的,所以定时 器也可看作是对单片机机器周期的计数器(因为每个机器周期包含 12 个振荡周期,故每一个机 器周期定时器加 1,可以把输入的时钟脉冲看成机器周期信号)。故其频率为晶振频率的 1/12。 如果晶振频率为 12MHz,则定时器每接收一个输入脉冲的时间为 1us。 当它用作对外部事件计数时,接相应的外部输入引脚 T0(P3.4)或 T1(P3.5)。在这种情 况下,当检测到输入引脚上的电平由高跳变到低时,计数器就加 1(它在每个机器周期的 S5P2 时采样外部输入,当采样值在这个机器周期为高,在下一个机器周期为低时,则计数器加 1)。 6.3.2 控制寄存器 对定时器/计数器进行控制的寄存器共有三个,它们分别是: 84 页 如有你有帮助,请购买下载,谢谢! 1. 定时器控制寄存器(TCON) 各位定义: 位 地址 位 符号 8 88 88 8 88 FH EH DH CH BH AH 9H 8H T TT TI I II F1 R1 F0 R0 E1 T1 E0 T0 TF0/TF1: 查询方式:中断,软件查询 TF0 的值,软件清“0” 中断方式:硬件查询 TF0 的值,硬件自动清“0” 其它各位在前面已作过介绍,在此不再赘述。 2. 工作方式寄存器(TMOD) 功能:确定定时器的工作方式及功能选择。不能位寻址,TMOD 各位的定义: D DDDD DDD 7 6 5 4 3 2 1 0 G MMG MM ATE 1 0 ATE 1 0 GATE:门控位 =0:定时器/计数器仅受 TR 的控制 =1:只有 为高电平,且 TR=1 时,定时器/计数器才工作 :功能选择位 =0:定时功能 =1:计数功能 M1 M0 :工作方式选择位 =00 方式 0 =01 方式 1 =10 方式 2 =11 方式 3 3. 中断允许控制寄存器(1E) 0 0 0 0 0 0 AFH AEH ADH ACH ABH AAH E / A E E E / S T1 X1 每一位的内容在前面已作详细介绍,在此不作赘述。 查询方式时:关闭中断,使用软件查询 TF0/TF1 中断方式时:中断,使用硬件自动查询 TF0/TF1 查询方式时:关闭中断,使用软件查询 TF0/TF1 中断方式时:中断,使用硬件自动查询 TF0/TF1 0 0 A9H A8H E E F0 X0 85 页 如有你有帮助,请购买下载,谢谢! 6.3.3 工作方式 MCS-51 的定时器/计数器共有四种工作方式。工作在方式 0、方式 1 和方式 2 时,定时器/ 计数器 0 和定时器/计数器 1 的工作原理完全一样,现以定时器/计数器 0 为例介绍前三种工作方 式。 1. 方式 0(M1M0=00) (1)电逻辑结构 方式 0 是 13 位计数结构的工作方式,其计数器由 TH0 全部 8 位和 TL0 的低 5 位构成。TL0 高三位弃之不用。图 6.4 是定时器/计数器 0 工作在方式 0 的逻辑结构。 图 6.4 定时器/计数器方式 0 逻辑结构 当 时,多转换开关接通振荡脉冲的 12 分频输出,13 位计数器以此作为计数脉冲, 这时实现定时功能。当 时,多转换开关接通计数引脚(T0),计数脉冲由外部引入, 当计数脉冲发生负跳变时,计数器加 1,这时实现计数功能。不管那种功能,当 13 位计数发生 溢出时,硬件自动把 13 位清零,同时硬件置位溢出标志位 TF0。 在这里需要说明门控位(GATE)的用途,当 GATE=0 时,或门输出的高电平与 无关, 此时与门的输出只受运行控制位 TR0 控制。如果 TR0=0,则与门输出为低电平,则模拟开关 断开,定时器/计数器不工作。如果 TR0=1,则与门输出为高电平,则模拟开关闭合,定时器/ 计数器工作。 当 GATE=1 时,只有 TR0 和 同时为高电平,定时器/计数器才工作,否则,定时器/ 计数器不工作。 (2)定时和计数的应用 计数范围:1~213 计数计算公式:计数值=213-计数初值 定时范围:1 机器周期~213 机器周期 定时计算公式:定时时间=(213-定时初值)×机器周期 如果晶振频率为 6MHz ,则最大定时时间为:213×1/6MHz×12=214( ) 2. 方式 1(M1M0=01) 方式 1 是 16 位计数结构的工作方式,其计数器由 TH0 全部 8 位和 TL0 的全部 8 位构成。 其逻辑电和工作情况与方式 0 完全相同,所不同的只是计数器的位数。MCS-51 单片机之所 以设置几乎完全一样的方式 0 和方式 1,是出于与 MCS-48 单片机兼容的要求。因为,MCS- 48 单片机的定时器/计数器是 13 位的计数结构。 定时和计数的应用 计数范围:1~216 计数计算公式:计数值=216-计数初值 定时范围:1 机器周期~216 机器周期 定时计算公式:定时时间=(216-定时初值)×机器周期 如果晶振频率为 6MHz ,则最大定时时间为:216×1/6MHz×12=217( ) 86 页 如有你有帮助,请购买下载,谢谢! 【例 6-1】设单片机晶振频率为 6MHZ,使用 T1 以工作方式 1,产生周期为 500 正方波,并由 P1.0 输出,以中断方式编程。 分析:题目的要求可用下图来表示。 的等宽 由上图可以看出只要使 P1.0 的电位每隔 250 取一次反即可。所以定时时间应取 250 。 1) 计算计数初值 设计数初值为 x,由定时计算公式知: 2) 专用寄存器的初始化 D DD D7 6 5 4 D DD D3 2 10 GA M M GA MM TE 1 0 TE 10 0 0 0 1 0 0 0 0 所以,TMOD 应设置为:10H 定时器/计数器 1 中断,所以 IE 应设置为:88H 3) 编写程序 O 0000 RG H S MAI JMP N O 001B RG H A INTT JMP 1 MAI N: M OV M TMO D, #10H IE , OV #88H M TH1, OV #0FFH M TL1, ;初始化 LOO P: HER E: OV S ETB S JMP #83H TR1 HER E ;启动 ;等待中 断 A LOO INT T1: JMP M OV M P TH1, ;中断响 #0FFH 应程序 TL1, OV #83H 87 页 如有你有帮助,请购买下载,谢谢! C P1.0 PL R ;中断返 ETI 回 3. 方式 2(M1M0=10) (1)电逻辑结构 电逻辑结构如图 6.5 所示,由图可以总结出方式 2 具有以下特点: 图 6.5 定时器/计数器方式 0 逻辑结构 8 位计数器 TL0 作计数器,TH0 作预置寄存器使用,计数溢出时,TH0 中的计数初值自动装入 TL0, 即 TL0 是一个自动恢复初值的 8 位计数器。 在使用时,要把计数初值同时装入 TL0 和 TH0 中。 优点是提高定时精度,减少了程序的复杂程度。 (2)定时和计数的应用 计数范围:1~28 计数计算公式:计数值=28-计数初值 定时范围:1 机器周期~28 机器周期 定时计算公式:定时时间=(28-定时初值)×机器周期 【例 6-2】 用定时器 1 以工作方式 2 实现计数,每计数 100,累加器进行加 1 操作,以查 询方式编写程序。 解: 1)计算计数初值 2)专用寄存器初始化 D DD D7 6 54 D DD D3 2 1 0 G MMG MM ATE 1 0 ATE 10 0 1 1 0 0 0 0 0 所以,TMOD=60H 使用查询方式,所以关闭中断,即 IE=00H 3) 程序设计 6.3.3 工作方式 MCS-51 的定时器/计数器共有四种工作方式。工作在方式 0、方式 1 和方式 2 时,定时器/ 计数器 0 和定时器/计数器 1 的工作原理完全一样,现以定时器/计数器 0 为例介绍前三种工作方 式。 1. 方式 0(M1M0=00) (1)电逻辑结构 方式 0 是 13 位计数结构的工作方式,其计数器由 TH0 全部 8 位和 TL0 的低 5 位构成。TL0 88 页 如有你有帮助,请购买下载,谢谢! 高三位弃之不用。图 6.4 是定时器/计数器 0 工作在方式 0 的逻辑结构。 图 6.4 定时器/计数器方式 0 逻辑结构 当 时,多转换开关接通振荡脉冲的 12 分频输出,13 位计数器以此作为计数脉冲, 这时实现定时功能。当 时,多转换开关接通计数引脚(T0),计数脉冲由外部引入, 当计数脉冲发生负跳变时,计数器加 1,这时实现计数功能。不管那种功能,当 13 位计数发生 溢出时,硬件自动把 13 位清零,同时硬件置位溢出标志位 TF0。 在这里需要说明门控位(GATE)的用途,当 GATE=0 时,或门输出的高电平与 无关, 此时与门的输出只受运行控制位 TR0 控制。如果 TR0=0,则与门输出为低电平,则模拟开关 断开,定时器/计数器不工作。如果 TR0=1,则与门输出为高电平,则模拟开关闭合,定时器/ 计数器工作。 当 GATE=1 时,只有 TR0 和 计数器不工作。 同时为高电平,定时器/计数器才工作,否则,定时器/ (2)定时和计数的应用 计数范围:1~213 计数计算公式:计数值=213-计数初值 定时范围:1 机器周期~213 机器周期 定时计算公式:定时时间=(213-定时初值)×机器周期 如果晶振频率为 6MHz ,则最大定时时间为:213×1/6MHz×12=214( ) 2. 方式 1(M1M0=01) 方式 1 是 16 位计数结构的工作方式,其计数器由 TH0 全部 8 位和 TL0 的全部 8 位构成。 其逻辑电和工作情况与方式 0 完全相同,所不同的只是计数器的位数。MCS-51 单片机之所 以设置几乎完全一样的方式 0 和方式 1,是出于与 MCS-48 单片机兼容的要求。因为,MCS- 48 单片机的定时器/计数器是 13 位的计数结构。 定时和计数的应用 计数范围:1~216 计数计算公式:计数值=216-计数初值 定时范围:1 机器周期~216 机器周期 定时计算公式:定时时间=(216-定时初值)×机器周期 如果晶振频率为 6MHz ,则最大定时时间为:216×1/6MHz×12=217( ) 【例 6-1】设单片机晶振频率为 6MHZ,使用 T1 以工作方式 1,产生周期为 500 的等宽 正方波,并由 P1.0 输出,以中断方式编程。 分析:题目的要求可用下图来表示。 由上图可以看出只要使 P1.0 的电位每隔 250 取一次反即可。所以定时时间应取 250 。 1) 计算计数初值 设计数初值为 x,由定时计算公式知: 2) 专用寄存器的初始化 D DD D7 6 54 DD D D3 2 1 0 89 页 如有你有帮助,请购买下载,谢谢! GA M M GA MM TE 10 TE 1 0 0 0 0 1 0 0 0 0 所以,TMOD 应设置为:10H 定时器/计数器 1 中断,所以 IE 应设置为:88H 3) 编写程序 S MAIN JMP O 0000H RG O 001BH RG A INTT1 JMP MAI N: M TMOD OV , #10H M IE , OV #88H M TH1 , OV #0FFH M TL1 , ;初始化 LOO P: HER E: OV S ETB S JMP #83H TR1 HERE ;启动 ;等待中 断 A LOOP INT T1: JMP M OV M TH1 , #0FFH TL1 , ;中断响 应程序 OV #83H C P1.0 PL R ;中断返 ETI 回 3. 方式 2(M1M0=10) (1)电逻辑结构 电逻辑结构如图 6.5 所示,由图可以总结出方式 2 具有以下特点: 图 6.5 定时器/计数器方式 0 逻辑结构 8 位计数器 90 页 如有你有帮助,请购买下载,谢谢! TL0 作计数器,TH0 作预置寄存器使用,计数溢出时,TH0 中的计数初值自动装入 TL0, 即 TL0 是一个自动恢复初值的 8 位计数器。 在使用时,要把计数初值同时装入 TL0 和 TH0 中。 优点是提高定时精度,减少了程序的复杂程度。 (2)定时和计数的应用 计数范围:1~28 计数计算公式:计数值=28-计数初值 定时范围:1 机器周期~28 机器周期 定时计算公式:定时时间=(28-定时初值)×机器周期 【例 6-2】 用定时器 1 以工作方式 2 实现计数,每计数 100,累加器进行加 1 操作,以查 询方式编写程序。 解: 1)计算计数初值 2)专用寄存器初始化 D DD D7 6 54 DD D D3 21 0 G MMG MM ATE 1 0 ATE 10 0 1 1 0 0 00 0 所以,TMOD=60H 使用查询方式,所以关闭中断,即 IE=00H 3) 程序设计 M IE,#00H ;中断 OV M TMOD, ;T1 工作在 OV #60H 方式 2,计数功 能 M TH1 , OV #9CH M TL1 , ;装载计数 OV #9CH 初值 STA S TR1 ;启动 RT: ETB DEL J TF1 , : BC LOOP A DEL JMP LO I A OP: NC ;溢出响应 程序 A START JMP 91 页 如有你有帮助,请购买下载,谢谢! 4. 方式 3(M1M0=11) 前面介绍的三种工作方式对两个定时器/计数器而言,工作原理是完全一样的。但在工作方 式 3 下,两个定时器工作原理却完全不同,因此要分开介绍。 (1)工作方式 3 下的定时器/计数器 0 在方式 3 下,定时器/计数器 0 被拆为两个的 8 位的计数器 TL0 和 TH0。其中 TL0 既 可以作为计数功能使用,又可以作定时功能使用,享用定时器/ 计数器 0 的运行控制位 TR0 和 溢出标志位 TF0。对于 TH0,只能作定时器使用,由于定时器/ 计数器 0 的运行控制位 TR0 和 溢出标志位 TF0 已被 TL0 占用,因此 TH0 占用了定时器/计数器 1 的运行控制位 TR1 和溢出标 志位 TF1。即定时的启动和停止受 TR1 的状态控制,而计数溢出时则置位 TF1。 (2)工作方式 3 下的定时器/计数器 1 当定时器/计数器 0 工作在方式 3 时,定时器/计数器 1 只能工作在方式 0、方式 1 和方式 2。在这种情况下定时器/计数器 1 只能作波特率发生器使用,以确定串行通信的速率。作波特 率发生器使用时,只要设置好工作方式,便可自动运行。如果要停止工作,只需要把定时器/计 数器 1 设置在工作方式 3 就可以了。因为定时器/计数器 1 不能工作在方式 3 下,如果硬把它设 置在方式 3,它就会停止工作。 6.4 中断系统的应用举例 6.4.1 外部中断举例 【例 6-3】使用外部中断 0,当每次响应中断时,P1 口依次输出高电平,使 8 个发光二极 管依次循环熄灭闪烁。 1) 电设计 2) 程序设计 OR 0000H G LJM MAIN ;转主程序 P OR 0003H ;外部中断 0 入口地址 G LJM EXTER ;转中断程序 P OR 1000H G MAI SET IT0 N: B ;外部中断 0 下降沿有效 SET EX0 ;外部中断 0 允许 B SET EA ;总中断允许 92 页 如有你有帮助,请购买下载,谢谢! B LOO AJM LOOP ;等待中断 P: P OR 1050H ;中断程序入口 G EXT MO ER: V R2, #0FFH ;置循环次数 MO A, #01H ;灯亮初值 V FLA RR A SH: ;右移一位 MO R7, #0FFH ;定时 V LOO MO P1: V R6, #0FFH LOO NOP P2: NOP DJN R6 , Z LOOP2 DJN R7 , Z LOOP1 MO P1, A ;控制灯的亮灭 V DJN R2 , ;循环 Z FLASH RET ;中断返回 I END 6.4.2 定时器举例 【例 6-4】 通过定时器 1 来产生中断,控制 P1.0 线上的脉冲输出,并经三极管驱动扬声 器,发出音调信号。 1) 电设计 2) 程序设计 ORG 0000H LJM MAIN P ORG 001BH ;中断入口地址 CPL P1.0 RETI ORG 1000H 93 页 如有你有帮助,请购买下载,谢谢! MA MO IN: V MO V MO V MO V L1: MO V MO V INC MO VC JZ MO V MO V CLR SUB B RL MO V SET B L2: CLR MO V SUB B MO V MO V SUB B MO V R1, #00H R0, #23H TMOD, #20H IE, #88H DPTR , #3FFFH A, R0 R0 A, @A+PC MAIN R1, A A, #0FFH C A, R1 A TH1, A TR1 C A, DPL A, #01H DPL, A A, DPH A, #00H DPH, A ;定时器 1 工作方式 2 ;定时器 1 允许中断 ;取数 ;修改指针 ;查表 ;计算计数初值 ;置计数初值 ;开始计数 ;延时 94 页 ORL A, DPL JNZ L2 CLR TR1 SJM L1 P END ORG 1031H DB 33H,33H,3DH,33H,26H DB 26H, 26H, 26H,2DH,2DH DB 26H,2DH,33H,33H,33H DB 33H, 33H,33H,4DH,45H DB 45H, 45H45H, 45H, 45H DB 45H, 45H,33H,33H,3DH DB 33H,26H,26H,26H, 28H DB 2DH, 2DH, 26H,26H,33H DB 33H,33H,33H,45H,3DH 如有你有帮助,请购买下载,谢谢! ;歌曲“送别”编码 95 页 如有你有帮助,请购买下载,谢谢! 第 7 章 单片机 I/O 口扩展及应用 难点 8255 的控制字 8255 的工作方式 1 和工作方式 2 8155 的控制字 8155A 口和 B 口的中断工作方式 要求 掌握 : 8255 接口芯片 8155 接口芯片 了解: I/O 口扩展的原因 简单 I/O 口的扩展 单片机的键盘技术 7.1 I/O 口扩展概述 7.1.1 I/O 口扩展的原因 MCS-51 系列单片机共有四个并行 I/O 口,分别是 P0、P1、P2 和 P3。其中 P0 口一般作地 址线的低八位和数据线 口作地址线 是一个双功能口,其第二功能是 一些很重要的控制信号,所以 P3 一般使用其第二功能。这样供用户使用的 I/O 口就只剩下 P1 口了。另外,这些 I/O 口没有状态寄存和命令寄存的功能,因此难以满足复杂的 I/O 操作要求。 由于 MCS-51 系列单片机 I/O 口数量和功能有限,所以在实际应用中不得不使用扩展的方 法,来增加 I/O 口的数量,增强 I/O 口的功能。 7.1.2 I/O 口的编址技术 用户可以通过对 I/O 口进行读和写操作来完成数据的输入和输出。 例如:P0 口的地址为 80H。用户可以使用 MOV 指令对 P0 口进行写操作。 MOV P0, A 7.1.3 单片机 I/O 传送的方式 96 页 如有你有帮助,请购买下载,谢谢! 单片机为了实现数据的输入/输出传送,通常使用 3 种控制方式。 1. 无条件传送方式 当外设和单片机能够同步工作时,可以采用无条件方式进行传送,即数据可以随时进行传 送。 2. 查询方式 查询方式又称为有条件传送方式,即数据的传送是有条件的。在进行 I/O 操作之前,用户 要通过软件查询外设是否为数据传送做好准备,只有确认外设为数据传送做好准备。单片机才 能执行数据的输入/输出(I/O)操作。 3. 中断方式 当外设和计算机进行数据交换时,外设向单片机发出中断请求(即通知单片机)。单片机接 到中断请求后,就作出响应,暂停正在执行的程序,而转去为设备的数据输入/输出服务。当服 务完成后,程序返回,单片机再继续执行被中断的程序。 中断方式大大提高了单片机系统的工作效率,所以在单片机中被广泛应用。 7.2 简单 I/O 口扩展 7.2.1 简单输入口扩展 1. 两个输入口扩展 简单输入口扩展使用的集成芯片,比较典型的如 74LS244 芯片。图 7.1 为 74LS244 芯片的 引脚。 图 7.174LS244 芯片的引脚 图 7.2 74LS244 扩展两个输入口 其中,1A1~1A4,2A1~2A4,为输入线,为输出线; , 为片选信号线 位的三态缓冲器,因此一片 74LS244 可以扩展两个输入口, 其电连接如图 7.2 所示。使用时以 作为数据选通信号。 2. 多输入口扩展 使用多片 74LS244 实现多个(例如 5 个)输入口扩展的电连接如图 7.3。使用或门 74LS32 的输出作为输入口的选通信号。或门的两个输入端一个是读选通信号 ,另一个则为 P2 的一 条口线(线选法)。当他们都是低电平时,才能得到一个有效的输入选通,使一片 74LS244 的 8 位数据进行输入。 图 7.3 多个(例如 5 个)输入口扩展的电 7.2.2 简单输出口扩展 输出口的主要功能是进行数据保持,或者说是数据锁存。所以简单输出口扩展应使用锁存 器实现。 97 页 如有你有帮助,请购买下载,谢谢! 1. 简单输出口扩展使用的典型芯片 简单输出口扩展通常使用 74LS377 芯片,该芯片是一个具有“使能”控制端的锁存器。其 信号引脚如图 7.4 所示。其中:1D~8D 为 8 位数据输入线 位数据输出线,CK 为时钟信号上升沿数据锁存, 为使能控制信号,低电平有效。VCC 为+5V 电源。74LS377 的逻辑电如图 7.5 所示。 图 7.4 74LS377 引脚图 图 7.5 74LS377 的逻辑电 由逻辑电可知,74LS377 是由 D 触发器组成的,D 触发器在上升沿输入数据,即在时钟 信号(CK)由低电平跳变为高电平时,数据进入锁存器。其功能表如表 7-1 所示。 表 7-1 74LS377 功能表 C D Q K 1 Q 0 0 ↑1 1 0 ↑0 0 从功能表可知: 0 Q 0 若 =1,不管数据和时钟信号(CK)是什么状态,锁存器输出锁存的内容(Q0)。 只有在 =0 时,时钟信号才起作用,即时钟信号正跳变时,数据进入锁存器,也就是说 输出端反映输入端的状态。 若 CK=0,则不论 为何状态,锁存器输出锁存的内容(Q0),不受 D 端状态影响。 输出口扩展连接: 扩展单输出口只需要一片 74LS377,其连接电如图 7.6 所示。 图 7.6 74LS377 作输出口扩展 输出扩展使 作输出选通,因此,以 MCS-51 单片机的 信号在地址信号的配合下 接 CK。因为在 信号由低变高时,数据线上出现的正是输出的数据,因此 接 CK 正好 控制输出数据进入锁存器。此外,74LS377 的 信号接地,其目的是使锁存器的工作只受 CK( )信号的控制。 98 页 如有你有帮助,请购买下载,谢谢! 7.3 8255 可编程通用并行接口芯片 7.3.1 8255 的外部引脚和内部结构 1. 外部引脚 8255 的外部引脚如图 7.7 所示,其中: :A 口的输入输出信号线。该口是输入还是输出或双向,由软件决定。 :B 口的输入输出信号线。该口是输入还是输出,由软件决定。 :C 口信号线。该口可作输入、输出、控制和状态线使用,由软件决定。 ~ :双向数据信号线,用来传送数据和控制字。 :读信号线。 :写信号线。 :片选信号线,低电平(有效)时, 才选中该芯片,才能对 8255 进行操作。 RESET:复位输入信号,高电平有效时,复位 8255。复位后 8255 的 A 口、B 口和 C 口均 被定为输入。 表 7-2 地址编码 端口 0 0 A口 0 B口 1 1 0 1 1 C口 控制 寄存器 :口地址选择信号线 内部共有三个口,A 口、B 口、C 口和一个控制寄存器供 用户编程 的不同编码可分别选择上述三个口和一个控制寄存器。地址编码如表 7-2 所示。 图 7.7 8255 外部引脚 由 、 、和 示。 表 7-3 读写逻辑 可以确定 A 口、B 口、C 口和控制寄存器的,如表 7-3 所 99 页 00 0 00 0 00 1 00 1 01 0 01 0 01 1 1× × 如有你有帮助,请购买下载,谢谢! 所选 断口 01 A口 操作 读A口 10 A口 写A口 01 B口 读B口 10 B口 写B口 01 C口 读C口 10 C口 写C口 1 0 控制 写控制 寄存器 寄存器 ×× ∕ 高阻状 态 100 页 如有你有帮助,请购买下载,谢谢! 2. 内部结构 8255 的内部结构框图如图 7.8 所示。从图可以看到,左边的信号与系统总线相连。而右 边是与外设相连接的三个口。三个口均为 8 位。其中 A 口输出有锁存能力,输入亦有锁存 能力。B 口输入输出均有锁存能力。C 口输出有锁存能力,输入没有锁存能力,在使用上要 注意到这一点。 图 7.8 8255 的内部结构框图 为了控制方便,将 8255 的三个口分成 A,B 两组。其中 A 组包括 A 口的 8 条口线和 C 口的高四位 ~ 。B 组包括 B 口的 8 条口线和 C 口的低四位 ~ 。A 组 和 B 组分别由软件编程来加以控制。 7.3.2 8255 的扩展逻辑电 MCS-51 单片机可 以和 8255 直接连接,图 7.9 给出了一种扩展电。 图 7.98255 的扩展逻辑电 8255 的数据线 直接相

      威廉希尔