




已閱讀5頁,還剩55頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
MCS-51系列單片機的程序設計,第四章,交叉匯編語言MASM51,單片機匯編語言程序設計方法及技巧,了解交叉匯編語言MASM51的特點,掌握順序程序、分支程序、循環程序、查表程序、子程序的基本設計方法和技巧,掌握匯編語言程序設計的一般步驟,4.1 交叉匯編語言MASM51,匯編語言源程序是由匯編指令和偽指令組成的文件,其擴展名為“ASM”。,1)人工匯編 人工匯編是通過人工查出源程序中所有匯編指令的機器碼,并依次將機器碼輸入單片機中,使之成為單片機能直接執行的目標程序。,2)機器匯編 機器匯編是指在計算機上通過匯編程序對源程序進行匯編,即從源程序到目標程序的轉換過程是由計算機上的匯編程序自動完成的。,3)交叉匯編 是指用一種計算機上的匯編程序去匯編另一種計算機的源程序,為另一種計算機產生目標程序。,單片機MCS-51匯編語言程序設計步驟: 1 分析問題 2 確定算法 3 設計程序流程圖 4 分配內存單元 5 編寫匯編語言源程序 6 調試程序,4.2 程序設計方法及技巧,4.2.1 順序程序設計,分析:應注意片內和片外的尋址指令不同,ORG 1000H MOV R0 ,#68H MOV A ,R0 ; 片內RAM104單元內容送累加器 MOV DPTR ,#0104H MOVX DPTR ,A ; 完成片內RAM104單元內容送片 ; 外104H單元中 INC R0 MOV A ,R0 ; 片內RAM105單元內容送累加器 INC DPTR MOVX DPTR ,A ; 完成片內RAM105單元內容送片 ; 外105H單元中 SJMP $ END,1. 簡單分支程序,4.2.2 分支程序設計,圖4.1 簡單分支程序轉移,分析:只要將兩數進行比較,用比較的結果作為分支轉移的條件就很容易地找出其中的大數。,ORG 1000H CLR C MOV R0 , #FIRST ;第一個數地址送R0中 MOV A , R0 ;取第一個數 INC R0 ;R0指向第二個數地址 SUBB A , R0 ;兩數比較 JC BIG ;第二個數大轉BIG DEC R0 ;R0指向第一個數地址 BIG: MOV SECOND , R0 ;存大數 SJMP $ END,參考程序,2)多路分支程序(散轉程序),圖4.2 多路分支程序轉移,1)把AJMP或LJMP指令組成一個分支程序的 轉移表,表的首地址放入DPTR中; 2)調整后的出口信息放入累加器A中; 3)執行JMP A+DPTR轉向對應的分支程序。,可通過間接轉移指令JMP A+DPTR和 無條件轉移指令中的AJMP或LJMP指令來實現 多路分支轉移:,例 4.3,已知R0中存放有一數字關鍵碼,要求根據碼值的不同,分別轉向對應的碼值程序段去執行。即當R0=K時,便執行CODEK程序。,ORG 1000H MOV DPTR ,#TAB ;表首址送DPTR MOV A ,R0 ;取數字關鍵碼 ADD A ,R0 ;每條AJMP指令占用兩個字 ;節,將關鍵碼乘以2 JNC LESS ;關鍵碼小于128轉LESS INC DPH LESS: JMP A+DPTR TAB: AJMP CODE0 ;關鍵碼為0,轉CODE0執行 AJMP CODE1 ;關鍵碼為1,轉CODE1執行 AJMP CODE255 ;關鍵碼為255,轉CODE255 ;執行,AJMP指令的轉移范圍不超出所在的2KB字節區間,如各小段程序較長,在2KB字節內無法全部容納,上面的程序應該怎樣修改?,思考,1)循環初始化 設置循環的初始狀態,位于循環程序的開頭位置 2)循環處理 循環程序的主體部分,是通過反復執行來完成數據的具體處理,它位于循環體內。,4.2.3 循環程序設計,循環程序由4部分組成:,3)循環控制 也在循環體內,是用于控制循環的繼續與否。 4)循環結束 通常位于循環體后,是用來存放循環處理的最終結果及恢復各寄存器與工作單元的原始值。,設MCS-51單片機內部RAM從40H開始的連續16個單元中,每個單元中分別存放有單字節的帶符號數。要求將其中的正數存入50H開始的連續單元中,負數存入60H開始的連續單元中,并將正數、負數和零的個數分別存入70H、71H、72H單元中。,例 4.4,1)帶符號數的最高位為符號位,可通過 最高位來判斷正負。 2)程序中需要分別從40H、50H 和60H單 元開始取源數、存放正數和負數,故需要三 個地址指針來指向對應的內存單元;設對應 的地址指針分別為R0、R1和R2,由于R2 不 能用間接尋址方式,故R2需要同R1或R0進行 交換后,才能進行負數的存放。,分析,圖4.3 程序流程圖,參考程序: ORG 1000H CLR A MOV 70H , A ; 存放正數的個數單元清0 MOV 71H , A ; 存放負數的個數單元清0 MOV 72H , A ; 存放零的個數單元清0 MOV R3 , #10H ; 設循環計數器初值 MOV R0 , #40H ;設源數地址指針 MOV R1 , #50H ;設正數地址指針 MOV R2 , #60H ;設負數地址指針,LOOP:MOV A , R0 ; 取源數 JZ ZERO ; 源數為0,轉ZER0 JNB ACC.7 , POSI ; 源數為正,轉POSI INC 71H ; 負數個數加1 MOV R4 , A ; 暫存源數 MOV A , R2 XCH A , R1 ; R1與R2中的內容交換 XCH A , R4 MOV R1 , A ;存負數 XCH A , R4 XCH A , R1 ; R1與R2中的內容交換 INC R2 ;調整負數地址指針 SJMP LOOP1 ; 轉循壞控制,POSI: INC 70H ;正數個數加1 MOV R1 , A ;存正數 INC R1 ;調整正數地址指針 SJMP LOOP1 ZERO: INC 72H ;零的個數加1 LOOP1:INC R0 ;調整源數地址指針 DJNZ R3 , LOOP ;未送完,繼續 SJMP $ END,查表就是把事先計算或測得的數據按照一定的順序編制成表格存放在存儲器中,然后根據輸入的數據,從表格中查出所需的結果。,4.2.4 查表程序設計,片內RAM的EGA單元中有一個大寫的英文字母,要求將此字母在英文字母表中的位置送入片內的COUNT單元中,如EGA單元中字母為I時,則COUNT單元中需送入數字9。,例 4.6,如果將26個英文字母按照順序編成一個表,通過查表法得到一個字母與EGA單元中的字母比較,若不相等再查,同時記錄查表的次數。查完后,將記錄次數送COUNT單元。,分析,ORG 1000H EGA EQU 50H COUNT EQU 60H MOV COUNT,#00H MOV A , #16 ;調整地址 LOOP: PUSH A MOVC A , A+PC ;查表 CJNZ A , EGA , NF ;所查字母與EGA中字母比較 SJMP LAST ;相等則轉到LAST NF: POP A INC A ;調整地址 INC COUNT ;記數值加1 SJMP LOOP ;繼續查 LAST: INC COUNT ;記數值加1 SJMP $ ;等待 ALPT: DBA,B,Y,Z,求y= n! (n=0,1,9),已知n的值在片內RAM的NUM單元中,求得的y 值用BCD碼表示且存放到片內GETY開始的單元中。,例 4.6,分析:可將函數值列成表,采用查表法求y= n! 當n= 9時,y= 362880H,需要三個單元存放結果。設每個n對應的y值都用3個單元來存放,則y值在表格中的首地址的計算公式為: y地址=函數表首址+ n*3,參考程序 ORG 1000H NUM EQU 50H GETY EQU 60H MOV R1,#03H MOV R0,#GETY MOV A ,NUM ; 取n值 MOV B ,#03H MUL AB ; n*3 MOV R2 ,A ; 暫存 MOV DPTR ,#TAB ; 表的首地址送DPTR中,LOOP: MOVC A ,A+DPTR ;查表 MOV R0 , A ;存結果 INC R0 ;調整存放結果地址指針 INC DPTR ;修正表地址指針 MOV A , R2 ;恢復n*3 DJNZ R1 , LOOP ;未查完,繼續 SJMP $ TAB: DB 01H , 00H , 00H , 01H , 00H , 00H DB 02H , 00H , 00H , 06H , 00H , 00H DB 24H , 00H , 00H , 20H , 01H , 00H DB 20H , 07H , 00H , 40H , 50H , 00H DB 20H , 03H , 04H , 80H , 28H , 36H,編寫子程序時應注意: a.子程序的第一條指令之前必須有標號; b.子程序中需要保護現場; c.主程序和子程序之間的參數傳遞。,4.2.5 子程序設計,1) 數碼轉換子程序,例4.7 二進制碼轉換為ASCII碼,二進制數與ASCII碼的對應關系: 四位二進制 ASCII 0000 (0) 30H 0001 (1) 31H 1001 (9) 39H 1010 (A) 41H 1111 (F) 46H,ORG 1000 BTOASC: PUSH A PUSH PSW MOV A , R0 ANL A , #0FH ;取四位二進制數 MOV R0 , A ;暫存 CLR C SUBB A , #0AH ;與10比較 MOV A , R0 ;恢復四位二進制數 JC LOOP ;小于10轉LOOP ADD A , #07H ;大于10先加07H LOOP: ADD A , #30H ;加30H MOV R0 , A ;存結果 POP PSW POP A RET,已知片內BLOCKB單元開始處有一數據塊,塊長在R2中,在此數據塊的每個單元中存放有一個未組合的BCD碼,要求將每個BCD碼轉換為ASCAII碼,并存放在片內BLOCKA開始的連續單元中。,例4.8 BCD碼轉換為ASCAII碼,主程序: ORG 1000H MOV R2 ,#L MOV R0 ,#BLOCKB ;設BCD碼的地址指針 MOV R1 ,#BLOCKA ;設ASCAII的地址指針 LOOP:ACALL TRANS ;調用TRANS子程序 DJNZ R2 ,LOOP ;未轉換完,繼續 SJMP $,將一位BCD碼轉換為ASCAII碼的子程序: TRANS: MOV A , R0 ;取BCD碼 ADD A , #30H MOV R1 , A ;送ASCAII碼 INC R0 INC R1 RET ;返回,分析:將一位BCD碼轉換為相應的ASCAII碼只 需加上30H即可。,設片內40H單元中有一組合的BCD碼,要求將其轉換為二進制數存回原處。 分析: 1)組合的BCD碼為兩位十進制數,需將十位 數和個位數分開處理。 2)十位數轉換時只要累加0AH就能將其轉換 為相應的二進制數,然后再將個位數直接 加到轉換后的十位數上就可完成整個數的 轉換。,例4.9 BCD碼轉換為二進制數,ORG 1000H BCDTOB: MOV A , 40H ANL A ,#F0H ;取十位數 SWAP A ;將十位數換到低4位 JZ DONE ;十位數為0,返回 MOV R3 ,#00H ;累加和寄存器清0 LOOP: DEC A ACALL ADD0AH ;調用加10子程序 JNZ LOOP ;未加完繼續 MOV A ,40H ANL A ,#0FH ;取個位數 ADD A,R3 ;與十位相加 MOV 40H , A ;轉換完,存結果 DONE: RET ;(書上此處有錯),加10子程序:,已知8位二進制數在R0中,要求將其轉換為BCD碼并存放在片內30H、31H單元中。,分析:8位二進制數轉換成3位BCD碼數,用壓縮BCD碼存放,百位數放31H單元,十位、個位數放30H單元。,例4.10 二進制數轉換為BCD碼,程序流程圖為:,ORG 1000H BTOBCD: MOV A,R0 ;取二進制數 MOV B,#100 DIV AB ;除以100 MOV R1,#31H MOV R1 , A ;百位的BCD碼數存31H單元 DEC R1 XCH A ,B ; 二進制數除以100的余數送累加器中 MOV B , #10 DIV AB ; 除以10 SWAP A ADD A ,B ;十位與個位的BCD碼進行組合 MOV R1 ,A ;組合的BCD碼送30H中 RET,已知片內RAM ADR1開始的單元依次從低位到高位存放有L個字節的無符號數,片外RAM ADR2開始的單元也依次從低位到高位存放有L個字節的無符號數。請編一個加法程序,將他們的和存放在ADR1開始的連續單元中。,2) 算術運算子程序,例4.11 多字節無符號數相加,程序流程框圖:,ORG 1000H NSADD: MOV R0,#ADDR1 ;設被加數的地址指針 MOV DPTR ,#ADDR2 ;設加數的地址指針 MOV R2 ,#L ;設循環計數器初值 CLR C LOOP: MOVX A ,DPTR ;取加數 ADDC A , R0 ;兩數相加 MOV R0 , A ;存和 INC R0 ;調整被加數地址指針 INC DPTR ;調整加數地址指針 DJNZ R2 , LOOP ;未加完,繼續 RET ;返回,已知被乘數和乘數分別為雙字節的無符號數,被乘數的高字節和低字節分別存放在R7和R6中,乘數的高字節和低字節分別存放在R5和R4中。要求乘積存放在片內RAM以ADR開始的單元中。 分析:由于只有單字節乘法指令,雙字節的乘法需要分作4次乘法運算才能實現。,例4.15 兩雙字節無符號數相乘,ORG 1000H MUL1: MOV 40H ,#00H ;統計bdH+adL+bcL ;的進位單元清0 MOV 41H ,#00H ;統計adH+bcH+acL ;的進位單元清0 MOV R0 ,#50H ;積的首地址送R0中 MOV A ,R6 ;b送A MOV B ,R4 ;d送B MUL AB ;bd MOV R0 , A ;bdL送50H單元中 MOV R1 , B ;bdH送R1中,MOV A , R7 ; a送A MOV B , R4 ; d送B MUL AB ; ad MOV R2 , A ; adL送R2中 MOV R3 , B ; adH送R3中 MOV A , R6 ; b送A MOV B , R5 ; c送B MUL AB ; bc ADD A , R2 ;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 長春大學旅游學院《歐美設計規范釋義雙語》2023-2024學年第一學期期末試卷
- 廈門軟件職業技術學院《圖案與應用》2023-2024學年第二學期期末試卷
- 威海海洋職業學院《探究科學》2023-2024學年第一學期期末試卷
- 新疆科信職業技術學院《結構設計實踐》2023-2024學年第二學期期末試卷
- 浙江師范大學《體操1》2023-2024學年第二學期期末試卷
- 襄陽科技職業學院《水利工程地基處理》2023-2024學年第二學期期末試卷
- 長白山職業技術學院《食品衛生微生物檢驗》2023-2024學年第二學期期末試卷
- 四川省成都簡陽市三星中學2024-2025學年初三二檢模擬考試語文試題含解析
- 吉林省吉林市重點中學2025年5月高三第三次月考物理試題含解析
- 浙江金融職業學院《自貿區與國際商務專題》2023-2024學年第一學期期末試卷
- CMOS光電圖像傳感器課件
- DB45-T 2840-2024 陸川豬疫病防治技術規程
- DL∕T 843-2010 大型汽輪發電機勵磁系統技術條件
- 基于BOPPPS模型的微觀經濟學網課教學設計探析-以市場結構理論的教學為例
- 《水泥窯爐富氧(全氧)燃燒技術規范》
- 第37章 主要病原性真菌課件
- 體檢培訓系列課程(五)-體檢套餐選擇與制定
- 2024年福建省高中生物學業水平考試生物試卷試題(含答案詳解)
- 子宮內膜癌-醫師教學查房
- 2024年保密教育線上培訓考試題目及答案【全優】
- 2024年4月自考00149國際貿易理論與實務試題及答案含解析
評論
0/150
提交評論