- 單片機原理及應用:基于C51+Proteus仿真
- 劉志君 姚穎主編
- 11字
- 2021-10-27 14:26:53
第1章 單片機的基礎知識
1.1 單片機的基礎
單片機即在一片集成電路芯片上集成了CPU、RAM、ROM、時鐘、定時器/計數器、多功能串行或并行I/O口的通用IC,從而構成了一個完整的單芯片微型計算機(Single Chip Microcomputer)。它的結構及功能最初是按工業控制要求設計的,使用時單片機通常處于測控系統的核心地位并嵌入其中,所以國際上通常把單片機稱為嵌入式控制器(EMCU,Embedded MicroController Unit)或微控制器(MCU,MicroController Unit)。我國習慣使用“單片機”這一名稱。
1.1.1 單片機的發展史
1.單片機發展經歷的四個階段
以8位單片機的推出作為起點,單片機的發展歷史大致可分為以下幾個階段。
第一階段(1976~1978):單片機的探索階段。以Intel公司的MCS-48為代表。MCS-48的推出屬于在工控領域的探索,參與這一探索的公司還有Motorola、Zilog等,都取得了滿意的效果。這就是SCM的誕生年代,“單片機”一詞即由此而來。
第二階段(1978~1982):單片機的完善階段。Intel公司在MCS-48基礎上推出了完善的、典型的單片機系列MCS-51。它在以下幾個方面奠定了典型的通用總線型單片機體系結構。
1)完善的外部總線。MCS-51設置了經典的8位單片機的總線結構,包括8位數據總線、16位地址總線、控制總線及具有多機通信功能的串行通信接口。
2)具備CPU外圍功能單元的集中管理模式。
3)體現工控特性的位地址空間及位操作方式。
4)指令系統趨于豐富和完善,并且增加了許多突出控制功能的指令。
第三階段(1982~1990):向微控制器發展的階段,也是8位單片機的鞏固發展及16位單片機的推出階段。Intel公司推出的MCS-96系列單片機,將一些用于測控系統的模數轉換器、程序運行監視器、脈寬調制器等納入片中,體現了單片機的微控制器特征。隨著MCS-51系列的廣泛應用,許多電氣廠商競相使用80C51為內核,將許多測控系統中使用的電路技術、接口技術、多通道A-D轉換部件、可靠性技術等應用到單片機中,增強了外圍電路的功能,強化了智能控制的特征。
第四階段(1990至今):微控制器的全面發展階段。隨著單片機在各個領域全面深入的發展和應用,出現了高速、大尋址范圍、強運算能力的8位/16位/32位通用型單片機,以及小型廉價的專用型單片機。
2.單片機的發展趨勢
為了降低功耗,單片機在工藝上已經全部采用了CHMOS技術。今后單片機的發展趨勢將是向低功耗、小體積、大容量、高性能、低價格、外圍電路內裝化等方面發展。為滿足不同用戶的要求,各公司競相推出能滿足不同需要的產品。
(1)CPU的改進
1)增加CPU數據總線寬度。例如,各種16位單片機和32位單片機,數據處理能力要優于8位單片機。另外,8位單片機內部采用16位數據總線,其數據處理能力明顯優于一般8位單片機。
2)采用雙CPU結構,以提高數據處理能力。
3)采用精簡指令集(RISC)結構和流水線技術,可以大幅度提高運行速度。現指令最高速度已達100MIPS(Million Instruction Per Seconds,即兆指令每秒),并加強了位處理功能、中斷和定時控制功能。這類單片機的運算速度比標準的單片機高出10倍以上。由于這類單片機有極高的指令速度,就可以用軟件模擬其I/O功能,由此引入了虛擬外設的新概念。
(2)存儲器的發展
1)片內程序存儲器普遍采用閃爍(Flash)存儲器。可不用外擴展程序存儲器,簡化系統結構。
2)加大存儲容量。目前有的單片機片內程序存儲器容量可達128KB甚至更多。
(3)片內I/O的改進
1)增加并行口驅動能力,以減少外部驅動芯片。有的單片機可以直接輸出大電流和高電壓,以便能直接驅動LED和VFD(熒光顯示器)。
2)有些單片機設置了一些特殊的串行I/O功能,為構成分布式、網絡化系統提供方便條件。
(4)低功耗管理
現在幾乎所有的單片機都配置有等待狀態、睡眠狀態、關閉狀態等工作方式。CMOS芯片除具有低功耗特征外,還具有功耗的可控性,使單片機可以工作在功耗精細管理狀態。此外,有些單片機采用了雙時鐘技術,即有高速和低速兩個時鐘,在不需要高速運行時,即轉入低速工作以降低功耗;有些單片機采用高速時鐘下的分頻和低速時鐘下的倍頻控制運行速度,以降低功耗。低功耗的實現提高了產品的可靠性和抗干擾能力。
(5)外圍電路內裝化
將眾多外圍電路全部裝入片內,即系統的單片化是目前發展趨勢之一。例如,美國Cygnal公司的8位C8051F020單片機,內部采用流水線結構,大部分指令的完成時間為1或2個時鐘周期,峰值處理能力為25MIPS。片上集成有8通道A-D、兩路D-A、兩路電壓比較器,內置溫度傳感器、定時器、可編程數字交叉開關和64個通用I/O口、電源監測、看門狗、多種類型的串行接口(兩個UART、SPI)等。一片芯片就是一個“測控”系統。
(6)串行擴展技術
在很長一段時間里,通用型單片機通過并行三總線結構擴展外圍器件成為單片機應用的主流結構。隨著I2C、SPI等串行總線及接口的引入,推動了單片機“單片”應用結構的發展,使單片機的引腳可以設計得更節約,單片機系統結構更簡化和規范化。
(7)ISP更加完善
ISP,In-System Programming的縮寫,即在線可編程,指電路板上沒有裝載程序的空白單片機芯片可以編程寫入最終用戶代碼,而不需要從電路板上取下單片機芯片,已經編程的單片機芯片也可以用ISP方式擦除、改寫或再編程。ISP技術是未來發展方向。快擦寫存儲器(Flash Memory)的出現和發展,推動了ISP技術的發展,使得ISP的實現變得簡單。單片機芯片內部的快擦寫存儲器可以由個人計算機的軟件通過串口來進行改寫,所以即使我們將單片機芯片焊接在電路板上,只要留出和個人計算機接口的這個串口,就可以實現單片機芯片內部存儲器的改寫,而無須再取下單片機芯片。
(8)SOC型單片機方興未艾
隨著超大規模集成電路設計技術發展,一個硅片上就可以實現一個復雜的系統,即System On Chip(SOC),即片上系統。狹義上理解,可以將它翻譯為“系統集成芯片”,指在一個芯片上實現信號采集、轉換、存儲、處理和I/O等功能,包含嵌入軟件及整個系統的全部內容;廣義上理解,可以將它翻譯為“系統芯片集成”,指一種芯片設計技術,可以實現從確定系統功能開始,到軟硬件劃分,并完成設計的整個過程。核心思想是把整個電子系統全部集成在一個芯片中,避免大量PCB設計及板級的調試工作。設計者面對的不再是電路及芯片,而是根據系統的固件特性和功能要求,把各種通用處理器內核及各種外圍功能部件模塊作為SOC設計公司的標準庫,成為VLSI設計中的標準器件,用VHDL等語言描述,存儲在器件庫中。用戶只需定義整個應用系統,仿真通過后就可以將設計圖交給半導體器件廠商制作樣品。除無法集成的器件外,整個系統大部分均可集成到一塊或幾塊芯片中去,系統電路板簡潔,對減小體積和功耗、提高可靠性非常有利。SOC使系統設計技術發生革命性變化,標志著一個全新時代到來。
綜上所述,單片機正在向多功能、高性能、高速度(時鐘達40MHz)、低電壓(0.8V即可工作)、低功耗、低價格(幾元錢)、外圍電路內裝化、片內程序存儲器和數據存儲器容量不斷增大以及SOC型單片機的方向發展。
1.1.2 單片機的應用
目前單片機已滲透到我們生活的各個領域,幾乎很難找到哪個領域沒有單片機的蹤跡。如導彈的導航裝置,飛機上各種儀表的控制,計算機的網絡通信與數據傳輸,工業自動化過程的實時控制和數據處理,廣泛使用的各種智能IC卡,民用豪華轎車的安全保障系統,錄像機、攝像機、全自動洗衣機的控制,以及遙控玩具、電子寵物等,這些都離不開單片機。個人計算機中也會有為數不少的單片機在工作,更不用說自動控制領域的機器人、智能儀表、醫療器械以及各種智能機械了。單片機的數量不僅遠超過PC和其他計算機的總和,甚至比人類的數量還要多。以下大致介紹一些典型的應用領域和應用特點。
1.家電領域
可以這樣說,現在的家用電器基本上都采用了單片機控制,從電飯煲、洗衣機、電冰箱、微波爐、空調機、彩電、攝像機及其他視頻音像設備的控制,再到電子秤、兒童玩具以及機器人的控制,五花八門,無所不在。
2.辦公自動化領域
現代辦公室中所使用的大量通信、信息產品多數都采用了單片機,如通用計算機系統中的鍵盤譯碼、磁盤驅動、打印機、繪圖儀、復印機、電話、傳真機、考勤機等。
3.通信領域
現在的通信設備基本上都實現了單片機智能控制,從調制解調器、傳真機、小型程控交換機、樓宇自動通信呼叫系統、列車無線通信、再到日常工作中隨處可見的移動電話、集群移動通信、信息網絡、無線電對講機等。
4.商業營銷領域
在商業營銷系統已廣泛使用的電子秤、收款機、條碼閱讀儀、倉庫安全監測系統、商場保安系統、空調調節系統、冷凍保險系統等目前已紛紛采用單片機構成專用系統,主要由于這種系統具有明顯的抗病菌侵害、高效高智能化、抗電磁干擾等高可靠性保證。
5.工業控制領域
工業過程控制、過程監測、工業控制器及機電一體化控制系統等除一些小型工控機之外,許多系統都是由單片機為核心的單機或多機網絡系統。如工業機器人的控制系統是由中央控制器、感知系統、行走系統、擒拿系統等節點構成的多機網絡系統。另外由單片機構成的控制系統形式多樣,如工廠流水線的智能化管理、電梯智能化控制、各種報警系統、與計算機聯網構成的二級控制系統等。
6.儀器儀表領域
單片機具有體積小、功耗低、控制功能強、擴展靈活、微型化和使用方便等優點,廣泛應用于儀器儀表中,結合不同類型的傳感器,可實現諸如電壓、功率、頻率、濕度、溫度、流量、速度、厚度、角度、長度、硬度、壓力等物理量的測量。采用單片機控制使得儀器儀表數字化、智能化、微型化,且功能比起采用電子或數字電路更加強大。例如精密的測量設備(功率計、示波器、各種分析儀)。將單片機與傳感器相結合可以構成新一代的智能傳感器,它將傳感器初級變化后的電量作進一步的變換、處理,輸出能滿足遠距離傳送的數字信號。例如將壓力傳感器與單片機集成在一起的微小壓力傳感器可隨鉆機送至井底,以報告井底的壓力狀況。
7.醫療器械領域
單片機在醫用設備中的用途亦相當廣泛,例如醫用呼吸機、各種分析儀、監護儀、超聲診斷設備及病床呼叫系統等。
8.汽車電子領域
單片機在汽車電子中的應用非常廣泛,例如汽車中的發動機控制器、基于CAN總線的汽車發動機智能電子控制器、智能自動駕駛系統、GPS導航系統、ABS防抱死系統、制動系統、汽車緊急請求服務系統、汽車防撞監控系統、汽車自動診斷系統以及汽車黑匣子等。
此外,單片機在工商、金融、科研、教育、交通、國防、航空、航天、航海等領域都有著十分廣泛的應用。
1.1.3 數制和編碼
1.計算機中數據的單位
(1)位(bit)
位簡記為b,也稱為比特,是計算機存儲數據的最小單位。一個“比特”也可以說成“位”,一個二進制位只能表示0或1。
(2)字節(byte)
字節由8位二進制數字構成,一般用大寫的“B”表示“byte”,字節是存儲信息的基本單位,并規定1B=8bit。
(3)字(Word)
一個字通常由一個字節或若干個字節組成。字節是微型計算機一次所能處理的實際位數長度。
(4)十六進制數字的表示
十六進制數的表示,即后面跟隨“H”或“h”后級的數字,或者前面加“0x”或“0X”前級的數字表示是一個十六進制數。
2.數制
計算機只能識別二進制數。用戶通過鍵盤輸入的十進制數字和符號命令,計算機是不能識別的,計算機必須把它們轉換成二進制形式才能識別、運算和處理,然后再把運算結果還原成十進制數字和符號,并在顯示器上顯示出來,所以需要對計算機常用的數制和數制間的轉換進行討論。
所謂數制是指計數的規則,按進位原則進行計數的方法,成為進位計數制。數制有很多種,計算機編程時常用的數制為二進制、八進制、十進制和十六進制。
(1)十進制(decimal)
十進制由0~9十個數碼組成。十進制的基數是10,低位向高位進位的規律是“逢十進一”。十進制數的主要特點:
1)有0~9十個不同的數碼,這是構成所有十進制數的基本符號。
2)逢10進位。十進制在計數過程中,當它的某位計數滿10時就要向它鄰近的高位進一。
在一個多位的十進制數中,同一個數字符號在不同的數位所代表的數值是不同的。因為,任何一個十進制數不僅與構成它的每個數碼本身的值有關,而且還與這些數碼在數中的位置有關。如333.3中4個3分別代表300、30、3和0.3,這個數可以寫成:
333.3=3×102+3×101+3×100+3×10-1
式中的10稱為十進制的基數,指數102,101,100,10-1稱為各數位的權。從上式可以看出:整數部分中每位的冪是該位位數減1;小數點后第一位的位權是10-1,第二位的位權是10-2,……,其余位的位權以此類推。
通常,任意一個十進制數N都可以表示成按權展開的多項式:

式(1-1)中,ai是基數10的i次冪的系數,是0~9共10個數字中的任意一個,m是小數點右邊的位數,i是位數的序數。
一般而言,對于R進制表示的數N,可以按權展開為

其中,ai是0、1、…、(R-1)中的任一個,m、n是正數,R是基數。在R進制中,每個數字所表示的值是該數字與它相應的權Ri的乘積,計數原則是“逢R進一”。
(2)二進制(binary)
二進制數的主要特點:
1)它有0和1兩個數碼,任何二進制都是由這兩個數碼組成。
2)二進制數的基數為2,它奉行“逢二進一”的進位計數原則。
當式(1-1)中R=2時,稱為二進制計數制,簡稱二進制。在二進制數中,只有兩個不同碼數:0和1,進位規律為“逢二進一”。任何一個數N,可用二進制表示為

例如,二進制數1011.01可表示為
(1011.01)2=1×23+0×22+1×21+1×20+0×2-1+1×2-2
(3)八進制
當R=8時,稱為八進制。在八進制中,有0、1、2、…7共8個不同的數碼,采用“逢八進一”的原則進行計數。例如,(503)8可表示為
(503)8=5×82+0×81+3×80
(4)十六進制(hexadecimal)
當R=16,稱為十六進制數。十六進制數的主要特點:
1)它有0、1、2、3、…、D、E、F共16個數碼,任何一個十六進制都由其中的一些或全部數碼構成。
2)十六進制的基數為16,進位方式為逢16進1。
十六進制數也可展開成冪級數形式。例如,(3AB.0D)16可表示為:
(3AB.0D)16=3×162+10×161+11×160+0×16-1+13×16-2
各種進制的對應關系見表1-1。
表1-1 十、二、八、十六進制的對應關系

3.不同進制之間的轉換
計算機中數的表示形式是二進制,這是因為二進制只有0和1兩個數碼,可通過晶體管的導通和截止、脈沖的高電平和低電平等方便地表示。此外二進制數運算簡單,便于用電子線路實現。在實際編程的過程中,采用十六進制可以大大減輕閱讀和書寫二進制數時的負擔。
例如,11011011=DBH、1001001111110010B=93F2H。
顯然,采用十六進制數描述一個二進制數特別簡短,尤其在描述的二進制數位數較長時,更令計算機工作者感到方便。
但人們習慣于使用十進制數,為了方便各種應用場合的需要,要求計算機能自動對不同數制的數進行轉化。
(1)二進制、八進制、十六進制數轉化為十進制數
對于任何一個二進制數、八進制數、十六進制數,均可以先寫出它的位權展開式,然后再按十進制進行計算,即可將其轉換為十進制數。
例如,二進制數轉化為十進制數:
(1111.11)2=1×23+1×22+1×21+1×20+1×2-1+1×2-2=15.75
八進制數轉換為十進制數:
(46.12)8=4×81+6×80+1×8-1+2×8-2=38.15625
十六進制轉換為十進制數:
(A10B.8)16=10×163+1×162+0×161+11×160+8×16-1=41227.5
(2)十進制數轉換成二進制數、八進制數、十六進制數
本轉換過程是上述過程的逆過程,但十進制整數和小數轉換成二進制、八進制、十六進制整數和小數的方法是不同的,現分別進行介紹。
1)整數部分:除基取余法。分別用基數R不斷地去除N的整數,直到商為零為止,每次所得的余數依次排列即為相應進制的數碼。最初得到的為最低有效數字,最后得到的為最高有效數字。現列舉加以說明。
【例題1-1】試求出十進制數100的二進制數、八進制數和十六進制數。
解:① 轉化為二進制數:
把100連續除以2,直到商數小于2,相應的有

把所得余數從高位到低位排列起來便可以得到:100=1100100B。
② 轉化為八進制數:
把100連續除以8,直到商數小于8,相應的有

把所得余數從高位到低位排列起來便可以得到:100=144O。
③ 轉化為十六進制數:
把100連續除以16,直到商數小于16,相應的有

把所得余數從高位到低位排列起來便可以得到:100=64H
2)小數部分:乘基取整法。分別用基數R(R=2、8或16)不斷地去乘N的小數,直到積的小數部分為零(或滿足所需精度)為止,每次乘得的整數依次排列即為相應進制的數碼。最初得到的為最高有效數字,最后得到的為最低有效數字。
【例1-2】試求出十進制數0.645的二進制、八進制數和十六進制數。
解:① 轉化為二進制數:

把所得整數按從高位到低位排列后得到:0.645D≈0.1010011B。
② 轉化為八進制數:

把所得整數按從高位到低位排列后得到:0.645D≈0.51217O。
③ 轉化為十六進制數:

把所得整數按從高位到低位排列后得到:0.645D≈0.A52EBH。
3)對同時有整數和小數兩部分的十進制數,在轉化為二進制、八進制和十六進制時,其轉換的方法是:先對整數和小數部分分開轉換后,再合并起來。
(3)二進制數和八進制數的轉換
由于2的3次方是8,所以可采用“三合一”的原則,即從小數點開始分別向左、右兩邊各以3位為一組進行二進制到八進制數的轉換:若不足3位的以0補足,便可將二進制數轉換為八進制數。
反之,采用“一分為三”的原則,每位八進制數用三位二進制數表示,就可將八進制數轉換為二進制數。
【例1-3】將二進制數1011010101.01111B轉換成八進制數。

所以,1011010101.01111B=1325.36O。
例題:將八進制數472.63轉換成二進制數。

所以,472.63O=100111010.110011B。
(4)二進制數和十六進制數的轉換
由于二進制數和十六進制數間的轉換十分方便,再加上十六進制數在表達數據時形式簡單,所以編程人員大多采用十六進制數的形式來代替二進制數。
二進制數和十六進制數間的轉換同二進制數和八進制數之間的轉換一樣,采用“四位合一位法”,即從二進制的小數點開始,分別向左、右兩邊各以4位為一組,不足4位以0補足,然后分別把每組數用十六進制數碼表示,并按序相連。
而十六進制數轉換成二進制數的轉換方法采用“一分為四”的原則,即把十六進制數的每位分別用4位二進制數碼表示,然后分別把它們連成一體。
【例1-4】將二進制數1011010101.01111B轉換成十六進制數。

所以,1011010101.01111B=2D5.78H。
【例1-5】將十六進制數EF8.7D轉換成二進制數。

所以,EF8.7D=111011111000.01101101B。
4.編碼
計算機不僅要識別人們習慣的十進制數、完成數值計算問題,而且要處理大量文字、字符和各種符號(標點符號、運算符號)等非數值計算問題。這就要求計算機必須能夠識別它們。也就是說,字符、符號和十進制數最終都要轉換為二進制格式的代碼,即信息和數據的二進制編碼。
根據信息對象的不同,計算機中的編碼方式(碼制)也不同,常見的碼制有BCD碼和ASCII碼。
(1)BCD碼
為了在計算機的輸入輸出操作中能直觀迅速地與常用的十進制數相對應,習慣上用二進制代碼表示十進制數,這種編碼方法簡稱BCD碼(Binary Coded Decimal),其與十進制數對應關系見表1-2。
8421碼是BCD的一種,因組成它的4位二進制數每一位的權為8、4、2、1而得名。這種編碼形式利用4位二進制碼來表示一個十進制的數碼,使二進制和十進制之間的轉換得以便捷地進行。
表1-2 十進制數與對應的BCD碼

(2)ASCII碼
目前采用的字符編碼主要是ASCII碼,即American Standard Code for Information Interchange的縮寫。
ASCII碼是用7位二進制數編碼來表示128個字符和符號,一個ASCII碼存放在一個字節的低7位,字節的高位為0,因此可以表示128個不同字符,如附錄B所見。
數字0~9的ASCII碼為0110000B~0111001B(即30H~39H),大寫字母A~Z的ASCII碼為41H~5AH。同一個字母的ASCII碼的碼制小寫字母比大寫字母大32(20H)。
1.1.4 計算機中數的表示與運算
計算機中的數按數的性質分為:整數(無符號整數、有符號整數)和小數(定點數、浮點數);按有無符號分為:有符號數(正數、負數)和無符號數。
1.無符號數的表示
(1)無符號數的表示形式
無符號數中用來表示數的符號的數位稱為符號位。無符號數沒有符號位,數的所有數位Dn-1~D0均為數值位。其表示形式為:

(2)無符號二進制數的表示范圍
一個n位無符號二進制數X,它可以表示的數的范圍為0≤X≤2n-1。若結果超出了數的可表示范圍,則會產出溢出,出錯。
2.有符號數的表示
有符號數由符號位和數值位兩部分組成,數學中的正、負號用符號“+”、“-”來表示,在計算機中規定:用“0”表示“+”,用“1”表示“-”。這樣數的符號位在計算機中已經數碼化了。符號位數碼化后的數就稱為機器數,原來的數稱為機器數的真值。
計算機的有符號數或者說機器數有3種表示形式:原碼、反碼和補碼。目前計算機中的數是采取補碼表示的。
(1)原碼
對于一個二進制數X,若最高數位用“0”表示“+”,用“1”表示“-”,其余各數位表示數值本身,則稱為原碼表示法,記為[X]原。
【例1-6】X=+1101011,Y=-1000011,求[X]原,[Y]原。
[X]原=01101011,[Y]原=11000011
值得注意的是,0在8位單片機中的兩種原碼形式為:[+0]原=00000000B,[-0]原=10000000B,所以數0的原碼不唯一。
8位二進制原碼可表示的范圍為:-127~+127。
(2)反碼
正數的反碼表示與其原碼相同,負數的反碼是其原碼的符號位不變、數值各位取反,記為[X]反。
【例1-7】X=+1101011,Y=-1000011,求[X]反,[Y]反。
[X]反=01101011,[Y]反=10111100
0在反碼中有兩種表示形式:
[+0]反=00000000B,[-0]反=11111111B
(3)補碼
正數的原碼、反碼和補碼相同,負數的補碼其最高位為1,數值位等于反碼數值位的低位加“1”。
【例1-8】X=+1101011,Y=-1000011,求[X]補,[Y]補。
[X]補=01101011,[Y]補=10111101
[+0]補=00000000B,[-0]補=00000000B
由此可見,不論是+0還是-0,0在補碼中只有唯一的一種表示形式。
3.無符號數的運算
無符號數的運算主要是無符號數的加、減、乘、除運算與溢出。
(1)二進制數的加減運算
二進制加法運算,每一位遵循如下法則:
0+0=0,0+1=1,1+0=1,1+1=0(向高位有進位),逢二進一。
0-0=0,1-1=0,1-0=1,0-1=1(向高位有借位),借一為二。
(2)二進制數乘法運算
二進制乘法運算,每一位遵循如下法則:0×0=0,0×1=0,1×0=0,1×1=1。其特點是:當且僅當兩個1相乘時結果為1,否則為0。二進制數乘法運算過程是若乘數位為1,則將被乘數加于中間結果中;若乘數為0,則加0于中間結果中。
【例1-9】乘數為1101B,被乘數為0101B,求乘積的值。

(3)二進制數除法運算
【例1-10】除數為101,被除數為011010,求商的值。

二進制數除法商的過程和十進制數有些類似,首先將除數和被除數的高n位進行比較,若除數小于被除數,則商為1,然后從被除數中減去除數,得到部分余數;否則商為0。將除數和新的部分余數進行比較,直至被除數所有的位數都處理完畢為止,最后得到商和余數。
4.二進制數的邏輯運算
計算機處理數據時常常要用到邏輯運算,邏輯運算由專門的邏輯電路完成。
(1)邏輯與運算
邏輯與運算常用算符“∧”表示,邏輯與運算的運算法則為:0∧1=1∧0=0,0∧0=0,1∧1=1。邏輯與運算法則可概括為“只有對應的兩個二進位均為1時,結果位才為1,否則為0”。

所以,01110101B∧01001111B=01000101B。
(2)邏輯或運算
邏輯或運算常用算符“∨”表示,邏輯或的運算法則為:0∨1=1∨0=1,0∨0=0,1∨1=1。邏輯或運算法則可概括為“只要對應的兩個二進位有一個為1時,結果位就為1”。
例如:求00110101B∨0000111B的值。

所以,00110101B∨00000111B=00110111B。
(3)邏輯非運算
邏輯非運算常采用算符“-”表示,運算法則為:,
=1。
例如:已知A=10101B,試求的值。

(4)邏輯異或運算
邏輯異或運算常采用算符⊕表示,邏輯異或的運算法則為:0⊕1=1⊕0=1,0⊕0=1⊕1=0。邏輯異或運算可概括為“兩對應的二進位不同時,結果為1,相同時為0”。
例如:已知A=10110110B,B=11110000B,試求A⊕B的值。

5.有符號數的運算
原碼表示的數雖然比較簡單、直觀,但由于計算機中的運算電路非常復雜,尤其是符號位需要單獨處理。補碼雖不易識別,但運算方便,特別在加減運算中更是這樣。當所有參加運算的帶符號數都用補碼表示后,計算機對它運算后得到的結果必然也是補碼,符號位則無須單獨處理。
(1)補碼的加、減法運算
補碼加、減法運算的通式為:
[A+B]補=[A]補+[B]補
[A-B]補=[A]補-[B]補
即兩數之和的補碼等于兩數補碼之和,兩數之差的補碼等于兩數補碼之差。設機器數字長為n,則參與運算的數值的模為2n。A、B、A+B和A-B必須都在-2n~2n-1-1范圍內,否則機器便會產生溢出錯誤。在運算過程中,運算位和數值位要一起參加運算,符號位的進位位略去不計。
【例1-11】已知A=+19,B=10,C=-7。試求[A+B]補、[A-B]補、[A+C]補。
解:[A]補=00010011B,[B]補=00001010B,[-B]補=11110110B,[C]補=11111001B。
1)[A+B]補=[A]補+[B]補=00010011B+00001010B=00011101B;
2)[A-B]補=[A]補+[-B]補=00010011B+11110110B=00001001B(符號位的進位位略去不計);
3)[A+C]補=[A]補+[C]補=00010011B+11111001B=00001100B(符號位的進位位略去不計)。
上述運算表明:補碼運算的結果和十進制運算的結果是完全相同的。補碼加法可以將減法轉化為加法來做;把加法和減法問題巧妙地統一起來,從而實現了一個補碼加法器在移位控制電路作用下完成加、減、乘、除的四則運算。
(2)乘法和除法運算
乘法運算包括符號運算和數值運算。兩個同符號數相乘之積為正,兩個異符號數相乘之積為負;數值運算是對兩個數的絕對值相乘,它們可以被視為無符號數的乘法,無符號數的乘法運算在前面章節中已經做了介紹。
除法運算也包括符號運算和數值運算。兩個同符號數相除商為正,兩個異符號數相除商為負;數值運算是對兩個數的絕對值相除,它們可以被視為無符號數的除法。
注意:在計算機中凡是有符號數一律用補碼表示且符號位參與運算,其運算結果也用補碼表示。若結果的符號位為0,則表示結果為正數,此時可以認為就是它的原碼形式;若結果的符號位為1,則表示結果為負數,它是以補碼形式表示的。若要用原碼來表示該結果,還需要對結果求補(除符號位外取反加1,[[X]補]補=[X]原)。
(3)對補碼運算結果正確性的判斷
對8位機而言,如果運算結果超出-128~+127,則稱為溢出(小于-128的運算結果稱為下溢,大于+127稱為上溢)。也就是說如果參加運算的兩數或運算結果超出8位數所能表示的范圍,則機器的運算就會出現溢出,運算結果就不正確。因此,補碼運算的正確性主要體現在對補碼運算結果的溢出判斷上。
在MCS-51單片機中,補碼運算結果中的符號位的進位位用Cp表示,用Cs表示補碼運算過程中次高位向符號位的進位位。若加法過程中符號位無進位(Cp=0)以及最高數值位有進位(Cs=1),則操作結果產生正溢出;若加法過程中符號位有進位(Cp=1)以及最高數值位無進位(Cs=0),則操作結果產生負溢出。
用OV表示溢出標志位,判斷補碼運算是否溢出的邏輯表達式可描述為:
OV= C p⊕C s
【例1-12】已知A=-127,B=10,C=-7,試求[A+B]補、[A+C]補,并分析溢出情況。
[A]補=01111111B,[B]補=00001010B,[C]補=11111001B
[A+B]補算式為:

從上式可以看出,[A+B]補超出了8位二進制數能夠表示的范圍,無論符號Cp有無進位,都產生了溢出。運算結果Cp=0,Cs=1,利用OV= Cp⊕Cs可以判斷出[A+B]補帶符號數補碼加法運算的結果產生了溢出,所以結果不正確。
[A+C]補算式為:

[A+C]補的運算結果是正確的,沒有產生溢出,符號進位Cp屬于正常的自動丟棄。運算結果Cp=1,Cs=1,根據式OV= Cp⊕Cs可以判斷出[A+C]補帶符號數補碼加法運算的結果沒有產生溢出,從而結果正確。
從上面兩個例子可以看出,帶符號數相加時,符號位所產生的進位Cp有自動丟棄和用來指示操作結果是否溢出的兩種功能。
- Intel FPGA/CPLD設計(基礎篇)
- FPGA從入門到精通(實戰篇)
- 嵌入式技術基礎與實踐(第5版)
- 電腦常見故障現場處理
- 電腦維護365問
- Camtasia Studio 8:Advanced Editing and Publishing Techniques
- Learning Game Physics with Bullet Physics and OpenGL
- Svelte 3 Up and Running
- Rapid BeagleBoard Prototyping with MATLAB and Simulink
- 筆記本電腦維修300問
- 單片機系統設計與開發教程
- 固態存儲:原理、架構與數據安全
- Blender Quick Start Guide
- STM32自學筆記
- Learning Less.js