湖南工大單片機教材第4章 思考題_第1頁
湖南工大單片機教材第4章 思考題_第2頁
湖南工大單片機教材第4章 思考題_第3頁
湖南工大單片機教材第4章 思考題_第4頁
湖南工大單片機教材第4章 思考題_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、MCS-51系列單片機的程序設(shè)計 思考題,第四章,1. 順序程序設(shè)計,分析:應(yīng)注意片內(nèi)和片外的尋址指令不同,ORG 1000H MOV R0,#68H MOV A,R0 ;片內(nèi)RAM104單元內(nèi)容送累加器 MOV DPTR ,#0104H MOVX DPTR,A ;完成片內(nèi)RAM104單元內(nèi)容送片 ;外104H單元中 INC R0 MOV A,R0 ;片內(nèi)RAM105單元內(nèi)容送累加器 INC DPTR MOVX DPTR,A ;完成片內(nèi)RAM105單元內(nèi)容送片 ;外105H單元中 SJMP $ ;等待 END ;結(jié)束,1. 簡單分支程序,2. 分支程序設(shè)計,圖4.1 簡單分支程序轉(zhuǎn)移,分析:只

2、要將兩數(shù)進(jìn)行比較,用比較的結(jié)果作為分支轉(zhuǎn)移的條件就很容易地找出其中的大數(shù)。,ORG 1000H CLR C MOV R0,#FRIST ;第一個數(shù)地址送R0中 MOV A,R0 ;取第一個數(shù) INC R0 ;R0指向第二個數(shù)地址 SUBB A, R0 ;兩數(shù)比較 JC BIG ;第二個數(shù)大轉(zhuǎn)BIG DEC R0 ;R0指向第一個數(shù)地址 BIG:MOV SECOND, R0 ;存大數(shù) SJMP $ ;等待 END ;結(jié)束,參考程序,2)多路分支程序(散轉(zhuǎn)程序),圖4.2 多路分支程序轉(zhuǎn)移,1)把AJMP或LJMP指令組成一個分支程序的 轉(zhuǎn)移表,表的首地址放入DPTR中; 2)調(diào)整后的出口信息放入

3、累加器A中; 3)執(zhí)行JMP A+DPTR轉(zhuǎn)向?qū)?yīng)的分支程序。,可通過間接轉(zhuǎn)移指令JMP A+DPTR和 無條件轉(zhuǎn)移指令中的AJMP或LJMP指令來實現(xiàn) 多路分支轉(zhuǎn)移:,例 4.3,已知R0中存放有一數(shù)字關(guān)鍵碼,要求根據(jù)碼值的不同,分別轉(zhuǎn)向?qū)?yīng)的碼值程序段去執(zhí)行。即當(dāng)(R0)=K時,便執(zhí)行CODEK程序。,ORG 1000H MOV DPTR,#TAB ;表首址送DPTR MOV A,R0 ;取數(shù)字關(guān)鍵碼 ADD A,R0 ;每條AJMP指令占用兩個字;節(jié),將出口信息乘2 JNC LESS ;關(guān)鍵碼小于128轉(zhuǎn)LESS INC DPH LESS: JMP A+DPTR TAB: AJMP CO

4、DE0 ;關(guān)鍵碼為0,轉(zhuǎn)CODE0執(zhí)行 AJMP CODE1 ;關(guān)鍵碼為1,轉(zhuǎn)CODE1執(zhí)行 AJMP CODE255 ;關(guān)鍵碼為255,轉(zhuǎn)CODE255;執(zhí)行 SJMP $ ;等待 END ;結(jié)束,參考程序,AJMP指令的轉(zhuǎn)移范圍不超出所在的2KB字節(jié)區(qū)間,如各小段程序較長,在2KB字節(jié)內(nèi)無法全部容納,上面的程序應(yīng)該怎樣修改?,思考,1)循環(huán)初始化 設(shè)置循環(huán)的初始狀態(tài),位于循環(huán)程序的開頭位置 2)循環(huán)處理 循環(huán)程序的主體部分,是通過反復(fù)執(zhí)行來完成數(shù)據(jù)的具體處理,它位于循環(huán)體內(nèi)。,3. 循環(huán)程序設(shè)計,循環(huán)程序由4部分組成:,3)循環(huán)控制 也在循環(huán)體內(nèi),是用于控制循環(huán)的繼續(xù)與否。 4)循環(huán)結(jié)束

5、通常位于循環(huán)體后,是用來存放循環(huán)處理的最終結(jié)果及恢復(fù)各寄存器與工作單元的原始值。,設(shè)MCS-51單片機內(nèi)部RAM從40H開始的連續(xù)16個單元中,每個單元中分別存放有單字節(jié)的帶符號數(shù)。要求將其中的正數(shù)存入50H開始的連續(xù)單元中,負(fù)數(shù)存入60H開始的連續(xù)單元中,并將正數(shù)、負(fù)數(shù)和零的個數(shù)分別存入70H、71H、72H單元中。,例 4.4,1)帶符號數(shù)的最高位為符號位,可通過最高位判斷正負(fù): “0”表示正數(shù),“1”表示負(fù)數(shù)。 2)程序中需要從40H單元開始取源數(shù),存正數(shù)和負(fù)數(shù),故需要三個地址指針來指向?qū)?yīng)的內(nèi)存單元;設(shè)對應(yīng)的地址指針分別為R0、R1和R2,由于R2不能用間接尋址方式,故R2需要同R1或

6、R0進(jìn)行交換后,才能進(jìn)行負(fù)數(shù)的存放。,分析,圖4.3 程序流程圖,參考程序: ORG 1000H CLR A MOV 70H,A ;存放正數(shù)的個數(shù)單元清0 MOV 71H,A ;存放負(fù)數(shù)的個數(shù)單元清0 MOV 72H,A ;存放零的個數(shù)單元清0 MOV R3,#10H ;設(shè)循環(huán)計數(shù)器初值 MOV R0,#40H ;設(shè)源數(shù)地址指針 MOV R1,#50H ;設(shè)正數(shù)地址指針 MOV R2,#60H ;設(shè)負(fù)數(shù)地址指針,LOOP:MOV A,R0 ;取源數(shù) JZ ZERO ;源數(shù)為0,轉(zhuǎn)ZER0 JNB ACC.7,POSI ;源數(shù)為正,轉(zhuǎn)POSI INC 71H ;負(fù)數(shù)個數(shù)加1 MOV R4,A ;

7、暫存原數(shù) MOV A,R2 XCH A,R1 ;R1與R2中的內(nèi)容交換 XCH A,R4 MOV R1,A ;存負(fù)數(shù) XCH A,R4 XCH A,R1 ;R1與R2中的內(nèi)容交換 INC R2 ;調(diào)整負(fù)數(shù)地址指針 SJMP LOOP1 ;轉(zhuǎn)循壞控制,POSI: INC 70H;正數(shù)個數(shù)加1 MOV R1,A ;存正數(shù) INC R1 ;調(diào)整正數(shù)地址指針 SJMP LOOP1 ZERO: INC 72H ;零的個數(shù)加1 LOOP1:INC R0 ;調(diào)整源數(shù)地址指針 DJNZ R3,LOOP ;未送完,繼續(xù) SJMP $ ;等待 END ;結(jié)束,查表就是把事先計算或測得的數(shù)據(jù)按照一定的順序編制成表格

8、存放在存儲器中,然后根據(jù)輸入的數(shù)據(jù),從表格中查出所需的結(jié)果。,4. 查表程序設(shè)計,片內(nèi)RAM的EGA單元中有一個大寫的英文字母,要求將此字母在英文字母表中的位置送入片內(nèi)的COUNT單元中,如EGA單元中字母為I時,則COUNT單元中需送入數(shù)字9。,例 4.6,如果將26個英文字母按照順序編成一個表,通過查表法得到一個字母與EGA單元中的字母比較,若不相等再查,同時記錄查表的次數(shù)。查完后,將記錄次數(shù)送COUNT單元。,分析,參考程序 ORG 1000H EGA EQU 50H COUNT EQU 60H MOV COUNT,#00H MOV A, #16 ;調(diào)整地址 LOOP: PUSH A M

9、OVC A, A+PC ;查表 CJNZ A, EGA, NF ;所查字母與EGA中字母比較 SJMP LAST ;相等轉(zhuǎn)LAST NF: POP A INC A ;調(diào)整地址 INC COUNT ;記數(shù)值加1 SJMP LOOP ;繼續(xù)查 LAST: INC COUNT ;記數(shù)值加1 SJMP $ ;等待 ALPT: DBA,B,Y,Z END ;結(jié)束,編寫子程序時應(yīng)注意: a.子程序的第一條指令之前必須有標(biāo)號; b.子程序中需要保護(hù)現(xiàn)場; c.主程序和子程序之間的參數(shù)傳遞。,5. 子程序設(shè)計,已知片內(nèi)BLOCKB單元開始處有一數(shù)據(jù)塊,塊長在R2中,在此數(shù)據(jù)塊的每個單元中存放有一個未組合的BC

10、D碼,要求將每個BCD碼轉(zhuǎn)換為ASCAII碼,并存放在片內(nèi)BLOCKA開始的連續(xù)單元中。,例4.8 BCD碼轉(zhuǎn)換為ASCAII碼,將一位BCD碼轉(zhuǎn)換為ASCAII碼的子程序: TRANS:MOV A,R0 ;取BCD碼 ADD A, #30H MOV R1,A ;送ASCAII碼 INC R0 INC R1 RET ;返回,分析:將一位BCD碼轉(zhuǎn)換為相應(yīng)的ASCAII碼只需加上30H即可。,主程序: ORG 1000H MOV R2,#L MOV R0,#BLOCKB;設(shè)BCD碼的地址指針 MOV R1,#BLOCKA;設(shè)ASCAII的地址指針 LOOP:ACALL TRANS ;調(diào)用TRAN

11、S子程序 DJNZ R2,LOOP ;未轉(zhuǎn)換完,繼續(xù) SJMP $ ;等待 END ;結(jié)束,設(shè)片內(nèi)40H單元中有一組合的BCD碼,要求將其轉(zhuǎn)換為二進(jìn)制數(shù)存回原處。 分析: 1)組合的BCD碼為兩位十進(jìn)制數(shù),需將十位 數(shù)和個位數(shù)分開處理。 2)十位數(shù)轉(zhuǎn)換時只要累加0AH就能將其轉(zhuǎn)換 為相應(yīng)的二進(jìn)制數(shù),然后再將個位數(shù)直接 加到轉(zhuǎn)換后的十位數(shù)上就可完成整個數(shù)的 轉(zhuǎn)換。,例4.9 BCD碼轉(zhuǎn)換為二進(jìn)制數(shù),參考程序 ORG 1000 BCDTOB: MOV A,40H ANL A,#F0H;取十位數(shù) SWAP A ;將十位數(shù)換到低4位 JZ DONE ;十位數(shù)為0,返回 MOV R3,#00H ;累加和

12、寄存器清0 LOOP: DEC A ACALL ADD0AH ;調(diào)用加10子程序 JNZ LOOP ;未加完繼續(xù) MOV A,40H ANL A,#0FH ;取個位數(shù) ADD A,R3 ;與十位相加 MOV 40H,A ;轉(zhuǎn)換完,存結(jié)果 DONE: RET ;(書上此處有錯),加10子程序:,已知片內(nèi)RAM ADR1開始的單元依次從低位到高位存放有L個字節(jié)的無符號數(shù),片外RAM ADR2開始的單元也依次從低位到高位存放有L個字節(jié)的無符號數(shù)。請編一個加法程序,將他們的和存放在ADR1開始的連續(xù)單元中。,2) 算術(shù)運算子程序,例4.11 多字節(jié)無符號數(shù)相加,程序流程框圖:,參考程序,ORG 1000H NSADD: MOV R0,#ADDR1;設(shè)被加數(shù)的地址指針 MOV DPTR,#ADDR2 ;設(shè)加數(shù)的地址指針 MOV R2,#L ;設(shè)循環(huán)計數(shù)器初值 CLR C LOOP: MOVX A,DPTR ;取加數(shù) ADDC A, R0 ;兩數(shù)相加 MOV R0, A ;存和 INC R0 ;調(diào)整被加數(shù)地址指針 INC DPTR ;調(diào)整加數(shù)地址指針 DJNZ R2, LOOP ;未加完,繼續(xù) RET ;返回

溫馨提示

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

評論

0/150

提交評論