單片機匯編語言程序設(shè)計.ppt_第1頁
單片機匯編語言程序設(shè)計.ppt_第2頁
單片機匯編語言程序設(shè)計.ppt_第3頁
單片機匯編語言程序設(shè)計.ppt_第4頁
單片機匯編語言程序設(shè)計.ppt_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第4章 MCS-51匯編語言程序設(shè)計,教學(xué)基本要求: (1)、了解MCS-51匯編語言程序設(shè)計的特點; (2)、熟悉MCS-51匯編語言偽指令的功能及用法; (3)、掌握順序、分支、循環(huán)程序的設(shè)計方法; (4)、掌握KEIL軟件的使用方法。 教學(xué)重點: (1)、KEIL軟件的使用方法; (2)、分支、循環(huán)程序的設(shè)計方法; (3)、定時、查表程序的設(shè)計方法; 教學(xué)難點: (1)、KEIL軟件調(diào)試程序的方法; (2)、利用JMP A+DPTR指令實現(xiàn)程序多分支; (3)、查表程序的設(shè)計方法; (4)、子程序結(jié)構(gòu)與堆棧的關(guān)系。,4.1 單片機程序程序設(shè)計語言概述,4.1.1 機器語言和匯編語言 4.

2、1.2 單片機使用的高級語言 (1)BASIC語言 (2)C語言 (3)PL/M語言 4.1.3 80C51單片機匯編語言的語句格式,匯編語言程序設(shè)計必須注意如下特點: (1)設(shè)計人員必須詳細(xì)了解單片機的硬件結(jié)構(gòu),以便在程序設(shè)計中熟練使用; (2)必須熟悉匯編語言指令的功能和用法; (3)在程序設(shè)計前,必須分析設(shè)計任務(wù),確定所用算法,確定程序結(jié)構(gòu),確定數(shù)據(jù)的類型、數(shù)據(jù)的結(jié)構(gòu),必須對數(shù)據(jù)的存放、寄存器和工作單元的使用以及所用硬件資源等作出具體安排; (4)根據(jù)分析,畫出程序設(shè)計流程圖; (5)根據(jù)程序設(shè)計流程圖編寫程序。,4.2 匯編語言程序的基本結(jié)構(gòu)形式,單片機匯編語言程序設(shè)計的基本結(jié)構(gòu)形式一

3、般分為以下4種形式,即順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)。 4.2.1 順序程序結(jié)構(gòu) 順序程序是最簡單的程序結(jié)構(gòu),在順序程序中,既無分支,循環(huán),也不調(diào)用子程序,程序執(zhí)行時一條一條地按順序執(zhí)行指令 例:假定三字節(jié)無符號數(shù)相加,其中一個加數(shù)在內(nèi)部RAM的50H、51H和52H單元中,另一個加數(shù)在內(nèi)部RAM的53H、54H和55H單元中,要求把相加之和存放在50H、51H和52H單元中,進位存放在位尋址區(qū)的00H位中。 解:(1)分析任務(wù):求兩數(shù)之和 (2)算法:加法運算(ADD或ADDC),(3)程序結(jié)構(gòu):順序或循環(huán)結(jié)構(gòu) (4)數(shù)據(jù)類型:三字節(jié)、二進制、無符號數(shù) (5)數(shù)據(jù)結(jié)構(gòu):升序或降序排

4、列 (6)RAM單元安排: (內(nèi)部RAM字節(jié)單元、位地址空間) (7)采用寄存器間接尋址方式(R0、R1),(8)程序設(shè)計流程框圖;,(9)程序清單; ORG 1000H MOV RO, #52H;加數(shù)N1的低字節(jié)地址送地址指針R0 MOV R1, #55H;加數(shù)N2的低字節(jié)地址送地址指針R1 MOV A, R0; 取N1的低字節(jié) ADD A, R1; N1、N2低字節(jié)相加 MOV R0, A; 保存N1、N2低字節(jié)和 DEC R0; 修改加數(shù)N1的地址指針內(nèi)容 DEC R1; 修改加數(shù)N2的地址指針內(nèi)容 MOV A, R0; 取N1的中間字節(jié) ADDC A, R1; N1、N2中間字節(jié)帶低字

5、節(jié)和進位相加 MOV R0, A; 保存N1、N2中間字節(jié)和 DEC R0; 修改加數(shù)N1的地址指針內(nèi)容,DEC R1; 修改加數(shù)N2的地址指針內(nèi)容 MOV A, R0; 取N1的高字節(jié) ADDC A, R1; N1、N2高字節(jié)帶中間字節(jié)和進位相加 MOV R0, A; 保存N1、N2高字節(jié)和 MOV 00H, C; 高字節(jié)和的進位送00H位保存 END 思考題: 1)上述程序中,如果只采用ADDC指令,應(yīng)如何修改程序? 2)如果N1、N2,N3均為十進制數(shù),應(yīng)如何修改程序? 3)如果加數(shù)N1在內(nèi)部RAM 50H、51H和52H單元中,而加數(shù)N2與和N3均在外部RAM0053H、0054H和0

6、055H單元中,其它條件不變,應(yīng)如何修改程序? 4)如果N1、N2,N3均存放在外部RAM單元,應(yīng)如何修改程序?,思考題: 1) ORG 1000H MOV RO, #52H;加數(shù)N1的低字節(jié)地址送地址指針R0 MOV R1, #55H;加數(shù)N2的低字節(jié)地址送地址指針R1 MOV A, R0; 取N1的低字節(jié) CLR C; 清原來進位位CY的內(nèi)容 ADDC A, R1; N1、N2低字節(jié)相加 MOV R0, A; 保存N1、N2低字節(jié)和 DEC R0; 修改加數(shù)N1的地址指針內(nèi)容 DEC R1; 修改加數(shù)N2的地址指針內(nèi)容 MOV A, R0; 取N1的中間字節(jié) ADDC A, R1; N1、

7、N2中間字節(jié)帶低字節(jié)和進位相加 MOV R0, A; 保存N1、N2中間字節(jié)和 DEC R0; 修改加數(shù)N1的地址指針內(nèi)容,DEC R1; 修改加數(shù)N2的地址指針內(nèi)容 MOV A, R0; 取N1的高字節(jié) ADDC A, R1; N1、N2高字節(jié)帶中間字節(jié)和進位相加 MOV R0, A; 保存N1、N2高字節(jié)和 MOV 00H, C; 高字節(jié)和的進位送00H位保存 END 思考題: 2) ORG 1000H MOV RO, #52H;加數(shù)N1的低字節(jié)地址送地址指針R0 MOV R1, #55H;加數(shù)N2的低字節(jié)地址送地址指針R1 MOV A, R0; 取N1的低字節(jié) ADD A, R1; N1

8、、N2低字節(jié)相加 DA A; N1、N2低字節(jié)和十進制調(diào)整 MOV R0, A; 保存N1、N2低字節(jié)和,DEC R0; 修改加數(shù)N1的地址指針內(nèi)容 DEC R1; 修改加數(shù)N2的地址指針內(nèi)容 MOV A, R0; 取N1的中間字節(jié) ADDC A, R1; N1、N2中間字節(jié)帶低字節(jié)和進位相加 DA A; N1、N2中間字節(jié)和十進制調(diào)整 MOV R0, A; 保存N1、N2中間字節(jié)和 DEC R0; 修改加數(shù)N1的地址指針內(nèi)容 DEC R1; 修改加數(shù)N2的地址指針內(nèi)容 MOV A, R0; 取N1的高字節(jié) ADDC A, R1; N1、N2高字節(jié)帶中間字節(jié)和進位相加 DA A; N1、N2高

9、字節(jié)和十進制調(diào)整 MOV R0, A; 保存N1、N2高字節(jié)和 MOV 00H, C; 高字節(jié)和的進位送00H位保存 END,思考題 3) ORG 1000H MOV RO, #52H;加數(shù)N1的低字節(jié)地址送地址指針R0 MOV R1, #55H;加數(shù)N2的低字節(jié)地址送地址指針R1 MOVX A, R1; 取N2的低字節(jié) ADD A, R0; N1、N2低字節(jié)相加 MOVX R1, A; 保存N1、N2低字節(jié)和 DEC R0; 修改加數(shù)N1的地址指針內(nèi)容 DEC R1; 修改加數(shù)N2的地址指針內(nèi)容 MOVX A, R1; 取N2的中間字節(jié) ADDC A, R0; N1、N2中間字節(jié)帶低字節(jié)和進

10、位相加 MOVX R1, A; 保存N1、N2中間字節(jié)和 DEC R0; 修改加數(shù)N1的地址指針內(nèi)容,DEC R1; 修改加數(shù)N2的地址指針內(nèi)容 MOVX A, R1; 取N2的高字節(jié) ADDC A, R0; N1、N2高字節(jié)帶中間字節(jié)和進位相加 MOVX R1, A; 保存N1、N2高字節(jié)和 MOV 00H, C; 高字節(jié)和的進位送00H位保存 END 如果N2、N3的數(shù)據(jù)地址指針采用DPTR,則程序修改如下: ORG 1000H MOV RO, #52H;加數(shù)N1的低字節(jié)地址送地址指針R0 MOV DPTR, #0055H;加數(shù)N2的低字節(jié)地址送DPTR MOVX A, DPTR; 取N2

11、的低字節(jié) ADD A, R0; N1、N2低字節(jié)相加 MOVX DPTR, A; 保存N1、N2低字節(jié)和 DEC R0; 修改加數(shù)N1的地址指針內(nèi)容,MOV DPTR, #0054H;修改加數(shù)N2的地址指針內(nèi)容 MOVX A, DPTR; 取N2的中間字節(jié) ADDC A, R0; N1、N2中間字節(jié)帶低字節(jié)和進位相加 MOVX DPTR, A; 保存N1、N2中間字節(jié)和 DEC R0; 修改加數(shù)N1的地址指針內(nèi)容 MOV DPTR, #0053H;修改加數(shù)N2的地址指針內(nèi)容 MOVX A, DPTR; 取N2的高字節(jié) ADDC A, R0; N1、N2高字節(jié)帶中間字節(jié)和進位相加 MOVX DP

12、TR, A; 保存N1、N2高字節(jié)和 MOV 00H, C; 高字節(jié)和的進位送00H位保存 END 思考:修改加數(shù)N2的數(shù)據(jù)地址指針DPTR的內(nèi)容可否采用 DEC DPTR指令?,例:設(shè)內(nèi)部RAM 40H,41H單元中分別存放8位二進制數(shù),現(xiàn)分別取這兩個單元中的半個字節(jié),合并成一個新字節(jié)存放在42H單元中。要求如下:42H單元新字節(jié)的低半字節(jié)取自40H單元的低半字節(jié),而高半字節(jié)取自41H單元的低半字節(jié)。 解:(1)分析任務(wù):拆字、合字,(2)算法:邏輯運算 (3)程序結(jié)構(gòu):順序 (4)數(shù)據(jù)類型:單字節(jié)、二進制、無符號數(shù) (5)數(shù)據(jù)結(jié)構(gòu):升序或降序排列 (6)程序設(shè)計流程框圖;,(7)程序清單;

13、 ORG 2000H START: MOV R1, #40H;初始化數(shù)據(jù)指針R1的內(nèi)容 MOV A, R1; 取40H單元內(nèi)容送A ANL A, #0FH;保留40H單元內(nèi)容低4位 INC R1; 修改數(shù)據(jù)指針R1的內(nèi)容 XCH A, R1; (A)與R1內(nèi)容互換 ANL A, #0FH;保留41H單元內(nèi)容低四位 SWAP A; 41H單元內(nèi)容高低半字節(jié)互換 ORL A, R1; 合字生成新字節(jié) INC R1; 修改數(shù)據(jù)指針R1的內(nèi)容 MOV R1, A; 新字節(jié)送42H單元保存 END 作業(yè)題: 上例中其它條件不變,要求如下:42H單元新字節(jié)的低半字節(jié)取自40H單元的低半字節(jié),而高半字節(jié)取自

14、41H單元的高半字節(jié)。,(1)單分支程序 單分支程序是通過條件轉(zhuǎn)移指令實現(xiàn)的,即根據(jù)條件對程序的執(zhí)行進行判斷,滿足條件則進行程序轉(zhuǎn)移,不滿足條件程序就順序執(zhí)行。 在MCS-51指令系統(tǒng)中,可利用JZ,JNZ,CJNE,DJNZ,JC,JNC,JB,JNB,JBC等指令,完成為0、為1、為正、為負(fù)以及相等、不相等等各種條件判斷。 例:兩個8位無符號二進制數(shù)比較大小。假設(shè)在外部RAM中有ST1、ST2和ST3共3個連續(xù)單元(單元地址從小到大),其中ST1、ST2單元中存放著兩個8位無符號二進制數(shù)N1,N2,要求找出其中的大數(shù)并存入ST3單元中。,4.2.2 分支程序結(jié)構(gòu),解:(1)分析任務(wù):比較兩

15、個數(shù)的大小 (2)算法:算術(shù)運算、控制轉(zhuǎn)移 (3)程序結(jié)構(gòu):單分支 (4)數(shù)據(jù)類型:單字節(jié)、二進制、無符號數(shù) (5)數(shù)據(jù)結(jié)構(gòu):單元地址升序排列 (6)RAM單元安排:外部RAM單元 (7)采用寄存器間接尋址方式(R0、R1或DPTR) (8)程序設(shè)計流程框圖; (9)程序清單; 思考題(補充作業(yè)題): 上例中,如果采用CJNE A, direct,rel指令,應(yīng)如何修改程序?,返回,ORG 8000H START: CLR C;進位清0 MOV DPTR, #ST1; 設(shè)數(shù)據(jù)指針 MOVX A,DPTR; A(ST1),取N1 MOV R2, A; 暫存N1 INC DPTR; DPTR ST

16、2(指向N2單元) MOVX A, DPTR; 取N2存于A中 SUBB A, R2;N1,N2比較(N2-N1,差在A中) JNC BIG1;N2N1,轉(zhuǎn)BIG1,N2N1,順序執(zhí)行 XCH A, R2;N1,N2互換,A N1 SJMP BIG0 BIG1: MOVX A, DPTR;A N2 BIGO: INC DPTR; DPTR ST3(指向N3單元) MOVX DPTR, A;ST3 大數(shù) END,返回,(2)多分支程序 假設(shè)多分支程序中,分支序號的最大值為n,則多分支轉(zhuǎn)移結(jié)構(gòu)如圖所示: MCS-51指令系統(tǒng)沒有多分支轉(zhuǎn)移指令,無法使用單條指令完成多分支轉(zhuǎn)移。要實現(xiàn)多分支轉(zhuǎn)移,可采

17、用以下幾種方法:,假設(shè)分支序號值保存在累加器A中,則可使用 CJNE A, #data, rel指令,其分支流程如圖所示:,(a)使用多條CJNE指令,通過逐次比較,實現(xiàn)分支程序轉(zhuǎn)移,例:已知:127X-128,求Y。設(shè)X,Y分別存放在外部RAM 1000H和2000H單元中。 解:(1)分析任務(wù):解方程 (2)算法:控制轉(zhuǎn)移 (3)程序結(jié)構(gòu):多分支 (4)數(shù)據(jù)類型:單字節(jié)、二進制、有符號數(shù) (5)RAM單元安排:外部RAM單元 (6)采用寄存器間接尋址方式(R0、R1或DPTR) (7)程序設(shè)計流程框圖 (8)程序清單; 思考題(補充作業(yè)題): 上例中,如果采用CJNE指令,應(yīng)如何修改程序?

18、,返回,ARE EQU 1000H; BUF EQU 2000H; ORG 1000H START:MOV DPTR, #ARE; 數(shù)據(jù)X的地址送數(shù)據(jù)指針DPTR MOVX A, DPTR; A取數(shù)據(jù)X JZ SUL; X0轉(zhuǎn)SUL JB ACC.7, NEG; X0轉(zhuǎn)NEG,否則,X0 MOV A, #01H; SJMP SUL; NEG: MOV A, #0FFH; (0FFH為-1補碼) SUL: MOV DPTR, #BUF; 數(shù)據(jù)Y的地址送數(shù)據(jù)指針DPTR MOVX DPTR, A; 保存Y值 END,返回,首先,在程序中建立一個轉(zhuǎn)移指令表,在表格中存放轉(zhuǎn)移指令,然后,通過查轉(zhuǎn)移指令

19、表的方式實現(xiàn)多分支程序轉(zhuǎn)移。 這種方法主要利用散轉(zhuǎn)指令JMP A+DPTR,此指令采用變址尋址方式,操作過程:(PC)(A)+(DPTR),CPU根據(jù)PC的內(nèi)容來實現(xiàn)多分支程序轉(zhuǎn)移。DPTR中送轉(zhuǎn)移指令表的表首地址(常用轉(zhuǎn)移指令表的名稱標(biāo)號代替),而A中送轉(zhuǎn)移指令表中存放的轉(zhuǎn)移指令的序號(常常從第0條開始)。 例如,有多個分支程序,如要通過AJMP轉(zhuǎn)移指令進行轉(zhuǎn)移,則應(yīng)把這些轉(zhuǎn)移指令按序?qū)懭朕D(zhuǎn)移指令表中,并設(shè)置一個序號指針(例如R3),序號往往從0開始,然后可使用以下查表程序?qū)崿F(xiàn)程序轉(zhuǎn)移。,(b)使用查轉(zhuǎn)移指令表的方法實現(xiàn)多分支程序轉(zhuǎn)移,MOV A, R3; 分支程序序號送A RL A; 分支

20、程序序號乘2 MOV DPTR,#BRTAB; BRTAB為轉(zhuǎn)移指令表名稱標(biāo)號, JMP A+DPTR; 也為轉(zhuǎn)移指令表首地址 BRTAB:AJMP ROUT0; 分支程序0的轉(zhuǎn)移指令 AJMP ROUT1; 分支程序1的轉(zhuǎn)移指令 AJMP ROUT2; AJMP ROUT127; 分支程序127的轉(zhuǎn)移指令 ROUT0: ; 分支程序0 ROUT1: ; ROUT127: ; 分支程序127,由于AJMP指令是二字節(jié)指令,因此,程序中通過RL A指令將分支序號乘2。轉(zhuǎn)移指令表中最多只能安排128條分支轉(zhuǎn)移指令,如需多于128條,則必須另行修改程序。 由于AJMP指令轉(zhuǎn)移范圍是2KB,因此,分支

21、程序應(yīng)安排在以JMP A+DPTR指令為中心的2KB范圍之內(nèi),否則會出錯。 如果轉(zhuǎn)移指令表中的轉(zhuǎn)移指令是LJMP指令,則分支程序可安排在64KB ROM空間的任何地方。但轉(zhuǎn)移指令表中的轉(zhuǎn)移指令的條數(shù)最多為85條(LJMP指令是三字節(jié)指令),上述程序應(yīng)作相應(yīng)的修改。 MOV A, R3; MOV B, #03H; MUL AB;,MOV DPTR,#BRTAB; BRTAB為轉(zhuǎn)移指令表名稱標(biāo)號, JMP A+DPTR; 也為轉(zhuǎn)移指令表首地址 BRTAB:LJMP ROUT0; 分支程序0的轉(zhuǎn)移指令 LJMP ROUT1; 分支程序1的轉(zhuǎn)移指令 LJMP ROUT2; LJMP ROUT85; 分

22、支程序85的轉(zhuǎn)移指令 ROUT0: ; 分支程序0 ROUT1: ; ROUT85:; 分支程序85,例:假設(shè)鍵盤上有4個按鍵,功能說明如下表:程序流程框圖,假設(shè)轉(zhuǎn)移指令表名稱為BRTAB,分支程序序號已在A 中。 MOV DPTR, #BRTAB CLR C RLC A JMP A+DPTR; ORG 3000H 3000H BRTAB:AJMP ER; 轉(zhuǎn)刪除分支程序,3000H BRTAB:AJMP ER; 轉(zhuǎn)刪除分支程序 3001H 3002H AJMP DS; 轉(zhuǎn)讀數(shù)據(jù)分支程序 3003H 3004H AJMP XS; 轉(zhuǎn)寫數(shù)據(jù)分支程序 3005H 3006H AJMP CR; 轉(zhuǎn)插

23、入分支程序 3007H ORG 3100H 3100H ER:; 刪除分支程序 ORG 3200H 3200H DS:; 讀數(shù)據(jù)分支程序 ORG 3300H 3300H XS:; 寫數(shù)據(jù)分支程序 ORG 3400H 3400H CR:; 插入分支程序 END,返回,4.2.3 循環(huán)程序結(jié)構(gòu),MCS-51匯編語言指令系統(tǒng)沒有專用的循環(huán)指令,但可以使用條件轉(zhuǎn)移指令通過條件判斷來控制循環(huán)是繼續(xù)還是結(jié)束。 循環(huán)程序一般由四個主要部分組成: (1)初始化部分:為循環(huán)程序做準(zhǔn)備,如規(guī)定循環(huán)次數(shù)、給各變量和地址指針預(yù)置初值。 (2)處理部分: 為反復(fù)執(zhí)行的程序段,是循環(huán)程序的實體, 也是循環(huán)程序的主體。 (

24、3)循環(huán)控制部分: 其作用是修改循環(huán)變量和控制變量,并判斷循環(huán)是否結(jié)束,直到符合結(jié)束條件時,跳出循環(huán)為止。 (4)結(jié)束部分: 這部分主要是對循環(huán)程序的結(jié)果進行分析、處理和存放。,單循環(huán)程序一般有以下兩種典型結(jié)構(gòu):,雙重循環(huán)程序的結(jié)構(gòu):,在應(yīng)用系統(tǒng)程序設(shè)計時,有時經(jīng)常需要將數(shù)據(jù)存儲器中各部分地址單元作為工作單元,以存放程序執(zhí)行的中間值或執(zhí)行結(jié)果, 因此,在使用這些工作單元之前,必須將工作單元清零。工作單元清零可用循環(huán)程序完成。 例:假設(shè)在內(nèi)部RAM區(qū),開辟96個工作單元,工作單元首地址為20H,則工作單元清零程序子程序如下: ORG 1000H CLR0:MOV R0, #20H;循環(huán)初始化部分

25、 MOV R7, #96; CLR A LOOP:MOV R0, A; 循環(huán)體部分 INC R0; 修改變量 DJNZ R7, LOOP;循環(huán)控制部分 RET END 思考題(補充作業(yè)題):如采用CJNE指令,應(yīng)如何修改程序?,例:兩個三字節(jié)二進制無符號數(shù)相加,被加數(shù)放在內(nèi)部RAM 20H22H單元(低字節(jié)存放在低地址單元,高字節(jié)存放在高地址單元,即低位在前,高位在后),加數(shù)放在2AH2CH單元,和放在20H22H單元,最高位如有進位,則放在23H單元中。 解:數(shù)據(jù)類型(二、十進制數(shù),有、無符號數(shù));數(shù)據(jù)結(jié)構(gòu)(升、降序排列),被加數(shù) N1 高字節(jié)(8位) 中字節(jié)(8位) 低字節(jié)(8位) 加數(shù)

26、N2 高字節(jié)(8位) 中字節(jié)(8位) 低字節(jié)(8位) +)進位位(CY) 進位位(CY) 進位位(CY) 和 N3 進位 高字節(jié)(8位) 中字節(jié)(8位) 低字節(jié)(8位) 程序流程框圖 程序清單 思考題:統(tǒng)計正數(shù)、負(fù)數(shù)、零的個數(shù)。,ORG 0030H ADDDUO:MOV R0, #20H; 循環(huán)初始化部分 MOV R1, #2AH; MOV R7, #03H; 循環(huán)次數(shù) CLR C; LOOP:MOV A, R0; 循環(huán)體部分 ADDC A, R1; MOV R0, A; INC R0; 修改指針變量 INC R1; DJNZ R7, LOOP; 循環(huán)控制部分 CLR A; 循環(huán)結(jié)束處理部分

27、ADDC A, #00H; MOV R0, A; RET; END,返回,返回,例:把內(nèi)部RAM中起始地址為DATA的數(shù)據(jù)串傳送到外部RAM以BUFFER為首地址的區(qū)域,直到發(fā)現(xiàn)“$”字符的ASC碼為止,同時規(guī)定數(shù)據(jù)串最大長度為32個字節(jié)。 解:(1)分析任務(wù):數(shù)據(jù)傳送;(2)算法:比較、控制轉(zhuǎn)移 (3)程序結(jié)構(gòu):分支、循環(huán)(4)數(shù)據(jù)類型:多字節(jié)字符串 (5)RAM單元安排:內(nèi)部RAM單元、外部RAM單元 (6)采用寄存器間接尋址方式(R0、R1或DPTR),(7)程序流程框圖;,ORG 0030H DATACS:MOV R0, #DATA; DATA數(shù)據(jù)區(qū)首地址 MOV DPTR, #BUF

28、FER;BUFFER數(shù)據(jù)區(qū)首地址 MOV R1, #20H; 最大數(shù)據(jù)串長 LOOP:MOV A, R0; 取數(shù)據(jù) SUBB A, #24H; 判是否為“$”字符 JZ LOOP1; 是“$”字符,轉(zhuǎn)結(jié)束 MOVX DPTR,A; 數(shù)據(jù)傳送 INC R0; INC DPTR; DJNZ R1, LOOP; 循環(huán)控制 LOOP1:RET; 結(jié)束 END,4.3 80C51單片機匯編語言程序設(shè)計舉例,4.3.2 定時程序 在單片機的控制應(yīng)用中,常有定時的需要,如定時中斷、定時檢測和定時掃描等。定時功能除可以使用純硬件電路、可編程定時/計數(shù)器實現(xiàn)外,還可以使用軟件程序(定時程序)完成。 定時程序是典

29、型的循環(huán)程序,它是通過執(zhí)行一個具有固定延遲時間的循環(huán)體來實現(xiàn)定時的。 (1)單循環(huán)定時程序 MOV R5, #TIME; LOOP: NOP; NOP; DJNZ R5, LOOP;,假設(shè)單片機晶振頻率fosc=6MHz,則一個機器周期為2s,NOP、DJNZ指令分別是單、雙機器周期指令。定時程序的總延遲時間是循環(huán)程序段延時時間的整數(shù)倍,由于R5是8位寄存器,因此,這個定時程序的最長定時時間為: 256(28)8=2048(s) (2)較長時間的定時程序 (多重循環(huán)定時子程序) TIME:MOV R5, #TTME1; LOOP:MOV R4, #TEME2; LOOP1:NOP; NOP;

30、DJNZ R4, LOOP1; DJNZ R5, LOOP2; RET;,這個定時子程序的最長定時時間為: 256(28)4+2+1256(28)2+4=525828(s) (3)調(diào)整定時時間 在定時程序中可通過在循環(huán)程序段中增減指令的方法對定時時間進行微調(diào)。 例: MOV R0, #TTME; LOOP:ADD A, R1; INC DPTR; DJNZ R0, LOOP; 由于ADD、INC、DJNZ指令的機器周期分別為1、2、2,所以,該程序定時時間為=(1+2+2)2sTime(s)。,假定要求定時時間為24us。對于這個定時程序,只須增加一條NOP指令即可實現(xiàn)。 MOV R0, #T

31、IME; LOOP: ADD A, R1; INC DPTR; NOP; DJNZ R0, LOOP; 只須TIME取2,即可得到精確的24s定時。 (4)以一個基本的延時程序滿足不同的定時要求 如果一個系統(tǒng)有多個定時需要,我們就可以設(shè)計一個基本延時程序,使其延時時間為各定時時間的最大公約數(shù),然后可以以此基本程序作為子程序,通過調(diào)用的方法實現(xiàn)所需不同定時。,例:在單片機應(yīng)用系統(tǒng)中,假設(shè)需要的定時時間分別為5S、10S、20S,可設(shè)計一個1S延時子程序DELAY,則5S、10S、20S的定時時間可通過調(diào)用DELAY實現(xiàn)。 MOV R0, #05H; 5S定時 LOOP: LCALL DELAY;

32、 DJNZ R0, LOOP1; MOV R0, #0AH; 10S定時 LOOP2: LCALL DELAY; DJNZ R0, LOOP2; MOV R0, #14H; 20S定時 LOOP3: LCALL DELAY; DJNZ R0, LOOP3; ,4.3.3 查表程序 所謂查表程序,就是指預(yù)先把數(shù)據(jù)以表格形式存放在程序存儲器中,然后使用程序讀出,這種能讀出表格數(shù)據(jù)的程序就稱之為查表程序。 查表操作對單片機的控制應(yīng)用十分重要,查表程序常用于實現(xiàn)非線性修正,非線性函數(shù)轉(zhuǎn)換以及代碼轉(zhuǎn)換等場合。 MCS-51單片機指令系統(tǒng)中有兩條專用查表指令: (1)MOVC A, A+DPTR;A(A)

33、+(DPTR) (2)MOVC A, A+PC; A(A)+(PC) 這兩條查表指令的功能是完全相同的,其共同優(yōu)點是:能在不改變PC和DPTR的狀態(tài)下,只根據(jù)A的內(nèi)容就可以取出表格中的數(shù)據(jù)。注意:A的內(nèi)容均為8位無符號數(shù)。,對于第一條指令,適用于64KB ROM范圍內(nèi)查表(即數(shù)據(jù)表格的大小和位置可以在64KB程序存儲器中任意安排,一個數(shù)據(jù)表格可以被多個程序塊使用),編寫查表程序時,首先把表的首地址送入DPTR中,再要將查表的數(shù)據(jù)序號(或下標(biāo)值)送入A中,然后就可以使用該指令進行查表操作,并把結(jié)果送A中。 對于第二條指令,常用于“本地”范圍查表(即數(shù)據(jù)表格只能放在該指令后面256個地址單元之內(nèi),

34、而且表格只能被本程序使用),編寫查表程序時,首先把查表數(shù)據(jù)的序號送入A中,再把從查表指令的下一條指令的首地址到表的首地址間的偏移量與A值相加,然后再使用該指令進行查表操作,并把結(jié)果送入A中。,例:設(shè)計一個子程序,其功能為根據(jù)x的內(nèi)容(09之間)查平方表,求出相應(yīng)的結(jié)果y(y=x2)。假設(shè)x的內(nèi)容已存放在內(nèi)部RAM 30H單元中,求出y的內(nèi)容存放在內(nèi)部RAM 40H單元中。 ORG 1000H 1000H SQR: MOV A, 30H; Ax 1002H PUSH DPH; 現(xiàn)場保護 1004H PUSH DPL; 1006H MOV DPTR,#TAB1; DPTR表首地址TAB1 1009

35、H MOVC A, A+DPTR;查表得y 100AH MOV 40H, A; 40Hy 100CH POP DPL; 現(xiàn)場恢復(fù) 100EH POP DPH; 1010H RET 1011H TAB1: DB 00H,01H,04H,09H,10H,19H DB 24H,31H,40H,51H,上例中,如果使用MOVC A,A+PC指令,則編程如下: ORG 1000H 1000H SQR: MOV A, 30H; Ax 1002H PUSH DPH; 現(xiàn)場保護 1004H PUSH DPL; 1006H ADD A, #07H; 加偏移量 1008H MOVC A, A+PC; 查表得y 1

36、009H MOV 40H, A; 40Hy 100BH POP DPL; 現(xiàn)場恢復(fù) 100DH POP DPH; 100FH RET 1010H TAB1: DB 00H,01H,04H,09H,10H,19H DB 24H,31H,40H,51H 此題中,偏移量=1010H-1009H=07H,4.4 單片機匯編語言源程序的編輯和匯編 4.5 80C51單片機匯編語言偽指令,匯編語言程序必須轉(zhuǎn)換為二進制的機器代碼程序,單片機才能夠執(zhí)行。匯編語言程序轉(zhuǎn)換為機器代碼程序的過程,稱之為匯編。匯編的方法有兩種:即機器交叉匯編和手工匯編。 所謂手工匯編,就是指程序設(shè)計人員通過查指令編碼表,逐個把助記符

37、指令“翻譯”成機器碼。手工匯編方法通常用于短、小程序的匯編。長程序則必須通過機器交叉匯編的方法進行匯編。 所謂機器交叉匯編,就是指程序設(shè)計人員使用一種計算機的匯編程序去匯編另一種計算機的源程序,具體地說就是運行匯編程序進行匯編的是一種計算機,而運行匯編得到的目標(biāo)程序的則是另一種計算機。 單片機只能采用機器交叉匯編的方法對匯編語言程序進行匯編,對匯編語言程序進行機器交叉匯編時,必須告訴計算機的匯編程序應(yīng)該如何完成匯編工作,這一任務(wù)就是通過使用偽指令來實現(xiàn)的。 偽指令是程序設(shè)計人員發(fā)給匯編程序的指令,也稱匯編命令或匯編程序控制指令。它具有控制匯編程序的輸入輸出、定義數(shù)據(jù)和符號、條件匯編、分配存儲空

38、間等功能。 偽指令沒有與之相對應(yīng)的二進制機器代碼,因此,在匯編語言指令系統(tǒng)匯總表中,查不到相對應(yīng)的二進制機器代碼。不同匯編語言的偽指令也有所不同,但一些基本指令是相同的。 手工匯編不需要偽指令,但機器交叉匯編必須使用偽指令。在對匯編語言程序進行機器交叉匯編前,偽指令存在于匯編語言程序中,但匯編后得到的機器代碼程序中不存在偽指令相對應(yīng)的二進制機器代碼,這一點請?zhí)貏e注意。,(1)ORG(ORiGin)匯編起始地址命令 本命令總出現(xiàn)在匯編語言源程序的開頭位置,用于規(guī)定目標(biāo)程序的起始地址,即此命令后面的程序或數(shù)據(jù)塊的起始地址。 命令格式:標(biāo)號:ORG地址 其中標(biāo)號:是選擇項,根據(jù)需要選用,地址項,通常

39、為16位絕對地址,但也可以使用標(biāo)號或表達式表示。 在匯編語言程序的開始,通常都用一條ORG偽指令來規(guī)定程序的起始地址,如果不用ORG規(guī)定,則匯編得到的目標(biāo)程序?qū)?000H開始。 例: ORG 8000H 即規(guī)定標(biāo)號START代表地址8000H, START:MOV A, #00H; 目標(biāo)程序的第一條指令從8000H 開始。,(2)END(END of assembly)匯編終止命令 本命令用于終止匯編語言源程序的匯編工作,END是匯編語言源程序的結(jié)束標(biāo)志,因此,在整個匯編語言源程序中只能有一個END指令,且位于程序的最后。如果END命令出現(xiàn)在程序中間,則在END之后的指令,匯編程序?qū)⒉挥杼幚?/p>

40、。 命令格式:標(biāo)號:END表達式 (3)EQU(EQUate)賦值命令 本命令用于給字符名稱賦予一個特定值,賦值以后,其值在整個程序中有效。 命令格式:字符名稱EQU賦值項 其中賦值項可以是常數(shù),地址,標(biāo)號或表達式,其值為8位或16位二進制數(shù)。賦值以后的字符名稱既可以作地址使用,也可以作立即數(shù)使用。,例: HOUR EQU 30H ORG 1000H START:MOV HOUR, #40H; 等同于 START:MOV 30H, #40H; (4)DB(Define Byte)定義數(shù)據(jù)字節(jié)命令 本命令用于從指定的地址單元開始,在程序存儲器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。 命令格式:標(biāo)號:DB8位數(shù)

41、表 常使用本命令存放數(shù)據(jù)表格。 例:存放7段數(shù)碼管(共陽極)顯示的十六進制基數(shù)(0F)的十六進制數(shù)的字形代碼,可使用多條DB命令定義。,DB 0C0H,0F9H,0A4H,0B0H; 0,1,2,3 DB 99H, 92H, 82H, 0F8H; 4,5,6,7 DB 80H, 90H, 88H, 83H; 8,9,A,B DB 0C6H,0A1H,86H, 84H; C,D,E,F(xiàn) 查表時,為確定數(shù)據(jù)區(qū)的起始地址,可采用兩種方法: a)根據(jù)DB命令前一條指令的地址確定。把該地址加上它的字節(jié)數(shù)就是DB的定義的數(shù)據(jù)字節(jié)的起始地址。 例:8100: MOV A, #49H;一字節(jié)指令 TAB: D

42、B 0COH,0F9H,0A4H,0B0H; 定義的7段數(shù)碼管(共陽極)顯示的十六進制基數(shù)(0F)的十六進制數(shù)的字形代碼從8101H地址單元開始存放。,b)使用0RG命令專門規(guī)定。 例: ORG 8100H TAB: DB 0COH,0F9H,0A4H,0B0H; 定義的7段數(shù)碼管(共陽極)顯示的十六進制基數(shù)(0F)的十六進制數(shù)的字形代碼從8101H地址單元開始存放。 (5)DW(Define Word)定義數(shù)據(jù)字命令 本命令用于從指定地址開始,在程序存儲器單元中定義16位的數(shù)據(jù)字。 命令格式:標(biāo)號:DW16位數(shù)表 存放時,數(shù)據(jù)字的高8位在前(低地址),低8位在后(高地址)。,例:DW “AA

43、”; 存入41H,42H。 DB和DW定義的數(shù)表,數(shù)的個數(shù)不得超過80個。如數(shù)據(jù)的數(shù)目較多時,可使用多個定義命令。 在MCS-51程序設(shè)計應(yīng)用中,常以DB來定義數(shù)據(jù),以DW來定義地址。 (6)DS(Define Stonage)定義存儲區(qū)命令 本命令用于從指定地址開始,保留指定數(shù)目的字節(jié)單元作為存儲器,供程序運行使用,匯編時,對這些單元不賦值。 命令格式:標(biāo)號:DS 16位數(shù)表 例: ORG 8100H DS 08H 從8100H地址開始,保留8個連續(xù)的地址單元。,(7)BIT 位定義命令 本命令用于給字符名稱賦以位地址 命令格式:字符名稱BIT位地址 其中位地址可以是絕對地址,也可以是符號地

44、址(即位符號名稱) 例: AQ BIT P1.0 把P1.0的位地址賦給變量AQ,在其后的編程中,AQ就可以作為位地址使用。,補充內(nèi)容:子程序結(jié)構(gòu),子程序結(jié)構(gòu)是一種非常重要的程序結(jié)構(gòu)。在一個程序中經(jīng)常遇到反復(fù)多次某程序段的情況,如果重復(fù)書寫這個程序段,會使程序變得冗長而雜亂。對此,可采用子程序結(jié)構(gòu),即把重復(fù)的程序段編寫為一個子程序,通過主程序調(diào)用而使用它。這樣不但減少了編程工作量,而且也縮短了程序的長度。 調(diào)用和返回構(gòu)成了子程序調(diào)用的完整過程。為了實現(xiàn)這一過程,必須有子程序調(diào)用指令和返回指令。調(diào)用指令在主程序中使用,而返回指令則應(yīng)該是子程序的最后一條指令。執(zhí)行完這條指令后,程序返回主程序斷點處

45、繼續(xù)執(zhí)行。,(1)子程序的編程原則 在實際的單片機應(yīng)用系統(tǒng)軟件設(shè)計中,為了程序結(jié)構(gòu)更加清晰,易于設(shè)計,易于修改,增強程序可讀性,基本上都要使用子程序結(jié)構(gòu)。子程序作為一個具有獨立功能的程序段,編程時需遵循以下原則: a)子程序的第一條指令必須有標(biāo)號,明確子程序入口地址; b)以返回指令RET結(jié)束子程序; c)子程序說明部分; 子程序名稱:提供給主程序調(diào)用的名字,通常用符號或子程 序第一條語句的標(biāo)號來表示。 子程序功能:簡要說明子程序能完成的主要功能。 子程序入口參數(shù):主程序需要向子程序提供的參數(shù)。,子程序出口參數(shù):子程序執(zhí)行完之后向主程序返回的參數(shù)。 子程序占用資源:子程序中使用了哪些存儲單元、寄存器等 子程序堆棧深度:子程序占用堆棧區(qū)的最大字節(jié)數(shù)。 子程序嵌套情況:子程序中繼續(xù)調(diào)用子程序的情況。 子程序的字節(jié)數(shù):子程序中所有指令字節(jié)數(shù)的總和。 子程序執(zhí)行時間:子程序中所有指令的機器周期數(shù)總和。 這些說明是寫給程序員看的,供以后使用子程序時參考。 d)較強的通用性和可浮動性,盡可能避免使用具體的內(nèi)存單元和絕對轉(zhuǎn)移地址等。 e)注意保護現(xiàn)場和恢復(fù)現(xiàn)場。 子程序在編制過程中經(jīng)常會用到一些通用單元,如工作寄存器、累加器、數(shù)據(jù)指針DPTR以及PSW等。而這些工作單元在調(diào)

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論