- 單片機C語言應用100例
- 王東鋒 陳園園 郭向陽編著
- 3105字
- 2018-12-27 05:15:11
1.2 單片機基礎知識
在日常的生活當中,人們習慣用十進制來表示數,但計算機只能識別二進制數。二進制是計算機中數制的基礎。
1.2.1 數制與數制間的轉換
1. 數制
按進位的原則進行計數,稱為進位計數制,簡稱“數制”。數制有多種,在計算機中常用的有十進制數、二進制數和十六進制數。
(1)十進制數
按“逢十進一”的原則進行計數,它的基數為“十”,所使用的數碼為0~9共10個數字。對于任意4位十進制數,都可以寫成如下形式:
D3D2D1D0=D3×103+D2×102+D1×101+D0×100
式中,D3、D2、D1、D0稱為數碼;10為基數;103、102、101、100是各位數碼的“位權”,該式稱為按位權展開式。
例:30681=3×104+0×103+6×102+8×101+1×100
(2)二進制數
按“逢二進一”的原則進行計數,它的基數為“二”,其使用的數碼只有0和1兩個。二進制數在計算機中容易實現,可以用電路的高電平表示“1”,低電平表示“0”。或者用三極管截止時集電極的輸出表示“1”,導通時集電極輸出表示“0”。
對于任意一個4位二進制數,都可以寫成如下形式:
B3 B 2 B 1 B 0=B 3×23+B 2×22+B 1×21+B 0×20
式中,B 3、B 2、B 1、B 0 稱為數碼;2為基數;23、22、21、20 是各位數碼的“位權”。
例:(1101)2=1×23+1×22+0×21+1×20=13
由于二進制運算實行的借進位規則是“逢二進一,借一當二”,因此二進制的運算規則相當簡單。
加法:0+0=0;0+1=1;1+0=1;1+1=10
減法:0-0=0;1-0=1;1-1=0;10-1=1
乘法:0×0=0;0×1=0;1×0=0;1×1=1
除法:0÷1=0;1÷1=1
例:求(1101)2×(101)2的值。

因此,可得(1101)2 ×(101)2=(100001)2
(3)十六進制數
由于二進制位數太長,不易記憶和書寫,因此人們又提出了十六進制的書寫形式。在單片機的C語言程序設計中經常用到十六進制數。
按“逢十六進一”的原則進行計數,它的基數為“十六”,所使用的數碼共有16個:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E和F。其中,A、B、C、D、E和F所代表的數的大小相當于十進制的10、11、12、13、14和15。對于任意4位一個十六進制數,都可以寫成如下形式:
H3 H 2 H 1 H 0=H 3×163+H 2×162+H 1×161+H 0×160
式中,H 3、H 2、H 1、H 0稱為數碼;16為基數;163、162、161、160是各位數碼的“位權”。
例:(120B)16=1×163+2×162+0×161+11×160=4619
2. 數制間的轉換
將一個數由一種數制轉換成另一種數制稱為數制間的轉換。
(1)十進制數轉化為二進制數
十進制數轉化為二進制數采用“除2取余法”,即將十進制數依次除以2,并依次記下余數,一直除到商為0,最后把全部余數按相反次序排列,就能得到二進制數。
例:把十進制數45轉化為二進制數。

因此可得45=(101101)2
(2)二進制數轉化為十進制數
二進制數轉化為十進制數采用“位權法”,即把各非十進制數按位權展開,然后求和。
例:把(1011)2轉化為十進制數。
(1011)2=1×23+0×22+1×21+1×20=11
(3)二進制數轉化為十六進制數
將二進制數轉化為十六進制數的規則是,從右向左,每4位二進制數轉化為1位十六進制數,不足部分用0補齊。
例:把(101101101101)2轉化為十六進制數。
把(101101101101)2寫成下面形式:

所以,(101101101101)2=(B6D)16
(4)十六進制數轉化為二進制數
十六進制數轉化為二進制數的方法是,從左到右將待轉換的十六進制數中的每個數碼依次用4位二進制數表示。
例:將十六進制數(31AB)16轉化為二進制數將每位十六進制數寫成4位二進制數,即

因此可得,(31AB)16=(0011000110101011)2
1.2.2 單片機中數的表示方法及常用數制的對應關系
1. 數的表示方法
為了便于書寫,特別是方便編程時書寫,規定在數字后加一個字母以示區別。二進制后加B;十六進制后加H;十進制后面加D,其中D可以省略。
例:3BH=00111011B=59D=59
2. 常用數制的對應關系
表1-1列出了常用數值的各種數制間的對應關系。這在單片機C語言程序設計中經常用到,需要熟練掌握。
1.2.3 邏輯數據的表示
表1-1 常用數制的對應關系

為了使計算機具有邏輯判斷能力,就需要邏輯數據,并能對它們進行邏輯運算,得出一個邏輯式的判斷結果。每個邏輯變量或邏輯運算的結果產生邏輯值,該邏輯值只能取“真”或“假”兩個值。判斷成立時為“真”,判斷不成立時為“假”。在計算機內常用“0”和“1”表示這兩個邏輯值,“0”表示假,“1”表示真。因此,在邏輯電路中,輸入和輸出只有兩種狀態,即高電平“1”和低電平“0”。

圖1-5 二極管與電阻構成的邏輯“與”電路
最基本的邏輯運算有邏輯“與”、邏輯“或”及邏輯“非”3種。
1. 邏輯“與”
邏輯“與”也稱之為邏輯乘,最基本的“與”運算有兩個輸入量和一個輸出量。圖1-5所示為二極管與電阻構成的邏輯“與”電路。其中,A、B為輸入端,Y為輸出端,+5V電壓經R1、R2分壓,在E點得到+3V的電壓。
(1)邏輯“與”的實現原理
當A、B兩端同時輸入低電平(0V)時,由于E點電壓為3V,因此,二極管 VD1、VD2都導通,E點電壓馬上降到0.7V(低電平)。也就是說,當A、B兩端同時輸入低電平“0”時,Y端輸出低電平“0”。
當A端輸入低電平(0V),B端輸入高電平(5V)時,由于E點電壓為3V,因此,二極管VD1馬上導通,E點電壓馬上降到0.7V(低電平),而二極管VD2處于截止狀態。此時,Y端輸出低電平“0”。
當A端輸入高電平(5V),B端輸入低電平(0V)時,二極管VD1截止,二極管VD2則處于導通狀態,E點仍為0.7V(低電平)。此時,Y端輸出低電平“0”。
當A、B兩端同時輸入高電平(5V)時,二極管 VD1、VD2都不能導通,E點電壓為3V(高電平)。此時,Y端輸出高電平“1”。
由此可見,只有當輸入端均為高電平時,輸出端才會輸出高電平;只要有一個輸入端輸入低電平,輸出端就會輸出低電平。這就是邏輯“與”運算的特點。
(2)真值表
真值表列出電路的各種輸入值和對應的輸出值,可以直觀地看出電路的輸入與輸出之間的關系。表1-2列出了邏輯“與”的真值表。
表1-2 邏輯“與”的真值表

(3)邏輯表達式與運算規則
邏輯“與”的表達式為
Y =A·B
邏輯“與”的運算規則可總結為“有0為0,全1出1”。
2. 邏輯“或”
邏輯“或”也稱為邏輯加,最基本的邏輯“或”運算有兩個輸入量和一個輸出量。它的邏輯表達式為
Y =A+B
邏輯“或”的運算規則可總結為“有1為1,全0出0”。
3. 邏輯“非”
邏輯“非”即取反,它的邏輯表達式為
Y =
邏輯“非”的運算規則可總結為“1的反為0,0的反為1”。
若在一個邏輯表達式中出現多種邏輯運算,可用小括號指定運算的次序;無小括號時按邏輯“非”、邏輯“與”和邏輯“或”的順序執行。
1.2.4 單片機中常用的基本術語
下面通過一個例子來說明單片機是如何表示數的。
一盞燈要么“亮”,要么“滅”,只有兩種狀態。如果規定用燈亮為“1”,滅為“0”,那么一盞燈可以表示的數為0和1,共21=2個數。
兩盞燈可以有“滅滅”、“滅亮”“亮滅”和“亮亮”共4種狀態,即“00”、“01”、“10”和“11”,而二進制數00、01、10和11分別相當于十進制數的0、1、2和3。所以,兩盞燈可以表示的數為0、1、2和3,共22=4個數。
三盞燈的全部狀態可以表示為,“000”、“001”、“010”、“011”、“100”、“101”、“110”和“111”,所以,三盞燈可以表示的數為0、1、2、3、4、5、6和7,共23=8個數。
同樣地,八盞燈一共可以表示28=256個數。
1. 位
通過前面的例子可知,一盞燈亮滅或電平的高低可以代表兩種狀態,即“0”和“1”。實際上這就是一個二進制位。位(Bit)是計算機中所能表示的最小數據單位。
2. 字節
相鄰的8位二進制碼稱為一個字節(Byte),用B表示。字節是一個比較小的單位,常用的還有KB和MB等,它們之間的關系如下:
1MB=1024KB=1024×1024B
3. 字長
字節是計算機內部進行數據處理的基本單位。它由若干位二進制碼組成,通常與計算機內部的寄存器、運算器、數據總線的寬度一致。每個字所包含的位數稱為字長。若干個字節定義為一個字,不同類型的單片機有不同的字長。8051內核的單片機是8位機,它的字長為8位,其內部的運算器等都是8位的,每次參加運算的二進制位只有8位。