第1章 单片机的基础知识
1.1 单片机的基础
单片机即在一片集成电路芯片上集成了CPU、RAM、ROM、时钟、定时器/计数器、多功能串行或并行I/O口的通用IC,从而构成了一个完整的单芯片微型计算机(Single Chip Microcomputer)。它的结构及功能最初是按工业控制要求设计的,使用时单片机通常处于测控系统的核心地位并嵌入其中,所以国际上通常把单片机称为嵌入式控制器(EMCU,Embedded MicroController Unit)或微控制器(MCU,MicroController Unit)。我国习惯使用“单片机”这一名称。
1.1.1 单片机的发展史
1.单片机发展经历的四个阶段
以8位单片机的推出作为起点,单片机的发展历史大致可分为以下几个阶段。
第一阶段(1976~1978):单片机的探索阶段。以Intel公司的MCS-48为代表。MCS-48的推出属于在工控领域的探索,参与这一探索的公司还有Motorola、Zilog等,都取得了满意的效果。这就是SCM的诞生年代,“单片机”一词即由此而来。
第二阶段(1978~1982):单片机的完善阶段。Intel公司在MCS-48基础上推出了完善的、典型的单片机系列MCS-51。它在以下几个方面奠定了典型的通用总线型单片机体系结构。
1)完善的外部总线。MCS-51设置了经典的8位单片机的总线结构,包括8位数据总线、16位地址总线、控制总线及具有多机通信功能的串行通信接口。
2)具备CPU外围功能单元的集中管理模式。
3)体现工控特性的位地址空间及位操作方式。
4)指令系统趋于丰富和完善,并且增加了许多突出控制功能的指令。
第三阶段(1982~1990):向微控制器发展的阶段,也是8位单片机的巩固发展及16位单片机的推出阶段。Intel公司推出的MCS-96系列单片机,将一些用于测控系统的模数转换器、程序运行监视器、脉宽调制器等纳入片中,体现了单片机的微控制器特征。随着MCS-51系列的广泛应用,许多电气厂商竞相使用80C51为内核,将许多测控系统中使用的电路技术、接口技术、多通道A-D转换部件、可靠性技术等应用到单片机中,增强了外围电路的功能,强化了智能控制的特征。
第四阶段(1990至今):微控制器的全面发展阶段。随着单片机在各个领域全面深入的发展和应用,出现了高速、大寻址范围、强运算能力的8位/16位/32位通用型单片机,以及小型廉价的专用型单片机。
2.单片机的发展趋势
为了降低功耗,单片机在工艺上已经全部采用了CHMOS技术。今后单片机的发展趋势将是向低功耗、小体积、大容量、高性能、低价格、外围电路内装化等方面发展。为满足不同用户的要求,各公司竞相推出能满足不同需要的产品。
(1)CPU的改进
1)增加CPU数据总线宽度。例如,各种16位单片机和32位单片机,数据处理能力要优于8位单片机。另外,8位单片机内部采用16位数据总线,其数据处理能力明显优于一般8位单片机。
2)采用双CPU结构,以提高数据处理能力。
3)采用精简指令集(RISC)结构和流水线技术,可以大幅度提高运行速度。现指令最高速度已达100MIPS(Million Instruction Per Seconds,即兆指令每秒),并加强了位处理功能、中断和定时控制功能。这类单片机的运算速度比标准的单片机高出10倍以上。由于这类单片机有极高的指令速度,就可以用软件模拟其I/O功能,由此引入了虚拟外设的新概念。
(2)存储器的发展
1)片内程序存储器普遍采用闪烁(Flash)存储器。可不用外扩展程序存储器,简化系统结构。
2)加大存储容量。目前有的单片机片内程序存储器容量可达128KB甚至更多。
(3)片内I/O的改进
1)增加并行口驱动能力,以减少外部驱动芯片。有的单片机可以直接输出大电流和高电压,以便能直接驱动LED和VFD(荧光显示器)。
2)有些单片机设置了一些特殊的串行I/O功能,为构成分布式、网络化系统提供方便条件。
(4)低功耗管理
现在几乎所有的单片机都配置有等待状态、睡眠状态、关闭状态等工作方式。CMOS芯片除具有低功耗特征外,还具有功耗的可控性,使单片机可以工作在功耗精细管理状态。此外,有些单片机采用了双时钟技术,即有高速和低速两个时钟,在不需要高速运行时,即转入低速工作以降低功耗;有些单片机采用高速时钟下的分频和低速时钟下的倍频控制运行速度,以降低功耗。低功耗的实现提高了产品的可靠性和抗干扰能力。
(5)外围电路内装化
将众多外围电路全部装入片内,即系统的单片化是目前发展趋势之一。例如,美国Cygnal公司的8位C8051F020单片机,内部采用流水线结构,大部分指令的完成时间为1或2个时钟周期,峰值处理能力为25MIPS。片上集成有8通道A-D、两路D-A、两路电压比较器,内置温度传感器、定时器、可编程数字交叉开关和64个通用I/O口、电源监测、看门狗、多种类型的串行接口(两个UART、SPI)等。一片芯片就是一个“测控”系统。
(6)串行扩展技术
在很长一段时间里,通用型单片机通过并行三总线结构扩展外围器件成为单片机应用的主流结构。随着I2C、SPI等串行总线及接口的引入,推动了单片机“单片”应用结构的发展,使单片机的引脚可以设计得更节约,单片机系统结构更简化和规范化。
(7)ISP更加完善
ISP,In-System Programming的缩写,即在线可编程,指电路板上没有装载程序的空白单片机芯片可以编程写入最终用户代码,而不需要从电路板上取下单片机芯片,已经编程的单片机芯片也可以用ISP方式擦除、改写或再编程。ISP技术是未来发展方向。快擦写存储器(Flash Memory)的出现和发展,推动了ISP技术的发展,使得ISP的实现变得简单。单片机芯片内部的快擦写存储器可以由个人计算机的软件通过串口来进行改写,所以即使我们将单片机芯片焊接在电路板上,只要留出和个人计算机接口的这个串口,就可以实现单片机芯片内部存储器的改写,而无须再取下单片机芯片。
(8)SOC型单片机方兴未艾
随着超大规模集成电路设计技术发展,一个硅片上就可以实现一个复杂的系统,即System On Chip(SOC),即片上系统。狭义上理解,可以将它翻译为“系统集成芯片”,指在一个芯片上实现信号采集、转换、存储、处理和I/O等功能,包含嵌入软件及整个系统的全部内容;广义上理解,可以将它翻译为“系统芯片集成”,指一种芯片设计技术,可以实现从确定系统功能开始,到软硬件划分,并完成设计的整个过程。核心思想是把整个电子系统全部集成在一个芯片中,避免大量PCB设计及板级的调试工作。设计者面对的不再是电路及芯片,而是根据系统的固件特性和功能要求,把各种通用处理器内核及各种外围功能部件模块作为SOC设计公司的标准库,成为VLSI设计中的标准器件,用VHDL等语言描述,存储在器件库中。用户只需定义整个应用系统,仿真通过后就可以将设计图交给半导体器件厂商制作样品。除无法集成的器件外,整个系统大部分均可集成到一块或几块芯片中去,系统电路板简洁,对减小体积和功耗、提高可靠性非常有利。SOC使系统设计技术发生革命性变化,标志着一个全新时代到来。
综上所述,单片机正在向多功能、高性能、高速度(时钟达40MHz)、低电压(0.8V即可工作)、低功耗、低价格(几元钱)、外围电路内装化、片内程序存储器和数据存储器容量不断增大以及SOC型单片机的方向发展。
1.1.2 单片机的应用
目前单片机已渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。如导弹的导航装置,飞机上各种仪表的控制,计算机的网络通信与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及遥控玩具、电子宠物等,这些都离不开单片机。个人计算机中也会有为数不少的单片机在工作,更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。单片机的数量不仅远超过PC和其他计算机的总和,甚至比人类的数量还要多。以下大致介绍一些典型的应用领域和应用特点。
1.家电领域
可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭煲、洗衣机、电冰箱、微波炉、空调机、彩电、摄像机及其他视频音像设备的控制,再到电子秤、儿童玩具以及机器人的控制,五花八门,无所不在。
2.办公自动化领域
现代办公室中所使用的大量通信、信息产品多数都采用了单片机,如通用计算机系统中的键盘译码、磁盘驱动、打印机、绘图仪、复印机、电话、传真机、考勤机等。
3.通信领域
现在的通信设备基本上都实现了单片机智能控制,从调制解调器、传真机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话、集群移动通信、信息网络、无线电对讲机等。
4.商业营销领域
在商业营销系统已广泛使用的电子秤、收款机、条码阅读仪、仓库安全监测系统、商场保安系统、空调调节系统、冷冻保险系统等目前已纷纷采用单片机构成专用系统,主要由于这种系统具有明显的抗病菌侵害、高效高智能化、抗电磁干扰等高可靠性保证。
5.工业控制领域
工业过程控制、过程监测、工业控制器及机电一体化控制系统等除一些小型工控机之外,许多系统都是由单片机为核心的单机或多机网络系统。如工业机器人的控制系统是由中央控制器、感知系统、行走系统、擒拿系统等节点构成的多机网络系统。另外由单片机构成的控制系统形式多样,如工厂流水线的智能化管理、电梯智能化控制、各种报警系统、与计算机联网构成的二级控制系统等。
6.仪器仪表领域
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。例如精密的测量设备(功率计、示波器、各种分析仪)。将单片机与传感器相结合可以构成新一代的智能传感器,它将传感器初级变化后的电量作进一步的变换、处理,输出能满足远距离传送的数字信号。例如将压力传感器与单片机集成在一起的微小压力传感器可随钻机送至井底,以报告井底的压力状况。
7.医疗器械领域
单片机在医用设备中的用途亦相当广泛,例如医用呼吸机、各种分析仪、监护仪、超声诊断设备及病床呼叫系统等。
8.汽车电子领域
单片机在汽车电子中的应用非常广泛,例如汽车中的发动机控制器、基于CAN总线的汽车发动机智能电子控制器、智能自动驾驶系统、GPS导航系统、ABS防抱死系统、制动系统、汽车紧急请求服务系统、汽车防撞监控系统、汽车自动诊断系统以及汽车黑匣子等。
此外,单片机在工商、金融、科研、教育、交通、国防、航空、航天、航海等领域都有着十分广泛的应用。
1.1.3 数制和编码
1.计算机中数据的单位
(1)位(bit)
位简记为b,也称为比特,是计算机存储数据的最小单位。一个“比特”也可以说成“位”,一个二进制位只能表示0或1。
(2)字节(byte)
字节由8位二进制数字构成,一般用大写的“B”表示“byte”,字节是存储信息的基本单位,并规定1B=8bit。
(3)字(Word)
一个字通常由一个字节或若干个字节组成。字节是微型计算机一次所能处理的实际位数长度。
(4)十六进制数字的表示
十六进制数的表示,即后面跟随“H”或“h”后级的数字,或者前面加“0x”或“0X”前级的数字表示是一个十六进制数。
2.数制
计算机只能识别二进制数。用户通过键盘输入的十进制数字和符号命令,计算机是不能识别的,计算机必须把它们转换成二进制形式才能识别、运算和处理,然后再把运算结果还原成十进制数字和符号,并在显示器上显示出来,所以需要对计算机常用的数制和数制间的转换进行讨论。
所谓数制是指计数的规则,按进位原则进行计数的方法,成为进位计数制。数制有很多种,计算机编程时常用的数制为二进制、八进制、十进制和十六进制。
(1)十进制(decimal)
十进制由0~9十个数码组成。十进制的基数是10,低位向高位进位的规律是“逢十进一”。十进制数的主要特点:
1)有0~9十个不同的数码,这是构成所有十进制数的基本符号。
2)逢10进位。十进制在计数过程中,当它的某位计数满10时就要向它邻近的高位进一。
在一个多位的十进制数中,同一个数字符号在不同的数位所代表的数值是不同的。因为,任何一个十进制数不仅与构成它的每个数码本身的值有关,而且还与这些数码在数中的位置有关。如333.3中4个3分别代表300、30、3和0.3,这个数可以写成:
333.3=3×102+3×101+3×100+3×10-1
式中的10称为十进制的基数,指数102,101,100,10-1称为各数位的权。从上式可以看出:整数部分中每位的幂是该位位数减1;小数点后第一位的位权是10-1,第二位的位权是10-2,……,其余位的位权以此类推。
通常,任意一个十进制数N都可以表示成按权展开的多项式:
式(1-1)中,ai是基数10的i次幂的系数,是0~9共10个数字中的任意一个,m是小数点右边的位数,i是位数的序数。
一般而言,对于R进制表示的数N,可以按权展开为
其中,ai是0、1、…、(R-1)中的任一个,m、n是正数,R是基数。在R进制中,每个数字所表示的值是该数字与它相应的权Ri的乘积,计数原则是“逢R进一”。
(2)二进制(binary)
二进制数的主要特点:
1)它有0和1两个数码,任何二进制都是由这两个数码组成。
2)二进制数的基数为2,它奉行“逢二进一”的进位计数原则。
当式(1-1)中R=2时,称为二进制计数制,简称二进制。在二进制数中,只有两个不同码数:0和1,进位规律为“逢二进一”。任何一个数N,可用二进制表示为
例如,二进制数1011.01可表示为
(1011.01)2=1×23+0×22+1×21+1×20+0×2-1+1×2-2
(3)八进制
当R=8时,称为八进制。在八进制中,有0、1、2、…7共8个不同的数码,采用“逢八进一”的原则进行计数。例如,(503)8可表示为
(503)8=5×82+0×81+3×80
(4)十六进制(hexadecimal)
当R=16,称为十六进制数。十六进制数的主要特点:
1)它有0、1、2、3、…、D、E、F共16个数码,任何一个十六进制都由其中的一些或全部数码构成。
2)十六进制的基数为16,进位方式为逢16进1。
十六进制数也可展开成幂级数形式。例如,(3AB.0D)16可表示为:
(3AB.0D)16=3×162+10×161+11×160+0×16-1+13×16-2
各种进制的对应关系见表1-1。
表1-1 十、二、八、十六进制的对应关系
3.不同进制之间的转换
计算机中数的表示形式是二进制,这是因为二进制只有0和1两个数码,可通过晶体管的导通和截止、脉冲的高电平和低电平等方便地表示。此外二进制数运算简单,便于用电子线路实现。在实际编程的过程中,采用十六进制可以大大减轻阅读和书写二进制数时的负担。
例如,11011011=DBH、1001001111110010B=93F2H。
显然,采用十六进制数描述一个二进制数特别简短,尤其在描述的二进制数位数较长时,更令计算机工作者感到方便。
但人们习惯于使用十进制数,为了方便各种应用场合的需要,要求计算机能自动对不同数制的数进行转化。
(1)二进制、八进制、十六进制数转化为十进制数
对于任何一个二进制数、八进制数、十六进制数,均可以先写出它的位权展开式,然后再按十进制进行计算,即可将其转换为十进制数。
例如,二进制数转化为十进制数:
(1111.11)2=1×23+1×22+1×21+1×20+1×2-1+1×2-2=15.75
八进制数转换为十进制数:
(46.12)8=4×81+6×80+1×8-1+2×8-2=38.15625
十六进制转换为十进制数:
(A10B.8)16=10×163+1×162+0×161+11×160+8×16-1=41227.5
(2)十进制数转换成二进制数、八进制数、十六进制数
本转换过程是上述过程的逆过程,但十进制整数和小数转换成二进制、八进制、十六进制整数和小数的方法是不同的,现分别进行介绍。
1)整数部分:除基取余法。分别用基数R不断地去除N的整数,直到商为零为止,每次所得的余数依次排列即为相应进制的数码。最初得到的为最低有效数字,最后得到的为最高有效数字。现列举加以说明。
【例题1-1】试求出十进制数100的二进制数、八进制数和十六进制数。
解:① 转化为二进制数:
把100连续除以2,直到商数小于2,相应的有
把所得余数从高位到低位排列起来便可以得到:100=1100100B。
② 转化为八进制数:
把100连续除以8,直到商数小于8,相应的有
把所得余数从高位到低位排列起来便可以得到:100=144O。
③ 转化为十六进制数:
把100连续除以16,直到商数小于16,相应的有
把所得余数从高位到低位排列起来便可以得到:100=64H
2)小数部分:乘基取整法。分别用基数R(R=2、8或16)不断地去乘N的小数,直到积的小数部分为零(或满足所需精度)为止,每次乘得的整数依次排列即为相应进制的数码。最初得到的为最高有效数字,最后得到的为最低有效数字。
【例1-2】试求出十进制数0.645的二进制、八进制数和十六进制数。
解:① 转化为二进制数:
把所得整数按从高位到低位排列后得到:0.645D≈0.1010011B。
② 转化为八进制数:
把所得整数按从高位到低位排列后得到:0.645D≈0.51217O。
③ 转化为十六进制数:
把所得整数按从高位到低位排列后得到:0.645D≈0.A52EBH。
3)对同时有整数和小数两部分的十进制数,在转化为二进制、八进制和十六进制时,其转换的方法是:先对整数和小数部分分开转换后,再合并起来。
(3)二进制数和八进制数的转换
由于2的3次方是8,所以可采用“三合一”的原则,即从小数点开始分别向左、右两边各以3位为一组进行二进制到八进制数的转换:若不足3位的以0补足,便可将二进制数转换为八进制数。
反之,采用“一分为三”的原则,每位八进制数用三位二进制数表示,就可将八进制数转换为二进制数。
【例1-3】将二进制数1011010101.01111B转换成八进制数。
所以,1011010101.01111B=1325.36O。
例题:将八进制数472.63转换成二进制数。
所以,472.63O=100111010.110011B。
(4)二进制数和十六进制数的转换
由于二进制数和十六进制数间的转换十分方便,再加上十六进制数在表达数据时形式简单,所以编程人员大多采用十六进制数的形式来代替二进制数。
二进制数和十六进制数间的转换同二进制数和八进制数之间的转换一样,采用“四位合一位法”,即从二进制的小数点开始,分别向左、右两边各以4位为一组,不足4位以0补足,然后分别把每组数用十六进制数码表示,并按序相连。
而十六进制数转换成二进制数的转换方法采用“一分为四”的原则,即把十六进制数的每位分别用4位二进制数码表示,然后分别把它们连成一体。
【例1-4】将二进制数1011010101.01111B转换成十六进制数。
所以,1011010101.01111B=2D5.78H。
【例1-5】将十六进制数EF8.7D转换成二进制数。
所以,EF8.7D=111011111000.01101101B。
4.编码
计算机不仅要识别人们习惯的十进制数、完成数值计算问题,而且要处理大量文字、字符和各种符号(标点符号、运算符号)等非数值计算问题。这就要求计算机必须能够识别它们。也就是说,字符、符号和十进制数最终都要转换为二进制格式的代码,即信息和数据的二进制编码。
根据信息对象的不同,计算机中的编码方式(码制)也不同,常见的码制有BCD码和ASCII码。
(1)BCD码
为了在计算机的输入输出操作中能直观迅速地与常用的十进制数相对应,习惯上用二进制代码表示十进制数,这种编码方法简称BCD码(Binary Coded Decimal),其与十进制数对应关系见表1-2。
8421码是BCD的一种,因组成它的4位二进制数每一位的权为8、4、2、1而得名。这种编码形式利用4位二进制码来表示一个十进制的数码,使二进制和十进制之间的转换得以便捷地进行。
表1-2 十进制数与对应的BCD码
(2)ASCII码
目前采用的字符编码主要是ASCII码,即American Standard Code for Information Interchange的缩写。
ASCII码是用7位二进制数编码来表示128个字符和符号,一个ASCII码存放在一个字节的低7位,字节的高位为0,因此可以表示128个不同字符,如附录B所见。
数字0~9的ASCII码为0110000B~0111001B(即30H~39H),大写字母A~Z的ASCII码为41H~5AH。同一个字母的ASCII码的码制小写字母比大写字母大32(20H)。
1.1.4 计算机中数的表示与运算
计算机中的数按数的性质分为:整数(无符号整数、有符号整数)和小数(定点数、浮点数);按有无符号分为:有符号数(正数、负数)和无符号数。
1.无符号数的表示
(1)无符号数的表示形式
无符号数中用来表示数的符号的数位称为符号位。无符号数没有符号位,数的所有数位Dn-1~D0均为数值位。其表示形式为:
(2)无符号二进制数的表示范围
一个n位无符号二进制数X,它可以表示的数的范围为0≤X≤2n-1。若结果超出了数的可表示范围,则会产出溢出,出错。
2.有符号数的表示
有符号数由符号位和数值位两部分组成,数学中的正、负号用符号“+”、“-”来表示,在计算机中规定:用“0”表示“+”,用“1”表示“-”。这样数的符号位在计算机中已经数码化了。符号位数码化后的数就称为机器数,原来的数称为机器数的真值。
计算机的有符号数或者说机器数有3种表示形式:原码、反码和补码。目前计算机中的数是采取补码表示的。
(1)原码
对于一个二进制数X,若最高数位用“0”表示“+”,用“1”表示“-”,其余各数位表示数值本身,则称为原码表示法,记为[X]原。
【例1-6】X=+1101011,Y=-1000011,求[X]原,[Y]原。
[X]原=01101011,[Y]原=11000011
值得注意的是,0在8位单片机中的两种原码形式为:[+0]原=00000000B,[-0]原=10000000B,所以数0的原码不唯一。
8位二进制原码可表示的范围为:-127~+127。
(2)反码
正数的反码表示与其原码相同,负数的反码是其原码的符号位不变、数值各位取反,记为[X]反。
【例1-7】X=+1101011,Y=-1000011,求[X]反,[Y]反。
[X]反=01101011,[Y]反=10111100
0在反码中有两种表示形式:
[+0]反=00000000B,[-0]反=11111111B
(3)补码
正数的原码、反码和补码相同,负数的补码其最高位为1,数值位等于反码数值位的低位加“1”。
【例1-8】X=+1101011,Y=-1000011,求[X]补,[Y]补。
[X]补=01101011,[Y]补=10111101
[+0]补=00000000B,[-0]补=00000000B
由此可见,不论是+0还是-0,0在补码中只有唯一的一种表示形式。
3.无符号数的运算
无符号数的运算主要是无符号数的加、减、乘、除运算与溢出。
(1)二进制数的加减运算
二进制加法运算,每一位遵循如下法则:
0+0=0,0+1=1,1+0=1,1+1=0(向高位有进位),逢二进一。
0-0=0,1-1=0,1-0=1,0-1=1(向高位有借位),借一为二。
(2)二进制数乘法运算
二进制乘法运算,每一位遵循如下法则:0×0=0,0×1=0,1×0=0,1×1=1。其特点是:当且仅当两个1相乘时结果为1,否则为0。二进制数乘法运算过程是若乘数位为1,则将被乘数加于中间结果中;若乘数为0,则加0于中间结果中。
【例1-9】乘数为1101B,被乘数为0101B,求乘积的值。
(3)二进制数除法运算
【例1-10】除数为101,被除数为011010,求商的值。
二进制数除法商的过程和十进制数有些类似,首先将除数和被除数的高n位进行比较,若除数小于被除数,则商为1,然后从被除数中减去除数,得到部分余数;否则商为0。将除数和新的部分余数进行比较,直至被除数所有的位数都处理完毕为止,最后得到商和余数。
4.二进制数的逻辑运算
计算机处理数据时常常要用到逻辑运算,逻辑运算由专门的逻辑电路完成。
(1)逻辑与运算
逻辑与运算常用算符“∧”表示,逻辑与运算的运算法则为:0∧1=1∧0=0,0∧0=0,1∧1=1。逻辑与运算法则可概括为“只有对应的两个二进位均为1时,结果位才为1,否则为0”。
所以,01110101B∧01001111B=01000101B。
(2)逻辑或运算
逻辑或运算常用算符“∨”表示,逻辑或的运算法则为:0∨1=1∨0=1,0∨0=0,1∨1=1。逻辑或运算法则可概括为“只要对应的两个二进位有一个为1时,结果位就为1”。
例如:求00110101B∨0000111B的值。
所以,00110101B∨00000111B=00110111B。
(3)逻辑非运算
逻辑非运算常采用算符“-”表示,运算法则为:,=1。
例如:已知A=10101B,试求的值。
(4)逻辑异或运算
逻辑异或运算常采用算符⊕表示,逻辑异或的运算法则为:0⊕1=1⊕0=1,0⊕0=1⊕1=0。逻辑异或运算可概括为“两对应的二进位不同时,结果为1,相同时为0”。
例如:已知A=10110110B,B=11110000B,试求A⊕B的值。
5.有符号数的运算
原码表示的数虽然比较简单、直观,但由于计算机中的运算电路非常复杂,尤其是符号位需要单独处理。补码虽不易识别,但运算方便,特别在加减运算中更是这样。当所有参加运算的带符号数都用补码表示后,计算机对它运算后得到的结果必然也是补码,符号位则无须单独处理。
(1)补码的加、减法运算
补码加、减法运算的通式为:
[A+B]补=[A]补+[B]补
[A-B]补=[A]补-[B]补
即两数之和的补码等于两数补码之和,两数之差的补码等于两数补码之差。设机器数字长为n,则参与运算的数值的模为2n。A、B、A+B和A-B必须都在-2n~2n-1-1范围内,否则机器便会产生溢出错误。在运算过程中,运算位和数值位要一起参加运算,符号位的进位位略去不计。
【例1-11】已知A=+19,B=10,C=-7。试求[A+B]补、[A-B]补、[A+C]补。
解:[A]补=00010011B,[B]补=00001010B,[-B]补=11110110B,[C]补=11111001B。
1)[A+B]补=[A]补+[B]补=00010011B+00001010B=00011101B;
2)[A-B]补=[A]补+[-B]补=00010011B+11110110B=00001001B(符号位的进位位略去不计);
3)[A+C]补=[A]补+[C]补=00010011B+11111001B=00001100B(符号位的进位位略去不计)。
上述运算表明:补码运算的结果和十进制运算的结果是完全相同的。补码加法可以将减法转化为加法来做;把加法和减法问题巧妙地统一起来,从而实现了一个补码加法器在移位控制电路作用下完成加、减、乘、除的四则运算。
(2)乘法和除法运算
乘法运算包括符号运算和数值运算。两个同符号数相乘之积为正,两个异符号数相乘之积为负;数值运算是对两个数的绝对值相乘,它们可以被视为无符号数的乘法,无符号数的乘法运算在前面章节中已经做了介绍。
除法运算也包括符号运算和数值运算。两个同符号数相除商为正,两个异符号数相除商为负;数值运算是对两个数的绝对值相除,它们可以被视为无符号数的除法。
注意:在计算机中凡是有符号数一律用补码表示且符号位参与运算,其运算结果也用补码表示。若结果的符号位为0,则表示结果为正数,此时可以认为就是它的原码形式;若结果的符号位为1,则表示结果为负数,它是以补码形式表示的。若要用原码来表示该结果,还需要对结果求补(除符号位外取反加1,[[X]补]补=[X]原)。
(3)对补码运算结果正确性的判断
对8位机而言,如果运算结果超出-128~+127,则称为溢出(小于-128的运算结果称为下溢,大于+127称为上溢)。也就是说如果参加运算的两数或运算结果超出8位数所能表示的范围,则机器的运算就会出现溢出,运算结果就不正确。因此,补码运算的正确性主要体现在对补码运算结果的溢出判断上。
在MCS-51单片机中,补码运算结果中的符号位的进位位用Cp表示,用Cs表示补码运算过程中次高位向符号位的进位位。若加法过程中符号位无进位(Cp=0)以及最高数值位有进位(Cs=1),则操作结果产生正溢出;若加法过程中符号位有进位(Cp=1)以及最高数值位无进位(Cs=0),则操作结果产生负溢出。
用OV表示溢出标志位,判断补码运算是否溢出的逻辑表达式可描述为:
OV= C p⊕C s
【例1-12】已知A=-127,B=10,C=-7,试求[A+B]补、[A+C]补,并分析溢出情况。
[A]补=01111111B,[B]补=00001010B,[C]补=11111001B
[A+B]补算式为:
从上式可以看出,[A+B]补超出了8位二进制数能够表示的范围,无论符号Cp有无进位,都产生了溢出。运算结果Cp=0,Cs=1,利用OV= Cp⊕Cs可以判断出[A+B]补带符号数补码加法运算的结果产生了溢出,所以结果不正确。
[A+C]补算式为:
[A+C]补的运算结果是正确的,没有产生溢出,符号进位Cp属于正常的自动丢弃。运算结果Cp=1,Cs=1,根据式OV= Cp⊕Cs可以判断出[A+C]补带符号数补码加法运算的结果没有产生溢出,从而结果正确。
从上面两个例子可以看出,带符号数相加时,符号位所产生的进位Cp有自动丢弃和用来指示操作结果是否溢出的两种功能。