




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
單片機匯編語言程序設計第1頁,課件共71頁,創作于2023年2月4.1單片機程序程序設計語言概述4.1.1機器語言和匯編語言4.1.2單片機使用的高級語言(1)BASIC語言(2)C語言(3)PL/M語言4.1.380C51單片機匯編語言的語句格式第2頁,課件共71頁,創作于2023年2月匯編語言程序設計必須注意如下特點:(1)設計人員必須詳細了解單片機的硬件結構,以便在程序設計中熟練使用;(2)必須熟悉匯編語言指令的功能和用法;(3)在程序設計前,必須分析設計任務,確定所用算法,確定程序結構,確定數據的類型、數據的結構,必須對數據的存放、寄存器和工作單元的使用以及所用硬件資源等作出具體安排;(4)根據分析,畫出程序設計流程圖;(5)根據程序設計流程圖編寫程序。第3頁,課件共71頁,創作于2023年2月4.2匯編語言程序的基本結構形式
單片機匯編語言程序設計的基本結構形式一般分為以下4種形式,即順序結構、分支結構、循環結構和子程序結構。4.2.1順序程序結構順序程序是最簡單的程序結構,在順序程序中,既無分支,循環,也不調用子程序,程序執行時一條一條地按順序執行指令例:假定三字節無符號數相加,其中一個加數在內部RAM的50H、51H和52H單元中,另一個加數在內部RAM的53H、54H和55H單元中,要求把相加之和存放在50H、51H和52H單元中,進位存放在位尋址區的00H位中。解:(1)分析任務:求兩數之和(2)算法:加法運算(ADD或ADDC)
第4頁,課件共71頁,創作于2023年2月
(3)程序結構:順序或循環結構(4)數據類型:三字節、二進制、無符號數(5)數據結構:升序或降序排列
(6)RAM單元安排:(內部RAM字節單元、位地址空間)(7)采用寄存器間接尋址方式(R0、R1)加數(N1)高字節(8位)中字節(8位)低字節(8位)加數(N2)高字節(8位)中字節(8位)低字節(8位)加數(N1)加數(N2)和(N3)52H單元低字節(8位)55H單元低字節(8位)52H單元低字節(8位)51H單元中字節(8位)54H單元中字節(8位)51H單元中字節(8位)50H單元高字節(8位)52H單元高字節(8位)50H單元高字節(8位)00H位進位位第5頁,課件共71頁,創作于2023年2月
(8)程序設計流程框圖;第6頁,課件共71頁,創作于2023年2月
(9)程序清單;
ORG1000HMOVRO,#52H;加數N1的低字節地址送地址指針R0MOVR1,#55H;加數N2的低字節地址送地址指針R1MOVA,@R0;取N1的低字節
ADDA,@R1;N1、N2低字節相加
MOV@R0,A;保存N1、N2低字節和
DECR0;修改加數N1的地址指針內容
DECR1;修改加數N2的地址指針內容
MOVA,@R0;取N1的中間字節
ADDCA, @R1;N1、N2中間字節帶低字節和進位相加
MOV@R0,A;保存N1、N2中間字節和
DECR0;修改加數N1的地址指針內容第7頁,課件共71頁,創作于2023年2月DECR1;修改加數N2的地址指針內容
MOVA,@R0;取N1的高字節
ADDCA,@R1;N1、N2高字節帶中間字節和進位相加
MOV@R0,A;保存N1、N2高字節和
MOV00H,
C;高字節和的進位送00H位保存
END
思考題:
1)上述程序中,如果只采用ADDC指令,應如何修改程序?
2)如果N1、N2,N3均為十進制數,應如何修改程序?
3)如果加數N1在內部RAM50H、51H和52H單元中,而加數N2與和N3均在外部RAM0053H、0054H和0055H單元中,其它條件不變,應如何修改程序?
4)如果N1、N2,N3均存放在外部RAM單元,應如何修改程序?第8頁,課件共71頁,創作于2023年2月思考題:1)ORG1000HMOVRO,#52H;加數N1的低字節地址送地址指針R0MOVR1,#55H;加數N2的低字節地址送地址指針R1MOVA,@R0;取N1的低字節
CLRC;清原來進位位CY的內容
ADDCA,@R1;N1、N2低字節相加
MOV@R0,A;保存N1、N2低字節和
DECR0;修改加數N1的地址指針內容
DECR1;修改加數N2的地址指針內容
MOVA,@R0;取N1的中間字節
ADDCA, @R1;N1、N2中間字節帶低字節和進位相加
MOV@R0,A;保存N1、N2中間字節和
DECR0;修改加數N1的地址指針內容第9頁,課件共71頁,創作于2023年2月DECR1;修改加數N2的地址指針內容
MOVA,@R0;取N1的高字節
ADDCA,@R1;N1、N2高字節帶中間字節和進位相加
MOV@R0,A;保存N1、N2高字節和
MOV00H,
C;高字節和的進位送00H位保存
END
思考題:2)ORG1000HMOVRO,#52H;加數N1的低字節地址送地址指針R0MOVR1,#55H;加數N2的低字節地址送地址指針R1MOVA,@R0;取N1的低字節
ADDA,@R1;N1、N2低字節相加
DAA;N1、N2低字節和十進制調整
MOV@R0,A;保存N1、N2低字節和第10頁,課件共71頁,創作于2023年2月DECR0;修改加數N1的地址指針內容
DECR1;修改加數N2的地址指針內容
MOVA,@R0;取N1的中間字節
ADDCA, @R1;N1、N2中間字節帶低字節和進位相加
DAA;N1、N2中間字節和十進制調整
MOV@R0,A;保存N1、N2中間字節和
DECR0;修改加數N1的地址指針內容
DECR1;修改加數N2的地址指針內容
MOVA,@R0;取N1的高字節
ADDCA,@R1;N1、N2高字節帶中間字節和進位相加
DAA;N1、N2高字節和十進制調整
MOV@R0,A;保存N1、N2高字節和
MOV00H,
C;高字節和的進位送00H位保存
END第11頁,課件共71頁,創作于2023年2月思考題3)ORG1000HMOVRO,#52H;加數N1的低字節地址送地址指針R0MOVR1,#55H;加數N2的低字節地址送地址指針R1
MOVXA,@R1;取N2的低字節
ADDA,@R0;N1、N2低字節相加
MOVX@R1,A;保存N1、N2低字節和
DECR0;修改加數N1的地址指針內容
DECR1;修改加數N2的地址指針內容
MOVXA,@R1;取N2的中間字節
ADDCA, @R0;N1、N2中間字節帶低字節和進位相加
MOVX@R1,A;保存N1、N2中間字節和
DECR0;修改加數N1的地址指針內容第12頁,課件共71頁,創作于2023年2月DECR1;修改加數N2的地址指針內容
MOVXA,@R1;取N2的高字節
ADDCA,@R0;N1、N2高字節帶中間字節和進位相加
MOVX@R1,A;保存N1、N2高字節和
MOV00H,
C;高字節和的進位送00H位保存
END
如果N2、N3的數據地址指針采用DPTR,則程序修改如下:
ORG1000HMOVRO,#52H;加數N1的低字節地址送地址指針R0
MOVDPTR,#0055H;加數N2的低字節地址送DPTR
MOVXA,@DPTR;取N2的低字節
ADDA,@R0;N1、N2低字節相加
MOVX@DPTR,A;保存N1、N2低字節和
DECR0;修改加數N1的地址指針內容第13頁,課件共71頁,創作于2023年2月
MOVDPTR,#0054H;修改加數N2的地址指針內容
MOVXA,@DPTR;取N2的中間字節
ADDCA, @R0;N1、N2中間字節帶低字節和進位相加
MOVX@DPTR,A;保存N1、N2中間字節和
DECR0;修改加數N1的地址指針內容
MOVDPTR,#0053H;修改加數N2的地址指針內容
MOVXA,@DPTR;取N2的高字節
ADDCA, @R0;N1、N2高字節帶中間字節和進位相加
MOVX@DPTR,A;保存N1、N2高字節和
MOV00H,
C;高字節和的進位送00H位保存
END
思考:修改加數N2的數據地址指針DPTR的內容可否采用
DECDPTR指令?第14頁,課件共71頁,創作于2023年2月例:設內部RAM40H,41H單元中分別存放8位二進制數,現分別取這兩個單元中的半個字節,合并成一個新字節存放在42H單元中。要求如下:42H單元新字節的低半字節取自40H單元的低半字節,而高半字節取自41H單元的低半字節。解:(1)分析任務:拆字、合字第15頁,課件共71頁,創作于2023年2月
(2)算法:邏輯運算(3)程序結構:順序(4)數據類型:單字節、二進制、無符號數(5)數據結構:升序或降序排列
(6)程序設計流程框圖;第16頁,課件共71頁,創作于2023年2月
(7)程序清單;
ORG2000HSTART:MOVR1,#40H;初始化數據指針R1的內容
MOVA,@R1;取40H單元內容送AANLA,#0FH;保留40H單元內容低4位
INCR1;修改數據指針R1的內容
XCHA,@R1;(A)與@R1內容互換
ANLA,#0FH;保留41H單元內容低四位
SWAPA;41H單元內容高低半字節互換
ORLA,@R1;合字生成新字節
INCR1;修改數據指針R1的內容
MOV@R1,A;新字節送42H單元保存
END作業題:上例中其它條件不變,要求如下:42H單元新字節的低半字節取自40H單元的低半字節,而高半字節取自41H單元的高半字節。第17頁,課件共71頁,創作于2023年2月(1)單分支程序單分支程序是通過條件轉移指令實現的,即根據條件對程序的執行進行判斷,滿足條件則進行程序轉移,不滿足條件程序就順序執行。在MCS-51指令系統中,可利用JZ,JNZ,CJNE,DJNZ,JC,JNC,JB,JNB,JBC等指令,完成為0、為1、為正、為負以及相等、不相等等各種條件判斷。例:兩個8位無符號二進制數比較大小。假設在外部RAM中有ST1、ST2和ST3共3個連續單元(單元地址從小到大),其中ST1、ST2單元中存放著兩個8位無符號二進制數N1,N2,要求找出其中的大數并存入ST3單元中。4.2.2分支程序結構第18頁,課件共71頁,創作于2023年2月解:(1)分析任務:比較兩個數的大小(2)算法:算術運算、控制轉移(3)程序結構:單分支(4)數據類型:單字節、二進制、無符號數(5)數據結構:單元地址升序排列
(6)RAM單元安排:外部RAM單元(7)采用寄存器間接尋址方式(R0、R1或DPTR)(8)程序設計流程框圖;(9)程序清單;思考題(補充作業題):上例中,如果采用CJNEA,direct,rel指令,應如何修改程序?第19頁,課件共71頁,創作于2023年2月返回第20頁,課件共71頁,創作于2023年2月ORG8000HSTART:CLRC;進位清0MOVDPTR,#ST1;設數據指針
MOVXA, @DPTR;A←((ST1)),取N1MOVR2,A;暫存N1INCDPTR;DPTR←ST2(指向N2單元)
MOVXA,@DPTR;取N2存于A中
SUBBA,R2;N1,N2比較(N2-N1,差在A中)
JNCBIG1;N2≥N1,轉BIG1,N2<N1,順序執行
XCHA, R2;N1,N2互換,A←N1SJMPBIG0BIG1:MOVXA, @DPTR;A←N2BIGO:INCDPTR;DPTR←ST3(指向N3單元)
MOVX@DPTR,A;ST3←大數
END返回
第21頁,課件共71頁,創作于2023年2月(2)多分支程序假設多分支程序中,分支序號的最大值為n,則多分支轉移結構如圖所示:
MCS-51指令系統沒有多分支轉移指令,無法使用單條指令完成多分支轉移。要實現多分支轉移,可采用以下幾種方法:第22頁,課件共71頁,創作于2023年2月
假設分支序號值保存在累加器A中,則可使用CJNEA,#data,rel指令,其分支流程如圖所示:
(a)使用多條CJNE指令,通過逐次比較,實現分支程序轉移第23頁,課件共71頁,創作于2023年2月例:已知:127≥X≥-128,求Y。設X,Y分別存放在外部RAM1000H和2000H單元中。解:(1)分析任務:解方程(2)算法:控制轉移(3)程序結構:多分支(4)數據類型:單字節、二進制、有符號數(5)RAM單元安排:外部RAM單元(6)采用寄存器間接尋址方式(R0、R1或DPTR)(7)程序設計流程框圖(8)程序清單;思考題(補充作業題):上例中,如果采用CJNE指令,應如何修改程序?第24頁,課件共71頁,創作于2023年2月返回第25頁,課件共71頁,創作于2023年2月AREEQU1000H;
BUFEQU2000H;
ORG1000HSTART:MOVDPTR,#ARE;數據X的地址送數據指針DPTRMOVXA,@DPTR;A←取數據XJZSUL;X=0轉SULJBACC.7,NEG;X<0轉NEG,否則,X>0MOVA,#01H;
SJMPSUL;
NEG:MOVA,#0FFH;(0FFH為-1補碼)SUL:MOVDPTR,#BUF;數據Y的地址送數據指針DPTRMOVX@DPTR,A;保存Y值
END返回第26頁,課件共71頁,創作于2023年2月
首先,在程序中建立一個轉移指令表,在表格中存放轉移指令,然后,通過查轉移指令表的方式實現多分支程序轉移。這種方法主要利用散轉指令JMP@A+DPTR,此指令采用變址尋址方式,操作過程:(PC)←((A)+(DPTR)),CPU根據PC的內容來實現多分支程序轉移。DPTR中送轉移指令表的表首地址(常用轉移指令表的名稱標號代替),而A中送轉移指令表中存放的轉移指令的序號(常常從第0條開始)。例如,有多個分支程序,如要通過AJMP轉移指令進行轉移,則應把這些轉移指令按序寫入轉移指令表中,并設置一個序號指針(例如R3),序號往往從0開始,然后可使用以下查表程序實現程序轉移。(b)使用查轉移指令表的方法實現多分支程序轉移第27頁,課件共71頁,創作于2023年2月MOVA,R3;分支程序序號送ARLA;分支程序序號乘2MOVDPTR,#BRTAB;BRTAB為轉移指令表名稱標號,
JMP@A+DPTR;也為轉移指令表首地址BRTAB:AJMPROUT0;分支程序0的轉移指令
AJMPROUT1;分支程序1的轉移指令
AJMPROUT2;┇
AJMPROUT127;分支程序127的轉移指令ROUT0:………;分支程序0ROUT1:………;┇ROUT127:………;分支程序127第28頁,課件共71頁,創作于2023年2月
由于AJMP指令是二字節指令,因此,程序中通過RLA指令將分支序號乘2。轉移指令表中最多只能安排128條分支轉移指令,如需多于128條,則必須另行修改程序。由于AJMP指令轉移范圍是2KB,因此,分支程序應安排在以JMP@A+DPTR指令為中心的2KB范圍之內,否則會出錯。如果轉移指令表中的轉移指令是LJMP指令,則分支程序可安排在64KBROM空間的任何地方。但轉移指令表中的轉移指令的條數最多為85條(LJMP指令是三字節指令),上述程序應作相應的修改。
MOVA,R3;
MOVB,#03H;
MULAB;第29頁,課件共71頁,創作于2023年2月MOVDPTR,#BRTAB;BRTAB為轉移指令表名稱標號,
JMP@A+DPTR;也為轉移指令表首地址BRTAB:LJMPROUT0;分支程序0的轉移指令
LJMPROUT1;分支程序1的轉移指令
LJMPROUT2;┇
LJMPROUT85;分支程序85的轉移指令ROUT0:………;分支程序0ROUT1:………;┇ROUT85:………;分支程序85第30頁,課件共71頁,創作于2023年2月例:假設鍵盤上有4個按鍵,功能說明如下表:程序流程框圖鍵功能鍵值(分支程序序號)鍵處理程序(分支程序)刪除00HER讀數據01HDS寫數據02HXS插入03HCR
假設轉移指令表名稱為BRTAB,分支程序序號已在A中。
MOVDPTR,#BRTABCLRCRLCAJMP@A+DPTR;
ORG3000H3000HBRTAB:AJMPER;轉刪除分支程序第31頁,課件共71頁,創作于2023年2月3000HBRTAB:AJMPER;轉刪除分支程序3001H3002HAJMPDS;轉讀數據分支程序3003H3004HAJMPXS;轉寫數據分支程序3005H3006HAJMPCR;轉插入分支程序3007HORG3100H3100HER:………………;刪除分支程序
ORG3200H3200HDS:………………;讀數據分支程序
ORG3300H3300HXS:………………;寫數據分支程序
ORG3400H3400HCR:………………;插入分支程序
END第32頁,課件共71頁,創作于2023年2月返回第33頁,課件共71頁,創作于2023年2月4.2.3循環程序結構MCS-51匯編語言指令系統沒有專用的循環指令,但可以使用條件轉移指令通過條件判斷來控制循環是繼續還是結束。循環程序一般由四個主要部分組成:
(1)初始化部分:為循環程序做準備,如規定循環次數、給各變量和地址指針預置初值。(2)處理部分:為反復執行的程序段,是循環程序的實體,也是循環程序的主體。(3)循環控制部分:其作用是修改循環變量和控制變量,并判斷循環是否結束,直到符合結束條件時,跳出循環為止。(4)結束部分:這部分主要是對循環程序的結果進行分析、處理和存放。第34頁,課件共71頁,創作于2023年2月
單循環程序一般有以下兩種典型結構:第35頁,課件共71頁,創作于2023年2月
雙重循環程序的結構:第36頁,課件共71頁,創作于2023年2月
在應用系統程序設計時,有時經常需要將數據存儲器中各部分地址單元作為工作單元,以存放程序執行的中間值或執行結果,因此,在使用這些工作單元之前,必須將工作單元清零。工作單元清零可用循環程序完成。例:假設在內部RAM區,開辟96個工作單元,工作單元首地址為20H,則工作單元清零程序子程序如下:ORG1000HCLR0:MOVR0,#20H;循環初始化部分
MOVR7,#96;
CLRALOOP:MOV@R0,A;循環體部分
INCR0;修改變量
DJNZR7,LOOP;循環控制部分
RETEND思考題(補充作業題):如采用CJNE指令,應如何修改程序?第37頁,課件共71頁,創作于2023年2月
例:兩個三字節二進制無符號數相加,被加數放在內部RAM20H~22H單元(低字節存放在低地址單元,高字節存放在高地址單元,即低位在前,高位在后),加數放在2AH~2CH單元,和放在20H~22H單元,最高位如有進位,則放在23H單元中。解:數據類型(二、十進制數,有、無符號數);數據結構(升、降序排列)被加數(N1)高字節(8位)中字節(8位)低字節(8位)加數(N2)高字節(8位)中字節(8位)低字節(8位)被加數(N1)加數(N2)和(N3)20H單元低字節(8位)2AH單元低字節(8位)20H單元低字節(8位)21H單元中字節(8位)2BH單元中字節(8位)21H單元中字節(8位)22H單元高字節(8位)2CH單元高字節(8位)22H單元高字節(8位)23H單元進位位第38頁,課件共71頁,創作于2023年2月被加數N1高字節(8位)中字節(8位)低字節(8位)加數N2高字節(8位)中字節(8位)低字節(8位)
+)進位位(CY)進位位(CY)進位位(CY)和N3進位高字節(8位)中字節(8位)低字節(8位)程序流程框圖
程序清單思考題:統計正數、負數、零的個數。第39頁,課件共71頁,創作于2023年2月ORG0030HADDDUO:MOVR0,#20H;循環初始化部分
MOVR1,#2AH;
MOVR7,#03H;循環次數
CLRC;
LOOP:MOVA,@R0;循環體部分
ADDCA,@R1;
MOV@R0,A;
INCR0;修改指針變量
INCR1;
DJNZR7,LOOP;循環控制部分
CLRA;循環結束處理部分
ADDCA,#00H;
MOV@R0,A;
RET;
END返回第40頁,課件共71頁,創作于2023年2月返回第41頁,課件共71頁,創作于2023年2月
例:把內部RAM中起始地址為DATA的數據串傳送到外部RAM以BUFFER為首地址的區域,直到發現“$”字符的ASCⅡ碼為止,同時規定數據串最大長度為32個字節。解:(1)分析任務:數據傳送;(2)算法:比較、控制轉移(3)程序結構:分支、循環(4)數據類型:多字節字符串
(5)RAM單元安排:內部RAM單元、外部RAM單元(6)采用寄存器間接尋址方式(R0、R1或DPTR)第42頁,課件共71頁,創作于2023年2月
(7)程序流程框圖;第43頁,課件共71頁,創作于2023年2月ORG0030HDATACS:MOVR0,#DATA;DATA數據區首地址
MOVDPTR,#BUFFER;BUFFER數據區首地址
MOVR1,#20H;最大數據串長
LOOP:MOVA,@R0;取數據
SUBBA,#24H;判是否為“$”字符
JZLOOP1;是“$”字符,轉結束
MOVX@DPTR,A;數據傳送
INCR0;
INCDPTR;
DJNZR1,LOOP;循環控制
LOOP1:RET;結束
END第44頁,課件共71頁,創作于2023年2月4.380C51單片機匯編語言程序設計舉例4.3.2定時程序在單片機的控制應用中,常有定時的需要,如定時中斷、定時檢測和定時掃描等。定時功能除可以使用純硬件電路、可編程定時/計數器實現外,還可以使用軟件程序(定時程序)完成。定時程序是典型的循環程序,它是通過執行一個具有固定延遲時間的循環體來實現定時的。(1)單循環定時程序
MOVR5,#TIME;LOOP:NOP;
NOP;
DJNZR5,LOOP;第45頁,課件共71頁,創作于2023年2月
假設單片機晶振頻率fosc=6MHz,則一個機器周期為2μs,NOP、DJNZ指令分別是單、雙機器周期指令。定時程序的總延遲時間是循環程序段延時時間的整數倍,由于R5是8位寄存器,因此,這個定時程序的最長定時時間為:
256(28)×8=2048(μs)(2)較長時間的定時程序(多重循環定時子程序)
TIME:MOVR5,#TTME1;
LOOP:MOVR4,#TEME2;
LOOP1:NOP;
NOP;
DJNZR4,LOOP1;
DJNZR5,LOOP2;
RET;第46頁,課件共71頁,創作于2023年2月
這個定時子程序的最長定時時間為:
[256(28)×4+2+1]×256(28)×2+4=525828(μs)(3)調整定時時間在定時程序中可通過在循環程序段中增減指令的方法對定時時間進行微調。例:MOVR0,#TTME;
LOOP:ADDA,R1;
INCDPTR;
DJNZR0,LOOP;由于ADD、INC、DJNZ指令的機器周期分別為1、2、2,所以,該程序定時時間為=(1+2+2)×2μs×Time(μs)。第47頁,課件共71頁,創作于2023年2月假定要求定時時間為24us。對于這個定時程序,只須增加一條NOP指令即可實現。
MOVR0,#TIME;LOOP:ADDA,R1;
INCDPTR;
NOP;
DJNZR0,LOOP;只須TIME取2,即可得到精確的24μs定時。(4)以一個基本的延時程序滿足不同的定時要求如果一個系統有多個定時需要,我們就可以設計一個基本延時程序,使其延時時間為各定時時間的最大公約數,然后可以以此基本程序作為子程序,通過調用的方法實現所需不同定時。
第48頁,課件共71頁,創作于2023年2月
例:在單片機應用系統中,假設需要的定時時間分別為5S、10S、20S,可設計一個1S延時子程序DELAY,則5S、10S、20S的定時時間可通過調用DELAY實現。
MOVR0,#05H;5S定時
LOOP:LCALLDELAY;
DJNZR0,LOOP1;┋
MOVR0,#0AH;10S定時
LOOP2:LCALLDELAY;
DJNZR0,LOOP2;┋
MOVR0,#14H;20S定時
LOOP3:LCALLDELAY;
DJNZR0,LOOP3;┋第49頁,課件共71頁,創作于2023年2月4.3.3查表程序所謂查表程序,就是指預先把數據以表格形式存放在程序存儲器中,然后使用程序讀出,這種能讀出表格數據的程序就稱之為查表程序。查表操作對單片機的控制應用十分重要,查表程序常用于實現非線性修正,非線性函數轉換以及代碼轉換等場合。
MCS-51單片機指令系統中有兩條專用查表指令:(1)MOVCA,@A+DPTR;A←((A)+(DPTR))(2)MOVCA,
@A+PC;A←((A)+(PC))這兩條查表指令的功能是完全相同的,其共同優點是:能在不改變PC和DPTR的狀態下,只根據A的內容就可以取出表格中的數據。注意:A的內容均為8位無符號數。第50頁,課件共71頁,創作于2023年2月對于第一條指令,適用于64KBROM范圍內查表(即數據表格的大小和位置可以在64KB程序存儲器中任意安排,一個數據表格可以被多個程序塊使用),編寫查表程序時,首先把表的首地址送入DPTR中,再要將查表的數據序號(或下標值)送入A中,然后就可以使用該指令進行查表操作,并把結果送A中。對于第二條指令,常用于“本地”范圍查表(即數據表格只能放在該指令后面256個地址單元之內,而且表格只能被本程序使用),編寫查表程序時,首先把查表數據的序號送入A中,再把從查表指令的下一條指令的首地址到表的首地址間的偏移量與A值相加,然后再使用該指令進行查表操作,并把結果送入A中。第51頁,課件共71頁,創作于2023年2月例:設計一個子程序,其功能為根據x的內容(0~9之間)查平方表,求出相應的結果y(y=x2)。假設x的內容已存放在內部RAM30H單元中,求出y的內容存放在內部RAM40H單元中。
ORG1000H1000HSQR:MOVA,30H;A←x1002HPUSHDPH;現場保護1004HPUSHDPL;1006HMOVDPTR,#TAB1;DPTR←表首地址TAB11009HMOVCA,@A+DPTR;查表得y100AHMOV40H,A;40H←y100CHPOPDPL;現場恢復100EHPOPDPH;1010HRET1011HTAB1:DB00H,01H,04H,09H,10H,19HDB24H,31H,40H,51H第52頁,課件共71頁,創作于2023年2月上例中,如果使用MOVCA,@A+PC指令,則編程如下:
ORG1000H1000HSQR:MOVA,30H;A←x1002HPUSHDPH;現場保護1004HPUSHDPL;1006HADDA,#07H;加偏移量1008HMOVCA,@A+PC;查表得y1009HMOV40H,A;40H←y100BHPOPDPL;現場恢復100DHPOPDPH;100FHRET1010HTAB1:DB00H,01H,04H,09H,10H,19HDB24H,31H,40H,51H此題中,偏移量=1010H-1009H=07H第53頁,課件共71頁,創作于2023年2月4.4單片機匯編語言源程序的編輯和匯編
4.580C51單片機匯編語言偽指令
匯編語言程序必須轉換為二進制的機器代碼程序,單片機才能夠執行。匯編語言程序轉換為機器代碼程序的過程,稱之為匯編。匯編的方法有兩種:即機器交叉匯編和手工匯編。所謂手工匯編,就是指程序設計人員通過查指令編碼表,逐個把助記符指令“翻譯”成機器碼。手工匯編方法通常用于短、小程序的匯編。長程序則必須通過機器交叉匯編的方法進行匯編。所謂機器交叉匯編,就是指程序設計人員使用一種計算機的匯編程序去匯編另一種計算機的源程序,具體地說就是運行匯編程序進行匯編的是一種計算機,而運行匯編得到的目標程序的則是另一種計算機。單片機只能采用機器交叉匯編的方法對匯編語言程序進行匯編第54頁,課件共71頁,創作于2023年2月
對匯編語言程序進行機器交叉匯編時,必須告訴計算機的匯編程序應該如何完成匯編工作,這一任務就是通過使用偽指令來實現的。偽指令是程序設計人員發給匯編程序的指令,也稱匯編命令或匯編程序控制指令。它具有控制匯編程序的輸入輸出、定義數據和符號、條件匯編、分配存儲空間等功能。偽指令沒有與之相對應的二進制機器代碼,因此,在匯編語言指令系統匯總表中,查不到相對應的二進制機器代碼。不同匯編語言的偽指令也有所不同,但一些基本指令是相同的。手工匯編不需要偽指令,但機器交叉匯編必須使用偽指令。在對匯編語言程序進行機器交叉匯編前,偽指令存在于匯編語言程序中,但匯編后得到的機器代碼程序中不存在偽指令相對應的二進制機器代碼,這一點請特別注意。第55頁,課件共71頁,創作于2023年2月(1)ORG(ORiGin)匯編起始地址命令本命令總出現在匯編語言源程序的開頭位置,用于規定目標程序的起始地址,即此命令后面的程序或數據塊的起始地址。命令格式:[〈標號:〉]ORG〈地址〉
其中[〈標號:〉]是選擇項,根據需要選用,〈地址〉項,通常為16位絕對地址,但也可以使用標號或表達式表示。在匯編語言程序的開始,通常都用一條ORG偽指令來規定程序的起始地址,如果不用ORG規定,則匯編得到的目標程序將從0000H開始。例:ORG8000H即規定標號START代表地址8000H,
START:MOVA,#00H;目標程序的第一條指令從8000H┇開始。第56頁,課件共71頁,創作于2023年2月(2)END(ENDofassembly)匯編終止命令
本命令用于終止匯編語言源程序的匯編工作,END是匯編語言源程序的結束標志,因此,在整個匯編語言源程序中只能有一個END指令,且位于程序的最后。如果END命令出現在程序中間,則在END之后的指令,匯編程序將不予處理。命令格式:[〈標號:〉]END[〈表達式〉]
(3)EQU(EQUate)賦值命令本命令用于給字符名稱賦予一個特定值,賦值以后,其值在整個程序中有效。命令格式:〈字符名稱〉EQU〈賦值項〉
其中〈賦值項〉可以是常數,地址,標號或表達式,其值為8位或16位二進制數。賦值以后的字符名稱既可以作地址使用,也可以作立即數使用。第57頁,課件共71頁,創作于2023年2月
例:HOUREQU30HORG1000HSTART:MOVHOUR,#40H;等同于
START:MOV30H,#40H;(4)DB(DefineByte)定義數據字節命令本命令用于從指定的地址單元開始,在程序存儲器的連續單元中定義字節數據。命令格式:[〈標號:〉]DB〈8位數表〉
常使用本命令存放數據表格。例:存放7段數碼管(共陽極)顯示的十六進制基數(0~F)的十六進制數的字形代碼,可使用多條DB命令定義。第58頁,課件共71頁,創作于2023年2月DB0C0H,0F9H,0A4H,0B0H;0,1,2,3DB99H,92H,82H,0F8H;4,5,6,7
DB80H,90H,88H,83H;8,9,A,BDB0C6H,0A1H,86H,84H;C,D,E,F
查表時,為確定數據區的起始地址,可采用兩種方法:
a)根據DB命令前一條指令的地址確定。把該地址加上它的字節數就是DB的定義的數據字節的起始地址。例:8100:MOVA,#49H;一字節指令
TAB:DB0COH,0F9H,0A4H,0B0H;┋定義的7段數碼管(共陽極)顯示的十六進制基數(0~F)的十六進制數的字形代碼從8101H地址單元開始存放。第59頁,課件共71頁,創作于2023年2月b)使用0RG命令專門規定。例:ORG8100HTAB:DB0COH,0F9H,0A4H,0B0H;┋定義的7段數碼管(共陽極)顯示的十六進制基數(0~F)的十六進制數的字形代碼從8101H地址單元開始存放。(5)DW(DefineWord)定義數據字命令本命令用于從指定地址開始,在程序存儲器單元中定義16位的數據字。命令格式:[〈標號:〉]DW〈16位數表〉
存放時,數據字的高8位在前(低地址),低8位在后(高地址)。第60頁,課件共71頁,創作于2023年2月
例:DW“AA”;存入41H,42H。
DB和DW定義的數表,數的個數不得超過80個。如數據的數目較多時,可使用多個定義命令。在MCS-51程序設計應用中,常以DB來定義數據,以DW來定義地址。(6)DS(DefineStonage)定義存儲區命令本命令用于從指定地址開始,保留指定數目的字節單元作為存儲器,供程序運行使用,匯編時,對這些單元不賦值。命令格式:[〈標號:〉]DS〈16位數表〉
例:ORG8100HDS08H
從8100H地址開始,保留8個連續的地址單元。第61頁,課件共71頁,創作于2023年2月(7)BIT位定義命令
本命令用于給字符名稱賦以位地址命令格式:〈字符名稱〉BIT〈位地址〉
其中〈位地址〉可以是絕對地址,也可以是符號地址(即位符號名稱)例:AQBITP1.0
把P1.0的位地址賦給變量AQ,在其后的編程中,AQ就可以作為位地址使用。
第62頁,課件共71頁,創作于2023年2月補充內容:子程序結構
子程序結構是一種非常重要的程序結構。在一個程序中經常遇到反復多次某程序段的情況,如果重復書寫這個程序段,會使程序變得冗長而雜亂。對此,可采用子程序結構,即把重復的程序段編寫為一個子程序,通過主程序調用而使用它。這樣不但減少了編程工作量,而且也縮短了程序的長度。調用和返回構成了子程序調用的完整過程。為了實現這一過程,必須有子程序調用指令和返回指令。調用指令在主程序中使用,而返回指令則應該是子程序的最后一條指令。執行完這條指令后,程序返回主程序斷點處繼續執行。第63頁,課件共71頁,創作于2023年2月(1)子程序的編程原則在實際的單片機應用系統軟件設計中,為了程序結構更加清晰,易于設計,易于修改,增強程序可讀性,基本上都要使用子程序結構。子程序作為一個具有獨立功能的程序段,編程時需遵循以下原則:
a)子程序的第一條指令必須有標號,明確子程序入口地址;
b)以返回指令RET結束子程序;
c)子程序說明部分;子程序名稱:提供給主程序調用的名字,通常用符號或子程序第一條語句的標號來表示。子程序功能:簡要說明子程序能完成的主要功能。子程序入口參數:主程序需要向子程序提供的參數。第64頁,課件共71頁,創作于2023年2月
子程序出口參數:子程序執行完之后向主程序返回的參數。子程序占用資源:子程序中使用了哪些存儲單元、寄存器等子程序堆棧深度:子程序占用堆棧區的最大字節數。子程序嵌套情況:子程序中繼續調用子程序的情況。子程序的字節數:子程序中所有指令字節數的總和。子程序執行時間:子程序中所有指令的機器周期數總和。這些說明是寫給程序員看的,供以后使用子程序時參考。
d)較強的通用性和可浮動性,盡可能避免使用具體的內存單元和
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物空氣凈化創新技術行業跨境出海項目商業計劃書
- 商品房認籌協議書
- 煤炭倉儲基地企業制定與實施新質生產力項目商業計劃書
- 鄉村生態農場觀光行業深度調研及發展項目商業計劃書
- 高效能固體氧化物燃料電池企業制定與實施新質生產力項目商業計劃書
- 互聯網保險定制化服務平臺行業深度調研及發展項目商業計劃書
- 紡織原料倉儲行業深度調研及發展項目商業計劃書
- 會獎旅游AI應用企業制定與實施新質生產力項目商業計劃書
- 中式快餐供應鏈管理軟件行業深度調研及發展項目商業計劃書
- 高靈敏度磁強計企業制定與實施新質生產力項目商業計劃書
- 2025年建筑模板制品行業深度研究報告
- 掛名股東簽署協議書
- 湖北省荊門市2025年七年級下學期語文期末考試試卷及答案
- 環境監測中的化學分析技術試題及答案
- 2025年江蘇省蘇州市中考一模道德與法治試題(含答案)
- 下肢深靜脈血栓的預防和護理新進展
- 國際壓力性損傷-潰瘍預防和治療臨床指南(2025年版)解讀
- 重慶市機動車維修工時定額標準
- 新能源汽車傳動系統高端智能設備研發和生產項目環評資料環境影響
- 湖北省2024年本科普通批錄取院校(首選歷史)平行志愿投檔線
- 鋁錠生產工藝流程
評論
0/150
提交評論