第4章89C51匯編語(yǔ)言程序的設(shè)計(jì)與調(diào)試_第1頁(yè)
第4章89C51匯編語(yǔ)言程序的設(shè)計(jì)與調(diào)試_第2頁(yè)
第4章89C51匯編語(yǔ)言程序的設(shè)計(jì)與調(diào)試_第3頁(yè)
第4章89C51匯編語(yǔ)言程序的設(shè)計(jì)與調(diào)試_第4頁(yè)
第4章89C51匯編語(yǔ)言程序的設(shè)計(jì)與調(diào)試_第5頁(yè)
已閱讀5頁(yè),還剩77頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章匯編程序的設(shè)計(jì)與調(diào)試一、匯編語(yǔ)言程序設(shè)計(jì)概述二、實(shí)用程序設(shè)計(jì)三、C51介紹程序設(shè)計(jì)語(yǔ)言1.機(jī)器語(yǔ)言(MachineLanguage)這是一種用二進(jìn)制代碼“0”和“1”表示指令和數(shù)據(jù)的程序設(shè)計(jì)語(yǔ)言。計(jì)算機(jī)只能識(shí)別二進(jìn)制代碼,這種語(yǔ)言是能被計(jì)算機(jī)直接識(shí)別和執(zhí)行的機(jī)器級(jí)語(yǔ)言。特點(diǎn):機(jī)器語(yǔ)言能夠被計(jì)算機(jī)立即識(shí)別并加以執(zhí)行,具有執(zhí)行速度快、占用內(nèi)存少等優(yōu)點(diǎn)。但對(duì)于使用者來(lái)說(shuō),用機(jī)器語(yǔ)言編寫程序具有編寫難、識(shí)別難、記憶難、查錯(cuò)難、交流難等缺點(diǎn)。2.匯編語(yǔ)言(AssemblyLanguage)匯編語(yǔ)言是一種用助記符來(lái)表示的面向機(jī)器的程序設(shè)計(jì)語(yǔ)言。不同的機(jī)器所使用的匯編語(yǔ)言一般是不同的。但計(jì)算機(jī)的CPU不能直接識(shí)別匯編語(yǔ)言,所以計(jì)算機(jī)不能立即執(zhí)行匯編語(yǔ)言程序。用匯編語(yǔ)言編寫的源程序,在由計(jì)算機(jī)執(zhí)行之前,必須將它翻譯成機(jī)器語(yǔ)言程序。特點(diǎn):這種語(yǔ)言彌補(bǔ)了機(jī)器語(yǔ)言的不足,用匯編語(yǔ)言編寫程序比用機(jī)器語(yǔ)言方便、直觀、易懂、易用、易記。可以編寫出結(jié)構(gòu)緊湊、運(yùn)行時(shí)間精確的程序。所以,這種語(yǔ)言非常適合于實(shí)時(shí)控制的需要。3.高級(jí)語(yǔ)言(High-LevelLanguage)高級(jí)語(yǔ)言是面向過(guò)程并能獨(dú)立于計(jì)算機(jī)硬件結(jié)構(gòu)的通用程序設(shè)計(jì)語(yǔ)言,是一種接近人類語(yǔ)言和數(shù)學(xué)表達(dá)式的計(jì)算機(jī)語(yǔ)言。比如:BASIC、FORTRAN、COBOL、PASCAL、C語(yǔ)言等。高級(jí)語(yǔ)言不能被計(jì)算機(jī)直接識(shí)別和執(zhí)行,需要用編譯程序或解釋程序?qū)⒏呒?jí)語(yǔ)言編寫的源程序翻譯為機(jī)器語(yǔ)言。特點(diǎn):它比匯編語(yǔ)言易學(xué)、易懂,具有通用性強(qiáng)、易于移植等優(yōu)點(diǎn)。高級(jí)語(yǔ)言的語(yǔ)句功能強(qiáng),它的一條語(yǔ)句往往相當(dāng)于許多條指令,因而用于翻譯的程序要占用較多的存儲(chǔ)空間,而且執(zhí)行時(shí)間長(zhǎng),且不易精確掌握,故在高速實(shí)時(shí)控制中一般是不適用的。

基本概念在目前單片機(jī)的開(kāi)發(fā)應(yīng)用中,經(jīng)常采用C51語(yǔ)言和匯編語(yǔ)言共同編寫程序。要想很好地掌握和應(yīng)用單片機(jī)首先要掌握匯編語(yǔ)言。

匯編語(yǔ)言是面向機(jī)器的程序設(shè)計(jì)語(yǔ)言,對(duì)于CPU不同的單片機(jī),其匯編語(yǔ)言一般是不同的。用匯編語(yǔ)言編寫的程序稱為匯編語(yǔ)言源程序。匯編語(yǔ)言源程序是由匯編語(yǔ)言語(yǔ)句構(gòu)成的。匯編語(yǔ)言語(yǔ)句可分為兩大類:指令性語(yǔ)句和指示性語(yǔ)句。指令性語(yǔ)句是由指令組成的由CPU執(zhí)行的語(yǔ)句,指示性語(yǔ)句是由偽指令組成的,它不被CPU執(zhí)行,用來(lái)告訴匯編程序如何對(duì)程序進(jìn)行匯編的指令;由于它不能生成機(jī)器語(yǔ)言,故又被稱為偽指令語(yǔ)句。一、匯編語(yǔ)言程序設(shè)計(jì)概述1.指令性語(yǔ)句格式

[標(biāo)號(hào):]操作碼助記符[目的操作數(shù)][,源操作數(shù)][;注釋]

每條匯編語(yǔ)句一般由若干部分組成,每一部分稱為一個(gè)字段。每個(gè)字段之間應(yīng)該嚴(yán)格地用分界符加以分隔。分界符包括冒號(hào)、空格符、逗號(hào)、分號(hào)等。標(biāo)號(hào)段與操作碼之間要加冒號(hào)“:”;操作碼與操作數(shù)之間要用空格相隔;各操作數(shù)之間要用逗號(hào)“,”相隔;操作數(shù)與注釋段之間要加分號(hào)“;”相隔。標(biāo)號(hào)是語(yǔ)句所在地址的標(biāo)志符號(hào)

(1)標(biāo)號(hào)后邊必須跟以冒號(hào)“:”(2)由1-8個(gè)ASCII字符組成(3)同一標(biāo)號(hào)在一個(gè)程序中只能定義一次(4)不能使用匯編語(yǔ)言已經(jīng)定義的符號(hào)作為標(biāo)號(hào)必須以分號(hào)“;”開(kāi)頭,換行書寫,但必須注意也要以分號(hào)“;”開(kāi)頭。匯編時(shí),注釋字段不會(huì)產(chǎn)生機(jī)器代碼。操作字段:(1)十六進(jìn)制,后綴“H”例:MOVA,#23H二進(jìn)制,后綴“B”例:MOVA,#01010101B十進(jìn)制,后綴“D”,也可省略。(2)若十六進(jìn)制的操作數(shù)以字符A-F中的某個(gè)開(kāi)頭時(shí),則需在它前面加一個(gè)“0”,以便在匯編時(shí)把它和字符A-F區(qū)別開(kāi)來(lái)。例:MOVA,#0FCH(3)采用工作寄存器和特殊功能寄存器的代號(hào)來(lái)表示,也可用其地址來(lái)表示。例:程序狀態(tài)子可用PSW表示,也可用D0H來(lái)表示(4)美元符號(hào)$的使用用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下指令:HERE:SJMPHERE可寫為:

SJMP$2.偽指令的指示性語(yǔ)句格式

[標(biāo)號(hào):]偽操作操作數(shù)[,操作數(shù),......][;注釋]

偽指令不是真正的指令,是在匯編時(shí)供匯編程序識(shí)別的指令,又稱為匯編指令。它不屬于指令系統(tǒng),也無(wú)對(duì)應(yīng)的機(jī)器碼,只是用來(lái)對(duì)匯編過(guò)程進(jìn)行某種控制。利用偽指令告訴匯編程序如何進(jìn)行匯編,為編程提供方便。

常用偽指令定位偽指令ORG定義字節(jié)數(shù)據(jù)偽指令DB定義字?jǐn)?shù)據(jù)偽指令DW定義空間偽指令DS符號(hào)定義偽指令EQU或=定義標(biāo)號(hào)偽指令DL數(shù)據(jù)賦值偽指令DATA數(shù)據(jù)地址賦值偽指令XDATA匯編結(jié)束偽指令END①ORG(Origin)匯編起始指令ORG是程序匯編起始地址定位偽指令,功能:是規(guī)定對(duì)匯編語(yǔ)言源程序進(jìn)行匯編時(shí),目的程序在程序存儲(chǔ)器中存放的起始地址。格式:[標(biāo)號(hào):]ORG16位地址或標(biāo)號(hào)注意:在一個(gè)源程序中,可多次使用ORG指令,以規(guī)定不同程序段的起始位置,地址應(yīng)從小到大順序排列,不允許重疊。

例如:

ORG 0000H START:SJMP MAIN … ORG 0030H MAIN:MOVSP,#30H…②END(End)匯編結(jié)束指令END是匯編語(yǔ)言程序結(jié)束偽指令。功能:是表示程序已結(jié)束,匯編程序?qū)ND后面的指令不再匯編。格式:[標(biāo)號(hào):]END注意:在一個(gè)源程序中,只能有一條END指令,而且必須放在整個(gè)程序的末尾。③EQU(Equate)賦值指令

EQU是賦值(也稱等值)偽指令。功能:把操作數(shù)段中的數(shù)據(jù)或地址賦值給標(biāo)號(hào)字段中的字符名稱。格式:字符名稱EQU數(shù)值或匯編符號(hào)

注意:字符名稱必須先賦值后使用,故EQU指令通常放在源程序的開(kāi)頭。EQU可定義8位或16位的數(shù)據(jù)或地址,

例如:ORG 8500H

AA EQU R1A10 EQU 10HDELAYEQU 87E6HMOV R0,A10 ;R0←(10H)MOV A,AA ;A←(R1)LCALL DELAY ;調(diào)用起始地址為87E6H的子程序END

④DATA(Data)數(shù)據(jù)地址賦值指令

DATA是數(shù)據(jù)地址賦值偽指令。功能:把操作數(shù)段中的表達(dá)式的值賦給標(biāo)號(hào)字段中的字符名稱。

格式:字符名稱DATA表達(dá)式

注意:DATA指令功能與EQU指令類似,它們的主要區(qū)別如下:DATA定義的字符名稱可以先使用后定義,DATA指令可以放在源程序的任何位置,使用靈活。DATA只能用來(lái)定義8位的數(shù)據(jù)或地址。EQU可以把匯編符號(hào)賦給字符名稱,而DATA只能把數(shù)據(jù)賦給字符名稱。DATA可以把表達(dá)式的值賦給字符名稱,這個(gè)表達(dá)式是可以進(jìn)行求值運(yùn)算例:A1DATA345HA1DATAA1+1

⑤XDATA數(shù)據(jù)地址賦值指令

XDATA是數(shù)據(jù)地址賦值偽指令。功能:把操作數(shù)段中的表達(dá)式的值賦給標(biāo)號(hào)字段中的字符名稱。格式:字符名稱XDATA表達(dá)式

注意:XDATA指令功能與DATA指令類似,它們的主要區(qū)別是XDATA可定義16位的數(shù)據(jù)或地址。

⑥BIT(Bit)位地址賦值指令

BIT是位地址賦值偽指令。功能:把位地址賦給字符名稱。格式:字符名稱BIT位地址例如:

AB BIT 30H ;AB與30H等值

AC BIT P1.0;AC與P1.0等值

MOV C,AB;把位地址區(qū)30H單元中的數(shù)據(jù)送入位累加器C中

CLR AC;把P1.0中的內(nèi)容清零

⑦DB(DefineByte)定義字節(jié)指令

DB是定義字節(jié)偽指令。功能:從程序存儲(chǔ)器指定地址單元開(kāi)始存放若干個(gè)字節(jié)的數(shù)值或ASCII碼字符。格式:[標(biāo)號(hào):]DB字節(jié)數(shù)據(jù)或ASCII碼字符

注意:多個(gè)字節(jié)數(shù)據(jù)或ASCII碼字符之間要用逗號(hào)相隔,DB指令常用于定義8位的數(shù)據(jù)常數(shù)表。

例如:ORG7F00HTAB:DB 01110010B,16H,45,‘8’,‘A’匯編后存貯單元內(nèi)容為:(7F00H)=72H、(7F01H)=16H、(7F02H)=2DH(7F03H)=38H、(7F04H)=41H⑧DW(DefineWord)定義字指令

DW是定義字偽指令。功能:從程序存儲(chǔ)器指定地址單元開(kāi)始存放若干個(gè)字的數(shù)值。格式:[標(biāo)號(hào):]DW字節(jié)數(shù)據(jù)或ASCII碼字符

注意:多個(gè)字?jǐn)?shù)據(jù)之間要用逗號(hào)相隔,DW指令常用于定義16位的地址表。

例如:ORG 6000HTAB:DW 1254H,32H,161匯編后存貯單元內(nèi)容為:(6000H)=12H(6001H)=54H

(6002H)=00H(6003H)=32H (6004H)=00H(6005H)=0A1H⑨DS(DefineSpace)定義存儲(chǔ)空間指令

DS是定義存儲(chǔ)空間偽指令。功能:從程序存儲(chǔ)器指定地址單元開(kāi)始保留表達(dá)式的值所規(guī)定的存儲(chǔ)單元。格式:[標(biāo)號(hào):]DS表達(dá)式

例如:

ORG1000HTAB:DS06H DB25H,35H在上述源程序中,程序存儲(chǔ)器從1000H單元開(kāi)始保留6個(gè)單元,1006H單元存放25H,1007H單元存放35H。注:對(duì)8051單片機(jī),DB、DW、DS等偽指令只能用于程序存儲(chǔ)器,而不能對(duì)數(shù)據(jù)存儲(chǔ)器使用。3.匯編語(yǔ)言源程序的匯編

匯編語(yǔ)言源程序必須要轉(zhuǎn)換為機(jī)器碼(即目的程序),計(jì)算機(jī)才能執(zhí)行,這個(gè)轉(zhuǎn)換過(guò)程稱為匯編。匯編語(yǔ)言源程序的匯編可分為手工匯編和機(jī)器匯編兩類。手工匯編是指用人腦通過(guò)查指令編碼表(見(jiàn)附錄中的指令表)把匯編語(yǔ)言源程序翻譯成機(jī)器碼的過(guò)程,又稱為人工代真。機(jī)器匯編是用機(jī)器代替人腦并由專門的程序來(lái)進(jìn)行的,這種程序稱為匯編程序(不同的指令系統(tǒng)匯編程序不同)。機(jī)器匯編由計(jì)算機(jī)自動(dòng)完成,匯編程序把用匯編語(yǔ)言編寫的源程序翻譯成由機(jī)器語(yǔ)言表示的目的程序。用編輯軟件進(jìn)行源程序的編輯。編輯完成后,生成一個(gè)ASCII碼文件,擴(kuò)展名為“.ASM”。反匯編是在分析程序存儲(chǔ)器已有的程序時(shí),將機(jī)器語(yǔ)言翻譯成匯編語(yǔ)言的轉(zhuǎn)換過(guò)程。

無(wú)論是高級(jí)語(yǔ)言還是匯編語(yǔ)言寫的源程序都必須轉(zhuǎn)換成目標(biāo)程序,單片機(jī)才能執(zhí)行。目前很多公司都將編輯器、匯編器、編譯器、連接/定位器、符號(hào)轉(zhuǎn)換程序做成了軟件包,稱為集成開(kāi)發(fā)環(huán)境,如Keil

uVision、SiliconLaboratoriesIDE等。二、實(shí)用程序設(shè)計(jì)程序設(shè)計(jì)方法和技巧源程序的基本格式匯編語(yǔ)言程序設(shè)計(jì)舉例程序設(shè)計(jì)方法和技巧

1.程序設(shè)計(jì)的一般步驟(1)分析工作任務(wù),明確要達(dá)到的工作目的、技術(shù)指標(biāo)等。(2)確定解決問(wèn)題的算法。算法就是如何將實(shí)際問(wèn)題轉(zhuǎn)化成程序模塊來(lái)處理,要對(duì)不同的算法進(jìn)行分析、比較,找出最適宜的算法。(3)畫程序流程圖。其圖形的符號(hào)規(guī)定均與高級(jí)語(yǔ)言流程圖相同,如桶形框表示程序的開(kāi)始或結(jié)束,矩形框表示需要進(jìn)行的工作,菱形框表示需要判斷的事情,指向線表示程序的流向等。(4)分配內(nèi)存工作單元,確定程序與數(shù)據(jù)的存放地址。(5)編寫源程序。(6)上機(jī)調(diào)試、修改源程序。2.程序設(shè)計(jì)的一般原則按照盡可能使程序簡(jiǎn)短和縮短運(yùn)行時(shí)間兩個(gè)原則編寫程序。應(yīng)用程序一般都由一個(gè)主程序(包括若干個(gè)功能模塊)和多個(gè)子程序構(gòu)成,即采用模塊化的程序設(shè)計(jì)方法。每一功能模塊或子程序都能完成一個(gè)明確的任務(wù),實(shí)現(xiàn)某個(gè)具體功能,如檢測(cè)輸入信號(hào)、碼制轉(zhuǎn)換、輸出控制信號(hào)、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、延時(shí)、顯示、打印等。

3.模塊化程序設(shè)計(jì)方法的特點(diǎn)單個(gè)模塊結(jié)構(gòu)的程序功能單一,易于編寫、調(diào)試和修改。對(duì)程序的局部修改,可以使無(wú)關(guān)的部分保持不變。程序可讀性好,便于功能擴(kuò)展和版本升級(jí)。對(duì)于使用頻繁的子程序可以建立子程序庫(kù),便于多個(gè)模塊調(diào)用。可實(shí)現(xiàn)多人同時(shí)進(jìn)行程序的編寫和調(diào)試工作,縮短程序編寫時(shí)間。4.劃分模塊應(yīng)遵循的原則高內(nèi)聚性。每個(gè)模塊應(yīng)具有獨(dú)立的功能,能產(chǎn)生一個(gè)明確的結(jié)果。低耦合性。模塊之間的控制耦合應(yīng)盡量簡(jiǎn)單,數(shù)據(jù)耦合應(yīng)盡量少??刂岂詈鲜侵改K進(jìn)入和退出的條件及方式,數(shù)據(jù)耦合是指模塊間的信息交換(傳遞)方式、交換量的多少及交換的頻繁程度。模塊長(zhǎng)度適中。模塊語(yǔ)句的長(zhǎng)度為20~100條的范圍較合適。模塊太長(zhǎng)時(shí),分析和調(diào)試比較困難,失去了模塊化程序結(jié)構(gòu)的優(yōu)越性;過(guò)短則模塊的連接太復(fù)雜,信息交換太頻繁。

源程序的基本格式 ORG0000H LJMPSTART;轉(zhuǎn)向主程序 ORG0003H LJMPINTIE0;轉(zhuǎn)向外部中斷服務(wù)程序 …… ORG0050HSTART:MOVA,#00H …… ORG4500HINTIE0:… ……DBLO:DB43H,64H,…;表格參量END;結(jié)束分支結(jié)構(gòu)程序循環(huán)結(jié)構(gòu)程序簡(jiǎn)單結(jié)構(gòu)程序查表程序子程序匯編語(yǔ)言程序設(shè)計(jì)舉例關(guān)鍵字查找程序設(shè)計(jì)數(shù)據(jù)極值查找程序設(shè)計(jì)數(shù)據(jù)排序程序設(shè)計(jì)子程序設(shè)計(jì)主要內(nèi)容:

1.主程序與子程序的關(guān)系2.子程序嵌套3.子程序的參數(shù)傳遞子程序是指完成某一專門任務(wù)并能被其他程序反復(fù)調(diào)用的程序段。調(diào)用子程序的程序稱為主程序或調(diào)用程序。使用子程序的過(guò)程稱為調(diào)用子程序。子程序執(zhí)行完后返回主程序的過(guò)程稱為子程序返回。主程序和子程序是相對(duì)的,同一程序既可以作為另一程序的子程序,也可以有自己的子程序。也就是說(shuō),子程序是允許嵌套的,嵌套深度和堆棧區(qū)的大小有關(guān)。采用子程序能使整個(gè)程序結(jié)構(gòu)簡(jiǎn)單,縮短程序設(shè)計(jì)時(shí)間,減少對(duì)存儲(chǔ)空間的占用。

主程序與子程序的關(guān)系子程序SUB主程序MAIN返回LCALLSUB調(diào)用子程序子程序入口地址RETMAIN: ┇ ;MAIN為主程序或調(diào)用程序標(biāo)號(hào) ┇

LCALLSUB ;調(diào)用子程序SUB ┇ ┇SUB: PUSHPSW ;現(xiàn)場(chǎng)保護(hù)PUSHACC ;

子程序處理程序段POPACC ;現(xiàn)場(chǎng)恢復(fù) POPPSW ;

RET ;最后一條指令必須為RET典型的子程序的基本結(jié)構(gòu)注意:子程序的第一條指令的地址稱為子程序的入口地址,該指令前應(yīng)有標(biāo)號(hào)。在子程序末尾用RET返回指令從子程序返回主程序。根據(jù)需要保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。在子程序的開(kāi)始,使用壓棧指令把需要保護(hù)的內(nèi)容壓入堆棧;在返回主程序前,使用彈出指令把堆棧中保護(hù)的內(nèi)容送回原來(lái)的存儲(chǔ)單元中。子程序中有可能要使用累加器A或工作寄存器,在子程序使用它們之前,把它們中可能存有的主程序的中間結(jié)果保存起來(lái),這一過(guò)程稱為保護(hù)現(xiàn)場(chǎng)。在子程序執(zhí)行完并將返回主程序之前,再將這些中間結(jié)果取出,送回到累加器A或原來(lái)的工作寄存器中,這一過(guò)程稱為恢復(fù)現(xiàn)場(chǎng)。子程序中應(yīng)盡量使用相對(duì)轉(zhuǎn)移指令而不使用其他轉(zhuǎn)移指令,以便子程序放在內(nèi)存的任何區(qū)域都能被主程序調(diào)用。要正確地設(shè)置堆棧指針,以避免堆棧區(qū)與工作寄存器或其他存儲(chǔ)單元發(fā)生沖突。

ORG 0000HMAIN: MOV A,#0FEH ;送顯示初值LP: MOV R0,#10 ;送閃爍次數(shù)LP0: MOV P1,A ;點(diǎn)亮LED

LCALL DELAY ;延時(shí) MOV P1,#0FFH;熄滅燈

LCALL DELAY ;延時(shí) DJNZ R0,LP0 RL A SJMP LPEND

實(shí)例:P1口連接的8個(gè)LED依次循環(huán)閃爍10次延時(shí)次數(shù)-1=0點(diǎn)亮相應(yīng)的LEDYN熄滅相應(yīng)的LED延時(shí)初值左移1位指向下一個(gè)LED設(shè)閃爍次數(shù)送顯示初值開(kāi)始子程序嵌套子程序嵌套(或稱多重轉(zhuǎn)子)是指在子程序執(zhí)行過(guò)程中,還可以調(diào)用另一個(gè)子程序。問(wèn)題:子程序調(diào)用、返回到主程序中的正確位置,并接著執(zhí)行主程序中的后續(xù)指令呢?為了解決這個(gè)問(wèn)題,我們采用了堆棧技術(shù)。子程序嵌套

子程序SUB1

主程序MAINRET

子程序SUB2RET20102013211021132100220020132013PC21131321堆棧指針SP堆棧LCALLSUB1LCALLSUB221132013子程序嵌套范例:LED燈閃爍(二)

ORG 0000HMAIN:MOV A,#0FEH ;送顯示初值COUN:ACALLFLASH ;調(diào)閃爍子程序 RL A ;A左移,下一個(gè)燈閃爍 SJMPCOUN ;循環(huán)不止

FLASH:MOV R0,#10 ;送閃爍次數(shù)FLASH1:MOV P1,A ;點(diǎn)亮LED

LCALLDELAY ;延時(shí) MOV P1,#0FFH ;熄滅燈

LCALLDELAY ;延時(shí) DJNZR0,FLASH1 ;閃爍次數(shù)不夠10次,繼續(xù) RET

DELAY:MOVR3,#0FFH ;延時(shí)子程序DEL2:MOVR4,#0FFHDEL1:NOP DJNZR4,DEL1 DJNZR3,DEL2 RET END子程序的參數(shù)傳遞范例:計(jì)算平方和c=a2+b2

,a存放在31H,b存放在32H,結(jié)果c存放在33HORG 0000H ;主程序MOV SP,#3FH;設(shè)置棧底MOV A,31H ;取數(shù)a存放到累加器A中作為入口參數(shù)LCALLSQR;計(jì)算a2MOV R1,A ;出口參數(shù)——平方值存放在A中MOV A,32H ;取數(shù)b存放到累加器A中作為出口參數(shù)LCALLSQR;計(jì)算b2ADD A,R1 ;求和MOV 33H,A ;存放結(jié)果SJMP $

;子程序:SQR;功能:通過(guò)查表求出平方值y=x2;入口參數(shù):x存放在累加器A中;出口參數(shù):求得的平方值y存放在A中;占用資源:累加器A,數(shù)據(jù)指針DPTRSQR:PUSHDPH ;保護(hù)現(xiàn)場(chǎng),將主程序中DPTR的高八位放入堆棧PUSHDPL ;保護(hù)現(xiàn)場(chǎng),將主程序中DPTR的低八位放入堆棧MOVDPTR,#TABLE;在子程序中重新使用DPTR,表首地址→DPTRMOVCA,@A+DPTR;查表POPDPL ;恢復(fù)現(xiàn)場(chǎng),將主程序中DPTR的低八位從堆棧中彈出POPDPH ;恢復(fù)現(xiàn)場(chǎng),將主程序中DPTR的高八位從堆棧中彈出RETTABLE:DB0,1,4,9,16,25,36,49,64,81傳送子程序參數(shù)的方法利用寄存器或片內(nèi)RAM傳送參數(shù)。可以把入口參數(shù)存放到寄存器或片內(nèi)RAM中傳送給子程序,也可以把出口參數(shù)存放到寄存器或片內(nèi)RAM中傳送給主程序。利用寄存器傳送參數(shù)的地址。把存放入口參數(shù)的地址通過(guò)寄存器傳送給子程序,子程序根據(jù)寄存器中存放入口參數(shù)的地址便可找到入口參數(shù)并對(duì)它們進(jìn)行相應(yīng)操作;出口參數(shù)的地址也可通過(guò)寄存器傳送給主程序。利用堆棧傳送參數(shù)。可以用壓棧指令PUSH把入口參數(shù)壓入堆棧傳送給子程序,也可以使用壓棧指令PUSH把出口參數(shù)壓入堆棧傳送給主程序。

子程序設(shè)計(jì)注意事項(xiàng)

(1)要給每個(gè)子程序起一個(gè)名字,也就是入口地址的代號(hào)。(2)要能正確地傳遞參數(shù)。即首先要有入口條件,說(shuō)明進(jìn)入子程序時(shí),它所要處理的數(shù)據(jù)放在何處(如:是放在A中還是放在某個(gè)工作寄存器中等)。另外,要有出口條件,即處理的結(jié)果存放在何處。(3)注意保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。在子程序使用累加器、工作寄存器等資源時(shí),要先將其原來(lái)的內(nèi)容保存起來(lái),即保護(hù)現(xiàn)場(chǎng)。當(dāng)子程序執(zhí)行完畢,在返回主程序之前,要將這些內(nèi)容再取出,送還到累加器、工作寄存器等原單元中,這一過(guò)程稱為恢復(fù)現(xiàn)場(chǎng)。在單片機(jī)的實(shí)際應(yīng)用中,經(jīng)常要對(duì)一些數(shù)據(jù)進(jìn)行函數(shù)運(yùn)算,例如求平方、正弦函數(shù)等,為了提高單片機(jī)執(zhí)行程序的速度,一般將某函數(shù)的全部函數(shù)值按一定的規(guī)律編成表格存放到程序存儲(chǔ)器中。查表程序就是根據(jù)某數(shù)據(jù)的函數(shù)運(yùn)算要求,按索引號(hào)從程序存儲(chǔ)器中查找與之相對(duì)應(yīng)的函數(shù)值的程序結(jié)構(gòu)。設(shè)計(jì)查表程序時(shí),主要通過(guò)兩條查表指令實(shí)現(xiàn)查表功能。

MOVCA,@A+DPTRMOVCA,@A+PC查表程序例用查表法計(jì)算平方(1)

ORG0000HMOV DPTR,#TABLE;表首地址送DPTRMOVA,#05 ;被查數(shù)字05AMOVCA,@A+DPTR ;查表求平方SJMP$TABLE:DB0,1,4,9,16,25,36,49,64,81END

例用查表法計(jì)算平方(2)

ORG 0000HMOVA,#05 ;05AADD A,#02 ;修正累加器AMOVCA,@A+PC ;查表求平方SJMP$DB0,1,4,9,16,25,36,49,64,81END74H05H24H02H83H80HFEH00H01H04H09H10H19H24H31H40H51H00H0000H0001H0002H0003H0004H0005H0006H0007H0008H0009H000AH000BH000CH000DH000EH000FH0010H0011H例:設(shè)有一巡回檢測(cè)報(bào)警裝置,需對(duì)16路輸入量進(jìn)行測(cè)量控制,每路有一個(gè)最大允許值??刂茣r(shí)根據(jù)測(cè)量的路數(shù),找出該路的最大允許值。測(cè)量的路數(shù)保存在R2中,最大值結(jié)果保存在R3R4中。解:利用查表程序完成。LTB: MOV A,R2 ADD A,R2 MOV R3,A ADD A,#6 MOVC A,@A+PC XCH A,R3 ADD A,#3 MOVC A,@A+PC MOV R4,A RETMAX: DW 1520,3721,445,7850 DW 3483,32657,883,9943 DW 1101,40511,6756,331 DW 4468,5871,13224,9981解:利用查表程序完成。LTB: MOV A,R2 ADD A,R2 MOV R3,A MOV DPTR,#MAX MOVC A,@A+DPTR XCH A,R3 INC A MOVC A,@A+DPTR MOV R4,A RETMAX: DW 1520,3721,445,7850 DW 3483,32657,883,9943 DW 1101,40511,6756,331 DW 4468,5871,13224,9981數(shù)據(jù)極值查找程序設(shè)計(jì)在指定的數(shù)據(jù)區(qū)中找出最大值(或最小值)。進(jìn)行數(shù)值大小的比較,從這批數(shù)據(jù)中找出最大值(或最小值)并存于某一單元中。例

片內(nèi)RAM中存放一批數(shù)據(jù),查找出最大值并存放于首地址中。設(shè)R0中存首地址,R2中存放字節(jié)數(shù)。 MOVR2,n ;n為要比較的數(shù)據(jù)字節(jié)數(shù) MOVA,R0 ;存首地址指針 MOVR1,A DECR2 MOVA,@R1 LOOP: MOVR3,A DECR1 CLRC SUBBA,@R1 ;兩個(gè)數(shù)比較 JNCLOOP1 ;C=0,A中的數(shù)大,跳LOOP1 MOVA,@R1 ;C=1,則大數(shù)送A SJMPLOOP2 LOOP1: MOVA,R3 LOOP2: DJNZR2,LOOP ;是否比較結(jié)束? MOV@R0,A ;存最大數(shù)

RET例

片內(nèi)RAM中存放一批數(shù)據(jù),查找出最大值并存放于首地址中。設(shè)R0中存首地址,R2中存放字節(jié)數(shù)。分支程序是根據(jù)程序的要求改變程序的執(zhí)行順序,并根據(jù)條件對(duì)程序的流向進(jìn)行判斷的程序結(jié)構(gòu)。程序中有轉(zhuǎn)移指令包括無(wú)條件轉(zhuǎn)移(AJMP、SJMP、LJMP)、條件轉(zhuǎn)移(JZ、JC、JB等)和散轉(zhuǎn)指令(JMP@A+DPTR)分支程序一般有兩個(gè)或兩個(gè)以上的出口。分支程序又分為單分支和多分支結(jié)構(gòu)。分支結(jié)構(gòu)程序單分支選擇結(jié)構(gòu)多分支選擇結(jié)構(gòu)程序如下:

ORG0000H

AJMPMAIN

ORG0100H

MAIN:MOVA,30H

CJNEA,#24H,DY31;不是“$”,轉(zhuǎn)去DY31

MOV40H,A;是“$”,存入40H單元

AJMPEND0

DY31:MOV31H,A;不是$,存入31H單元

END0:SJMP$

END1.單分支程序單分支程序例:已知內(nèi)RAM30H單元存有一個(gè)ASCII碼,試對(duì)其進(jìn)行判斷,如果是“$”(24H),將其存入40H,否則存入31H單元。

例已知某信號(hào)燈電路如圖所示,試編程實(shí)現(xiàn)如下功能:

⑴S0單獨(dú)按下,紅燈亮,其余燈滅;

⑵S1單獨(dú)按下,綠燈亮,其余燈滅;

⑶S0、S1均按下,紅、綠、黃燈全亮;

⑷都不按下黃燈亮。

參考程序如下:

ORG0000HLJMPSTARTORG0100HSTART:ORLP1,#11000111B;P1.6、P1.7設(shè)為輸入,紅綠黃燈滅多分支程序

SS0:JBP1.7,SS1;S0未按,轉(zhuǎn)判S1JBP1.6,RED;S0按下,S1未按,轉(zhuǎn)紅燈亮DL:CLRP1.2;紅燈亮CLRP1.1;綠燈亮CLRP1.0;黃燈亮SJMPSS0;重新檢測(cè)SS1:JBP1.6,YELLOW;S0未按,S1未按,轉(zhuǎn)黃燈亮GREEN:CLRP1.1;綠燈亮SETBP1.2;紅燈滅SETBP1.0;黃燈滅SJMPSS0RED:CLRP1.2;紅燈亮SETBP1.1;綠燈滅SETBP1.0;黃燈滅SJMPSS0

YELLOW:CLRP1.0;黃燈亮SETBP1.2;紅燈滅SETBP1.1;綠燈滅SJMPSS0END說(shuō)明:如果真要實(shí)現(xiàn)信號(hào)燈的點(diǎn)亮,還要在每段燈亮滅指令后加一段延時(shí)程序。循環(huán)程序的結(jié)構(gòu)一般包括以下幾部分。循環(huán)初始化——是進(jìn)入循環(huán)處理前必須要有的一個(gè)環(huán)節(jié),用于完成循環(huán)前的準(zhǔn)備工作。循環(huán)初始化包括給工作寄存器(或其他存儲(chǔ)單元)設(shè)置計(jì)數(shù)初值、地址指針、數(shù)據(jù)塊長(zhǎng)度等。循環(huán)處理——是需要多次重復(fù)執(zhí)行的程序段。循環(huán)處理是循環(huán)程序的核心,用于完成主要的計(jì)算和操作任務(wù)。循環(huán)控制——是用條件轉(zhuǎn)移指令控制循環(huán)是否繼續(xù)。每循環(huán)一次,根據(jù)循環(huán)結(jié)束條件進(jìn)行一次判斷;當(dāng)滿足條件時(shí),停止循環(huán),繼續(xù)執(zhí)行其他程序;否則,再作循環(huán)。循環(huán)結(jié)束——用于存放循環(huán)程序的執(zhí)行結(jié)果,同時(shí)恢復(fù)相關(guān)工作單元的初值。

循環(huán)結(jié)構(gòu)程序循環(huán)程序的特點(diǎn)和設(shè)計(jì)方法。程序結(jié)構(gòu)緊湊,占用存儲(chǔ)單元較少,程序中間有分支,循環(huán)程序本質(zhì)上是分支程序的一種特殊形式。DJNZ指令使用得較多,凡是分支程序中可以使用的控制轉(zhuǎn)移類指令,循環(huán)程序一般都可以使用。循環(huán)控制的形式有多種。計(jì)數(shù)循環(huán)是最常用的一種,它先預(yù)置計(jì)數(shù)初值,再用DJNZ指令控制循環(huán)次數(shù);條件循環(huán)也是較常用的一種,它先預(yù)置結(jié)束循環(huán)的條件,再用CJNE指令、JZ指令或JB指令控制循環(huán)的結(jié)束。

先判斷后處理先處理后判斷兩重循循環(huán)程序流程圖循環(huán)程序流程圖程序流程圖

開(kāi)始

循環(huán)控制

循環(huán)結(jié)束

循環(huán)處理

循環(huán)初始化

結(jié)束

Y

N

條件滿足?

循環(huán)控制2

循環(huán)結(jié)束

循環(huán)處理1

循環(huán)初始化1

結(jié)束

Y

N

循環(huán)處理2

循環(huán)初始化2

Y

N

循環(huán)控制1

開(kāi)始

條件滿足?

條件滿足?

多重循環(huán)程序中的各重循環(huán)不能有交叉,不能從外循環(huán)跳入內(nèi)循環(huán),只能外循環(huán)內(nèi)嵌套內(nèi)循環(huán)?!纠?/p>

片內(nèi)RAM中存放有10個(gè)數(shù)據(jù),首地址為30H,編程將數(shù)據(jù)塊傳送到片外RAM以1000H為首地址的存儲(chǔ)單元中。

解:該程序是單重循環(huán)程序,片內(nèi)RAM首地址30H、片外RAM首地址1000H和數(shù)據(jù)塊長(zhǎng)度10都是循環(huán)初始化的內(nèi)容。循環(huán)控制是對(duì)數(shù)據(jù)塊長(zhǎng)度進(jìn)行判斷,每傳送一個(gè)數(shù)據(jù),存放數(shù)據(jù)塊長(zhǎng)度的寄存器減1;10個(gè)數(shù)據(jù)傳送完,存放數(shù)據(jù)塊長(zhǎng)度的寄存器內(nèi)容正好為零,退出循環(huán)。

ORG0000H

LJMPMAIN

ORG0100HMAIN:

MOVR1,#30H;置片內(nèi)RAM地址指針30H

MOVDPTR,#1000H;置片外RAM地址指針1000H

MOVR2,#10;數(shù)據(jù)塊的長(zhǎng)度LOOP:

MOVA,@R1;從片內(nèi)RAM取數(shù)據(jù)MOVX@DPTR,A;數(shù)據(jù)傳送到片外RAM

INCR1;修改片內(nèi)RAM地址指針

INCDPTR;修改片外RAM地址指針

DJNZR2,LOOP;循環(huán)次數(shù)未到10次,轉(zhuǎn)移

SJMP$

END【例】

片內(nèi)RAM中存放有10個(gè)數(shù)據(jù),首地址為30H,編程將數(shù)據(jù)塊傳送到片外RAM以1000H為首地址的存儲(chǔ)單元中。

例工作單元清零。在應(yīng)用系統(tǒng)程序設(shè)計(jì)時(shí),有時(shí)經(jīng)常需要將存儲(chǔ)器中各部分地址單元作為工作單元,存放程序執(zhí)行的中間值或執(zhí)行結(jié)果,工作單元清零工作常常放在程序的初始化部分中。設(shè)有50個(gè)工作單元,其首址為外部存儲(chǔ)器8000H單元,則其工作單元清零程序如下:單片機(jī)與一般集成電路的區(qū)別在于可編程應(yīng)用,程序是單片機(jī)應(yīng)用系統(tǒng)的靈魂.由于匯編語(yǔ)言是面向機(jī)器的語(yǔ)言,因此對(duì)單片機(jī)系統(tǒng)進(jìn)行程序設(shè)計(jì)時(shí)必須考慮硬件資源的配置。

程序設(shè)計(jì)的方法和技巧盡量采用模塊化程序設(shè)計(jì)方法

;

這種設(shè)計(jì)方法是把一個(gè)完整的程序分成若干個(gè)功能相對(duì)獨(dú)立的、較小的程序模塊,對(duì)各個(gè)程序模塊分別進(jìn)行設(shè)計(jì)、編制程序和調(diào)試,最后把各個(gè)調(diào)試好的程序模塊裝配起來(lái)進(jìn)行聯(lián)調(diào),最終成為一個(gè)有實(shí)用價(jià)值的程序。模塊化程序設(shè)計(jì)的優(yōu)點(diǎn)是:對(duì)單個(gè)程序模塊設(shè)計(jì)和調(diào)試比較方便、容易完成,一個(gè)模塊可以被多個(gè)任務(wù)共用。盡量采用循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)

;

采用循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu),可以使程序的總?cè)萘繙p小,提高程序的效率,節(jié)省內(nèi)存。盡量少用無(wú)條件轉(zhuǎn)移指令

;

少用無(wú)條件轉(zhuǎn)移指令,可以保證程序的條理更加清晰,從而減少錯(cuò)誤發(fā)生。充分利用累加器;

累加器是主程序和子程序之間信息傳遞的橋梁,利用累加器傳遞入口參數(shù)或返回參數(shù)比較方便。這時(shí),一般不要把累加器內(nèi)容壓入堆棧。對(duì)于通用子程序要保護(hù)現(xiàn)場(chǎng);

由于子程序的通用性,除了保護(hù)子程序入口參數(shù)的寄存器內(nèi)容外,還要對(duì)子程序中用到的其它寄存器內(nèi)容一并入棧保護(hù)。

對(duì)于中斷處理,還要保護(hù)程序狀態(tài)字

在中斷處理程序中,既要保護(hù)處理程序中用到的寄存器內(nèi)容,還要保護(hù)程序狀態(tài)字PSW。否則,當(dāng)中斷服務(wù)程序執(zhí)行結(jié)束返回主程序時(shí),整個(gè)程序的執(zhí)行可能會(huì)被打亂。單片機(jī)C語(yǔ)言程序設(shè)計(jì)1、C語(yǔ)言的特點(diǎn)語(yǔ)言簡(jiǎn)潔、緊湊,使用方便、靈活。運(yùn)算符豐富。數(shù)據(jù)結(jié)構(gòu)豐富。具有現(xiàn)代化語(yǔ)言的各種數(shù)據(jù)結(jié)構(gòu)??蛇M(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)??梢灾苯訉?duì)計(jì)算機(jī)硬件進(jìn)行操作。生成的目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高??梢浦残院?。一、C語(yǔ)言概述與最簡(jiǎn)單的C程序2、C語(yǔ)言的程序結(jié)構(gòu)C語(yǔ)言程序采用函數(shù)結(jié)構(gòu),每個(gè)C語(yǔ)言程序由一個(gè)或多個(gè)函數(shù)組成,在這些函數(shù)中至少應(yīng)包含一個(gè)主函數(shù)main(),也可以包含一個(gè)main()函數(shù)和若干個(gè)其它的功能函數(shù)。不管main()函數(shù)放于何處,程序總是從main()函數(shù)開(kāi)始執(zhí)行,執(zhí)行到main()函數(shù)結(jié)束則結(jié)束。在main()函數(shù)中調(diào)用其它函數(shù),其它函數(shù)也可以相互調(diào)用,但main()函數(shù)只能調(diào)用其它的功能函數(shù),而不能被其它的函數(shù)所調(diào)用。功能函數(shù)可以是C語(yǔ)言編譯器提供的庫(kù)函數(shù),也可以是由用戶定義的自定義函數(shù)。在編制C程序時(shí),程序的開(kāi)始部分一般是預(yù)處理命令、函數(shù)說(shuō)明和變量定義等。

3、C語(yǔ)言與MCS-51單片機(jī)用C語(yǔ)言編寫MCS-51單片機(jī)程序與用匯編語(yǔ)言編寫MCS–51單片機(jī)程序不一樣。用匯編語(yǔ)言編寫MCS–51單片機(jī)程序必須要考慮其存儲(chǔ)器結(jié)構(gòu),尤其必須考慮其片內(nèi)數(shù)據(jù)存儲(chǔ)器與特殊功能寄存器的使用以及按實(shí)際地址處理端口數(shù)據(jù)。用C語(yǔ)言編寫的MCS–51單片機(jī)應(yīng)用程序,則不用像匯編語(yǔ)言那樣須具體組織、分配存儲(chǔ)器資源和處理端口數(shù)據(jù),但在C語(yǔ)言編程中,對(duì)數(shù)據(jù)類型與變量的定義,必須要與單片機(jī)的存儲(chǔ)結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正確地映射定位。

C語(yǔ)言編寫單片機(jī)應(yīng)用程序時(shí),需根據(jù)單片機(jī)存儲(chǔ)結(jié)構(gòu)及內(nèi)部資源定義相應(yīng)的數(shù)據(jù)類型和變量,而標(biāo)準(zhǔn)的C語(yǔ)言程序不需要考慮這些問(wèn)題;

C51包含的數(shù)據(jù)類型、變量存儲(chǔ)模式、輸入輸出處理、函數(shù)等方面與標(biāo)準(zhǔn)的C語(yǔ)言有一定的區(qū)別。其它的語(yǔ)法規(guī)則、程序結(jié)構(gòu)及程序設(shè)計(jì)方法等與標(biāo)準(zhǔn)的C語(yǔ)言程序設(shè)計(jì)相同。

用C語(yǔ)言編寫單片機(jī)應(yīng)用程序與標(biāo)準(zhǔn)的C語(yǔ)言程序也有相應(yīng)的區(qū)別:

現(xiàn)在支持MCS-51系列單片機(jī)的C語(yǔ)言編譯器有很多種,如AmericanAutomation、Avocet、BSO/TASKING、DUNFIELDSHAREWARE、KEIL/Franklin等。各種編譯器的基本情況相同,但具體處理時(shí)有一定的區(qū)別,其中KEIL/Franklin以它的代碼緊湊和使用方便等特點(diǎn)優(yōu)于其它編譯器,現(xiàn)在使用特別廣泛。

本章主要以KEIL編譯器介紹MCS-51單片機(jī)C語(yǔ)言程序設(shè)計(jì)。二、C51數(shù)據(jù)的存儲(chǔ)模式和數(shù)據(jù)類型

1、存儲(chǔ)模式

C51變量的存儲(chǔ)模式與標(biāo)準(zhǔn)C中變量的存儲(chǔ)模式不一樣,C51中變量的存儲(chǔ)模式是與MCS-51單片機(jī)的存儲(chǔ)器緊密相關(guān)。C51是面向8XX51系列單片機(jī)及硬件控制系統(tǒng)的開(kāi)發(fā)語(yǔ)言,它定義的任何變量必須以一定的存貯類型的方式定位在8XX51的某一存貯區(qū)中,否則便沒(méi)有意義。因此在定義變量類型時(shí),還必須定義它的存貯類型。存儲(chǔ)器類型存儲(chǔ)區(qū)域大小對(duì)應(yīng)的匯編語(yǔ)句描述code程序存儲(chǔ)區(qū)64KBMOVCA,@A+DPTR用來(lái)說(shuō)明常量data直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)128BMOVXX,#ADDR訪問(wèn)速度快idata間接尋址的內(nèi)部數(shù)據(jù)區(qū)256BMOVXX,@Rn可訪問(wèn)整個(gè)內(nèi)部數(shù)據(jù)區(qū)域bdata位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)16B可使用位尋址或字節(jié)尋址來(lái)訪問(wèn)這一區(qū)域xdata外部數(shù)據(jù)存儲(chǔ)或64KBMOVXA,@DPTR使用DPTR來(lái)訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器far擴(kuò)充的RAM和ROM使用用戶定義的專用例程或特殊芯片指令擴(kuò)展命令pdata分頁(yè)的外部數(shù)據(jù)存儲(chǔ)區(qū)256BMOVXA,@Rn利用R0,R1來(lái)訪問(wèn)分頁(yè)的外部數(shù)據(jù)存儲(chǔ)器datacharvar;/*字符變量var定位在片內(nèi)數(shù)據(jù)存貯區(qū)*/charcodeMSG[]=″PARAMETER:″;/*字符數(shù)組MSG[]定位在程序存 貯區(qū)*/unsignedlongxdataarray[100];/*無(wú)符號(hào)長(zhǎng)型數(shù)組定位在片外RAM區(qū)*/floatidatax,y,z;/*實(shí)型變量x,y,z,定位在片內(nèi)用間址訪問(wèn)的內(nèi)部RAM區(qū)*/unsignedintpdatasion;/*無(wú)符號(hào)整型變量sion定位在分頁(yè)的外部RAM*/unsignedcharxdatavector[10][4][4]/*無(wú)符號(hào)字符型三維數(shù)組,定位在片外RAM區(qū)*/charbdataflags;/*字符變量flags定位在可位尋址內(nèi)部RAM區(qū)*/2、數(shù)據(jù)類型C51的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和組合數(shù)據(jù)類型,情況與標(biāo)準(zhǔn)C中的數(shù)據(jù)類型基本相同,但其中char型與short型相同,float型與double型相同,另外,C51中還有專門針對(duì)于MCS-51單片機(jī)的特殊功能寄存器型和位類型。

C51數(shù)據(jù)類型(1)數(shù)據(jù)類型C51專用長(zhǎng)度取值范圍signedchar單字節(jié)-128to+127unsignedchar單字節(jié)0to255signedshort2字節(jié)-32768to+32767unsignedshort2字節(jié)0to65535signedint2字節(jié)-32768to+32767unsignedint2字節(jié)0to65535signedlong4字節(jié)-2147483648to+214746483647unsignedlong4字節(jié)0to4294967295float4字節(jié)±1.175494E-38to±3.402823E+38*1~3字節(jié)對(duì)象的地址enum1或2字節(jié)-128to+127或-32768to+32767C51數(shù)據(jù)類型(2)sfr:為字節(jié)型特殊功能寄存器類型,占一個(gè)內(nèi)存單元,利用它可以訪問(wèn)MCS-51內(nèi)部的所有特殊功能寄存器;sfr16:為雙字節(jié)型特殊功能寄存器類型,占用兩個(gè)字節(jié)單元,利用它可以訪問(wèn)MCS-51內(nèi)部的所有兩個(gè)字節(jié)的特殊功能寄存器。注:在C51中對(duì)特殊功能寄存器的訪問(wèn)必須先用sfr或sfr16進(jìn)行聲明。bit:位變量聲明,在內(nèi)存中都只占一個(gè)二進(jìn)制位,其值可以是“1”或“0”。用bit定義的位變量在C51編譯器編譯時(shí),在不同的時(shí)候位地址是可以變化的sbit:特殊功能位聲明,在內(nèi)存中都只占一個(gè)二進(jìn)制位,其值可以是“1”或“0”。用sbit定義的位變量必須與MCS-51單片機(jī)的一個(gè)可以尋址位單元或可位尋址的字節(jié)單元中的某一位聯(lián)系在一起,在C51編譯器編譯時(shí),其對(duì)應(yīng)的位地址是不可變化的。C51對(duì)SFR、可尋址位、存儲(chǔ)器和I/O口的定義

特殊功能寄存器SFR定義

C51提供了一種自主形式的定義方式,使用特定關(guān)鍵字sfr如sfrSCON=0x98;/*串行通信控制寄存器地址98H*/sfrTMOD=0x89;/*定時(shí)器模式控制寄存器地址89H*/sfrP1=0x90;/*P1端口地址90H*/sfr16DPTR=0x82;定義了以后,程序中就可以直接引用寄存器名。C51也建立了一個(gè)頭文件reg51.h(增強(qiáng)型為reg52.h),在該文件中對(duì)所有的特殊功能寄存器的進(jìn)行了sfr定義,對(duì)特殊功能寄存器的有位名稱的可尋址位進(jìn)行了sbit定義,因此,只要用包含語(yǔ)句#include<reg51.h>,就可以直接引用特殊功能寄存器名,或直接引用位名稱。要特別注意:在引用時(shí)特殊功能寄存器或者位名稱必須大寫。

C51對(duì)位變量的定義有三種方法:1.將變量用bit類型的定義符定義為bit類型:

如bitmn; mn為位變量,其值只能是“0”或“1”,其位地址C51自行安排在可位尋址區(qū)的bdata區(qū)。

2.采用字節(jié)尋址變量.位的方法:

如bdataintibase;/*ibase定義為整型變量*/sbitmybit=ibase^15;/*mybit定義為ibase的D15位*/這里位是運(yùn)算符“^”相當(dāng)于匯編中的“·”,其后的最大取值依賴于該位所在的字節(jié)尋址變量的定義類型,如定義為char最大值只能為7。

3.對(duì)特殊功能寄存器的位的定義

方法1:使用頭文件及sbit定義符;多用于無(wú)位名的可尋址位。 例如#include<reg51.h>sbitP1-1=P1^1/*P1-1為P1口的第1位*/sbitac=ACC^7;/*ac定義為累加器A的第7位*/方法2:使用頭文件reg51.h,再直接用位名稱。 例如#in

溫馨提示

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

評(píng)論

0/150

提交評(píng)論