官术网_书友最值得收藏!

任務(wù)一 點亮一個LED燈

任務(wù)描述

編寫一個單片機程序,讓P1口發(fā)光二極管全滅,然后點亮P1.0的發(fā)光二極管,并下載到實驗板運行。

實驗板上發(fā)光二極管的連接圖如圖1-1所示,實驗板上的發(fā)光二極管通過電阻直接連接到單片機P1端口,當(dāng)引腳輸出高電平時發(fā)光二極管導(dǎo)通發(fā)光,當(dāng)引腳輸出低電平時發(fā)光二極管熄滅。

針對目前的單片機這種連接方法可以實現(xiàn)發(fā)光二極管點亮,但是發(fā)光亮度較低,因此工程上一般用發(fā)光二極管的負(fù)極接入單片機引腳,如圖1-2所示,單片機吸收電流點亮發(fā)光二極管,這時單片機基本能具備使發(fā)光二極管正常發(fā)光的驅(qū)動電流,此時單片機輸出低電平發(fā)光二極管點亮,輸出高電平則發(fā)光二極管熄滅。

任務(wù)分析

本任務(wù)的目的是學(xué)會:①如何使用單片機控制發(fā)光二極管;②學(xué)習(xí)匯編編寫慣例格圖1-1 實驗板上發(fā)光二極管的連接圖

圖1-2 發(fā)光二極管的一種連接圖

式;③學(xué)習(xí)幾個常見匯編指令;④編寫一個程序控制單片機點亮發(fā)光二極管。

任務(wù)實施

一、認(rèn)識單片機

(一)單片機的內(nèi)部資源

單片機芯片如圖13所示,把編寫的程序下載到芯片中就能實現(xiàn)對其的控制。實際上主要控制芯片的輸入/輸出引腳的電平,即我們要求哪個引腳的電平在什么時刻變高/變低,這個引腳的電平就會在那個時刻變高/變低。

那么,程序在哪里寫?怎么寫?寫完后怎么下載到單片機里去?下載進去后,什么條件才能工作?我們可以用單片機做什么?這些問題就是本課程的學(xué)習(xí)內(nèi)容。

首先,單片機由中央處理器(CPU)、數(shù)據(jù)存

儲器(RAM)、程序存儲器(ROM)、定時器、通

信口、輸入/輸出接口組成。類似于PC機,CPU負(fù)責(zé)運算、控制,加、減、乘、除、與、或、非等運算,讀、寫、輸入、輸出等控制,都是用復(fù)

圖1-3 單片機芯片

雜的數(shù)字電路實現(xiàn);RAM相當(dāng)于內(nèi)存條,CPU在運算過程中總會要臨時存放一些中間數(shù)據(jù),RAM提供了這些數(shù)據(jù)的存放空間,所以又稱為數(shù)據(jù)存儲器,斷電后數(shù)據(jù)丟失;ROM相當(dāng)于硬盤,編寫好的程序最后放在ROM中,所以又稱為程序存儲器,斷電后數(shù)據(jù)不丟失;接口簡單地看就是引腳,通過引腳,單片機可以輸出電平,也可檢測這個引腳當(dāng)前連接的電平狀態(tài),通過電平輸入輸出來實現(xiàn)鍵盤、顯示器、通信等設(shè)備的控制。

單片機內(nèi)部可供用戶使用的三大資源:

(1)ROM。其特點是可重復(fù)擦寫程序、容量大、價格低。

(2)RAM。其特點是讀寫速度快、理論上壽命無限(程序運行的每時每刻都在讀寫中間數(shù)據(jù))。

(3)SFR(特殊功能寄存器)。單片機有很多功能,通過對SFR的讀寫來實現(xiàn)這些功能。

單片機內(nèi)部資源的3個主要部分清楚后,選擇AT89C51單片機來進行詳細(xì)學(xué)習(xí)。AT89C51單片機是Atmel公司出品的一款51內(nèi)核的單片機,具有標(biāo)準(zhǔn)的51體系結(jié)構(gòu)和全部的51 標(biāo)準(zhǔn)功能,程序下載方式簡單,方便學(xué)習(xí)。它的ROM程序空間是4K 字節(jié)

(1K=1024 字節(jié),1 字節(jié)=8 位),RAM 數(shù)據(jù)空間是128 字節(jié),SFR在后邊將會逐一提

到并應(yīng)用。

(二)單片機最小系統(tǒng)

單片機最小系統(tǒng),也稱為單片機最小應(yīng)用系統(tǒng),是指用最少的元件組成的能工作的單片機系統(tǒng)。單片機最小系統(tǒng)的三要素是電源、晶振和復(fù)位電路,最小系統(tǒng)電路如圖1-4所示。

1.電源

電子設(shè)備都需要供電,主流單片機的電源有5V和3.3V兩個標(biāo)準(zhǔn),還有一些對電壓要求更低的單片機系統(tǒng)。從圖1-4可以看到,供電電路在40 腳和20腳的位置上,40腳接UCC,代表電源的正極,20腳接GND,代表電源的負(fù)極。一般情況下,這種雙列直插封裝的芯片,左上角是1腳,逆時針旋轉(zhuǎn)引腳號依次增加,一直到右上角是最大腳位。現(xiàn)在選用的單片機一共40 個引腳,因此右上角就是40,單片機引腳圖如圖1-5所示。

圖1-4 單片機最小系統(tǒng)電路

圖1-5 單片機引腳圖

圖1-6 單片機系統(tǒng)典型晶振電路

2.晶振

晶振又叫晶體振蕩器,為單片機系統(tǒng)提供基準(zhǔn)時鐘信號,單片機控制都是以這個時鐘信號為基準(zhǔn)。圖1-5所示這種雙列直插封裝的單片機的18腳和19腳是晶振的引腳,通

常接一個11.0592M的晶振(震蕩11,059,200次/s),晶振兩端接兩個諧振電容,一般

大小為20~30pF左右,諧振電容過大晶振不容易振蕩,過小則晶振不穩(wěn)定。典型晶振電路如圖1-6所示。

3.復(fù)位電路

圖1-4左側(cè)是一個復(fù)位電路,接在單片機的9腳RST(Reset)復(fù)位引腳上,只要RST一定時間內(nèi)保持高電平,單片機復(fù)位,所有程序重新開始執(zhí)行。單片機復(fù)位一般有上電復(fù)位、手動復(fù)位和程序自動復(fù)位3種情況。

(1)上電復(fù)位。當(dāng)程序還沒運行完突然停電了,單片機內(nèi)部有些區(qū)域的中間數(shù)據(jù)會丟失,有些區(qū)域的中間數(shù)據(jù)保存了下來,當(dāng)再次打開設(shè)備(上電)時,希望單片機能正常運行,所以上電后單片機要進行一個內(nèi)部的初始化過程,這個過程即為上電復(fù)位。上電復(fù)位保證單片機每次啟動都從一個固定的相同的狀態(tài)開始工作。

(2)手動復(fù)位。當(dāng)單片機死機或程序跑飛時,按下復(fù)位按鍵,使程序重新初始化并重新運行,這個過程就叫手動復(fù)位。

(3)程序自動復(fù)位。單片機往往有一套自動復(fù)位機制,例如看門狗,如果程序長時間失去響應(yīng),單片機看門狗模塊會自動復(fù)位重啟單片機。

單片機具備電源、晶振、復(fù)位3個條件就可以運行下載的程序,通過程序就能控制連接在單片機I/O口的外部設(shè)備,如LED燈、數(shù)碼管、液晶顯示器等設(shè)備。

這里再補充一點輸入/輸出端口(I/O口)的知識,如圖1-4所示,單片機共有P0、

P1、P2、P3 4個輸入/輸出端口。P0口占用8個引腳P0.0~P0.7,P0.7是高位,P0口

為一個8位漏級開路雙向I/O口,這決定了P0口作為固定電平輸出時需要接上拉電阻。P1、P2、P3口這三大端口也各占用8個引腳,每個引腳內(nèi)部提供上拉電阻,是一個8位雙向I/O口。這些端口作為輸入時需要在端口寫入“1”,被內(nèi)部上拉為高電平,即先輸出高電平一次才可用作輸入。P3口也可作為一些特殊功能口,見表1-1。

表1-1

P3口特殊功能

多功能口并不局限于P3口,一些單片機幾乎每個引腳都是多功能的,編程使用時根據(jù)需要使用一種功能。

二、指令系統(tǒng)

51單片機的指令集包括數(shù)據(jù)傳送指令、算術(shù)運算指令、邏輯運算指令、位運算指令和控制轉(zhuǎn)移指令五大類共111條指令,這111條指令的集合即為51單片機的指令系統(tǒng),每條指令都有一個唯一的名稱,即助記符,便于記憶與書寫。除位運算以外,指令都是以字節(jié)為單位,因此也統(tǒng)稱為字節(jié)運算指令。根據(jù)指令的長短可分為單字節(jié)指令、雙字節(jié)指令和三字節(jié)指令,根據(jù)執(zhí)行的時間來分可分為單周期指令、雙周期指令和四周期指令。(一)匯編語言尋址方式

一條指令通常由操作碼和地址碼兩部分組成。操作碼指明CPU要完成何種類型和性質(zhì)的操作,如數(shù)據(jù)轉(zhuǎn)移、加法、取反等。地址碼指明操作對象所在單元地址,通過地址碼找到操作數(shù)的方法稱為尋址方式,51單片機支持6種不同的尋址方式。由于51單片機運算器的特有結(jié)構(gòu),CPU所有的字節(jié)運算都有A寄存器的參與,因此每條字節(jié)運算指令的地址碼中不會再包含A寄存器的地址。

1.直接尋址方式

直接尋址是在指令中直接給出操作數(shù)所在的單元地址,指令執(zhí)行時,直接在RAM中的該單元地址讀取操作數(shù)據(jù),例如“MOV A,12H”是將RAM中12H存儲單元的值賦予A。直接尋址僅限于內(nèi)部RAM(包括特殊功能寄存器)進行尋址,對于具有高128字節(jié)與特殊功能寄存器地址重復(fù)的存儲區(qū)間,只能使用間接方式尋址。

2.寄存器尋址方式

寄存器尋址是在指令中給出操作數(shù)所在的寄存器,范圍是從R0~R7,他們在RAM

中的地址是由PSW中RS1、RS0兩個位決定。例如“MOV A,R1”當(dāng)RS1RS0=00時,“MOV A,R1”與“MOV A,01H”的運行結(jié)果是一樣的,即R0當(dāng)前指向地址為01H

的存儲單元。

3.立即尋址方式

立即尋址是在指令中直接給出操作數(shù),一般把這個操作數(shù)稱為立即數(shù)。例如“MOV A,#2BH”表示將2BH這個立即數(shù)賦予A。因為立即數(shù)不會憑空出現(xiàn),所以2BH是存放于ROM中的常量。顯然,這里的尋址“尋”的不是RAM,而是ROM。51單片機指令系統(tǒng)中還有一條16位立即尋址指令“MOV DPTR,#data16”,其功能是將16位立即數(shù)賦予數(shù)據(jù)指針DPTR。

4.間接尋址方式

間接尋址是將寄存器的內(nèi)容作為單元地址,再通過該單元地址去找操作數(shù)的尋址方式,這里的寄存器稱為間接尋址寄存器,只能用R0或R1。例如指令“MOVA,@R0”,其功能就是將R0的內(nèi)容所指向的存儲單元的數(shù)據(jù)賦予A。例如R0=12H,(12H)=

34H,那么指令“MOV A,12H”或“MOV A,#34H”與上面的指令執(zhí)行后的結(jié)果一

樣,A都為34H。另外,間接尋址還用于高128字節(jié)空間(80H~FFH)的尋址任務(wù)。

5.變址尋址方式

變址尋址與間接尋址有點類似,變址尋址是以DPTR或PC為基址寄存器,以A為變址寄存器,將兩者相加后的16位數(shù)結(jié)果作為操作數(shù)所在單元地址。變址尋址只能對程

序存儲器ROM使用,尋址范圍為64K(0000H~FFFFH)。例如“MOVC A,@A+

DPTR”該指令功能是將A與DPTR的內(nèi)容相加,把結(jié)果作為程序存儲器的單元地址,

再將該單元的內(nèi)容賦予A。如A=12H、DPTR=1A2BH,那么將A與DPTR相加后的值為A+DPTR=12H+1A2BH=1A3DH,而例如ROM的1A3DH存儲單元存放的數(shù)據(jù)

為2FH,那么執(zhí)行完上面的指令后A的結(jié)果為2FH。

6.位尋址方式

51單片機具有完善的位處理功能,因此具有相應(yīng)的位尋址方式,用于內(nèi)部可尋址位的尋址操作。在RAM中位于20H~2FH區(qū)間內(nèi)的16個存儲單元以及部分特殊功能寄存器可進行位尋址操作,尋址區(qū)間00H~D7H,詳見RAM地址映像表。在位尋址指令中,如“MOV C,12H”表示將位地址為12H的內(nèi)容賦予C累加位。

實際上,上面所講的6種尋址方式的相應(yīng)指令舉例中,有許多是包含了兩種尋址方式的,如指令“MOV12H,#34H”就包含了直接尋址與立即尋址兩種方式,其功能是將34H這個立即數(shù)賦給地址為12H的存儲單元,指令執(zhí)行完后,12H地址單元中的內(nèi)容為34H。

(二)匯編語言偽指令

匯編語言偽指令用于告訴編譯程序匯編信息的指令,它不會被匯編成單片機可執(zhí)行的機器代碼,匯編結(jié)束后它們就消失了。下面僅對常用的幾個偽指令進行介紹。

1.程序的定位結(jié)束偽指令

◆ ORG addr16

說明:將ORG偽指令后的指令內(nèi)容存放于程序存儲器addr16開始的單元中。例如:

ORG 1234H

MOV A,#56H…

表示將“MOV A,#56H”這條指令開始的一段代碼存放在以1234H地址單元開始的程序存儲器中,MOV指令的起始ROM地址剛好為1234H。

◆ END

說明:匯編程序結(jié)束指令,后面不跟操作數(shù)。表示匯編源程序的結(jié)束,編譯程序以END作為程序源代碼終止標(biāo)志。通常將其放置于源程序最后,當(dāng)編譯程序執(zhí)行到END指令時,隨即結(jié)束匯編過程。

2.常量定義偽指令EQU指令格式為:

符號名 EQU 常量

說明:用于定義常量,經(jīng)過EQU指定的常量,可在程序中直接用其符號名來代替。例如:

MIN EQU 12

使用MIN代替十進制數(shù)12。嚴(yán)格來說EQU不算是常量定義,因為在編譯器執(zhí)行時是不會給常量分配存儲空間的,在編譯時直接將符號名替換成數(shù)字量,例如:

TMP EQU 34H

MOV TMP,#TMP

上面第二條指令中,第一個TMP代表的是地址,第二個TMP代表的是數(shù)據(jù),在編

譯時編譯器將TMP替換成34H,結(jié)果變成“MOV34H,#34H”,即將立即數(shù)34H賦給

RAM地址為34H的存儲單元。

用法:當(dāng)程序中有多條指令使用到同一個數(shù)字量時,便可使用EQU進行常量定義,在后續(xù)源碼中使用其符號名代替,方便后期維護,因為只要在定義指令中對常量進行修改,就可以實現(xiàn)對所有涉及常量的指令進行修改。

3.數(shù)據(jù)池定義DB指令格式:

DB 表達式

說明:用于在ROM中定義一個連續(xù)的存儲區(qū)間,區(qū)間長度根據(jù)DB指令的參數(shù)決定。表達式可以為數(shù)值(二進制、八進制、十進制或十六進制)、字符或字符串。多個表達式用英文逗號隔開。表達式為數(shù)值則每個表達式占用一個存儲單元,超出第8位部分將被舍棄;如為字符則為該字符的ASCII碼,同樣占用一個存儲單元;如為字符串則根據(jù)字符串的字符數(shù)依次分配存儲單元,每個字符占一個字節(jié)。例如:

DB 123,456,‘0’,12H,“AB”

上面的指令中將在ROM中開辟出6個字節(jié)的存儲單元。依次為123(7BH)、456(十

六進制為1CBH,將超出第8位的“1”舍棄,最終為0CBH)、30H、12H、65(41H)、66(42H)。

在DB指令前加標(biāo)簽可表示第一個存儲單元的地址。(三)匯編語言數(shù)據(jù)傳送指令

數(shù)據(jù)傳送指令的功能是將源操作數(shù)的數(shù)據(jù)復(fù)制到目標(biāo)操作數(shù)中,或者按要求交換指定操作數(shù)的內(nèi)容。8051的數(shù)據(jù)傳送指令共有28條,可分為5類。

1.數(shù)據(jù)復(fù)制指令

數(shù)據(jù)復(fù)制指令中具有兩個操作數(shù),第一操作數(shù)稱為目標(biāo)操作數(shù),第二操作數(shù)稱為源操作數(shù),數(shù)據(jù)復(fù)制指令格式見表1-2。

表1-2

數(shù)據(jù)復(fù)制指令格式

目標(biāo)操作數(shù)可以為RAM地址direct(直接尋址)、寄存器A、工作寄存器Rn、以間址寄存器Ri的內(nèi)容為地址(@Ri)的RAM單元和數(shù)據(jù)指針DPTR;源操作數(shù)可以為RAM地址direct里的內(nèi)容、寄存器ACC的值、工作寄存器Rn的內(nèi)容、以間址寄存器Ri

的內(nèi)容為地址(@Ri)的RAM單元內(nèi)容、8位立即數(shù)(#data)和16(#data16)位立

即數(shù)。

關(guān)于下面指令說明中不帶括號和帶括號的區(qū)別,例如R0、(R0)、((R0))。R0代表

當(dāng)前工作寄存器R0的RAM地址,假設(shè)RS1RS0=01B,運行時代表08H地址;(R0)表

示當(dāng)前工作寄存器R0里所存的內(nèi)容,是一個實際的8位二進制數(shù);((R0))表示以R0單元的內(nèi)容為地址的存儲單元的內(nèi)容,在運行期間也是一個8位數(shù)據(jù)。

◆ MOV A,direct

功能:將RAM地址為direct的單元內(nèi)容復(fù)制到 ACC寄存器中,即(direct)→10

(ACC)

例如:MOV A,12H

執(zhí)行前,(A)=8BH,存儲器地址為12H的單元內(nèi)容為34H,即(12H)=34H執(zhí)行后,(A)=34H,(12H)=34H

◆ MOV A,Rn

功能:將工作寄存器Rn的內(nèi)容復(fù)制到ACC中,即(Rn)→(ACC)例如:MOV A,R2

執(zhí)行前,(A)=8BH,(R2)=34H執(zhí)行后,(A)=34H,(R2)=34H◆ MOV A,#data

功能:將8位立即數(shù)data復(fù)制到ACC中,即data→(ACC)例如:MOV A,#34H

執(zhí)行前,(A)=8BH執(zhí)行后,(A)=34H

◆ MOV A,@Ri(i=0或1且只能取0或1)

功能:將以間接尋址工作寄存器Ri的內(nèi)容為地址的存儲單元內(nèi)容復(fù)制到ACC中,即

((Ri))→(ACC)

例如:MOV A,@R0

執(zhí)行前,(A)=8BH,(R0)=12H,(12H)=34H執(zhí)行后,(A)=34H,(R0)=12H,(12H)=34H◆ MOVRn,direct

功能:將RAM地址為direct的單元內(nèi)容復(fù)制到Rn中,即(direct)→(Rn)例如:MOVR5,12H

執(zhí)行前,(R5)=8BH,(12)=34H執(zhí)行后,(R5)=34H,(12)=34H◆ MOV Rn,A

功能:將ACC的內(nèi)容復(fù)制到Rn中,即(A)→(Rn)例如:MOV R6,AH

執(zhí)行前,(R6)=8BH,(A)=56H執(zhí)行后,(R6)=56H,(A)=56H◆ MOV Rn,#data

功能:將8位立即數(shù)data復(fù)制到Rn中,即data→(Rn)例如:MOV R7,#3FH

執(zhí)行前,(R7)=78H執(zhí)行后,(R7)=3FH◆ MOV direct,A

功能:將ACC寄存器中的內(nèi)容復(fù)制到RAM地址為direct的單元中,即(A)→

(direct)

例如:MOV 2FH,A

執(zhí)行前,(2FH)=3DH,(A)=17H執(zhí)行后,(2FH)=17H,(A)=17H◆ MOVdirect,#data

功能:將8位立即數(shù)data復(fù)制到RAM地址為direct的單元中,即data→(direct)例如:MOV2FH,#9AH

執(zhí)行前,(2FH)=1EH執(zhí)行后,(2FH)=9AH◆ MOV direct,Rn

功能:將工作寄存器Rn中的內(nèi)容復(fù)制到RAM地址為direct的單元中,即(Rn)→

(direct)

例如:MOV 2CH,R4

執(zhí)行前,(2CH)=4EH,(R4)=23H執(zhí)行后,(2CH)=23H,(R4)=23H◆ MOVdirect,@Ri

功能:將以間接尋址寄存器Ri的內(nèi)容為地址的RAM單元內(nèi)容復(fù)制到RAM地址為

direct的單元中,即((Ri))→(direct)

例如:MOV 2AH,@R0

執(zhí)行前,(2AH)=3BH,(R0)=20H,(20H)=78H執(zhí)行后,(2AH)=78H,(R0)=20H,(20H)=78H◆ MOVdirect1,direct2

功能:將RAM地址為direct2的單元的內(nèi)容復(fù)制到RAM地址為direct1的單元中,

即(direct2)→(direct1)

例如:MOV 12H,34H

執(zhí)行前,(12H)=30H,(34H)=20H執(zhí)行后,(12H)=20H,(34H)=20H◆ MOV@Ri,A

功能:將ACC的內(nèi)容復(fù)制到以間接尋址寄存器Ri的內(nèi)容為地址的RAM單元中,即

(A)→((Ri))

例如:MOV@R0,A

執(zhí)行前,(R0)=7FH,(7FH)=2CH,(A)=FCH執(zhí)行后,(R0)=7FH,(7FH)=FCH,(A)=FCH◆ MOV@Ri,direct

功能:將RAM地址為direct的單元內(nèi)容復(fù)制到以間接尋址寄存器Ri的內(nèi)容為地址

的RAM單元中,即(direct)→((Ri))

例如:MOV@R0,3CH

執(zhí)行前,(R0)=7FH,(7FH)=2CH,(3CH)=FCH執(zhí)行后,(R0)=7FH,(7FH)=FCH,(3CH)=FCH

◆ MOV@Ri,#data

功能:將立即數(shù)data復(fù)制到以間接尋址寄存器Ri的內(nèi)容為地址的RAM單元中,即

data→((Ri))

例如:MOV@R0,#7AH

執(zhí)行前,(R0)=3CH,(3CH)=FCH執(zhí)行后,(R0)=3CH,(3CH)=7AH◆ MOV DPTR,#data16

功能:將16位立即數(shù)data16的內(nèi)容復(fù)制到數(shù)據(jù)指針DPTR中,即data16→(DPTR)

例如:MOV DPTR,#3456H執(zhí)行前,DPTR=2000H

執(zhí)行后,DPTR=3456H

2.查表指令

功能:對存放在ROM中的數(shù)據(jù)表里的數(shù)據(jù)進行查找,以DPTR或PC為基址,A為變址寄存器,以基址與變址的和為地址,將該地址的內(nèi)容取出來送到A寄存器中,查表指令格式見表1-3。查表指令只有兩條。

表1-3

查表指令格式

基址寄存器為16的數(shù)據(jù)指針DPTR或者程序指針PC,變址寄存器只能為A寄存器,可尋址范圍64KB。讀取存放在ROM中的數(shù)據(jù),只能用助記符MOVC。

◆ MOVC A,@A+DPTR

功能:將在ROM中地址為A+DPTR的存儲單元的內(nèi)容讀取到A寄存器中,即

((A+DPTR))→(A)。

例如:MOVC A,@A+DPTR

執(zhí)行前,(A)=12H,(DPTR)=1F23H,(1F23H)=B8H,(1F35H)=56H執(zhí)行后,(A)=56H,(DPTR)=1F23H,(1F23H)=B8H,(1F35H)=56H◆ MOVCA,@A+PC

功能:將ROM地址為A+PC的存儲單元的內(nèi)容讀取到A寄存器中,即((A+PC))

→(A)

例如:MOVC A,@A+DPTR

執(zhí)行前,(A)=34H,(PC)=2C00H,(2C00H)=7AH,(2C34H)=36H執(zhí)行后,(A)=36H,(PC)=2C00H,(2C00H)=7AH,(2C34H)=36H

3.堆棧指令

功能:對堆棧區(qū)進行數(shù)據(jù)的存入和讀出操作,其操作數(shù)是包括特殊存儲器在內(nèi)的所有RAM地址單元。堆棧的入棧過程是先將堆棧指針SP加1,再將數(shù)據(jù)存入,因此實際棧底

單元為SP+1。

◆ PUSH direct

功能:先將SP加1,再將RAM地址為direct單元的內(nèi)容復(fù)制到SP所指向的單元

中,即SP+1→SP,(direct)→((SP))

例如:PUSH A

執(zhí)行前,(A)=2DH,(SP)=65H,(65H)=2AH,(66H)=71H執(zhí)行后,(A)=2DH,(SP)=66H,(65H)=2AH,(66H)=2DH◆ POPdirect

功能:先將SP所指向的存儲單元內(nèi)容復(fù)制到RAM地址為direct的存儲單元中,再

將SP減1,即((SP))→(direct),SP-1→SP

例如:POP A

指行前,(A)=2DH,(SP)=65H,(65H)=2AH,(64H)=71H執(zhí)行后,(A)=2AH,(SP)=64H,(65H)=2AH,(64H)=71H

除了上面所講的3類數(shù)據(jù)傳送指令外,還有外部RAM訪問指令、數(shù)據(jù)交換指令兩類,由于使用頻率較低,故不作詳解。外部RAM訪問指令助記符只能用MOVX,共有4

條。數(shù)據(jù)交換指令助記符有XCH、XHCD、SWAP 3個共5條。

4.外部數(shù)據(jù)存儲器訪問指令

◆ MOVX A,@DPTR

;((DPTR))→(A)

◆ MOVX@DPTR,A

;(A)→((DPTR))

◆ MOVX A,@Ri

;((Ri))→(A)

◆ MOVX@Ri,A

;(A)→((Ri))

5.數(shù)據(jù)交換指令

◆ XCH A,Rn

;(A)?(Rn)

◆ XCHA,@Ri

;(A)?((Rn))

◆ XCHA,direct

;(A)?(direct)

◆ XCHDA,@Ri

;(A)30?(Rn)30

功能:將A寄存器內(nèi)容的低4位與((Ri))內(nèi)容的低4位交換

◆ SWAPA

;(A)30?(A)74

功能:將A寄存器內(nèi)容的低4位與高4位交換(四)匯編語言位操作指令

位操作指令可分為傳送指令、位運算指令和置位復(fù)位指令3類,其操作數(shù)為可位尋址存儲區(qū)或特殊功能寄存器中的某個位。

1.位數(shù)據(jù)復(fù)制指令

位傳送指令有兩條,用于將源操作位的值復(fù)制到目標(biāo)操作位中。

◆ MOV C,bit

功能:將可尋址位bit的值復(fù)制到位累加器C中,即(bit)→(C)

例如:MOVC,P1.2 14

執(zhí)行前,(C)=0,(P1.2)=1執(zhí)行后,(C)=1,(P1.2)=1◆ MOVbit,C

功能:將位累加器C中的值復(fù)制到可尋址位bit中,即(C)→(bit)

例如:MOV 6EH,CH

執(zhí)行前,(6EH)=0,(C)=1執(zhí)行后,(6EH)=1,(C)=1

位操作指令中沒有兩個可尋址位之間的復(fù)制指令,必須使用C作為中介來實現(xiàn)。例如要將37H位的值傳送到73H位中:

MOVC,37H MOV73H,C

2.位運算指令

位運算是指與、或、非運算,共有6條指令。

◆ ANL C,bit

功能:將C與bit位的值進行與運算后存入C中,即(C)∧(bit)→(C)例如:ANLC,P1.0

執(zhí)行前,(C)=1,(P1.0)=0執(zhí)行后,(C)=0,(P1.0)=0◆ ANLC,/bit

功能:將C與bit位取反后的值進行與運算后存入C中,即(C)∧(/bit)→(C)例如:ANLC,P1.0

執(zhí)行前,(C)=1,(P1.0)=0執(zhí)行后,(C)=1,(P1.0)=0◆ ORLC,bit

功能:將C與bit位的值進行或運算后存于C中,即(C)∨(bit)→(C)例如:ORLC,P1.2

執(zhí)行前,(C)=0,(P1.2)=1執(zhí)行后,(C)=1,(P1.2)=1◆ ORLC,/bit

功能:將C與bit位取反后的值進行或運算后存入C中,即(C)∨(/bit)→(C)例如:ORLC,P1.3

執(zhí)行前,(C)=0,(P1.3)=1執(zhí)行后,(C)=0,(P1.3)=1◆ CPLC

功能:將C位的值取反后存回C中,即(/C)→(C)

◆ CPL bit

功能:將bit位取反后賦予存回bit位中,即(/bit)→(bit)例如:CPLP1.3

執(zhí)行前,(P1.3)=1執(zhí)行后,(P1.3)=0

3.置位復(fù)位指令

置位復(fù)位指令是將目標(biāo)位置1或清零,共4條指令。

◆ SETB C

功能:無論之前位狀態(tài)如何,將C位置1,即“1”→(C)

◆ SETB bit

功能:無論之前位狀態(tài)如何,將bit位置1,即“1”→(bit)◆ CLRC

功能:無論之前位狀態(tài)如何,將C位的狀態(tài)清零,即“0”→(C)

◆ CLR bit

功能:無論之前位狀態(tài)如何,將bit位的狀態(tài)清零,即“0”→(bit)

前面學(xué)習(xí)了部分匯編語言指令,通過編寫控制單片機引腳電平的程序來控制P0、P1、P2、P3 4個端口的輸出,見表1-4,就可以控制LED燈的點亮和熄滅了。

表1-4

電平對應(yīng)表

編寫控制單片機引腳電平的基本方法如下。對某個引腳電平單獨控制的指令:

輸出高電平:SETB PX.X

例如:讓P1.3輸出為高電平的指令是:SETBP1.3輸出低電平:CLRPX.X

例如:讓P3.2輸出為低電平的指令是:CLR P3.2

對某個端口輸出集體控制的指令:

輸出某個數(shù):MOV PX,#XXH

例如:讓P1輸出5CH的指令是:MOVP1,#5CH

三、編程實現(xiàn)P1.0的LED燈點亮(一)單片機的開發(fā)環(huán)境

在51系列單片機的源代碼開發(fā)工具中,目前使用最廣泛的是Keil開發(fā)套件,同時支持匯編語言與C語言,包含了編譯器、宏匯編、連接器、庫管理和仿真調(diào)試器等在內(nèi)的

完整開發(fā)方案。目前使用較為普遍的有μVision2、μVision3、μVision4 3個版本,本書采用Keil μVision3進行學(xué)習(xí)開發(fā)。

對于一個開發(fā)目標(biāo),Keil是以project(工程、項目)的概念來管理的,里面包括了項目的配置、源碼、說明、連接的庫等信息。因此,在使用Keil時先建立一個工程,首先打開Keil圖標(biāo)進入軟件主界面。Keil軟件界面如圖1-7所示。

圖1-7 Keil軟件界面

主界面中包括菜單欄、工具欄、編輯窗口、工程窗口與信息欄。Keil是美國公司開發(fā)的,因此圖形界面為英文。

(二)建立一個工程項目

(1)單擊“Project”菜單,在彈出的下拉菜單中選中“New Project”選項。窗口如

圖1-8所示。

圖1-8 Keil新建項目

(2)在彈出的窗口中選擇要保存的路徑,輸入工程文件的名字,例如保存到“F:\單片機學(xué)習(xí)”目錄里,工程文件的名字為“LED”,然后單擊保存,保存窗口如圖19所示。

(3)這時會彈出一個對話框,要求選擇單片機的型號。Keil幾乎支持所有51內(nèi)核的單片機,這里選擇 Atmel公司的

圖1-9 新建LED.uv2項目

AT89C51,選擇單片機型號窗口如圖110

所示,右欄是對該單片機的基本說明,然后單擊確定。

圖1-10 選擇合適的單片機型號

(4)然后彈出一個對話框,問是否將8051的標(biāo)準(zhǔn)啟動庫添加到新建的工程里,這個庫文件對目前使用的匯編工程暫不需要,這里選擇“否”即可,窗口如圖1-11所示。

圖1-11 確認(rèn)是否拷貝8051起始代碼

(5)單擊否之后,新建工程就完成了,但這只是一個空的工程,還需要添加必需的源代碼或其他可選說明文件。單擊“File”下拉菜單的“New”選項或直接單擊工具欄的

“Create a new file”按鈕創(chuàng)建文件,創(chuàng)建文件窗口如圖1-12所示。

圖1-12 新建文件

(6)文件創(chuàng)建之后,編輯欄會彈出一個Test1窗口,這里可編寫指令代碼,但是Text1文件還只是在內(nèi)存中的自由文件,需要先保存到硬盤并添加到工程中。單擊工具欄

按鈕彈出保存路徑,通常保存于工程目錄下,文件后綴名必須為“.asm”,例如命名為“LED.asm”,單擊保存,如圖1 13所示。18

圖1-13 保存新創(chuàng)建的文件

(7)單擊工程窗口里的“+”展開“Target 1”,然后右擊“Source Group 1”選擇“Add Files to Group‘Source Group 1’”黑體字選項,如圖1-14所示。

圖1-14 添加新創(chuàng)建的文件

(8)在彈出的窗口中,文件類型選擇“All files(*.*)”,然后選中剛保存的

LED.ASM文件,單擊“Add”將其添加到工程中,如圖1-15所示。

(9)單擊Close關(guān)閉對話框,然后單擊“Source Group 1”前的“+”展開“Source Group 1”,可以看到LED.ASM文件出現(xiàn)在工程窗口的“Source Group 1”的下面,界面

如圖1-16所示,接下來就是程序的編寫和編譯了。

(三)編寫程序源代碼

在編輯欄的LED文件窗口中輸入以下內(nèi)容:

圖1-15 添加新建的文件LED.ASM

圖1-16 編程界面

該程序功能是先使P1端口輸出低電平,然后P1.0輸出高電平。(四)編譯

在編譯前要對工程進行配置,單擊菜單欄的“Project”選擇“Option for Target

‘Target1’”選項或直接單擊工具欄的按鈕,在彈出的對話框中選擇Output選項卡,

勾選“Create HEX file.”復(fù)選框,然后單擊確定,如圖1-17所示。

選中該復(fù)選框使編譯器編譯源程序后能生成用于下載到單片機ROM的十六進制

.hex文件。在菜單欄中選擇“Project”選項中的“Build all target file”或直接單擊工具

欄的按鈕編譯程序,在信息欄可以看到編譯過程和信息,如圖1-18所示。

如果程序沒有問題編譯后信息欄會顯示“0Error(s),0 Warning(s).”的字樣,另外20

圖1-17 設(shè)置輸出HEX文件

圖1-18 輸出LED.hex文件

還可以看到程序使用的存儲資源,例如圖1 18中第4行信息“ProgramSize:data=8.0 xdata=0code=5”表示該程序使用了8字節(jié)RAM,0字節(jié)外部RAM和5字節(jié)ROM。

將上面所產(chǎn)生的HEX文件通過LWZAUSB軟件下載到單片機內(nèi),就能達到預(yù)期效果。例子中所講的程序非常簡潔,但一般不會這樣寫,因為ROM的前幾十個字節(jié)中還有其他特殊的用途,所以不能直接將HEX文件存入ROM的前幾十個字節(jié)中。

實際編程如下,程序前面有一些內(nèi)容格式一樣,可以暫時照寫。

能力檢測

(1)理解單片機最小系統(tǒng)和單片機外圍電路的概念。

(2)了解Keil 的基本用法和單片機編程的基本流程,能夠獨立完成編程下載等基本操作。

主站蜘蛛池模板: 胶州市| 雅安市| 甘谷县| 兰考县| 曲阜市| 赣州市| 合肥市| 吴旗县| 景洪市| 东安县| 新巴尔虎右旗| 泰安市| 梨树县| 平罗县| 上林县| 辉南县| 罗定市| 通州市| 鲁甸县| 台前县| 沈丘县| 武陟县| 云林县| 庆云县| 芒康县| 虞城县| 灵寿县| 黔西县| 徐水县| 施甸县| 东辽县| 延吉市| 灵璧县| 东平县| 许昌市| 泽州县| 河南省| 中江县| 周至县| 彩票| 阜宁县|