1.2 单片机的数制与编码
单片机是计算机的一种类型,因此所采用的数制与编码也和计算机中的相同。
计算机内部是由各种基本的数字电路构成的,只能识别和处理数字信息。而数字电路中的各种数据都是以二进制数表示,因为它易于物理实现。同时,数据的存储、传送、处理简单可靠,不仅可以实现数值运算,而且还可以实现逻辑运算。但二进制数书写时太长,不方便阅读和记忆,因此,常采用十六进制数来书写。
1.2.1 计算机中的常用数制
1.进位计数制的概念
使用有限个基本数码来表示数据,按进位的方法进行计数称为进位计数制。包含两大要素:基数和位权。
基数:用来表示数制基本数码的个数,大于此数后必须进位。
位权:数码在表示数据时所处的数位所具有的单位常数,简称“权”。
任意一个J进制数的表示方法为
其中,Ki=0,1,…,J-1,为第i位的数码; m为小数部分位数; n为整数部分位数。
2.单片机中常用的数制
(1)十进制(Decimal)数
特点:[1] 基数为10,有0,1,…,9共10个数码,逢10进1;[2] 各位的权为10i。
任意一个十进制数的表示方法为
其中,Ki=0,1,2,3,4,5,6,7,8,9。
例如:(273.45)10=2×102+7×101+3×100+4×10-1+5×10-2。
(2)二进制(Binary)数
特点:[1] 基数为2,有0,1两个数码,逢2进1;[2] 各位的权为2i。
任意一个二进制数的表示方法为
其中,Ki=0,1。
例如:(1 011.101)2=1×23+0×22+1×21+1×20+1×2-1+0×2-2+1×2-3。
(3)十六进制(Hexadecimal)数
特点:[1] 基数为16,有0~9和A,B,C,D,E,F (对应十进制10~15)共16个数码,逢16进1;[2] 各位的权为16i。
任意一个十六进制数的表示方法为
其中,Ki=0~9,A~F。
例如:(A87.E79)16=A×162+8×161+7×160+E×16-1+7×16-2+9×16-3。
为了区别这几种数制,可在数的后面加上数字下标2、10、16,也可以加一字母。用B表示二进制数;D表示十进制数;H表示十六进制数。如果后面的数字或字母被省略,则表示该数为十进制数。
3.各种数制间的转换
(1)J进制转换为十进制
方法:只需按权展开相加即可。
例如:
(2)十进制转换为J进制
十进制转换为J进制时,必须将整数部分和小数部分分开转换。
[1] 整数部分的转换:把十进制的整数不断地除以所需要的基数J,直至商为零,所得余数依倒序排列,就能转换成以J进制数的整数部分,这种方法称为除基取余法。
[2] 小数部分的转换:要将一个十进制小数转换成J进制小数时,可不断地将十进制小数部分乘以J,并取整数部分,直至小数部分为零或达到一定精度时,将所得整数依顺序排列,就可以得到J进制数的小数部分,这种方法称为乘基取整法。
例如:
115.375D=1110011.011B
116.84375D=74.D8H
(3)二进制与十六进制数的相互转换
由于二进制的基数是2,而十六进制的基数为16=24,即4位二进制数正好对应一位十六进制数,因此二者之间的转换十分方便。方法如下:
以小数点为中心,整数部分从右向左,每4位二进制数对应为一位16进制数,整数部分不足4位高位加0;小数部分从左向右,每4位二进制数对应一位16进制数,小数部分不足4位低位加0。
例如:
B6.8H=1011 0110.1000B=10110110.1B
11011.011B=0001 1011.0110B=1B.6H
1.2.2 计算机中数的表示
在实际控制过程中,数是有正有负的,而计算机只能识别0、1两种信息,那么正、负数在计算机中如何表示呢?
1.机器数与真值
机器数是指机器中数的表示形式。它将数值连同符号位一起数码化,表示成一定长度的二进制数,其长度通常为8的整数倍。机器数通常有两种:有符号数和无符号数。有符号数的最高位为符号位,代表了数的正负,其余各位用于表示数值的大小;无符号数的最高位不作为符号位,所有各位都用来表示数值的大小。
真值是指机器数所代表的实际正负数值。
有符号数的符号数码化的方法通常是将符号用“0正1负”的原则表示,并以二进制数的最高位作为符号位。
2.有符号数的表示方法
有符号数的表示方法有原码、反码和补码3种。以下均以长度为8位的二进制数表示有符号数。
(1)原码表示法
将8位二进制数的最高位(D7位)作为符号位(0正1负),其余7位D6~D0表示数值的大小。
例如:+55的原码为 0 0110111B
-55的原码为 1 0110111B
有符号数的原码表示范围为-127~+127 (FFH~7FH),其中0 的原码有两个00H 和80H,分别是+0的原码和-0的原码。原码表示简单,与真值转换方便,但进行加、减运算时电路实现较为繁杂。
(2)反码表示法
正数的反码与原码相同,但负数的反码其符号位不变,其余各数值位按位取反。
例如:+0的反码为 0 0000000B; +127的反码为 0 1111111 B
-0的反码为 1 1111111 B; -127的反码为 1 0000000 B
有符号数的反码表示的范围为-127~+127,其中0的反码与原码类似,也有两个值。
(3)补码表示法
正数的补码与原码相同,负数的补码等于其反码加1(即相应数值的原码按位取反,再加1)。
例如:-127的补码为 1 0000001B;-1的补码为 1 1111111B。
有符号数补码表示的范围为-128~+127,其中0 的补码只有一种表示,即+0=-0=00000000。当有符号数用补码表示时,可以把减法转换为加法进行计算。
1.2.3 常用编码
1.BCD码
由于人们习惯于使用十进制数,但计算机又不能识别十进制数,为了将十进制数用二进制表示,并按十进制的运算规则运算,就出现了 BCD (Binary Code Decimal)码。BCD码就是二—十进制编码。它用4 位二进制数表示一位十进制数,称为压缩的 BCD码。因为4位二进制数共有24=16 种组合状态,故可选其中10 种编码来表示0~9 这10个数字,不同的选法对应不同的编码方案。按编码方案的不同又可分为有权码和无权码。有权码主要有 8421、2421 等,无权码有余 3 码、格雷码等。这里主要介绍8421BCD码。
8421 BCD码是一种最常用的编码。4位二进制码的权分别为8、4、2、1。其特点如下。
[1] 由4位二进制数0000~1001分别表示十进制数0~9。
[2] 每4位二进制数进位规则应为逢10进1。
[3] 当进行两个BCD码运算时,为了得到BCD码结果,需进行十进制调整。调整方法为:加(减)法运算的和(差)数所对应的每一位十进制数大于9时或低4位向高4位产生进(借)位时,需加(减)6调整。
例1-19172=(1001 0001 0111 0010)BCD
例1-2用BCD码运算48+69=?
在计算机中有专门的调整指令用于完成调整操作,不需要编程完成加6操作。
2.ASCII码
美国标准信息交换码简称 ASCII (American Standard Code for Information Interchange)码,用于表示在计算机中需要进行处理一些字母、符号等。ASCII码是由7位二进制数码构成的字符编码,共有27=128种组合状态。用它们表示了52个大小写英文字母、10个十进制数、7个标点符号、9个运算符号及50个其他控制符号。在表示这些符号时,用高3位表示行码,低4位表示列码,详见附录A。