C語言在單片機(jī)中的應(yīng)用_第1頁
C語言在單片機(jī)中的應(yīng)用_第2頁
C語言在單片機(jī)中的應(yīng)用_第3頁
C語言在單片機(jī)中的應(yīng)用_第4頁
C語言在單片機(jī)中的應(yīng)用_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 第十章第十章 C C語言在單片機(jī)中的應(yīng)用語言在單片機(jī)中的應(yīng)用10.1 MCS-51系列單片機(jī)基本結(jié)構(gòu) 8051是MCS-51系列單片機(jī)的典型產(chǎn)品,其他單片機(jī)與8051的系統(tǒng)結(jié)構(gòu)相同,只是對8051進(jìn)行一些擴(kuò)充,使其功能更強(qiáng)、市場競爭力更強(qiáng)。 51系列單片機(jī)的內(nèi)部結(jié)構(gòu) 51系列單片機(jī)的引腳資源 中央處理器(CPU) 存儲器結(jié)構(gòu) 51系列單片機(jī)的復(fù)位 51系列單片機(jī)的時(shí)鐘和時(shí)序 51系列單片機(jī)的并行I/O口 掉電保護(hù)和低功耗設(shè)計(jì) 51系列單片機(jī)的最小系統(tǒng) 51系列單片機(jī)的內(nèi)部結(jié)構(gòu)8051系列單片機(jī)的內(nèi)部結(jié)構(gòu)是各種邏輯單元及其之間的互連構(gòu)成的。其主要由中央處理器(CPU)、程序存儲器(ROM)、數(shù)

2、據(jù)存儲器(RAM)、串行接口、并行I/0接口、定時(shí)/計(jì)數(shù)器、中斷系統(tǒng)等幾大單元,以及數(shù)據(jù)總線、地址總線和控制總線組成。8051系列單片機(jī)的內(nèi)部結(jié)構(gòu)框架示意圖,如圖所示。 內(nèi)部結(jié)構(gòu)的主要組成部分 單片機(jī)的性能都反應(yīng)在單片機(jī)所特有的結(jié)構(gòu)和資源上。這里首先介紹一下8051單片機(jī)基本結(jié)構(gòu)的主要組成部分。 1中央處理器(CPU) 2程序存儲器(ROM) 3數(shù)據(jù)存儲器(RAM) 4定時(shí)器/計(jì)數(shù)器 5并行輸入輸出(I/O)口 6全雙工串行口 7中斷系統(tǒng) 8時(shí)鐘電路 單片機(jī)結(jié)構(gòu)的類型單片機(jī)結(jié)構(gòu)的類型可以按照程序存儲器和數(shù)據(jù)存儲器的體系結(jié)構(gòu)來劃分,大致有兩種類型:哈佛(Harvard)結(jié)構(gòu)。這種結(jié)構(gòu)程序存儲器(

3、ROM)和數(shù)據(jù)存儲器(RAM)采用分開的形式。哈佛結(jié)構(gòu)便于對程序和數(shù)據(jù)同時(shí)訪問,可以減輕程序運(yùn)行時(shí)的訪存瓶頸,提高數(shù)據(jù)的吞吐率。普林斯頓(Princeton)結(jié)構(gòu)。這種結(jié)構(gòu)中采用通用計(jì)算機(jī)廣泛使用的程序存儲器(ROM)與數(shù)據(jù)存儲器(RAM)合二為一的方式,也稱為馮諾伊曼結(jié)構(gòu)。由于程序指令存儲地址和數(shù)據(jù)存儲地址指向同一個(gè)存儲器的不同物理位置,因此程序指令和數(shù)據(jù)的寬度相同。例如,INTEL的MCS-51系列單片機(jī)普遍采用的是哈佛結(jié)構(gòu)的形式,而后續(xù)產(chǎn)品16位的MCS-96系列單片機(jī)則采用普林斯頓結(jié)構(gòu)。 51系列單片機(jī)的引腳功能 Intel的8051是一個(gè)典型的單片機(jī),在后續(xù)MCS-51系列單片機(jī)的產(chǎn)

4、品線中,均以其為核心電路發(fā)展起來的。它們具有和8051一致的硬件結(jié)構(gòu)和軟件特征。 隨著半導(dǎo)體技術(shù)的發(fā)展,各種新型的單片機(jī)層出不窮,性能也得到不斷提升,價(jià)格也越來越低。因此,本章在介紹51系列單片機(jī)時(shí)不局限于介紹基本的8051,而是以最新型的51系列單片機(jī)來進(jìn)行介紹。這些新型的單片機(jī)在基本功能上和8051完全一致,從而在理解8051結(jié)構(gòu)的同時(shí),也熟悉了最新的單片機(jī)。 51系列單片機(jī)的引腳封裝MCS-51系列單片機(jī)有各種封裝形式,這里均以雙列直插DIP形式的封裝來進(jìn)行介紹。Intel的8051的典型引腳配置,如圖所示。這是40Pin封裝的雙列直插DIP式結(jié)構(gòu),其中正電源和地線兩根,外置石英振蕩器的

5、時(shí)鐘線兩根,4組8位共32個(gè)I/O口,中斷口線與P3口線復(fù)用。Atmel公司的AT89S系列與MCS-51系列是兼容的,這里主要以AT89S52單片機(jī)來介紹51系列單片機(jī)的基本原理。AT89S52的40Pin雙列直插封裝的引腳配置,如圖所示。 51系列單片機(jī)引腳功能這里以AT89S52為原型,介紹51系列單片機(jī)的引腳功能。雖然市場上51系列單片機(jī)種類很多,但由于51系列單片機(jī)的引腳都基本兼容,因此這些內(nèi)容同樣適合于其他型號的單片機(jī)。1電源引腳:電源引腳主要負(fù)責(zé)單片機(jī)的供電,有兩根引腳。2外接晶振或外部振蕩器引腳:外接晶振或外部振蕩器引腳主要負(fù)責(zé)為單片機(jī)的運(yùn)行提供時(shí)鐘振蕩器,主要有兩根引腳。3輸

6、入輸出(I/O)端口引腳:AT89S52提供了4個(gè)8位并行I/O端口,基本的功能和其他51系列單片機(jī)完全一致,部分引腳有擴(kuò)展功能。 4復(fù)位、控制和選通引腳:復(fù)位、控制和選通引腳主要負(fù)責(zé)單片機(jī)程序復(fù)位、編程控制及外部程序存儲器的選通。 中央處理器(CPU) 中央處理器(CPU)是由運(yùn)算器(ALU)、定時(shí)控制部件和寄存器通過總線連接而成的一個(gè)整體。中央處理器(CPU)是整個(gè)單片機(jī)的核心部件。CPU負(fù)責(zé)控制、指揮和調(diào)度整個(gè)單元系統(tǒng)協(xié)調(diào)的工作,完成運(yùn)算和控制輸入輸出功能等操作。 51系列單片機(jī)是8位數(shù)據(jù)總線的處理器,能處理8位二進(jìn)制數(shù)據(jù)或代碼。AT89S52的CPU與8051的CPU完全兼容,這里以A

7、T89S52為例進(jìn)行介紹。 算術(shù)邏輯運(yùn)算部件(ALU)算術(shù)邏輯運(yùn)算部件(ALU)是進(jìn)行算術(shù)及邏輯運(yùn)算的功能部件。AT89S52單片機(jī)的算術(shù)邏輯運(yùn)算部件(ALU)包括運(yùn)算器、累加器(A)、寄存器B、暫存器TMP、程序狀態(tài)寄存器(PSW)、推棧指針SP、數(shù)據(jù)指針DPTR等。其可以進(jìn)行加、減、乘、除四則運(yùn)算,也可以進(jìn)行與、或、非、異或等邏輯運(yùn)算,還可以執(zhí)行數(shù)據(jù)傳送、移位、判斷和程序轉(zhuǎn)移等功能。51系列單片機(jī)的ALU提供了豐富的指令系統(tǒng)和極快的指令執(zhí)行速度,大部分指令執(zhí)行時(shí)間為1s,乘法指令為4s。AT89S52的ALU與8051的ALU完全兼容,其位處理功能非常強(qiáng),這對“面向控制”特別有用,指令功能

8、極為豐富,8位并行處理能力極強(qiáng)。 控制器 控制器是用來統(tǒng)一指揮和控制計(jì)算機(jī)進(jìn)行工作的部件。其主要的功能是從程序存儲器中提取指令,送到指令寄存器,再送入指令譯碼器進(jìn)行譯碼??刂破魍ㄟ^定時(shí)和控制電路,在規(guī)定的時(shí)刻發(fā)出各種操作所需要的全部內(nèi)部控制信息及CPU外部所需要的控制信號,如ALE、RD、WR等,使各部分協(xié)調(diào)工作,完成指令所規(guī)定的各種操作。 8051的控制器包括時(shí)鐘發(fā)生器、定時(shí)控制邏輯、指令寄存器、指令譯碼器、程序計(jì)數(shù)器PC、程序地址寄存器、數(shù)據(jù)指針寄存器DPTR和堆棧指針SP等。 通用寄存器 寄存器是用來存放信息的單元,其優(yōu)點(diǎn)是存取速度快、方便,寄存器的數(shù)量是衡量一臺計(jì)算機(jī)處理能力的重要標(biāo)志

9、。51系列單片機(jī)的寄存器可分為工作寄存器(即通用寄存器)、專用寄存器和特殊功能寄存器(SFR)。特殊功能寄存器是專為對應(yīng)功能服務(wù),在“數(shù)據(jù)存儲器”一節(jié)將詳細(xì)介紹。本小節(jié)主要介紹通用工作寄存器R0R7。 片內(nèi)RAM的00H1FH(共32B)空間,開辟了4個(gè)工作寄存器區(qū),每組共有8個(gè)8位的寄存器R0R7,通過對PSW的RS1和RS2進(jìn)行設(shè)置,選擇任意一組使用,其余3組被屏蔽。其優(yōu)點(diǎn)是,避免進(jìn)站保護(hù)、減少堆棧深度、節(jié)省出入棧指令和時(shí)間。不用的工作寄存器可作為片內(nèi)RAM訪問。 專用寄存器專用寄存器是專門為某些功能部件設(shè)計(jì)的寄存器。下面分別介紹這幾種寄存器的功能。1程序計(jì)數(shù)器PC:程序計(jì)數(shù)器PC是一個(gè)1

10、6位二進(jìn)制的程序地址寄存器,專門用來存放下一條需要執(zhí)行指令的內(nèi)存地址,能自動加1。2累加器A:累加器A(或者ACC)是運(yùn)算過程中的暫存寄存器,是一個(gè)8位二進(jìn)制寄存器,用于提供操作數(shù)和存放操作結(jié)果。3寄存器B:寄存器B一般用于乘除法操作指令,也是一個(gè)8位二進(jìn)制寄存器,由8個(gè)觸發(fā)器組成,與累加器A配合使用。4程序狀態(tài)寄存器(PSW):程序狀態(tài)寄存器(PSW)是一個(gè)8位寄存器,用于存放指令執(zhí)行后的有關(guān)狀態(tài),為后面的指令執(zhí)行提供狀態(tài)條件。5堆棧指針SP:推棧指針SP是在片內(nèi)RAM中開辟一個(gè)存儲區(qū)域,專門存放堆棧棧頂?shù)牡刂贰?數(shù)據(jù)指針DPTR:數(shù)據(jù)指針DPTR是一個(gè)16位寄存器,是由8位寄存器DPH和D

11、PL組合而成。 存儲器結(jié)構(gòu)存儲器是單片機(jī)的3大主要部件之一,主要用來儲存信息(即數(shù)據(jù)和程序)。存儲器按配置方法分為主存和外存?!爸鞔妗庇址Q為“內(nèi)存”,用于存放當(dāng)前執(zhí)行的數(shù)據(jù)和程序;“外存”用于存放暫不執(zhí)行的數(shù)據(jù)和程序。目前單片機(jī)主要配置內(nèi)存。存儲器結(jié)構(gòu)分為獨(dú)立的兩部分:數(shù)據(jù)存儲器(RAM)和程序存儲器(ROM)。8051單片機(jī)的存儲器可分為4個(gè)存儲空間:片內(nèi)程序存儲器(片內(nèi)ROM)、片外程序存儲器(片外ROM)、片內(nèi)數(shù)據(jù)存儲器(片內(nèi)RAM)、片外數(shù)據(jù)存儲器(片外RAM)。這4類存儲器與其對應(yīng)的地址關(guān)系,如表所示。 程序存儲器及其擴(kuò)展 程序存儲器設(shè)計(jì)人員編寫的程序就存放在單片機(jī)的程序存儲器中,也

12、稱為“只讀程序存儲器”(ROM)。程序和數(shù)據(jù)一樣,都是由機(jī)器碼組成的代碼串,只是程序代碼則存放于程序存儲器中。 1程序存儲器:51系列單片機(jī)具有64KB程序存儲器尋址空間,這64KB的地址空間是統(tǒng)一編址的,沒有采用片內(nèi)、片外分區(qū)的方式。 2程序存儲器的擴(kuò)展:51系列單片機(jī)為了滿足不同應(yīng)用的需要,除了設(shè)置有內(nèi)部程序存儲器外,還可以根據(jù)需要進(jìn)行外部程序存儲器擴(kuò)展。外部程序存儲器擴(kuò)展時(shí),采用P0和P2作為16位地址總線的低8位和高8位,另外,P0口還分時(shí)復(fù)用為8位數(shù)據(jù)總線。 數(shù)據(jù)存儲器及其擴(kuò)展數(shù)據(jù)存儲器也稱為“隨機(jī)存取數(shù)據(jù)存儲器”。51系列單片機(jī)的數(shù)據(jù)存儲器在物理邏輯上分為兩個(gè)地址空間,即片內(nèi)數(shù)據(jù)存

13、儲區(qū)和片外數(shù)據(jù)存儲區(qū)。片內(nèi)RAM有256B的用戶數(shù)據(jù)存儲區(qū)域(不同的型號有分別),是用于存放執(zhí)行的中間結(jié)果和過程數(shù)據(jù)的51系列單片機(jī)的。數(shù)據(jù)存儲器均可讀寫,部分單元還可以位尋址,其結(jié)構(gòu)示意圖如圖所示。 51系列單片機(jī)的復(fù)位 復(fù)位是使單片機(jī)的CPU以及系統(tǒng)的各個(gè)部件處于特定的初始狀態(tài),并使系統(tǒng)從初始狀態(tài)開始工作。單片機(jī)的復(fù)位是一個(gè)很重要的內(nèi)容,一般在系統(tǒng)上電,或者程序死機(jī)的時(shí)候需要進(jìn)行單片機(jī)的復(fù)位。 單片機(jī)的復(fù)位狀態(tài)單片機(jī)的復(fù)位狀態(tài)是單片機(jī)在上電時(shí),首先所處的一個(gè)特定的狀態(tài)。在復(fù)位狀態(tài)下,CPU和整個(gè)硬件資源,特別是特殊功能寄存器都處于初始化的狀態(tài)。如表所示列出了在單片機(jī)復(fù)位狀態(tài)下的初始值。 單

14、片機(jī)的復(fù)位電路單片機(jī)的復(fù)位電路是促使單片機(jī)進(jìn)入復(fù)位狀態(tài)的硬件結(jié)構(gòu)。單片機(jī)的復(fù)位是很重要的,復(fù)位操作可以完成單片機(jī)的初始化,也可使處于死機(jī)狀態(tài)下的單片機(jī)重新開始運(yùn)行。1復(fù)位要求2上電復(fù)位電路3手動加上電復(fù)位電路4定時(shí)監(jiān)視器(WDT,看門狗)復(fù)位5復(fù)雜的復(fù)位電路 51系列單片機(jī)的時(shí)鐘和時(shí)序 單片機(jī)內(nèi)部是基于數(shù)字邏輯電路來運(yùn)行的,這些數(shù)字邏輯電路需要在一個(gè)統(tǒng)一的時(shí)鐘步調(diào)下運(yùn)行,這便涉及到單片機(jī)的時(shí)鐘和時(shí)序問題。這里以AT89S52為例來介紹和時(shí)序有關(guān)的問題,其中的內(nèi)容對其他51系列單片機(jī)都是通用的。 振蕩器和時(shí)鐘電路振蕩器和時(shí)鐘電路用于產(chǎn)生單片機(jī)正常工作時(shí)所需要時(shí)鐘信號。AT89S52單片機(jī)采用的C

15、MOS工藝,內(nèi)部包含有一個(gè)振蕩器,可以用于CPU的時(shí)鐘源。另外,也允許采用外部振蕩器,由外部振蕩器產(chǎn)生的時(shí)鐘信號來供內(nèi)部CPU運(yùn)行使用。下面分別介紹這兩種方式。1內(nèi)部時(shí)鐘模式內(nèi)部時(shí)鐘模式是采用單片機(jī)內(nèi)部振蕩器來工作的模式。AT89S52和其他51系列單片機(jī)一樣,其內(nèi)部包含一個(gè)高增益的單級反相放大器,引腳XTAL1和XTAL2分別為片內(nèi)反相放大器的輸入端口和輸出端口,其工作頻率為033MHz。對于Intel的8051,工作頻率為1.212MHz。2外部時(shí)鐘模式外部時(shí)鐘模式是采用外部振蕩器產(chǎn)生時(shí)鐘信號,直接提供給單片機(jī)使用。對于不同結(jié)構(gòu)的單片機(jī),外部時(shí)鐘信號接入的方式有所不同。對于普通的8051單

16、片機(jī),外部時(shí)鐘信號由XTAL2引腳接入后直接送到單片機(jī)內(nèi)部的時(shí)鐘發(fā)生器,而引腳XTAL1則應(yīng)直接接地,這里需要注意,由于XTAL2引腳的邏輯電平不是TTL信號,因此建議外接一個(gè)上拉電阻。 CPU的時(shí)序CPU的時(shí)序是指令執(zhí)行所遵從的格式。在單片機(jī)內(nèi)部,振蕩器始終驅(qū)動內(nèi)部時(shí)鐘發(fā)生器向CPU提供時(shí)鐘信號。時(shí)鐘發(fā)生器的輸入是一個(gè)二分頻觸發(fā)器,這個(gè)二分頻觸發(fā)器為單片機(jī)提供了一個(gè)二相時(shí)鐘信號,即相位信號P1和相位信號P2,驅(qū)動CPU產(chǎn)生執(zhí)行指令功能的機(jī)器周期。單片機(jī)的時(shí)序是用定時(shí)單位來描述的,其描述了指令執(zhí)行中各控制信號在時(shí)間上的關(guān)系,這里涉及節(jié)拍、狀態(tài)、機(jī)器周期和指令周期4個(gè)概念,接下來分別加以說明它們

17、之間的關(guān)系,示意圖如圖所示。指令執(zhí)行的時(shí)序單片機(jī)的指令執(zhí)行過程包括取指令和執(zhí)行指令兩個(gè)部分,其是在CPU時(shí)鐘的步調(diào)下實(shí)現(xiàn)的。在單片機(jī)中,不同指令的長度和指令周期一般各不相同,可以分為單字節(jié)單周期指令、雙字節(jié)單周期指令、雙字節(jié)雙周期指令等等。下面介紹幾個(gè)典型的指令執(zhí)行時(shí)序。1單字節(jié)單周期指令的執(zhí)行時(shí)序單字節(jié)單周期指令的執(zhí)行時(shí)序。在每個(gè)機(jī)器周期內(nèi),地址鎖存信號ALE出現(xiàn)兩次高電平有效信號,一次在S1P2S2P1,另一次在S4P2S5P1。這樣,一個(gè)機(jī)器周期內(nèi)便可以讀兩次程序存儲器代碼。單字節(jié)單周期指令在執(zhí)行時(shí),第一次讀取指令代碼后便立即開始執(zhí)行該指令,第二次讀的代碼將被丟棄,不使用。2雙字節(jié)單周期

18、指令的執(zhí)行時(shí)序雙字節(jié)單周期指令的執(zhí)行時(shí)序。地址鎖存信號ALE仍然在一個(gè)機(jī)器周期內(nèi)有效兩次。不同于前面,雙字節(jié)單周期指令在執(zhí)行時(shí),兩次讀取的代碼都有效,在一個(gè)機(jī)器周期內(nèi)便執(zhí)行完該指令。3單字節(jié)雙周期指令的執(zhí)行時(shí)序單字節(jié)雙周期指令的執(zhí)行時(shí)序。這類指令執(zhí)行時(shí),第一次讀取指令代碼后,其余三次讀代碼操作均被丟棄,用兩個(gè)機(jī)器周期執(zhí)行完該指令。4MOVX類單字節(jié)單周期指令的執(zhí)行時(shí)序MOVX類單字節(jié)單周期指令的執(zhí)行時(shí)序。指令第一次讀取代碼后,第二次讀代碼操作被丟棄,在第二個(gè)機(jī)器周期完成外部數(shù)據(jù)單元的讀寫。 訪問外部ROM/RAM的操作時(shí)序訪問外部ROM/RAM的操作時(shí)序,主要發(fā)生在外部擴(kuò)展單片機(jī)ROM和RAM

19、的時(shí)候。此時(shí),具體的操作時(shí)序分別介紹如下。1訪問外部ROM的操作時(shí)序當(dāng)對51系列單片機(jī)進(jìn)行外部擴(kuò)展程序存儲器ROM的時(shí)候,指令的操作時(shí)序便涉及到外部存儲器的操作。此時(shí)除了需要ALE信號外,還需要信號以及將P0口作為低8位地址,P2口作為高8位地址。訪問外部ROM的時(shí)序。2訪問外部RAM的操作時(shí)序當(dāng)對單片機(jī)進(jìn)行了外部RAM擴(kuò)展,此時(shí)單片機(jī)訪問外部RAM的操作時(shí)序和前面有所不同。整個(gè)訪問外部RAM的操作時(shí)序。操作需要執(zhí)行兩步:(1)先從外部ROM中取MOVX指令;(2)根據(jù)MOVX指令所給出的數(shù)據(jù)來選擇某個(gè)外部RAM單元,然后對該單元進(jìn)行讀寫操作。 51系列單片機(jī)的并行I/O口 典型的8051單片

20、機(jī)具有4個(gè)8位的并行I/O端口,分別為P0、P1、P2和P3,共32條I/O線。這些I/O端口是雙向I/O端口,每個(gè)端口均可以用作輸入和輸出。在程序中,這些I/O端口分別對應(yīng)4個(gè)特殊功能寄存器P0、P1、P2和P3。 并行I/O口對于8051的4組8位I/O口來說,其中P1、P2和P3為準(zhǔn)雙向口,P0口則為雙向三態(tài)輸入輸出口,下面我們分別介紹這幾個(gè)端口的結(jié)構(gòu):1P0端口結(jié)構(gòu)2P1口結(jié)構(gòu):P1口一般用作通用I/O端口,其可以用作位處理,各位都可以單獨(dú)輸出或輸入信息。3P2口結(jié)構(gòu):P2口可以當(dāng)作普通I/O口,也可以在系統(tǒng)外部擴(kuò)展存儲器的時(shí)候,輸出高8位的地址。4P3口內(nèi)部結(jié)構(gòu):P3端口是一個(gè)具有第

21、二變異功能、且可位操作的端口。P3口的內(nèi)部結(jié)構(gòu),如圖所示,其可以有兩種用途:當(dāng)作為普通I/O端口時(shí),P3口可以進(jìn)行位操作,是準(zhǔn)雙向端口,可以驅(qū)動4個(gè)LSTTL負(fù)載。當(dāng)系統(tǒng)需要擴(kuò)展外部器件時(shí),P3口可以作為第二變異功能使用。 并行I/O口的應(yīng)用單片機(jī)4個(gè)8位I/O端口的不同結(jié)構(gòu),決定了各自的應(yīng)用范圍。例如,在一些復(fù)雜的應(yīng)用系統(tǒng)中,只用一個(gè)單片機(jī)很難達(dá)到系統(tǒng)的要求,經(jīng)常需要外部功能擴(kuò)展。因此,單片機(jī)的P0口和P2口常用于組成16位地址總線。P0口用作8位數(shù)據(jù)總線,P3口由于其特有的第二變異功能,因此常用于傳輸和控制等,只有P1口可以真正的用于I/O操作。另外,在單片機(jī)應(yīng)用時(shí),P0口需要外加上拉電阻

22、,而P1口、P2口和P3口內(nèi)部設(shè)置有上拉電阻,不用外加。這4個(gè)I/O端口均為準(zhǔn)雙向I/O端口,其驅(qū)動能力不同,P0口的驅(qū)動能力最強(qiáng),可以驅(qū)動8個(gè)LSTTL負(fù)載,其余3個(gè)端口只能驅(qū)動4個(gè)LSTTL負(fù)載。還有一個(gè)需要強(qiáng)調(diào)的是,這些端口都有兩種讀取方式:讀鎖存器和讀引腳。這是因?yàn)樵贗/O端口中,鎖存器內(nèi)容和引腳上的內(nèi)容有可能不一致。 并行I/O口的擴(kuò)展 雖然51系列單片機(jī)提供了4個(gè)8位的并行I/O口用于核外部設(shè)備進(jìn)行數(shù)據(jù)通信及控制,但是這些I/O一般不能完全用于輸入輸出操作。 例如,很多時(shí)候都需要擴(kuò)展外部程序存儲器或數(shù)據(jù)存儲器,此時(shí)P0口和P2口便用作數(shù)據(jù)和地址總線,提供給用戶的I/O端口只有P1口

23、和P3口。如果再使用串行通信或者外部中斷功能時(shí),則可使用的I/O口便更少。因此,在單片機(jī)的系統(tǒng)設(shè)計(jì)中,經(jīng)常需要擴(kuò)展I/O口。 1并行I/O口的原理 2并行I/O擴(kuò)展實(shí)例 系統(tǒng)掉電保護(hù)和低功耗設(shè)計(jì) 對于一個(gè)完善的單片機(jī)應(yīng)用系統(tǒng),為了保證其能夠安全的運(yùn)行,以及減少功耗等,需要考慮進(jìn)行掉電保護(hù)和采用低功耗的工作方式。 掉電保護(hù) 掉電保護(hù)電路需要完成的工作是,由電壓檢測電路檢測到電源電壓下降時(shí),觸發(fā)外部中斷或,在中斷服務(wù)子程序中講外部RAM中的有用數(shù)據(jù)送入內(nèi)部RAM保存。然后切換備用電源。 在單片機(jī)工作的時(shí)候,如果突然電源中斷或電源電壓不穩(wěn),都有可能造成單片機(jī)停止工作。此時(shí)。單片機(jī)RAM中的數(shù)據(jù)以及各

24、種寄存器的狀態(tài)都將丟失。等到電源恢復(fù)的時(shí)候,單片機(jī)便重新進(jìn)入新的一次執(zhí)行。對于一些比較重要的系統(tǒng),一般不允許。這就需要進(jìn)行掉電保護(hù),將一些重要的數(shù)據(jù)保護(hù)起來或者切換到備用電源。 低功耗設(shè)計(jì)在野外,特別是電池供電的系統(tǒng)中,能源的消耗是個(gè)需要著重考慮的問題,這時(shí)都希望單片機(jī)應(yīng)用系統(tǒng)能低功耗運(yùn)行,使系統(tǒng)的使用時(shí)間得到提高。AT89S52單片機(jī)提供了兩種低功耗工作模式:省電保持模式和休眠運(yùn)行模式。下面分別進(jìn)行介紹。1省電保持模式省電保持模式是將內(nèi)部振蕩器停止工作,此時(shí)CPU由于沒有了時(shí)鐘信號,因此內(nèi)部所有的功能部件均停止工作。但是內(nèi)部RAM和全部的特殊功能寄存器的數(shù)據(jù)將被保存。2休眠運(yùn)行模式休眠運(yùn)行模

25、式是保持內(nèi)部振蕩器仍然運(yùn)行,只是送往CPU內(nèi)部的時(shí)鐘信號被封鎖,CPU被凍結(jié),但內(nèi)部時(shí)鐘信號仍然供給中斷、串行口、定時(shí)/計(jì)數(shù)器等。CPU內(nèi)部狀態(tài),如堆棧指針SP、程序計(jì)數(shù)器PC、程序狀態(tài)字PSW、累加器A以及所有其他寄存器均保持凍結(jié)前的內(nèi)容不變,各端口的狀態(tài)也保持不變,片內(nèi)RAM中的數(shù)據(jù)不丟失,外部設(shè)備也可以正常運(yùn)行。 51系列單片機(jī)的最小系統(tǒng)單片機(jī)的最小系統(tǒng)是單片機(jī)能夠工作的最小硬件組合。對于8051系列單片機(jī)及其兼容的型號,其電路的最小系統(tǒng)大致相同,主要包括電源、晶體振蕩器、復(fù)位電路等。這里以AT89S52為例,介紹典型的51系列單片機(jī)最小硬件電路,如圖所示。 小結(jié) 本章詳細(xì)介紹了51系列

26、單片機(jī)的基本結(jié)構(gòu),包括單片機(jī)的內(nèi)部結(jié)構(gòu)、引腳功能、中央處理器CPU、存儲器的結(jié)構(gòu)、單片機(jī)的復(fù)位、單片機(jī)工作的時(shí)鐘和時(shí)序、并行I/O端口的結(jié)構(gòu)和性能以及單片機(jī)系統(tǒng)的掉電保護(hù)和低功耗設(shè)計(jì)。最后,還給出了一個(gè)典型的單片機(jī)最小系統(tǒng)。本章在講述的時(shí)候,不僅停留在基本的8051的介紹,還介紹了目前新推出的高性能單片機(jī)AT89S52。這樣便于讀者在學(xué)習(xí)基礎(chǔ)知識的同時(shí),還可以了解最新的單片機(jī)的性能和使用等。10.2 C語言與MCS-51單片機(jī) 單片機(jī)的C語言簡稱C51,有許多版本,常用KERL。 C51與C語言有許多不同之處:P304。 單片機(jī)C語言程序設(shè)計(jì)基礎(chǔ) 在單片機(jī)的開發(fā)與應(yīng)用中,除了匯編語言,也可以采

27、用其他高級語言,如C語言。單片機(jī)C語言既有匯編語言的操作底層硬件的能力,又具有高級語言的許多優(yōu)點(diǎn)。因此,在現(xiàn)代的單片機(jī)程序設(shè)計(jì)中廣泛采用單片機(jī)C語言。 單片機(jī)C語言概述 對比現(xiàn)有的程序設(shè)計(jì)語言,C語言以其功能強(qiáng)大、結(jié)構(gòu)清晰等優(yōu)點(diǎn)獲得廣泛應(yīng)用。對于學(xué)過C語言的讀者來說,再學(xué)其他語言就顯得輕而易舉了。而在單片機(jī)程序設(shè)計(jì)中,同樣有應(yīng)用于單片機(jī)的C語言,有時(shí)簡稱為C51語言。C51語言繼承了C語言的結(jié)構(gòu)上的優(yōu)點(diǎn),便于學(xué)習(xí),又有匯編語言操作硬件的能力,因此被廣泛使用于單片機(jī)程序設(shè)計(jì)中。 單片機(jī)C語言和匯編語言對比 匯編語言是一種面向機(jī)器的程序語言,其可以直接控制硬件,指令執(zhí)行速度快,且指令的執(zhí)行時(shí)間固定

28、,因此匯編語言的執(zhí)行效率很高。但其語言格式比較晦澀、可讀性差、難于編寫和調(diào)試,也不便于移植,影響了程序代碼的共享。 與匯編語言相比,單片機(jī)C語言在結(jié)構(gòu)上更易理解、可讀性強(qiáng),且開發(fā)速度快、可靠性好、便于移植。因此,使用單片機(jī)C語言進(jìn)行單片機(jī)系統(tǒng)的開發(fā),可以縮短開發(fā)周期、降低開發(fā)成本。隨著單片機(jī)硬件系統(tǒng)的發(fā)展和產(chǎn)品更新速度的提升,單片機(jī)的開發(fā)越來越著重于程序本身的開發(fā)效率,以便快速占領(lǐng)市場。因此,單片機(jī)C語言已成為目前最流行的單片機(jī)開發(fā)語言。 C51語言的主要特點(diǎn)單片機(jī)C51語言兼?zhèn)涓呒壵Z言與低級語言的優(yōu)點(diǎn),語法結(jié)構(gòu)和標(biāo)準(zhǔn)C語言基本一致。其規(guī)模適中,語言簡潔,便于學(xué)習(xí)。同C語言一樣,單片機(jī)C51語

29、言提供了完備的數(shù)據(jù)類型、運(yùn)算符以及函數(shù)供使用。C51語言借鑒了ALGOL的分程序結(jié)構(gòu),是一種結(jié)構(gòu)化程序設(shè)計(jì)語言。其使用一對花括號“”將一系列語句組合成一個(gè)復(fù)合語句,程序結(jié)構(gòu)簡單明了。C51語言的可移植性好。對于兼容的8051系列單片機(jī),只要將一個(gè)硬件型號下的程序稍加修改,甚至不加改變,就可移植到另一個(gè)不同的硬件型號開發(fā)環(huán)境中使用。C51語言生成的代碼執(zhí)行效率高,且比匯編語言的程序易于理解和共享使用。 單片機(jī)C語言在Keil Vison3中應(yīng)用實(shí)例 單片機(jī)C語言(即C51語言)是運(yùn)行在單片機(jī)上的程序語言,和C語言的語法結(jié)構(gòu)是基本一致的。這里通過一個(gè)實(shí)例,來講解如何在Keil Vison3集成開發(fā)

30、環(huán)境下進(jìn)行單片機(jī)C語言的程序設(shè)計(jì)。 創(chuàng)建項(xiàng)目 雙擊啟動Keil Vison3集成開發(fā)環(huán)境,首先開始創(chuàng)建項(xiàng)目,操作步驟如下。 創(chuàng)建源文件 當(dāng)一個(gè)單片機(jī)項(xiàng)目建立完畢后,現(xiàn)在開始進(jìn)行核心的源文件的設(shè)計(jì)。具體的操作步驟如下。 編譯項(xiàng)目 項(xiàng)目及源文件建立完畢后便可以編譯項(xiàng)目了。選擇“Project”“Build target”命令,即可編譯,如果程序無誤,則在輸出窗口中顯示編譯結(jié)果,如圖所示。 仿真調(diào)試 當(dāng)一個(gè)單片機(jī)項(xiàng)目建立并編譯通過后,在下載到單片機(jī)硬件中之前,為了確保程序的執(zhí)行完全符合要求,一般需要進(jìn)行仿真調(diào)試。Vison3的集成開發(fā)環(huán)境提供了完善的項(xiàng)目仿真和調(diào)試工具,下面就介紹如何使用Vison3

31、來進(jìn)行單片機(jī)C語言程序的仿真調(diào)試。項(xiàng)目仿真調(diào)試之前需要確保該項(xiàng)目完全通過編譯。仿真調(diào)試的步驟如下: C51的標(biāo)識符與關(guān)鍵字 同標(biāo)準(zhǔn)的C語言一樣,單片機(jī)的C51程序語言也包含特定的標(biāo)識符和關(guān)鍵字。因此,在進(jìn)行C51程序設(shè)計(jì)時(shí)必須符合其使用的規(guī)則。 標(biāo)識符標(biāo)識符是用來標(biāo)識源程序中某個(gè)對象名稱的符號。其中的對象可以是常量、變量、語句標(biāo)號、數(shù)據(jù)類型、自定義函數(shù)名以及數(shù)組名等。C51的標(biāo)識符的定義不是隨意的,需要符合以下定義規(guī)則。C51的標(biāo)識符可以由字母、數(shù)字(09)和下劃線“_”組成。C51的標(biāo)識符區(qū)分大小寫,例如“num5”和“NUM5”代表兩個(gè)不同的標(biāo)識符。C51的標(biāo)識符第一個(gè)字符必須是小寫字母(

32、az)、大寫字母(AZ)或者下劃線“_”。例如“count1”、“C_1”等,都是正確的。而“5num”則是錯(cuò)誤的標(biāo)識符,在編譯時(shí)系統(tǒng)會出現(xiàn)錯(cuò)誤提示。另外,有些編譯系統(tǒng)專用的標(biāo)識符是以下劃線開頭,為了程序的兼容性和可移植性,所以建議一般不要以下劃線開頭來命名標(biāo)識符。C51的標(biāo)識符定義不能使用C51的關(guān)鍵字,也不能和用戶已使用的函數(shù)名或C51庫函數(shù)同名。例如“int”是不正確的標(biāo)識符,“int”是關(guān)鍵字,所以它不能作為標(biāo)識符。C51的標(biāo)識符最多可支持32個(gè)字符,不過,為了使用和理解方便,盡量不要使用過長的標(biāo)識符。 關(guān)鍵字 關(guān)鍵字是被C51編譯器已定義保留的專用特殊標(biāo)識符。關(guān)鍵字是C51語言的一部

33、分,如if、for、do、case等。這些關(guān)鍵字有固定的名稱和含義,用戶在C51源程序中自定義的標(biāo)識符不允許與關(guān)鍵字相同,否則程序?qū)o法編譯運(yùn)行。單片機(jī)C51程序語言采用了ANSI C標(biāo)準(zhǔn)定義的32個(gè)關(guān)鍵字。 (詳細(xì)內(nèi)容請參照本書) C51的數(shù)據(jù)類型C51的數(shù)據(jù)類型是C51語言中變量以及常量的類型。每個(gè)變量在使用之前必須定義其數(shù)據(jù)類型。C51除了繼承了標(biāo)準(zhǔn)C語言中基本的數(shù)據(jù)類型int、char、short、long、float和double等外,又有自己的特點(diǎn)。例如在C51語言中int和short、float和double具有相同的取值范圍和含義。在C51中有以下幾種基本數(shù)據(jù)類型:整型(int

34、)、浮點(diǎn)型(float)、字符型(char)、無值型(void)。此外,C51語言還提供了幾種聚合類型(aggregate types),包括數(shù)組、指針、結(jié)構(gòu)、聯(lián)合(共用體)、枚舉和位域。關(guān)于幾種聚合類型將在下一章中進(jìn)行詳細(xì)介紹。本章主要介紹幾種基本類型。C51語言中基本數(shù)據(jù)類型的字長和取值范圍,如表所示。 常量與變量 常量就是在程序執(zhí)行過程中不改變值的數(shù)據(jù)量,變量就是在程序運(yùn)行過程中可以改變值的數(shù)據(jù)量。常量和變量是計(jì)算機(jī)程序處理的數(shù)據(jù)對象。 1常量 常量在程序中是不接受程序修改的固定值,C51中的常量可為任意數(shù)據(jù)類型。 2變量 變量在程序中是可以被程序修改的數(shù)據(jù)量。一個(gè)完整的變量應(yīng)該有類型說

35、明符以及變量標(biāo)識符。C51編譯器在單片機(jī)內(nèi)存中單獨(dú)劃分一定的存儲單元,用來存放該變量的值。 整型數(shù)據(jù)整型數(shù)據(jù)是整數(shù)類型的數(shù)據(jù)。整型數(shù)據(jù)是最常用的數(shù)據(jù)類型,下面就介紹整型數(shù)據(jù)的說明、整型變量的定義以及整型常量的表示。1整型數(shù)據(jù)說明2整型變量定義定義整型變量的一般格式是“類型說明符 變量標(biāo)識符,變量標(biāo)識符”。示例如下。inta, b;/定義a、b為有符號短整型變量unsigned longc, d;/定義c、d為無符號長整型變量3整型常量表示整型常量及整型常數(shù)可以表示十進(jìn)制、八進(jìn)制、十六進(jìn)制的整數(shù)值。按不同的進(jìn)制區(qū)分,整型常數(shù)有三種表示方法。 浮點(diǎn)型數(shù)據(jù)浮點(diǎn)型數(shù)據(jù)是用于表示包含小數(shù)點(diǎn)的數(shù)據(jù)類型。下

36、面分別介紹在C51語言中浮點(diǎn)型數(shù)據(jù)的說明、浮點(diǎn)型數(shù)據(jù)的定義以及浮點(diǎn)型常量的表示。1浮點(diǎn)型數(shù)據(jù)說明:C51中支持如下三種類型的浮點(diǎn)數(shù),即float類型、double類型和long double類型。只不過,在C51語言中不具體區(qū)分這三種類型,都被當(dāng)作float類型對待。因此,這三種浮點(diǎn)類型有相同的精度和取值范圍。浮點(diǎn)類型的變量字長為4個(gè)字節(jié)共32位二進(jìn)制數(shù),取值范圍為3.4x10-383.4x10+38。另外,在C51語言中,浮點(diǎn)型數(shù)據(jù)均為有符號浮點(diǎn)數(shù),而沒有無符號浮點(diǎn)數(shù)。2浮點(diǎn)型變量定義:浮點(diǎn)型變量的一般定義格式是“類型說明符 變量標(biāo)識符,變量標(biāo)識符”。同整型數(shù)據(jù)一樣,浮點(diǎn)型變量也可以同時(shí)定義

37、多個(gè)。3浮點(diǎn)型常量表示:浮點(diǎn)型常量通常稱為實(shí)型常量,其值可以表示為十進(jìn)制。浮點(diǎn)型常量的值由整數(shù)部分、尾數(shù)部分和指數(shù)部分組成。一般情況下,在不加說明的情況下,浮點(diǎn)型常量為正值。如果表示負(fù)值,需要在常量前使用負(fù)號。例如28.57、-57.63、-7.2e-16、8.265。 字符型數(shù)據(jù)字符型變量是用來存放字符的變量類型。字符型變量只能存放一個(gè)字符。在信息的傳遞中,字符、文字等是經(jīng)常用到的。下面介紹C51中的字符型數(shù)據(jù)的定義和使用等。1字符型變量定義:在C51語言中,可以定義兩種類型的字符型變量:有符號字符變量和無符號字符變量。字符型變量的定義格式示例如下:char a:/定義a為有符號字符變量un

38、signed char b;/定義b為無符號字符變量2字符常量表示:字符常量是指用一對單引號括起來的一個(gè)字符。其中單引號只起定界作用,并不表示字符本身,例如F,7,!等。在C51語言中,字符常量單引號中的字符不能是單引號()和反斜杠()。如果需要使用這兩個(gè)字符,則需要采用轉(zhuǎn)義字符來表示,這將在后面介紹。3轉(zhuǎn)義字符:轉(zhuǎn)義字符用于表示ASCII碼字符集中不可打印的控制字符和特定功能的字符。轉(zhuǎn)義字符是C51語言中表示字符的一種特殊形式。 指針型數(shù)據(jù)指針型數(shù)據(jù)是指向變量所存放地址的數(shù)據(jù)類型。指針型數(shù)據(jù)是一種特殊的數(shù)據(jù)類型,根據(jù)所指的變量類型不同,可以分為整型指針、浮點(diǎn)型指針、字符型指針、結(jié)構(gòu)型指針和聯(lián)

39、合指針。在C51語言中,指針型變量的定義格式如下:int *i;/定義整型指針變量float *f;/定義浮點(diǎn)型指針變量char *c;/定義字符型指針變量struct*stu;/定義結(jié)構(gòu)型指針變量union *uni;/定義聯(lián)合指針變量 無值型數(shù)據(jù) 無值型數(shù)據(jù)是一個(gè)特殊的類型,其字節(jié)長度為0。在C51語言中,無值型主要有兩個(gè)用途: 定義一個(gè)同一類型指針,該指針可根據(jù)需要?jiǎng)討B(tài)分配內(nèi)存。 在定義和使用函數(shù)時(shí),明確地表示這個(gè)函數(shù)不返回任何值。 無值型數(shù)據(jù)的聲明示例如下: void *buf;/buf被定義為無值型指針 C51的變量作用域 變量作用域是在程序中變量起作用的范圍。C51語言中,使用變量

40、前需要首先聲明該變量。由于C51程序中可以包含多個(gè)函數(shù)和程序文件,因此使用變量時(shí),需要注意變量有效作用范圍的問題,即變量的作用域。 基本規(guī)則在C51語言中規(guī)定,在塊結(jié)構(gòu)中進(jìn)行定義的變量,其有效使用范圍只在該塊結(jié)構(gòu)內(nèi)。其中,塊結(jié)構(gòu)是任何以花括號括起來的一段程序,通常稱為復(fù)合語句。在C51程序中,一些函數(shù)和語句是以一對花括號“”和“”來構(gòu)成的,這也是塊結(jié)構(gòu)的一種,示例如下:#include /頭文件void main() /主函數(shù)int i;/定義整型變量i=23;/變量賦值if(i%2=0) /判斷是否是偶數(shù),如果是執(zhí)行下面的語句int j;/定義整型變量j=2;/變量賦值printf(i=%d

41、,i);/輸出變量i,正確printf(j=%d,j);/輸出變量j,錯(cuò)誤 自動變量 自動變量是以關(guān)鍵字auto標(biāo)識的變量類型。其聲明格式為“auto 類型說明符 變量標(biāo)識符,變量標(biāo)識符”。自動型變量可以在如下兩種情況下使用。 在函數(shù)的內(nèi)部進(jìn)行定義,其作用域的范圍為該函數(shù)的內(nèi)部,在該函數(shù)之外變量無效。 在程序塊中聲明,其作用域的范圍為該程序塊。 在編譯C51程序時(shí),自動型變量根據(jù)變量類型動態(tài)分配存儲空間。動態(tài)分配的過程是,在程序執(zhí)行到該函數(shù)時(shí),為其自動分配存儲空間,當(dāng)該函數(shù)執(zhí)行完畢后,立即結(jié)束該變量的存儲空間,即該自動型變量消失。這便是為什么在函數(shù)內(nèi)部定義的變量,不能在函數(shù)外引用的原因。 外部

42、變量 外部變量一般定義在所有函數(shù)的外部,即整個(gè)程序文件的最前面,也稱為全局變量。外部變量的作用域是整個(gè)程序文件,其可以被該程序文件中的任何函數(shù)使用。 在編譯C51程序時(shí),外部變量根據(jù)變量類型被靜態(tài)地分配適當(dāng)?shù)拇鎯臻g。在整個(gè)程序運(yùn)行過程中,該變量一旦分配空間,便不會消失。這也是外部變量對整個(gè)程序文件有效的原因。 靜態(tài)變量靜態(tài)變量以關(guān)鍵字static聲明,聲明格式為“static 類型說明符 變量標(biāo)識符,變量標(biāo)識符”。在C51語言中,根據(jù)聲明的位置不同,靜態(tài)變量可以分為如下兩種:內(nèi)部靜態(tài)變量,在函數(shù)內(nèi)部定義;外部靜態(tài)變量,在函數(shù)外部定義。在編譯C51程序時(shí),根據(jù)數(shù)據(jù)類型靜態(tài)地給靜態(tài)變量分配合適的

43、存儲空間,并在程序運(yùn)行過程中始終占有該存儲空間。另外,C51語言允許將函數(shù)定義為靜態(tài)型的。這樣,只有同一文件中的其他函數(shù)才能調(diào)用這個(gè)靜態(tài)型函數(shù),同一工程項(xiàng)目中的其他文件不能調(diào)用訪問,這樣,可以既有利于程序的模塊化設(shè)計(jì),又可以防止和其他文件中的函數(shù)有重名的情況。 寄存器變量 寄存器變量以關(guān)鍵字register聲明,聲明格式為“register 類型說明符 變量標(biāo)識符,變量標(biāo)識符”。示例如下: register char ch; register double db; 寄存器變量常用于某一變量名頻繁使用的情況,這樣做可以提高系統(tǒng)的運(yùn)算速度。因?yàn)槠胀ǖ淖兞恳话愦鎯υ趦?nèi)存中,而寄存器變量被存儲在CPU

44、的寄存器中。 在C51語言中,只允許同時(shí)定義兩個(gè)寄存器變量,如果多于兩個(gè),程序在編譯時(shí)會自動地將兩個(gè)之外的寄存器變量當(dāng)作非寄存器變量來處理。 分隔符與const修飾符 分隔符和修飾符是計(jì)算機(jī)語言中最重要的組成部分,這里介紹C51語言中的分隔符和const修飾符。 C51分隔符分隔符在C51程序語言中起輔助標(biāo)識和分界的作用。一般分為兩種,簡單分隔符和復(fù)合分隔符。簡單分隔符是除字母、數(shù)字、下劃線以外的單個(gè)ASCII字符,如:+、-、*、/、!、|、=、.、,、:、;、#等。復(fù)合分隔符是特定字符的某種組合,例如=、(、)等。分隔符常用于數(shù)組、語句等情況,下面舉出常用的分隔符示例。用“;”進(jìn)行隔離語句

45、,例如int r;用“ ”對數(shù)組說明,例如char ch =Hello Word??;用“( )”進(jìn)行隔離,例如s=area(r);用“,”進(jìn)行隔離,例如char ch1,ch2,ch3;用“”進(jìn)行隔離復(fù)合語句,例如for i=0;i100;i+;用“*”做指針,例如char *ponter;用“#”做預(yù)處理偽指令,例如#define PI 3.1415926;用“”標(biāo)識特殊寄存器的位,例如sbit P00=P00。 const修飾符 const修飾符主要用來定義常量或變量。其定義格式為“const =;”。示例如下: const double PI=3.1415926; 在C51語言中,用關(guān)鍵

46、字const修飾的是一類特殊的常量,一般稱為符號常量或const變量。從編譯的角度看,程序在編譯時(shí),將視const變量為一個(gè)常量,系統(tǒng)不為其分配內(nèi)存。在程序中遇到該const變量時(shí),將用定義時(shí)的初值來代替。 這里需要注意的是,使用const修飾的變量不能在程序中修改其值,這樣一方面可以防止程序運(yùn)行時(shí)該值被意外修改,另一方面也可以對于程序中經(jīng)常使用的值做統(tǒng)一修改,便于調(diào)試程序。 運(yùn)算符 運(yùn)算符是一個(gè)表示特定的算術(shù)或邏輯操作的符號,也稱為操作符。例如“+”號,表示了一個(gè)相加運(yùn)算;“&”號表示了一個(gè)邏輯與的運(yùn)算。在C51語言中,由運(yùn)算符把需要進(jìn)行運(yùn)算的各個(gè)量(常量或變量)連接起來組成一個(gè)表達(dá)

47、式。 C51語言中的運(yùn)算符很豐富,主要有三大類運(yùn)算符:算術(shù)運(yùn)算符、關(guān)系與邏輯運(yùn)算符、位操作運(yùn)算符。另外,還有一些用于完成復(fù)雜功能的特殊運(yùn)算符。 算術(shù)運(yùn)算符 算術(shù)運(yùn)算符是用來進(jìn)行算術(shù)運(yùn)算的操作符。C51語言中允許的算術(shù)運(yùn)算符,如表所示。C51語言中的運(yùn)算符“+”、“”、“*”和“/”的用法與大多數(shù)計(jì)算機(jī)語言相同,幾乎可用于所有C51語言內(nèi)定義的數(shù)據(jù)類型。 邏輯運(yùn)算符和關(guān)系運(yùn)算符 邏輯運(yùn)算符中的“邏輯”描述了操作數(shù)的邏輯關(guān)系,而關(guān)系運(yùn)算符中的“關(guān)系”描述了一個(gè)操作數(shù)與另一個(gè)操作數(shù)之間的比較關(guān)系。關(guān)系運(yùn)算符和邏輯運(yùn)算符通常在一起使用,所以這里將它們放在一起進(jìn)行講解。 位運(yùn)算符位運(yùn)算是對字節(jié)或字中的二

48、進(jìn)制位(bit)進(jìn)行測試、置位、移位或邏輯處理的運(yùn)算符。這里字節(jié)或字是針對C標(biāo)準(zhǔn)中的char和int數(shù)據(jù)類型而言的,位操作不能用于float、double、long double、void或其他復(fù)雜類型。支持全部的位運(yùn)算符(Bitwise Operators)是C51語言與其他高級語言最大的不同,即具有匯編語言所具有的運(yùn)算能力。因此C51既具有高級語言的特點(diǎn),也具有低級語言的功能。C51語言中的位運(yùn)算符,如表所示。位運(yùn)算中的AND、OR和NOT(1的補(bǔ)碼)的真值表與邏輯運(yùn)算等價(jià),唯一不同的是位操作是逐位進(jìn)行運(yùn)算的。下面分別介紹各個(gè)位運(yùn)算符的用法。 特殊運(yùn)算符除了前面幾節(jié)介紹的幾種運(yùn)算符外,在C51語言中還有一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論