51系列單片機(jī)程序設(shè)計(jì)課件_第1頁
51系列單片機(jī)程序設(shè)計(jì)課件_第2頁
51系列單片機(jī)程序設(shè)計(jì)課件_第3頁
51系列單片機(jī)程序設(shè)計(jì)課件_第4頁
51系列單片機(jī)程序設(shè)計(jì)課件_第5頁
已閱讀5頁,還剩83頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

2010/5/18單片機(jī)原理與接口技術(shù)第四章MCS-51系列單片機(jī)程序設(shè)計(jì)51系列單片機(jī)程序設(shè)計(jì)4.1匯編語言程序設(shè)計(jì)概述計(jì)算機(jī)是仿照人的思維方式順序執(zhí)行一條條指令來完成特定任務(wù)的機(jī)器,計(jì)算機(jī)程序因此被定義為指令或語句的“有序集合”,程序設(shè)計(jì)是指編寫計(jì)算機(jī)程序的過程。匯編語言是用指令助記符等表示的計(jì)算機(jī)指令,采用匯編語言編寫的程序被稱為匯編語言程序。匯編語言程序具有代碼效率高(編譯后的指令代碼占用存儲(chǔ)空間小)和執(zhí)行時(shí)間短等優(yōu)勢和特點(diǎn)。由于單片機(jī)的存儲(chǔ)器等資源有限,單片機(jī)應(yīng)用程序中經(jīng)常需要面對硬件操作,且對程序執(zhí)行的時(shí)間有較為嚴(yán)格的要求或限制。因此,匯編語言程序設(shè)計(jì)是單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)的重要基礎(chǔ)之一。

51系列單片機(jī)程序設(shè)計(jì)4.1匯編語言程序設(shè)計(jì)概述1、匯編語言的特點(diǎn):

匯編語言的特點(diǎn)歸納如下:

助記符指令與機(jī)器指令一一對應(yīng);

程序代碼效率高,占用存儲(chǔ)空間小,運(yùn)行速度快,匯編語言程序往往是最優(yōu)化的程序;

助記符指令(匯編指令)與計(jì)算機(jī)硬件聯(lián)系緊密,要求編程人員對計(jì)算機(jī)硬件較為熟悉;

匯編語言程序缺乏通用性,移植性較差。

4.1.1匯編語言的特點(diǎn)及語句格式51系列單片機(jī)程序設(shè)計(jì)4.1匯編語言程序設(shè)計(jì)概述2、匯編語言的語句格式

MCS-51系列單片機(jī)匯編語言的語句格式如下:

[<標(biāo)號(hào)>]:<操作碼>[<操作數(shù)>];[<注釋>]

[<標(biāo)號(hào)>]——標(biāo)號(hào)是匯編語句地址的符號(hào)表示。

<操作碼>——用于規(guī)定該語句所執(zhí)行的操作。

[<操作數(shù)>]——操作數(shù)為匯編指令的操作提供數(shù)據(jù)或地址

[<注釋>]——注釋是指對一條匯編語句或一段匯編語言程序的說明,以增加匯編語言程序的可讀性。

4.1.1匯編語言的特點(diǎn)及語句格式51系列單片機(jī)程序設(shè)計(jì)4.1匯編語言程序設(shè)計(jì)概述

1、起始地址定位偽指令ORG

格式:[標(biāo)號(hào)]:ORG操作數(shù)說明:其功能是指出緊接其后的指令的目標(biāo)代碼的第一個(gè)字節(jié)在程序存儲(chǔ)器中的絕對地址。例如:

ORG0030HSTART:MOVA,#33H......即定義標(biāo)號(hào)START表示的起始地址值為0030H,該段程序的指令代碼從該地址開始順序存放。

4.1.2匯編語言偽指令51系列單片機(jī)程序設(shè)計(jì)4.1匯編語言程序設(shè)計(jì)概述

2、賦值偽指令EQU

格式:字符名稱EQU操作數(shù)說明:該指令用于字符名稱賦值。在同一個(gè)源程序中,任何一個(gè)字符名稱只能賦值一次。且一旦賦值之后,整個(gè)源程序中該字符的值就固定不變了。例如:

ADPORTEQU1001H即給字符名稱ADPORT賦值16進(jìn)制數(shù)1001H。

4.1.2匯編語言偽指令51系列單片機(jī)程序設(shè)計(jì)4.1匯編語言程序設(shè)計(jì)概述

3、數(shù)據(jù)地址賦值偽指令DATA格式:字符名稱DATA操作數(shù)說明:DATA偽指令的功能與EQU偽指令相似,不同之處在于DATA偽指令所定義的字符名稱可先使用后定義(賦值),也可先定義(賦值)后使用。在程序中它常用來定義(賦值)數(shù)據(jù)地址。

4.1.2匯編語言偽指令51系列單片機(jī)程序設(shè)計(jì)4.1匯編語言程序設(shè)計(jì)概述

4、字節(jié)數(shù)據(jù)賦值偽指令DB格式:[標(biāo)號(hào):]DB數(shù)據(jù)表(字節(jié))說明:該偽指令用于定義(賦值)若干字節(jié)數(shù)據(jù)表(固定常數(shù)),并存放在指定地址單元開始的程序存儲(chǔ)器中。例如:

ORG0050HTABLE:DB99H,88H

即表示在地址0050H(標(biāo)號(hào)TABLE)開始定義(賦值)兩個(gè)字節(jié)數(shù)據(jù)(99H,88H)。

4.1.2匯編語言偽指令51系列單片機(jī)程序設(shè)計(jì)4.1匯編語言程序設(shè)計(jì)概述

5、雙字節(jié)數(shù)據(jù)賦值偽指令DW格式:[標(biāo)號(hào):]DW數(shù)據(jù)表(雙字節(jié))說明:該偽指令與DB偽指令的不同之處在于DW定義(賦值)的是雙字節(jié)數(shù)據(jù),而DB定義(賦值)的是單字節(jié)數(shù)據(jù)。高8位數(shù)據(jù)安排在低地址單元,低8位數(shù)據(jù)安排在高地址單元。6、預(yù)留空間定義偽指令DS格式:[標(biāo)號(hào):]DS操作數(shù)說明:該偽指令的作用是通知匯編程序,從指定的地址單元開始(通常由標(biāo)號(hào)指定首地址),保留由操作數(shù)(常數(shù)或表達(dá)式)規(guī)定的字節(jié)空間。

4.1.2匯編語言偽指令51系列單片機(jī)程序設(shè)計(jì)4.1匯編語言程序設(shè)計(jì)概述

7、位地址賦值偽指令BIT格式:字符名稱BIT位地址說明:該偽指令給字符名稱賦予位地址(片內(nèi)RAM和SFR中的位地址),常用于位操作程序中。例如:

FLAGBIT20H

即將位地址20H賦予字符名稱FLAG。8、定義匯編結(jié)束偽指令END格式:[標(biāo)號(hào):]END說明:匯編結(jié)束偽指令END的作用是通知匯編程序,匯編源程序到此結(jié)束。在一個(gè)匯編程序中,只允許出現(xiàn)一條END偽指令,且必須安排在整個(gè)源程序的末尾處。

4.1.2匯編語言偽指令51系列單片機(jī)程序設(shè)計(jì)4.1匯編語言程序設(shè)計(jì)概述4.2基本程序結(jié)構(gòu)1、順序結(jié)構(gòu)程序2、分支結(jié)構(gòu)程序3、循環(huán)結(jié)構(gòu)程序4、子程序5、中斷程序基本程序結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)

順序結(jié)構(gòu)是各類程序中最簡單的,也是最基本的程序結(jié)構(gòu)。順序結(jié)構(gòu)程序的特征是整個(gè)程序段沒有任何轉(zhuǎn)移指令。主要由數(shù)據(jù)傳遞類指令和數(shù)據(jù)運(yùn)算類指令組成,通常用于執(zhí)行數(shù)據(jù)傳送和較為簡單的算術(shù)或邏輯運(yùn)算任務(wù)。

4.2.1順序結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)

例4-1,將內(nèi)部RAM中20H單元和30H單元的無符號(hào)數(shù)相加,存入R0(高位)和R1(低位)中。源程序如下:

MOVA,20H;取出被加數(shù)

ADDA,30H;兩數(shù)相加

MOVR1,A;低位存入R1 CLRA;

ADDCA,#00H;取進(jìn)位標(biāo)志

MOVR0,A;高位存入R0 RET

4.2.1順序結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)

分支結(jié)構(gòu)程序利用條件轉(zhuǎn)移指令,使程序在執(zhí)行某一指令后(產(chǎn)生測試條件),根據(jù)所規(guī)定的條件滿足與否改變其后程序執(zhí)行的順序(產(chǎn)生分叉),即根據(jù)判斷條件的成立與否來確定程序的走向。分支結(jié)構(gòu)程序的特征是程序段中有控制轉(zhuǎn)移類指令(條件轉(zhuǎn)移指令)。 依據(jù)程序分叉的數(shù)目,可將分支結(jié)構(gòu)程序細(xì)分為單分支選擇結(jié)構(gòu)和多分支選擇結(jié)構(gòu)兩類。

4.2.2分支結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)1、單分支選擇結(jié)構(gòu)當(dāng)程序的判斷僅有兩個(gè)出口(分叉),即兩者選一時(shí),稱為單分支結(jié)構(gòu)。通常用條件判斷指令來選擇并確定程序的出口。例4-3.設(shè)內(nèi)部RAM40H和41H單元中存放2個(gè)8位無符號(hào)二進(jìn)制數(shù),試編程找出其中的大數(shù)存人30H單元中。源程序如下:

MOVA,40H CJNEA,41H,LOOP;取2個(gè)數(shù)進(jìn)行比較

LOOP:JNCLOOP1;根據(jù)CY值,判斷單分支出

MOVA,41H;41H單元中是大數(shù)

LOOP1:MOV30H,A;40H單元中是大數(shù)

RET

4.2.2分支結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)

2、多分支選擇結(jié)構(gòu)當(dāng)程序的判別部分有兩個(gè)以上的出口(分叉)時(shí),稱為多分支選擇結(jié)構(gòu)。例4-4,設(shè)變量X的值存放在內(nèi)部RAM的30H單元中,編程求解下列函數(shù)式,將求得的函數(shù)值Y存人40H單元。

X+1(X≥100)

Y=0(10≤X<100)

X一1(X<10)

4.2.2分支結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)MOVA,30H;取自變量X值

CJNEA,#10,LOOP;與10比較,A中值不改變LOOP:JCLOOP2;若X<10,轉(zhuǎn)LOOP2CJNEA,#100,LOOP1;與100比較LOOP1:JNCLOOP3;若X>100,轉(zhuǎn)LOOP3MOV40H,#00H;因10≤X<100,故Y=0SJMPEXITLOOP2:DECA;因X<10,故Y=X一1MOV40H,ASJMPEXITLOOP3:INCA;若X>100,故Y=X+1MOV40H,AEXIT:RET51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)

在程序設(shè)計(jì)中,遇到一段程序需要多次重復(fù)執(zhí)行的情況,通常應(yīng)該采用循環(huán)結(jié)構(gòu)程序。1、循環(huán)結(jié)構(gòu)程序組成循環(huán)結(jié)構(gòu)程序由初始化、循環(huán)處理、循環(huán)控制和循環(huán)結(jié)束4部分組成。

(1)初始化部分初始化部分設(shè)置循環(huán)處理之前的初始狀態(tài),如循環(huán)次數(shù)、變量初值、地址指針初值等。

(2)循環(huán)處理部分循環(huán)處理部分又稱循環(huán)體,是重復(fù)執(zhí)行的數(shù)據(jù)處理程序段,它是循環(huán)程序的核心部分(功能主體)。4.2.3循環(huán)結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)

(3)循環(huán)控制部分 控制部分控制循環(huán)繼續(xù)與否。(4)結(jié)束部分 結(jié)束部分對循環(huán)程序全部執(zhí)行結(jié)束后的結(jié)果進(jìn)行分析、處理和保存。 循環(huán)結(jié)構(gòu)程序一般分為“單重循環(huán)”和“多重循環(huán)”兩類,循環(huán)次數(shù)的控制有多種方式,當(dāng)循環(huán)次數(shù)已知時(shí),可采用循環(huán)次數(shù)計(jì)數(shù)器控制循環(huán);若循環(huán)次數(shù)未知時(shí),可按條件滿足與否控制循環(huán)。4.2.3循環(huán)結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)2.循環(huán)程序設(shè)計(jì)

在一個(gè)循環(huán)程序的循環(huán)體中不包含另外的循環(huán)結(jié)構(gòu)稱為單重循環(huán)。

例4-5,設(shè)某字符串以回車符(0DH)為結(jié)束標(biāo)志,并存放在內(nèi)部RAM40H單元開始的連續(xù)存儲(chǔ)單元之中,編寫測試字符串長度的匯編語言程序。

編程思路——為測試字符串(0DH)的長度,應(yīng)使用逐個(gè)字符依次與回車符(ODH)比較的方法。為此需要設(shè)一個(gè)字符串指針和一個(gè)長度計(jì)數(shù)器,字符串指針用于指定字符,長度計(jì)數(shù)器用于累加字符串的長度。如比較不相等,則長度計(jì)數(shù)器和字符串指針都加1,以繼續(xù)往下比較;如果比較相等,則表示該字符為回車符,字符串結(jié)束,長度計(jì)數(shù)器的值就是字符串的長度。4.2.3循環(huán)結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)2.循環(huán)程序設(shè)計(jì)

程序如下:

MOVR7,#0FFH;設(shè)長度計(jì)數(shù)器初值

MOVR0,#3FH;字符串指針初值LOOP:INCR7INCR0 CJNE@R0,#ODH,LOOP RET4.2.3循環(huán)結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)4.2.4子程序結(jié)構(gòu)

在編寫程序過程中,如果遇到在幾個(gè)程序段中都需要執(zhí)行某段相同程序的情況(功能獨(dú)立),為減少編程工作量和節(jié)省程序存儲(chǔ)空間,就應(yīng)該采用子程序結(jié)構(gòu),將重復(fù)執(zhí)行的相同程序段編寫成為一個(gè)子程序(功能子程序)。返回調(diào)用斷點(diǎn)子程序主程序51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)MAIN:……;進(jìn)入主程序MOVR0,#03H;設(shè)置入口參數(shù)(延時(shí)1)ACALLSUBPRO;調(diào)用子程序……;子程序返回,繼續(xù)執(zhí)行主程序;###################################;子程序入口地址(子程序名稱):SUBPRO;功能:延時(shí)子程序(延時(shí)時(shí)間由R0初值設(shè)置);入口參數(shù):R0內(nèi)存放延時(shí)計(jì)數(shù)初值;出口參數(shù):無;使用寄存器:R0、R1;###################################SUBPRO:MOVR1,#03HDJNZR1,$DJNZR0,SUBPRORET;子程序返回END4.2.3子程序結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)單片機(jī)中斷程序設(shè)計(jì)主要有以下三個(gè)方面:

1、中斷向量設(shè)置

2、中斷初始化

3、中斷服務(wù)程序

4.2.5中斷程序結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)例4-7,設(shè)89C51單片機(jī)外中斷0(EX0)下降沿有效,每次進(jìn)入中斷服務(wù)程序,要求將89C51單片機(jī)的P1.7~P1.0取反。主程序如下:

ORG0000HSTAR:AJMPMAIN;主程序原始入口

ORG0003H;外部中斷0中斷向量

AJMPEXTR;跳轉(zhuǎn)到EX0中斷服務(wù)子程序?qū)嶋H入口地址

ORG0030HMAIN:SETBIT0;主程序?qū)嶋H入口,邊沿觸發(fā)設(shè)置

SETBEX0;外部中斷0允許

SETBEA;總中斷允許HERE:AJMPHERE;等待再次進(jìn)入中斷服務(wù)程序4.2.5中斷程序結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)4.2基本程序結(jié)構(gòu)中斷服務(wù)子程序:

ORG1200HEXTR:PUSHPSW;保護(hù)現(xiàn)場

CPLA;累加器A數(shù)據(jù)取反

MOVP1,A;數(shù)據(jù)輸出至P1端口

POPPSW;恢復(fù)現(xiàn)場

RETI;中斷返回4.2.5中斷程序結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)4.3匯編語言程序設(shè)計(jì)實(shí)踐

匯編語言程序設(shè)計(jì)的一般步驟如下:

建立數(shù)學(xué)模型——用適用的數(shù)學(xué)方法描述所需要解決的問題;

確定算法——將數(shù)學(xué)模型轉(zhuǎn)化為適合單片機(jī)處理(順序執(zhí)行)的形式,采用繪制程序流程圖等方法表示程序設(shè)計(jì)的思路和依據(jù)。

編寫源程序——采用模塊化設(shè)計(jì)方法,合理劃分功能模塊,分配存儲(chǔ)器和I/O端口(依據(jù)硬件電路)等資源,確定各模塊內(nèi)各程序段的結(jié)構(gòu),編寫源程序文件。

匯編及調(diào)試——在集成開發(fā)環(huán)境的支持下,匯編語言源程序經(jīng)匯編生成目標(biāo)程序文件,并通過調(diào)試以及對運(yùn)行結(jié)果的分析,修正源程序中的錯(cuò)誤,達(dá)到預(yù)期的設(shè)計(jì)目標(biāo)。51系列單片機(jī)程序設(shè)計(jì)

所謂查表,就是根據(jù)變量x在表格中查找y,使y=f(x)。函數(shù)值y事先根據(jù)變量x的取值范圍計(jì)算出,并按一定規(guī)律編成表格存放在計(jì)算機(jī)的程序存儲(chǔ)器中。當(dāng)用戶程序中需要用這些數(shù)據(jù)時(shí),直接按編排的索引值(或程序號(hào))尋找答案。這樣編寫的程序稱為查表程序。查表程序是一種常用程序,廣泛應(yīng)用于LED顯示器控制、智能化儀表控制、打印機(jī)打印以及數(shù)據(jù)轉(zhuǎn)換等功能程序中,具有程序簡單、執(zhí)行速度快等優(yōu)點(diǎn)。查表程序有多種結(jié)構(gòu)形式,下面舉例介紹一種常用的查表程序。4.3.1查表程序4.3匯編語言程序設(shè)計(jì)實(shí)踐

51系列單片機(jī)程序設(shè)計(jì)4.3.1查表程序

例4-8,將16進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼的子程序。假設(shè)16進(jìn)制數(shù)存放在R0中低4位,要求將轉(zhuǎn)換后的ASCII碼送回到R0中。設(shè)計(jì)思路:己知0-9的ASCII碼為30H一39H,A—F的ASCII碼為41H一46H。對十六進(jìn)制數(shù)而言,0-F是連續(xù)的,而對應(yīng)的ASCII碼不連續(xù),查表方法對解決此類問題十分有效。根據(jù)題意,子程序的入口參數(shù)和出口參數(shù)均通過R0傳遞,表中所有的值都是單字節(jié),表格長度為16字節(jié)。4.3匯編語言程序設(shè)計(jì)實(shí)踐

51系列單片機(jī)程序設(shè)計(jì)查表子程序:MOVA,R0;讀取主程序通過R0傳送的十六進(jìn)制數(shù)ANLA,0FH;屏蔽高4位,取出低4位ADDA,#02H;設(shè)置變址值(依據(jù)表首地址與查表指 令所處位置)MOVCA,@A+PC;查表指令(獲得對應(yīng)的ASCII碼)MOVR0,A:通過R0將查表結(jié)果傳遞給主程序RETTAB:DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H

程序中因?yàn)椤癕OVCA,@A+PC”指令與表格首址相隔兩個(gè)字節(jié),故變址調(diào)整值為2,程序中對應(yīng)變量x的函數(shù)值y為單字節(jié)。4.3.1查表程序4.3匯編語言程序設(shè)計(jì)實(shí)踐

51系列單片機(jī)程序設(shè)計(jì)

在51系列單片機(jī)指令集中有單字節(jié)的算術(shù)運(yùn)算(加、減、乘、除)指令,但在實(shí)際程序設(shè)計(jì)中經(jīng)常會(huì)遇到多字節(jié)算術(shù)運(yùn)算問題,需要通過編制專門的功能子程序解決此類問題。 例4-9,多字節(jié)無符號(hào)數(shù)加法運(yùn)算。假設(shè)R0中存放被加數(shù)低位字節(jié)地址指針,R1中存放加數(shù)低位字節(jié)地址指針,R2中存放字節(jié)數(shù),多字節(jié)算術(shù)運(yùn)算一般從低字節(jié)(低位)到高字節(jié)(高位)的順序依次進(jìn)行。

4.3.2算術(shù)運(yùn)算程序4.3匯編語言程序設(shè)計(jì)實(shí)踐

51系列單片機(jī)程序設(shè)計(jì)匯編源程序如下:ADDBIN:CLRCLOOP1:MOVA,@R0;取被加數(shù)

ADDCA,@R1;兩數(shù)相加,帶進(jìn)位

MOV@R0,A INCR0 INCR1 DJNZR2,LOOP1;未加完轉(zhuǎn)LOOP1 JNCLOOP2;無進(jìn)位轉(zhuǎn)LOOP2 MOV@R0,#0lH RETLOOP2:DECR0 RET

4.3.2算術(shù)運(yùn)算程序4.3匯編語言程序設(shè)計(jì)實(shí)踐

51系列單片機(jī)程序設(shè)計(jì)例4-10,BCD碼多字節(jié)加法運(yùn)算。假設(shè)R0中存放被加數(shù)低位字節(jié)地址指針,R1中存放加數(shù)低位字節(jié)地址指針,R2中存放字節(jié)數(shù)。

BCDADD:MOV20H,R0 MOV23H,R2 CLRCLP0:MOVA,R0;取被加數(shù)

ADDCA,@R1;兩數(shù)相加

DAA;十進(jìn)制調(diào)整

MOV@RO,A INCR0;指針加1 DJN2R2,LP0;做完加法否4.3.2算術(shù)運(yùn)算程序

MOVR2,23H JNCRETURN;有無進(jìn)位

MOV@R0,#01H INCR3RETURN:MOVR0,#20H RET4.3匯編語言程序設(shè)計(jì)實(shí)踐

51系列單片機(jī)程序設(shè)計(jì)例4-11,如圖4-2所示,MCS-51單片機(jī)的P1作為輸出端口,連接8只發(fā)光二極管。按該電路工作原理,P1口各位輸出“0”時(shí),將發(fā)光二極管點(diǎn)亮;P1口各位輸出“1”使發(fā)光二極管滅。分析下述匯編程序運(yùn)行后,8個(gè)發(fā)光二極管點(diǎn)亮的規(guī)律。4.3.3I/O接口控制程序圖4-2P1口驅(qū)動(dòng)LED示意圖4.3匯編語言程序設(shè)計(jì)實(shí)踐

51系列單片機(jī)程序設(shè)計(jì)主程序:

LP:MOVP1,#7EHLCALLDELAYMOVP1,#0BDHLCALLDELAYMOVP1,#0DBHLCALLDELAYMOVP1,#0E7HLCALLDELAYMOVP1,#0DBHLCALLDELAYMOVP1,#0BDHLCALLDELAYSJMPLP子程序:

DELAY:MOVR2,#0FAHL1:MOVR3,#0FAHL2:DJNZR3,L2DJNZR2,L1RET 4.3.3I/O接口控制程序51系列單片機(jī)程序設(shè)計(jì)

例4-12:按照圖4-2所示的電路,試編寫控制發(fā)光二極管指示燈移位的程序,要求8個(gè)發(fā)光二極管依次亮一個(gè),循環(huán)左移,一個(gè)一個(gè)地亮,直至循環(huán)。相關(guān)源程序如下:MOVA,#7FHL1:MOVP1,ARLALCALLDELAY;與例4-11的延時(shí)程序相同

SJMPLl4.3.3I/O接口控制程序4.3匯編語言程序設(shè)計(jì)實(shí)踐

51系列單片機(jī)程序設(shè)計(jì)一個(gè)函數(shù)的定義由類型、函數(shù)名、參數(shù)表和函數(shù)體四部分組合而成。一個(gè)函數(shù)在程序中可以三種形態(tài)出現(xiàn):函數(shù)定義、函數(shù)調(diào)用、函數(shù)說明。

C51函數(shù)的一般格式為: 類型函數(shù)名(參數(shù)表) 參數(shù)說明;

{

數(shù)據(jù)說明部分;//注釋執(zhí)行語句部分;

}4.4.1C51程序結(jié)構(gòu)

4.4面向51單片機(jī)的C語言程序51系列單片機(jī)程序設(shè)計(jì)4.4.2C51數(shù)據(jù)類型數(shù)據(jù)類型位型(bit)字符型(char)整型(int)長整型(long)浮點(diǎn)型(float)雙精度浮點(diǎn)型(double)數(shù)組類型(array)結(jié)構(gòu)體類型(struct)共用體(union)枚舉(enum)基本類型構(gòu)造類型指針類型空類型1.數(shù)據(jù)類型51系列單片機(jī)程序設(shè)計(jì)KEILC51編譯器支持的數(shù)據(jù)類型、長度和值域如表4-1所列。數(shù)據(jù)類型長度/Byte值域BitUnsignedcharSignedcharUnsignedintSignedintUnsignedlongSignedlongFloatDouble……11224440,10~255-128~1270~65535-32768~327670~4294967295-2147483648~2147483647±1.176E-38~±3.40E+38(6位數(shù)字)±1.176E-38~±3.40E+38(10位數(shù)字)表4-1KEILC51數(shù)據(jù)類型4.4.2C51數(shù)據(jù)類型1.數(shù)據(jù)類型51系列單片機(jī)程序設(shè)計(jì)

C語言的數(shù)據(jù)有常量、變量之分。常量是在程序運(yùn)行的過程中,其值不能改變的量;變量是在程序運(yùn)行中,其值可以改變的量。一個(gè)變量由兩部分構(gòu)成:變量名和變量值,每一個(gè)變量都有一個(gè)變量名,在內(nèi)存中占據(jù)一定的存儲(chǔ)單元(地址),并在該內(nèi)存單元中存放該變量的值。常量定義:#defineCONST44//定義常量符號(hào)CONST,值為44

變量定義:chart;//定義字符型變量,變量名為t C語言中習(xí)慣上以小寫字母定義變量,以大寫字母定義常量。另外由于51單片機(jī)的寄存器及數(shù)據(jù)總線為8位所以在定義變量時(shí),應(yīng)盡可能使用無符號(hào)字符型。4.4.2C51數(shù)據(jù)類型1.數(shù)據(jù)類型-常量和變量51系列單片機(jī)程序設(shè)計(jì)

2.C51數(shù)據(jù)存儲(chǔ)類型

51系列單片機(jī)的程序存儲(chǔ)器與數(shù)據(jù)存儲(chǔ)器是分開的,并獨(dú)立尋址。51系列單片機(jī)共有如下四個(gè)存儲(chǔ)空間:

片內(nèi)程序存儲(chǔ)空間;

片外程序存儲(chǔ)空間;

片內(nèi)數(shù)據(jù)存儲(chǔ)空間;

片外數(shù)據(jù)存儲(chǔ)空間。

C語言編程時(shí)在對常量、變量的定義時(shí),要注意不同功能的常量、變量應(yīng)存儲(chǔ)在不同的存儲(chǔ)區(qū),在定義變量或常量時(shí)要定義成不同的存儲(chǔ)類型(data,bdata,idata,pdata,xdata,code)。4.4.2C51數(shù)據(jù)類型51系列單片機(jī)程序設(shè)計(jì)存儲(chǔ)類型存儲(chǔ)空間databdataidatapdataxdatacode內(nèi)部RAM低128單元,可直接尋址片內(nèi)RAM位尋址區(qū)內(nèi)部RAM,間接尋址片外RAM,256字節(jié)片外RAM,64KB代碼存儲(chǔ)區(qū),64KB表4-2C51存儲(chǔ)類型與單片機(jī)存儲(chǔ)空間對應(yīng)關(guān)系4.4.2C51數(shù)據(jù)類型2.C51數(shù)據(jù)存儲(chǔ)類型51系列單片機(jī)程序設(shè)計(jì)

3.特殊功能寄存器的定義

在51單片機(jī)內(nèi)部RAM的高128字節(jié),分散著21個(gè)特殊功能寄存器(SFR),為了能直接訪問這些特殊功能寄存器,KEILC51提供一種自主形式的定義方法,此種方法與標(biāo)準(zhǔn)C語言不兼容,只適用于對8051系列單片機(jī)進(jìn)行定義。這種定義的方法引入關(guān)鍵字“sfr”,如:

sfrTMOD=0x89;/*定時(shí)/計(jì)數(shù)器方式控制寄存器地址為89H*/。sbit:特殊功能位聲明,sbitled1=P1^0;4.4.2C51數(shù)據(jù)類型51系列單片機(jī)程序設(shè)計(jì)將其視為片外數(shù)據(jù)存儲(chǔ)器的一個(gè)單元,利用#define語句進(jìn)行定義:#definePORTAXBYTE[0x0020] /*將PORTA定義為外部I/O口,地址為0x0020*/例:要通過地址0x0020向外部寫數(shù)據(jù)0x01,下面分別用匯編語言和C語言編程實(shí)現(xiàn):匯編語言實(shí)現(xiàn): MOVDPTR,#0020H MOVA,#01H MOVX@DPTR,AC語言實(shí)現(xiàn):#definePORTAXBYTE[0x0020] PORTA=0x01;4.4.2C51數(shù)據(jù)類型4.片外擴(kuò)展I/O口51系列單片機(jī)程序設(shè)計(jì)

C51的運(yùn)算符主要包括算術(shù)運(yùn)算、關(guān)系運(yùn)算、邏輯運(yùn)算、位操作運(yùn)算、自增減運(yùn)算及復(fù)合運(yùn)算等。其運(yùn)算符與表達(dá)式與C語言要求基本一致。4.4.3C51運(yùn)算符和表達(dá)式4.4.2C51數(shù)據(jù)類型51系列單片機(jī)程序設(shè)計(jì)4.4.3C51運(yùn)算符和表達(dá)式運(yùn)算符分類運(yùn)算符表達(dá)式示例優(yōu)先關(guān)系(高→低)算術(shù)運(yùn)算符*乘法/除法%求余+加法或正值-減法或負(fù)值a+b;(a+b)*c;!算術(shù)運(yùn)算符關(guān)系運(yùn)算符邏輯運(yùn)算符賦值運(yùn)算符關(guān)系運(yùn)算符<小于>大于<=小于或等于>=大于或等于==測試等于!=測試不等于c>(a+b)a==b<c邏輯運(yùn)算符&&邏輯與||邏輯或!邏輯非c=a&&bb=!a位操作運(yùn)算符&按位與|按位或^按位異或~按位取反<<位左移>>位右移c=a&ba=b<<1自增減運(yùn)算符++自加1--自減1++ii++復(fù)合運(yùn)算符算術(shù)運(yùn)算符及位操作運(yùn)算符復(fù)合使用i+=351系列單片機(jī)程序設(shè)計(jì)C語言程序主要有順序、選擇和循環(huán)三種結(jié)構(gòu)。順序結(jié)構(gòu)即語句逐條執(zhí)行,是最基本、最簡單的程序結(jié)構(gòu)。選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的相關(guān)控制語句分別介紹如下:

1.選擇結(jié)構(gòu)語句及流程圖在選擇結(jié)構(gòu)中常見的控制語句有:if,elseif,switch-case。其中if、elseif主要應(yīng)用在串行多分支結(jié)構(gòu)程序控制中,而switch-case主要用于并行從分去結(jié)構(gòu)程序的控制中。圖4-3所示為串行多分支結(jié)構(gòu)流程圖。

4.4.4C51流程控制語句4.4面向51單片機(jī)的C語言程序51系列單片機(jī)程序設(shè)計(jì)圖4-3串行多分支結(jié)構(gòu)流程圖串行多分支結(jié)構(gòu)51系列單片機(jī)程序設(shè)計(jì)語句的基本形式:

1)if(表達(dá)式){語句;}//當(dāng)括號(hào)內(nèi)的表達(dá)式為真,則執(zhí)行{}內(nèi)的語句;

2)if(表達(dá)式){語句1;}else{語句2;}//當(dāng)括號(hào)內(nèi)的表達(dá)式為真,則執(zhí)行{}內(nèi)的語句,否則執(zhí)行語句2;

3)if(表達(dá)式1){語句1;}

elseif(表達(dá)式2){語句2;}

…………

else{語句n;}

//哪一個(gè)表達(dá)式條件為真,則執(zhí)行對應(yīng){}中的語句,但判斷時(shí)表達(dá)式1的優(yōu)先級(jí)最高,只有條件不滿足時(shí),才繼續(xù)向下判斷。

4)if(表達(dá)式1)

{if(表達(dá)式2){語句1;}

else{語句2;}

}

//if的嵌套使用,只有當(dāng)表達(dá)式1為真時(shí),才進(jìn)行下一級(jí)判斷。

1.選擇結(jié)構(gòu)語句及流程圖51系列單片機(jī)程序設(shè)計(jì)

并行多分支結(jié)構(gòu)圖4-4并行多分支結(jié)構(gòu)流程圖51系列單片機(jī)程序設(shè)計(jì)switch-case語句表達(dá)形式:

switch(表達(dá)式1)

{

case值1:語句1;break;

case值2:語句2;break;

…………

case值N:語句N;break;

default:語句N+1;

}

1.選擇結(jié)構(gòu)語句及流程圖4.4.4C51流程控制語句51系列單片機(jī)程序設(shè)計(jì)2.循環(huán)結(jié)構(gòu)語句及流程圖

循環(huán)結(jié)構(gòu)中常見的控制語句主要有while,dowhile,for等。

While語句的一般形式為:while(條件){語句;},圖4-5while結(jié)構(gòu)流程圖4.4.4C51流程控制語句51系列單片機(jī)程序設(shè)計(jì)

與while相比,dowhile的區(qū)別就是行執(zhí)行循環(huán)語句后判斷循環(huán)條件。語句的形式為:do{語句;}while(條件)。流程圖如圖4-6所示。

圖4-6dowhile結(jié)構(gòu)流程圖4.4.4C51流程控制語句2.循環(huán)結(jié)構(gòu)語句及流程圖51系列單片機(jī)程序設(shè)計(jì)for(表達(dá)式1;表達(dá)式2;表達(dá)式3) {語句;},for語句在執(zhí)行時(shí)共有5個(gè)過程,具體執(zhí)行過程如下:

對表達(dá)式進(jìn)行賦值初始化

判斷表達(dá)式2是否為真,若為真則進(jìn)行循環(huán),若為假則退出循環(huán)

若表達(dá)式2為真,則執(zhí)行循環(huán)體內(nèi)的語句,并求解表達(dá)式3

回到第二步,再判斷表達(dá)式2

退出for循環(huán)4.4.4C51流程控制語句2.循環(huán)結(jié)構(gòu)語句及流程圖51系列單片機(jī)程序設(shè)計(jì)

51單片機(jī)內(nèi)部資源主要是特殊功能寄存器或SFR尋址,在KEILC51中提供了定義這些寄存器的頭文件<reg51.h>,在進(jìn)行C語言編程,應(yīng)在源程序的開始處包含頭文件,#include<reg51.h>。內(nèi)部資源的C語言編程主要介紹外中斷、定時(shí)器和串行口編程。

C51編譯器支持在C源程序中直接開發(fā)中斷程序,采用特殊語法定義中斷函數(shù),定義方法如下:返回值函數(shù)名interruptnusingmn代表單片機(jī)的中斷編號(hào),n的范圍(0—4)依次為外部中斷0、定時(shí)/計(jì)數(shù)器0、外部中斷1、定時(shí)/計(jì)數(shù)器1、串行口中斷。m表示通用寄存器組的的選擇,范圍(0-3)。4.4.5單片機(jī)資源與C語言編程51系列單片機(jī)程序設(shè)計(jì)

4.4.6C語言程序?qū)嵗?/p>

在進(jìn)行單片機(jī)的C語言編程時(shí),其步驟與匯編語言編程沒有區(qū)別,首先要了解單片機(jī)系統(tǒng)硬件電路的設(shè)計(jì),尤其單片機(jī)的外部資源的地址編碼,當(dāng)了解了單片機(jī)系統(tǒng)的硬件電路后,就可以根據(jù)要求畫出流程圖,合理分配內(nèi)部資源進(jìn)行編程,下面以一個(gè)數(shù)據(jù)采集的實(shí)例進(jìn)行說明。51系列單片機(jī)程序設(shè)計(jì)

圖4-7為ADC0809與51系列單片機(jī)(89S51)的接口電路原理圖,要求順序采集ADC0809的8個(gè)通道的模擬量,并存放在數(shù)組ADCON[]中

圖4-7單片機(jī)數(shù)據(jù)采集原理圖51系列單片機(jī)程序設(shè)計(jì)

由電路原理圖可以看到,ADC0809的啟動(dòng)信號(hào)START由譯碼器Y1與單片機(jī)RD信號(hào)經(jīng)或非門產(chǎn)生,輸出使能信號(hào)OE由Y1與單片機(jī)WR信號(hào)經(jīng)或非門產(chǎn)生,3/8譯碼器的輸入接到P2.5至P2.7,ADC0809的通道選擇信號(hào)接到單片機(jī)的地址線A0至A2,因此得到ADC0809的8個(gè)輸入通道的地址為2000H—2007H,ADC0809轉(zhuǎn)換結(jié)束標(biāo)志EOC經(jīng)非門后接到單片機(jī)的P3.2口。

51系列單片機(jī)程序設(shè)計(jì)C51源程序如下:

#include<reg51.h> //包含頭文件

#include<absacc.h> #defineucharunsignedchar #defineIN0XBYTE[0x2000]//設(shè)置ADC0809通道0的地址

sbitad_over=P3^2; //轉(zhuǎn)換結(jié)束標(biāo)志定義

voidad0809(ucharidata*x)//采集函數(shù)

{ uchari; ucharxdata*ad_adr; ad_adr=&IN0; for(i=0;i<8;i++) //循環(huán)采集8個(gè)通道

{*ad_adr=0; //啟動(dòng)AD while(ad_over==0); //查詢轉(zhuǎn)換結(jié)束標(biāo)志

x[i]=*ad_adr; //存儲(chǔ)結(jié)果

ad_adr++; //下一通道

} } voidmain(void) //主函數(shù)

{staticucharad[10]; ad0809(ad); }51系列單片機(jī)程序設(shè)計(jì)51系列單片機(jī)程序設(shè)計(jì)#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitD0=P1^0;uinta;voidmain(){

D0=0; a=59000; while(a--); D0=1; a=50000; while(a--); }51系列單片機(jī)程序設(shè)計(jì)#include<AT89X51.h>delay_10ms(unsignedt){unsignedinti,j;for(i=0;i<t;i++) for(j=0;j<1880;j++);}voidmain(){while(1){ delay_10ms(100); P0=0xfe; delay_10ms(100); P0=0xfd; delay_10ms(100); P0=0xfb; Delay_10ms(100); P0=0xf7; delay_10ms(100); P0=0xef; delay_10ms(100); P0=0xdf; delay_10ms(100); P0=0xbf; delay_10ms(100); P0=0x7f;}}51系列單片機(jī)程序設(shè)計(jì)#include<reg52.h> //52系列單片機(jī)頭文件#defineuintunsignedint //宏定義#defineucharunsignedcharvoiddelayms(uint); //聲明子函數(shù)ucharx; //聲明無符號(hào)數(shù)原變量x(占1B)voidmain() //主函數(shù){ P1=0xfe; //賦初值11111110 while(1) //大循環(huán)

{ for(x=0;x<8;x++) //左移8次

{delayms(500);//延時(shí)500毫秒

P1=P1<<1;//左移1位

} //左移結(jié)束,燈全部亮

for(x=0;x<8;x++) //右移8次

{delayms(500); P1=P1>>1|0x80; //右移1位,并設(shè)定最高位為1 } //右移結(jié)束,燈全部滅

}51系列單片機(jī)程序設(shè)計(jì)無論是單片機(jī)匯編語言還是C語言編程,都需要借助一個(gè)軟件工具,一般也稱為開發(fā)環(huán)境,目前有很多專業(yè)的單片機(jī)軟件開發(fā)工具,下面為讀者介紹一種單片機(jī)的集成開發(fā)環(huán)境,KeiluVision2集成開發(fā)環(huán)境。KeilμVision2集成開發(fā)環(huán)境是德國Keil公司針對51系列單片機(jī)應(yīng)用系統(tǒng)開發(fā)而推出的基于32位windows環(huán)境下,以51單片機(jī)為開發(fā)目標(biāo),以高效率C語言為基礎(chǔ)的集成開發(fā)平臺(tái)。本節(jié)主要介紹KeilC51V7.20版,它主要包括C51交叉編譯器和A51宏匯編等工具,還內(nèi)嵌了單片機(jī)仿真調(diào)試軟件,可以讓用戶采用模擬仿真和實(shí)時(shí)在線仿真兩種方式對目標(biāo)系統(tǒng)進(jìn)行開發(fā)。軟件仿真時(shí),它可以查看程序變量,內(nèi)部存儲(chǔ)單元。以及模擬和查看單片機(jī)I/O口,定時(shí)器及中斷的工作方式和設(shè)置,甚至可以仿真單片機(jī)的串行通信。4.5KeilμVsion2集成開發(fā)環(huán)境51系列單片機(jī)程序設(shè)計(jì)

雙擊安裝程序setup,進(jìn)入安裝模式。它與一般軟件安裝過程類似。值得注意的是,當(dāng)出現(xiàn)提示“InstallSupport....全新安裝”和“UpdateCurrentInstallation……升級(jí)安裝”時(shí),選擇“InstallSupport....全新安裝”。并且在出現(xiàn)提示“Fullversion”和“Evalversion”時(shí),選擇“Fullversion”。隨后依次點(diǎn)擊“Next->Yes->選擇安裝目錄->Next->”輸入序列號(hào)、姓名、公司”等。安裝完成后在Windows桌面上會(huì)出現(xiàn)一個(gè)KeilμVision2的圖標(biāo)。4.5.1KeiluVsion2安裝51系列單片機(jī)程序設(shè)計(jì)在KeiluVsion2支持下開發(fā)單片機(jī)應(yīng)用系統(tǒng)軟件,一般需要經(jīng)過以下的幾個(gè)過程:創(chuàng)建工程→工程選項(xiàng)卡設(shè)置→新建源文件→添加源文件到工程→編譯→仿真調(diào)試→下載。4.5.2KeilμVsion2的使用51系列單片機(jī)程序設(shè)計(jì)(1)KeilC51μVision2界面與工程創(chuàng)建(如圖4-8)圖4-8KeilC51μVision2的工作界面51系列單片機(jī)程序設(shè)計(jì)

創(chuàng)建一個(gè)新工程,首先須在菜單欄“Project”菜單中選擇“NewProject”選項(xiàng)(補(bǔ)充圖1),此時(shí)會(huì)彈出“創(chuàng)建新工程”對話框(補(bǔ)充圖2),可填入工程名,隨后單擊保存。

創(chuàng)建新工程—補(bǔ)充圖151系列單片機(jī)程序設(shè)計(jì)

保存工程項(xiàng)目(Test)—補(bǔ)充圖251系列單片機(jī)程序設(shè)計(jì)

接著出現(xiàn)選擇單片機(jī)芯片型號(hào)對話框(補(bǔ)充圖3)。本例選擇<Atmel—AT89C51>單片機(jī),隨后點(diǎn)擊“確定”,新工程創(chuàng)建即告完成。

選擇芯片型號(hào)—補(bǔ)充圖3

51系列單片機(jī)程序設(shè)計(jì)建立源程序文檔—補(bǔ)充圖451系列單片機(jī)程序設(shè)計(jì)點(diǎn)擊保存按鈕—補(bǔ)充圖551系列單片機(jī)程序設(shè)計(jì)圖4-9源程序文檔加入所建工程項(xiàng)目中51系列單片機(jī)程序設(shè)計(jì)圖4-10工程文件設(shè)置51系列單片機(jī)程序設(shè)計(jì)Target選項(xiàng)卡設(shè)置—補(bǔ)充圖651系列單片機(jī)程序設(shè)計(jì)Output選項(xiàng)卡的設(shè)置—補(bǔ)充圖7

51系列單片機(jī)程序設(shè)計(jì)

保存文件格式—補(bǔ)充圖8(練習(xí).A)51系列單片機(jī)程序設(shè)計(jì)添加源程序—補(bǔ)充圖951系列單片機(jī)程序設(shè)計(jì)設(shè)定完成后單擊“確定”返回主界面,工程文件設(shè)置完畢。當(dāng)工程建立并設(shè)置完成之后,接下來就可以對工程進(jìn)行編輯(源程序文本)。以下面簡單的匯編源程序?yàn)槔?/p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論