本書系統地介紹了MCS51系列單片機的結構、指令系統、程序設計、中斷系統、定時器/計數器、串行口、系統擴展及實用I/O接口技術等基本原理及初步應用; 還介紹了基于單片機的嵌入式系統開發流程; 重點介紹了幾種常用單片機開發應用軟件(Keil、Altium Designer、Proteus),以利于讀者邊學習邊實踐; 而且,對目前常用的幾種單片機進行了簡單介紹。 本書含有豐富的實例詳解及習題,特別適合作為大中專院校單片機原理及應用課程的教材,還可作為單片機愛好者的自學用書,也可作為單片機應用開發技術人員、智能儀表開發技術人員及研究生的設計參考用書。
單片機原理及應用教程(第2版是教育部高等學校機械類專業教學指導委員會規劃教材之一。
第1章微型計算機基礎知識
1.1微型計算機的組成
1.2計算機中數據的表示方法
1.2.1進位計數制
1.2.2數制間的相互轉換
1.2.3二進制數的運算
1.2.4數值數據的表示
1.2.5非數值數據的表示
1.3單片機概述
1.3.1單片機的基本結構
1.3.2單片機的發展
1.3.3單片機的特點及應用
習題
第2章MCS51系列單片機的硬件結構
2.1單片機的內部結構
2.1.1內部結構框圖
2.1.2引腳與功能
2.2單片機的存儲器結構
2.2.1程序存儲器
2.2.2數據存儲器
2.2.3特殊功能寄存器
2.3單片機的并行I/O口
2.3.1I/O口的特點
2.3.2I/O口的內部結構
2.3.3I/O口的功能
2.3.4I/O口的負載能力
2.4單片機的時鐘與時序
2.4.1時鐘電路
2.4.2CPU時序
2.5單片機的復位
2.6單片機最小系統
習題
第3章MCS51系列單片機的指令系統
3.1指令系統簡介
3.1.1指令格式
3.1.2指令分類
3.2單片機尋址方式及實例解析
3.2.1直接尋址
3.2.2立即尋址
3.2.3寄存器尋址
3.2.4寄存器間接尋址
3.2.5變址尋址
3.2.6相對尋址
3.2.7位尋址
單片機原理及應用教程(第2版)
目錄
3.3單片機指令系統及實例解析
3.3.1數據傳送指令
3.3.2算術指令
3.3.3邏輯指令
3.3.4轉移指令
3.3.5位操作指令
3.3.6偽指令
3.4MCS51單片機C51語言
3.4.1C51語言概述
3.4.2C51語言的程序結構、數據與存儲類型
3.4.3C51語言的頭文件與庫函數
3.4.4C51語言中地址的訪問
3.4.5C51語言編程方法
習題
第4章匯編語言程序設計
4.1匯編語言源程序匯編
4.2程序設計的基本步驟
4.3順序程序的設計
4.4分支程序設計
4.4.1單分支程序
4.4.2多分支程序
4.5循環程序設計
4.5.1單循環
4.5.2多重循環
4.5.3按條件轉移控制的循環
4.6查表程序設計
4.7子程序設計和調用
4.8應用控制流程設計
習題
第5章MCS51系列單片機的中斷系統
5.1中斷的概念
5.2中斷源
5.3中斷控制寄存器
5.4中斷的優先級
5.5中斷的響應
5.6由中斷模塊程序認知中斷處理過程
5.6.1外部中斷模塊代碼
5.6.2定時器中斷模塊代碼
5.7通過實例掌握外部中斷
習題
第6章MCS51系列單片機的定時器/計數器
6.1定時器/計數器的結構
6.1.1計數功能
6.1.2定時功能
6.2定時器/計數器的相關寄存器
6.2.1定時器/計數器的方式寄存器TMOD
6.2.2定時器/計數器的控制寄存器TCON
6.2.3中斷允許寄存器IE
6.2.4中斷優先級寄存器IP
6.3定時器/計數器的工作方式
6.4定時器/計數器的知識擴展
6.4.1定時器的溢出同步問題
6.4.2運行中讀取定時器/計數器
6.4.3由定時器/計數器模塊程序認知定時器/計數器處理過程
6.5通過實例掌握定時器(例程: 定時器與LED)
6.5.1采用中斷處理方式的程序
6.5.2采用查詢方式處理的程序
6.6通過實例掌握計數器(例程: 計數器與LED)
習題
第7章MCS51系列單片機的串行口
7.1串行通信的概念
7.2MCS51系列單片機串行口的結構
7.2.1串行口的結構
7.2.2串行口控制寄存器
7.2.3串行口的工作方式
7.2.4串行通信的波特率
7.3串行口通信
7.3.1雙機通信
7.3.2多機通信
7.4通過實例掌握串行口通信(例程: PC控制數碼管)
7.4.1硬件設計
7.4.2軟件設計
7.4.3PC與單片機串行通信的實現
習題
第8章MCS51系列單片機系統擴展及實用I/O接口技術
8.1常用緩沖/驅動接口芯片介紹
8.1.1SN7407緩沖/驅動芯片
8.1.2達林頓晶體管陣列ULN2003A
8.1.3光電耦合器
8.1.4串行通信接口RS485
8.2開關量輸入接口設計
8.2.1鍵盤接口
8.2.24×4矩陣鍵盤掃描實例
8.2.3繼電器輸入接口
8.2.4行程開關輸入接口
8.2.5光電編碼器輸入接口
8.3開關量輸出接口設計
8.3.1蜂鳴器輸出接口
8.3.2繼電器輸出接口
8.3.3固態繼電器輸出接口
8.4液晶顯示模塊接口設計
8.4.1LCD的基本結構與驅動原理
8.4.2段式LCD
8.4.3點陣LCD
8.5常用A/D轉換接口設計
8.5.1TLC2543與單片機接口實例
8.5.2ADC0832與單片機接口實例
8.5.3A/D轉換器(TLC2543)應用實例
8.6常用D/A轉換接口設計
8.6.1TLC5618與單片機接口實例
8.6.2MAX518與單片機接口實例
習題
第9章MCS51系列單片機開發流程
9.1總體方案設計
9.1.1系統功能要求
9.1.2硬件總體方案
9.1.3軟件總體方案
9.2硬件和軟件細分設計
9.2.1硬件設計
9.2.2軟件設計及調試
9.3系統的仿真與調試
9.3.1Keil軟件簡介
9.3.2利用Keil進行程序調試
9.3.3Proteus軟件使用簡介
9.3.4利用Proteus繪制電路原理圖
9.3.5在Proteus中調試程序
9.3.6Altium Designer簡介
9.3.7利用Altium Designer設計電路板
9.4系統調試
9.4.1單片機應用系統的一般調試方法
9.4.2數碼管顯示系統調試
第10章常用單片機簡介及應用舉例
10.1STC15系列單片機
10.1.1STC15系列單片機簡介
10.1.2STC15W4K32S4應用舉例
10.2AVR系列單片機
10.2.1AVR系列單片機簡介
10.2.2ATmega64單片機應用舉例
10.3MSP430系列單片機
10.3.1MSP430系列單片機簡介
10.3.2MSP430F149單片機應用舉例
10.4Kinetis K60系列單片機
10.4.1Kinetis K60系列單片機簡介
10.4.2MK60DN512ZVLQ10單片機應用舉例
10.5STM32系列單片機
10.5.1STM32系列單片機簡介
10.5.2STM32F103VET6單片機應用舉例
第11章數字電子鐘設計實例
11.1設計要求
11.2硬件設計
11.2.1按鍵電路設計
11.2.2時鐘芯片DS1302的性能特點和工作原理
11.2.3時鐘芯片DS1302與單片機的連接
11.2.4總體電路原理圖
11.3軟件設計
11.3.1顯示子程序流程圖
11.3.2顯示子程序的代碼
11.3.3主函數程序流程圖
11.3.4總的匯編語言源程序代碼
第12章LED陣列動態顯示設計實例
12.1設計要求
12.2硬件設計
12.2.174HC595簡介
12.2.2點陣LED簡介
12.2.3總體電路原理圖
12.3軟件設計
12.3.1程序流程圖
12.3.2源程序代碼
第13章數字溫度計設計實例
13.1設計要求
13.2硬件設計
13.2.1溫度芯片DS18B20簡介
13.2.2一線式總線的概念
13.2.3總體電路原理圖
13.3軟件設計
13.3.1DS18B20子程序流程圖
13.3.2DS18B20子程序代碼
13.3.3數碼管串行方式顯示子程序流程圖
13.3.4數碼管串行方式顯示子程序代碼
13.3.5主程序流程圖
13.3.6整體源程序代碼
第14章小型直流電動機驅動設計實例
14.1設計要求
14.2硬件設計
14.2.1L298N雙H橋電動機驅動芯片
14.2.2L298N與單片機接口設計
14.2.3總體電路原理圖
14.3軟件設計
14.3.1單片機產生脈寬調制信號
14.3.2源程序代碼
第15章步進電機驅動設計實例
15.1設計要求
15.2硬件設計
15.2.1步進電機概述
15.2.2TA8435步進電機專用驅動芯片
15.2.3TA8435細分驅動原理
15.2.4總體電路原理圖
15.3軟件設計
15.3.1程序流程圖
15.3.2源程序代碼
附錄AASCII碼字符表(常規字符集)
附錄BMCS51系列單片機匯編指令表
參考文獻
第1章
微型計算機基礎知識
本章主要介紹微型計算機,特別是單片機的概念和組成,同時也對計算機中數據的表示方式進行系統的介紹,為讀者以后的學習奠定一定的基礎。在本章中,讀者主要了解微型計算機與單片機的概念和組成,熟悉進位計數制、數值信息與非數值信息的表示方法,掌握不同進制之間的轉換規則。
1.1微型計算機的組成一個完整的微型計算機系統包括兩大部分,即硬件系統和軟件系統。硬件是指構成計算機的物理設備,即由機械、電子器件構成的具有輸入、存儲、計算、控制和輸出功能的實體部件。軟件指的是為了管理、維護計算機以及為完成用戶的某種特定任務而編寫的各種程序的總和。1946年美籍匈牙利科學家馮 諾依曼提出存儲程序原理,把程序本身當作數據來對待,程序和數據用同樣的方式存儲,并確定了存儲程序計算機的五大組成部分和基本工作方法。這一組成結構與工作方法對計算機的發展有著不可磨滅的影響,一直沿用至今。將指令和數據同時存放在存儲器中,是馮 諾依曼體系結構的主要特點。該體系結構的計算機應由控制器、運算器、存儲器、輸入設備、輸出設備5部分組成。馮 諾依曼體系結構系統框圖如圖11所示。
圖11馮 諾依曼體系結構系統框圖
1. 運算器運算器又稱算術邏輯單元(arithmetic logic unit,ALU),是計算機對數據進行加工處理的部件,它的主要功能是對二進制數碼進行加、減、乘、除等算術運算和與、或、非等基本邏輯運算,實現邏輯判斷。此外,它還能暫時存放運算的中間數據和結果。運算器在控制器的控制下實現其功能,運算結果由控制器指揮送到內存儲器中。2. 控制器
單片機原理及應用教程(第2版)
第1章微型計算機基礎知識
控制器主要由指令寄存器、譯碼器、程序計數器和操作控制器等組成。控制器是計算機中執行控制指令的部件,它的作用是使計算機各部件能夠協調工作,并且保障整個處理過程有條不紊地進行。它的基本功能就是從內存中讀取指令和執行指令,即控制器按程序計數器指出的指令地址從內存中取出該指令進行譯碼,然后根據該指令格式和功能向有關部件發出控制命令,并執行該指令。另外,控制器在工作過程中,還要接收各部件反饋回來的信息。通常,計算機內部會把運算器與控制器集成在一塊芯片上,稱為中央處理器(central processing unit,CPU)。微型計算機的CPU稱為微處理器(microprocessor)。表征微型計算機運算速度的指標是CPU的主頻,即CPU的時鐘頻率。一般來說,主頻越高,微型計算機運算速度越快。3. 存儲器存儲器具有記憶功能,用來保存信息,如數據、指令和運算結果等。存儲器由內存儲器(主存儲器)、外存儲器(輔助存儲器)與高速緩沖存儲器組成。(1) 內存儲器內存儲器簡稱主存或內存,它直接與CPU相連接,存儲容量較小,但速度快,用來存放當前運行程序的指令、原始數據、中間數據與結果,并直接與CPU交換信息。計算機在執行程序時,CPU會自動而連續地從內存儲器中取出要執行的指令,并執行指令規定的操作。就是說,計算機每完成一條指令,至少有一次為了取指令而訪問內存儲器的操作。在微型計算機中,通常用半導體存儲器作為內存儲器。內存儲器由許多存儲單元組成,每個單元能存放一個二進制數,或一條由二進制編碼表示的指令。為了便于對存儲器進行訪問,存儲器的存儲容量以字節為基本單位,每個字節都有自己的編號,稱為地址,如要訪問存儲器中的某個信息,就必須知道它的地址,然后再按地址存入或取出信息。內存按功能可分為兩種: 只讀存儲器(read only memory,ROM)和隨機存取存儲器(random access memory,RAM)。ROM中存儲的信息只能被讀取,不能被寫入,斷電后信息不會丟失,一般用來存放專用或固定的程序和數據,如系統引導程序等。RAM中的數據可讀可寫,用于存放將要被CPU執行的用戶程序、數據以及部分系統程序,斷電后存儲的內容丟失。(2) 外存儲器外存儲器簡稱外存,又稱輔助存儲器,它是內存的擴充,通常是磁性介質或光盤,像硬盤、軟盤、U盤、磁帶、CD等,能長期存儲信息,且不需要保持供電,讀寫速度與內存儲器相比慢很多。外存的存儲容量大,價格低,但存儲速度較慢,一般用來存放大量暫時不用的程序、數據和中間結果,需要時,可成批地與內存儲器進行信息交換。外存只能與內存交換信息,不能被計算機系統的其他部件直接訪問。(3) 高速緩沖存儲器高速緩沖存儲器(cache)是存在于主存儲器與CPU中央處理器之間的一級存儲器,由靜態存儲芯片(SRAM)組成,容量比較小,但讀寫速度遠高于內存的讀寫速度、接近于CPU的讀寫速度。它的出現是為了解決內存讀寫速度與CPU處理速度的不匹配所導致的系統運行速度慢的問題。CPU訪問指令和數據時,先訪問高速緩存,如果目標內容已在高速緩存中(這種情況稱為命中),CPU將直接從高速緩存中讀取數據,否則CPU將從主存中讀取,同時將讀取的內容存于高速緩存中。高速緩存可看成是主存中面向CPU的一組高速暫存存儲器,這種技術使微機的性能大幅度提高。某些機器中設計了二級,甚至三級緩存,每級緩存比前一級緩存速度慢且容量大。CPU可以在全速運行的狀態下讀取存放在一級高速緩存中的指令或數據。如果在一級緩存中沒有找到所需要的指令或數據,處理器會查看容量更大的二級緩存。二級緩存既可以被集成到CPU芯片內部,也可以作為外部緩存。4. 輸入/輸出設備輸入/輸出設備簡稱I/O(input/output)設備,也稱作外設。外設的種類很多,有機械式、電子式、機電式、光電式等,一般來說,與CPU相比,外設的工作速度較低。外設處理的信息有數字量、模擬量、開關量等,而計算機只能處理數字量。另外,外設與計算機工作的邏輯時序也可能不一致。由于上述原因,計算機與外設之間的連接及信息的交換不能直接進行,而需要設計一個I/O接口作為計算機與外設之間的橋梁。用戶通過輸入設備將程序和數據輸入計算機,輸出設備將計算機處理的結果(如數字、字母、符號和圖形)顯示或打印出來。計算機常用的輸入設備有鍵盤、鼠標、掃描儀、A/D轉換器等,程序、數據及現場信息要通過輸入設備輸入給計算機。微機常用的輸出設備有顯示器、打印機、繪圖儀、D/A轉換器等,計算機的處理結果要通過輸出設備輸出,以便用戶使用。5. 總線計算機的各硬件資源通過接口與總線連接而組成系統。總線是計算機中各功能部件間傳送信息的公共通道,是微型計算機的重要組成部分。所有硬件設備之間的通信都需要經過總線,主機的各個部件通過總線相連接,外部設備通過相應的接口電路再與總線相連接,從而形成了計算機硬件系統。微型計算機是以總線結構來連接各個功能部件的。根據所傳送信息內容與作用的不同,總線可分為地址總線、數據總線與控制總線3類,分別用來傳輸地址、數據和控制信號,這3種總線統稱為系統總線。(1) 地址總線地址總線(address bus)用于傳送地址,由于尋址操作只能由CPU向存儲器或I/O端口進行,所以地址總線是單向總線。CPU需要對存儲器或I/O端口進行訪問時,首先需要在地址總線上傳送出要訪問存儲單元或I/O端口的地址信息,選中要訪問的存儲單元或I/O端口,以便進行之后的數據傳輸。地址總線的位數決定了CPU可直接尋址的內存空間大小。例如,8086系列微處理器的地址總線為20位,可尋址空間為220=1M。(2) 數據總線數據總線(data bus)用于從存儲器取指令或讀寫數據。數據總線是雙向三態形式的總線,既可以通過數據總線把CPU的數據傳送到存儲器或I/O接口等部件,也可以將其他部件的數據傳送到CPU。數據總線的位數是微型計算機的一個重要指標,通常與微處理器的字長相一致。例如8086系列微處理器字長16位,其數據總線寬度也是16位。需要指出的是,數據總線中傳輸的“數據”是廣義的,它可以是真正的數據,也可以是指令代碼、狀態信息或者控制信息。常見的數據總線種類有ISA、EISA、VESA、PCI等。在一些系統中,數據總線和地址總線是分時復用的,即總線根據控制信號的不同,在某些時候作為數據總線而在其他情況下用作地址總線。例如,在MCS51系列單片機中,地址總線和數據總線就是分時復用的。(3) 控制總線控制總線(control bus)用于傳送各種控制或狀態信息。這些控制信息中,有些需要從微處理器送往存儲器和I/O接口電路,如讀/寫信號、片選信號、中斷響應信號等; 有些需要從其他部件反饋給CPU,如中斷申請信號、復位信號、總線請求信號、設備就緒信號等。因此,控制總線一般是雙向的,其具體傳送方向由具體控制信號決定。
1.2計算機中數據的表示方法1.2.1進位計數制
進位計數制是利用固定的數字符號和統一的規則來計數的科學方法。在計算機中,任何信息必須轉換成二進制形式數據后才能由計算機進行處理、存儲和傳輸。在計算機中常用的數制有二進制、十進制與十六進制。為了區分不同進制的數,我們在書寫時用( )數制表示不同進制的數。例如,用( )10表示十進制數,用( )2表示二進制數。在計算機中,為了區分不同的數制,通常在數字的后面加上數制的英文首字母以表示該數的進制。如二進制(binary)的首字母b、十進制(decimal)的首字母d以及十六進制(hexadecimal)的首字母h。在進位計數制中有數位、基數和位權三個要素。數位是指數碼在一個數中所處的位置。基數是指在某種進位計數制中,每個數位上所能使用的數碼的個數。對于多位的數,處在某一位上的1所表示的數值的大小,稱為該位的位權。例如,二進制第2位的位權為21,第3位的位權為22。二進制是計算機中最基本的一種數制。二進制數據是用0和1兩個數碼來表示的數,進位規則為逢二進一。而邏輯電路的兩個狀態恰好可以用1和0表示。二進制計數適合邏輯運算,可以簡化運算規則,提高運算速度,同時也易于與十進制、十六進制進行轉換。十進制是我們日常生活中最常用的數制,也是我們在編寫程序代碼時習慣使用的數制。十進制是由十個數碼0~9來表示的數,其基數為10,逢十進一。雖然在計算機中使用二進制可以更直觀地解決問題,但二進制數的缺點是數據位數太多。例如,占用2字節的整型變量(0~65535)使用二進制表示時將會有16位數據。為了縮短數據的表達長度,我們使用十六進制對計算機中的數進行表達,這樣不僅縮短了二進制數,同時也保留了二進制數的表達特點。
1.2.2數制間的相互轉換計算機不能直接處理非二進制數的數據,必須先把數據轉化成二進制數才能被計算機所接受。計算機直接計算出的結果也為二進制數,需要轉換成十進制數才便于用戶閱讀。這就要求我們在不同進制數之間進行轉換。1. 十進制數與二進制數之間的轉換把一個十進制整數轉換為二進制整數,只需把被轉換的十進制整數反復地除以2,直到商為0,所得的余數的逆序就是這個數的二進制表示,這種方法也叫除2取余法。例11將(218)10轉換成二進制整數。將(218)10轉換成二進制整數的過程如圖12所示。
圖12十進制整數轉換為二進制整數的過程
即(218)10=(1101 1010)2。把一個十進制小數轉換為二進制小數,其整數部分的轉換規則與整數的轉換相同,而對其小數部分需要連續乘2,直到滿足精度要求為止,,把每次所進位的整數,按從上往下的順序寫出,這種方法簡稱乘2取整法。例12將十進制小數(0.7782)10轉換為四位二進制小數。0.7782×2=1.55640.5564×2=1.11280.1128×2=0.22560.2256×2=0.4502即(0.7782)10=(0.1100)2。把一個二進制數轉換為十進制數只需將二進制數按權展開即可。例13將二進制數(1101.0010)2轉換為十進制數。(1101.0010)2=1×23 1×22 0×21 1×20 0×2-1 0×2-2 1×2-3 0×2-4=(13.125)10
2. 二進制數與十六進制數之間的轉換由于二進制數和十六進制數之間存在對應關系,即每4位二進制數對應1位十六進制數,因此二者之間的轉換非常便捷。二進制數轉換為十六進制數的方法是,將二進制數從小數點開始,整數部分從右向左4位一組,小數部分從左向右4位一組,不足四位用0補足,每組對應一位十六進制數即可得到十六進制數。同理,十六進制數轉換成二進制數只需以小數點為界,向左或向右每一位十六進制數用相應的四位二進制數取代,然后將其連在一起即可。例14將以下十六進制數轉換為二進制數。(3100) 16=(0011 0001 0000 0000)2(1AFF.F1)16=(0001 1010 1111 1111.1111 0001)2例15將以下二進制數轉換為十六進制。(1011 0011)2=(B3)16(1100 0011.1111 0010)2=(C3.F2)16
1.2.3二進制數的運算1. 二進制數的算術運算
二進制數的算術運算與十進制的算術運算一樣,包括了加、減、乘、除四則運算,計算方法也大致相同,區別在于: 十進制加法是“逢十進一”,而二進制加法為“逢二進一”; 十進制減法是“借一得十”,二進制減法則是“借一得二”。二進制數乘、除法過程也可仿照十進制數的乘、除法進行。2. 二進制數的邏輯運算邏輯運算也稱為布爾運算,包括與、或、非3種基本邏輯運算以及這3種運算組合而成的或非、與非、同或、異或邏輯。(1) 邏輯與(AND)運算也稱邏輯乘,運算符為 或∧。其邏輯為: 只有輸入都為高電平時,輸出才是高電平。與邏輯表達式為F=A∧B。運算規律如下: 0∧0=00∧1=01∧1=1(2) 邏輯或(OR)運算也稱邏輯加,運算符為 或∨。其邏輯為: 只要輸入中有一個或一個以上為高電平,輸出便為高電平。或邏輯表達式為F=A∨B。運算規律如下: 0∨0=00∨1=11∨1=1(3) 邏輯非(NOT)運算的邏輯關系是: 輸出與輸入的電平相反。非邏輯表達式為F=。運算規律如下: 0=11=0(4) 邏輯異或(XOR)是常用的復合邏輯,由或運算和非運算組合而成,即: 當兩個輸入電平相同時,輸出為低電平; 當兩個輸入電平不同時,輸出為高電平。異或的邏輯表達式為A⊕B=B A。運算規律如下: 0⊕1=11⊕1=00⊕0=01.2.4數值數據的表示數值可分為有符號數(整數)和浮點數兩大類,有符號數又可分為正數和負數。由于計算機內只能進行二進制運算,有符號數與浮點數需要在計算時以二進制的形式表示。1. 有符號數的表示由于計算機只能識別0和1,因此,我們通常在表示一個二進制無符號數時,將其較高位用作符號位來表示這個數的正負,并規定符號位為0時表示正,為1時表示負。在無符號數中,所有二進制位全部用來表示數的大小。而有符號數的較高位為符號位,其余位為數值位,表示數的大小。這種把一個數及其符號位在機器中用一組二進制數來表示的形式,稱為機器數。機器數所表示的值為該數的真值。常用的機器數有原碼、補碼、反碼3種。如果用一個字節來表示無符號數,其取值范圍是0~255; 表示一個有符號數,其取值范圍是-128~127。(1) 原碼正數的符號位用0表示,負數的符號位用1表示,數值部分用真值的值來表示的二進制機器數稱為原碼。例如,18的原碼為0001 0010,-20的原碼為1110 1100。原碼表示直觀,與真值轉換很方便,但是不便于進行加減運算。(2) 反碼正數的反碼與原碼相同,負數的反碼為原碼除符號位外按位求反。例如,18的反碼與原碼相同,為0001 0010,-20的反碼為1001 0011。反碼一般是作為求補碼的中間過程。(3) 補碼正數的補碼與其原碼和反碼相同,負數的補碼為其反碼加1。例如,18的補碼為0001 0010,-20的補碼為1001 0100。在計算機中最常用的運算為加減運算,能否快速地進行加減運算決定了計算機的運行效率。計算機在進行加減運算時,如果遇到了數據已是能表示的較大值,但仍需加1的情況,較高位將產生進位。如果該數據是一個字節型數據,進位的值28=256將被丟失,這種運算稱為按模運算。其中,模指的是一個系統的量程,在計算機中指的是變量能表達的較大的數。例如,要將指針式鐘表的時針從11點撥向6點,可以正撥7格或者反撥5格。按模運算可以使正數加負數轉化成正數加正數,并得到正確的結果。負數的補碼即是該數的原碼加上模,即對原碼除符號位按位取反后再加1。補碼的加減運算即是其原碼的按模運算。引入補碼后,計算機進行加減運算的效率可以大大提高。例16寫出字節型數據(5f)16、(-100)10的原碼、反碼與補碼。(5f)16=(0101 1111)2,原碼: 0101 1111,反碼: 0101 1111,補碼: 0101 1111(-100)10=(1001 1100)2,原碼: 1001 1100,反碼: 1110 0011補碼: 1110 01002. 浮點數的表示實數一般用浮點數表示,因為它的小數點位置不固定,所以稱為浮點數。它是包括了整數部分與小數部分的數。在數學計算中,通過科學記數法,我們可以將一個數表示為a×10n的形式。在計算機中浮點數的存儲方式也是如此。當我們要存儲或運算某個較大或較小且位數較多的浮點數時,用科學記數法可以節省許多存儲空間。在計算機中存放的浮點數由指數(階碼)和尾數兩部分組成,其存儲形式如下:
階符階碼數符尾數
其中,尾數表示數值的有效數字,小數點約定在尾數之前; 階碼用來指示尾數中的小數點應當向左或向右移動的位數; 階符和數符分別是階碼與尾數的符號位。例如,101.01可表示為23×0.10101,它計算機中的存儲形式為:
011010101
3. BCD碼(二十進制編碼)BCD(binary code decimal)碼是用若干個二進制數表示一個十進制數的編碼,BCD碼有多種編碼方法,常用的有8421碼。8421碼是將十進制數碼0~9中的每個數分別用4位二進制編碼表示,從左至右每一位對應的數是8、4、2、1,這種編碼方法比較直觀、簡要。對于多位數,只需將它的每一位數字按對應關系用8421碼直接列出即可。BCD碼與二進制之間不可直接轉換,而是要先將BCD碼表示的數按四位一組轉換成十進制數,再將十進制數轉換成二進制數。表11是十進制數0~9的8421 BCD編碼表。
表11十進制數0~9的8421 BCD編碼表
十進制數8421 BCD碼十進制數8421 BCD碼
0000010001200103001140100
5010160110701118100091001
例17將以下十進制數轉換為BCD碼。(2016) 10=(0010 0000 0001 0110)BCD(1988.34)10=(0001 1001 1000 1000.0011 0100)BCD例18將以下BCD碼數轉換為二進制數。(1001 0110 0011)BCD=(963)10=(11 1100 0011)2(0101 0101.0101)BCD=(55.5)10=(11 0111.1)21.2.5非數值數據的表示1. ASCII碼
計算機并不能直接處理非數值的文字與符號,而是要先將其進行數字化處理,即用二進制編碼來表示文字和符號。目前計算機中普遍采用的字符編碼是ASCII(american standard code for information interchange)碼,即美國信息交換標準代碼。7位版本的ASCII碼有128個字符,使用7個二進制位(27=128)表示,其中控制字符34個,阿拉伯數字10個,大小寫英文字母52個,各種標點符號和運算符號32個。在計算機中實際用8位表示一個字符,較高位為0。常用的ASCII碼見表12。附錄A列出了全部128個符號的ASCII碼。
表12常用的ASCII碼
ASCII碼字符ASCII碼字符ASCII碼字符
30H041HA61Ha31H142HB62Hb38H859HY69Hy39H95AHZ6AHz
2. 漢字碼漢字也是字符,與西文字符比較,漢字數量大、字形復雜、同音字多,這就給漢字在計算機內部的存儲、傳輸、交換、輸入、輸出等帶來了一系列的問題。為了能直接使用西文標準鍵盤輸入漢字,必須為漢字設計相應的編碼,以適應計算機處理漢字的需要。常用的漢字碼有國標碼、機內碼與字形碼。(1) 國標碼1980年我國頒布了國家標準《信息交換用漢字編碼字符集基本集》(GB 2312—1980),是國家規定的用于漢字信息處理使用的代碼依據,這種編碼稱為國標碼。在國標碼的字符集中共收錄了6763個常用漢字和682個非漢字字符(圖形、符號),其中一級漢字3755個,以漢語拼音為序排列,二級漢字3008個,以偏旁部首進行排列。但考慮到漢字編碼與其他國際通用編碼,如ASCII碼的兼容,國標采用了加以修正的兩字節漢字編碼方案: 只用兩個字節的低7位,即較高位為0; 每個字節中都不能出現ASCII碼中的34個控制功能碼,即每個字節只能有94個編碼。國家標準GB 2312—1980規定,所有的國標漢字與符號組成一個94×94的矩陣,在此方陣中,每一行稱為一個“區”(區號為01~94),每一列稱為一個“位”(位號為01~94),該方陣實際組成了一個94個區,每個區內有94個位的漢字字符集,每一個漢字或符號在碼表中都有一個的位置編碼,叫做該字符的區位碼。使用區位碼方法輸入漢字時,必須先在表中查找漢字并找出對應的代碼,才能輸入。區位碼輸入漢字的優點是無重碼,而且輸入碼與內部編碼的轉換方便。(2) 機內碼漢字的機內碼是計算機系統內部對漢字進行存儲、處理、傳輸統一使用的代碼,又稱為漢字內碼。同國標碼一樣,漢字的機內碼也需要兩個字節來存放。國標碼是漢字信息交換的標準編碼,但國標碼的各字節的較高位均為0,直接存儲將會與ASCII碼產生沖突。于是,漢字的機內碼采用變形國標碼,其變換方法為: 將國標碼的每個字節較高位由0改1,其余7位不變。(3) 字形碼每一個漢字的字形都必須預先存放在計算機內,GB 2312—1980的所有字符的形狀描述信息集合在一起,稱為字形信息庫,簡稱字庫。字庫通常分為點陣字庫和矢量字庫。在計算機中常用的漢字顯示方式是點陣式,即用點陣表示的漢字字形代碼。根據漢字輸出精度的要求,可以有不同密度點陣,如16×16點陣、32×32點陣等。漢字字形點陣中每個點的信息用一位二進制碼來表示,1表示對應位置處是黑點,0表示對應位置處是空白。字形點陣的信息量很大,所占存儲空間也很大,例如16×16點陣每個漢字就要占32個字節,因此字形點陣只能用來構成“字庫”,而不能用來存儲。字庫中存儲了每個漢字的字形點陣代碼,不同的字體對應著不同的字庫。在輸出漢字時,計算機要先到字庫中去找到它的字形描述信息,然后再把字形送去輸出。1.3單片機概述1.3.1單片機的基本結構
單片機(microcontroller)就是把中央處理器、存儲器、輸入/輸出端口等基本部件微型化并集成到一塊芯片上的微型計算機,只要再配置幾個小器件,如電阻、電容、石英晶體、連接器等,即成為完整的微型計算機系統。圖13所示為MCS51系列單片機的基本組成示意圖。從圖中可以看出,單片機雖然只是一個芯片,但一般計算機的基本部件它都有,因此單片機實際上就是一個簡單的微型計算機。
圖13MCS51系列單片機組成示意圖
隨著單片機的發展,現在的單片機芯片中都著力擴展了各種控制