第3章 AT89C51單片機(jī)軟件_第1頁(yè)
第3章 AT89C51單片機(jī)軟件_第2頁(yè)
第3章 AT89C51單片機(jī)軟件_第3頁(yè)
第3章 AT89C51單片機(jī)軟件_第4頁(yè)
第3章 AT89C51單片機(jī)軟件_第5頁(yè)
已閱讀5頁(yè),還剩137頁(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)介

·1·第3章AT89C51單片機(jī)軟件學(xué)習(xí)目標(biāo)·2·熟悉AT89C51指令系統(tǒng)的7種尋址方式熟練掌握AT89C51單片機(jī)各類指令的格式、功能及應(yīng)用了解匯編語(yǔ)言和C51語(yǔ)言程序設(shè)計(jì)特點(diǎn)掌握匯編程序設(shè)計(jì)常用的偽指令掌握AT89C51四種程序基本結(jié)構(gòu)及程序設(shè)計(jì)的基本思想和基本方法能看懂一般匯編語(yǔ)言源程序,并能初步設(shè)計(jì)并編寫簡(jiǎn)單的匯編語(yǔ)言程序·3·本章知識(shí)結(jié)構(gòu)·4·導(dǎo)入案例(2-1)案例一:循環(huán)流水燈控制該案例為THDP-2型單片機(jī)開(kāi)發(fā)綜合實(shí)驗(yàn)裝置中最簡(jiǎn)單的實(shí)驗(yàn)。硬件僅在AT89C51單片機(jī)的P1口接上74LS373鎖存器以及8個(gè)五顏六色的LED發(fā)光二極管。·5·導(dǎo)入案例(2-2)案例視頻

ORG0000H LJMPSTART ORG0030HSTART:MOVA,#0FEHMOVR2,#8OUTPUT:MOVP1,ARLAACALLDELAYDJNZR2,OUTPUTLJMPSTART(續(xù)上)DELAY: MOVR6,#0 MOVR7,#0DELAYLOOP:DJNZR6,DELAYLOOP ;延時(shí)子程序 DJNZR7,DELAYLOOPRET源程序語(yǔ)句如下:RRA成功運(yùn)行以上程序,即可觀察到8個(gè)LED燈自左向右循環(huán)流水閃亮,象節(jié)日彩燈一樣。程序修改后,8個(gè)LED燈循環(huán)流水閃亮的方向就變?yōu)樽杂蚁蜃蟆?0FDH程序修改后,8個(gè)LED燈由單個(gè)LED燈循環(huán)流水閃亮變成2個(gè)LED燈循環(huán)流水閃亮?!?·如果修改延時(shí)子程序的部分參數(shù),可以改變LED燈的亮滅間隔時(shí)間,LED燈循環(huán)流水閃亮的風(fēng)格又不一樣……。靈活多變的軟件編程技術(shù)可以賦予單片機(jī)應(yīng)用系統(tǒng)豐富多彩的“生命力”。為此本章詳細(xì)討論AT89C51單片機(jī)的匯編語(yǔ)言指令系統(tǒng)、尋址方式、語(yǔ)句格式。然后介紹AT89C51單片機(jī)的匯編語(yǔ)言基本程序結(jié)構(gòu)和程序設(shè)計(jì)的基本思想、基本方法?!?·3.1單片機(jī)軟件程序概述

小貼士:?jiǎn)纹瑱C(jī)一般是裸機(jī),不含任何系統(tǒng)軟件。因此在首次使用前,須對(duì)其進(jìn)行編程。

單片機(jī)軟件程序設(shè)計(jì)語(yǔ)言,理論上通??梢允褂脵C(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)語(yǔ)言3種。機(jī)器語(yǔ)言:由二進(jìn)制代碼構(gòu)成的指令系統(tǒng),是計(jì)算機(jī)唯一能直接識(shí)別和執(zhí)行的指令,面向機(jī)器的語(yǔ)言,難記憶且煩瑣。高級(jí)語(yǔ)言:獨(dú)立于計(jì)算機(jī)硬件,是用接近自然語(yǔ)言和數(shù)學(xué)表達(dá)式的描述方式編寫程序的語(yǔ)言。面向過(guò)程或?qū)ο?、通用性、可移植性?qiáng),但消耗計(jì)算機(jī)資源多。匯編語(yǔ)言:一種符號(hào)化的機(jī)器語(yǔ)言,用指令助記符的描述方式編寫程序。面向機(jī)器、直接作用于底層硬件,具有執(zhí)行速度快、代碼簡(jiǎn)短、執(zhí)行時(shí)間確定等優(yōu)點(diǎn)?!?·

匯編語(yǔ)言源程序由多條各式指令語(yǔ)句構(gòu)成,有三種基本類型:指令語(yǔ)句、偽指令語(yǔ)句和宏指令語(yǔ)句。指令語(yǔ)句:由單片機(jī)運(yùn)行過(guò)程要執(zhí)行的指令,是匯編語(yǔ)言程序的主體。每條指令在匯編過(guò)程中都要翻譯成一個(gè)目標(biāo)代碼,對(duì)應(yīng)單片機(jī)的一種操作。偽指令語(yǔ)句:配合匯編程序的指令,僅在匯編過(guò)程起作用。宏指令語(yǔ)句:用以代替匯編語(yǔ)言源程序中需要重復(fù)使用的若干個(gè)指令語(yǔ)句的替換語(yǔ)句,在匯編時(shí)會(huì)生成與之相應(yīng)的目標(biāo)代碼。3.1.1匯編語(yǔ)言程序·9·3.1.2C51語(yǔ)言程序簡(jiǎn)述C51是MCS-51系列單片機(jī)使用的C語(yǔ)言,符合ANSIC標(biāo)準(zhǔn),并根據(jù)單片機(jī)的特性進(jìn)行了擴(kuò)展。

與匯編語(yǔ)言相比,在功能、結(jié)構(gòu)性、可讀性及可維護(hù)性上有其優(yōu)勢(shì)。但是用匯編語(yǔ)言進(jìn)行軟件編程可幫助讀者深刻地理解AT89C51單片機(jī)硬件的內(nèi)部結(jié)構(gòu)和運(yùn)行原理,熟練掌握單片機(jī)匯編語(yǔ)言的軟件編程是單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)和開(kāi)發(fā)工作者的基本功。在掌握匯編語(yǔ)言的基礎(chǔ)上,再去掌握高級(jí)語(yǔ)言的編程,能達(dá)到事半功倍的效果?!?0·指令:規(guī)定計(jì)算機(jī)完成某種操作的命令。計(jì)算機(jī)能夠識(shí)別、執(zhí)行的全部指令集合稱為指令系統(tǒng)。指令的長(zhǎng)度:指一條指令所包含二進(jìn)制代碼的位數(shù)。一般操作碼占1個(gè)字節(jié),操作數(shù)占一到兩個(gè)字節(jié)。指令執(zhí)行時(shí)間:指從取指令到指令執(zhí)行完畢所需要的時(shí)間。由單片機(jī)系統(tǒng)的晶振周期可計(jì)算出每條指令的執(zhí)行時(shí)間。3.2匯編語(yǔ)言指令系統(tǒng)

小貼士:學(xué)習(xí)指令系統(tǒng)時(shí),應(yīng)注意指令的格式、功能、操作碼的含義及操作數(shù)的表示方法,尋址方式、源操作數(shù)和目的操作數(shù)的范圍,指令執(zhí)行后對(duì)標(biāo)志位的影響以及指令的適用范圍,能正確估算出所執(zhí)行指令的字節(jié)數(shù)。在功能相同的情況下,應(yīng)盡量選用字節(jié)數(shù)少、執(zhí)行時(shí)間短的指令?!?1·3.2.1尋址方式及指令格式

指令格式是指令的表示方法,每一條指令應(yīng)包含兩個(gè)基本部分:操作碼和操作數(shù)。AT89C51匯編語(yǔ)言指令格式如下:[標(biāo)號(hào):] 操作碼[操作數(shù)] [;注釋]

其中[]項(xiàng)是可選項(xiàng)。標(biāo)號(hào)是指令的符號(hào)地址,是該條指令起始地址的符號(hào)。操作碼指出指令所要實(shí)現(xiàn)的功能,以助記符形式給出。操作數(shù)可以是參與操作的數(shù)據(jù)本身,也可以是寄存器或者存放參與操作數(shù)據(jù)的地址。注釋是針對(duì)某條具體指令而添加的說(shuō)明性文字,為增加程序的可讀性而設(shè)置,不產(chǎn)生可執(zhí)行的目標(biāo)代碼。·12·指令系統(tǒng)格式中常用的符號(hào)及意義如下表:符號(hào)意義Rnn=0~7,指當(dāng)前選定寄存器組的工作寄存器R0~R7Rii=0或1,當(dāng)前選中的寄存器組中可用作地址寄存器的兩個(gè)寄存器,只能R0或者R1direct內(nèi)部數(shù)據(jù)存儲(chǔ)單元RAM的8位地址,可指片內(nèi)RAM的低128個(gè)地址單元,也可指特殊功能寄存器的地址或符號(hào)名稱;#data指令中的8位立即數(shù)#data16指令中的16位立即數(shù)addr16用于LCALL和LJMP指令中的16位目的地址,可轉(zhuǎn)向64KB片外程序存儲(chǔ)器地址空間的任何單元addr11用于ACALL和AJMP指令中的低11位目的地址,目的地址必須放在與下條指令第一個(gè)字節(jié)的同一個(gè)2KB程序存儲(chǔ)器之中rel帶符號(hào)的8位偏移量的補(bǔ)碼,所能表示范圍為-128~+127,用于SJMP和所有條件轉(zhuǎn)移指令中DPTR數(shù)據(jù)指針bit內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM(包括特殊功能寄存器)的直接尋址位A或ACC累加器BB寄存器,用于乘法和除法指令中C或CY進(jìn)位標(biāo)志位,是布爾處理器中的累加器,也稱為累加位/位地址的前綴,聲明對(duì)該位操作數(shù)取反@間址寄存器的前綴(X)地址為X單元中的內(nèi)容((X))由X尋址的單元中的內(nèi)容←表示數(shù)據(jù)傳送方向,將箭頭右邊的內(nèi)容傳給左邊$當(dāng)前指令存放的地址·13·

尋址方式指尋找操作數(shù)或操作數(shù)所在地址的方法。對(duì)應(yīng)不同存儲(chǔ)空間中的操作數(shù),有不同的尋址方式。尋址方式越多,單片機(jī)功能越強(qiáng)大,操作越靈活。1.立即尋址定義:指令中直接給出操作數(shù)的尋址方式稱為立即尋址。特點(diǎn):操作數(shù)常處在指令的第二字節(jié)和第三字節(jié)的位置,稱為立即數(shù)。立即數(shù)可以是8位或16位二進(jìn)制數(shù),前面加“#”標(biāo)志,用以和直接尋址中的直接地址相區(qū)別。例如:MOVDPTR,#2011H ;DPH←20H,DPL←11H·14·MOVDPTR,#2011H指令執(zhí)行示意圖例如:MOVDPTR,#2011H ;DPH←20H,DPL←11H指令功能是將16位立即數(shù)2011H送入數(shù)據(jù)指針寄存器DPTR中,如下圖所示?!?5·

小貼士:直接尋址是訪問(wèn)特殊功能寄存器的唯一方法。2.直接尋址定義:指令中直接給出操作數(shù)所在單元地址的尋址方式稱為直接尋址。特點(diǎn):計(jì)算機(jī)執(zhí)行時(shí)可根據(jù)直接地址找到所需要的操作數(shù)。尋址范圍:片內(nèi)數(shù)據(jù)存儲(chǔ)器RAM的低128個(gè)存儲(chǔ)單元、21個(gè)特殊功能寄存器SFR?!?6·3.寄存器尋址定義:指令中將寄存器中的內(nèi)容作為操作數(shù)的尋址方式稱為寄存器尋址。特點(diǎn):存放操作數(shù)的寄存器在指令代碼中不占據(jù)單獨(dú)的一個(gè)字節(jié),而是隱含到操作碼字節(jié)中,一般為單字節(jié)指令。尋址范圍:4個(gè)寄存器組(每組包括R0~R7)、累加器A、B寄存器以及數(shù)據(jù)指針DPTR。A、B既可寄存器尋址又可直接尋址?!?7·4.寄存器間接尋址定義:指令中給出的寄存器內(nèi)容是操作數(shù)的地址,而操作數(shù)存放在RAM中,這種尋址方式稱為寄存器間接尋址。特點(diǎn):寄存器名前必須加前綴符號(hào)“@”。尋址范圍:內(nèi)部RAM的低128個(gè)單元(只能用R0、R1作為間址寄存器,用@Ri(i=0,1)表示)、片外RAM的64KB單元(可用R0、R1作為間址寄存器,用于尋址片外RAM低256個(gè)單元,用@Ri(i=0,1)表示,也可采用數(shù)據(jù)指針DPTR作為間址寄存器,用于尋址片外RAM的全部64KB單元,用@DPTR表示)、堆棧區(qū)(用堆棧指針SP作為間址寄存器,通過(guò)POP和PUSH指令尋址堆棧區(qū))?!?8·

小貼士:寄存器間接尋址方式不能尋址特殊功能寄存器SFR。因片內(nèi)RAM和片外RAM地址有重疊,故用MOV指令尋址片內(nèi)RAM,MOVX指令尋址片外RAM。5.變址尋址定義:變址尋址方式又稱基址寄存器+變址寄存器間接尋址方式,是一種二次尋找操作數(shù)地址的尋址方式。特點(diǎn):用PC或DPTR做基址寄存器;用累加器A做變址寄存器,存放地址偏移量,以基址寄存器加變址寄存器所形成的16位地址作為操作數(shù)地址,寄存器前邊必須加前綴符號(hào)“@”。尋址范圍:變址尋址只能用于尋址程序存儲(chǔ)器ROM。·19·例如:指令執(zhí)行前(A)=32H,(DPTR)=2011H,則MOVCA,@A+DPTR指令執(zhí)行結(jié)果下圖所示。

小貼士:變址尋址只能用于尋址程序存儲(chǔ)器ROM。變址尋址示意圖·20·6.相對(duì)尋址定義:相對(duì)尋址是以PC當(dāng)前值為基準(zhǔn)加上相對(duì)偏移量所得的結(jié)果作為轉(zhuǎn)移目的地址的尋址方式。特點(diǎn):只用于相對(duì)轉(zhuǎn)移指令。PC當(dāng)前值指下條指令的PC值,即轉(zhuǎn)移指令的PC值加上轉(zhuǎn)移指令的字節(jié)數(shù),其值加上指令中所給出的偏移量即為指令執(zhí)行結(jié)束后程序轉(zhuǎn)移的目的地址。目的地址=轉(zhuǎn)移指令地址+相對(duì)轉(zhuǎn)移指令字節(jié)數(shù)+偏移量rel尋址范圍:地址偏移量rel是一個(gè)帶符號(hào)的8位二進(jìn)制補(bǔ)碼,表示范圍為-128~+127,故程序跳轉(zhuǎn)的范圍是當(dāng)前PC的-128~+127之間的某段程序存儲(chǔ)器地址中?!?1·例如:執(zhí)行指令 JZ80H分析:這是一個(gè)條件相對(duì)轉(zhuǎn)移指令,占兩個(gè)字節(jié)。rel=80H,是負(fù)數(shù)補(bǔ)碼。則該指令的功能為:若累加器A的內(nèi)容不為0時(shí),則程序計(jì)數(shù)器PC加2,順序往下執(zhí)行;若累加器A的內(nèi)容為0時(shí),程序跳轉(zhuǎn)到目的地址,若該條指令地址為2100H,則指令執(zhí)行完畢后程序轉(zhuǎn)移到目的地址為2082H處,如圖所示。JZ80H指令執(zhí)行示意圖·22·7.位尋址定義:指令的操作數(shù)直接以位地址形式給出的尋址方式稱為位尋址。特點(diǎn):指令的操作數(shù)直接以位地址形式給出的尋址方式稱為位尋址。尋址范圍:片內(nèi)RAM的的位尋址區(qū):20H~2FH,共16個(gè)RAM單元;可位尋址的特殊功能寄存器:特殊功能寄存器中其物理地址能被8整除,共包括11個(gè),其中可實(shí)現(xiàn)位尋址的位的共83位。·23·位地址的表示方法共有4種:1.直接使用地址位的物理地址表示,例如: MOVC,22H ;C←(22H)2.單元地址加位的表示,例如: MOVC,2DH.3;C←(2DH.3),即將位地址

6BH中的內(nèi)容傳給位累加器C3.特殊功能寄存器符號(hào)加位的表示,例如: MOVC,PSW.3 ;將PSW.3即D3H位的內(nèi)容傳給

位累加器C4.位名稱表示,例如: MOVF0,C ;F0←(C)·24·尋址方式與尋址空間的對(duì)應(yīng)關(guān)系尋址方式尋址空間立即尋址程序存儲(chǔ)器ROM直接尋址內(nèi)部RAM的低128單元特殊功能寄存器寄存器尋址R0~R7ACC、B、CY(bit)、DPTR(雙字節(jié))寄存器間接尋址片內(nèi)RAM低128字節(jié)(@R0、@R1)片外RAM共

64K字節(jié)(@R0、@R1、@DPTR)堆棧區(qū)(@SP,僅POP和PUSH)變址尋址程序存儲(chǔ)器ROM(@A+PC,@A+DPTR)相對(duì)尋址程序存儲(chǔ)器ROM(PC當(dāng)前值+偏移量rel)位尋址片內(nèi)RAM中20H~2FH共128個(gè)可尋址位可位尋址的特殊功能寄存器

·25·

上述7種尋址方式都是針對(duì)源操作數(shù)的,而對(duì)源操作數(shù)和目的操作數(shù)可以有不同的尋址方式。AT89C51的目的操作數(shù)只有4種尋址方式:直接尋址、寄存器尋址、寄存器間接尋址和位尋址?!?6·3.2.2指令類別及執(zhí)行指令過(guò)程式

AT89C51指令系統(tǒng)共有由42種助記符和7種尋址方式構(gòu)成的111條指令。1.指令類別

按指令字節(jié)數(shù),可分為單字節(jié)指令、雙字節(jié)指令和三字節(jié)指令。單字節(jié)指令(49條):操作碼和操作數(shù)在同一個(gè)字節(jié)。雙字節(jié)指令(45條):一個(gè)字節(jié)為操作碼,另一個(gè)字節(jié)為操作數(shù)。三字節(jié)指令(17條):操作碼占一個(gè)字節(jié),操作數(shù)占兩個(gè)字節(jié)。

按指令執(zhí)行時(shí)間可分為單周期指令、雙周期指令和四機(jī)器周期指令。AT89C51指令系統(tǒng)有64條單周期指令、45條雙周期指令和2條四個(gè)機(jī)器周期指令(即乘法和除法指令)?!?7·

按指令的功能可分為數(shù)據(jù)傳送指令(29條)、算術(shù)運(yùn)算指令(24條)、邏輯運(yùn)算指令及移位類指令(24條)、控制轉(zhuǎn)移指令(17條)和布爾操作指令(17條)共5大類。2.指令執(zhí)行過(guò)程

可分為取指階段和執(zhí)行階段。

在取指階段,單片機(jī)將指令操作碼從程序存儲(chǔ)器逐條取出,送至指令寄存器,然后經(jīng)指令譯碼器進(jìn)行譯碼,由定時(shí)控制邏輯電路產(chǎn)生一系列控制信號(hào)。指令執(zhí)行階段,利用所產(chǎn)生的控制信號(hào),進(jìn)行本指令規(guī)定的操作?!?8·3.2.3數(shù)據(jù)傳送類指令

數(shù)據(jù)傳送類指令是將指令的源操作數(shù)傳送到目的操作數(shù)中的指令,能夠?qū)崿F(xiàn)數(shù)據(jù)的傳送、保存和交換數(shù)據(jù)等功能。

根據(jù)數(shù)據(jù)傳送的存儲(chǔ)空間不同,數(shù)據(jù)傳送指令可分為內(nèi)部數(shù)據(jù)傳送指令、外部數(shù)據(jù)傳送指令、程序存儲(chǔ)器數(shù)據(jù)傳送指令、數(shù)據(jù)交換指令和堆棧操作指令。1.內(nèi)部8位數(shù)據(jù)傳送指令格式:MOV<目的操作數(shù)單元>,<源操作數(shù)單元>按照目的操作數(shù)的不同可以分為4類:①以累加器A為目的操作數(shù)的指令(4條)MOVA,<源操作數(shù)單元>

其中,<源操作數(shù)單元>可為Rn、@Ri、direct或#data。該組指令只影響PSW中的標(biāo)志位P,不影響其他標(biāo)志位?!?9·②以直接地址為目的操作數(shù)的指令(5條)MOVdirect,<源操作數(shù)單元>其中,<源操作數(shù)單元>可為A、Rn、@Ri、direct或#data。③以工作寄存器Rn為目的操作數(shù)的指令(3條)MOVRn,<源操作數(shù)單元>其中,<源操作數(shù)單元>可為A、direct或#data。④以間接地址為目的操作數(shù)的指令(3條)MOV@Ri,<源操作數(shù)單元>其中,寄存器Ri(i=0、1)的內(nèi)容不是操作數(shù)而是操作數(shù)的地址。<源操作數(shù)單元>可為A、direct或#data?!?0·例如:MOV@R1,30H

將片內(nèi)30H中內(nèi)容送入由R1中內(nèi)容所指定的那個(gè)存儲(chǔ)單元中,若(R1)=11H,(30H)=12H,則指令執(zhí)行完畢后11H中的內(nèi)容為12H,此時(shí)源操作數(shù)采用直接尋址方式。2.內(nèi)部16位數(shù)據(jù)傳送指令(1條)格式:MOVDPTR,#data16;(DPTR)←#data16是唯一一條16位數(shù)據(jù)傳送指指令。功能是將一個(gè)16位的立即數(shù)送入數(shù)據(jù)指針寄存器DPTR,高8位送入DPH中,低8位送入DPL中。·31·3.外部數(shù)據(jù)傳送指令(4條)單片機(jī)CPU與外部數(shù)據(jù)存儲(chǔ)器RAM之間進(jìn)行數(shù)據(jù)傳送時(shí)使用外部數(shù)據(jù)傳送指令,通過(guò)累加器A傳送。AT89C51指令系統(tǒng)中外部數(shù)據(jù)傳送指令共4條,采用寄存器間接尋址方式。格式:MOVXA,<源操作數(shù)單元>MOVX<目的操作數(shù)單元>,A

其中,<源操作數(shù)單元>、<目的操作數(shù)單元>可為@DPTR或@Ri(i=0、1)。Ri只能訪問(wèn)片外RAM的低256個(gè)單元;DPTR可訪問(wèn)片外RAM的全部64KB的空間。只有以累加器A為目的操作數(shù)的指令才影響PSW中的P標(biāo)志位,其余指令均不影響標(biāo)志位。·32·AT89C51在執(zhí)行MOVX指令時(shí),單片機(jī)通過(guò)系統(tǒng)總線(包括地址總線、數(shù)據(jù)總線和控制總線)與存儲(chǔ)器連接。由P0口分時(shí)提供低8位地址A0~A7和數(shù)據(jù)總線D0~D7,由P2口提供高8位地址A8~A15。控制讀、寫選通信號(hào)RD和WR分別由P3.7和P3.6輸出。

小貼士:AT89C51單片機(jī)的I/O口和片外RAM統(tǒng)一編址,無(wú)專門的I/O指令,外部數(shù)據(jù)傳送指令均可作為輸入/輸出指令?!?3·【例3.1】若某應(yīng)用系統(tǒng)外擴(kuò)了4KB的RAM,要求將3000H單元內(nèi)容傳送到2012H中,再將內(nèi)部36H的內(nèi)容發(fā)送到片外數(shù)據(jù)存儲(chǔ)器3000H單元中。解:AT89C51對(duì)外部數(shù)據(jù)存儲(chǔ)器的操作都必須通過(guò)累加器A,故首先將片外RAM3000H單元的內(nèi)容送到A中,然后將A中的數(shù)據(jù)送入片外RAM的2012H中,最后再通過(guò)A中轉(zhuǎn)將36H中的內(nèi)容送入3000H中。·34·編程段如下:MOVDPTR,#3000H ;將源數(shù)據(jù)地址送到DPTR中MOVXA,@DPTR;從片外RAM的3000H單元中取數(shù)據(jù)送AMOVDPTR,#2012H ;將目的地址送到DPTR中MOVX@DPTR,A ;將累加器A中數(shù)據(jù)送到片外 RAM的2012H單元中MOVDPTR,#3000H ;外部數(shù)據(jù)存儲(chǔ)器地址指針MOVA,36H ;取片內(nèi)RAM36H的內(nèi)容MOVX@DPTR,A ;送到外部RAM的3000H單元

小貼士:只要對(duì)外部數(shù)據(jù)存儲(chǔ)器進(jìn)行數(shù)據(jù)傳送操作,一定要通過(guò)二傳手累加器A,累加器A是使用非常頻繁的SFR。4.程序存儲(chǔ)器數(shù)據(jù)傳送指令(2條)程序存儲(chǔ)器的數(shù)據(jù)傳送是單向的,單片機(jī)只能從ROM中讀取源操作數(shù),且只能讀到累加器A中。這類指令也稱為查表指令,常用于從程序存儲(chǔ)器中讀取表格和常數(shù)。AT89C51指令系統(tǒng)中僅2條能實(shí)現(xiàn)此功能的指令,均為單字節(jié)指令。指令格式如下:MOVCA,@A+DPTP;(A)←((A)+(DPTR))MOVCA,@A+PC;(PC)←(PC)+1;(A)←((A)+(PC))·36·以上兩條指令功能完全相同,但使用時(shí)也存在如下區(qū)別:

查表的位置要求不同采用DPTR作為基址寄存器時(shí),表格數(shù)據(jù)可存放在程序存儲(chǔ)器的任意單元,可對(duì)整個(gè)64KB的ROM空間尋址,故稱為“遠(yuǎn)程查表”。采用PC作為基址寄存器時(shí),表格數(shù)據(jù)只能存放在當(dāng)前PC后的0~255個(gè)單元,故稱為“近程查表”。計(jì)算偏移量rel的方法不同指令采用變址尋址方式,其中累加器A為變址寄存器,存放地址偏移量rel(范圍為0~255)。若采用DPTR作為基址寄存器,rel為所要查的數(shù)值距離表首地址的差值;若采用PC作為基址寄存器,則rel=表首地址-(查表指令地址+1)·37·【例3.2】分別使用近程查表和遠(yuǎn)程查表兩種方法編程實(shí)現(xiàn):求累加器A內(nèi)的1位16進(jìn)制數(shù)所對(duì)應(yīng)的ASCII碼。方法一:近程查表ORG 0000HJMP STARTORG 1000HSTART:ANLA,#0FH;屏蔽高4位,取出1位16進(jìn)制數(shù)ADDA,#02H ;修正偏移量,該指令占2個(gè)字節(jié)MOVCA,@A+PC;查表得ASCII結(jié)果送累加器A中, ;該指令占1個(gè)字節(jié)MOV20H,A ;存放結(jié)果,該指令占2個(gè)字節(jié)·38·(續(xù)上) ;16進(jìn)制ASCII碼表TABLE:DB 30H,31H,32H,33H;“0”~“3” DB 34H,35H,36H,37H;“4”~“7”DB38H,39H,41H,42H;“8”、“9”、

;“A”、“B”DB43H,44H,45H,46H;“C”、“D”、

;“E”、“F”END·39·方法二:遠(yuǎn)程查表ORG 0000HJMP STARTORG 1000HSTART:ANLA,#0FH;屏蔽高4位,取出1個(gè)16進(jìn)制數(shù) MOVDPTR,#2000H;表的首地址送入DPTRMOVCA,@A+DPTR;查表得結(jié)果送累加器A中 MOV20H,A ;存放結(jié)果

·40·(續(xù)上)ORG2000H ;16進(jìn)制ASCII碼表的首地址TABLE:DB30H,31H,32H,33H;“0”~“3” DB34H,35H,36H,37H;“4”~“7”DB38H,39H,41H,42H;“8”、“9”、

;“A”、“B”DB43H,44H,45H,46H;“C”、“D”、

;“E”、“F”END·41·5.數(shù)據(jù)交換指令(5條)數(shù)據(jù)交換指令將源操作數(shù)與累加器A的內(nèi)容互換,可完成整字節(jié)或半字節(jié)數(shù)據(jù)交換。①整字節(jié)交換指令XCHA,<源操作數(shù)單元>其中,

<源操作數(shù)單元>可為direct、Rn或@Ri。②半字節(jié)交換指令XCHDA,@Ri ;(A)0~3

((Ri))0~3SWAPA ;(A)0~3

(A)4~7·42·6.堆棧操作指令(2條)

堆棧操作指令是對(duì)堆棧進(jìn)行操作的指令,可實(shí)現(xiàn)將RAM單元中數(shù)據(jù)送入棧頂或由棧頂取出數(shù)據(jù)送至RAM單元,用于實(shí)現(xiàn)對(duì)斷點(diǎn)地址和數(shù)據(jù)的保護(hù)。AT89C51指令系統(tǒng)有出棧、入棧兩種堆棧操作指令,均為雙字節(jié)雙周期指令。PUSHdirect ;(SP)=(SP)+1,((SP))←(direct)POPdirect ;(direct)←((SP)),(SP)=(SP)-1

通常在片內(nèi)RAM中另開(kāi)辟出一個(gè)區(qū)域作為堆棧區(qū)域(一般在30H~7FH范圍),滿足“先進(jìn)后出、后進(jìn)先出”的原則。·43·

堆棧由堆棧指針寄存器SP自動(dòng)管理(系統(tǒng)復(fù)位后,SP初始值為07H)。為避免重疊,一般初始化時(shí)應(yīng)重新設(shè)定SP的值。

小貼士:

AT89C51單片機(jī)的堆棧是向上生長(zhǎng)的,故進(jìn)行入棧或者出棧操作時(shí),堆棧指針SP的值相應(yīng)加1或減1。對(duì)比8088/808616位微機(jī)系統(tǒng)的堆棧是向下生長(zhǎng),故對(duì)堆棧進(jìn)行入?;蛘叱鰲2僮鲿r(shí),堆棧指針SP的值變化不一樣,對(duì)應(yīng)操作是減2或加2。3.2.4算術(shù)運(yùn)算類指令A(yù)T89C51單片機(jī)的算術(shù)運(yùn)算指令包括加、減、乘、除以及BCD碼等的四則運(yùn)算指令。算術(shù)指令執(zhí)行的結(jié)果一般會(huì)影響程序狀態(tài)字PSW中的狀態(tài)標(biāo)志位,包括進(jìn)位標(biāo)志(CY)、輔助進(jìn)位標(biāo)志(AC)、溢出標(biāo)志(OV)和奇偶標(biāo)志(P)。1.加法指令(4條)指令格式如下:ADDA,<源操作數(shù)單元>;(A)←(A)+<源操作數(shù)單元>其中,<源操作數(shù)單元>可為#data、direct、Rn或@Ri。

AT89C51單片機(jī)的算術(shù)運(yùn)算指令包括加、減、乘、除以及BCD碼等的四則運(yùn)算指令。算術(shù)指令執(zhí)行的結(jié)果一般會(huì)影響程序狀態(tài)字PSW中的狀態(tài)標(biāo)志位,包括進(jìn)位標(biāo)志(CY)、輔助進(jìn)位標(biāo)志(AC)、溢出標(biāo)志(OV)和奇偶標(biāo)志(P)。1.加法指令(4條)指令格式如下:ADDA,<源操作數(shù)單元>;(A)←(A)+<源操作數(shù)單元>其中,<源操作數(shù)單元>可為#data、direct、Rn或@Ri。

·46·ADD指令對(duì)位標(biāo)志(CY)、輔助進(jìn)位標(biāo)志(AC)、溢出標(biāo)志(OV)和奇偶標(biāo)志(P)均有影響。影響如下:若和的最高位(第7位)有進(jìn)位時(shí),進(jìn)位標(biāo)志位CY=1,否則CY=0。若和的第3位有進(jìn)位時(shí),輔助進(jìn)位標(biāo)志AC=1,否則AC=0。OV是對(duì)帶符號(hào)數(shù)加法的反映。若第7位、第6位中只有一個(gè)有進(jìn)位,則溢出標(biāo)志OV=1,稱為“溢出”,表明結(jié)果錯(cuò)誤(比如兩個(gè)正數(shù)相加和為負(fù)數(shù)或兩個(gè)負(fù)數(shù)相加和為正數(shù));否則OV=0,表示結(jié)果正確。當(dāng)A中有奇數(shù)個(gè)“1”時(shí),奇偶標(biāo)志位P=1,否則P=0。2.帶進(jìn)位的加法指令(4條)指令格式如下:ADDCA,<源操作數(shù)單元>;(A)←(A)+<源操作數(shù)單元>+CY其中,<源操作數(shù)單元>可為Rn、direct、@Ri或#data,進(jìn)位標(biāo)志CY為指令執(zhí)行前CY的值。ADDC指令對(duì)PSW中標(biāo)志位的影響與上述加法指令相同。此類指令多用于多字節(jié)數(shù)的加法運(yùn)算。3.帶借位的減法指令(4條)指令格式如下:SUBBA,<源操作數(shù)單元>;(A)←(A)-<源操作數(shù)單元>-CY其中,<源操作數(shù)單元>可為Rn、direct、@Ri或#data,進(jìn)位標(biāo)志CY為指令執(zhí)行前CY的值。SUBB指令對(duì)PSW中標(biāo)志位的影響與上述加法指令類似。·48·【例3.3】編寫程序計(jì)算2012H-8B4AH,結(jié)果存入片內(nèi)RAM的40H和41H單元,其中41H存放高8位,40H存放低8位。解:程序段如下CLR C ;進(jìn)位標(biāo)志清零MOV A,#12H ;A←12HSUBB A,#4AH ;A←(A)-4AH-CYMOV40H,A ;(40H)←AMOVA,#20H ;A←20HSUBBA,#8BH ;A←(A)-8BH-CYMOV41H,A ;(41H)←A·49·結(jié)果:(41H)=94H,(40H)=0C8H,CY=1,P=1,OV=1OV為1,說(shuō)明結(jié)果錯(cuò)誤。對(duì)于兩個(gè)帶符號(hào)的運(yùn)算,本例為一個(gè)正數(shù)減去負(fù)數(shù),結(jié)果應(yīng)該為正數(shù),而CY為1,顯然結(jié)果錯(cuò)誤。

小貼士:

AT89C51指令系統(tǒng)中沒(méi)有不帶借位的減法,若要進(jìn)行不帶借位的減法,則可在“SUBB”指令前將CY位清0。4.加1指令(5條)加1指令又稱增量指令,其功能是將操作數(shù)所指定單元的內(nèi)容加1。指令格式如下:INC<操作數(shù)單元>;<操作數(shù)單元>←<操作數(shù)單元>+1其中,<操作數(shù)單元>既是源操作數(shù)又是目的操作數(shù)(即只有一個(gè)操作數(shù)),可以是A、DPTR、direct、Rn或@Ri。加1指令除對(duì)累加器A操作只影響PSW中的奇偶標(biāo)志位P。5.減1指令(4條)減1指令又稱減量指令,其功能是將操作數(shù)所指定單元的內(nèi)容減1。指令格式如下:DEC<操作數(shù)單元>;<操作數(shù)單元>←<操作數(shù)單元>-1其中,<操作數(shù)單元>與加1指令情況相同。減1指令對(duì)PSW中標(biāo)志位的影響亦與上述加1指令相同。

·51·6.乘/除法指令(2條)①乘法指令

乘法指令的功能是將累加器A和寄存器B中的兩個(gè)8位無(wú)符號(hào)二進(jìn)制數(shù)相乘,所得16位積的低8位存于累加器A中,高8位存于寄存器B中。MULAB ;BA←(A)

(B)②除法指令

除法指令的功能是將累加器A中的被除數(shù)和寄存器B中的除數(shù)的兩個(gè)8位無(wú)符號(hào)二進(jìn)制數(shù)相除,所得商存入累加器A中,余數(shù)存入寄存器B中。DIVAB;A←(A)/(B)的商,B←(A)/(B)的余數(shù)·52·乘、除法指令均會(huì)對(duì)PSW中的CY、OV和P標(biāo)志有影響。進(jìn)位標(biāo)志CY總是清零;在乘法指令中,若積為8位(小于FFH),則溢出標(biāo)志OV=0,B=0;若積大于255(FFH)則OV=1。在除法指令中,若除數(shù)為0,則溢出標(biāo)志OV=1,表示除法沒(méi)有意義。否則,OV=0;奇偶標(biāo)志位P反映累加器A中“1”的個(gè)數(shù)。P=1,表示有奇數(shù)個(gè)“1”;P=0,表示有偶數(shù)個(gè)“1”。·53·

小貼士:

AT89C51指令系統(tǒng)中沒(méi)有專門的十進(jìn)制減法調(diào)整指令,可通過(guò)加補(bǔ)運(yùn)算使減法運(yùn)算變?yōu)榧臃ㄟ\(yùn)算,再進(jìn)行十進(jìn)制調(diào)整。7.二—十進(jìn)制調(diào)整指令(1條)

二—十進(jìn)制調(diào)整指令一般是跟在加法指令后,對(duì)累加器A中壓縮BCD碼加法運(yùn)算的結(jié)果進(jìn)行調(diào)整。即兩個(gè)壓縮的BCD碼按二進(jìn)制數(shù)相加之后,必須經(jīng)過(guò)該指令調(diào)整才能得到壓縮的BCD碼和數(shù)。指令格式如下:DAA·54·3.2.5邏輯運(yùn)算及移位類指令

邏輯運(yùn)算指令是進(jìn)行邏輯運(yùn)算的操作指令。

AT89C51指令系統(tǒng)中包括邏輯與、邏輯或、邏輯異或、清零取反和循環(huán)移位指令共24條。

邏輯運(yùn)算及移位指令均是按位進(jìn)行的,操作數(shù)都是8位。此類指令只影響程序狀態(tài)字PSW中的奇偶標(biāo)志位P。·55·1.邏輯“與”指令(6條)

邏輯“與”指令能實(shí)現(xiàn)將目的操作數(shù)和源操作數(shù)按二進(jìn)制位展開(kāi)進(jìn)行邏輯“與”運(yùn)算。指令格式如下。①ANLA,<源操作數(shù)單元>;(A)←(A)∧<源操作數(shù)單元>

其中,<源操作數(shù)單元>可為Rn、@Ri、direct或#data。②ANLdirect,<源操作數(shù)單元>

;(direct)←(direct)∧<源操作數(shù)單元>

其中,<源操作數(shù)單元>只能為A或#data。·56·2.邏輯“或”指令(6條)

邏輯“或”指令能實(shí)現(xiàn)將目的操作數(shù)和源操作數(shù)按二進(jìn)制位展開(kāi)進(jìn)行邏輯“或”運(yùn)算。指令格式如下。①ORLA,<源操作數(shù)單元>

;(A)←(A)∨<源操作數(shù)單元>

其中,

<源操作數(shù)單元>可為Rn、@Ri、direct或#data。②ORLdirect,<源操作數(shù)單元>

;(direct)←(direct)∨<源操作數(shù)單元>

其中,<源操作數(shù)單元>只能為A或#data?!?7·【例3.4】將片外RAM的2012H單元中高四位置“1”,低四位清“0”。

小貼士:

AT89C51邏輯運(yùn)算中,可通過(guò)與“0”相與實(shí)現(xiàn)清零操作,跟“1”相或?qū)崿F(xiàn)置1操作。解:MOVDPTR,#2012H ;(DPTR)←2012HMOVXA,@DPTR ;A←(DPTR)ORLA,#0F0H;(A)←(A)∨11110000,高四位置“1”,低四位不變ANLA,#0F0H ;(A)←(A)∧11110000,高四位不變,低四位清“0”MOVX@DPTR,A;(DPTR)←A,將結(jié)果送回到2012H單元·58·3.邏輯“異或”指令(6條)

邏輯“異或”指令能實(shí)現(xiàn)將目的操作數(shù)和源操作數(shù)按二進(jìn)制位展開(kāi)進(jìn)行邏輯“異或”運(yùn)算。指令格式如下。①XRLA,<源操作數(shù)單元>

;(A)←(A)

<源操作數(shù)單元>

其中,<源操作數(shù)單元>可為Rn、@Ri、direct或#data。②XRLdirect,<源操作數(shù)單元>

;(direct)←(direct)

<源操作數(shù)單元>

其中,<源操作數(shù)單元>只能為A或#data。

在程序中,往往通過(guò)“異或”運(yùn)算來(lái)使目的操作數(shù)的某些位取反而其余位不變;或者判斷兩個(gè)數(shù)是否相等,若相等則結(jié)果為0。·59·例如:XRLA,#1CH分析:實(shí)現(xiàn)了對(duì)累加器A中(A7~A0)的第2到第4位取反,其余位不變的操作。

小貼士:對(duì)于邏輯“與”、“或”、“異或”運(yùn)算,指令操作結(jié)果可存放在直接地址單元中,若直接地址是I/O地址,則為“讀—修改—寫”操作,即原始數(shù)據(jù)是從單片機(jī)的輸出數(shù)據(jù)鎖存器(P0~P3)讀入,而不是讀引腳的狀態(tài)?!?0·4.累加器清零、取反指令(2條)①累加器A清零指令CLR A ;A←0;②累加器A取反指令CPL A ;A←/A;

累加器清零和取反指令均為為單字節(jié)指令。

清零指令操作只影響奇偶標(biāo)志位P而對(duì)PSW的其余標(biāo)志位不造成影響,取反操作不影響PSW任何標(biāo)志位?!?1·5.循環(huán)移位指令(4條)

循環(huán)移位指令是將累加器A的內(nèi)容循環(huán)左移一位或右移一位的操作指令,包括帶進(jìn)位的循環(huán)移位和不帶進(jìn)位的循環(huán)移位。①循環(huán)左移指令

循環(huán)左移指令是將累加器A的內(nèi)容循環(huán)左移一位的操作指令。RLA·62·②帶進(jìn)位的循環(huán)左移指令帶進(jìn)位位的循環(huán)左移指令是將累加器A的內(nèi)容和進(jìn)位位CY一起循環(huán)左移一位的操作指令。RLCA③循環(huán)右移指令循環(huán)右移指令是將累加器A的內(nèi)容循環(huán)右移一位的操作指令。RRA·63·移位指令只能對(duì)累加器A進(jìn)行,只影響進(jìn)位標(biāo)志CY,CY的狀態(tài)由移入的數(shù)位決定。

小貼士:利用移位運(yùn)算指令,可完成乘、除法運(yùn)算。逐位左移一位相當(dāng)于原內(nèi)容乘2,逐位右移一位相當(dāng)于原內(nèi)容除以2。④帶進(jìn)位的循環(huán)右移指令帶進(jìn)位位的循環(huán)右移指令是將累加器A的內(nèi)容和進(jìn)位位CY一起循環(huán)右移一位的操作指令。

RRCA·64·3.2.6控制程序跳轉(zhuǎn)類指令

控制程序跳轉(zhuǎn)類指令是用來(lái)改變程序執(zhí)行順序的操作指令。單片機(jī)可通過(guò)控制程序跳轉(zhuǎn)類指令來(lái)改變PC的值從而控制程序執(zhí)行的方向。AT89C51指令系統(tǒng)中的控制程序跳轉(zhuǎn)類指令共17條,包括無(wú)條件轉(zhuǎn)移指令、條件轉(zhuǎn)移指令、子程序調(diào)用及返回指令等。1.無(wú)條件轉(zhuǎn)移指令(4條)

無(wú)條件轉(zhuǎn)移指令指不通過(guò)條件判斷,程序無(wú)條件地轉(zhuǎn)移到指令指定的目標(biāo)地址去執(zhí)行。AT89C51指令系統(tǒng)中共有4條無(wú)條件轉(zhuǎn)移指令?!?5·①短轉(zhuǎn)移指令SJMPrel ;PC←(PC)+2,PC←(PC)+rel

其中,偏移量rel是8位帶符號(hào)的二進(jìn)制補(bǔ)碼,范圍為-128~+127。rel為負(fù)數(shù)時(shí),程序向后轉(zhuǎn)移;rel為正數(shù)時(shí),程序向前轉(zhuǎn)移。SJMP指令為2字節(jié)指令,可實(shí)現(xiàn)程序“原地踏步”。即程序暫停,而非程序真的結(jié)束。指令如下:HERE: SJMPHERE或HERE: SJMP$。②長(zhǎng)轉(zhuǎn)移指令LJMP addr16 ;PC←addr16

長(zhǎng)轉(zhuǎn)移指令提供16位目標(biāo)地址,執(zhí)行后程序可轉(zhuǎn)向64KB程序存儲(chǔ)器的任何單元,為3字節(jié)指令。·66·

小貼士:執(zhí)行絕對(duì)轉(zhuǎn)移指令時(shí),PC的高5位地址保持不變。指令執(zhí)行后程序可轉(zhuǎn)向當(dāng)前PC值(指令地址+2)的2KB范圍內(nèi)。如0200H地址上有指令A(yù)JMP0B23H則轉(zhuǎn)移無(wú)效。因?yàn)?0B23H-(0200H+2))=921H>7FFH。③絕對(duì)轉(zhuǎn)移指令絕對(duì)轉(zhuǎn)移指令提供11位地址取代當(dāng)前PC的低11位,形成新的PC值,即為絕對(duì)轉(zhuǎn)移地址。格式:AJMPaddr11

;PC←(PC)+2,PC10~0←addr11,PC15~11不變·67·④間接轉(zhuǎn)移指令

間接轉(zhuǎn)移指令又稱散轉(zhuǎn)指令,為單字節(jié)指令。常用于實(shí)現(xiàn)程序的分支轉(zhuǎn)移(散轉(zhuǎn))。JMP @A+DPTR;PC←(A)+(DPTR)

目的地址由數(shù)據(jù)指針寄存器DPTR和累加器A中的內(nèi)容相加得到。若相加的結(jié)果大于64KB,則從程序存儲(chǔ)器的零地址往下延續(xù)。指令執(zhí)行后數(shù)據(jù)指針寄存器DPTR和累加器A中的內(nèi)容不受影響。

該指令常用于多分支程序。將DPTR的值固定,放目的地址的首地址,給A不同的值即可實(shí)現(xiàn)程序的多分支轉(zhuǎn)移?!?8·【例3.5】利用間接轉(zhuǎn)移指令實(shí)現(xiàn)鍵盤譯碼散轉(zhuǎn)。設(shè)非編碼鍵盤,鍵值分別為00、01、02、…,對(duì)應(yīng)按鍵的處理程序?yàn)镵0、K1、K2、…,寫出按鍵的譯碼程序段。程序段如下:CLRC MOVR0,ARLCAADDA,R0 ;A←(A)

3,因LJMP為3字節(jié)指令MOVDPTR,#KTABLE;將按鍵命令跳轉(zhuǎn)表首地址送至DPTRJMP@A+DPTRKTABLE: LJMPK0;轉(zhuǎn)移至按鍵00處理程序K0·69·

小貼士:由于LJMP為3字節(jié)指令,所以執(zhí)行間接轉(zhuǎn)移指令時(shí)A中內(nèi)容需乘以3,轉(zhuǎn)移指令入口地址相隔3字節(jié),才能正確轉(zhuǎn)移到相應(yīng)的按鍵處理程序。(續(xù)上)KTABLE+3:LJMPK1 ;轉(zhuǎn)移至按鍵01處理程序K1KTABLE+6:LJMPK2 ;轉(zhuǎn)移至按鍵02處理程序K2

…K0:

…K1:

…K2:

…·70·2.條件轉(zhuǎn)移指令(8條)

條件轉(zhuǎn)移指令根據(jù)指令中規(guī)定的條件判斷是否轉(zhuǎn)移,若規(guī)定條件滿足時(shí),程序轉(zhuǎn)移到目的地址;否則,程序往下順序執(zhí)行。AT89C51單片機(jī)的條件轉(zhuǎn)移指令包括累加器判零轉(zhuǎn)移指令、數(shù)值比較轉(zhuǎn)移指令和循環(huán)轉(zhuǎn)移指令。①累加器判零轉(zhuǎn)移指令(2條)

以累加器A中內(nèi)容是否為零作為判斷條件的轉(zhuǎn)移指令,為2字節(jié)指令?!?1·JZrel ;若(A)=0,則(PC)=(PC+2)+rel;若(A)

0,則(PC)=(PC)+2JNZrel ;若(A)

0,則(PC)=(PC+2)+rel;若(A)=0,則(PC)=(PC)+2

其中,rel為偏移量,用補(bǔ)碼表示,取值范圍為-128~+127。滿足條件程序轉(zhuǎn)移至目的地址執(zhí)行,與SJMP指令類似。②數(shù)值比較轉(zhuǎn)移指令(4條)

數(shù)值比較轉(zhuǎn)移指令是將兩個(gè)操作數(shù)進(jìn)行比較,以比較的結(jié)果作為條件控制程序轉(zhuǎn)移的操作指令。是AT89C51指令系統(tǒng)中僅有的包含三個(gè)操作數(shù)(CY隱含在操作碼中)指令,為3字節(jié)指令?!?2·CJNEA,direct,rel;(A)=(direct),則(PC)=(PC+3),CY=0;(A)>(direct),則(PC)=(PC+3)+rel,CY=0;(A)<(direct),則(PC)=(PC+3)+rel,CY=1CJNEA,#data,rel ;(A)=data,則(PC)=(PC+3),CY=0;(A)>data,則(PC)=(PC+3)+rel,CY=0;(A)<data,則(PC)=(PC+3)+rel,CY=1CJNERn,#data,rel ;(Rn)=data,則(PC)=(PC+3),CY=0;(Rn)>data,則(PC)=(PC+3)+rel,CY=0;(Rn)<data,則(PC)=(PC+3)+rel,CY=1CJNE@Ri,#data,rel ;((Rn))=data,則(PC)=(PC+3),CY=0;((Rn))>data,則(PC)=(PC+3)+rel,CY=0;((Rn))<data,則(PC)=(PC+3)+rel,CY=1

數(shù)值比較轉(zhuǎn)移指令是AT89C51指令系統(tǒng)中僅有的包含三個(gè)操作數(shù)(CY隱含在操作碼中)指令,為3字節(jié)指令。程序轉(zhuǎn)移的范圍為PC當(dāng)前值為起始的-128~+127個(gè)單元地址?!?4·

小貼士:當(dāng)直接地址為是I/O地址,數(shù)據(jù)是從單片機(jī)的輸出數(shù)據(jù)鎖存器(P0~P3)讀入,而不是讀引腳的狀態(tài)。③循環(huán)轉(zhuǎn)移指令

循環(huán)轉(zhuǎn)移指令也稱為減1條件轉(zhuǎn)移指令,是對(duì)源操作數(shù)減1后將結(jié)果是否為零作為判斷條件的轉(zhuǎn)移指令。DJNZRn,rel ;(Rn)←(Rn)-1, ;若(Rn)

0,(PC)←(PC)+2+rel ;若(Rn)=0,(PC)←(PC)+2DJNZdirect,rel ;(direct)←(direct)-1,因是3字節(jié)指令 ;若(direct)

0,(PC)←(PC)+3+rel ;若(direct)=0,(PC)←(PC)+3該類指令常用于循環(huán)結(jié)構(gòu),實(shí)現(xiàn)按循環(huán)次數(shù)控制循環(huán)的目的?!?5·3.子程序調(diào)用及返回指令(4條)AT89C51有專門的子程序調(diào)用和返回指令。主程序可通過(guò)子程序調(diào)用指令多次調(diào)用子程序,子程序執(zhí)行完畢后,再返回原調(diào)用處繼續(xù)往下執(zhí)行。

被獨(dú)立出來(lái)、反復(fù)多次執(zhí)行且具有一定功能的程序段稱為子程序。調(diào)用子程序的程序稱為主程序。①調(diào)用指令

調(diào)用指令自動(dòng)將PC中的斷點(diǎn)地址壓棧保護(hù),并將子程序的入口地址自動(dòng)送至PC?!?6·√短調(diào)用指令(或絕對(duì)調(diào)用指令)格式:ACALLaddr11;(PC)←(PC)+2,當(dāng)前PC值 ;(SP)←(SP)+1,(SP)←(PC0~7) ;(SP)←(SP)+1,(SP)←(PC8~15) ;(PC11~15)不變,(PC0~10)←add0~10特點(diǎn):所調(diào)用子程序的首址須與ACALL指令的下一條指令在同一個(gè)2KB區(qū)域內(nèi)?!涕L(zhǎng)調(diào)用指令格式:LCALLaddr16;(PC)←(PC)+3,當(dāng)前PC值 ;(SP)←(SP)+1,(SP)←(PC0~7); ;(SP)←(SP)+1,(SP)←(PC8~15); ;(PC)←add0~15特點(diǎn):所調(diào)用子程序的首址須與ACALL指令的下一條指令在同一個(gè)2KB區(qū)域內(nèi)?!?7·②返回指令√子程序返回指令

子程序返回指令是指結(jié)束子程序運(yùn)行,回到主程序斷點(diǎn)處繼續(xù)往下執(zhí)行的操作指令。格式:RET ;PC15~8←(SP),(SP)←(SP)–1; ;PC7~0←(SP),(SP)←(SP)–1;特點(diǎn):執(zhí)行該指令時(shí),將堆棧棧頂?shù)臄帱c(diǎn)地址彈出,送回到程序計(jì)數(shù)器PC,并將堆棧指針減2。指令執(zhí)行后不影響標(biāo)志位?!?8·

小貼士:子程序返回指令和中斷返回指令都應(yīng)寫在子程序段內(nèi),是子程序執(zhí)行的最后一條指令。中斷返回指令執(zhí)行后至少再執(zhí)行一條指令,才能響應(yīng)新的中斷?!讨袛喾祷刂噶?/p>

中斷返回指令是結(jié)束中斷服務(wù)程序的執(zhí)行,返回主程序處繼續(xù)執(zhí)行的操作指令。格式:RETI;PC15~8←(SP),(SP)←(SP)–1; ;PC7~0←(SP),(SP)←(SP)–1;

;IE=0,開(kāi)放中斷邏輯;

特點(diǎn):中斷返回指令除具有子程序返回指令所具有的所有功能外,還具有清除內(nèi)部相應(yīng)的中斷狀態(tài)寄存器、恢復(fù)中斷邏輯以接受新的中斷請(qǐng)求等功能?!?9·

小貼士:空操作指令是單字節(jié)、單周期指令,常用于在程序中產(chǎn)生1個(gè)機(jī)器周期的時(shí)間延遲或在程序存儲(chǔ)器ROM中占據(jù)一個(gè)字節(jié)空間,可設(shè)計(jì)精確的軟件延時(shí)程序。4.空操作指令

空操作指令只是將程序計(jì)數(shù)器PC加1,不完成任何操作,也不影響其他寄存器和標(biāo)志位。格式:

NOP ;(PC)←(PC)+1·80·3.2.7布爾(位)操作類指令

布爾操作指令也稱為位操作指令,是以位(bit)為單位進(jìn)行運(yùn)算和操作的指令。能尋址片內(nèi)RAM的20H~2FH(共128位)和片內(nèi)11個(gè)可位尋址的特殊功能寄存器SFR中的83個(gè)可尋址位,以P0、P1、P2、P3為位I/O口。AT89C51指令系統(tǒng)中位操作指令共有17條,包括位傳送指令、位清零與置位指令、位邏輯運(yùn)算指令以及位控制轉(zhuǎn)移指令。1.布爾(位)傳送指令(2條)格式:

MOVC,bit ;(C)←(bit) MOVbit,C ;(bit)←(C)特點(diǎn):指令執(zhí)行不影響除了CY位外的其他寄存器或標(biāo)志位。·81·2.位的置位與清零指令(4條)

空操作指令只是將程序計(jì)數(shù)器PC加1,不完成任何操作,也不影響其他寄存器和標(biāo)志位。格式:

SETB C ;(C)←1 SETBbit ;(bit)←1 CLR C ;(C)←0CLRbit ;(bit)←0特點(diǎn):對(duì)CY及可尋址位進(jìn)行清0、置1的操作指令。不影響其他寄存器或標(biāo)志位.·82·解:程序段如下:MOVR1,#3 ;3個(gè)方波LOOP:SETBP1.4;使P1.4位輸出為“1”NOPNOP ;延時(shí)2個(gè)機(jī)器周期CLR P1.4 ;使P1.4位輸出為“0”DJNZR1,LOOP;循環(huán)輸出,指令為2個(gè)機(jī)器周期【例3.6】編程實(shí)現(xiàn)在AT89C51的P1.4腳輸出3個(gè)方波,周期為6個(gè)機(jī)器周期?!?3·3.位邏輯運(yùn)算指令(6條)

位邏輯運(yùn)算指令是對(duì)CY及可尋址位進(jìn)行邏輯運(yùn)算的操作指令,包括與、或、取反三種操作。格式:ANL C, bit ;(C)←(C)∧(bit)ANL C, /bit ;(C)←(C)∧(/bit)ORL C, bit ;(C)←(C)∨(bit)ORL C, /bit ;(C)←(C)∨(/bit)CPL C ;(C)←(/C)

CPL bit ;bit←(/bit)·84·4.位控制轉(zhuǎn)移指令(5條)

以位的狀態(tài)作為程序轉(zhuǎn)移判斷條件,從而實(shí)現(xiàn)程序的控制轉(zhuǎn)移。若條件滿足則程序轉(zhuǎn)移到目的地址執(zhí)行,不滿足程序順序往下執(zhí)行。①以位累加器C為條件的轉(zhuǎn)移指令JC rel ;若(C)=1,則PC←(PC)+2+rel ;若(C)≠1,則PC←(PC)+2JNC rel ;若(C)=0,則PC←(PC)+2+rel ;若(C)≠0,則PC←(PC)+2·85·②以位狀態(tài)為條件的轉(zhuǎn)移指令JBbit,rel ;若(bit)=1,則PC←(PC)+3+rel ;若(bit)≠1,則PC←(PC)+3JNBbit,rel ;若(bit)=0,則PC←(PC)+3+rel ;若(bit)≠0,則PC←(PC)+3JBCbit,rel;若(bit)=1,則PC←(PC)+3+rel,

;且bit←0 ;若(bit)≠1,則PC←(PC)+3注意:JB和JBC指令的轉(zhuǎn)移條件相同,但JBC指令在轉(zhuǎn)移的同時(shí)還將bit位內(nèi)容清零。AT89C51單片機(jī)可利用位操作指令,把由模擬或數(shù)字電路實(shí)現(xiàn)的控制功能改由軟件方法實(shí)現(xiàn)。解:程序段: ORG 0000H JMP START ORG 1000HSTART: MOV C,P1.1 ;(C)←Y ANL C,/P1.0 ;(C)←(Y)∧(/X) CPL C ;(C)←(/C) MOV F0,C ;F0暫存/((Y)∧(/X))的結(jié)果 MOV C,P1.2 ;(C)←Z ORL C,P1.1 ;(C)←(Y)∨(Z) ORL C,F0 ;得到輸出 MOV P1.3,C ;輸出結(jié)果到P1.3 JMP START ;跳轉(zhuǎn) END·86·【例3.7】對(duì)如圖所示組合邏輯電路,編寫程序模擬其功能。設(shè)輸入信號(hào)X、Y、Z由P1.0、P1.1、P1.2讀入,輸出由P1.3口輸出?!?7·3.389C51匯編語(yǔ)言程序設(shè)計(jì)

匯編語(yǔ)言程序設(shè)計(jì)指采用匯編指令來(lái)編寫計(jì)算機(jī)程序,是面向過(guò)程的設(shè)計(jì)。匯編語(yǔ)言程序設(shè)計(jì)一般可分為下面幾個(gè)步驟:根據(jù)實(shí)際問(wèn)題,初步確定程序的規(guī)模,選擇合適的單片機(jī)型號(hào)進(jìn)行系統(tǒng)設(shè)計(jì),提出硬件電路和軟件設(shè)計(jì)方案。確定方案和算法。繪制程序流程圖。根據(jù)已有的程序框圖用匯編語(yǔ)言編制出源程序。將編制完畢的程序在編譯仿真軟件中進(jìn)行調(diào)試,檢查并修改錯(cuò)誤,直至和預(yù)期的運(yùn)行結(jié)果吻合。將程序下載到所選用的單片機(jī),并在實(shí)際硬件電路中運(yùn)行程序。

編程時(shí)應(yīng)盡量采用模塊化、結(jié)構(gòu)化程序設(shè)計(jì)方案,使程序簡(jiǎn)明清晰、易于閱讀、可移植強(qiáng)、可靠性高?!?8·3.3.1匯編語(yǔ)言格式指令語(yǔ)句一般包括四個(gè)字段:標(biāo)號(hào)、操作碼、操作數(shù)和注釋。格式如下:【標(biāo)號(hào)(名字):】助記符(操作碼)【操作數(shù)(參數(shù))】【;注釋】

其中[]項(xiàng)是可選項(xiàng)。標(biāo)號(hào)

用于語(yǔ)句的開(kāi)始,表明該條指令在程序編譯時(shí)的具體地址。由數(shù)字和字母組成,還可使用下劃線符號(hào)“_”。一般不超過(guò)8個(gè),以字母打頭、冒號(hào)“:”結(jié)尾。

標(biāo)號(hào)可有可無(wú),可作為其他指令的地址。標(biāo)號(hào)可以用賦值偽指令賦值。若沒(méi)有賦值,匯編程序會(huì)自動(dòng)將該指令第一字節(jié)的地址賦給該標(biāo)號(hào)。

標(biāo)號(hào)不能使用匯編語(yǔ)言中已經(jīng)定義的符號(hào)作標(biāo)號(hào),如指令助記符、偽指令等?!?9·

小貼士:偽指令語(yǔ)句的格式與指令語(yǔ)句類似,主要不同是其名字后面沒(méi)有冒號(hào)。操作碼操作碼是指令的助記符,說(shuō)明語(yǔ)句所執(zhí)行的操作。操作數(shù)操作數(shù)是表示該語(yǔ)句操作的數(shù)據(jù)或數(shù)據(jù)所在的地址。操作數(shù)字段可以是操作數(shù)本身,也可是操作數(shù)所在地址,表示方法多,有7種尋址方式。操作數(shù)字段中的常數(shù)可用不同進(jìn)制的數(shù)表示。注釋注釋字段是為增加程序的可讀性所加的說(shuō)明,可有可無(wú),由“;”開(kāi)始,編譯時(shí)不生成目標(biāo)代碼。注釋長(zhǎng)度不限,可換行,但換行開(kāi)頭仍需加上“;”?!?0·偽指令語(yǔ)句主要由偽操作命令組成,用來(lái)對(duì)源程序進(jìn)行說(shuō)明和設(shè)置運(yùn)行環(huán)境。如要指定程序或數(shù)據(jù)存放的起始地址,給待存放的數(shù)據(jù)確定單元地址等。偽指令不是單片機(jī)真正要執(zhí)行的指令,它僅僅在匯編過(guò)程中起作用。不同種類的匯編程序提供了各自的偽指令集,不同的單片機(jī)開(kāi)發(fā)裝置所定義的偽指令也各有差異。匯編程序起始偽指令ORGORG偽指令用于設(shè)置匯編程序或數(shù)據(jù)存放的起始地址。格式如下:

【標(biāo)號(hào):】 ORG 16位地址在一個(gè)源程序中,可多次使用ORG指令,以規(guī)定不同程序段的起始位置。但一般規(guī)定,地址應(yīng)由小到大,不能重疊。若不用該指令,則從0000H開(kāi)始存放。3.3.2偽指令語(yǔ)句·91·例如: ORG 0300HSTART: MOVA,#32H分析:“ORG 0300H”即表示程序從0300H地址開(kāi)始執(zhí)行,則標(biāo)號(hào)START的地址為0300H。匯編程序結(jié)束偽指令ENDEND偽指令是匯編語(yǔ)言源程序的結(jié)束標(biāo)志。格式如下:【標(biāo)號(hào):】 END 【表達(dá)式】在程序中,END通知匯編程序匯編到此結(jié)束。每個(gè)源程序都有且只有一個(gè)有END指令,對(duì)于同時(shí)包含有主程序和子程序的匯編源程序,同樣也只能有一個(gè)END偽指令。主程序模塊:【標(biāo)號(hào):】 END 【表達(dá)式】子程序模塊:【標(biāo)號(hào):】 END ·92·賦值偽指令EQUEQU偽指令是將數(shù)據(jù)或匯編符號(hào)賦給字符名稱,使字符名稱與數(shù)據(jù)或匯編符號(hào)等值的操作。格式如下:

字符名稱 EQU 數(shù)據(jù)或匯編符號(hào)

賦值偽指令給程序的編寫和調(diào)試帶來(lái)極大的方便。用EQU指令賦值以后的標(biāo)號(hào)可在程序中作為數(shù)據(jù)地址、代碼地址、位地址甚至一個(gè)立即數(shù)來(lái)使用,一旦要修改,只要修改EQU后的部分就可以了,無(wú)需逐項(xiàng)修改。所賦的值可以是8位或16位數(shù)。

小貼士:這里使用的“字符名稱”不是標(biāo)號(hào),不能用“:”來(lái)做分隔符?!?3·4.定義字節(jié)偽指令DBDB偽指令是將表達(dá)式中的8位字節(jié)數(shù)據(jù)按序依次存入從標(biāo)號(hào)開(kāi)始指定的地址單元。格式如下:

【標(biāo)號(hào):】DB 表達(dá)式或表達(dá)式表其中,表達(dá)式可以是一個(gè)或多個(gè)字節(jié)數(shù)據(jù)串、字符串,各項(xiàng)數(shù)據(jù)用“,”分隔,一個(gè)字節(jié)數(shù)據(jù)項(xiàng)占一個(gè)存儲(chǔ)單元?!?4·例如: ORG 2000HTABLE: DB 02H,04H,31,10H

DB 10B,’AB’

……分析:偽指令經(jīng)匯編后,結(jié)果為

(2000H)=02H,(2001H)=04H,(2002H)=31=1FH,(2003H)=10H,(2004H)=10B=02H,(2005H)=41H,(2006H)=42H

小貼士:DB偽指令中用引號(hào)括起的是字符串。若不采用ORG偽指令專門規(guī)定數(shù)據(jù)區(qū)的起始地址,則起始地址即根據(jù)DB命令前一條指令的地址確定,為DB命令前一條指令的地址加上該指令的字節(jié)數(shù)。

·95·5.定義字偽指令DWDW偽指令是將表達(dá)式中的字?jǐn)?shù)據(jù)按序依次存入從標(biāo)號(hào)開(kāi)始指定的地址單元,字的高字節(jié)數(shù)存入低地址單元,低字節(jié)數(shù)存入高地址單元。格式如下:

【標(biāo)號(hào):】DW 表達(dá)式或表達(dá)式表DW的功能與DB類似。但表達(dá)式是16位地址。6.定義存儲(chǔ)空間偽指令DSDS偽指令是從標(biāo)號(hào)指定的程序存儲(chǔ)器地址單元開(kāi)始,連續(xù)預(yù)留若干個(gè)存儲(chǔ)單元以備源程序使用,保留存儲(chǔ)單元的數(shù)量由表達(dá)式指定。格式如下:

【標(biāo)號(hào):】DW 表達(dá)式或表達(dá)式表

表達(dá)式可以是十進(jìn)制數(shù),也可以是16進(jìn)制數(shù)。匯編時(shí),對(duì)預(yù)留的地址單元不賦值?!?6·

小貼士:

DB、DW、DS偽指令都只能對(duì)程序存儲(chǔ)器ROM使用,不能對(duì)數(shù)據(jù)存儲(chǔ)器進(jìn)行操作。一般常以DB來(lái)定義數(shù)據(jù),以DW來(lái)定義地址,DS定義預(yù)留空間。DB和DW定義數(shù)據(jù)較多時(shí),可分行使用多條語(yǔ)句定義。定義位地址符號(hào)偽指令BITBIT偽指令用于將位地址賦予所規(guī)定的字符名稱。格式如下:

字符名稱 BIT 位地址其中,位地址可以是符號(hào)地址也可以是絕對(duì)地址?!?7·8.數(shù)據(jù)地址賦值偽指令DATADATA偽指令是數(shù)據(jù)地址賦值偽指令,即將數(shù)據(jù)地址或代碼地址賦予規(guī)定的字符名稱,常用來(lái)在程序中定義數(shù)據(jù)地址。格式如下:

字符名稱 DATA 表達(dá)式DATA偽指令與EQU偽指令功能相似,其差別是:EQU偽指令必須先定義后使用,而DATA偽指令則可先使用后定義,因此DATA也常可放在程序末尾;EQU偽指令可把一個(gè)匯編符號(hào)賦給一個(gè)字符名稱,而DATA偽指令中的表達(dá)式可能是一個(gè)數(shù)據(jù),一個(gè)地址或一個(gè)字符變量,但不能是匯編符號(hào)?!?8·順序結(jié)構(gòu)是簡(jiǎn)單而基本的的程序結(jié)構(gòu),程序按照指令編寫的順序依次執(zhí)行每一條指令,也稱為簡(jiǎn)單結(jié)構(gòu)程序。3.3.3順序結(jié)構(gòu)程序設(shè)計(jì)【例3.8】將兩個(gè)半字節(jié)的數(shù)合并成一個(gè)字節(jié)的數(shù)。分析:設(shè)兩個(gè)8位二進(jìn)制數(shù)分別存放在片內(nèi)RAM的20H、21H單元,現(xiàn)要求取出20H單元的低半字節(jié)和21H單元的高半字節(jié)合并,并存放于22H單元中。程序如下: ORG 0000H LJMP START

ORG 1000HSTART:MOVR0,#20H MOVA,@R0 ANLA,#0FH ;取20H單元低半字節(jié)INCR0(續(xù)上)XCHA,@R0;取第二字節(jié)ANLA,#0F0H;取21H單元高個(gè)半字節(jié)ORLA,@R0;兩半字節(jié)合并INCR0MOV@R0,A;存放結(jié)果END【例3.9】計(jì)算兩個(gè)16位二進(jìn)制無(wú)符號(hào)數(shù)加法程序?!?9·分析:一個(gè)16位二進(jìn)制無(wú)符號(hào)數(shù)占有兩個(gè)地址單元,設(shè)現(xiàn)兩數(shù)16位分別存于寄存器R0、R1、R2、R3中。其中,R0和R2分別為高字節(jié),R1和R3分別為低字節(jié)。兩個(gè)數(shù)相加的結(jié)果存放在以20H開(kāi)始的單元中,其中20H存進(jìn)位位,21H存高字節(jié),22H存低字節(jié)。程序如下:ORG 1000H ;匯編程序起始命令CLR CMOV A,R1 ;將一個(gè)加數(shù)送到累加器A中ADDA,R3 ;累加器A中的數(shù)據(jù)和另一個(gè)加數(shù)相加,并將結(jié)果送入AMOV 22H,A ;將結(jié)果送入內(nèi)存單元22H中MOVA,R0 ;將一個(gè)加數(shù)的高字節(jié)送到累加器A中ADDCA,R2 ;A和另一個(gè)加數(shù)的高字節(jié)進(jìn)行帶進(jìn)位相加MOV 21H,A ;將結(jié)果送入內(nèi)存單元21H中CLR AADDCA,#00H;加進(jìn)位位MOV 20H,A ;將結(jié)果進(jìn)位位送入內(nèi)存單元20H中END ;程序結(jié)束·100·分支結(jié)構(gòu)程

溫馨提示

  • 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)論