《單片機(jī)匯編語言程序設(shè)計(jì)_一天天學(xué)習(xí)》由會員分享,可在線閱讀,更多相關(guān)《單片機(jī)匯編語言程序設(shè)計(jì)_一天天學(xué)習(xí)(42頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,*,1,第四章,匯編語言程序設(shè)計(jì),通過前面的學(xué)習(xí),我們已經(jīng)了解了單片機(jī)內(nèi)部的結(jié)構(gòu),,MCS-51,指令系統(tǒng)的尋址方式、各類指令的格式及功能。,下面我們就是要如何利用,MCS-51,的指令系統(tǒng),來編寫高效、充分利用其特點(diǎn)的程序。,2,4.1,概述,4.1.1,程序設(shè)計(jì)語言,1.機(jī)器語言,在單片機(jī)中,用二進(jìn)制代碼 表示的指令、數(shù)字和符號簡稱為機(jī)器語言。直接用機(jī)器語言編寫的程序稱為機(jī)器語言程序。,缺點(diǎn):程序不易看懂,不便于記憶,容易出錯(cuò)。,目前,用于程序設(shè)計(jì)的語言基本上分為三種:,3,2.匯編語言,用助記符表示的
2、指令稱為符號語言或匯編語言。,匯編語言程序,(,源程序,),需要,“,匯編,”,(,由專門的匯編程序完成,),才能轉(zhuǎn)換成機(jī)器語言。得到的機(jī)器語言程序稱為目標(biāo)程序。,特點(diǎn):,是面向機(jī)器的語言,必須對硬件有一定的了解。,助記符指令和機(jī)器指令一一對應(yīng)。,能直接管理和控制硬件設(shè)備(功能部件)。,程序設(shè)計(jì)語言,4,3.,高級語言,高級語言不受具體機(jī)器的限制,都是參照一些數(shù)學(xué)語言而設(shè)計(jì)的,使用了許多數(shù)學(xué)公式和數(shù)學(xué)計(jì)算上的習(xí)慣用語,非常擅長于科學(xué)計(jì)算。,常用的高級語言,如,BASIC,、,FORTRAN,、,C,語言等。,特點(diǎn):,通用性強(qiáng),直觀、易懂、易學(xué)、可讀性好。,計(jì)算機(jī)不能直接識別和執(zhí)行。(需要進(jìn)行編
3、譯),發(fā)展很快。,5,4.1.2,編制程序的步驟,1.,任務(wù)分析(硬件、軟件系統(tǒng)分析),2.,確定算法和工作步驟;,3.程序總體設(shè)計(jì)和流程圖繪制,關(guān)于流程圖符號:,開始、結(jié)束,-,圓角矩形,工作任務(wù),-,矩形,判斷分支,-,菱形,程序流向,-,程序連接,-,開始,結(jié)束,6,4.分配內(nèi)存,確定程序與數(shù)據(jù)區(qū)存放地址;,5.編寫源程序;,6.調(diào)試、修改,最終確定程序。,4.1.2,編制程序的步驟,7,4.1.3,方法技巧,模塊化設(shè)計(jì)(按功能分:顯示、打印、輸,入、發(fā)送等),2.盡量采用循環(huán)及子程序結(jié)構(gòu)(節(jié)省內(nèi)存),8,4.1.4,匯編語言的規(guī)范,匯編語言源程序由以下兩種指令構(gòu)成:,匯編語句(指令語句
4、),偽指令(指示性語句),匯編語句的格式:,標(biāo)號:操作碼操作數(shù);注釋,數(shù)據(jù)表示形式:,二進(jìn)制(,B,)、十六進(jìn)制,(H),、十進(jìn)制,(D,或省略,),、,ASCII,碼(以單引號標(biāo)識),9,控制匯編用的特殊指令,這些指令不屬于指令系統(tǒng),不產(chǎn)生機(jī)器代碼。,通過使用偽指令向匯編程序發(fā)出指示信息,告訴它如何完成匯編工作。,偽指令具有控制匯編程序的輸入輸出、定義數(shù)據(jù)和符號、條件匯編、分配存儲空間等功能。,偽指令,10,常用的偽指令,ORG,(Origin),定位目的程序的起始地址。,格式:,ORG,表達(dá)式,如:,ORG 0000H,注:表達(dá)式必須為,16,位地址值。,END,匯編語言程序結(jié)束偽指令。,
5、注:一定放在程序末尾!,11,EQU,(,EQU,ate,),賦值偽指令。,格式:,字符名稱,EQU,數(shù)值或匯編符號,例:,AAEQU30H,K1EQU40H,MOV A,AA;(,30H,),A,MOV A,K1;,(,40H,),A,常用的偽指令,12,DB,(,D,efine,B,yte,),從指定單元開始定義(存儲)若干個(gè)字節(jié)的數(shù)據(jù)或,ASCII,碼字符,常用于定義數(shù)據(jù)常數(shù)表。,格式:,DB,字節(jié)常數(shù)或,ASCII,字符,例:,ORG 1000H,DB34H,0DEH,,“,A,”,,,“,B,”,DB0AH,0BH,20,常用的偽指令,13,常用的偽指令,DW,(,D,efine,W
6、,ord,),從指定單元開始定義(存儲)若干個(gè)字的數(shù)據(jù),或,ASCII,碼字符。,格式:,DW,字常數(shù),或,ASCII,字符,例:,ORG 2000H,DW1234H,,“,B,”,DW0AH,20,思考,:,(2000H),及其以后的地址單元中的內(nèi)容是多少?,14,常用的偽指令,BIT,位地址符號指令。,把位地址賦于規(guī)定的字符名稱。,格式,:,字符名稱,BIT,位地址,例:,ABCBITP1.1,QQBITP3.2,15,4.2,匯編語言程序編輯和匯編,1.編輯(源程序,以,.ASM,擴(kuò)展名存盤);,2.匯編(手工或機(jī)器匯編);,如:,MOV A,#88H;,機(jī)器碼,74 88,又如:,地址
7、 目標(biāo)碼 源程序,ORG 1000H,1000H 74 7F MOV A,#7FH,1002H 79 44 MOV R1,#44H,END,16,4.3,程序設(shè)計(jì)基礎(chǔ)與舉例,4.3.1,順序結(jié)構(gòu)程序,org 1000h,start:mov,dptr,#2000h,mov,a,20h,movc,a,a+dptr,mov,21h,a,sjmp,$,org 2000h,table:db,0,1,4,9,16,25,end,例,1,:,變量存在內(nèi)部,RAM,的,20H,單元中,其取值范圍:,0,5,,編成,查表法求其平方值,17,開始,表格首地址送,DPTR,變量送,A,(,20H,),A,查平方表,
8、(A+DPTR)A,結(jié)束,結(jié)果送,21H,單元,:A 21H,18,例,2,:將20,H,單元的壓縮(,Packed,),BCD,碼拆成兩個(gè),ACSII,碼存入21,H、22H,單元。,內(nèi)部,RAM,22H,21H,20H,6 9,3 6,3 9,BCD,0,1,2,.,9,ASCII,30H,31H,32H,.,39H,19,方法,1,(20,H),A,10,H,B,A/B,A,中為高4位,BCD,碼,,B,中為低4位,BCD,碼,B+30H,B,B,(21H),A+30H,A,A,(22H),開始,結(jié)束,20,周期數(shù) 源程序,ORG 2000H,MOV A,20H,MOV B,#10H,D
9、IV AB,ORL B,#30H,MOV 21H,B,ORL A,#30H,MOV 22H,A,END,1,2,4,2,2,1,1,13,;除以10,H,;,高4位,BCD,碼轉(zhuǎn)換位,ASCII,碼,;,低4位,BCD,碼轉(zhuǎn)換位,ASCII,碼,21,0,(2,1H),(20,H),A,A,與,(21H),的低4位交換,(21H)+30H,(21H),A,的高低半字節(jié)交換,A+30H,A,A,(22H),開始,結(jié)束,方法2:,22,ORG 2000H,MOV R0,#21H,MOV R0,#0,MOV A,20H,XCHD A,R0,ORL 21H,#30H,SWAP A,ORL A,#30H
10、,MOV 22H,A,END,;,清2,1H,單元,;,低4位,BCD,碼送,21H,單元,,;,低4位,BCD,碼轉(zhuǎn)換位,ASCII,碼,;高4位,BCD,碼轉(zhuǎn)換位,ASCII,碼,1,1,1,1,2,1,1,1,9,周期數(shù),源程序,23,4.3.2,分支程序,分支程序可根據(jù)要求,無條件,或,條件地,改變程序執(zhí)行流向。編寫分支程序主要在于正確使用,轉(zhuǎn)移指令,。分支程序有:單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)、多分支結(jié)構(gòu)(散轉(zhuǎn)),條件成立?,下條指令,程序段,A,單分支結(jié)構(gòu),Y,N,條件成立?,程序段,A,Y,N,程序段,A,雙分支結(jié)構(gòu),24,4.3.2,分支程序,分支程序可根據(jù)要求無條件或條件地改變程序執(zhí)
11、行流向。編寫分支程序主要在于正確使用轉(zhuǎn)移指令。分支程序有:單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)、多分支結(jié)構(gòu)(散轉(zhuǎn)),K=,?,程序段,n,n,0,程序段,1,多分支結(jié)構(gòu),程序段,0,1,25,例,1,:設(shè)變量,x,以補(bǔ)碼形式存放在片內(nèi),RAM 30H,單元中,變量,y,與,x,的關(guān)系是:,編程根據(jù),x,的值求,y,值并放回原單元。,26,A=,?,y=x+5,0,y=20H,y=x,0,取,x,即(,30h,),A,開始,存,y,即,y 20h,結(jié)束,27,ORG 1000H,START:MOV A,30H,JZ NEXT ;x=0,轉(zhuǎn)移,ANL A,#80H ;,保留符號位,JZ ED ;x0,轉(zhuǎn)移,MO
12、V A,#05H ;x0,不轉(zhuǎn)移,ADD A,30H,MOV 30H,A,SJMP ED,NEXT:MOV 30H,#20H,ED:SJMP$,28,START:MOV DPTR,#TAB,MOV A,R7,ADD A,R7 ;R7,2,A,MOV R3,A ;,暫存,R3,MOVC A,A+DPTR ;,取高位地址,XCH,A,R3,INC A,MOVC A,A+DPTR ;,取低位地址,MOV DPL,A,MOV DPH,R3 ;,轉(zhuǎn)移地址送入,DPTR,CLR A,JMP A+DPTR,TAB:DW P0,DW P1,DW PN,例,2,:,根據(jù),R7,的內(nèi)容,轉(zhuǎn)至對應(yīng)的分支程序。設(shè),R
13、7,的內(nèi)容為,0,N,,對應(yīng)的處理程序地址分別為,P0,P7,P0,高位,P0,低位,TAB,P1,高位,P1,低位,TAB+2,29,4.3.3,循環(huán)程序,循環(huán)程序一般由:,初始化部分,循環(huán)體部分,-,處理部分、修改部分、控制部分,結(jié)束部分,其結(jié)構(gòu)一般有兩種:,先進(jìn)入處理部分,再控制循環(huán),至少執(zhí)行一次循環(huán)體,先控制循環(huán),再進(jìn)入處理部分,循環(huán)體是否執(zhí)行,取決于判斷結(jié)果。,30,開始,設(shè)置循環(huán)初值,循環(huán)處理,循環(huán)修改,結(jié)束處理,結(jié)束,循環(huán)結(jié)束?,開始,設(shè)置循環(huán)初值,循環(huán)處理,循環(huán)修改,結(jié)束處理,結(jié)束,循環(huán)結(jié)束?,N,Y,Y,N,31,循環(huán)控制的一般方法:,循環(huán)次數(shù)已知,利用循環(huán)次數(shù)控制,循環(huán)次數(shù)
14、未知,利用關(guān)鍵字控制,利用“邏輯尺”,根據(jù)“邏輯尺”的內(nèi)容,進(jìn)行控制。,32,例,4-3-6,:,50ms,延時(shí)子程序。設(shè)晶振頻率為,12MHz,,則機(jī)器周期為,1us,。,DEL:MOV R7,#200 ;1MC,DEL1:MOV R6,#123 ;1MC,NOP ;1MC,DJNZ R6,$;2MC,DJNZ R7,DEL1 ;2MC,RET ;2MC,延時(shí)時(shí)間:,t=1+200(1+1+2*123)+2+2,50000us=50ms,33,例,4-3-8,:將內(nèi)部,RAM,中起始地址為,data,的數(shù)據(jù)串串送到外部,RAM,中起始地址為,buffer,的存儲區(qū)域中,直到發(fā)現(xiàn),$,字符,傳
15、送停止,-,循環(huán)次數(shù)事先不知道先判斷,后執(zhí)行。,MOV R0,#data,MOV,DPTR,#buffer,LOOP1:MOV A,R0,CJNE A,#24H,LOOP2 ;,判斷是否為字符,SJMP LOOP3 ;,是,轉(zhuǎn)結(jié)束,LOOP2:MOVX DPTR,A ;,不是,傳送數(shù)據(jù),INC R0,INC DPTR,SJMP LOOP1,;傳送下一數(shù)據(jù),LOOP3:END,34,4.3.4,子程序問題,子程序設(shè)計(jì)時(shí)注意事項(xiàng):,1.給子程序賦一個(gè)名字。實(shí)際為入口地址代號。,2.要能正確傳遞參數(shù):,入口條件:子程序中要處理的數(shù)據(jù)如何給予。,出口條件:子程序處理結(jié)果如何存放。,(寄存器、存儲器、堆
16、棧方式),3.保護(hù)與恢復(fù)現(xiàn)場:,保護(hù)現(xiàn)場:壓棧指令,PUSH,恢復(fù)現(xiàn)場:彈出指令,POP,4.,子程序可以嵌套,35,例,4-3-9,:利用查表法求平方和 ,設(shè),a,、,b,、,c,分別存于內(nèi)部,RAM,的,DA,、,DB,、,DC,三個(gè)單元中。,MOV A,DA ;,取,a,ACALL SQR ;,調(diào)用查表子程序,MOV R1,A ;a,的平方暫存,R1,中,MOV A,DB,;,取,b,ACALL SQR ;,調(diào)用查表子程序,ADD A,R1 ;,求出平方和暫存阿,A,中,MOV DC,A ;,結(jié)果存于,DC,中,SJMP$,SQR:MOV DPTR,#TAB ;,子程序,MOVC A,A+DPTR,RET,TAB:DB 0,1,4,9,16,25,36,49,64,81,END,利用累加器或寄存器傳遞參數(shù),36,4.3.5,碼型轉(zhuǎn)換程序的設(shè)計(jì),一、十六進(jìn)制數(shù)與,ASCCII,碼之間的轉(zhuǎn)換,(,對比,BCD,與,ASCCI,之間的轉(zhuǎn)換,4.3.1,中例,2,),表,4-1,十六進(jìn)制數(shù)與,ASCII,碼之間的關(guān)系,十 六,進(jìn)制數(shù),十 六,進(jìn)制數(shù),十 六,進(jìn)制數(shù),十 六,進(jìn)制數(shù),0,3