首页 理论教育 单片机常用的码制-基于汇编与C语言的单片机原理及应用

单片机常用的码制-基于汇编与C语言的单片机原理及应用

时间:2023-10-23 理论教育 版权反馈
【摘要】:4位二进制数可以表示16种不同的状态,所以用以表示十进制数时要丢掉6种状态。

单片机常用的码制-基于汇编与C语言的单片机原理及应用

计算机除了用于数值计算外,还要进行大量的文字信息处理,也就是要对表达各种文字信息的符号进行加工。例如,计算机与外设的键盘、(字符显示器、打印机之间的通信都采用字符方式输入/输出。目前,计算机中最常用的两种编码是二—十进制编码(BCD码)和美国信息交换标准代码(ASCII码)。

1.6.3.1 BCD码

计算机中采用的是二进制数,由于二进制数不直观,人们不习惯,因此计算机在输入和输出时,人们通常仍采用十进制数,但十进制数不能直接在计算机中进行处理,必须用二进制为它编码,这样就产生了二进制编码的十进制数,简称BCD(Binary Coded Decimal)码。这样使用BCD码就很方便。

BCD(二—十进制)码是一种常用的数字代码,它广泛应用于计算机中。这种编码法分别将每位十进制数字编成4位二进制代码,从而用二进制数来表示十进制数。

十进制基数为10,它有10个不同的数码。因此为了能表示十进制数的某一位,必须选择至少4位二进制数。4位二进制数可以表示16种不同的状态,所以用以表示十进制数时要丢掉6种状态。可以使用不同的方法来处理这些数码,因而产生了各种不同的BCD码,但最通用的是8421 BCD码,它是将十六进制数的A~F放弃不用。最常用的BCD码就是8421码或称标准BCD码(这是根据这种表示中各位的权值而定的,其权值与普通的二进制相同)。表1-1列出了标准BCD码与十进制数字的编码关系。

例如:89=(1000 1001)BCD,105=(0001 0000 0101)BCD,2012=(0010 0000 0001 0010)BCD,0.764=(0.0111 0110 0100)BCD。可见,BCD码是很容易编制的,而且用它来表示十进制数也比较直观,但是一定要区别于二进制数,两者表征的数值完全不同,例如:(0010 0000 0000 0101.1001)BCD=2005.9,(0010 0000 0000 0101.1001)2=8197.5625。

表1-1 标准BCD码与十进制数字的编码关系

BCD码的不足之处是抛弃了二进制中6/16的信息位不使用,非压缩的BCD码浪费更大,在相同的二进制位数条件下,BCD能表示的数值范围变窄。换言之,如果信息量相同的话,那么使用BCD数据占用的内存空间比使用纯二进制数据要大得多。

1.BCD码表示的两种形式

BCD码表示十进制数分为压缩型(也称组合型)和非压缩型(也称非组合型)两种BCD码。其中压缩型BCD码用4位二进制数表示1位十进制数,这样8位二进制数就能表示2位十进制数;而非压缩型BCD码用8位二进制数来表示1位十进制数,它的低4位表示1位十进制数,高4位总是0000。例如,94的压缩型BCD码是1001 0100B,它的非压缩型BCD码是0000 1001 0000 0100B。

压缩型BCD码比非压缩型BCD码能节省一半存储空间,但由于BCD运算需借用二进制运算电路进行,因此直接运算的结果一般是错误的,需要进行调整,才能得到正确的结果。压缩型BCD码运算调整规则比非压缩型BCD码要复杂,它需对低4位和高4位的结果分别进行调整,而非压缩型BCD码只需对低4位进行调整。

2.BCD数的加减运算

BCD码的运算规则:BCD码是十进制数,而计算机的运算器对数据做加、减运算时,都是按二进制运算规则进行处理的。这样,当将BCD码传送给运算器进行运算时,其结果需要修正。修正的规则是:当两个BCD码相加(或相减)时,如果和等于或小于1001(即十六进制数9),不需要修正;如果相加(或相减)的结果在1010到1111(即十六进制数A~F)之间,则需加6(或减6)进行修正;如果相加(或相减)时,本位产生了进位(或借位),也需加6(或减6)进行修正。这样做的原因是,机器按二进制相加,所以4位二进制数相加时,是按“逢十六进一”的原则进行运算的,而实质上是2个十进制数相加,应该按“逢十进一”的原则相加,16与10相差6,所以当结果超过9或有进位(或借位)时,都要加6(或减6)进行修正。上面这种调整规则也称“超9补6补偿法”。

【例1-9】 采用压缩型BCD码计算18+19。

结果应为37,而计算机相加为31,原因在于运算过程中,个位数遇到低4位往高4位产生进位时(此时AF=1,AF:辅助进位标志位)是按逢十六进一的规则,但BCD码要求逢十进一,因此只要产生进位,个位就会少6,这就要进行加6调整。实际上当低4位的结果>9(即A~F之间)时,也应进行加6调整。(原因是逢十没有进位,故用加6的方法强行产生进位。)由于十位数(高4位)运算没有出现进位(CY=0)或结果>9的情况,因此,十位数不需做加6调整。

如对上例的结果进行加6:

修正后结果正确。(www.xing528.com)

实际上,在计算机中有相应的十进制调整指令,无论对于加法或减法,机器能按照规则自动进行调整,人们只管放心使用就是了。

1.6.3.2 ASCII码

ASCII(American Standard Code for Information-Interchange)码是美国信息交换标准代码的简称,它使用指定的7位或8位二进制数组合来表示128或256种可能的字符。标准ASCII码(也称基础ASCII码)使用7位二进制代码来对字符进行编码,包括32个标点符号,10个阿拉伯数字,52个英文大、小写字母,34个控制符号,共128个。附录A为标准ASCII码字符表。表中,0~32(00 H~20 H)及127(7FH)是34个控制字符或通讯专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10和13分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。33~126(共94个)是字符,其中48~57(30 H~39 H)为0到9十个阿拉伯数字;65~90(41 H~5AH)为26个大写英文字母,97~122(61H~7AH)为26个小写英文字母,其余为一些标点符号、运算符号等。

在计算机内部,每个ASCII码字符占用1个字节(8位二进制数),标准ASCII的最高位(b7)一般为0或作为奇/偶校验位。所谓奇/偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验时,最高位b7的取值应使得8位ASCII码中1的个数为奇数;偶校验时,最高位b7的取值应使得8位ASCII码中1的个数为偶数。例如:“8”的奇校验ASCII码为00111000B,偶校验ASCII码为10111000B;“B”的奇校验ASCII码为11000010B,偶校验ASCII码为01000010B。奇偶校验的主要目的是用于在数据传输中,检测接收方的数据是否正确。收发双方先预约为何种校验,接收方收到数据后检验1的个数,判断是否与预约的校验相符,倘若不符,则说明传输出错,可请求重新发送。

后128个称为扩展ASCII码,目前许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII码允许将每个字符的第8位用于确定附加的128个特殊符号字符、外来语字母和图形符号

注意,数字0~9的ASCII码与非压缩BCD码表示很相似,两者的低4位完全相同,都用0000~1001表示0~9;两者的差别仅在高4位,ASCII码为0011,而非压缩BCD码为0000。

ASCII码一般在计算机的输入/输出设备使用,而二进制码和BCD码则在运算、处理过程中使用。因此,在应用计算机解决实际问题时,常常需要在这几种机器码之间进行转换。

1.6.3.3 汉字的编码

西文是拼音文字。用有限的几个字母(如英文用26个字母,俄文用32个字母)可以拼写出全部西文信息。因此,西文仅需对有限个数的字母进行编码,就可以将全部西文信息输入计算机。而汉字信息则不一样,汉字是象形文字,1个汉字就是1个方块图形。计算机要对汉字信息进行处理,就必须对数目繁多的汉字进行编码,建立一个有几千个汉字的编码表。西文编码是几十个字符的小字符集,汉字编码是成千上万个汉字的大字符集。因此,汉字的编码远比西文字母的编码要复杂得多。

汉字编码有内码和外码之分。外码(又称汉字的输入编码)是指汉字的输入方式,目前我国公布的汉字编码有上百种。其编码的方法可以按照汉字的字形、字音和音形结合分为3类。常用的输入方式有区位码、国标码、首尾码、拼音码、双拼双音码、五笔字型码、自然码、ABC码和郑码等。内码是计算机系统内部进行汉字信息存储、交换和检索等操作的编码。汉字内码采用2字节表示,没有重码,并要求与国标码有简单的对应关系。应该指出,汉字的输入编码和内码是两个不同概念,不可混为一谈。

国标码(又称交换码)是根据汉字的常用程度定出了一级和二级汉字字符集及其相应编码,也就是《国家标准信息交换用汉字编码基本字符集》的简称(编号GB 2312—1980)。该标准按94×94的二维代码表形式,收集了6763个汉字和682个一般字符、序号、数字,22个拉丁字母希腊字母汉语拼音符号等,共7445个图形字符。该标准最多可包含8836个图形字符,适用于一般汉字处理、汉字通信等系统之间的信息交换。国标码的每一个字节的定义域在21 H到7EH。国标码中,汉字的排列顺序为:一级汉字按汉语拼音字母顺序排列,同音字母以画划顺序为序;二级汉字按部首顺序排列。

现将区位码、国标码和内码作简要说明如下。

(1)区位码:用每个汉字在二维代码表中行、列位置(行号称为区号,列号称为位号)来表示的代码,称为该汉字的区位码。区位码是汉字的输入编码。

(2)国标码:国标码=区位码+32,区号和位号各增加32以后所得到的双7位二进制编码。国标码用于不同汉字系统之间汉字的传输和交换,可用作汉字的输入编码。

(3)机内码:英文DOS的机内码是ASCII码,国标码是双7位二进制编码,用作内码将会与标准ASCII码相混淆,为此利用标准ASCII码最高位为“0”这一特点,把2字节国标码的每个字节的最高位置“1”,以示区别。这样,形成了汉字的另外一种编码方法,即汉字的机内码。简单地说,机内码=国标码+128或机内码=区位码+160。如汉字“啊”的国标码为00110000,00100001,即30H,21H则它的内码为10110000,10100001,即B0 H,A1H。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈