80C51單片機匯編語言程序設(shè)計谷風詳析
《80C51單片機匯編語言程序設(shè)計谷風詳析》由會員分享,可在線閱讀,更多相關(guān)《80C51單片機匯編語言程序設(shè)計谷風詳析(74頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第第4 4章章 80C5180C51單片機匯編語言程序設(shè)計單片機匯編語言程序設(shè)計4.1 單片機程序設(shè)計語言概述單片機程序設(shè)計語言概述4.2 匯編語言程序的基本結(jié)構(gòu)形式匯編語言程序的基本結(jié)構(gòu)形式4.3 80C51 單片機匯編語言程序設(shè)計舉例單片機匯編語言程序設(shè)計舉例4.4 單片機匯編語言源程序的編輯和匯編單片機匯編語言源程序的編輯和匯編4.5 80C51 單片機匯編語言偽指令單片機匯編語言偽指令1特制分析4.1 單片機程序設(shè)計語言概述單片機程序設(shè)計語言概述4.1.1 機器語言和匯編語言機器語言和匯編語言1、機器語言、機器語言 用二進制代碼用二進制代碼“0”和和“1”表示指令和數(shù)據(jù)的程序設(shè)計語表示
2、指令和數(shù)據(jù)的程序設(shè)計語言言, ,是計算機能直接識別并執(zhí)行的指令是計算機能直接識別并執(zhí)行的指令。 優(yōu)點:執(zhí)行速度快、占用內(nèi)存少。優(yōu)點:執(zhí)行速度快、占用內(nèi)存少。 缺點:識別難、記憶難。缺點:識別難、記憶難。2、匯編語言、匯編語言 用助記符和專門的語言規(guī)則表示指令的功能和特征。用助記符和專門的語言規(guī)則表示指令的功能和特征。優(yōu)點:助記符與機器指令一一對應(yīng)。比機器語言直觀、優(yōu)點:助記符與機器指令一一對應(yīng)。比機器語言直觀、 易懂、易記。非常適合于實時控制的需要。易懂、易記。非常適合于實時控制的需要。 缺點:難以記憶和使用,程序設(shè)計的技巧性較高,編程缺點:難以記憶和使用,程序設(shè)計的技巧性較高,編程 難度較大
3、。要求使用者必須精通單片機的硬件系難度較大。要求使用者必須精通單片機的硬件系 統(tǒng)和指令系統(tǒng)。缺乏通用性,程序不易移植。統(tǒng)和指令系統(tǒng)。缺乏通用性,程序不易移植。2特制分析4.1.2 單片機使用的高級語言單片機使用的高級語言n對于對于8051單片機,現(xiàn)有單片機,現(xiàn)有4種語言支持,即匯編、種語言支持,即匯編、PL/M、C和和BASIC。nC C語言最終得到廣泛應(yīng)用。語言最終得到廣泛應(yīng)用??梢源蟠筇岣邌纹瑱C應(yīng)用系統(tǒng)研制的開發(fā)效率。移可以大大提高單片機應(yīng)用系統(tǒng)研制的開發(fā)效率。移植性好。植性好。 高級語言的不足:生成的目標代碼較長,導致應(yīng)用程高級語言的不足:生成的目標代碼較長,導致應(yīng)用程序運行速度較慢。序
4、運行速度較慢。3特制分析4.1.3 80C51 單片機匯編語言的語句格式單片機匯編語言的語句格式80C5180C51匯編語言的語句格式如下:匯編語言的語句格式如下: : : ; ; 1. 標號標號是語句地址的標志符號,標號的幾點規(guī)定:是語句地址的標志符號,標號的幾點規(guī)定:18個個ASCII字符組成,第一個字符必須是字母。字符組成,第一個字符必須是字母。不能使用本匯編語言已經(jīng)定義的符號作為標號。不能使用本匯編語言已經(jīng)定義的符號作為標號。標號后面必須跟以冒號標號后面必須跟以冒號“:”。同一標號在一個程序中只能定義一次。同一標號在一個程序中只能定義一次。標號可有可無。標號可有可無。錯誤的標號錯誤的標
5、號 正確的標號正確的標號1BT : BT11BT : BT1BEGIN BEGIN : BEGIN BEGIN : TA+TB: TATB:TA+TB: TATB:ADD: ADD1:ADD: ADD1:4特制分析2. 2. 操作碼操作碼用于規(guī)定語句執(zhí)行的操作內(nèi)容,用指令助記符表示。用于規(guī)定語句執(zhí)行的操作內(nèi)容,用指令助記符表示。不能空缺。不能空缺。3. 3. 操作數(shù)操作數(shù)操作數(shù)用于為指令操作提供數(shù)據(jù)??梢允强瞻?,也可操作數(shù)用于為指令操作提供數(shù)據(jù)??梢允强瞻?,也可能有能有1313個操作數(shù),各操作數(shù)之間以逗號分隔。個操作數(shù),各操作數(shù)之間以逗號分隔。4. 4. 注釋注釋不屬于語句的功能部分,只是對語
6、句的解釋說明,以不屬于語句的功能部分,只是對語句的解釋說明,以“;”開頭。開頭。5. 5. 分界符(分隔符)分界符(分隔符)用于把語句中的各部分隔開,以便于區(qū)分。分界符包用于把語句中的各部分隔開,以便于區(qū)分。分界符包括空格、冒號、分號或逗號等符號。括空格、冒號、分號或逗號等符號。5特制分析4.2 匯編語言程序的基本結(jié)構(gòu)形式匯編語言程序的基本結(jié)構(gòu)形式 三種基本結(jié)構(gòu)形式:順序程序結(jié)構(gòu),分支程序結(jié)構(gòu),三種基本結(jié)構(gòu)形式:順序程序結(jié)構(gòu),分支程序結(jié)構(gòu),循環(huán)程序結(jié)構(gòu)。循環(huán)程序結(jié)構(gòu)。4.2.1 順序程序結(jié)構(gòu)順序程序結(jié)構(gòu)順序結(jié)構(gòu)程序是最簡單的程序結(jié)構(gòu)。程序既無分支、順序結(jié)構(gòu)程序是最簡單的程序結(jié)構(gòu)。程序既無分支、
7、循環(huán),也不調(diào)用子程序,程序執(zhí)行時一條接一條地循環(huán),也不調(diào)用子程序,程序執(zhí)行時一條接一條地按順序執(zhí)行指令。按順序執(zhí)行指令。6特制分析(1)分析任務(wù))分析任務(wù)(2)確定算法)確定算法(3)畫流程圖)畫流程圖(4)編寫程序)編寫程序(5)上機調(diào)試)上機調(diào)試 2、程序設(shè)計的一般步驟、程序設(shè)計的一般步驟 當接到程序設(shè)計的任務(wù)后,當接到程序設(shè)計的任務(wù)后,首先對任務(wù)進行詳盡的分析,首先對任務(wù)進行詳盡的分析,搞清楚已知的數(shù)據(jù)和想要得搞清楚已知的數(shù)據(jù)和想要得到的結(jié)果,程序應(yīng)該完成何到的結(jié)果,程序應(yīng)該完成何種的功能。明確在程序設(shè)計種的功能。明確在程序設(shè)計時應(yīng)該時應(yīng)該 “做什么做什么” 。根據(jù)實際問題的要求和指令系
8、根據(jù)實際問題的要求和指令系統(tǒng)的特點,確定解決問題的具統(tǒng)的特點,確定解決問題的具體步驟。根據(jù)任務(wù)要求,對不體步驟。根據(jù)任務(wù)要求,對不同的計算方法進行比較,選擇同的計算方法進行比較,選擇最適宜的算法。解決最適宜的算法。解決“怎樣做怎樣做”的問題。的問題。將解決問題的具體步驟用一種將解決問題的具體步驟用一種約定的幾何圖形、指向線和必約定的幾何圖形、指向線和必要的文字說明描述出來,要的文字說明描述出來,用圖用圖形的方法描繪解決問題的思路。形的方法描繪解決問題的思路。用用指令指令的形式的形式將程序流程圖將程序流程圖實現(xiàn)出來。實現(xiàn)出來。查錯、改錯,查錯、改錯,對程序進行對程序進行優(yōu)化。優(yōu)化。7特制分析 5
9、0H 51H 52H53H54H55HN1高字節(jié)高字節(jié)N1中字節(jié)中字節(jié)N1低字節(jié)低字節(jié)N2高字節(jié)高字節(jié)N2中字節(jié)中字節(jié)N2低字節(jié)低字節(jié)(1)分析任務(wù))分析任務(wù)(2)確定算法)確定算法(3)畫流程圖)畫流程圖(4)編寫程序)編寫程序(5)上機調(diào)試)上機調(diào)試例:例:3字節(jié)無符號數(shù)相加:其中被加數(shù)在內(nèi)部字節(jié)無符號數(shù)相加:其中被加數(shù)在內(nèi)部RAM的的50H、51H和和52H單元中;加數(shù)在內(nèi)部單元中;加數(shù)在內(nèi)部RAM的的53H、54H和和55H單元單元中;要求把相加之和存放在中;要求把相加之和存放在50H、51H和和52H單元中,進位存單元中,進位存放在位尋址區(qū)的放在位尋址區(qū)的20H位中。位中。8特制分析
10、MOV R0, #52H;被加數(shù)的低字節(jié)地址被加數(shù)的低字節(jié)地址MOV R1, #55H;加數(shù)的低字節(jié)地址加數(shù)的低字節(jié)地址MOV A, R0ADD A, R1 ;低字節(jié)相加低字節(jié)相加MOV R0, A ;存低字節(jié)相加結(jié)果存低字節(jié)相加結(jié)果DEC R0DEC R1MOV A, R0ADDC A, R1;中間字節(jié)帶進位相加中間字節(jié)帶進位相加MOV R0, A ;存中間字節(jié)相加結(jié)果存中間字節(jié)相加結(jié)果DEC R0DEC R1MOV A, R0ADDC A, R1;高字節(jié)帶進位相加高字節(jié)帶進位相加MOV R0, A ;存高字節(jié)相加結(jié)果存高字節(jié)相加結(jié)果CLR AADDC A, #00H;進位送進位送00H位保
11、存位保存MOV R0, #20H;存放進位的單元地址存放進位的單元地址MOV R0, A9特制分析 分支結(jié)構(gòu)也稱為選擇結(jié)構(gòu)。為分支需要,程序設(shè)計時分支結(jié)構(gòu)也稱為選擇結(jié)構(gòu)。為分支需要,程序設(shè)計時應(yīng)給程序段的起始地址賦予一個地址標號,以供選擇分支應(yīng)給程序段的起始地址賦予一個地址標號,以供選擇分支使用。分支結(jié)構(gòu)又可分為單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。使用。分支結(jié)構(gòu)又可分為單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。 1. 單分支程序結(jié)構(gòu)單分支程序結(jié)構(gòu) 單分支程序結(jié)構(gòu)即二中選一,是通過條件判斷實現(xiàn)單分支程序結(jié)構(gòu)即二中選一,是通過條件判斷實現(xiàn)的。一般都的。一般都使用條件轉(zhuǎn)移指令使用條件轉(zhuǎn)移指令對程序的執(zhí)行結(jié)果進行判對程序的執(zhí)行結(jié)果
12、進行判斷。斷。 可實現(xiàn)單分支轉(zhuǎn)移的指令有:可實現(xiàn)單分支轉(zhuǎn)移的指令有:JZ、JNZ、CJNE和和DJNZ。位狀態(tài)轉(zhuǎn)移指令:。位狀態(tài)轉(zhuǎn)移指令:JC、JNC、JB、JNB和和JBC等。等。4.2.2 分支程序結(jié)構(gòu)分支程序結(jié)構(gòu)10特制分析(1)單分支結(jié)構(gòu)舉例)單分支結(jié)構(gòu)舉例 假定在外部假定在外部RAM中有中有ST1、ST2和和ST3共共3個連續(xù)個連續(xù)單元,其中單元,其中ST1和和ST2單元中存放著兩個無符號二進制單元中存放著兩個無符號二進制數(shù),要求找出其中的大數(shù)并存入數(shù),要求找出其中的大數(shù)并存入ST3單元中。單元中。解解:(:(1 1)分析任務(wù):比較兩個數(shù)的大?。┓治鋈蝿?wù):比較兩個數(shù)的大小 (2 2)
13、算法:算術(shù)運算、控制轉(zhuǎn)移)算法:算術(shù)運算、控制轉(zhuǎn)移 (3 3)程序結(jié)構(gòu):單分支)程序結(jié)構(gòu):單分支 (4 4)數(shù)據(jù)類型:單字節(jié)、二進制、無符號數(shù))數(shù)據(jù)類型:單字節(jié)、二進制、無符號數(shù) (5 5)數(shù)據(jù)結(jié)構(gòu):單元地址升序排列)數(shù)據(jù)結(jié)構(gòu):單元地址升序排列 (6 6)RAMRAM單元安排單元安排:外部:外部RAMRAM單元單元 (7 7)采用寄存器間接尋址方式()采用寄存器間接尋址方式(R0R0、R1R1或或DPTRDPTR) (8 8)程序設(shè)計流程框圖程序設(shè)計流程框圖; (9 9)程序清單程序清單;11特制分析開開 始始設(shè)設(shè) 置置 數(shù)數(shù) 據(jù)據(jù) 指指 針針取取 數(shù)數(shù) 據(jù)據(jù) N N2 2取取 數(shù)數(shù) 據(jù)據(jù) N
14、 N1 1并并 暫暫 存存結(jié)結(jié) 束束N N1 1保保 存存 于于 A A中中N N2 2 N N1 1修修 改改 數(shù)數(shù) 據(jù)據(jù) 指指 針針保保 存存 大大 數(shù)數(shù)N N2 2保保 存存 于于 A A中中Y YN N12特制分析STARTSTART: CLR CCLR C; ;進位位清進位位清0 0 MOV DPTR MOV DPTR,#ST1#ST1 ; ;設(shè)置數(shù)據(jù)指針設(shè)置數(shù)據(jù)指針 MOVX AMOVX A,DPTRDPTR; ;取第取第1 1個數(shù)個數(shù) MOV R2, AMOV R2, A; ;第第1 1個數(shù)存于個數(shù)存于R2R2 INC DPTR INC DPTR; ;數(shù)據(jù)指針加數(shù)據(jù)指針加1 1
15、MOVX A, DPTR MOVX A, DPTR; ;取第取第2 2個數(shù)個數(shù) SUBB A, R2SUBB A, R2; ;兩數(shù)比較兩數(shù)比較 JNC BIG1JNC BIG1; ;若第若第2 2個數(shù)大,則轉(zhuǎn)向個數(shù)大,則轉(zhuǎn)向BIG1BIG1 XCH A, R2 XCH A, R2; ;若第若第1 1個數(shù)大,則整字節(jié)交換個數(shù)大,則整字節(jié)交換BIG0:BIG0: INC DPTR INC DPTR MOVX DPTR, A MOVX DPTR, A; ;存大數(shù)存大數(shù) RETRETBIG1:BIG1: MOVX A, DPTR MOVX A, DPTR SJMP BIG0 SJMP BIG0上例中,
16、如果采用上例中,如果采用CJNE A, direct,rel指令,應(yīng)如何修改程序?指令,應(yīng)如何修改程序?13特制分析(2)多重單分支結(jié)構(gòu)舉例)多重單分支結(jié)構(gòu)舉例 多重單分支結(jié)構(gòu)中,通過一系列條件判斷,進多重單分支結(jié)構(gòu)中,通過一系列條件判斷,進行逐級分支。為此可使用比較轉(zhuǎn)移指令行逐級分支。為此可使用比較轉(zhuǎn)移指令CJNE實現(xiàn)。實現(xiàn)。14特制分析CJNE A, 55H, LOOP1CJNE A, 55H, LOOP1; ;若若TaT55,TaT55,則轉(zhuǎn)向則轉(zhuǎn)向LOOP1LOOP1AJMP FHAJMP FH ; ;若若TaTaT55,T55,則返回則返回LOOP1:LOOP1: JNC JW ;J
17、NC JW ;若若(CY)(CY)0,0,表明表明TaTaT55,T55,轉(zhuǎn)降溫處理程序轉(zhuǎn)降溫處理程序CJNE A, 54H, LOOP2 ;CJNE A, 54H, LOOP2 ;若若TaT54,TaT54,則轉(zhuǎn)向則轉(zhuǎn)向LOOP2LOOP2AJMP FHAJMP FH ; ;若若TaTaT54,T54,則返回則返回LOOP2:LOOP2: JC SWJC SW; ;若若(CY)(CY)1,1,表明表明TaTaT54,T54,轉(zhuǎn)升溫處理程序轉(zhuǎn)升溫處理程序 FH:FH:RETRET; ;若若T55TaT54,T55TaT54,則返回主程序則返回主程序例:假定采集的溫度值例:假定采集的溫度值Ta放
18、在累加器放在累加器A中。此外,在內(nèi)部中。此外,在內(nèi)部RAM 54H單元存放溫度下限值單元存放溫度下限值T54,在,在55H單元存放溫度單元存放溫度上限值上限值T55。若。若TaT55,程序轉(zhuǎn)向程序轉(zhuǎn)向JW(降溫處理程序降溫處理程序);若;若TaT54,則程序轉(zhuǎn)向,則程序轉(zhuǎn)向SW(升溫處理程序升溫處理程序);若;若T55TaT54,則程序轉(zhuǎn)向,則程序轉(zhuǎn)向FH(返回主程序返回主程序)。15特制分析解解:(:(1 1)分析任務(wù):解方程)分析任務(wù):解方程 (2 2)算法:控制轉(zhuǎn)移)算法:控制轉(zhuǎn)移 (3 3)程序結(jié)構(gòu):多分支)程序結(jié)構(gòu):多分支 (4 4)數(shù)據(jù)類型:單字節(jié)、二進制、有符號數(shù))數(shù)據(jù)類型:單字
19、節(jié)、二進制、有符號數(shù) (5 5)RAMRAM單元安排單元安排:外部:外部RAMRAM單元單元 (6 6)采用寄存器間接尋址方式()采用寄存器間接尋址方式(R0R0、R1R1或或DPTRDPTR) (7 7)程序設(shè)計流程框圖程序設(shè)計流程框圖 (8 8)程序清單程序清單; 011y000 xxx例:已知:例:已知:127X-128,求,求Y。設(shè)。設(shè)X,Y分別存放在外部分別存放在外部RAM 1000H和和2000H單元中。單元中。16特制分析開開 始始取取 數(shù)數(shù) 據(jù)據(jù) X X結(jié)結(jié) 束束X X= =0 0Y Y= =0 0Y YN NX X 0 0Y Y= =- -1 1Y Y= =1 1N NY Y
20、保保 存存 數(shù)數(shù) 據(jù)據(jù) Y Y返回17特制分析 XAD EQU 1000H XAD EQU 1000H; BUF EQU 2000HBUF EQU 2000H; ORG 1000HORG 1000HSTARTSTART:MOV DPTRMOV DPTR, #XAD #XAD ;數(shù)據(jù);數(shù)據(jù)X X的地址送數(shù)據(jù)指針的地址送數(shù)據(jù)指針DPTRDPTR MOVX A MOVX A, DPTRDPTR; AA取數(shù)據(jù)取數(shù)據(jù)X X JZ SAVJZ SAV; X X0 0轉(zhuǎn)轉(zhuǎn)SAVSAV JB ACC.7 JB ACC.7, NEGNEG; X X0 0轉(zhuǎn)轉(zhuǎn)NEGNEG,否則,否則,X X0 0 MOV A M
21、OV A, #01H#01H; SJMP SAVSJMP SAV; NEG: MOV ANEG: MOV A, #0FFH#0FFH; (0FFH(0FFH為為-1-1補碼補碼) ) SAV: MOV DPTR SAV: MOV DPTR, #BUF#BUF; 數(shù)據(jù)數(shù)據(jù)Y Y的地址送數(shù)據(jù)指針的地址送數(shù)據(jù)指針DPTRDPTR MOVX DPTR MOVX DPTR, A A; 保存保存Y Y值值 ENDEND上例中,如果采用上例中,如果采用CJNE指令,應(yīng)如何修改程序?指令,應(yīng)如何修改程序?18特制分析 XAD EQU 1000H XAD EQU 1000H; BUF EQU 2000HBUF
22、EQU 2000H; ORG 1000HORG 1000HSTARTSTART:MOV DPTRMOV DPTR, #XAD #XAD ;數(shù)據(jù);數(shù)據(jù)X X的地址送數(shù)據(jù)指針的地址送數(shù)據(jù)指針DPTR DPTR MOVX A MOVX A, DPTRDPTR; AA取數(shù)據(jù)取數(shù)據(jù)X X CJNE A, #0, ANZ CJNE A, #0, ANZ ; X X0 0轉(zhuǎn)轉(zhuǎn)ANZANZ SJMP SAV SJMP SAV; ANZANZ: JCJC NEGNEG ;X0X0X0 MOV A MOV A, #01H#01H; SJMP SAVSJMP SAV; NEG: MOV ANEG: MOV A, #
23、0FFH#0FFH; (0FFH(0FFH為為-1-1補碼補碼) ) SAV: MOV DPTR SAV: MOV DPTR, #BUF#BUF; 數(shù)據(jù)數(shù)據(jù)Y Y的地址送數(shù)據(jù)指針的地址送數(shù)據(jù)指針DPTRDPTR MOVX DPTR MOVX DPTR, A A; 保存保存Y Y值值 ENDEND19特制分析2. 多分支程序結(jié)構(gòu)多分支程序結(jié)構(gòu)多分支程序結(jié)構(gòu)流程中具有兩個以上條件可供選擇??啥喾种С绦蚪Y(jié)構(gòu)流程中具有兩個以上條件可供選擇。可供使用的是變址尋址轉(zhuǎn)移指令供使用的是變址尋址轉(zhuǎn)移指令“JMP A+DPTR”,但使,但使用該指令實現(xiàn)多分支轉(zhuǎn)移時,需要有數(shù)據(jù)表格配合。用該指令實現(xiàn)多分支轉(zhuǎn)移時,需
24、要有數(shù)據(jù)表格配合。多分支程序結(jié)構(gòu)多分支程序結(jié)構(gòu)20特制分析(1)通過數(shù)據(jù)表實現(xiàn)程序多分支)通過數(shù)據(jù)表實現(xiàn)程序多分支 MOV A, n;分支序號送分支序號送A MOV DPTR, #BRTAB;地址表首址地址表首址 MOVC A, A+DPTR;查表查表 JMP A+DPTR;轉(zhuǎn)移轉(zhuǎn)移BRTAB:DB BR0-BRTAB ;地址表地址表 DB BR1-BRTAB DB BRn-BRTABBR0: 分支程序分支程序BR1: BRn: 21特制分析(2)通過轉(zhuǎn)移指令表實現(xiàn)程序多分支)通過轉(zhuǎn)移指令表實現(xiàn)程序多分支MOV A, nRL A ;分支序號值乘以分支序號值乘以2MOV DPTR, #BRTAB
25、;轉(zhuǎn)移指令表首址轉(zhuǎn)移指令表首址JMP A+DPTRBRTAB:AJMP BR0 ;轉(zhuǎn)分支程序轉(zhuǎn)分支程序0AJMP BR1 ;轉(zhuǎn)分支程序轉(zhuǎn)分支程序1 AJMP BR127 ;轉(zhuǎn)分支程序轉(zhuǎn)分支程序127BR0: ;分支程序分支程序BR1: BRn: 22特制分析(3)其他實現(xiàn)程序多分支的方法)其他實現(xiàn)程序多分支的方法MOV DPTR, #BRTAB;分支入口地址表首址分支入口地址表首址MOV A, R0RL A;分支轉(zhuǎn)移值乘以分支轉(zhuǎn)移值乘以2MOV R1, A;暫存暫存A值值INC AMOVC A, A+DPTR;取低位地址取低位地址PUSH ACC;低位地址入棧低位地址入棧MOV A, R1;恢
26、復(fù)恢復(fù)A值值MOVC A, A+DPTR;取高位地址取高位地址PUSH ACC;高位地址入棧高位地址入棧RET;分支入口地址裝入分支入口地址裝入PCBRTAB:DW BR0;分支程序入口地址表分支程序入口地址表 DW BR1 DW BR12723特制分析例:假設(shè)鍵盤上有例:假設(shè)鍵盤上有4 4個按鍵,功能說明如下表:個按鍵,功能說明如下表: 分析任務(wù)分析任務(wù) 確定算法確定算法 程序流程框圖程序流程框圖鍵功能鍵功能鍵值(分支程序序號)鍵值(分支程序序號)鍵處理程序(分支程序)鍵處理程序(分支程序)刪除刪除00H00HERER讀數(shù)據(jù)讀數(shù)據(jù)01H01HDSDS寫數(shù)據(jù)寫數(shù)據(jù)02H02HXSXS插入插入0
27、3H03HCRCR24特制分析J JM MP P A A+ +D DP PT TR RE ER R分分支支程程序序C CR R分分支支程程序序X XS S分分支支程程序序D DS S分分支支程程序序序序號號= =0 00 0H HD DP PT TR R表表首首地地址址A A分分支支序序號號2 2序序號號= =0 03 3H H序序號號= =0 02 2H H序序號號= =0 01 1H H25特制分析 假設(shè)轉(zhuǎn)移指令表名稱為假設(shè)轉(zhuǎn)移指令表名稱為BRTABBRTAB,分支程序序號已在,分支程序序號已在A A 中。中。 MOV DPTRMOV DPTR, #BRTAB#BRTAB CLR C CL
28、R C RLC A RLC A JMP A+DPTR JMP A+DPTR; ORG 3000HORG 3000H3000H BRTAB3000H BRTAB:AJMP ERAJMP ER; 轉(zhuǎn)刪除分支程序轉(zhuǎn)刪除分支程序3001H 3001H 3002H AJMP DS3002H AJMP DS; 轉(zhuǎn)讀數(shù)據(jù)分支程序轉(zhuǎn)讀數(shù)據(jù)分支程序3003H3003H3004H AJMP XS3004H AJMP XS; 轉(zhuǎn)寫數(shù)據(jù)分支程序轉(zhuǎn)寫數(shù)據(jù)分支程序3005H3005H3006H AJMP CR3006H AJMP CR; 轉(zhuǎn)插入分支程序轉(zhuǎn)插入分支程序 ORG 3100H ORG 3100H3100H ER
29、3100H ER:; 刪除分支程序刪除分支程序 ORG 3200HORG 3200H3200H DS3200H DS:; 讀數(shù)據(jù)分支程序讀數(shù)據(jù)分支程序 ORG 3300HORG 3300H3300H XS3300H XS:; 寫數(shù)據(jù)分支程序?qū)憯?shù)據(jù)分支程序 ORG 3400HORG 3400H3400H CR3400H CR:; 插入分支程序插入分支程序 ENDEND26特制分析(4)使用比較轉(zhuǎn)移指令)使用比較轉(zhuǎn)移指令CJNE實現(xiàn)。實現(xiàn)。( (A A) )= =0 0? ?轉(zhuǎn)轉(zhuǎn)向向0 0分分支支( (A A) )= =1 1? ?( (A A) )= =2 2? ?轉(zhuǎn)轉(zhuǎn)向向2 2分分支支轉(zhuǎn)轉(zhuǎn)向向
30、1 1分分支支Y YY YY YN NN NN N27特制分析4.2.3 循環(huán)程序結(jié)構(gòu)循環(huán)程序結(jié)構(gòu)循環(huán)結(jié)構(gòu)是重復(fù)執(zhí)行某個程序段。使用循環(huán)結(jié)構(gòu)是重復(fù)執(zhí)行某個程序段。使用條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令通通過條件判斷來實現(xiàn)和控制循環(huán)。過條件判斷來實現(xiàn)和控制循環(huán)。循環(huán)程序一般由循環(huán)程序一般由四四個主要部分組成個主要部分組成: : (1 1)初始化部分:初始化部分:為循環(huán)程序做準備,如規(guī)定循環(huán)次數(shù)、為循環(huán)程序做準備,如規(guī)定循環(huán)次數(shù)、給各變量和地址指針預(yù)置初值。給各變量和地址指針預(yù)置初值。 (2 2)處理部分處理部分: : 為反復(fù)執(zhí)行的程序段,是循環(huán)程序的實體,為反復(fù)執(zhí)行的程序段,是循環(huán)程序的實體, 也是循環(huán)程
31、序的主體。也是循環(huán)程序的主體。 (3 3)循環(huán)控制部分循環(huán)控制部分: : 其作用是修改循環(huán)變量和控制變量,其作用是修改循環(huán)變量和控制變量,并判斷循環(huán)是否結(jié)束,直到符合結(jié)束條件時,跳出循環(huán)為止。并判斷循環(huán)是否結(jié)束,直到符合結(jié)束條件時,跳出循環(huán)為止。 (4 4)結(jié)束部分結(jié)束部分: : 這部分主要是對循環(huán)程序的結(jié)果進行分析、這部分主要是對循環(huán)程序的結(jié)果進行分析、處理和存放。處理和存放。28特制分析MOV R2, #0FFH;MOV R2, #0FFH;設(shè)置長度計數(shù)器初值設(shè)置長度計數(shù)器初值 MOV R0, #3FH;MOV R0, #3FH;設(shè)置字符串指針初值設(shè)置字符串指針初值LOOP:LOOP: I
32、NC R2INC R2INC R0INC R0CJNE R0, #0DH, LOOPCJNE R0, #0DH, LOOPRETRET舉例:通過查找結(jié)束標志舉例:通過查找結(jié)束標志(回車符回車符)以統(tǒng)計字符串長度的循環(huán)以統(tǒng)計字符串長度的循環(huán) 程序。程序。 假定字符串存放在內(nèi)部假定字符串存放在內(nèi)部RAM從從40H單元開始的連續(xù)存單元開始的連續(xù)存儲單元中。為找到結(jié)束標志,應(yīng)采用逐個字符依次與回車儲單元中。為找到結(jié)束標志,應(yīng)采用逐個字符依次與回車符符(ASCII碼碼0DH)比較的方法。同時在程序中還應(yīng)設(shè)置一)比較的方法。同時在程序中還應(yīng)設(shè)置一個字符串指針以順序定位字符,設(shè)置一個字符長度計數(shù)器以個字符串
33、指針以順序定位字符,設(shè)置一個字符長度計數(shù)器以累計字符個數(shù)。累計字符個數(shù)。29特制分析 單循環(huán)程序一般有以下兩種典型結(jié)構(gòu):單循環(huán)程序一般有以下兩種典型結(jié)構(gòu):30特制分析 雙重循環(huán)程序的結(jié)構(gòu):雙重循環(huán)程序的結(jié)構(gòu):開開始始外外循循環(huán)環(huán)初初始始化化結(jié)結(jié)束束外外循循環(huán)環(huán)結(jié)結(jié)束束否否N NY Y內(nèi)內(nèi)循循環(huán)環(huán)初初始始化化內(nèi)內(nèi)循循環(huán)環(huán)處處理理內(nèi)內(nèi)循循環(huán)環(huán)變變量量修修改改外外循循環(huán)環(huán)處處理理外外循循環(huán)環(huán)變變量量修修改改結(jié)結(jié)束束處處理理內(nèi)內(nèi)循循環(huán)環(huán)結(jié)結(jié)束束否否N NY Y31特制分析解解:(:(1 1)分析任務(wù):數(shù)據(jù)傳送;()分析任務(wù):數(shù)據(jù)傳送;(2 2)算法:比較、控制轉(zhuǎn)移)算法:比較、控制轉(zhuǎn)移 (3 3)程序
34、結(jié)構(gòu):分支、循環(huán)()程序結(jié)構(gòu):分支、循環(huán)(4 4)數(shù)據(jù)類型:多字節(jié)字符串)數(shù)據(jù)類型:多字節(jié)字符串 (5 5)RAMRAM單元安排單元安排:內(nèi)部:內(nèi)部RAMRAM單元、單元、外部外部RAMRAM單元單元 (6 6)采用寄存器間接尋址方式()采用寄存器間接尋址方式(R0R0、R1R1或或DPTRDPTR)外外部部R RA AM MX XX X內(nèi)內(nèi)部部R RA AM MD DA AT TA A單單元元A AB BU UF FF FE ER R單單元元Y YY Y( (A A) )$ $( (A A) )= =$ $結(jié)結(jié)束束例:把內(nèi)部例:把內(nèi)部RAM中起始地址為中起始地址為DATA的數(shù)據(jù)串傳送到外部的
35、數(shù)據(jù)串傳送到外部 RAM以以BUFFER為首地址的區(qū)域,直到發(fā)現(xiàn)為首地址的區(qū)域,直到發(fā)現(xiàn)“$”字符字符 的的ASC碼為止,同時規(guī)定數(shù)據(jù)串最大長度為碼為止,同時規(guī)定數(shù)據(jù)串最大長度為32個字節(jié)。個字節(jié)。32特制分析 (7 7)程序流程框圖;)程序流程框圖;開開始始初初始始化化數(shù)數(shù)據(jù)據(jù)指指針針結(jié)結(jié)束束數(shù)數(shù)傳傳送送完完否否N NY Y初初始始化化控控制制變變量量取取數(shù)數(shù)數(shù)數(shù)據(jù)據(jù)傳傳送送修修改改指指針針變變量量是是$ $嗎嗎? ?Y YN N33特制分析 ORG 0030H ORG 0030H DATACSDATACS:MOV R0MOV R0, #DATA#DATA; DATADATA數(shù)據(jù)區(qū)首地址數(shù)據(jù)
36、區(qū)首地址 MOV DPTRMOV DPTR, #BUFFER#BUFFER;BUFFERBUFFER數(shù)據(jù)區(qū)首地址數(shù)據(jù)區(qū)首地址 MOV R1MOV R1, #20H#20H; 最大數(shù)據(jù)串長最大數(shù)據(jù)串長 LOOPLOOP:MOV AMOV A, R0R0; 取數(shù)據(jù)取數(shù)據(jù) SUBB ASUBB A, #24H#24H; 判是否為判是否為“$”$”字符字符 JZ LOOP1JZ LOOP1; 是是“$”$”字符,轉(zhuǎn)結(jié)束字符,轉(zhuǎn)結(jié)束 MOVX A MOVX A , R0 R0 ; MOVX DPTRMOVX DPTR,A A; 數(shù)據(jù)傳送數(shù)據(jù)傳送 INC R0INC R0; INC DPTRINC DPT
37、R; DJNZ R1DJNZ R1, LOOPLOOP; 循環(huán)控制循環(huán)控制 LOOP1LOOP1:RETRET; 結(jié)束結(jié)束 ENDEND34特制分析【補充程序補充程序】存儲器清零程序。假設(shè)在內(nèi)部存儲器清零程序。假設(shè)在內(nèi)部RAM區(qū),開辟區(qū),開辟96個工作單元,工作單元首地址為個工作單元,工作單元首地址為20H,則工作單元清零,則工作單元清零程序子程序如下程序子程序如下:思考題:如采用思考題:如采用CJNE指令,應(yīng)如何修改程序?指令,應(yīng)如何修改程序?解:解: ORG 1000HORG 1000H CLR0 CLR0:MOV R0MOV R0, #20H#20H;循環(huán)初始化部分;循環(huán)初始化部分 MO
38、V R7MOV R7, #96#96; CLR ACLR A LOOP LOOP:MOV R0MOV R0, A A; 循環(huán)體部分循環(huán)體部分 INC R0INC R0; 修改變量修改變量 DJNZ R7DJNZ R7, LOOPLOOP;循環(huán)控制部分;循環(huán)控制部分 RETRET END ENDDEC R7DEC R7CJNE R7,#00H,LOOP;CJNE R7,#00H,LOOP;35特制分析 例:兩個三字節(jié)二進制無符號數(shù)相加,被加數(shù)放在內(nèi)部例:兩個三字節(jié)二進制無符號數(shù)相加,被加數(shù)放在內(nèi)部RAM 50H52H單元(低字節(jié)存放在高地址單元,高字節(jié)存放在低地單元(低字節(jié)存放在高地址單元,高字
39、節(jié)存放在低地址單元,即低位在前,高位在后),加數(shù)放在址單元,即低位在前,高位在后),加數(shù)放在53H55H單元,單元,和放在和放在50H52H單元,最高位如有進位,則放在單元,最高位如有進位,則放在23H單元中。單元中。被加數(shù)(被加數(shù)(N1N1)加數(shù)(加數(shù)(N2N2)和(和(N3N3)50H50H單元單元高字節(jié)高字節(jié)53H53H單元單元高字節(jié)高字節(jié)50H50H單元單元高字節(jié)高字節(jié)51H51H單元單元中字節(jié)中字節(jié)54H54H單元單元中字節(jié)中字節(jié)51H51H單元單元中字節(jié)中字節(jié)52H52H單元單元低字節(jié)低字節(jié)55H55H單元單元低字節(jié)低字節(jié)52H52H單元單元低字節(jié)低字節(jié)23H23H單元單元進位位進
40、位位 被加數(shù)被加數(shù) N1 N1 高字節(jié)(高字節(jié)(8 8位)位) 中字節(jié)(中字節(jié)(8 8位)位) 低字節(jié)(低字節(jié)(8 8位)位) 加數(shù)加數(shù) N2 N2 高字節(jié)(高字節(jié)(8 8位)位) 中字節(jié)(中字節(jié)(8 8位)位) 低字節(jié)(低字節(jié)(8 8位)位) + +)進位位()進位位(CYCY) 進位位(進位位(CYCY) 進位位(進位位(CYCY) 和和 N3 N3 進位進位 高字節(jié)(高字節(jié)(8 8位)位) 中字節(jié)(中字節(jié)(8 8位)位) 低字節(jié)(低字節(jié)(8 8位)位)36特制分析開開始始初初始始化化數(shù)數(shù)據(jù)據(jù)指指針針結(jié)結(jié)束束兩兩數(shù)數(shù)加加完完否否N NY Y初初始始化化控控制制變變量量取取加加數(shù)數(shù)N N1
41、1取取加加數(shù)數(shù)N N2 2兩兩數(shù)數(shù)相相加加并并保保存存修修改改指指針針變變量量數(shù)數(shù)據(jù)據(jù)處處理理返回返回程序流程框圖程序流程框圖37特制分析 ORG 0030H ORG 0030H ADDUDO ADDUDO:MOV R0MOV R0, #52H#52H; 循環(huán)初始化部分循環(huán)初始化部分 MOV R1MOV R1, #55H#55H; MOV R7MOV R7, #03H#03H; 循環(huán)次數(shù)循環(huán)次數(shù) CLR CCLR C; LOOPLOOP:MOV AMOV A, R0R0; 循環(huán)體部分循環(huán)體部分 ADDC AADDC A, R1R1; MOV R0MOV R0, A A; DEC R0DEC R
42、0; 修改指針變量修改指針變量 DEC R1DEC R1; DJNZ R7DJNZ R7, LOOPLOOP; 循環(huán)控制部分循環(huán)控制部分 CLR ACLR A; 循環(huán)結(jié)束處理部分循環(huán)結(jié)束處理部分 ADDC AADDC A, #00H#00H; MOV R0MOV R0, #23H#23H; MOV R0MOV R0, A A; RETRET; END END 程序清單程序清單38特制分析4.3 80C514.3 80C51單片機匯編語言程序設(shè)計舉例單片機匯編語言程序設(shè)計舉例4.3.2 4.3.2 定時程序定時程序 在單片機的控制應(yīng)用中,常有定時的需要,如定時中斷、定在單片機的控制應(yīng)用中,常有定
43、時的需要,如定時中斷、定時檢測和定時掃描等。定時功能除可以使用純硬件電路、可編程時檢測和定時掃描等。定時功能除可以使用純硬件電路、可編程定時定時/ /計數(shù)器實現(xiàn)外,還可以使用軟件程序(計數(shù)器實現(xiàn)外,還可以使用軟件程序(定時程序定時程序)完成。)完成。 定時程序是典型的循環(huán)程序,它是通過定時程序是典型的循環(huán)程序,它是通過執(zhí)行一個具有固定延執(zhí)行一個具有固定延遲時間的循環(huán)體遲時間的循環(huán)體來實現(xiàn)定時的。來實現(xiàn)定時的。開開始始初初始始化化部部分分結(jié)結(jié)束束循循環(huán)環(huán)控控制制部部分分N NY Y循循環(huán)環(huán)體體39特制分析(1 1)單循環(huán)定時程序)單循環(huán)定時程序 MOV R5MOV R5, #TIME#TIME;
44、LOOP: NOPLOOP: NOP; NOPNOP; DJNZ R5DJNZ R5, LOOPLOOP; 假設(shè)假設(shè)單片機晶振頻單片機晶振頻率率f foscosc=6MHz=6MHz,則一個機器周期為則一個機器周期為2s2s,NOPNOP、DJNZDJNZ指令分別是單、雙機器周期指令。指令分別是單、雙機器周期指令。定時程序的總延遲定時程序的總延遲時間是循環(huán)程序段延時時間的整數(shù)倍時間是循環(huán)程序段延時時間的整數(shù)倍,由于,由于R5R5是是8 8位寄存器,因位寄存器,因此,這個定時程序的最長定時時間為:此,這個定時程序的最長定時時間為: 256256(2 28 8)8=20488=2048(ss)40
45、特制分析(2 2)較長時間的定時程序)較長時間的定時程序 (多重循環(huán)定時子程序)(多重循環(huán)定時子程序) TIMETIME:MOV R5MOV R5, #TTME1#TTME1; LOOP2LOOP2:MOV R4MOV R4, #TEME2#TEME2; LOOP1LOOP1:NOPNOP; NOPNOP; DJNZ R4DJNZ R4, LOOP1LOOP1; DJNZ R5DJNZ R5, LOOP2LOOP2; RETRET; 這個定時子程序的最長定時時間為:這個定時子程序的最長定時時間為: 256256(2828)4+2+14+2+1256256(2828)2+4=5258282+4=
46、525828(ss)開開始始外外循循環(huán)環(huán)初初始始化化結(jié)結(jié)束束內(nèi)內(nèi)循循環(huán)環(huán)控控制制N NY Y內(nèi)內(nèi)循循環(huán)環(huán)初初始始化化外外循循環(huán)環(huán)控控制制內(nèi)內(nèi)循循環(huán)環(huán)體體N NY Y41特制分析(3 3)調(diào)整定時時間)調(diào)整定時時間 在定時程序中可通過在定時程序中可通過在循環(huán)程序段中增減指令在循環(huán)程序段中增減指令的方法對定的方法對定時時間進行微調(diào)。時時間進行微調(diào)。 例:例: MOV R0MOV R0, #TTME#TTME; LOOPLOOP:ADD AADD A, R1R1; INC DPTRINC DPTR; DJNZ R0DJNZ R0, LOOPLOOP; 由于由于ADDADD、INCINC、DJNZDJ
47、NZ指令的機器周期分別為指令的機器周期分別為1 1、2 2、2 2,所以,所以,該程序定時時間為該程序定時時間為= =(1+2+21+2+2)2s2sTimeTime(ss)。42特制分析假定要求定時時間為假定要求定時時間為24us24us。對于這個定時程序,只須增加一條。對于這個定時程序,只須增加一條NOPNOP指令即可實現(xiàn)。指令即可實現(xiàn)。 MOV R0MOV R0, #TIME#TIME; LOOPLOOP: ADD AADD A, R1R1; INC DPTRINC DPTR; NOPNOP; DJNZ R0DJNZ R0, LOOPLOOP; 只須只須TIMETIME取取2 2,即可得
48、到精確的,即可得到精確的24s24s定時。定時。43特制分析(4 4)以一個基本的延時程序滿足不同的定時要求以一個基本的延時程序滿足不同的定時要求 如果一個系統(tǒng)有多個定時需要,我們就可以設(shè)計一個基如果一個系統(tǒng)有多個定時需要,我們就可以設(shè)計一個基本延時程序,使其延時時間為各定時時間的最大公約數(shù),然本延時程序,使其延時時間為各定時時間的最大公約數(shù),然后可以以此基本程序作為子程序,通過調(diào)用的方法實現(xiàn)所需后可以以此基本程序作為子程序,通過調(diào)用的方法實現(xiàn)所需不同定時。不同定時。 44特制分析 MOV R0 MOV R0, #05H#05H; 5S5S定時定時LOOP: LCALL DELAYLOOP:
49、LCALL DELAY; DJNZ R0DJNZ R0, LOOP1LOOP1; MOV R0MOV R0, #0AH#0AH; 10S10S定時定時LOOP2: LCALL DELAYLOOP2: LCALL DELAY; DJNZ R0DJNZ R0, LOOP2LOOP2; MOV R0MOV R0, #14H#14H; 20S20S定時定時LOOP3: LCALL DELAYLOOP3: LCALL DELAY; DJNZ R0DJNZ R0, LOOP3LOOP3; 例:在單片機應(yīng)用系統(tǒng)中,假設(shè)需要的定時時間分別為例:在單片機應(yīng)用系統(tǒng)中,假設(shè)需要的定時時間分別為5S、10S、20S,
50、可設(shè)計一個,可設(shè)計一個1S延時子程序延時子程序DELAY,則,則5S、10S、20S的定時時間可通過調(diào)用的定時時間可通過調(diào)用DELAY實現(xiàn)。實現(xiàn)。45特制分析 4.3.3 4.3.3 查表程序查表程序 所謂所謂查表程序,就是指預(yù)先把數(shù)據(jù)以表格形式存放在程查表程序,就是指預(yù)先把數(shù)據(jù)以表格形式存放在程序存儲器中,然后使用程序讀出,這種能讀出表格數(shù)據(jù)的程序存儲器中,然后使用程序讀出,這種能讀出表格數(shù)據(jù)的程序序就稱之為查表程序。就稱之為查表程序。 查表操作對單片機的控制應(yīng)用十分重要,查表程序查表操作對單片機的控制應(yīng)用十分重要,查表程序常用常用于實現(xiàn)于實現(xiàn)非線性修正,非線性函數(shù)轉(zhuǎn)換以及代碼轉(zhuǎn)換非線性修正
51、,非線性函數(shù)轉(zhuǎn)換以及代碼轉(zhuǎn)換等等場合。場合。 46特制分析MCS-51MCS-51單片機單片機指令系統(tǒng)中指令系統(tǒng)中有有兩條兩條專用查表指令專用查表指令:(1 1)MOVC AMOVC A, A+A+DPTRDPTR;AA(A A)+ +(DPTRDPTR) (2 2)MOVC AMOVC A, A+A+PCPC; AA(A A)+ +(PCPC) 這兩條這兩條查表指令查表指令的功能是完全相同的,其的功能是完全相同的,其共同優(yōu)點共同優(yōu)點是:能在是:能在不改變不改變PCPC和和DPTRDPTR的狀態(tài)下,只根據(jù)的狀態(tài)下,只根據(jù)A A的內(nèi)容就可以取出表格中的的內(nèi)容就可以取出表格中的數(shù)據(jù)。注意:數(shù)據(jù)。注
52、意:A A的內(nèi)容均為的內(nèi)容均為8 8位無符號數(shù)。位無符號數(shù)。適用于適用于64KB ROM64KB ROM范圍內(nèi)范圍內(nèi)查表,一個數(shù)據(jù)表格可以查表,一個數(shù)據(jù)表格可以被被多個多個程序塊使用。程序塊使用。編寫查表程序時,首先把表的首地址送入編寫查表程序時,首先把表的首地址送入DPTRDPTR中,再將中,再將要查表的數(shù)據(jù)序號(或下標值)送入要查表的數(shù)據(jù)序號(或下標值)送入A A中,然后就可以使中,然后就可以使用該指令進行查表操作,并把結(jié)果送用該指令進行查表操作,并把結(jié)果送A A中。中。常用于常用于“本地本地”范圍范圍查表(數(shù)據(jù)表格只能放在該指令后查表(數(shù)據(jù)表格只能放在該指令后面面256256個地址單元之
53、內(nèi),而且表格只能被本程序使用)。個地址單元之內(nèi),而且表格只能被本程序使用)。編寫查表程序時,首先把查表數(shù)據(jù)的序號送入編寫查表程序時,首先把查表數(shù)據(jù)的序號送入A A中,再中,再把從查表指令的下一條指令的首地址到表的首地址間的把從查表指令的下一條指令的首地址到表的首地址間的偏移量與偏移量與A A值相加,然后再使用該指令進行查表操作,值相加,然后再使用該指令進行查表操作,并把結(jié)果送入并把結(jié)果送入A A中。中。47特制分析 ORG 1000H1000H SQR:MOV A, 30H; Ax1002H PUSH DPH; 現(xiàn)場保護現(xiàn)場保護1004H PUSH DPL; 1006H MOV DPTR,#T
54、AB1; DPTR表首地址表首地址TAB1 1009H MOVC A, A+DPTR;查表得查表得y100AH MOV 40H, A; 40Hy100CH POP DPL; 現(xiàn)場恢復(fù)現(xiàn)場恢復(fù)100EH POP DPH; 1010H RET1011H TAB1: DB 00H,01H,04H,09H,10H,19H DB 24H,31H,40H,51H例:設(shè)計一個子程序,其功能為根據(jù)例:設(shè)計一個子程序,其功能為根據(jù)x的內(nèi)容(的內(nèi)容(09之間)之間)查平方表,求出相應(yīng)的結(jié)果查平方表,求出相應(yīng)的結(jié)果y(y=x2)。假設(shè))。假設(shè)x的內(nèi)容已存的內(nèi)容已存放在內(nèi)部放在內(nèi)部RAM 30H單元中,求出單元中,求
55、出y的內(nèi)容存放在內(nèi)部的內(nèi)容存放在內(nèi)部RAM 40H單元中。單元中。48特制分析上例中,上例中,如果使用如果使用MOVC A,A+PC指令指令,則則編程如下:編程如下: ORG 1000H1000H SQR: MOV A, 30H; Ax1002H PUSH DPH; 現(xiàn)場保護現(xiàn)場保護1004H PUSH DPL;1006H ADD A, #07H; 加偏移量加偏移量1008H MOVC A, A+PC; 查表得查表得y1009H MOV 40H, A; 40Hy100BH POP DPL; 現(xiàn)場恢復(fù)現(xiàn)場恢復(fù)100DH POP DPH; 100FH RET1010H TAB1: DB 00H,0
56、1H,04H,09H,10H,19H DB 24H,31H,40H,51H此題中,偏移量此題中,偏移量=1010H-1009H=07H49特制分析編輯:編輯:編寫程序的過程。編寫程序的過程。匯編語言源程序:匯編語言源程序:用匯編語言編寫的程序稱為匯編用匯編語言編寫的程序稱為匯編語言源程序。語言源程序。匯編:匯編:匯編語言源程序不能在單片機中直接執(zhí)行,匯編語言源程序不能在單片機中直接執(zhí)行,必須將其必須將其“翻譯翻譯”為用二進制代碼為用二進制代碼(機器語言機器語言)表表示的目標程序才能執(zhí)行。這個示的目標程序才能執(zhí)行。這個“翻譯翻譯”過程稱為過程稱為匯編匯編。 4.4 單片機匯編語言源程序的編輯和匯
57、編單片機匯編語言源程序的編輯和匯編50特制分析4.4.1 手工編程與匯編手工編程與匯編手工匯編手工匯編:先把程序用助記符指令寫出,然后通過先把程序用助記符指令寫出,然后通過查指令代碼表,逐個把助記符指令查指令代碼表,逐個把助記符指令“翻譯翻譯”成機成機器碼,最后再把機器碼的程序輸入單片機,進行器碼,最后再把機器碼的程序輸入單片機,進行調(diào)試和運行。通常把這種調(diào)試和運行。通常把這種查表翻譯指令查表翻譯指令的方法稱的方法稱為手工匯編。為手工匯編。 由于手工編程是按絕對地址進行定位的,所由于手工編程是按絕對地址進行定位的,所以手工匯編時要根據(jù)轉(zhuǎn)移的目標地址計算轉(zhuǎn)移指以手工匯編時要根據(jù)轉(zhuǎn)移的目標地址計算
58、轉(zhuǎn)移指令的偏移量,不但令的偏移量,不但麻煩而且容易出錯麻煩而且容易出錯。51特制分析4.4.2 機器編輯與交叉匯編機器編輯與交叉匯編機器編輯:機器編輯:是指借助于微型機或開發(fā)系統(tǒng)進行單片機的程序設(shè)是指借助于微型機或開發(fā)系統(tǒng)進行單片機的程序設(shè)計,通常都是使用編輯軟件進行源程序的編輯。編輯完成計,通常都是使用編輯軟件進行源程序的編輯。編輯完成后,生成一個由匯編指令和偽指令構(gòu)成的擴展名為后,生成一個由匯編指令和偽指令構(gòu)成的擴展名為“.ASM.ASM”的的ASCIIASCII碼文件。碼文件。機器匯編:機器匯編:由計算機完成從匯編語言源程序到機器語言目標程由計算機完成從匯編語言源程序到機器語言目標程序的
59、序的“翻譯翻譯”工作。工作。交叉匯編:交叉匯編:是指使用一種計算機的匯編程序為另一種計算機的是指使用一種計算機的匯編程序為另一種計算機的源程序進行匯編,即運行匯編程序進行匯編的是一種計算源程序進行匯編,即運行匯編程序進行匯編的是一種計算機,而匯編得到的目標程序是另一種計算機的。機,而匯編得到的目標程序是另一種計算機的。 單片機只能采用機器交叉匯編的方法對匯編語言程序進行匯編單片機只能采用機器交叉匯編的方法對匯編語言程序進行匯編52特制分析 在微型機或開發(fā)系統(tǒng)上采用交叉匯編方法對源程序進行在微型機或開發(fā)系統(tǒng)上采用交叉匯編方法對源程序進行匯編。交叉匯編后,再使用串行通信,把匯編得到的目標程匯編。交
60、叉匯編后,再使用串行通信,把匯編得到的目標程序傳送到單片機,進行程序調(diào)試和運行。可見,序傳送到單片機,進行程序調(diào)試和運行??梢?,“機器編輯機器編輯交叉匯編交叉匯編串行傳送串行傳送”的過程構(gòu)成了單片機軟件設(shè)計的的過程構(gòu)成了單片機軟件設(shè)計的“三步曲三步曲”,全過程如圖所示。,全過程如圖所示。單片機匯編語言程序生成過程單片機匯編語言程序生成過程 對匯編語言程序進行機器交叉匯編時,必須告訴計算機的匯對匯編語言程序進行機器交叉匯編時,必須告訴計算機的匯編程序應(yīng)該編程序應(yīng)該如何完成匯編工作如何完成匯編工作,這一任務(wù)就是通過使用,這一任務(wù)就是通過使用偽指令偽指令來來實現(xiàn)的。實現(xiàn)的。53特制分析偽指令偽指令是
61、程序是程序設(shè)計人設(shè)計人員員發(fā)給匯編程序發(fā)給匯編程序的指令,也稱匯編命令的指令,也稱匯編命令或匯編程序控制指令。或匯編程序控制指令。它具有控制匯編程序的輸入輸出、定義數(shù)它具有控制匯編程序的輸入輸出、定義數(shù)據(jù)和符號、條件匯編、分配存儲空間等功能。據(jù)和符號、條件匯編、分配存儲空間等功能。偽指令沒有與之相對應(yīng)的二進制機器代碼,偽指令沒有與之相對應(yīng)的二進制機器代碼,不同匯編語言的偽指令也有所不同。不同匯編語言的偽指令也有所不同。手工匯編不需要偽指令,但機器交叉匯編必須使用偽指令。手工匯編不需要偽指令,但機器交叉匯編必須使用偽指令。在對匯編語言程序進行機器交叉匯編前,偽指令存在于匯編在對匯編語言程序進行機
62、器交叉匯編前,偽指令存在于匯編語言程序中,但語言程序中,但匯編后得到的機器代碼程序中不存在偽指令相對匯編后得到的機器代碼程序中不存在偽指令相對應(yīng)的二進制機器代碼應(yīng)的二進制機器代碼,這一點請?zhí)貏e注意。,這一點請?zhí)貏e注意。4.5 80C51單片機匯編語言偽指令單片機匯編語言偽指令54特制分析1.1.匯編起始地址命令匯編起始地址命令ORGORG(ORiGinORiGin) 本命令總出現(xiàn)在匯編語言源程序的開頭位置,用于本命令總出現(xiàn)在匯編語言源程序的開頭位置,用于規(guī)定目標規(guī)定目標程序的起始地址程序的起始地址,即此命令后面的程序或數(shù)據(jù)塊的起始地址。,即此命令后面的程序或數(shù)據(jù)塊的起始地址。 命令格式命令格式
63、: 標號:標號: ORG ORG 地址地址 在匯編語言程序的開始,通常都用一條在匯編語言程序的開始,通常都用一條ORGORG偽指令來規(guī)定程偽指令來規(guī)定程序的起始地址,如果不用序的起始地址,如果不用ORGORG規(guī)定,則匯編得到的目標程序?qū)囊?guī)定,則匯編得到的目標程序?qū)?000H0000H開始。開始。 選擇項選擇項通常為通常為16位絕對地址,但也位絕對地址,但也可以使用標號或表達式表示可以使用標號或表達式表示例:例: ORG 8000H START:MOV A, #00H; 即規(guī)定標號即規(guī)定標號START代表地址代表地址8000H,目標程序的第一條指令從目標程序的第一條指令從8000H開始。開始
64、。55特制分析2. 2. 匯編終止命令匯編終止命令ENDEND(END of assemblyEND of assembly)n 該命令用于終止源程序的匯編工作。該命令用于終止源程序的匯編工作。 ENDEND是匯編是匯編語言源程序的結(jié)束標志,因此,在整個匯編語言源程語言源程序的結(jié)束標志,因此,在整個匯編語言源程序中只能有一個序中只能有一個ENDEND指令,且位于程序的最后。如果指令,且位于程序的最后。如果ENDEND命令出現(xiàn)在程序中間,則在命令出現(xiàn)在程序中間,則在ENDEND之后的指令,匯編之后的指令,匯編程序?qū)⒉挥杼幚?。程序?qū)⒉挥杼幚?。n 命令格式為:命令格式為: END END 是選擇項,
65、只有主程序模塊才有;是選擇項,只有主程序模塊才有; : 也是選擇項,當源程序為主程序時才具有,其也是選擇項,當源程序為主程序時才具有,其值為主程序第一條指令的符號地址值為主程序第一條指令的符號地址56特制分析3. 賦值命令賦值命令EQU(EQUate) 該命令用于給字符名稱賦值。賦值后,其值在整個該命令用于給字符名稱賦值。賦值后,其值在整個程序中有效。程序中有效。命令格式為:命令格式為:EQU 其中其中可以是常數(shù)、地址、標號或表達式??梢允浅?shù)、地址、標號或表達式。其值為其值為8位或位或16位二進制數(shù)。賦值以后的字符名稱既可位二進制數(shù)。賦值以后的字符名稱既可以作地址使用,也可以作立即數(shù)使用。以
66、作地址使用,也可以作立即數(shù)使用。例:例: HOUR EQU 30HHOUR EQU 30H ORG 1000H ORG 1000H START START:MOV HOURMOV HOUR, #40H#40H; 等同于等同于 STARTSTART:MOV 30HMOV 30H, #40H#40H;57特制分析4.DB4.DB(Define ByteDefine Byte)定義數(shù)據(jù)字節(jié)命令)定義數(shù)據(jù)字節(jié)命令 本命令用于從指定的地址單元開始,在程序存儲器的連續(xù)單本命令用于從指定的地址單元開始,在程序存儲器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。常使用本命令存放數(shù)據(jù)表格。元中定義字節(jié)數(shù)據(jù)。常使用本命令存放數(shù)據(jù)表格。 命令格式:命令格式: 標號:標號:DBDB8 8位數(shù)表位數(shù)表 例如:例如: DBDB“how are you?”“how are you?” DB DB-2,-4,-6,10,11,17-2,-4,-6,10,11,17 例:存放例:存放7 7段數(shù)碼管(共陽極)顯示的十六進制基數(shù)(段數(shù)碼管(共陽極)顯示的十六進制基數(shù)(0 0F F)的十六進制數(shù)的字形代碼,可使用多條的十六進制數(shù)的字形代碼,可使
- 溫馨提示:
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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識競賽試題
- 1 礦井泵工考試練習題含答案
- 2煤礦爆破工考試復(fù)習題含答案
- 1 各種煤礦安全考試試題含答案