590 likes | 739 Views
第 1 章 单片机概述 本章要点: n 单片机的概念、发展及应用范围 n 常用的进位计数制及其相互转换的方法 n 原码、补码的表示方法及其相互转换,了解反码表示方法 n BCD 码与十进制之间的转换, BCD 码的加减运算. 1.1.1 什么是单片机
E N D
第1章 单片机概述 本章要点: n单片机的概念、发展及应用范围 n常用的进位计数制及其相互转换的方法 n原码、补码的表示方法及其相互转换,了解反码表示方法 nBCD码与十进制之间的转换,BCD码的加减运算
1.1.1 什么是单片机 将计算机的CPU、RAM、ROM、定时/计数器和多种I/O接口集成在一片芯片上,形成了芯片级的计算机,称为单片微型计算机(Single chip)。直译为单片机。准确反映单片机本质的叫法应是微控制器(micro controller)。目前国外大多数厂家、学者已普遍改用微控制器一词,其缩写为MCU(micro controller unit)。国内仍沿用单片机一词,但其含义应是micro controller,而非microcomputer,这是因为单片机无论从功能还是从形态来说都是作为控制领域应用计算机的要求而诞生的。目前也有人根据单片机的结构和微电子设计特点将单片机称为嵌入式微处理器(embedded microprocessor)或嵌入式微控制器(embedded micro controller)。本书我们仍沿用传统的叫法──单片机。
1.1.2 通用与专用单片机 单片机按照其用途可分为通用和专用两大类。通常所说的和本书 所介绍的单片机是指通用型单片机。通用型单片机是把可开发资 源(如ROM、RAM、EPROM、I/O口)全部提供给使用者。 专用型单片机其硬件结构和指令是校照某个特定用途而设计的。 例如:频率合成调谐器、录音机机芯控制器等,这类单片机不属 于本书讨论的范围。
1.1.3 单片机应用系统与单片机开发系统 1.单片机应用系统 单片机应用系统是指以单片机为核心,配以一定的外围电路和软件,能实现某几种功能的应用系统。它由硬件部分和软件部分组成。硬件是系统的基础,软件则是在硬件的基础上对其合理的调配和使用,从而完成应用系统所要完成的任务。一般来讲,应用系统所要完成的任务不同,相应的硬件配置和软件配置也就不同。因此,单片机应用系统的设计应包括硬件设计和软件设计两大部分。
(1)应用系统的硬件设计 一个单片机应用系统的硬件设计包括两大部分内容:一是单片机系统的扩展部分设计。它包括存储器扩展和接口扩展。存储器的扩展指程序存储器和数据存储器的扩展,接口扩展是指8255、8155、8279以及其它功能器件等的扩展。二是各功能模块的设计。如信号测量功能模块、信号控制功能模块、人机对话功能模块、通信功能模块等,根据系统功能要求配置相应的A/D、D/A、键盘、显示器、打印机等外围设备。
从时间上看,硬件设计的绝大部分工作量往往在最初方案的设计阶段,一个好的设计方案往往会有事半功倍的效果。一旦总体方案确定下来,下一步的工作就会很顺利进行,即使需要作部分修改,也只是在此基础上进行一些完善工作,而不会造成整体返工。从时间上看,硬件设计的绝大部分工作量往往在最初方案的设计阶段,一个好的设计方案往往会有事半功倍的效果。一旦总体方案确定下来,下一步的工作就会很顺利进行,即使需要作部分修改,也只是在此基础上进行一些完善工作,而不会造成整体返工。 在硬件设计的过程中要用到PROTEL等印制板辅助设计软件,先用PROTEL将硬件连线原理图画好,然后再用PROTEL将原理图转换为印制板图即PCB图,检查无误后将PCB图交给印制板生产厂家,印制板生产好后,将元器件焊接到印制板上就完成了硬件系统的设计。在硬件系统设计过程中,一定要仔细检查原理图是否正确,生产厂家提供的印制板是否合格。
(2)应用系统的软件设计 在进行应用系统的总体设计时,软件设计和硬件设计应统一考虑。当系统电路设计定型后,软件的任务也就明确了。 系统中的应用软件是根据系统功能要求设计的。一般地讲,软件的功能可分为两大类:一大类是执行软件,它能完成各种实质性的功能,如测量、计算、显示、打印、输出控制等;另一类是监控软件,它专门用来协调各执行模块和操作者的关系。
2.单片机开发系统 —个单片机应用系统经过总体设计、硬件设计、软件设计、制板、元器件安装后,在系统的程序存储器中放入编制好的应用程序,系统方可运行。但一次性成功几乎是不可能的,一般会出现—些硬件、软件上的错误,这就需要通过调试来发现错误并加以改正。由于单片机在执行程序时人工是无法控制的,为了能调试程序,检查硬件、软件运行状态,就必须借助某种开发工具模拟用户实际的单片机,并且能随时观察运行的中间过程而不改变运行中的数据件能和结果,从而进行模仿现场的真实调试。完成这—仿真工作的开发工具就是单片机仿真器。 单片机仿真器必须具有以下基本功能: (1)能输入和修改用户的应用程序; (2)能对用户系统硬件电路进行检查与诊断; (3)能将用户源程序编译成目标码并固化到EPROM中去; (4)能以单步、断点、连续方式运行用户程序,正确反映用户程序执行的中间结果。
对于一个完善的仿真系统,为了方便用户调试,提高产品的开发效率,还应具备以下特点:对于一个完善的仿真系统,为了方便用户调试,提高产品的开发效率,还应具备以下特点: (1)不占用用户单片机的任何资源,包括8031内部RAM、特殊功能寄存器,I/O口、串行中、中断源等; (2)能提供给用户足够的仿真RAM空间作为用户的程序存储器(最好是从零地址开始),并提供用户足够的RAM空间作为用户的数据存储器使用; (3)可以单步、断点、连续方式运行仿真RAM或样机EPROM内的用户程序; (4)有较齐全的软件开发工具。如配备有交叉汇编软件,将用户用汇编语言编制的应用程序生成可执行的目标文件;具有丰富的子程序库,汇编时连同用户设汁的程序一起编译成目标程序,装入仿真RAM供调试和固化;具有高级语言编译系统,用户可用BASIC语言或C51语言等进行编程;具有反汇编功能,对目标程序反汇编的结果可以打印或写入磁盘等。
综上所述,单片机开发系统的设计包括下述几个步骤:综上所述,单片机开发系统的设计包括下述几个步骤: (1)总体设计; (2)系统硬件设汁(使用PROTEL等软件); (3)系统软件设计(使用仿真机软件); (4)仿真调试硬件和软件(使用仿真机软件); (5)固化应用程序(使用编程器软件); (6)脱机运行(用户系统)。
1.2 单片机的发展与应用 1.2.1 单片机发展概述 单片机已有30多年的历史。1971年Intel公司研制出8080,紧跟着Motorola生产6800,Zilog生产Z80。当时的一块芯片不能构成系统,必须多片芯片才能构成单板机。我国在20世纪80年代的单板机TP801以Z80为主,6800在我国用得较少。 1976年Intel推出8748,MCS—48单片机系列。芯片集成度达17000只晶体管以上。内含一个CPU,1K字节的EPROM,64个字节的RAM,27根I/O引脚和一个8位定时器。后来将它当作面向控制应用的工业标准,先取代了洗衣机和交通灯的控制器。后来在汽车、工业设备、游戏机和计算机外围设备中得到应用。 1980年Intel生产出8051,MCS—5l系列单片机。比8048强大得多,集成度达60000晶体管以上,内含一个CPU,4K字节ROM,128字节RAM,32根I/O线,一个串行口,两个16位定时器。本书主要介绍这一系列。相应的Motorola有6801,Zilog公司有Z80。
在我国,1990年以前,除了Z80就是8031(8051系列中的最简单一种,芯片内部没有ROM必须在外部扩展EPROM才能构成系统) ,形成三片式的最小系统8031(内部无ROM的51单片机)+741LS373(锁存器)+2764(8KEPROM)。 875l价格高,应用较少。实际上在我国,真正的单片机在20世纪90年代之后才实现,20世纪90年代后期普及。 1983牛Intel公司推出MCS—96系列,是一种16位的单片机,有4路10位的A/D转换器,集成度达12万个晶体管以上。与51系列一样,96系列在我国主要以8098(内部无ROM)为主,构成三片机。由于程序从2000H地址开始,数据与程序同用一个空间〔不分程序存储器和数据存储器)。应用推广受到限制。只有内部带ROM的96系列才真正发挥作用。但芯片都比较少,价格贵。
20世纪90年代后期,各国的单片机和外围芯片涌人我国,各种开发工具和软件应有尽有,结束了三片机的时代,大大提高了我国单片机的应用水平。近年来,市场上比较流行的89C51系列单片机,采用CHMOS工艺,其片内含有4KB快闪可编程/擦除只读存储器FPEROM,使用高密度、非易失存储技术制造,并且与80C51引脚和指令系统完全兼容。芯片上的FPEROM允许在线编程或采用通用的非易失存储器对程序存储器重复编程,因而89C51性能价格比较高。
特 类 性 别 ROM形式 片内 RAM (字节) 程序和数据存储器 寻址能力 16位 定时器 计数器 I/O口 数目 串行 通信方式 中断源(2个 优先级) 片内 掩膜ROM 片内 EPROM 片内无ROM 需外接ROM 8×51系列 8051 4KB 8751 4KB 8031 128 2×64K 2 4×8 同步/异步 8/16位可程控 5 8×52系列 8052 8KB 8752 8KB 8032 256 2×64K 3 4×8 同步/异步 8/16位可程控 6 8×C51系列 80C51 4KB 87C51 4KB 83C31 128 2×64K 2 4×8 同步/异步 8/16位可程控 5 8×C252系列 80C252 8KB 87C252 8KB 80C232 256 2×64K 3 4×8 同步/异步 8/16位可程控 7 8×44系列 8044 4KB 8744 4KB 8344 192 2×64K 2 4×8 HDLC/SDLC 5 1.2.2 MCS-51系列单片机简介 MCS—51系列是Intel公司1980年推出的高档8位单片机。该系列包括基本型:805l/875l/8031;强化型:8052/8032;改进型:8044/8344/8744;超级型:83C252/87C252/80C252等。表l-1列出了这些芯片的结构和性能。 表1-1 MCS—51系列单片机
基本型采用CHMOS工艺,片内集成有8位CPU;片内驻留4K字节ROM(8031片内无ROM)和128字节RAM以及21个特殊功能寄存器;片内还包括2个16位定时器/计数器、1个全双工串行I/O口(UART)、32条I/O线、5个中断源和2级中断。寻址能力达128K字节(其中程序存储器ROM和数据存储器RAM各64K字节)。指令系统中设置了乘、除运算指令、数据查找指令和位处理指令等。主时钟频率为12MHz,大部分指令周期只需1μs,乘除指令也仅需4μs。基本型采用CHMOS工艺,片内集成有8位CPU;片内驻留4K字节ROM(8031片内无ROM)和128字节RAM以及21个特殊功能寄存器;片内还包括2个16位定时器/计数器、1个全双工串行I/O口(UART)、32条I/O线、5个中断源和2级中断。寻址能力达128K字节(其中程序存储器ROM和数据存储器RAM各64K字节)。指令系统中设置了乘、除运算指令、数据查找指令和位处理指令等。主时钟频率为12MHz,大部分指令周期只需1μs,乘除指令也仅需4μs。 强化型8052是1982年推出的产品,与基本型805l不同的是片内ROM增加到8K字节,RAM增加到256字节,16位的定时器/计数器增加别3个,串行接口(UART)的通信速率快6倍。 改进型8×44系列是在基本型上用一种新的串行接口SIU取代UART。SIU是一个HDLC/SDLC通信控制器,属于SIO的通信标准,通信软件已固化在器件内。由于SIU是有2根I/O线的串行通信方式,因而最适宜远距离通信的网络接口。 采用CMOS工艺的8×C51系列其基本结构和功能与基本型相同。87C51和8×C252还具有两级程序保密系统,可禁止外部对片内ROM小的程序进行读取,为用户提供了一种保护软件不被窃取的有效手段。出于采用CHMOS工艺,功耗极低。
超级型8×C252系列是超8位单片机。它们的结构、引脚和指令与MCS-51系列完全相同,但又具有MCS-96系列高速输入/输出(HSIO)功能和脉冲宽度调制(PWM)输出。8×C252采用高可靠性CHMOS—II工艺,增加了128×8位字节的片内RAM,1个可作加减计数的定时器,1个可作编程计数器阵列以及适用于串行口的场错误检测和自动地址识别。超级型8×C252系列是超8位单片机。它们的结构、引脚和指令与MCS-51系列完全相同,但又具有MCS-96系列高速输入/输出(HSIO)功能和脉冲宽度调制(PWM)输出。8×C252采用高可靠性CHMOS—II工艺,增加了128×8位字节的片内RAM,1个可作加减计数的定时器,1个可作编程计数器阵列以及适用于串行口的场错误检测和自动地址识别。
1.2.3 单片机的应用特点与应用领域 1.单片机的特点 单片机与通用微型计算机相比较,它在硬件结构、指令设置上均有其独到之处,主要特点如下: (1)单片机中的存储器ROM和RAM是严格分工的。ROM为程序存储器,只存放程序、常数及数据表格。而RAM则为数据存储器,用作工作区及存放变量。这样的结构主要是考虑到单片机用于控制系统中,有较大的程序存储空间,把已调试好的程序固化在ROM中,而把少量的随机数据存放在RAM中,这样,小容量数据存储器能以高速RAM形式集成在单片机内,以加快单片机的执行速度。但单片机上RAM是作为数据存储器用,而不是当作高速数据缓冲存储器(Cache)用。
(2)采用面向控制的指令系统。为满足控制的需要,单片机的逻辑控制能力要优于同等级的CPU,持别是单片机具有很强的位处理能力。单片机的运行速度也较高。(2)采用面向控制的指令系统。为满足控制的需要,单片机的逻辑控制能力要优于同等级的CPU,持别是单片机具有很强的位处理能力。单片机的运行速度也较高。 (3)单片机的I/O引脚通常是多功能的。由于单片机芯片上引脚数有限,了解决实际引脚数和需要的信号线数的矛盾,采用了引脚功能复用的方法,引脚处于何种功能,可由指令来设置或由机器状态来区分。 (4)系列齐全,功能扩展性强。单片机有内部掩膜ROM、内部EPROM和外接ROM等形式,并可方便地扩展外部的ROM、RAM及I/O接口,与许多通用的微机接口芯片兼容,对应用系统的设计和生产带来极大的方便。 (5)单片机的功能是通用的。单片机虽然主要作控制器用,但是功能上还是通用的,可 以象一般微处理器那样广泛应用在各个方面。
2.单片机的应用领域 单片机在控制应用领域中,有如下几方面的优点: (1)体积小、成本低、运用灵活、易于产品化,它能方便地组成各种智能化的控制设备和仪器,做到机电仪一体化: (2)面向控制,能针对性地解决从简单到复杂的各类控制任务,因而能获得最佳的性能价格比; (3)抗干扰能力强,适应温度范围宽,在各种恶劣的环境下都能可靠地工作,这是其它机种无法比拟的; (4)可以方便地实现多机和分布式控制,使整个控制系统的效率和可靠性大为提高。
单片机的应用范围十分广泛,下面仅列举一些典型的应用领域。 (1)工业控制 数控机床,温度控制,可编程程序控制,电机控制,工业机器人、智能传感器,离散与连续过程控制; (2)仪器仪表 智能仪器,医疗器械,液体和气体色谱仪; (3)电讯技术 调制解调器,声象处理,数字滤波,智能线路运行控制; (4)办公自动化和计算机外部设备 图形终端帆,传真机.复印机,打印机.绘图仪,磁盘/磁带机,智能终端机;
(5)汽车与节能 点火控制,变速控制,防滑车控制,排气控制,最佳燃烧控制,计费器,交通控制; (6)导航与控制 导弹控制,鱼雷制导,智能武器装置,航天导航系统; (7)商用产品 自动售货机,电子收款机; (8)家用电器 微波炉,电视机,录像机,音响设备,游戏机。
1.3 数制与编码 1.3.1 数制转换 所有计算机都是以二进制数形式进行算术运算和逻辑操作的,单片机也不例外,用户通过输入设备输入的十进制数字和命令符号,只有转换成二进制形式,单片机才能识别、运算和处理,然后再把运算结果转换成十进制数和符号在输出设备上显示出来。为了弄清单片机的这一工作过程,我们先学习进位计数制及数制之间的转换和二进制数的算术运算规则。
1.进位计数制 所谓进位计数制就是按进位原则进行计数的方法。例如十进制、二进制、八进制、十六进制等计数制中。是按“逢十进一”、“逢二进一”、 “逢十六进一”的原则进行计数的。 进位计数制有两个基本要素:基数和位权。 (1)基数:指进位计数制中产生进位的数值,它等于该进位计数制中所用到的数符的个数,用R表示。例如十进制所用的数符是0~9十个数符,R=l0。二进制所用的数符是0、1两个数符,R=2。 (2)位权:进位计数制中每个数位都有一个固定值,这个固定值称为位权。在十进制中,小数点之前的数值依次为个、十、百、千、万、……,小数点之后依次为十分之一、百分之一、千分之一、万分之一、……,即各位的位权分别为:…、103、102、101、100、10-1、10-2、10-3、…。
2.进位计数制的表示 对于任意进位计数制的数N可以表示为: 式中 m、 n为正整数; K为0、1、…、(R-1)中的任何数; R为基数,采用逢“R进一”的原则进行计数。 这个式子也称为“按权展开式”。 (1)在十进制中,R=10,数符为0~9。采用“逢十进一”的计数原则。通常在十进制数后面放一个字母D,表示这个数是十进制数。 例如二进制数355.75D可展开为: 355.75=3×102+5×101+5×100 +7×10-1 +5×10-2
(2)在二进制中,R=2,数符为0、1两个。采用“逢二进一”的计数原则。通常在十进制数后面放一个字母B,表示这个数是二进制数。(2)在二进制中,R=2,数符为0、1两个。采用“逢二进一”的计数原则。通常在十进制数后面放一个字母B,表示这个数是二进制数。 例如二进制数1101.11B可展开为: 1101.11= 1×23 + 1×22+0×21+1×20 +1×2-1 +1×2-2 (3)在十六进制中:R=16,数符有0~9和A~F共十六个。采用“逢十六进一”原则计数。通常在十六进制数后面放一个字母H,表示这个数是十六进制数。 例如十六进制数BF3.8CH可展开为: BF3.8C=B×162 + F×161+3×160+8×16-1 +C×16-2 常用进位计数制如表1-2
十进制数 二进制数 十六进制数 十进制数 二进制数 十六进制数 0 0000 0000 0 11 0000 1011 B 1 0000 0001 1 12 0000 1100 C 2 0000 0010 2 13 0000 1101 D 3 0000 0011 3 14 0000 1110 E 4 0000 0100 4 15 0000 1111 F 5 0000 0101 5 16 0001 0000 10 6 0000 0110 6 17 0001 0001 11 7 0000 0111 7 18 0001 0010 12 8 0000 1000 8 19 0001 0011 13 9 0000 1001 9 20 0001 0100 14 10 0000 1010 A 21 0001 0101 15
3.不同进位制之间转换 (1)二进制数、十六进制数转换为十进制数 转换方法:将二进制数的各位乘以相应位的位权,再相加,即可得到十进制数。(按权展开法) 【例1-1】1101.11B=1×23+ 1×22 + 0×21 + 1×20 + 1×2-1 + 1×2-2 =13.75 【例1-2】4F5H=?
(2)二进制数与十六进制数之间的转换 (四位二进制数对应一位十六进制数,8421法) 转换方法:将二进制数转换成十六进制数时,从小数点开始,向左和向右4位4位的分组。整数部分最后不足4位时在左面用0填充;小数部分最后不足4位时在右面用0填充。然后进行转换。将十六进制转换成二进制数时,每位十六进制数用4位二进制数表示即可完成转换。该转换原则可归纳为:二进制转换为十六进制:4位合1位;十六进制转换为二进制:1位拆4位。 【例1-3】101100010011100B=0101100010011100B=? 【例1-4】90.BEH=10010000 .10111110B
(3)十进制数转换为二进制数 十进制数转换为二进制数,整数部分和小数部分要分别进行转换。 1)整数部分的转换(除2取余,自下而上) 转换方法:按“除基数2取余数,直到商为0止,自下往上倒排列”的原则进行转换。 2)小数部分的转换(乘2取整,自上而下) 转换方法:按“乘基数2取整数,积的小数部分为0则转换结束;若积的小数部分不为0时,根据精度要求转换到小数点后若干位,得到一个近似值,自上往下正排列”的原则进行转换。 【例1-5】将十进制数41转换为二进制数。 【例1-6】将十进制数0.6875转换为二进制数。 注:十进制数转换为十六进制数时,可先转换为二进制数后,再转换为十六进制数。
4.二进制的算术运算 (1)加法运算 运算规则:0+0=0 0+1=1+0=1 1+1=10,向高位进1 【例1-7】 10100111B +01101110B 100010101B
(2)减法运算 运算规则:0-0=0 1-0=1 1-1=0 0-1=1,向高位借1 【例1-8】 10100111B -01101110B 00111001B
(3)乘法运算 运算规则:0×0=0×1=1×0=0 1×1=1 【例1-9】 11001011B × 101B 11001011 00000000 11001011 1111110111B
1.3.2 数在计算机中的表示方法及编码 计算机中的信息不仅有数据,还有字符、命令,其中数据还有大与小、正数与负数之分。计算机是如何用“0”或“1”,来表示这些信息的呢? 1.计算机中数的表示形式 在计算机中,只有数码1和0两种不同的状态,对于一个数的正、负号,两种不同状态,约定正数的符号用0表示,负数的符号用1表示,将符号位放在数的最左边。例如:N1=+1011,N2=-1011。由于MCS—51为8位单片机,即信息是以8位为单位进行处理的,且每个存贮单元只能存贮—个8位的二进制数,称为一个字节,如果用一个字节(即8位二进制数)来表示上述两个符号数,它们在单片机中可分别表示为:00001011和10001011,其中最高位为符号值,其余位为数值位。
最高位为0表示是正数,最高位为1表示是负数。这种计算机用来表示数的形式叫机器数。而把对应于该机器数的算术值叫真值。最高位为0表示是正数,最高位为1表示是负数。这种计算机用来表示数的形式叫机器数。而把对应于该机器数的算术值叫真值。 值得注意的是:机器数和真值的面向对象不同,机器数面向计算机,真值面向用户,机器数不同于真值。但真值可以用机器数来表示。
机器数是计算机中表示数的基本方法,机器数通常有原码、反码和补码三种形式。机器数是计算机中表示数的基本方法,机器数通常有原码、反码和补码三种形式。 (1)原码表示方法 用8位二进制数表示数的原码时,最高位为数的符号位,其余7位为数值位。 例如:真值为+120和-120的原码形式 [+120]原=01111000 [-120]原=11111000 对于零,可以认为它是正零,也可以认为它是负零,所以零的原码有两种表示形式: [+0]原=00000000 [-0]原=10000000 8位二进制数原码表示范围为:11111111~01111111,即-127~+127。
(2)反码表示方法 在反码表示方法中,正数的反码与原码相同,负数的反码由它对应原码除符号位之外,其余各位按位取反得到。例如: [+120]反=[+120]原=01111000 [-120]反=10000111 零的反码有两种表示方式,即: [+0]反=00000000 [-0]反=11111111 8位二进制数反码表示范围为:11111111~01111111,即-127~+127。
(3)补码表示方法 补码的概念 先以钟表对时为例,假设现在的标准时间为5点整,而有一只表却已是7点,为了校准时间,可以采用两种方法:一是将时针退2格,即7-2=5;一是将时针向前拨10格,即7+10=12(自动丢失)+5,都能对准到5点。可见,减2和加10是等价的,我们把(+10)称为(-2)对12的补码,12为模,当数值大于模12时可以丢弃12。 在字长为8位的二进制数字系统中,模为28=256,先看看下例: 01000000 64 01000000 64 +11110110+246-00001010-10 1 00110110 54 1 00l10110 54 丢失 由此可见,在字长为8位情况下(64-10)与(64+246)的结果是相同的,所以(-10)和246互为补数。在补码表示方法中,正数的补码与原码相同,负数的补码由它对应原码除符号位之外,其余各位按位取反且末位加一得到。例如: [+120]补=[+120]原=01111000
现在我们看一看(-10)的补码11110110怎样求得。现在我们看一看(-10)的补码11110110怎样求得。 正数的补码表示方法与原码相同 负数的补码求法: (1)利用反码求补码:反码加1。如: [-10]原=100010l0 [-10]反=11110101 [-10]补=11110110 (2)利用原码求补码(直接求补法):找出原码中数值位的最右边的一个“1”,将这个“1”以及这个“1”右边各位保持不变,而将这个“1”左边各位按位取反,但符号位不变。如: [-10]原=100010l0 [-10]补=11110110
采用补码表示数,可将减法运算转换成加法运算。在补码表示法中,零的补码只有一种表示法,即 [+0]补=[-0]补=00000000。对于八位二进制数而言,补码能表示的数的范围为-128~+127。 【例1-10】已知X=+1010B,Y=-1010B,写出它们的原码、反码和补码形式。 [+1010B]原=00001010B [-1010B]原=10001010B [+1010B]反=00001010B [-1010B]反=11110101B [+1010B]补=00001010B [-1010B]补=11110110B
00000000B~11111111B范围内原码、反码和补码对应关系如表1-3所示。00000000B~11111111B范围内原码、反码和补码对应关系如表1-3所示。 表1-3 原码、反码和补码对应关系 二进制数 原 码 反 码 补 码 0000 0000 +0 +0 0 0000 0001 +1 +1 +1 0000 0010 +2 +2 +2 … … … … 0111 1101 +125 +125 +125 0111 1110 +126 +126 +126 0111 1111 +127 +127 +127 1000 0000 -0 -127 -128 1000 0001 -1 -126 -127 1000 0010 -2 -125 -126 … … … … 1111 1101 -125 -2 -3 1111 1110 -126 -1 -2 1111 1111 -127 -0 -1
2.补码的加减运算 当用补码表示数时,可用加法完成减法运算,因此带符号数一般都以补码形式在机器中存放和参加运算。 补码的运算公式是: [X+Y]补=[X]补+[Y]补 [X-Y]补=[X]补+[-Y]补 上述公式表明,补码的“和”等于“和”的补码。也就是说,在进行补码加法运算时,不论相加的两数是正、是负,只要把它们表示成相应的补码形式,直接按二进制规则相加,其结果都应为“和”的补码。
已知X的补码,求X的原码时,可以将X的补码当作X原码形式,再求—次补码得到:已知X的补码,求X的原码时,可以将X的补码当作X原码形式,再求—次补码得到: [[X]补]补=[X]原。 【例1-11】已知[X]补=10111010B,求[X]原。 [X]原=[[X]补]补=[10111010]补=11000110B 补码加减运算时,不能保证每次运算结果都是正确,也就是要注意溢出问题。所谓溢出在这里是指:两个带符号数进行运算时,其结果超出补码的表示范围-128~+127。
【例1-12】已知[X]补=00111010B,[Y]补=10011101B,求[X+Y]补。【例1-12】已知[X]补=00111010B,[Y]补=10011101B,求[X+Y]补。 • 00111010 58 • + 10011101 -99 • 11010111 -41 • 得:[X+Y]补=11010111B • 【例1-13】已知[X]补=10011011B,[Y]补=01101001B,求[X+Y]补。 • 10011011 -101 • + 01101001 105 • 00000100 4 • 得:[X+Y]补=00000100B (进位发生丢失,不会影响运算结果)
【例1-14】已知[X]补=11000100B,[Y]补=10001000B,求[X+Y]补。【例1-14】已知[X]补=11000100B,[Y]补=10001000B,求[X+Y]补。 11000100 -60 + 10001000 -120 1 01001100 -180 得:[X+Y]补=1001100B (显然该结果是错误的) 【例1-15】已知[X]补=01101000B,[Y]补=00110100B,求[X-Y]补。 [-Y]补=11001100B (已知[Y]补,求[-Y]补,只要将连同符号位一起“取反加一” ) 01101000 104 + 11001100 -52 1 00110100 52 得:[X-Y]补=00110100B
补充例题 已知X=35,Y=-24,求: (1) [X+Y]补 (2) [X- Y]补 解: (1) X=35=100011 Y=-24 =-11000 [X]原=00100011 [Y]原=10011000 [X]补=00100011 [Y]补=11101000 00100011 35 + 11101000 -24 1 00001011 11 得:[X+Y]补= 00001011 B (2) [-Y]补= 00011000 00100011 35 + 00011000 24 00111011 59 得:[X-Y]补= 00111011 B
溢出的判断: (1)法一:双高位判别法 判别数据的最高位与次高位的进位情况,若一致,则无溢出;若不一致,则溢出。 (2)法二: 设有带符号数A、B,其补码[A]补=a0 a1 …an-1, [B]补=b0 b1 …bn-1, a0 a1 …an-1 [A]补 + b0 b1 …bn-1 [B]补 c0 c1 …cn-1[A+B]补 若a0= b0=0,而c0=1,即两个正数相加得到了负数,则发生了溢出: 若a0=b0=1,而c0=0,即两个负数相加得到了正数,则发生了溢出 ; 若a0与 b0异号,相加只会变小,不会发生溢出。
补充例题: 已知[X]补=10100010 [Y]补=10100010 10100010 -94 + 10100010 -94 1 01000100 -188 因为最高位与次高位的进位情况不一致,故溢出
第一补码 运算 第二补码 结果 结论 符号位为0(正数) 加 符号位为0(正数) 符号位为0(正数) 正确 符号位为0(正数) 加 符号位为0(正数) 符号位为1(负数) 溢出 符号位为1(负数) 加 符号位为1(负数) 符号位为1(负数) 正确 符号位为1(负数) 加 符号位为1(负数) 符号位为0(正数) 溢出 符号位为0(正数) 加 符号位为1(负数) 不用关心符号位 正确 符号位为0(正数) 减 符号位为1(负数) 符号位为0(正数) 正确 符号位为0(正数) 减 符号位为1(负数) 符号位为1(负数) 溢出 符号位为1(负数) 减 符号位为0(正数) 符号位为1(负数) 正确 符号位为1(负数) 减 符号位为0(正数) 符号位为0(正数) 溢出 符号位为1(负数) 减 符号位为1(负数) 不用关心符号位 正确 符号位为0(正数) 减 符号位为0(正数) 不用关心符号位 正确 表1-4 加减运算溢出判断原则
3.BCD码 BCD码是一种用二进制编码表示十进制数的编码形式。它采用四位二进制编码0000~1001来代表十个十进制数符号0~9。它们之间的对应关系如表1-5。由于四位二进制编码可以表示十六种状态:而十进制符号只有十种状态,在BCD码表示的十进制数中不允许出现1010、1011、1100、1101、1110、1111六种非法状态。例如:175D的BCD码为(0001 0111 0101)BCD。 表1-5 BCD码与十进制数对应关系