C單片機(jī)匯編語言程序設(shè)計(jì)(新)解讀.ppt_第1頁
C單片機(jī)匯編語言程序設(shè)計(jì)(新)解讀.ppt_第2頁
C單片機(jī)匯編語言程序設(shè)計(jì)(新)解讀.ppt_第3頁
C單片機(jī)匯編語言程序設(shè)計(jì)(新)解讀.ppt_第4頁
C單片機(jī)匯編語言程序設(shè)計(jì)(新)解讀.ppt_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、單片機(jī)原理與應(yīng)用Principle 從0000H單元開始存放下面的指令 LJMP 0030H ORG 0030H;從0030H單元開始存放下面的指令 MAIN:MOV SP,#50H ORG 0040H;從0040H單元開始存放下面的數(shù)據(jù) TAB:DB 23,89,定義字節(jié)命令DB (Define Byte),在程序存儲(chǔ)器中定義字節(jié)數(shù)據(jù)。 Xn可以是一字節(jié)常數(shù);用雙引號或者單引號括起來的字符或字符串;各個(gè)數(shù)之間用逗號隔開。,DB,8,ORG 1000H A1:DB 01001010B,23o,23,78H, A2:DB 5,”12AB”,12D,-2,(1000H)=01001010B=4AH

2、, (1001H)=23o=13H, (1002H)=23=17H, (1003H)=78H, (1004H)=35H(5的ASCII碼),(1005H)=31H(1的ASCII碼), (1006H)=32H(2的ASCII碼), (1007H)=41H(A的ASCII碼), (1008H)=42H(B的ASCII碼), (1009H)=12D=0CH (100AH)=-2=0FEH,【例】,定義數(shù)據(jù)字命令DW (DefineWord),在程序存儲(chǔ)器中定義16位的數(shù)據(jù)字。 存放時(shí),數(shù)據(jù)字的高8位在低地址,低8位在后高地址。 通常,DB用來定義數(shù)據(jù),DW用來定義地址。,DW,DW “AA”;存入

3、41H,41H DW “A”;存入00H,41H DW “ABC”;不合法,因?yàn)槌^了兩個(gè)字節(jié) DW 100H,1ACH,-804 ;按順序存入01H、00H、01H、0ACH、0FCH、0DCH,9,【例】,預(yù)留存儲(chǔ)區(qū)命令DS (Define Storage),在程序存儲(chǔ)器中保留指定數(shù)目的單元作為預(yù)留存儲(chǔ)區(qū),供程序運(yùn)行使用。,【例】ADDRTAB:DS 20 ;從標(biāo)號ADDRTAB代表的地址開始,預(yù)留20個(gè) ;連續(xù)的地址單元。, DS ,DB、DW、DS只能對于程序存儲(chǔ)器使用,10,位定義命令BIT,把位地址賦給字符名稱。,【例】:AQ BIT P1.0 ;把P1.0的位地址賦給字符名AQ,

4、在其后 ;的編程中AQ可以作為位地址使用。, BIT ,11,賦值命令 EQU (Equate),給數(shù)或符號賦給字符 可以是常數(shù)、地址、標(biāo)號或表達(dá)式。 賦值以后的字符既可以作地址使用,也可以作立即數(shù)使用。,【例】CS EQU 0FFFFH,A1 EQU R1 A2 EQU 10H DELAY EQU 0708H,A1可作為寄存器R1來使用,A2可作為8位直接地址或立即數(shù)使用,DELAY可作為16位地址或者立即數(shù)使用。,字符名 EQU 數(shù)或匯編符號,12,數(shù)據(jù)地址賦值偽指令DATA,將表達(dá)式的值賦給字符。 表達(dá)式可以是一個(gè)數(shù)據(jù)或地址,也可以是一個(gè)包含所定義字符名在內(nèi)的表達(dá)式,但不能是一個(gè)匯編符號

5、(如R0R7)。 與EQU的區(qū)別: EQU必須先定義后使用。 DATA無此限制,所以DATA偽指令可以放在源程序的開頭或末尾,MOV R0,ADDRESS MOV R1,#ADDRESS ADDRESS DATA 31H,將31H單元內(nèi)容送R0,(R1)=31H。,字符名 DATA 表達(dá)式,13,匯編終止命令END (End of assembly),用于終止源程序的匯編工作,在一個(gè)源程序中只能有一條END命令,并且位于程序的最后。 如果END命令出現(xiàn)在程序中間,則其后面的源程序?qū)⒉挥杼幚怼?14,一般匯編調(diào)試工具要求的匯編格式,一般用匯編語言編寫的程序,要求指出該程序存放于內(nèi)存地址的位置,并

6、且將用到的數(shù)據(jù)和需要預(yù)留存放數(shù)據(jù)的空間用偽指令定義好 然后編寫程序代碼 最后用原地踏步或返回起始位置循環(huán)作為結(jié)束。,ORG SJMP $ END,【例】程序格式如下:,15,匯編語言程序的基本結(jié)構(gòu)形式,16,分支結(jié)構(gòu),使用條件轉(zhuǎn)移指令對程序的執(zhí)行結(jié)果進(jìn)行判斷 JZ、JNZ、CJNE、DJNZ JC、JNC、JB、JNB、JBC,17,【例】二分支。在外部RAM中有ST1、ST2和ST3共3個(gè)連續(xù)單元,其中ST1和ST2單元中存放著兩個(gè)無符號二進(jìn)制數(shù),要求找出其中的大數(shù)并存入ST3單元中。,18,【例】三分支-多次二選一。設(shè)變量x存入30H單元,求得函數(shù)y存入31H單元。按下式要求給y賦值:,要

7、根據(jù)x的大小來決定y值,在判斷x5和y10時(shí),采用CJNE和JC以及CJNE和JNC指令進(jìn)行判斷。,19,ORG 1000H MOV A,30H;取x CJNE A,#5,NEXT1;與5比較 NEXT1:JC NEXT3;x5,則轉(zhuǎn)NEXT3 CJNE A,#10,NEXT2;與10比較 NEXT2:JNC NEXT4; x10,則轉(zhuǎn)NEXT4MOV R0,#0;5x 10,y=0 SJMP NEXT5 NEXT3:MOV R0,A DEC R0;x5,y=x-1 SJMP NEXT5 NEXT4:MOV R0,A INC R0;x10,y=x+1 NEXT5:MOV 31H,R0;存結(jié)果

8、SJMP $ END,20,多分支轉(zhuǎn)移,使用變址尋址轉(zhuǎn)移指令(散轉(zhuǎn)指令) JMP A+DPTR ;PC(A)+(DPTR) 數(shù)據(jù)表、轉(zhuǎn)移指令表、堆棧操作,21,通過數(shù)據(jù)表實(shí)現(xiàn)程序多分支,22,MOV A, #k;分支序號k送A MOV DPTR,#BRTAB;表首址 MOVC A,A+DPTR;查表后,(A)=BRk-BRTAB JMP A+DPTR;散轉(zhuǎn)指令,(PC)=BRk BRTAB: DB BR0-BRTAB;數(shù)據(jù)表,BRTAB+0 DBBR1-BRTAB; 分支入口地址與表首址之差,BRTAB+1 DBBRn-BRTAB;BRTAB+n BR0:;各個(gè)分支程序 BR1: BRn:,通

9、過轉(zhuǎn)移指令表實(shí)現(xiàn)程序多分支,23,MOV A,#k;分支序號k送A RL A;分支序號乘以2 MOV DPTR,#BRTAB;表首址 JMP A+DPTR;(PC)=BATAB+2k BRTAB: AJMP BR0;轉(zhuǎn)分支程序0,BRTAB AJMP BR1;轉(zhuǎn)分支程序1,BRTAB+2 AJMP BRn;轉(zhuǎn)分支程序n,BRTAB+2n BR0:;各個(gè)分支程序 BR1: BRn:,使用長轉(zhuǎn)移指令LJMP時(shí),,MOV A,#k RL A ADD A,R3 MOV DPTR,#BRTAB JMP A+DPTR BRTAB:LJMP BR0;BRTAB LJMP BR1;BRTA+3 LJMP BR

10、n;BRTAB+3n,24,通過堆棧操作實(shí)現(xiàn)程序多分支,25,MOV DPTR,#BRTAB;分支程序入口地址表首址 MOV A,#k;分支序號放入A中 RL A;分支序號值乘以2 MOV R1,A;暫存A值入R1 INC A;A指向低位地址 MOVC A,A+DPTR;取低位地址BRn 7-0 PUSH ACC;低位地址入棧 MOV A,R1;恢復(fù)A值 MOVC A,A+DPTR;取高位地址BRn 15-8 PUSH ACC;高位地址入棧 RET;分支入口地址裝入PC BRTAB: DW BR0;分支程序入口地址表,BRTAB、BRTAB+1 DW BR1;BRTAB+2、BRTA+3 DW

11、 BRn;BRTAB+2n、BRTAB+2n+1,RET PC158(SP), SP(SP)-1 PC70(SP), SP(SP)-1,循環(huán)結(jié)構(gòu),初始化部分 對于循環(huán)次數(shù)計(jì)數(shù)器、地址指針賦初值,對于使用到的寄存器或者存儲(chǔ)單元賦初值,為循環(huán)作準(zhǔn)備。 循環(huán)體部分 為下一次循環(huán)創(chuàng)造條件:修改循環(huán)次數(shù)計(jì)數(shù)器、地址指針,避免死循環(huán)。 循環(huán)的判斷與控制:判斷循環(huán)次數(shù)計(jì)數(shù)器,或者檢查判斷循環(huán)條件。 可以直接由循環(huán)體內(nèi)轉(zhuǎn)到循環(huán)體外或外層循環(huán);不能從循環(huán)體外直接跳轉(zhuǎn)到循環(huán)體內(nèi),只能從外層向內(nèi)層一層層進(jìn)入。 循環(huán)結(jié)束處理: 結(jié)果保存等。,26,【例】單循環(huán)。編程實(shí)現(xiàn)把外部RAM中從8000H開始的100個(gè)字節(jié)數(shù)據(jù)

12、傳送到8100H開始的單元中。,MOV R7,#100 MOV DPL,#00H LOOP: MOV DPH,#80H MOVX A,DPTR MOV DPH,#81H MOVX DPTR,A INC DPL DJNZ R7,LOOP,MOV R0,#00 LOOP: MOV P2,#80H MOVX A,R0 MOV P2,#81H MOVX R0,A INC R0 CJNE R0,#100,LOOP,或,27,【例】由循環(huán)內(nèi)部跳出循環(huán)。把長度為10H的字符串從內(nèi)部RAM緩沖區(qū)inbuf向位于外部RAM的輸出緩沖區(qū)outbuf傳送,一直進(jìn)行遇到回車符CR或整個(gè)字符串傳送完畢。,START:M

13、OV R7,#10H MOV R0,#inbuf MOV DPTR, #outbuf LOOP:MOV A,R0 CJNE A,#0D0H,CONTINUE SJMP FINISH CONTINUE:MOVX DPTR,A INC R0 INC DPTR DJNZ R7,LOOP FINISH:SJMP $ END,28,子程序,在主程序中調(diào)用子程序 LCALL/ACALL 標(biāo)號;調(diào)用子程序時(shí),斷點(diǎn)入棧保存 由子程序返回主程序 RET;子程序返回時(shí),斷點(diǎn)出棧從而回到主程序。 子程序中,視情況進(jìn)行現(xiàn)場保護(hù)和現(xiàn)場恢復(fù) 1、使用堆棧:PUSH/POP 2、暫存到其它存儲(chǔ)單元中,最終恢復(fù)即可,29,調(diào)

14、用延時(shí)子程序DELAY。,主程序: 子程序: 該子程序根本不需要主程序提供入口參數(shù),從進(jìn)入子程序開始,到子程序返回,這個(gè)過程花費(fèi)CPU一定的時(shí)長。 循環(huán)體只能執(zhí)行有限次,避免“死循環(huán)” 。,DELAY:PUSH 06H PUSH 07H MOV R7,#100 DLY0:MOV R6,#98 NOP DLY1:DJNZ R6,DLY1 DJNZ R7,DLY0 POP 07H POP 06H RET,LCALL DELAY,30,80C51單片機(jī)匯編語言程序設(shè)計(jì)舉例,定時(shí)程序 查表程序 求平方 極值查找程序 查找關(guān)鍵字 擴(kuò)展 階乘計(jì)算 壓縮和解壓程序 算術(shù)運(yùn)算:加、減、乘、除 數(shù)據(jù)排序 數(shù)制與

15、編碼轉(zhuǎn)換程序 LED的簡單控制 KEY+LED的簡單控制,31,單循環(huán)定時(shí)程序,DELAY:MOV R5,#TIME;1 LOOP:NOP;1 NOP;1 DJNZ R5,LOOP;2 RET;2,1+(1+1+2)*R5+2*機(jī)器周期 12M 機(jī)器周期=1us 定時(shí)時(shí)長為:,32,如何調(diào)整定時(shí)時(shí)長?,較長時(shí)間的定時(shí)程序,DELAY:MOV R5,#TIME1;1 LOOP2:MOV R4,#TIME2;1 LOOP1:NOP;1 NOP;1 DJNZ R4,LOOP1;2 DJNZ R5,LOOP2;2 RET;2,1+1+(1+1+2)*R4+2*R5+2*機(jī)器周期,33,通過一個(gè)基本延時(shí)

16、程序產(chǎn)生不同的定時(shí),MOV R0,#05H;5ms LOOP1:LCALL DELAY;1ms DJNZ R0,LOOP1 MOV R0,#OAH;10ms LOOP2:LCAL DELAY DJNZ R0,LOOP2 MOV R0,#14H;20ms LOOP3:LCALL DELAY DJNZ R0,LOOP3 ,34,查表指令,按順序讀出存儲(chǔ)器中的數(shù)據(jù)稱為查表。先確定好PC或DPTR的內(nèi)容,然后有規(guī)律地改變A的內(nèi)容,就可以進(jìn)行程序存儲(chǔ)器中表格數(shù)據(jù)的讀出。 MOVC A,A+DPTR 可在64KB范圍內(nèi)查表,長查表指令。 MOVC A,A+PC 查距本指令256個(gè)字節(jié)以內(nèi)的數(shù)據(jù),短查表指令

17、。 PC=當(dāng)前查表指令地址+1 變址調(diào)整值,即該指令執(zhí)行后的地址到表格首址之間的距離 注意:如果數(shù)據(jù)表存放在外部ROM中,執(zhí)行查表指令時(shí),會(huì)在控制引腳PSEN上產(chǎn)生一個(gè)程序存儲(chǔ)器讀信號。,35,查表程序,功能:復(fù)雜計(jì)算、非線性計(jì)算、非數(shù)值計(jì)算的處理。 查表:把事先計(jì)算或測得的數(shù)據(jù)按順序編制成表格存放在程序存儲(chǔ)器ROM中(偽指令DB或DW);查表程序根據(jù)被測數(shù)據(jù),查出表格中對應(yīng)的結(jié)果。 優(yōu)點(diǎn):編程簡單、執(zhí)行速度快、適合于實(shí)時(shí)控制。,36,【例】分別用兩條查表指令編寫一段子程序,功能為:根據(jù)累加器A中的數(shù)(09之間)查找平方表,求出相應(yīng)的平方數(shù),放在A中。,SQUARE: MOV DPTR,#TA

18、B MOVC A,A+DPTR RET TAB:DB 0,1,4,9,16,25,36,49,64,81,SQUARE: ADD A,#1 MOVC A,A+PC RET;1 TAB:DB 0,1,4,9,16,25,36,49,64,81,或,37,【例】子程序。編程實(shí)現(xiàn)運(yùn)算式c=a2+b2。假定a、b、c分別存放在內(nèi)部RAM的30H、31H、32H單元中,ORG 0000H SJMP MAIN ORG 0030H MAIN:MOV A,30H LCALL SQUARE MOV 30H,A MOV A,31H LCALL SQUARE ADD A,30H MOV 32H,A SJMP $,3

19、8,【例】階乘計(jì)算求Y=n!(n=0,1,2,9)的值。,按照求階乘的運(yùn)算,需繼續(xù)n-1次乘法,運(yùn)算程序復(fù)雜。 采用查表法。事先計(jì)算n的階乘值并作成表格,通過查表程序獲得結(jié)果。 9!=362880=58980H, 表格中每個(gè)結(jié)果占用3個(gè)存儲(chǔ)單元。 Y地址=表首址+n3 程序中:n值存放在A中,Y值存入R2R1R0中。,39,ORG 2000H TEM EQU 30H FACTORIAL:MOV B,#3 MUL AB;n在A中,n3 MOV B,A;暫存B中 MOV DPTR,#TAB;指向表首址TABL MOV A,A+DPTR;查表取低字節(jié) MOV R0,A;存入R0 INC DPTR;修正地址指針 MOV A,B;恢復(fù)n3 MOV A,A+DPTR;查表取中間字節(jié) MOV R1,A;存入R1 INC DPTR;修正地址指針 MOV A,B;恢復(fù)n3 MOVC A,A+DPTR;查表取高字節(jié) MOV R2,A;存入R2 RET TAB:DB 0,0,0, 0,0,1,0,0,2, 0,0,6;0,1,2,3的階乘 DB 0,0,18H,0,0,78H,0,2,D0H;4,5,6的階

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論