《單片機(jī)原理及應(yīng)用》2010-第4章.ppt
《《單片機(jī)原理及應(yīng)用》2010-第4章.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《《單片機(jī)原理及應(yīng)用》2010-第4章.ppt(128頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
《單片機(jī)原理及應(yīng)用》,佘勇電子基礎(chǔ)教學(xué)實(shí)驗(yàn)中心課件密碼:kys2006Tel:13980905197Email:sy@辦公室:科教樓110,第四章MCS-51單片機(jī)的指令系統(tǒng)與匯編程序設(shè)計(jì),上章內(nèi)容小結(jié),51單片機(jī)基本特點(diǎn)51單片機(jī)存儲(chǔ)器組織程序存儲(chǔ)器片內(nèi)ROM和片外ROM擴(kuò)展(EA引腳作用)PC與中斷向量數(shù)據(jù)存儲(chǔ)器片內(nèi)RAM:工作寄存器、位尋址區(qū)、用戶RAM(堆棧)SFR片外RAM擴(kuò)展時(shí)序與復(fù)位節(jié)拍、狀態(tài)、機(jī)器周期和指令周期的概念單片機(jī)復(fù)位,,MCS-51內(nèi)部RAM配置,直接尋址,內(nèi)部數(shù)據(jù)存儲(chǔ)器配置圖(總結(jié)),地址重疊,,256B,384B,間接尋址,,僅52系列有,,,本章內(nèi)容,本節(jié)課需掌握指令的基本概念操作數(shù)尋址方式51單片機(jī)的指令系統(tǒng)偽指令匯編語(yǔ)言程序設(shè)計(jì)重點(diǎn)操作數(shù)尋址方式51單片機(jī)的指令系統(tǒng)匯編語(yǔ)言程序設(shè)計(jì),指令、指令系統(tǒng)和程序指令是CPU能執(zhí)行的一個(gè)基本操作。如:取數(shù)、加、減、乘、除、存數(shù)等指令系統(tǒng)是CPU所能執(zhí)行的全部指令的集合。不同的CPU,其指令系統(tǒng)不同。程序用戶編寫的完成特定任務(wù)的指令的有序集合。,4.1指令概述,程序設(shè)計(jì)語(yǔ)言,指令助記符指令編碼是二進(jìn)制編碼,記憶起來(lái)有些困難,可用與指令含義接近的英文單詞或縮寫來(lái)代替指令的二進(jìn)制編碼程序設(shè)計(jì)語(yǔ)言機(jī)器語(yǔ)言:二進(jìn)制指令代碼程序設(shè)計(jì)語(yǔ)言,形成目標(biāo)程序計(jì)算機(jī)唯一可以直接識(shí)別的語(yǔ)言二進(jìn)制的表達(dá)形式,編程困難高級(jí)語(yǔ)言和匯編語(yǔ)言程序(源程序)必須轉(zhuǎn)換成機(jī)器語(yǔ)言目標(biāo)代碼(目標(biāo)程序)才能被計(jì)算機(jī)執(zhí)行,高級(jí)語(yǔ)言:面向過(guò)程和對(duì)象的程序設(shè)計(jì)語(yǔ)言語(yǔ)句功能強(qiáng),編程速度快需要編譯程序或解釋程序翻譯成機(jī)器代碼不太適用于微型計(jì)算機(jī)系統(tǒng)匯編語(yǔ)言:用助記符代替二進(jìn)制指令代碼的程序語(yǔ)言每條語(yǔ)句與一個(gè)具體的操作或指令對(duì)應(yīng)編寫的程序需要匯編成機(jī)器代碼運(yùn)行程序代碼短,運(yùn)行效率高,但編程復(fù)雜非常適合計(jì)算機(jī)原理的學(xué)習(xí),匯編語(yǔ)言指令格式,MCS-51單片機(jī)指令格式[標(biāo)號(hào):]操作碼[操作數(shù)][;注釋],1~8個(gè)字母、數(shù)字、下劃線,字母開(kāi)頭,1~3個(gè),多個(gè)操作數(shù)之間用“,”分隔,介紹描述指令符號(hào)的意義,((Ri)),—由Ri尋址的單元中的內(nèi)容,@Ri,((DPTR)),—由DPTR尋址的單元中的內(nèi)容,@DPTR,(direct),—由direct尋址的單元中的內(nèi)容,直接尋址,(Rn),—Rn中的內(nèi)容,4.2尋址方式,MCS-51單片機(jī)指令格式[標(biāo)號(hào):]操作碼[操作數(shù)][;注釋]定位操作數(shù)所在存儲(chǔ)位置的方式叫尋址方式寄存器尋址直接尋址立即尋址寄存器間接尋址變址尋址(基址寄存器加變址寄存器間接尋址)相對(duì)尋址位尋址,寄存器尋址方式,操作數(shù)位置出現(xiàn)的是工作寄存器名,操作數(shù)存放在工作寄存器中,,MOVA,R1,,30H,30H,,MOVB,A,,3FH,3FH,,INCB,3FH,40H,直接尋址方式,出現(xiàn)在操作數(shù)位置不是操作數(shù)本身,而是操作數(shù)所在的存儲(chǔ)單元的地址可用于轉(zhuǎn)移或調(diào)用指令的目標(biāo)地址尋址,以“addr16”或“addr11”的形式出現(xiàn)可用于RAM存儲(chǔ)單元的尋址,以“direct”的形式出現(xiàn),,MOVA,30H,;A(30H),,,24H,,立即尋址方式,指令的操作數(shù)存放在程序存儲(chǔ)器中,緊跟在操作碼的后面,前綴指示符“#”,,MOVA,#30H,;A#30H,,,30H,直接尋址與立即尋址的區(qū)別,,MOVA,30H,;A(30H),,,MOVA,#30H,;A#30H,,寄存器間接尋址方式,出現(xiàn)在操作數(shù)位置的寄存器的內(nèi)容不是操作數(shù)本身,而是操作數(shù)所在的存儲(chǔ)單元的地址,以“@寄存器名”形式表示R0、R1可用于片內(nèi)RAM和片外RAM低256字節(jié)的間接尋址(MOVA,@Ri或MOVXA,@Ri),DPTR可用于片外RAM整個(gè)64K字節(jié)空間的間接尋址(MOVXA,@DPTR),,MOVA,@R0,;A((R0)),,,24H,寄存器尋址與寄存器間接尋址區(qū)別,,MOVA,R1,,30H,30H,,MOVA,@R1,;A((R1)),,設(shè)R1=30H,,MOVCA,@A+DPTR,變址尋址,以累加器A為變址寄存器,以程序計(jì)數(shù)器PC或數(shù)據(jù)指針DPTR為基址寄存器,以二者之和作為程序存儲(chǔ)器單元地址,取出其中的數(shù)據(jù)作為操作數(shù),;A((A)+(DPTR)),,02H,2002H,+,,,82H,相對(duì)尋址,相對(duì)尋址用于訪問(wèn)程序存儲(chǔ)器,在相對(duì)轉(zhuǎn)移指令后作為轉(zhuǎn)移的地址偏移,以“rel”形式表示“rel”是8位補(bǔ)碼,范圍“-128~+127”轉(zhuǎn)移的目標(biāo)地址為轉(zhuǎn)移指令的下一條指令(PC)+rel,,,,JNZrel,例:,;累加器A不等零則轉(zhuǎn)移設(shè):rel=23H,,,,,(PC)=2002H,,,rel=23H,,,修正后轉(zhuǎn)移目標(biāo)地址D(PC)=2025H,,(PC)=2002H,Rel=23H,,),0,0,5,2,0,2,H,D=,,尋址空間:,片內(nèi)RAM的地址為20H~2FH字節(jié)單元共128位位地址表現(xiàn)形式:1、位地址00H~7FH2、字節(jié)地址.位序號(hào),SFR中12個(gè)能被8整除的字節(jié)地址位地址請(qǐng)參看P52表2.6SFR中的可尋址位的三種形式:1、位地址:如80H、81H2、位地址名:如C、OV、AC3、SFR名.位序號(hào):如P1.0、P0.5,對(duì)內(nèi)部RAM、SFR的位地址空間進(jìn)行訪問(wèn),稱為位尋址,位地址用于布爾指令。,,共221位,位尋址,關(guān)于累加器A在指令中的形式,累加器A在指令中的表現(xiàn)形式1、以累加器A形式出現(xiàn)A是指令編碼的一部分,不占用獨(dú)立字節(jié)例:MOVA,Ri指令編碼:E8~EF2、以direct地址形式(SFR地址)出現(xiàn)ACC或字節(jié)地址例:PUSHACC指令編碼:C0E0,4.3MCS-51指令系統(tǒng),MCS-51指令系統(tǒng)有111條指令,按操作功能分類,,算術(shù)操作指令24條,邏輯操作指令24條,程序轉(zhuǎn)移指令17條,數(shù)據(jù)傳送指令29條,位操作指令17條,按指令長(zhǎng)度分類,,單字節(jié)指令49條,雙字節(jié)指令45條,三字節(jié)指令17條,按指令周期分類,,單周期指令64條,雙周期指令45條,四周期指令2條,1?s,2?s,4?s,設(shè)時(shí)鐘頻率為12MHz,則按指令執(zhí)行的時(shí)間分:,4.3.1數(shù)據(jù)傳送類指令,數(shù)據(jù)傳送類指令的種類(29條)片內(nèi)RAM傳送指令:MOV片外RAM傳送指令:MOVXROM傳送(查表傳送):MOVC累加器交換指令:XCH、XCHD、SWAP堆棧操作指令:進(jìn)棧指令:PUSH出棧指令:POP對(duì)標(biāo)志位的影響影響累加器A內(nèi)容的傳送指令影響奇偶標(biāo)志P,其它標(biāo)志位不受影響,傳送類指令操作示意圖,累加器A,Rn工作寄存器,@Ri片內(nèi)RAM單元,direct,@Ri、@DPTR片外RAM單元,@A+PC@A+DPTRROM單元,堆棧,#data,,,,,,,,,,,,,PUSH,POP,MOVC,MOVX,MOV,XCH,MOV,XCH、XCHD,MOV,XCH,MOV,MOV,MOV,MOV,MOV,MOV,,,MOV,DPTR,,MOV,寄存器間接尋址,寄存器尋址,立即尋址,寄存器間接尋址,變址尋址:基址寄存器加變址寄存器,應(yīng)用實(shí)例,直接尋址,以累加器A為一方的傳送指令,累加器A,Rn工作寄存器,@Ri片內(nèi)RAM單元,direct,@Ri、@DPTR片外RAM單元,@A+PC@A+DPTRROM單元,#data,,,,,,,MOVC,MOVX,MOV,XCH,MOV,XCH、XCHD,MOV,XCH,MOV,MOVdirect,AMOVA,directXCHA,direct,MOV@Ri,AMOVA,@RiXCHA,@Ri低半字節(jié)交換XCHDA,@Ri,MOVRn,AMOVA,RnXCHA,Rn,MOVA,#data,MOVCA,@A+PCMOVCA,@A+DPTR,MOVX@Ri,AMOVXA,@RiMOVX@DPTR,AMOVXA,@DPTR,,變址尋址,寄存器間接尋址,立即尋址,寄存器尋址,寄存器間接尋址,直接尋址,SWAPA,以direct單元為一方的傳送指令,Rn工作寄存器,@Ri片內(nèi)RAM單元,direct,堆棧,,,,PUSH,POP,MOV,MOV,,MOV,寄存器間接尋址,寄存器尋址,,直接尋址,MOVRn,directMOVdirect,Rn,MOV@Ri,directMOVdirect,@Ri,MOVdirect,direct,,PUSHdirect(SP)←(SP)+1((SP))←(direct),POPdirect(direct)←((SP))(SP)←(SP)-1,例:PUSHACCPUSH30HPOP40HPOPB,立即數(shù)傳送指令,累加器A,Rn工作寄存器,@Ri片內(nèi)RAM單元,direct,#data,,,,,MOV,MOV,MOV,MOV,DPTR,,MOV,寄存器間接尋址,寄存器尋址,立即尋址,直接尋址,MOVDPTR,#data16例:MOVDPTR,#2000H,MOVRn,#data例:MOVR0,#2FH,MOV@Ri,#data例:MOV@R1,#2FH,MOVdirect,#data例:MOV30H,#2FH,MOVA,#data例:MOVA,#2FH,,傳送類指令實(shí)例1,立即數(shù)送至累加器MOVA,#20H;A←#20H累加器與工作寄存器R0~R7之間的傳送MOVR1,#20HMOVA,R1MOVR0,A;R0←#20H累加器與@Ri間接尋址的片內(nèi)RAM單元之間的傳送MOVA,#2FHMOVR0,#30HMOVR1,#40HMOV@R0,A;(30H)←#2FHMOVA,@R1;A←(40H)XCHA,@R0;A←→(30H),,傳送類指令實(shí)例2,累加器與direct直接尋址的片內(nèi)RAM單元之間的傳送MOVA,20H;A←(20H)MOVP1,A;P1←AXCHA,30H;30H←→A累加器與片外RAM單元之間的傳送MOVR1,#20HMOVDPTR,#2000HMOVXA,@R1MOVX@DPTR,A;2000H←(0020H)累加器與ROM單元之間的傳送(查表指令)MOVDPTR,#2000HMOVCA,@A+DPTRMOVCA,@A+PC,,傳送類指令實(shí)例3,工作寄存器與direct直接尋址的片內(nèi)RAM單元之間的傳送MOVR1,20H;R1←(20H)MOV2FH,R1;2FH←(R1)direct直接尋址的片內(nèi)RAM單元與@Rj間接尋址的片內(nèi)RAM單元之間的傳送MOVR1,#20HMOV30H,@R1;30H←(20H)MOV@R1,40H;20H←(40H)direct直接尋址的片內(nèi)RAM單元之間的傳送MOV30H,40H;30H←(40H),,MOV23H,#30HMOV12H,#34HMOVR0,#23HMOVR7,12HMOVR1,#12HMOVA,@R0MOV34H,@R1MOV45H,34HMOVDPTR,#6712HMOV12H,DPHMOVR0,DPLMOVA,@R0,;(23H)=30H;(12H)=34H;R0=23H,;R7=34H;R1=12H;A=30H,;(34H)=34H;(45H)=34H;DPTR=6712H,;(12H)=67H;R0=12H;A=67H,傳送類指令綜合實(shí)例,30H,34H,23H,34H,12H,34H,34H,67H,12H,67H,12H,,4.3.2算術(shù)操作類指令,算術(shù)操作類指令的種類(24條)加法指令:ADD、ADDC減法指令:SUBB加1指令:INC減1指令:DEC十進(jìn)制調(diào)整指令:DA乘法指令:MUL除法指令:DIV,加法指令,不帶進(jìn)位的加法指令A(yù)DDA,Rn;A←(A)+(Rn)ADDA,@Ri;A←(A)+((Ri))ADDA,direct;A←(A)+(direct)ADDA,#data;A←(A)+data帶進(jìn)位的加法指令A(yù)DDCA,Rn;A←(A)+(Rn)+(Cy)ADDCA,@Ri;A←(A)+((Ri))+(Cy)ADDCA,direct;A←(A)+(direct)+(Cy)ADDCA,#data;A←(A)+data+(Cy)加法指令影響PSW中的Cy、OV、AC、P,加法實(shí)例,MOVA,#-1;A←#0FFHADDA,#255;A←(A)+#0FFHMOVR0,#0;R0←#0ADDCA,R0;A←(A)+(R0)+(Cy),OVCyA11111111+11111111————————0111111110←ADD二進(jìn)制結(jié)果00000000+1————————0011111111←ADDC二進(jìn)制結(jié)果,對(duì)編程者來(lái)說(shuō),可以把這兩個(gè)數(shù)的當(dāng)作無(wú)符號(hào)數(shù),也可以當(dāng)作帶符號(hào)數(shù),減法指令,帶借位的減加法指令SUBBA,Rn;A←(A)-(Rn)-(Cy)SUBBA,@Ri;A←(A)-((Ri))-(Cy)SUBBA,direct;A←(A)-(direct)-(Cy)SUBBA,#data;A←(A)-data-(Cy)減法指令沒(méi)有不減進(jìn)位位的指令,所以必須注意,在減法指令之前應(yīng)清除進(jìn)位位減法指令影響PSW中的Cy、OV、AC、P,減法實(shí)例,CLRC;Cy←0MOVA,#52H;A←#52HMOVR0,#0B4H;R0←#0B4HSUBBA,R0;A←A-R0-Cy,OVCyA001010010-10110100————————10010110-0————————1110010110←SUBB二進(jìn)制結(jié)果,0B4H當(dāng)作無(wú)符號(hào)數(shù)180,也可以當(dāng)作帶符號(hào)數(shù)-76,加1減1指令,加1指令I(lǐng)NCA;A←(A)+1INCRn;Rn←(Rn)+1INC@Ri;(Ri)←((Ri))+1INCdirect;direct←(direct)+1,用于端口操作時(shí)“讀-改-寫”INCDPTR;DPTR←DPTR+1減1指令DECA;A←(A)-1DECRn;Rn←(Rn)-1DEC@Ri;(Ri)←((Ri))-1DECdirect;direct←(direct)-1,用于端口操作時(shí)“讀-改-寫”加1減1指令不影響PSW中的標(biāo)志位,16位無(wú)符號(hào)數(shù)加法實(shí)例,設(shè)在片內(nèi)RAM地址為30H和40H處存放著2個(gè)16位無(wú)符號(hào)數(shù)(低位在前),編程求兩者之和,存放于R3、R4中,16位無(wú)符號(hào)數(shù)加法實(shí)例流程圖,2個(gè)間接尋址寄存器(地址指針)指向操作數(shù)低8位,取加數(shù)低8位至累加器,低8位加法,結(jié)果存儲(chǔ),調(diào)整間址寄存器,指向操作數(shù)高8位,取加數(shù)高8位至累加器,高8位加法,結(jié)果存儲(chǔ),MOVR0,#M1;R0←#M1,R1←#M2,間接MOVR1,#M2;尋址寄存器(地址指針)初始化MOVA,@R0;取第1個(gè)數(shù)第8位ADDA,@R1;低8位相加MOVR4,A;R4←低8位和INCR0;調(diào)整地址指針,指向高8位INCR1;MOVA,@R0;ADDCA,@R1;高8位相加MOVR3,A;R4←高8位和,累加器十進(jìn)制調(diào)整指令DA,ALU完成壓縮BCD碼(每字節(jié)兩位十進(jìn)制數(shù)碼)運(yùn)算后,累加器中的運(yùn)算結(jié)果并不是十進(jìn)制結(jié)果,必須用DA指令調(diào)整成十進(jìn)制結(jié)果指令格式:DAA調(diào)整方法:DA指令一般跟在加法指令的后面,利用加法指令對(duì)標(biāo)志位C、AC影響以及累加器A內(nèi)容完成十進(jìn)制調(diào)整如果低半字節(jié)>9或AC=1,則低半字節(jié)加6如果高半字節(jié)>9或C=1,則高半字節(jié)加6DA指令影響進(jìn)位位C(只置位,不復(fù)位),不影響OV位,十進(jìn)制調(diào)整指令實(shí)例,MOVR1,#92H;R1←#92HMOVA,#73H;A←#73HADDA,R1;A=05H,AC=0,C=1DAA;A=65H,C=1,CA10010010←壓縮BCD碼92+01110011←壓縮BCD碼73————————100000101←二進(jìn)制結(jié)果01100000←十進(jìn)制調(diào)整————————101100101←十進(jìn)制結(jié)果163,乘法指令,乘法指令格式:MULAB執(zhí)行時(shí)間:4個(gè)機(jī)器周期操作:累加器A和寄存器B中的兩個(gè)數(shù)相乘,乘積的高8位在B中,低8位在A中對(duì)標(biāo)志位的影響:Cy=0;當(dāng)乘積>255時(shí),OV=1,否則,OV=0,除法指令,除法指令格式:DIVAB執(zhí)行時(shí)間:4個(gè)機(jī)器周期操作:累加器A中的被除數(shù)除以寄存器B中的除數(shù),除得的商在A中,余數(shù)在B中對(duì)標(biāo)志位的影響:一般情況下,Cy=0,OV=0;當(dāng)除數(shù)為0時(shí),OV=1,乘法實(shí)例,設(shè)在片內(nèi)RAM地址為M1處存放著一個(gè)16位無(wú)符號(hào)數(shù)(低位在前),在M2處存放著一個(gè)8位無(wú)符號(hào)數(shù),編程求兩者之積,存放于R2、R3、R4中,乘法實(shí)例,(M1+1)(M1)(M2)————————R3R4+BA————————R2R3R4,MOVR0,#M1MOVA,@R0MOVB,M2MULABMOVR4,AMOVR3,BINCR0MOVA,@R0MOVB,M2MULAB,;R0←#M1,指向被乘數(shù)低8位,;A←被乘數(shù)低8位(M1),;B←乘數(shù)(M2),;(M1)(M2),;R4←乘積低8位,;R3←乘積高8位,暫存,;指向被乘數(shù)高8位,;A←被乘數(shù)高8位(M1+1),;B←乘數(shù)(M2),;(M1+1)(M2),,ADDA,R3MOVR3,AMOVA,BADDCA,#00HMOVR2,A,;乘積第2字節(jié)相加,;R3←乘積第2字節(jié),;A←乘積第3字節(jié),;加進(jìn)位位Cy,;R2←乘積第3字節(jié),,4.3.3邏輯操作類指令,邏輯操作類指令的種類(24條,按位運(yùn)算)與指令:ANL或指令:ORL異或指令:XRL累加器取反指令:CPL累加器清零指令:CLR移位指令:RL、RR、RLC、RRC,與指令,與指令:源操作數(shù)與目標(biāo)操作數(shù)按位相與ANLA,Rn;A←(A)direct←(direct)順序執(zhí)行elsePC←PC+2+rel累加器非0轉(zhuǎn)移指令格式:JNZrel執(zhí)行操作:ifA=0PC←PC+2;順序執(zhí)行elsePC←PC+2+rel,累加器零條件轉(zhuǎn)移指令實(shí)例,編程實(shí)現(xiàn)將片外RAM地址為DATA1的8位無(wú)符號(hào)數(shù)組(位于地址低256單元內(nèi))連續(xù)傳送到片內(nèi)RAM地址為DATA2處,直到遇到數(shù)組元素為0為止。,累加器零條件轉(zhuǎn)移指令實(shí)例,MOVR0,#DATA1MOVR1,#DATA2LOOP:MOVXA,@R0JZAA1MOV@R1,AINCR0INCR1SJMPLOOPAA1:SJMP$,,距離≤127,注意此例的缺陷,沒(méi)有考慮數(shù)據(jù)區(qū)長(zhǎng)度,改進(jìn),,,條件轉(zhuǎn)移指令-進(jìn)位條件轉(zhuǎn)移,進(jìn)位位C為1轉(zhuǎn)移指令格式:JCrel執(zhí)行操作:ifC=0PC←PC+2;順序執(zhí)行elsePC←PC+2+rel進(jìn)位位C為0轉(zhuǎn)移指令格式:JNCrel執(zhí)行操作:ifC=1PC←PC+2;順序執(zhí)行elsePC←PC+2+rel,條件轉(zhuǎn)移指令-位條件轉(zhuǎn)移,直接尋址位為1轉(zhuǎn)移指令格式:JBbit,rel執(zhí)行操作:ifbit=0PC←PC+3elsePC←PC+3+rel直接尋址位為0轉(zhuǎn)移指令格式:JNBbit,rel執(zhí)行操作:ifbit=1PC←PC+3elsePC←PC+3+rel直接尋址位為1轉(zhuǎn)移且該位清0指令格式:JBCbit,rel執(zhí)行操作:ifbit=0PC←PC+3elsePC←PC+3+rel,bit=0,條件轉(zhuǎn)移指令-比較條件轉(zhuǎn)移,指令格式:CJNEA,#data,relCJNEA,direct,relCJNERn,#data,relCJNE@Ri,#data,rel執(zhí)行操作:if第一操作數(shù)=第二操作數(shù)PC←PC+3,C=0if第一操作數(shù)≠第二操作數(shù)PC←PC+3+relif第一操作數(shù)>第二操作數(shù)C=0if第一操作數(shù)<第二操作數(shù)C=1,CJNE應(yīng)用實(shí)例-無(wú)符號(hào)數(shù)的比較,編程實(shí)現(xiàn):如果R0與R1相等,轉(zhuǎn)移到AA1,如果R0大于R1,轉(zhuǎn)移到AA2,如果R0小于R1,轉(zhuǎn)移到AA3,MOVA,R0MOV30H,R1CJNEA,30H,MIDAA1:…………MID:JNCAA2AA3:…………AA2:……,注意指令的語(yǔ)法,R0與R1不能直接比較,Yes,CJNE應(yīng)用實(shí)例-帶符號(hào)數(shù)的比較,編程實(shí)現(xiàn):A與30H單元內(nèi)容(帶符號(hào)數(shù))進(jìn)行比較,如果相等,轉(zhuǎn)移到LOOP1,如果大于,轉(zhuǎn)移到LOOP2,如果小于,轉(zhuǎn)移到LOOP3,A≥0?,(30H)≥0?,(30H)≥0?,A>(30H),CJNEA,30H比較,A≠(30H)?,A=(30H),A<(30H),Cy=0?,No,No,Yes,Yes,No,Yes,No,Yes,No,LOOP1,LOOP2,LOOP3,COMP,NEXT,+,-,+,+,-,-,-,+,MOVR0,AANLA,#80HJNZNEGMOVA,30HANLA,#80HJNZLOOP2SJMPCOMPNEG:MOVA,30HANLA,#80HJNZLOOP3,COMP:MOVA,R0CJNEA,30H,NEXTSJMPLOOP1NEXT:JNCLOOP2LOOP3:NOP,A為+,(30H)為+,A為-,(30H)為+,A=(30H),A<(30H),A>(30H),條件轉(zhuǎn)移指令-減1條件轉(zhuǎn)移,寄存器減“1”不等零轉(zhuǎn)移指令格式:DJNZRn,rel執(zhí)行操作:Rn=Rn-1ifRn=0PC←PC+2;順序執(zhí)行elsePC←PC+2+rel內(nèi)部RAM或SFR減“1”不為零轉(zhuǎn)移指令格式:DJNZdirect,rel執(zhí)行操作:(direct)=(direct)-1if(direct)=0PC←PC+3;順序執(zhí)行elsePC←PC+3+rel,DJNZ指令實(shí)例1-對(duì)累加器零條件轉(zhuǎn)移實(shí)例的修改,MOVR0,#DATA1MOVR1,#DATA2MOVR3,#nLOOP:MOVXA,@R0JZAA1MOV@R1,AINCR0INCR1DJNZR3,LOOPAA1:SJMP$,,距離≤128,考慮數(shù)據(jù)區(qū)長(zhǎng)度,,累加器零條件轉(zhuǎn)移實(shí)例,考慮數(shù)據(jù)區(qū)長(zhǎng)度,DJNZ應(yīng)用實(shí)例2(課堂練習(xí)),編寫一段程序,把片內(nèi)RAM地址30H~3FH的16個(gè)存儲(chǔ)單元清0,DJNZ應(yīng)用實(shí)例2(解答),編寫一段程序,把片內(nèi)RAM地址30H~3FH的16個(gè)存儲(chǔ)單元清0,MOVR0,#30H;地址指針初始化MOVR1,#16;循環(huán)變量初始化AGA:MOV@R0,#0;存儲(chǔ)單元清0INCR0;地址指針增加DJNZR1,AGA;循環(huán)變量判斷,子程序調(diào)用與返回指令,,,,,,,,,,,,,,,,,,,,主,程,序,子,程,序,1,子,程,序,2,斷點(diǎn)1,斷點(diǎn)2,恢復(fù)斷點(diǎn)2,恢復(fù)斷點(diǎn)1,斷點(diǎn):在子程序調(diào)用時(shí),指調(diào)用指令的下一條指令地址,將被壓入堆棧,在返回指令中被從棧頂彈出到PC,絕對(duì)調(diào)用指令,指令格式:ACALLaddr11執(zhí)行操作:PC←PC+2SP←SP+1,(SP)←PC7~0SP←SP+1,(SP)←PC15~8PC10~0←addr11PC15~11不變,,斷點(diǎn)保護(hù),絕對(duì)調(diào)用指令示例,MOVA,#20H……ACALLAA1………………AA1:MOVA,R0……RET,,在同一個(gè)2KB區(qū)間內(nèi),長(zhǎng)調(diào)用指令,指令格式:LCALLaddr16執(zhí)行操作:PC←PC+3SP←SP+1,(SP)←PC7~0SP←SP+1,(SP)←PC15~8PC15~0←addr16,,斷點(diǎn)保護(hù),長(zhǎng)調(diào)用指令示例,MOVA,#20H……LCALLAA1………………AA1:MOVA,R0……RET,,距離任意,64KB轉(zhuǎn)移空間,返回指令,返回指令指令格式:RET執(zhí)行操作:PC15~8←(SP)SP←SP-1PC7~0←(SP)SP←SP-1中斷返回指令格式:RETI操作:(1)清除中斷響應(yīng)時(shí)置位的優(yōu)先級(jí)狀態(tài)觸發(fā)器,使同級(jí)或低級(jí)中斷請(qǐng)求不會(huì)被阻斷(2)其它操作同RET指令,,斷點(diǎn)恢復(fù),位處理器(布爾處理器),布爾處理器,,布爾運(yùn)算器ALU,布爾累加器CY(PSW.7),布爾RAM區(qū)共128位,布爾I/O口,P0~P3口每位都可做布爾I/O口,布爾指令子集,17條布爾指令,布爾SFR區(qū),共221位,,布爾地址空間,4.3.5位操作類指令,位操作類指令的分類(17條)位傳送指令:MOV位邏輯操作指令:CPL、CLR、SETB、ANL、ORL位條件轉(zhuǎn)移指令:JC、JNC、JB、JNB、JBC(見(jiàn)轉(zhuǎn)移類指令),位傳送指令,直接尋址位內(nèi)容送進(jìn)位位MOVC,bit;Cy←(bit)進(jìn)位位內(nèi)容送直接尋址位MOVbit,C;(bit)←Cy位地址表示方法1、位地址:RAM(00H~7FH),SFR(80H~FFH)2、位名稱:SFR中的專用名稱位3、點(diǎn)表示:字節(jié)地址或SFR名.位序號(hào)4、位符號(hào)地址表示方式:用偽指令定義的符號(hào)地址,如:FLGbitF0,位邏輯操作指令,進(jìn)位位取反:CPLC進(jìn)位位清零:CLRC進(jìn)位位置1:SETBC,直接尋址位取反:CPLbit直接尋址位清零:CLRbit直接尋址位置1:SETBbit,直接尋址位與進(jìn)位位與:ANLC,bit直接尋址位與進(jìn)位位或:ORLC,bit直接尋址位取反后與進(jìn)位位與:ANLC,/bit直接尋址位取反后與進(jìn)位位或:ORLC,/bit,直接尋址位原值不變,4.4MCS-51匯編語(yǔ)言偽指令,匯編語(yǔ)言程序的格式,匯編語(yǔ)言程序語(yǔ)句,指令語(yǔ)句,偽指令語(yǔ)句,,匯編過(guò)程中產(chǎn)生CPU將要執(zhí)行的機(jī)器代碼,僅對(duì)匯編過(guò)程進(jìn)行控制,不產(chǎn)生可執(zhí)行的機(jī)器代碼:程序定位、符號(hào)定義和存儲(chǔ)空間保留等,指令語(yǔ)句,指令語(yǔ)句格式[標(biāo)號(hào):]操作碼[操作數(shù)][;注釋]各部分由分隔符(空格或Tab)分開(kāi)標(biāo)號(hào)一條指令或一段程序的符號(hào)地址,由1-8個(gè)字母、數(shù)字與下劃線(首字符必須是字母)組成,后跟“:”號(hào)指令語(yǔ)句在匯編過(guò)程中將產(chǎn)生機(jī)器碼,偽指令語(yǔ)句,偽指令格式[名稱]或[標(biāo)號(hào):]偽指令[表達(dá)式或符號(hào)列表]在匯編過(guò)程中不產(chǎn)生機(jī)器碼和目標(biāo)程序,不令計(jì)算機(jī)產(chǎn)生任何操作作用:在匯編程序?qū)υ闯绦蜻M(jìn)行匯編的過(guò)程中,控制匯編程序?qū)υ闯绦虻慕忉專瓿蓴?shù)據(jù)、符號(hào)的定義等,偽指令-ORG,ORG命令格式:ORG16位地址作用:用在一段源程序或數(shù)據(jù)塊前,說(shuō)明程序段或數(shù)據(jù)塊的起始地址例1:ORG0000HLJMPMAINORG1000HMAIN:MOVR0,#100H……例2:ORG1000HTAB:DB01H,02H,……,偽指令-END,END命令格式:END作用:表明源程序結(jié)束,偽指令-DB命令,DB命令格式:[標(biāo)號(hào):]DB數(shù)據(jù)項(xiàng)或數(shù)據(jù)項(xiàng)列表作用:定義字節(jié)數(shù)據(jù)或數(shù)據(jù)塊,列表中的數(shù)據(jù)項(xiàng)用逗號(hào)分開(kāi),匯編程序把它們依次存放在從標(biāo)號(hào)地址開(kāi)始的連續(xù)存儲(chǔ)單元中例:ORG2000HFIRST:DB10,20,30,40DB11,12,13,14,……則:從地址為2000H的單元開(kāi)始,存儲(chǔ)單元中的數(shù)據(jù)依次為10,20,30,40,11,12,13,14,偽指令-DW命令,DW命令格式:[標(biāo)號(hào):]DW數(shù)據(jù)項(xiàng)或數(shù)據(jù)項(xiàng)列表作用:定義字?jǐn)?shù)據(jù)或數(shù)據(jù)塊,列表中的數(shù)據(jù)項(xiàng)用逗號(hào)分開(kāi),匯編程序把它們依次存放在從標(biāo)號(hào)地址開(kāi)始的連續(xù)存儲(chǔ)單元中,字的高8位在前,低8位在后例:ORG2000HFIRST:DW1001H,2002HDW03H,4004HDW3344H,5566H,偽指令-DS命令,DS命令格式:[標(biāo)號(hào):]DS數(shù)字作用:定義偽初始化數(shù)據(jù)塊,從標(biāo)號(hào)地址開(kāi)始保留“數(shù)字”規(guī)定個(gè)數(shù)的連續(xù)字節(jié)存儲(chǔ)單元,供以后存入數(shù)據(jù)例:ORG2000HFIRST:DS20H則:從地址為2000H的單元開(kāi)始,保留32個(gè)存儲(chǔ)單元,偽指令-bit命令,bit命令格式:符號(hào)名稱bit位地址作用:給位地址賦予一個(gè)代替的字符名稱例:A1bitP1.0,偽指令-EQU與DATA,賦值命令EQU(先賦值,后使用)格式:符號(hào)名稱EQU表達(dá)式或匯編符號(hào)作用:給表達(dá)式或符號(hào)一個(gè)代替的字符名稱例:rregEQUR0標(biāo)號(hào)地址賦值命令DATA格式:標(biāo)號(hào)名稱DATA表達(dá)式作用:此命令把數(shù)據(jù)/代碼地址賦予標(biāo)號(hào)段所規(guī)定的字符名稱。定義的字符名稱可先使用后定義例:addrDATA2000H,EQU與DATA示例,合法的:reg1EQUR1reg2EQUR2MASKEQU0FHAAEQU10HAA1EQUAA+1L1DATA1000HRAM2DATA30HRAM3DATARAM2+1,非法的:AAEQU30HAAEQU31HcpyEQUmovreg1DATAr1RAM2DATA1000HRAM2DATA30H,偽指令-HIGH與LOW,取16位數(shù)高字節(jié)命令HIGH格式:#HIGH(表達(dá)式)取16位數(shù)低字節(jié)命令LOW格式:#LOW(表達(dá)式),4.5匯編語(yǔ)言程序設(shè)計(jì),匯編語(yǔ)言程序結(jié)構(gòu),順序結(jié)構(gòu),循環(huán)結(jié)構(gòu),,分支結(jié)構(gòu),4.5.1順序程序設(shè)計(jì),初始化,指令1,指令2,……,程序結(jié)束,順序程序?qū)嵗?☆將20H中的8位無(wú)符號(hào)數(shù)轉(zhuǎn)成3位BCD碼,存儲(chǔ)在30H、31H兩個(gè)RAM單元中,FIRSTDATA30HSECONDATA31HORG0000H;復(fù)位向量LJMPSTARTORG0100HSTART:MOVA,20H;A←待轉(zhuǎn)換數(shù)據(jù)xMOVB,#100DIVAB;百位BCD=x/100MOVFIRST,A;30H←百位MOVA,B;A←x/100的余數(shù)y,MOVB,#10;DIVAB;y/10,A中為十位,B中為個(gè)位SWAPA;把十位BCD交換到A的高4位ORLA,B;A高4位中的十位BCD與B中的;個(gè)位BCD組合起來(lái)MOVSECON,A;結(jié)果存儲(chǔ)31H單元SJMP$END,4.5.2分支程序設(shè)計(jì),分支程序?qū)嵗ɡ?-2),ORG0000HSTART:MOVA,30H;取溫度值CLRCSUBBA,#35;溫度值減去35JCNEXT;小于35度轉(zhuǎn)下一步SETBP1.0;否則點(diǎn)亮紅燈CLRP1.1CLRP1.2SJMPSTART;繼續(xù)檢測(cè)NEXT:MOVA,30H;重取溫度值CLRCSUBBA,#20;溫度值減去20JCYE;小于20轉(zhuǎn)點(diǎn)黃燈,SETBP1.1;否則點(diǎn)亮綠燈CLRP1.0CLRP1.2SJMPSTARTYE:SETBP1.2;點(diǎn)亮黃燈CLRP1.0CLRP1.1SJMPSTARTEND,散轉(zhuǎn),散轉(zhuǎn)是一種并行的多分支程序轉(zhuǎn)移結(jié)構(gòu)在同一轉(zhuǎn)移點(diǎn)上,根據(jù)不同的輸入條件使程序轉(zhuǎn)移向不同的入口點(diǎn)上。散轉(zhuǎn)方法:1、構(gòu)建轉(zhuǎn)移指令表,用指令JMP@A+DPTR執(zhí)行程序轉(zhuǎn)移2、構(gòu)建轉(zhuǎn)移目標(biāo)地址表,用指令MOVC裝載目標(biāo)地址至DPTR,用指令JMP@A+DPTR執(zhí)行程序轉(zhuǎn)移,散轉(zhuǎn)程序?qū)嵗ɡ?-3),ORG0000HSTART:MOVDPTR,#TAB;指向轉(zhuǎn)移指令表MOVA,30H;取30H內(nèi)容MOVB,#3MULAB;30H內(nèi)容乘以3JMP@A+DPTR;轉(zhuǎn)向地址(DPTR)+(A)TAB:LJMPOPR0;轉(zhuǎn)向功能程序1LJMPOPR1;轉(zhuǎn)向功能程序2LJMPOPR2;轉(zhuǎn)向功能程序3OPR0:MOV31H,#10H;功能程序1SJMP$OPR1:MOV31H,#20H;功能程序2SJMP$OPR2:MOV31H,#30H;功能程序3SJMP$,基于地址表方法的例4-3,ORG0000HSTART:MOVDPTR,#TAB;指向轉(zhuǎn)移目標(biāo)地址表MOVA,30H;取30H內(nèi)容MOVB,#2MULAB;30H內(nèi)容乘以2MOVR1,A;目標(biāo)地址表偏移MOVCA,@A+DPTR;取目標(biāo)地址高位PUSHACC;暫存MOVA,R1ADDA,#1;地址表偏移+1MOVCA,@A+DPTR;取目標(biāo)地址低位MOVDPL,A,POPACC;恢復(fù)目標(biāo)地址高位MOVDPH,ACLRAJMP@A+DPTR;轉(zhuǎn)向地址(DPTR)+(A)TAB:DWOPR0,OPR1,OPR2OPR0:MOV31H,#10H;功能程序1SJMP$OPR1:MOV31H,#20H;功能程序2SJMP$OPR2:MOV31H,#30H;功能程序2SJMP$END,4.5.3循環(huán)程序設(shè)計(jì),地址指針和循環(huán)變量初始化,循環(huán)控制,循環(huán)體,地址指針和循環(huán)變量修改,地址指針和循環(huán)變量初始化,循環(huán)控制,循環(huán)體,地址指針和循環(huán)變量修改,Yes,No,No,Yes,先處理后判斷,先判斷后處理,循環(huán)程序示例,☆從BLOCK單元開(kāi)始有一無(wú)符號(hào)數(shù)據(jù)塊,其長(zhǎng)度存放于LEN單元,求出數(shù)據(jù)塊中最大的數(shù),并存放于MAX中,LENDATA30HMAXDATA31HBLOCKDATA32HORG0000H;復(fù)位向量LJMPSTARTORG0100HSTART:CLRA;A←0MOVR2,LEN;循環(huán)變量(循環(huán)計(jì)數(shù))MOVR1,#BLOCK;地址指針R1指向BLOCK,LOOP:CLRC;準(zhǔn)備減法SUBBA,@R1;A與數(shù)據(jù)塊中數(shù)據(jù)((R1))比較JNCNEXT;A>((R1)),轉(zhuǎn)移MOVA,@R1;A<((R1)),A←((R1)),SJMPNEXT1NEXT:ADDA,@R1;恢復(fù)A中減掉部分NEXT1:INCR1;指向下一個(gè)待比較數(shù)據(jù)DJNZR2,LOOP;循環(huán)控制MOVMAX,A;結(jié)果存儲(chǔ)SJMP$END,軟件延時(shí),DELAY:MOVR7,#n;1TDELY:MOVR6,#m;1TDJNZR6,$;2TDJNZR7,DELY;2TRET;2T注:T表示機(jī)器周期,★利用軟件循環(huán)可以產(chǎn)生一定時(shí)間長(zhǎng)度的延時(shí),,2Tm+1T=K,,(2T+K)n+1T,4.5.4查表程序設(shè)計(jì),☆MOVCA,@A+DPTR1、表首地址→DPTR2、表項(xiàng)偏移→A3、執(zhí)行MOVC,查詢結(jié)果→A,☆MOVCA,@A+PC1、表項(xiàng)偏移→A2、計(jì)算“MOVC”下一條指令地址與表首址的字節(jié)距離distance3、將distance加到A中4、執(zhí)行MOVC,查詢結(jié)果→A,查表程序示例,☆在HEX單元存放著一個(gè)2位十六進(jìn)制數(shù),把它轉(zhuǎn)換2位ASCII碼,并存放于ASC、ASC+1單元中,HEXEQU30HASCEQU31HORG0000H;復(fù)位向量LJMPSTARTORG0100HSTART:MOVDPTR,#ASCTBMOVA,HEX;A←(HEX)PUSHACC;保留高位ANDA,#0FH;屏蔽高位MOVCA,@A+DPTR;查表,另一種查表法:去掉此句,更改為ADDA,#ASCTB-M1MOVCA,@A+PC,,M1:MOVASC,A;高位轉(zhuǎn)換結(jié)果存儲(chǔ)POPACC;恢復(fù)高位SWAPA;高低位交換ANDA,#0FHMOVCA,@A+DPTR;查表M2:MOVASC+1,A;低位轉(zhuǎn)換結(jié)果存儲(chǔ)SJMP$ASCTB:DB“0123456789abcdef”END,更改為ADDA,#ASCTB-M2MOVCA,@A+PC,,4.5.5子程序設(shè)計(jì),調(diào)用主程序通過(guò)調(diào)用指令進(jìn)入子程序(斷點(diǎn)保護(hù))子程序通過(guò)RET指令返回主程序(斷點(diǎn)恢復(fù))在子程序必須保護(hù)公用寄存器或其它資源的內(nèi)容(現(xiàn)場(chǎng)保護(hù))主子程序間的參數(shù)傳遞入口參數(shù):主程序傳給子程序的參數(shù)出口參數(shù):子程序傳給主程序的參數(shù)參數(shù)傳遞方法:通過(guò)寄存器(工作寄存器或累加器)或固定地址的片內(nèi)RAM單元傳遞參數(shù)通過(guò)堆棧傳遞參數(shù),工作寄存器傳遞參數(shù)子程序?qū)嵗?ORG0000HSTART:…MOVR0,#30H;RAM區(qū)始址MOVR7,#20H;RAM區(qū)長(zhǎng)度LCALLCLEAR;調(diào)用清零子程序…CLEAR:CLAA;清零子程序LOOP:MOV@R0,AINCR0DJNZR7,LOOPRET;子程序返回END,堆棧傳遞子程序示例,☆在HEX單元存放著一個(gè)2位十六進(jìn)制數(shù),把它轉(zhuǎn)換2位ASCII碼,并存放于ASC、ASC+1單元中,HEXEQU30HASCEQU31HORG0100HSTART:PUSHHEX;待轉(zhuǎn)換數(shù)據(jù)通過(guò)堆棧傳遞LCALLHASC;調(diào)用轉(zhuǎn)換子程序POPASC;轉(zhuǎn)換結(jié)果通過(guò)堆棧傳遞MOVA,HEXSWAPAPUSHACCLCALLHASCPOPASC+1SJMP$,HASC:DECSP;SP指向待轉(zhuǎn)換數(shù)據(jù)DECSPPOPACC;待轉(zhuǎn)換數(shù)據(jù)送AANDA,#0FHADDA,#7;查表地址校正MOVCA,@A+PC;查表PUSHACC;轉(zhuǎn)換結(jié)果推入棧頂INCSP;SP指向斷點(diǎn)返回地址INCSPRETASCTB:DB“0123456789abcdef”END,- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 單片機(jī)原理及應(yīng)用 單片機(jī) 原理 應(yīng)用 2010
鏈接地址:http://m.appdesigncorp.com/p-12670977.html