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