- 單片機原理與接口技術(第2版)
- 吳曉蘇 張中明
- 2525字
- 2020-09-07 00:09:51
1.4 單片機中的數制與碼制
1.4.1 數制及其轉換
常用的表達整數的數制有二進制數、十進制數、十六進制數3種,其中計算機處理的一切信號都是由二進制數表示的;人們日常用的是十進制數;十六進制數則用來縮寫二進制數。3種數制之間可以相互轉換。它們之間的關系見表1-2。為了區別十進制數、二進制數及十六進制數3種數制,在數的后面加一個字母以進行區別。用B表示二進制數;用D或不帶字母表示十進制數;用H表示十六進制數。
表1-2 十進制、二進制、十六進制數對照表

1.二進制數和十進制數之間的相互轉換
二進制轉換成十進制,可采用展開求和法。即將二進制數按權展開再相加。
例如:

十進制轉換成二進制可采用除2取余法。即用2不斷地去除待轉換的十進制數,直至商等于0為止,再將所得的各次余數依次倒序排列。

即43D=101011B。
2.二進制數和十六進制數之間的相互轉換
二進制數轉換為十六進制數,只需將二進制數從右向左每4位為一組分組,最后一組若不足4位,則在其左邊添加0,以湊成4位,每組按表1-2用1位十六進制數表示。
例如:10011100100B→0100 1110 0100B=4E4H
十六進制數轉換為二進制數,只需按表1-2用4位二進制數表示1位十六進制數。
例如:8DF3H=1000 1101 1111 0011B
1.4.2 有符號數的表示
數值在計算機中表示形式為機器數,由于計算機只能識別0和1,因此我們用來表示數值正負的“+”和“-”在計算機中也只能用“0”和“1”表示。一般在計算機中,對于正數,最高位規定為“0”;對于負數,最高位規定為“1”。
例如:

有符號數在計算機中有原碼、反碼和補碼3種表示方法。
1.原碼
用最高位表示數的正負,其余各位表示數的絕對值,這種表示方法稱為原碼表示法。
例如:

如果計算機的數據寬度為8,即字長為1字節,則原碼能表示數值的范圍為FFH~7FH(-127~-0,+0~+127),共256個。原碼表示“0”時,可以有兩種數值,即00000000B(+0)和10000000B(-0),這將會造成混亂,導致計算出錯。
在計算機進行數值運算時一般不采用原碼運算。
例如:在計算1-1=0時,為了簡化計算機的硬件結構,把減法運算轉換為加法運算,即采用1+(-1)去計算,會發現[1]原碼+[-1]原碼=00000001B+10000001B=10000010B=-2,即計算出錯。
2.反碼
正數的反碼與原碼相同;負數的反碼為其原碼的符號位不變,數值部分按位取反。
例如:[+5]反碼=[+5]原碼=00000101B=05H
[-5]反碼=11111010B=FAH
如果計算機的數據寬度為8,即字長為1字節,則反碼能表示數值的范圍為80H~7FH(-127~-0,+0~+127),共256個。反碼表示“0”時,可以有兩種數值,即00000000B(+0)和11111111B(-0)兩種數值。在數值運算中也易出錯。
3.補碼
正數的補碼與原碼相同;負數的補碼為其反碼加1,但符號位不變。
例如:[+5]補碼=[+5]反碼=[+5]原碼=00000101B=05H
[-5]補碼=[-5]反碼+1=11111010B+1=11111011B=FBH
[+0]補碼=[+0]原碼=[+0]反碼=00000000B=00H
在求-0的補碼時,我們會發現[-0]原碼=10000000B,[-0]反碼=11111111B,加1后得100000000B,最高位產生了溢出,為了符合補碼的定義和運算規則,將10000000B(80H)的補碼真值定義為-128。也就是說,用補碼表示“0”時,只有一種數值,即00000000B(+0)。補碼的表示范圍為80H~7FH(-128~+127),共256個。80H(10000000B)在計算機中表示最小的負整數,即-128,10000001~11111111依次表示-127~-1。在減法運算時,運用補碼可以把減法運算轉換為加法運算,運算結果是完全正確的。請讀者熟記-128的補碼是80H,0的補碼是00H。
例如:計算1-1=0,用補碼計算:(結果超過8位,最高位的“1”自然丟失),結果正確。
求負數的補碼也可以用“模”來計算:[X]補碼=模+X
“模”是計數系統的過程量回零值。如時鐘以12為模,時鐘從某一位置撥到另一位置總有兩種撥法,即順撥和逆撥。例如從6點撥到5點,可以逆撥,即6?1=5;也可以順撥,即6+11=12(自動丟失)+5=5。這里11就是-1的補碼,也就是說,運用補碼可以把減法運算轉化為加法運算。
計算機中8位二進制數的模為28=256=100H。例如[-5]補碼=模+(-5)=100H-05H=FBH。
綜上所述,可得出以下幾個結論。
① 在計算機中,帶符號數都是以補碼的形式儲存的,學習原碼和反碼的目的是為了更好地理解補碼。
② 補碼表示法能使符號位與有效值部分一起參加運算,從而簡化運算規則。
③ 補碼表示法能使減法運算轉換為加法運算,簡化計算機的硬件結構。
1.4.3 十進制數的編碼——BCD碼
人們在生活中習慣于使用十進制數,而計算機只能識別二進制數,為了讓十進制數能被計算機識別,產生了BCD碼(Binary Coded Decimal Code),即用二進制代碼表示十進制數。例如計算器就采用 BCD 編碼運算。這種編碼的特點是保留十進制的權,數字則用二進制表示。即仍然是逢十進一,但又是一組二進制代碼。
1.編碼方法
BCD碼有多種表示方法,最常用的BCD碼為8421碼,編碼方式見表1-3。每4位二進制數表示一個十進制字符,這4位中各位的權依次是8、4、2、1,因此稱為8421BCD碼。
表1-3 8421BCD碼與十進制數的對應關系

2.BCD碼的運算
由于4位二進制數最多可以表示16種狀態,余下的6種未用碼(1010、1011、1100、1101、1110、1111),在BCD碼中稱為非法碼或冗余碼。從表1-3中可以看出,1位十進制數是逢十進位(借位)的,而4位二進制數是逢十六進位(借位)的,當計算結果有非法碼或 BCD 碼產生進位(借位)時,加法進行加6修正,減法進行減6修正。
例如:計算26+5=31,若用BCD碼運算

需進行十進制修正

例如:計算27–9=18,若用BCD碼運算

需進行十進制修正

需要指出的是,BCD碼屬于無符號數,其減法若出現被減數小于減數時,需向更高位借位,運算結果與十進制數不同。例如,十進制數:29?30=?1(有符號);BCD碼:29?30=129?30=99(無符號)。
在單片機中,由專門的BCD碼調整指令DA來完成BCD碼的修正。
1.4.4 ASCII碼
由于計算機只能處理二進制數,因此除了數值本身需要用二進制數形式表示外,另一些要處理的信息(如字母、標點符號、數字符號、文字符號等)也必須用二進制數表示,即在計算機中需將這些信息代碼化,以便于計算機識別、存儲及處理。
目前,在微機系統中,世界各國普遍采用美國信息交換標準碼——ASCII碼(American Standard Code for Information Interchange),見表1-4,用7位二進制數表示一個字符的ASCII碼值。
表1-4 ASCII碼編碼表

注:①、②符號取決于使用這種代碼的機器。其中①還可以表示“→”;②還可以表示“↑”。
由表1-4可知,7位二進制數能表達27=128個字符,其中包括數碼(0~9)、英文大寫字母(A~Z)、英文小寫字母(a~z)、特殊符號(!,?,@,#等)和控制字(NUL,BS,CR,SUB等)。7位ASCII碼分成兩組:高3位一組,低4位一組,分別表示這些符號的列序和行序。
在計算機系統中,存儲單元的長度通常為8位二進制數,為了存取方便,規定一個存儲單元存放一個ASCII碼,其中低7位為字母本身的編碼,第8位往往用作奇偶校驗位或規定為零。因此,也可以認為ASCII碼的長度為8位。