微處理器結(jié)構(gòu)與嵌入式系統(tǒng)設(shè)計(jì)第三講_第1頁(yè)
微處理器結(jié)構(gòu)與嵌入式系統(tǒng)設(shè)計(jì)第三講_第2頁(yè)
微處理器結(jié)構(gòu)與嵌入式系統(tǒng)設(shè)計(jì)第三講_第3頁(yè)
微處理器結(jié)構(gòu)與嵌入式系統(tǒng)設(shè)計(jì)第三講_第4頁(yè)
微處理器結(jié)構(gòu)與嵌入式系統(tǒng)設(shè)計(jì)第三講_第5頁(yè)
已閱讀5頁(yè),還剩73頁(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、微處理器結(jié)構(gòu)與嵌入式系統(tǒng)設(shè)計(jì)第三講 單片機(jī)指令系統(tǒng)認(rèn)識(shí)匯編語(yǔ)言匯編語(yǔ)言(assembly language)是一種低級(jí)的計(jì)算機(jī)編程語(yǔ)言,它直接與計(jì)算機(jī)的機(jī)器碼打交道。用匯編語(yǔ)言設(shè)計(jì)的程序稱為匯編程序。匯編程序在Vision中匯編之后可生成以.HEX為后綴的執(zhí)行代碼文件執(zhí)行代碼是一系列的十六進(jìn)制數(shù),與指令一一對(duì)應(yīng)。除了匯編語(yǔ)言外,C51語(yǔ)言也可以用來(lái)設(shè)計(jì)單片機(jī)程序。C51語(yǔ)言是高級(jí)語(yǔ)言,它與C語(yǔ)言極為相似,大多數(shù)單片機(jī)程序開(kāi)發(fā)環(huán)境(如Vision)都支持C51語(yǔ)言。但無(wú)論是匯編語(yǔ)言或是C51語(yǔ)言,經(jīng)過(guò)匯編后結(jié)果都是一樣的生成以.HEX為后綴的執(zhí)行代碼文件。從匯編程序到執(zhí)行代碼匯編指令(instr

2、uction set):一條指令“指揮”單片機(jī)完成一個(gè)操作。比如指令“MOV P1,A”實(shí)現(xiàn)將累加器A中的數(shù)據(jù)從P1輸出。51單片機(jī)的指令分為了算術(shù)運(yùn)算指令、邏輯運(yùn)算指令、數(shù)據(jù)傳送指令、布爾指令、調(diào)用指令、跳轉(zhuǎn)指令、循環(huán)指令等。匯編程序(assembly program):經(jīng)過(guò)設(shè)計(jì)者思考和組織,將許多指令組合在一起形成實(shí)現(xiàn)特定功能的集合,就是匯編程序。源文件(source code file):匯編程序在開(kāi)發(fā)環(huán)境中設(shè)計(jì)、書(shū)寫(xiě),保存時(shí)以.asm為后綴就成了源文件。執(zhí)行代碼文件(opcode or operation code):匯編過(guò)程中,匯編器將源文件中每一條指令匯編成執(zhí)行代碼。某條指令的執(zhí)行

3、代碼的長(zhǎng)度在1個(gè)到3個(gè)字節(jié)之間。執(zhí)行代碼會(huì)以.HEX為后綴以文件的形式保存在硬盤中,再使用下載線就可以把這些執(zhí)行代碼下載到單片機(jī)的程序存儲(chǔ)器。中。偽指令偽指令(pseudo opcode)并不算可執(zhí)行程序的一部分,所以不會(huì)被匯編器匯編,也不生成執(zhí)行代碼,但卻告知匯編器一些信息。如常用的偽指令ORG告訴匯編器程序的起始地址、偽指令END表明匯編程序的結(jié)束。指令的執(zhí)行指令“MOV A, 32H”,將數(shù)據(jù)存儲(chǔ)器地址32H中的內(nèi)容載入累加器A。這條指令經(jīng)過(guò)匯編后在程序存儲(chǔ)器中形成的執(zhí)行代碼為“E5”、“32”。“E5”是這條MOV指令的執(zhí)行代碼,“32”是源操作數(shù)32H。首先,當(dāng)程序計(jì)數(shù)器PC指向執(zhí)行

4、代碼E5時(shí),CPU就“意識(shí)到”要執(zhí)行的操作是把下一個(gè)執(zhí)行代碼所指向的數(shù)據(jù)存儲(chǔ)器地址中的數(shù)據(jù)載入累加器A。PC加1,CPU根據(jù)PC所指抓取下一個(gè)執(zhí)行代碼“32”。于是CPU機(jī)到數(shù)據(jù)存儲(chǔ)器地址32H中取得數(shù)據(jù)()。并把所得數(shù)據(jù)載入累加器A,最后A=88H。尋址方式 直接尋址直接尋址(direct addressing):直接地址的內(nèi)容載入一個(gè)寄存器中或寄存器的內(nèi)容載入直接地址中。AT89S51單片機(jī)片內(nèi)數(shù)據(jù)存儲(chǔ)器的00H7FH(但常用30H7FH)以及特殊功能寄存器SFR都能被直接尋址。注意地址前是沒(méi)有“#”號(hào)的。如以下幾條指令屬于直接尋址指令: MOVA, 30H;把直接地址30H上的內(nèi)容載入累

5、加器AMOV50H, B;把B寄存器的值載入直接地址50H上 ADDA, 60H;累加器A和直接地址60H的內(nèi)容相加,結(jié)果存回A 間接尋址間接尋址:用R0、R1、SP、DPTR中的某一寄存器來(lái)代替直接尋址中的直接地址來(lái)尋址。其中“”符號(hào)表示間接尋址,注意在書(shū)寫(xiě)時(shí)不要遺漏。 MOVR1, #32H; R1=32HMOVA, R1; R1所指向的地址的內(nèi)容載入ACC中 寄存器尋址寄存器尋址:是指與工作寄存器R0R7有關(guān)的尋址指令。例如: MOVA, R0 ;將R0的值載入累加器A ADDA, R5 ;將A與R5的值相加,并把結(jié)果存回AMOVR7, A ;將A的值載入R7中 立即數(shù)尋址立即尋址:與立

6、即數(shù)相關(guān)的尋址方式。立即數(shù)的特征就是在數(shù)據(jù)前加一個(gè)“#”號(hào)。這類尋址方式比較簡(jiǎn)單,如以下幾條指令都屬于立即尋址指令: MOV A, #100;將立即數(shù)100(64H)載入累加器A MOV 33H, #10H;將立即數(shù)10H載入數(shù)據(jù)存儲(chǔ)器地址33H上 MOV R0, #0FFH;R0=FFH 變址尋址變址尋址:針對(duì)的僅是程序存儲(chǔ)器,而且這種尋址方式只能從程序存儲(chǔ)器中讀數(shù)據(jù)。通常我們對(duì)程序存儲(chǔ)器訪問(wèn)得較多的是數(shù)據(jù)表中的數(shù)據(jù)(比如取表法)。在變址尋址中,使用程序計(jì)數(shù)器PC或數(shù)據(jù)指針DPTR作為間接地址,有時(shí)還加上累加器A,根據(jù)這些間接地址在程序存儲(chǔ)器找到相應(yīng)的內(nèi)容。 MOVCA, A+DPTR;累加

7、器A和數(shù)據(jù)指針DPTR 之和作為間接地址,將該地址上的數(shù)據(jù)載A 寄存器特征尋址寄存器特征尋址:與特定寄存器有關(guān)的尋址方式。有些指令總是與累加器A或數(shù)據(jù)指針寄存器DPTR等有關(guān),而沒(méi)有涉及其他地址。這類指令只影響特定寄存器,不會(huì)改變其他地址或寄存器。如以下幾條指令屬于寄存器特征尋址指令: INC A;累加器A自增1 SWAP A;A的高4位與低4位互換 INCDPTR;數(shù)據(jù)指針DPTR自增1指令分類 指令概述51單片機(jī)的指令共有111條(見(jiàn)附錄B),配合與不同的操作數(shù)共有255個(gè)指令的寫(xiě)法,即255種指令的執(zhí)行代碼(見(jiàn)附錄C)。實(shí)際應(yīng)用中,常用的指令一般不過(guò)50個(gè)。根據(jù)功能的不同,51單片機(jī)的指

8、令分成了以下幾大類:算術(shù)指令邏輯指令片內(nèi)數(shù)據(jù)裝載指令片外數(shù)據(jù)裝載指令查表指令布爾指令調(diào)用子程序指令跳轉(zhuǎn)與循環(huán)指令 指令長(zhǎng)度一條指令所占用的地址空間在14個(gè)字節(jié)之內(nèi),附錄B、C中有每一條指令的長(zhǎng)度描述。如指令“CLR A”的執(zhí)行代碼為E41字節(jié)指令;指令“MOV A, #88H”的執(zhí)行代碼為74、882字節(jié)指令;指令“CJNE A, #00H, START”的執(zhí)行代碼為B4、00、FA3字節(jié)指令。算術(shù)運(yùn)算指令 加法指令 在單片機(jī)做加法運(yùn)算時(shí),都要涉及累加器A。加法指令“ADD A, ”中的“A”代表累加器A,“”代表“源操作數(shù)-以字節(jié)形式”。也就是說(shuō)“A”和“”是兩個(gè)加數(shù)。根據(jù)源操作數(shù)的不同,加

9、法指令有4種指令形式,其中Rn代表R0R7任一個(gè)工作寄存器,direct代表一個(gè)直接地址,Ri代表間接地址(Ri只代表R0或R1),#data代表立即數(shù)。說(shuō)明: 相加的操作總是在累加器A中發(fā)生,源操作數(shù)可以是一個(gè)工作寄存器的值、直接地址的內(nèi)容、間接地址的內(nèi)容或立即數(shù)。注意,兩個(gè)直接地址的內(nèi)容相加是不允許的,如“ ”是錯(cuò)誤的。 加法指令有可能影響程序狀態(tài)字PSW中的標(biāo)志位CY、OV、AC、P。如果相加過(guò)程中,位3(低位)有進(jìn)位則輔助進(jìn)位標(biāo)志位AC=1;位7(高位)有進(jìn)位則進(jìn)位標(biāo)志位CY=1。 溢出標(biāo)志位OV的變化規(guī)律是:如果位6有進(jìn)位而位7沒(méi)有進(jìn)位,或者位7有進(jìn)位而位6沒(méi)有,則溢出標(biāo)志OV=1,

10、否則OV=0。注意,OV的狀態(tài)只有在帶符號(hào)數(shù)加法運(yùn)算時(shí)才有意義?!纠?-1】執(zhí)行以下兩行指令,觀察標(biāo)志位的變化。執(zhí)行以下兩行指令,觀察標(biāo)志位的變化。MOV A, #0F5H ; A=0F5HADD A, #0BH ; A=0F5+0BH=00H,CY=1,AC=1運(yùn)算過(guò)程:運(yùn)算過(guò)程:運(yùn)算結(jié)果:運(yùn)算結(jié)果:A=00,標(biāo)志位情況如下:CY=1由于位7有進(jìn)位。AC=1由于位3向位4進(jìn)位。P=0由于運(yùn)算結(jié)果A=0000 0000,其中1的個(gè)數(shù)是0(偶數(shù)),所以P=0。 帶進(jìn)位的加法指令帶進(jìn)位的加法指令相當(dāng)于在加法運(yùn)算之后再加上進(jìn)位CY,如果CY=0,結(jié)果不變;如果CY=1,結(jié)果加1。其帶進(jìn)位的加法指令形

11、式與加法指令相似。【例8-2】寫(xiě)一段程序作寫(xiě)一段程序作3CE7H和和3B8DH的加法運(yùn)算,將運(yùn)算結(jié)果的低位字節(jié)存到的加法運(yùn)算,將運(yùn)算結(jié)果的低位字節(jié)存到R0中,高位字節(jié)存到中,高位字節(jié)存到R1中。中。程序:程序:運(yùn)算結(jié)果:運(yùn)算結(jié)果:R1=78H,R0=74H。 帶借位的減法指令在單片機(jī)做減法運(yùn)算時(shí),也要涉及累加器A。當(dāng)單片機(jī)進(jìn)行減法運(yùn)算時(shí),程序狀態(tài)字PSW中的CY位就變成了借位標(biāo)志位,即如果減法運(yùn)算過(guò)程中有借位發(fā)生,CY被硬件置1。由于SUBB指令是帶借位的減法指令,于是在運(yùn)算中就需要考慮CY對(duì)運(yùn)算的影響。說(shuō)明: 當(dāng)位7有借位時(shí),標(biāo)志CY=1;否則CY=0。也就是說(shuō),如果無(wú)符號(hào)數(shù)做減法時(shí),減數(shù)比

12、被減數(shù)大,CY=1。 當(dāng)位3有借位時(shí),標(biāo)志AC=1;否則AC=0。 溢出標(biāo)志位OV=1表示溢出;OV=0表示未溢出。OV的值可由差的位7的借位與位6的借位做XOR(異或)的邏輯判斷得到。 由于SUBB指令連CY一起減,若不想減CY,可先將CY清0。 自增/自減指令自增/自減指令是一類很簡(jiǎn)單的指令,它的作用是對(duì)寄存器的值或直接地址的內(nèi)容進(jìn)行加1/減1的操作。說(shuō)明: 如果寄存器的值或直接地址的內(nèi)容為FFH時(shí),執(zhí)行自增指令I(lǐng)NC后,寄存器的值或直接地址的內(nèi)容變?yōu)?0H,進(jìn)位標(biāo)志CY不受影響。 如果寄存器的值或直接地址的內(nèi)容為00H時(shí),執(zhí)行自減指令DEC后,寄存器的值或直接地址的內(nèi)容變?yōu)镕FH,進(jìn)位標(biāo)

13、志CY不受影響。 關(guān)于指令“INC DPTR”,若DPTR的低位字節(jié)DPL=FFH,執(zhí)行“INC DPTR”后DPL=00H,同時(shí)高位字節(jié)DPH的值增加1,CY不受影響;如果DPTR=FFFFH,執(zhí)行“INC DPTR”后,DPTR=0000H,CY也不受影響。 可對(duì)DPL和DPH分別進(jìn)行自增INC或自減DEC的操作。 乘法指令乘法運(yùn)算只針對(duì)累加器A和B寄存器中的無(wú)符號(hào)整數(shù),運(yùn)算得到的乘積長(zhǎng)度為2個(gè)字節(jié),其低位保存在累加器A中,高位保存在B寄存器中。乘法指令會(huì)對(duì)標(biāo)志位有所影響。說(shuō)明: 如果乘法運(yùn)算結(jié)果大于00FFH,OV=1,否則OV=0。 執(zhí)行乘法運(yùn)算時(shí),進(jìn)位標(biāo)志CY會(huì)被清除為0?!纠?-3

14、】執(zhí)行下面的乘法指令,觀察標(biāo)志位的變化。執(zhí)行下面的乘法指令,觀察標(biāo)志位的變化。 MOVA, #66H ; A=66H MOV B, #77H ; B=77H MULAB ; 積=66H77H=2F6AH運(yùn)算結(jié)果:運(yùn)算結(jié)果:A=6AH,B=2FH,CY=0,由于2F6AH00FFH,所以O(shè)V=1。除法指令將累加器A中的無(wú)符號(hào)數(shù)除以B寄存器中的無(wú)符號(hào)數(shù),商保存回累加器A,余數(shù)保存回B寄存器。除法指令影響標(biāo)志位。說(shuō)明: 除法指令做無(wú)符號(hào)的除法運(yùn)算。如果B寄存器=0,執(zhí)行時(shí)OV被置1,表示運(yùn)算是錯(cuò)誤的,因?yàn)槌龜?shù)不應(yīng)該為0。 除法指令正確執(zhí)行后,商存回A,余數(shù)存回B寄存器,進(jìn)位標(biāo)志CY及溢出標(biāo)志OV都等

15、于0。十進(jìn)制調(diào)整指令邏輯運(yùn)算指令 與操作(ANL) 或操作(ORL) 異或操作(XRL) 累加器A清0操作-CLR A 累加器A取反操作-CPL A移位操作 累加器A位移動(dòng)操作RL、RLC、RR、RRC說(shuō)明:這4條指令用于累加器A內(nèi)部位的移動(dòng),注意,這4條指令只適用于累加器A。 RL A累加器A左移一位。每次移出累加器A的位7進(jìn)入位0。 RLC A累加器A含進(jìn)位CY左移一位。每次移出累加器A的位7進(jìn)入進(jìn)位CY中,而進(jìn)位CY則進(jìn)入位0中。 RR A累加器A右移一位。每次移出累加器A的位0進(jìn)入位7。 RRC A累加器A含進(jìn)位CY右移一位。每次移出累加器A的位0進(jìn)入進(jìn)位CY中,而進(jìn)位CY則進(jìn)入位7中

16、。數(shù)據(jù)傳送指令 片內(nèi)數(shù)據(jù)傳送指令MOV , 數(shù)據(jù)裝載指令以MOV為助記符,指令形式為“MOV , ”,其中為目的操作數(shù),為源操作數(shù)。和代表片內(nèi)數(shù)據(jù)存儲(chǔ)器地址或特殊功能寄存器,指令在進(jìn)行不同地址空間或寄存器之間裝載時(shí)不需要通過(guò)累加器A的參與。說(shuō)明:根據(jù)目的操作數(shù)不同,數(shù)據(jù)裝載指令分成以累加器A、工作寄存器Rn、直接地址direct、間接地址Ri為目的操作數(shù)的4種不同形式。注意,立即數(shù)前需要有“#”號(hào)。在數(shù)據(jù)裝載過(guò)程中,有幾點(diǎn)需要注意: 立即數(shù)前必需要有“#”號(hào),否則裝載的將是地址空間上的數(shù)據(jù)(直接地址的內(nèi)容),如果立即數(shù)以A、B、C、D、E或F開(kāi)頭,需要在前面加上0,例如F3H,在指令中應(yīng)寫(xiě)成0

17、F3H。立即數(shù)也可以是二進(jìn)制或十進(jìn)制的形式,例如,如下3條指令裝載的效果是相同的。MOV A, #0F3H ; 十六進(jìn)制MOV A, #11110011B ; 二進(jìn)制MOV A, #243 ; 十進(jìn)制 如果立即數(shù)小于10H,即0F,則高位會(huì)被系統(tǒng)自動(dòng)補(bǔ)上0。例如,指令“MOV A, #5”,結(jié)果累加器A=05H,系統(tǒng)將向高位自動(dòng)補(bǔ)0。 累加器A或工作寄存器等一些寄存器加載大于FFH的立即數(shù)將會(huì)引發(fā)錯(cuò)誤,因?yàn)檫@些寄存器的長(zhǎng)度只有1個(gè)字節(jié)。該指令用于向數(shù)據(jù)指針DPTR裝載2個(gè)字節(jié)長(zhǎng)度的立即數(shù),通常這個(gè)立即數(shù)會(huì)是某個(gè)地址。所以數(shù)據(jù)指針DPTR能夠指向地址空間的范圍為0000HFFFFH,即尋址的最大

18、范圍為64K Bytes。數(shù)據(jù)指針DPTR實(shí)際上由兩個(gè)寄存器組成,它們是DPLDPTR的低位字節(jié),以及DPHDPTR的高位字節(jié)。如指令“MOV DPTR, #33FFH”。堆棧指令PUSH、POP說(shuō)明:堆棧是單片機(jī)在片內(nèi)數(shù)據(jù)存儲(chǔ)器中開(kāi)辟的用于保存臨時(shí)數(shù)據(jù)的區(qū)域。堆棧的地址堆棧指針SP來(lái)指向,SP是一個(gè)特殊功能寄存器。單片機(jī)上電復(fù)位時(shí)SP=07H,當(dāng)執(zhí)行壓棧指令“PUSH direct”,在壓棧之前先發(fā)生堆棧指針SP自增1,于是SP=08H,然后direct上的數(shù)據(jù)就壓入08H中,此時(shí)(08H)=direct,數(shù)據(jù)就被保存到了08H上。彈棧時(shí)正好相反,當(dāng)執(zhí)行彈棧指令“POP direct”,將根

19、據(jù)堆棧指針SP所指向的地址把數(shù)據(jù)從堆棧中取回,存回到direct上,接著SP自減1。堆棧操作的總結(jié): 堆棧指針SP總是指向最后一次使用的堆棧的地址。當(dāng)我們將數(shù)據(jù)壓入堆棧之前,SP自增1。在對(duì)工作寄存器進(jìn)行壓棧和彈棧操作時(shí),只需要在助記符后注明一個(gè)寄存器的數(shù)字即可。例如要將R4壓棧和R2彈棧,指令分別為“PUSH 4”和 “POP 2”。 彈棧指令“POP”執(zhí)行時(shí),堆棧中保存的數(shù)據(jù)彈出到指定的寄存器或地址上,這個(gè)過(guò)程與壓棧正好相反。彈棧操作之后,堆棧指針SP自減1。 如果有多個(gè)數(shù)據(jù)被壓棧指令“PUSH”壓入堆棧中,由于堆棧指針SP依次增大,先被壓入的數(shù)據(jù)保存在較低地址上,后被壓入的則保存在較高地

20、址上。彈棧時(shí)會(huì)根據(jù)SP從最后一個(gè)壓入堆棧的數(shù)據(jù)開(kāi)始彈出到彈棧指令“POP”所指定的寄存器或地址上。這就是堆棧的“先入后出”特點(diǎn)。 AT89S51單片機(jī)默認(rèn)將片內(nèi)數(shù)據(jù)存儲(chǔ)器的08H1FH地址(共24個(gè)字節(jié))開(kāi)辟作堆棧使用,而20H2FH保留作位尋址區(qū)(圖7-20)而不能進(jìn)行堆棧操作。如果程序中需要堆棧暫存的數(shù)據(jù)多于24個(gè)字節(jié),可以程序8-3中一樣,用指令“MOV SP, #40H”向堆棧指針SP載入一個(gè)介于30H7FH的立即數(shù),以便在開(kāi)放區(qū)開(kāi)辟一個(gè)更大的堆??臻g。但新開(kāi)辟的堆??臻g一般不宜再進(jìn)行其他訪問(wèn),以免破壞堆棧中的數(shù)據(jù)。對(duì)于AT89S51單片機(jī)來(lái)說(shuō),可視情況通過(guò)指令“MOV SP, #50

21、H”來(lái)開(kāi)辟50H7FH為堆棧區(qū),而30H4FH仍可用于開(kāi)放區(qū)直接尋址使用。 單片機(jī)上電復(fù)位時(shí)堆棧指針SP=07H,當(dāng)?shù)谝淮螆?zhí)行PUSH指令時(shí)SP+1=08H,即與第1組別的工作寄存器R0的地址重合(圖7-19),此時(shí)堆棧占用的是非0組別的工作寄存器,所以不宜再切換工作寄存器組別。否則可根據(jù)的方法,重新開(kāi)辟堆??臻g。數(shù)據(jù)交換指令XCH、XCHD在累加器A與工作寄存器之間、累加器A與直接地址之間、累加器A與間接地址之間可以進(jìn)行直接數(shù)據(jù)交換。說(shuō)明:指令XCH將交換累加器A與工作寄存器、直接地址、間接地址的內(nèi)容。例如,A=65H,R2=99H,執(zhí)行“XCH A, R2”之后,A=99H,R2=65H。

22、而指令XCHD交換的只是累加器A與間接地址的低4位內(nèi)容,高4位內(nèi)容不變。例如,地址空間(40H)=2FH,A=3DH,R1=40H,執(zhí)行“XCHD A, R1”之后,A=3FH,(40H)=2DH。片外數(shù)據(jù)裝載指令MOVX ,單片機(jī)自身的程序存儲(chǔ)器或數(shù)據(jù)存儲(chǔ)器在實(shí)際應(yīng)用中有可能不夠用,于是可以在單片機(jī)之外添加適當(dāng)?shù)拇鎯?chǔ)器芯片以擴(kuò)展程序或數(shù)據(jù)的存儲(chǔ)空間。一旦擴(kuò)展片外存儲(chǔ)器,就會(huì)涉及到尋址片外存儲(chǔ)器的情況,而應(yīng)付這類情況有專門的指令。說(shuō)明:片外數(shù)據(jù)裝載指令主要用于訪問(wèn)擴(kuò)展的片外存儲(chǔ)器,片外存儲(chǔ)器可以是RAM、ROM、Flash等類型。而且從表8-19知道所有的指令都是間接尋址的(因?yàn)橛蟹?hào)“”),

23、前兩個(gè)指令將Ri(R0或R1)或DPTR所指向的片外存儲(chǔ)器地址的內(nèi)容載入單片機(jī)的累加器A中,后兩條指令相反,把累加器A的數(shù)據(jù)寫(xiě)到Ri(R0或R1)或DPTR所指向的片外存儲(chǔ)器的地址上。當(dāng)使用Ri間接尋址時(shí),因?yàn)镽i只有1個(gè)字節(jié),所以尋址范圍為00HFFH。如果使用的是DPTR尋址則可尋址更大的范圍0000HFFFFH。至于程序中選擇使用Ri還是DPTR要根據(jù)片外存儲(chǔ)器的容量來(lái)確定。使用DPTR尋址空間范圍大,但參與尋址的地址線可多達(dá)16位,這樣除P0口全部用作地址線外,P2口也會(huì)被部分或全部占用。如果對(duì)本節(jié)理解有困難,可以在后面擴(kuò)展存儲(chǔ)器的章節(jié)中再次理解。 查表指令MOVC , 查表操作實(shí)際上

24、是把程序存儲(chǔ)器里的數(shù)據(jù)通過(guò)累加器A后供程序中使用,由于查表操作訪問(wèn)的是程序存儲(chǔ)器,所以查表指令只提供了讀的操作。在執(zhí)行指令“MOVC A, A+DPTR”前,數(shù)據(jù)指針DPTR一般都會(huì)先載入數(shù)據(jù)表,使用的指令一般為“MOV DPTR,#TABLE”,其中“TABLE”為數(shù)據(jù)表的標(biāo)號(hào)。這樣DPTR就指向數(shù)據(jù)表的表頭地址,查表指令就可以把數(shù)據(jù)表中的數(shù)據(jù)載入A中。布爾指令 清0、置1、取反操作CLR、SETB、CPL 布爾跳轉(zhuǎn)指令JC、JNC、JB、JNB、JBC 長(zhǎng)調(diào)用指令LCALL說(shuō)明:長(zhǎng)調(diào)用指令LCALL的執(zhí)行代碼占用3個(gè)字節(jié),第1個(gè)字節(jié)為L(zhǎng)CALL助記符12H,后兩個(gè)字節(jié)是所要調(diào)用子程序的目標(biāo)

25、地址,因?yàn)橛袃蓚€(gè)字節(jié)來(lái)指定子程序的目標(biāo)地址,所以調(diào)用的范圍可達(dá)64K Bytes,即地址0000HFFFFH。為了確保子程序執(zhí)行完畢之后單片機(jī)能正確回到主程序繼續(xù)執(zhí)行,LCALL執(zhí)行時(shí)會(huì)把它下一條指令的地址保存在堆棧中。當(dāng)遇到子程序返回指令RET后單片機(jī)將堆棧中保存的地址彈出,并據(jù)此繼續(xù)主程序的執(zhí)行。 絕對(duì)調(diào)用指令A(yù)CALL絕對(duì)調(diào)用指令A(yù)CALL的長(zhǎng)度為2個(gè)字節(jié),2個(gè)字節(jié)中有11位用來(lái)指向子程序的地址,所以說(shuō)子程序的目標(biāo)地址不能超過(guò)2K Bytes的范圍。ACALL與LCALL的執(zhí)行機(jī)制相同,唯一的不同就是調(diào)用目標(biāo)地址范圍不同。如果判斷子程序目標(biāo)地址在2K Bytes范圍內(nèi),應(yīng)當(dāng)盡量使用ACA

26、LL指令以減少程序存儲(chǔ)空間的浪費(fèi)。如果單片機(jī)支持CALL指令(如AT89S51就支持),完全可以使用CALL來(lái)籠統(tǒng)地調(diào)用子程序,因?yàn)樗鼤?huì)自動(dòng)判斷調(diào)用的范圍從而選擇是使用1個(gè)字節(jié)還是2個(gè)字節(jié)來(lái)指向子程序的目標(biāo)地址。 返回指令RET、RETI當(dāng)子程序或中斷服務(wù)子程序執(zhí)行完后,需要返回指令告訴單片機(jī)返回主程序。返回指令是必需的,否則單片機(jī)不知道子程序是否執(zhí)行完。返回指令RET用于子程序的末尾,提示子程序結(jié)束,以返回主程序。前面所有調(diào)用子程序的程序中都使用RET返回。返回指令RETI用于結(jié)束中斷服務(wù)子程序,在介紹中斷的章節(jié)中會(huì)發(fā)現(xiàn),在中斷服務(wù)子程序末尾都會(huì)有RETI指令。跳轉(zhuǎn)與循環(huán)指令無(wú)條件跳轉(zhuǎn)指令L

27、JMP、AJMP、SJMP、JMP當(dāng)執(zhí)行到無(wú)條件跳轉(zhuǎn)指令時(shí),單片機(jī)會(huì)立即跳到特定地址上執(zhí)行,并不需要判斷什么情況。說(shuō)明:以上4個(gè)跳轉(zhuǎn)指令都是無(wú)條件跳轉(zhuǎn)指令。其中LJMP是長(zhǎng)跳轉(zhuǎn)指令,指令長(zhǎng)度為3個(gè)字節(jié),第1個(gè)字節(jié)為L(zhǎng)JMP助記符的執(zhí)行代碼02H,后兩個(gè)字節(jié)是所要跳轉(zhuǎn)的目標(biāo)地址。因?yàn)橛袃蓚€(gè)字節(jié)來(lái)指定目標(biāo)地址,所以LJMP跳轉(zhuǎn)地址范圍達(dá)64K Bytes,即0000FFFFH。AJMP是絕對(duì)跳轉(zhuǎn)指令,指令長(zhǎng)度為2個(gè)字節(jié),助記符01H占一個(gè)字節(jié),因只有一個(gè)字節(jié)來(lái)指向跳轉(zhuǎn)的目標(biāo)地址,所以目標(biāo)地址不超過(guò)2K Bytes。AJMP與LJMP的執(zhí)行機(jī)制相同,唯一的不同就是跳轉(zhuǎn)的目標(biāo)地址范圍不同。如果判斷目標(biāo)

28、地址小于2K Bytes,應(yīng)當(dāng)盡量使用AJMP指令以節(jié)省1個(gè)字節(jié)的存儲(chǔ)空間。SJMP是一個(gè)相對(duì)跳轉(zhuǎn)指令,跳轉(zhuǎn)范圍為向前128個(gè)字節(jié),向后127個(gè)字節(jié)。向前就是跳轉(zhuǎn)到比當(dāng)前程序計(jì)數(shù)器PC所指的地址要小的地址上去執(zhí)行,向后則相反,跳轉(zhuǎn)到比當(dāng)前PC所指的地址要大的地址上去執(zhí)行,例子如例8-19所示。JMP則是一個(gè)籠統(tǒng)的跳轉(zhuǎn)指令,它會(huì)自動(dòng)判斷跳轉(zhuǎn)的范圍從而選擇是使用1個(gè)字節(jié)還是2個(gè)字節(jié)來(lái)指向跳轉(zhuǎn)的目標(biāo)地址,在程序中如果不清楚跳轉(zhuǎn)的范圍可以簡(jiǎn)單地使用JMP指令。 條件跳轉(zhuǎn)指令JZ、JNZ條件跳轉(zhuǎn)指令需要滿足一定的條件才會(huì)發(fā)生跳轉(zhuǎn),這個(gè)條件就是累加器A的狀態(tài)。說(shuō)明:條件跳轉(zhuǎn)指令有兩條對(duì)立的指令,一是JZ指

29、令,當(dāng)累加器A=0時(shí)跳轉(zhuǎn)。二是JNZ指令,當(dāng)A0時(shí)才跳轉(zhuǎn)。 比較跳轉(zhuǎn)指令CJNE , , rel比較跳轉(zhuǎn)指令可將累加器A、Rn、間接地址的內(nèi)容與一個(gè)具體的立即數(shù)比較,如果不相等就發(fā)生跳轉(zhuǎn)。CJNE將源操作數(shù)與目的操作數(shù)進(jìn)行比較,如果不相等就跳轉(zhuǎn)到rel所指的地址。比較跳轉(zhuǎn)指令CJNE集成了兩種操作比較和跳轉(zhuǎn)。此外,它還會(huì)改變進(jìn)位標(biāo)志C的值以顯示目的操作數(shù)較大還是較小,如表8-31所示。CJNE指令不會(huì)改變?cè)床僮鲾?shù)或目的操作數(shù)的值。 循環(huán)指令DJNZ ,循環(huán)可以實(shí)現(xiàn)延時(shí)、判斷等功能,可以讓一段程序重復(fù)執(zhí)行若干次,提高程序執(zhí)行效率。說(shuō)明:通過(guò)循環(huán)指令DJNZ來(lái)構(gòu)造循環(huán)體是一種最廣泛程序設(shè)計(jì)的方法。

30、循環(huán)指令DJNZ執(zhí)行時(shí),工作寄存器或直接地址內(nèi)容減1,如果不等于0,則程序跳轉(zhuǎn)到rel指示地址。在執(zhí)行DJNZ指令前,需要向相關(guān)工作寄存器或地址中載入計(jì)數(shù)值,該計(jì)數(shù)值就是循環(huán)的次數(shù)。 無(wú)操作指令NOP說(shuō)明:無(wú)操作指令NOP沒(méi)有操作數(shù),不產(chǎn)生任何影響,只是在耗費(fèi)時(shí)間,同時(shí)會(huì)更新程序計(jì)數(shù)器PC的計(jì)數(shù)值。每執(zhí)行一次NOP指令花去1個(gè)機(jī)器周期,執(zhí)行完NOP后,就接著執(zhí)行下一條指令。NOP指令常常用在等待一個(gè)很短的時(shí)間(若干個(gè)機(jī)器周期時(shí)間,幾s),比如在等待外設(shè)的操作等。七段數(shù)碼管的顯示 七段數(shù)碼管數(shù)字顯示最常使用的器件就是七段數(shù)碼管,它的7個(gè)亮段組成了一個(gè)“8”,點(diǎn)亮不同亮段的組合就形成了數(shù)字09。在數(shù)字鐘、微波爐、電飯煲、洗衣機(jī)等電子產(chǎn)品中常常使用七段數(shù)碼管來(lái)顯示數(shù)字信息。 二進(jìn)制與數(shù)字“MOV P2, #15H”指令從P2口輸出立即數(shù)15H,即輸出 0001 0101B。將會(huì)看到輸出為0的I/O口上發(fā)光二極管被點(diǎn)亮。“MOV P2, #15H”指令中立即數(shù)15H本身就是一個(gè)十六進(jìn)制的數(shù)字,如果使用七段數(shù)碼管與P2口接口,就能直接把數(shù)字“15”給顯示出來(lái)。 二進(jìn)制與語(yǔ)音語(yǔ)音信號(hào)可以用波形來(lái)表示,比如把信號(hào)的一小段波放到一個(gè)縱坐標(biāo)為幅度值、橫坐標(biāo)為時(shí)間的坐標(biāo)系中,縱坐標(biāo)上由二進(jìn)制表示幅度,這樣可以把每個(gè)時(shí)刻的幅度都由二進(jìn)制數(shù)來(lái)表示。比如圖中t0時(shí)

溫馨提示

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