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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、單片機原理與應用Principle 從0000H單元開始存放下面的指令 LJMP 0030H ORG 0030H;從0030H單元開始存放下面的指令 MAIN:MOV SP,#50H ORG 0040H;從0040H單元開始存放下面的數(shù)據(jù) TAB:DB 23,89,定義字節(jié)命令DB (Define Byte),在程序存儲器中定義字節(jié)數(shù)據(jù)。 Xn可以是一字節(jié)常數(shù);用雙引號或者單引號括起來的字符或字符串;各個數(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),在程序存儲器中定義16位的數(shù)據(jù)字。 存放時,數(shù)據(jù)字的高8位在低地址,低8位在后高地址。 通常,DB用來定義數(shù)據(jù),DW用來定義地址。,DW,DW “AA”;存入

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

4、在其后 ;的編程中AQ可以作為位地址使用。, BIT ,11,賦值命令 EQU (Equate),給數(shù)或符號賦給字符 可以是常數(shù)、地址、標號或表達式。 賦值以后的字符既可以作地址使用,也可以作立即數(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,將表達式的值賦給字符。 表達式可以是一個數(shù)據(jù)或地址,也可以是一個包含所定義字符名在內的表達式,但不能是一個匯編符號

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

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

7、根據(jù)x的大小來決定y值,在判斷x5和y10時,采用CJNE和JC以及CJNE和JNC指令進行判斷。,19,ORG 1000H MOV A,30H;取x CJNE A,#5,NEXT1;與5比較 NEXT1:JC NEXT3;x5,則轉NEXT3 CJNE A,#10,NEXT2;與10比較 NEXT2:JNC NEXT4; x10,則轉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;存結果

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

9、過轉移指令表實現(xiàn)程序多分支,23,MOV A,#k;分支序號k送A RL A;分支序號乘以2 MOV DPTR,#BRTAB;表首址 JMP A+DPTR;(PC)=BATAB+2k BRTAB: AJMP BR0;轉分支程序0,BRTAB AJMP BR1;轉分支程序1,BRTAB+2 AJMP BRn;轉分支程序n,BRTAB+2n BR0:;各個分支程序 BR1: BRn:,使用長轉移指令LJMP時,,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,通過堆棧操作實現(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;恢復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)結構,初始化部分 對于循環(huán)次數(shù)計數(shù)器、地址指針賦初值,對于使用到的寄存器或者存儲單元賦初值,為循環(huán)作準備。 循環(huán)體部分 為下一次循環(huán)創(chuàng)造條件:修改循環(huán)次數(shù)計數(shù)器、地址指針,避免死循環(huán)。 循環(huán)的判斷與控制:判斷循環(huán)次數(shù)計數(shù)器,或者檢查判斷循環(huán)條件。 可以直接由循環(huán)體內轉到循環(huán)體外或外層循環(huán);不能從循環(huán)體外直接跳轉到循環(huán)體內,只能從外層向內層一層層進入。 循環(huán)結束處理: 結果保存等。,26,【例】單循環(huán)。編程實現(xiàn)把外部RAM中從8000H開始的100個字節(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)內部跳出循環(huán)。把長度為10H的字符串從內部RAM緩沖區(qū)inbuf向位于外部RAM的輸出緩沖區(qū)outbuf傳送,一直進行遇到回車符CR或整個字符串傳送完畢。,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,子程序,在主程序中調用子程序 LCALL/ACALL 標號;調用子程序時,斷點入棧保存 由子程序返回主程序 RET;子程序返回時,斷點出棧從而回到主程序。 子程序中,視情況進行現(xiàn)場保護和現(xiàn)場恢復 1、使用堆棧:PUSH/POP 2、暫存到其它存儲單元中,最終恢復即可,29,調

14、用延時子程序DELAY。,主程序: 子程序: 該子程序根本不需要主程序提供入口參數(shù),從進入子程序開始,到子程序返回,這個過程花費CPU一定的時長。 循環(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單片機匯編語言程序設計舉例,定時程序 查表程序 求平方 極值查找程序 查找關鍵字 擴展 階乘計算 壓縮和解壓程序 算術運算:加、減、乘、除 數(shù)據(jù)排序 數(shù)制與

15、編碼轉換程序 LED的簡單控制 KEY+LED的簡單控制,31,單循環(huán)定時程序,DELAY:MOV R5,#TIME;1 LOOP:NOP;1 NOP;1 DJNZ R5,LOOP;2 RET;2,1+(1+1+2)*R5+2*機器周期 12M 機器周期=1us 定時時長為:,32,如何調整定時時長?,較長時間的定時程序,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*機器周期,33,通過一個基本延時

16、程序產生不同的定時,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,查表指令,按順序讀出存儲器中的數(shù)據(jù)稱為查表。先確定好PC或DPTR的內容,然后有規(guī)律地改變A的內容,就可以進行程序存儲器中表格數(shù)據(jù)的讀出。 MOVC A,A+DPTR 可在64KB范圍內查表,長查表指令。 MOVC A,A+PC 查距本指令256個字節(jié)以內的數(shù)據(jù),短查表指令

17、。 PC=當前查表指令地址+1 變址調整值,即該指令執(zhí)行后的地址到表格首址之間的距離 注意:如果數(shù)據(jù)表存放在外部ROM中,執(zhí)行查表指令時,會在控制引腳PSEN上產生一個程序存儲器讀信號。,35,查表程序,功能:復雜計算、非線性計算、非數(shù)值計算的處理。 查表:把事先計算或測得的數(shù)據(jù)按順序編制成表格存放在程序存儲器ROM中(偽指令DB或DW);查表程序根據(jù)被測數(shù)據(jù),查出表格中對應的結果。 優(yōu)點:編程簡單、執(zhí)行速度快、適合于實時控制。,36,【例】分別用兩條查表指令編寫一段子程序,功能為:根據(jù)累加器A中的數(shù)(09之間)查找平方表,求出相應的平方數(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,【例】子程序。編程實現(xiàn)運算式c=a2+b2。假定a、b、c分別存放在內部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,【例】階乘計算求Y=n!(n=0,1,2,9)的值。,按照求階乘的運算,需繼續(xù)n-1次乘法,運算程序復雜。 采用查表法。事先計算n的階乘值并作成表格,通過查表程序獲得結果。 9!=362880=58980H, 表格中每個結果占用3個存儲單元。 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;恢復n3 MOV A,A+DPTR;查表取中間字節(jié) MOV R1,A;存入R1 INC DPTR;修正地址指針 MOV A,B;恢復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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論