第4章 MCS-51系列單片機的程序設計_第1頁
第4章 MCS-51系列單片機的程序設計_第2頁
第4章 MCS-51系列單片機的程序設計_第3頁
第4章 MCS-51系列單片機的程序設計_第4頁
第4章 MCS-51系列單片機的程序設計_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、MCS-51系列單片機的程序設計,第四章,交叉匯編語言MASM51,單片機匯編語言程序設計方法及技巧,了解交叉匯編語言MASM51的特點,掌握順序程序、分支程序、循環(huán)程序、查表程序、子程序的基本設計方法和技巧,掌握匯編語言程序設計的一般步驟,4.1交叉匯編語言MASM51,匯編語言源程序是由匯編指令和偽指令組成的文件,其擴展名為“ASM”。,1)人工匯編人工匯編是通過人工查出源程序中所有匯編指令的機器碼,并依次將機器碼輸入單片機中,使之成為單片機能直接執(zhí)行的目標程序。,2)機器匯編機器匯編是指在計算機上通過匯編程序?qū)υ闯绦蜻M行匯編,即從源程序到目標程序的轉(zhuǎn)換過程是由計算機上的匯編程序自動完成的

2、。,3)交叉匯編是指用一種計算機上的匯編程序去匯編另一種計算機的源程序,為另一種計算機產(chǎn)生目標程序。,單片機MCS-51匯編語言程序設計步驟:1分析問題2確定算法3設計程序流程圖4分配內(nèi)存單元5編寫匯編語言源程序6調(diào)試程序,4.2程序設計方法及技巧,4.2.1順序程序設計,分析:應注意片內(nèi)和片外的尋址指令不同,ORG1000HMOVR0,#68HMOVA,R0;片內(nèi)RAM104單元內(nèi)容送累加器MOVDPTR,#0104HMOVXDPTR,A;完成片內(nèi)RAM104單元內(nèi)容送片;外104H單元中INCR0MOVA,R0;片內(nèi)RAM105單元內(nèi)容送累加器INCDPTRMOVXDPTR,A;完成片內(nèi)R

3、AM105單元內(nèi)容送片;外105H單元中SJMP$END,1.簡單分支程序,4.2.2分支程序設計,圖4.1簡單分支程序轉(zhuǎn)移,分析:只要將兩數(shù)進行比較,用比較的結(jié)果作為分支轉(zhuǎn)移的條件就很容易地找出其中的大數(shù)。,ORG1000HCLRCMOVR0,#FIRST;第一個數(shù)地址送R0中MOVA,R0;取第一個數(shù)INCR0;R0指向第二個數(shù)地址SUBBA,R0;兩數(shù)比較JCBIG;第二個數(shù)大轉(zhuǎn)BIGDECR0;R0指向第一個數(shù)地址BIG:MOVSECOND,R0;存大數(shù)SJMP$END,參考程序,2)多路分支程序(散轉(zhuǎn)程序),圖4.2多路分支程序轉(zhuǎn)移,1)把AJMP或LJMP指令組成一個分支程序的轉(zhuǎn)移

4、表,表的首地址放入DPTR中;2)調(diào)整后的出口信息放入累加器A中;3)執(zhí)行JMPA+DPTR轉(zhuǎn)向?qū)姆种С绦颉?可通過間接轉(zhuǎn)移指令JMPA+DPTR和無條件轉(zhuǎn)移指令中的AJMP或LJMP指令來實現(xiàn)多路分支轉(zhuǎn)移:,例4.3,已知R0中存放有一數(shù)字關鍵碼,要求根據(jù)碼值的不同,分別轉(zhuǎn)向?qū)拇a值程序段去執(zhí)行。即當R0=K時,便執(zhí)行CODEK程序。,ORG1000HMOVDPTR,#TAB;表首址送DPTRMOVA,R0;取數(shù)字關鍵碼ADDA,R0;每條AJMP指令占用兩個字;節(jié),將關鍵碼乘以2JNCLESS;關鍵碼小于128轉(zhuǎn)LESSINCDPHLESS:JMPA+DPTRTAB:AJMPCODE

5、0;關鍵碼為0,轉(zhuǎn)CODE0執(zhí)行AJMPCODE1;關鍵碼為1,轉(zhuǎn)CODE1執(zhí)行AJMPCODE255;關鍵碼為255,轉(zhuǎn)CODE255;執(zhí)行,AJMP指令的轉(zhuǎn)移范圍不超出所在的2KB字節(jié)區(qū)間,如各小段程序較長,在2KB字節(jié)內(nèi)無法全部容納,上面的程序應該怎樣修改?,思考,1)循環(huán)初始化設置循環(huán)的初始狀態(tài),位于循環(huán)程序的開頭位置2)循環(huán)處理循環(huán)程序的主體部分,是通過反復執(zhí)行來完成數(shù)據(jù)的具體處理,它位于循環(huán)體內(nèi)。,4.2.3循環(huán)程序設計,循環(huán)程序由4部分組成:,3)循環(huán)控制也在循環(huán)體內(nèi),是用于控制循環(huán)的繼續(xù)與否。4)循環(huán)結(jié)束通常位于循環(huán)體后,是用來存放循環(huán)處理的最終結(jié)果及恢復各寄存器與工作單元的原

6、始值。,設MCS-51單片機內(nèi)部RAM從40H開始的連續(xù)16個單元中,每個單元中分別存放有單字節(jié)的帶符號數(shù)。要求將其中的正數(shù)存入50H開始的連續(xù)單元中,負數(shù)存入60H開始的連續(xù)單元中,并將正數(shù)、負數(shù)和零的個數(shù)分別存入70H、71H、72H單元中。,例4.4,1)帶符號數(shù)的最高位為符號位,可通過最高位來判斷正負。2)程序中需要分別從40H、50H和60H單元開始取源數(shù)、存放正數(shù)和負數(shù),故需要三個地址指針來指向?qū)膬?nèi)存單元;設對應的地址指針分別為R0、R1和R2,由于R2不能用間接尋址方式,故R2需要同R1或R0進行交換后,才能進行負數(shù)的存放。,分析,圖4.3程序流程圖,參考程序:ORG1000

7、HCLRAMOV70H,A;存放正數(shù)的個數(shù)單元清0MOV71H,A;存放負數(shù)的個數(shù)單元清0MOV72H,A;存放零的個數(shù)單元清0MOVR3,#10H;設循環(huán)計數(shù)器初值MOVR0,#40H;設源數(shù)地址指針MOVR1,#50H;設正數(shù)地址指針MOVR2,#60H;設負數(shù)地址指針,LOOP:MOVA,R0;取源數(shù)JZZERO;源數(shù)為0,轉(zhuǎn)ZER0JNBACC.7,POSI;源數(shù)為正,轉(zhuǎn)POSIINC71H;負數(shù)個數(shù)加1MOVR4,A;暫存源數(shù)MOVA,R2XCHA,R1;R1與R2中的內(nèi)容交換XCHA,R4MOVR1,A;存負數(shù)XCHA,R4XCHA,R1;R1與R2中的內(nèi)容交換INCR2;調(diào)整負數(shù)

8、地址指針SJMPLOOP1;轉(zhuǎn)循壞控制,POSI:INC70H;正數(shù)個數(shù)加1MOVR1,A;存正數(shù)INCR1;調(diào)整正數(shù)地址指針SJMPLOOP1ZERO:INC72H;零的個數(shù)加1LOOP1:INCR0;調(diào)整源數(shù)地址指針DJNZR3,LOOP;未送完,繼續(xù)SJMP$END,查表就是把事先計算或測得的數(shù)據(jù)按照一定的順序編制成表格存放在存儲器中,然后根據(jù)輸入的數(shù)據(jù),從表格中查出所需的結(jié)果。,4.2.4查表程序設計,片內(nèi)RAM的EGA單元中有一個大寫的英文字母,要求將此字母在英文字母表中的位置送入片內(nèi)的COUNT單元中,如EGA單元中字母為I時,則COUNT單元中需送入數(shù)字9。,例4.6,如果將26

9、個英文字母按照順序編成一個表,通過查表法得到一個字母與EGA單元中的字母比較,若不相等再查,同時記錄查表的次數(shù)。查完后,將記錄次數(shù)送COUNT單元。,分析,ORG1000HEGAEQU50HCOUNTEQU60HMOVCOUNT,#00HMOVA,#16;調(diào)整地址LOOP:PUSHAMOVCA,A+PC;查表CJNZA,EGA,NF;所查字母與EGA中字母比較SJMPLAST;相等則轉(zhuǎn)到LASTNF:POPAINCA;調(diào)整地址INCCOUNT;記數(shù)值加1SJMPLOOP;繼續(xù)查LAST:INCCOUNT;記數(shù)值加1SJMP$;等待ALPT:DBA,B,Y,Z,求y=n!(n=0,1,9),已知

10、n的值在片內(nèi)RAM的NUM單元中,求得的y值用BCD碼表示且存放到片內(nèi)GETY開始的單元中。,例4.6,分析:可將函數(shù)值列成表,采用查表法求y=n!當n=9時,y=362880H,需要三個單元存放結(jié)果。設每個n對應的y值都用3個單元來存放,則y值在表格中的首地址的計算公式為:y地址=函數(shù)表首址+n*3,參考程序ORG1000HNUMEQU50HGETYEQU60HMOVR1,#03HMOVR0,#GETYMOVA,NUM;取n值MOVB,#03HMULAB;n*3MOVR2,A;暫存MOVDPTR,#TAB;表的首地址送DPTR中,LOOP:MOVCA,A+DPTR;查表MOVR0,A;存結(jié)果

11、INCR0;調(diào)整存放結(jié)果地址指針I(yè)NCDPTR;修正表地址指針MOVA,R2;恢復n*3DJNZR1,LOOP;未查完,繼續(xù)SJMP$TAB:DB01H,00H,00H,01H,00H,00HDB02H,00H,00H,06H,00H,00HDB24H,00H,00H,20H,01H,00HDB20H,07H,00H,40H,50H,00HDB20H,03H,04H,80H,28H,36H,編寫子程序時應注意:a.子程序的第一條指令之前必須有標號;b.子程序中需要保護現(xiàn)場;c.主程序和子程序之間的參數(shù)傳遞。,4.2.5子程序設計,1)數(shù)碼轉(zhuǎn)換子程序,例4.7二進制碼轉(zhuǎn)換為ASCII碼,二進制數(shù)

12、與ASCII碼的對應關系:四位二進制ASCII0000(0)30H0001(1)31H1001(9)39H1010(A)41H1111(F)46H,ORG1000BTOASC:PUSHAPUSHPSWMOVA,R0ANLA,#0FH;取四位二進制數(shù)MOVR0,A;暫存CLRCSUBBA,#0AH;與10比較MOVA,R0;恢復四位二進制數(shù)JCLOOP;小于10轉(zhuǎn)LOOPADDA,#07H;大于10先加07HLOOP:ADDA,#30H;加30HMOVR0,A;存結(jié)果POPPSWPOPARET,已知片內(nèi)BLOCKB單元開始處有一數(shù)據(jù)塊,塊長在R2中,在此數(shù)據(jù)塊的每個單元中存放有一個未組合的BCD

13、碼,要求將每個BCD碼轉(zhuǎn)換為ASCAII碼,并存放在片內(nèi)BLOCKA開始的連續(xù)單元中。,例4.8BCD碼轉(zhuǎn)換為ASCAII碼,主程序:ORG1000HMOVR2,#LMOVR0,#BLOCKB;設BCD碼的地址指針MOVR1,#BLOCKA;設ASCAII的地址指針LOOP:ACALLTRANS;調(diào)用TRANS子程序DJNZR2,LOOP;未轉(zhuǎn)換完,繼續(xù)SJMP$,將一位BCD碼轉(zhuǎn)換為ASCAII碼的子程序:TRANS:MOVA,R0;取BCD碼ADDA,#30HMOVR1,A;送ASCAII碼INCR0INCR1RET;返回,分析:將一位BCD碼轉(zhuǎn)換為相應的ASCAII碼只需加上30H即可。

14、,設片內(nèi)40H單元中有一組合的BCD碼,要求將其轉(zhuǎn)換為二進制數(shù)存回原處。分析:1)組合的BCD碼為兩位十進制數(shù),需將十位數(shù)和個位數(shù)分開處理。2)十位數(shù)轉(zhuǎn)換時只要累加0AH就能將其轉(zhuǎn)換為相應的二進制數(shù),然后再將個位數(shù)直接加到轉(zhuǎn)換后的十位數(shù)上就可完成整個數(shù)的轉(zhuǎn)換。,例4.9BCD碼轉(zhuǎn)換為二進制數(shù),ORG1000HBCDTOB:MOVA,40HANLA,#F0H;取十位數(shù)SWAPA;將十位數(shù)換到低4位JZDONE;十位數(shù)為0,返回MOVR3,#00H;累加和寄存器清0LOOP:DECAACALLADD0AH;調(diào)用加10子程序JNZLOOP;未加完繼續(xù)MOVA,40HANLA,#0FH;取個位數(shù)ADD

15、A,R3;與十位相加MOV40H,A;轉(zhuǎn)換完,存結(jié)果DONE:RET;(書上此處有錯),加10子程序:,已知8位二進制數(shù)在R0中,要求將其轉(zhuǎn)換為BCD碼并存放在片內(nèi)30H、31H單元中。,分析:8位二進制數(shù)轉(zhuǎn)換成3位BCD碼數(shù),用壓縮BCD碼存放,百位數(shù)放31H單元,十位、個位數(shù)放30H單元。,例4.10二進制數(shù)轉(zhuǎn)換為BCD碼,程序流程圖為:,ORG1000HBTOBCD:MOVA,R0;取二進制數(shù)MOVB,#100DIVAB;除以100MOVR1,#31HMOVR1,A;百位的BCD碼數(shù)存31H單元DECR1XCHA,B;二進制數(shù)除以100的余數(shù)送累加器中MOVB,#10DIVAB;除以10

16、SWAPAADDA,B;十位與個位的BCD碼進行組合MOVR1,A;組合的BCD碼送30H中RET,已知片內(nèi)RAMADR1開始的單元依次從低位到高位存放有L個字節(jié)的無符號數(shù),片外RAMADR2開始的單元也依次從低位到高位存放有L個字節(jié)的無符號數(shù)。請編一個加法程序,將他們的和存放在ADR1開始的連續(xù)單元中。,2)算術運算子程序,例4.11多字節(jié)無符號數(shù)相加,程序流程框圖:,ORG1000HNSADD:MOVR0,#ADDR1;設被加數(shù)的地址指針MOVDPTR,#ADDR2;設加數(shù)的地址指針MOVR2,#L;設循環(huán)計數(shù)器初值CLRCLOOP:MOVXA,DPTR;取加數(shù)ADDCA,R0;兩數(shù)相加M

17、OVR0,A;存和INCR0;調(diào)整被加數(shù)地址指針I(yè)NCDPTR;調(diào)整加數(shù)地址指針DJNZR2,LOOP;未加完,繼續(xù)RET;返回,已知被乘數(shù)和乘數(shù)分別為雙字節(jié)的無符號數(shù),被乘數(shù)的高字節(jié)和低字節(jié)分別存放在R7和R6中,乘數(shù)的高字節(jié)和低字節(jié)分別存放在R5和R4中。要求乘積存放在片內(nèi)RAM以ADR開始的單元中。分析:由于只有單字節(jié)乘法指令,雙字節(jié)的乘法需要分作4次乘法運算才能實現(xiàn)。,例4.15兩雙字節(jié)無符號數(shù)相乘,ORG1000HMUL1:MOV40H,#00H;統(tǒng)計bdH+adL+bcL;的進位單元清0MOV41H,#00H;統(tǒng)計adH+bcH+acL;的進位單元清0MOVR0,#50H;積的首地

18、址送R0中MOVA,R6;b送AMOVB,R4;d送BMULAB;bdMOVR0,A;bdL送50H單元中MOVR1,B;bdH送R1中,MOVA,R7;a送AMOVB,R4;d送BMULAB;adMOVR2,A;adL送R2中MOVR3,B;adH送R3中MOVA,R6;b送AMOVB,R5;c送BMULAB;bcADDA,R2;bcL+adLJNCNEXT1INC40H;統(tǒng)計進位NEXT1:ADDA,R1;bcL+adL+bdHJNCNEXT2INC40H;統(tǒng)計進位NEXT2:INCR0MOVR0,A;存bcL+adL+bdH結(jié)果于51H單元,MOVR1,B;bcH存R1中MOVA,R7;a送AMOVB,R5;c送BMULAB;acADDA,40H;acL加低位進位JNCNEXT3;無進位轉(zhuǎn)NEXT3INC41H;統(tǒng)計進位NEXT3:ADDA,R1;acL+bcHJNCNEXT4;無進位轉(zhuǎn)NEXT4INC41H;統(tǒng)計acL+bcH進位NEXT4:ADDA,R3;acL+bc

溫馨提示

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

最新文檔

評論

0/150

提交評論