- 電力系統(tǒng)單片機應(yīng)用技術(shù)
- 陳榮主編
- 9718字
- 2021-10-22 23:19:00
任務(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 的基本用法和單片機編程的基本流程,能夠獨立完成編程下載等基本操作。