單片機第4章課件_第1頁
單片機第4章課件_第2頁
單片機第4章課件_第3頁
單片機第4章課件_第4頁
單片機第4章課件_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、4.1 4.1 匯編語言程序設(shè)計概述匯編語言程序設(shè)計概述 4.1.1 4.1.1 機器語言、匯編語言和高級語言機器語言、匯編語言和高級語言用于程序設(shè)計的用于程序設(shè)計的語言基本上分為語言基本上分為3 3種:機器語言、種:機器語言、匯編語言和高級語言匯編語言和高級語言。 1.1.機器語言機器語言 二進制代碼表示的指令、數(shù)字和符號簡稱為機二進制代碼表示的指令、數(shù)字和符號簡稱為機器語言器語言 不易懂,難記憶,易出錯。不易懂,難記憶,易出錯。 2匯編語言匯編語言 英文助記符表示的指令稱為英文助記符表示的指令稱為符號語言符號語言或或匯編語言匯編語言匯編語言特點:匯編語言特點:(1)(1) 面向機器的語言,

2、程序設(shè)計員須對面向機器的語言,程序設(shè)計員須對MCS-51MCS-51的硬件的硬件有相當深入的了解。有相當深入的了解。(2)(2) 助記符指令和機器指令一一對應(yīng),用匯編語言編助記符指令和機器指令一一對應(yīng),用匯編語言編寫的寫的程序效率高程序效率高,占用,占用存儲空間小存儲空間小,運行,運行速度快速度快,用匯編語言能編寫出最優(yōu)化的程序。用匯編語言能編寫出最優(yōu)化的程序。 能直接管理和控制硬件設(shè)備(功能部件),它能處理能直接管理和控制硬件設(shè)備(功能部件),它能處理中斷,也能直接訪問存儲器及中斷,也能直接訪問存儲器及I/OI/O接口電路。接口電路。匯編語言和機器語言都脫離不開具體機器的硬件,均匯編語言和機

3、器語言都脫離不開具體機器的硬件,均是面向是面向“機器機器”的語言,缺乏通用性。的語言,缺乏通用性。3 3高級語言高級語言不受具體機器的限制不受具體機器的限制, ,使用了許多數(shù)學公式和數(shù)學計算使用了許多數(shù)學公式和數(shù)學計算上的習慣用語,上的習慣用語,非常擅長于科學計算。非常擅長于科學計算。常用的如常用的如BASICBASIC、FORTRANFORTRAN以及以及C C語言等。語言等。高級語言優(yōu)點:通用性強,直觀、易懂、易學,可讀高級語言優(yōu)點:通用性強,直觀、易懂、易學,可讀性好。性好。使用使用C C語言(語言(C51C51)、)、PL/MPL/M語言來進行語言來進行MCS-51MCS-51的應(yīng)用程

4、的應(yīng)用程序設(shè)計。序設(shè)計。 對于程序的空間和時間要求很高的場合,匯編語言仍對于程序的空間和時間要求很高的場合,匯編語言仍是必不可缺的。是必不可缺的。 C C語言和匯編語言混合編程語言和匯編語言混合編程 在很多需要直接控制硬件的應(yīng)用場合,則更是非用匯在很多需要直接控制硬件的應(yīng)用場合,則更是非用匯編語言不可編語言不可 使用匯編語言編程,是單片機程序設(shè)計的使用匯編語言編程,是單片機程序設(shè)計的基本功之一基本功之一4.1.2 4.1.2 匯編語言語句的種類和格式匯編語言語句的種類和格式兩種基本類型:指令語句和偽指令語句兩種基本類型:指令語句和偽指令語句(1 1)指令語句)指令語句已在第已在第3 3章介紹章

5、介紹每一條指令語句在匯編時都產(chǎn)生一個指令代碼每一條指令語句在匯編時都產(chǎn)生一個指令代碼機機器代碼器代碼(2 2)偽指令語句)偽指令語句 是為匯編服務(wù)的。在匯編時是為匯編服務(wù)的。在匯編時沒有機器代碼與之對應(yīng)。沒有機器代碼與之對應(yīng)。 MCS-51MCS-51的匯編語言的的匯編語言的四分段格式四分段格式如下:如下: 標號字段標號字段 操作碼字段操作碼字段 操作數(shù)字段操作數(shù)字段 注釋字段注釋字段例例4-14-1 下面是一段匯編語言程序的四分段書寫格式下面是一段匯編語言程序的四分段書寫格式 基本語法規(guī)則:基本語法規(guī)則:1 1標號字段標號字段是語句所在地址的標志符號是語句所在地址的標志符號 標號字段標號字段

6、 操作碼字段操作碼字段 操作數(shù)字段操作數(shù)字段 注釋字段注釋字段 START: MOV A,#00H ;0A MOV R1,#10 ;10R1 MOV R2,#00000011B ;3R2 LOOP:ADD A,R2 ;(;(A)+(R2)A DJNZ R1,LOOP;R1內(nèi)容減內(nèi)容減1不不 為零,則循環(huán)為零,則循環(huán) NOP HERE: SJMP HERE2 2美元符號美元符號$ $的使用的使用用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下指令:指令: JNB F0JNB F0, $ $與如下指令是等價的:與如下指令是等價的:HEREHERE:JNB

7、 F0JNB F0,HEREHERE 再如:再如:HEREHERE:SJMP HERESJMP HERE可寫為:可寫為: SJMP $SJMP $4.2 4.2 匯編語言源程序的匯編匯編語言源程序的匯編匯編語言源程序匯編語言源程序 “ “翻譯翻譯”成機器代碼(指令代碼)的成機器代碼(指令代碼)的過程稱為過程稱為“匯編匯編”。匯編可分為。匯編可分為手工匯編手工匯編和和機器匯編機器匯編兩類兩類: :4.2.1 4.2.1 手工匯編手工匯編人工查表翻譯指令人工查表翻譯指令。但遇到的相對轉(zhuǎn)移指令的偏移量的。但遇到的相對轉(zhuǎn)移指令的偏移量的計算,要根據(jù)轉(zhuǎn)移的目標地址計算偏移量,不但麻煩,計算,要根據(jù)轉(zhuǎn)移的

8、目標地址計算偏移量,不但麻煩,且容易出錯。且容易出錯。4.2.2 4.2.2 機器匯編機器匯編用編輯軟件進行源程序的編輯。編輯完成后,生成一個用編輯軟件進行源程序的編輯。編輯完成后,生成一個ASCIIASCII碼文件,擴展名為碼文件,擴展名為“.ASM”.ASM”。然后在微計算機。然后在微計算機上運行匯編程序,把匯編語言源程序翻譯成機器代碼。上運行匯編程序,把匯編語言源程序翻譯成機器代碼。交叉匯編交叉匯編匯編后的機器代碼是在另一臺計算機(這匯編后的機器代碼是在另一臺計算機(這里是單片機)上運行。里是單片機)上運行。 MCS-51MCS-51單片機的應(yīng)用程序的完成,應(yīng)經(jīng)過三個步驟;單片機的應(yīng)用程

9、序的完成,應(yīng)經(jīng)過三個步驟;(1 1)在微計算機上,運行編輯程序進行源程序的輸入)在微計算機上,運行編輯程序進行源程序的輸入 和編輯;和編輯; (2 2)對源程序進行交叉匯編得到機器代碼;)對源程序進行交叉匯編得到機器代碼;(3 3)通過微計算機的串行口(或并行口)把機器代碼)通過微計算機的串行口(或并行口)把機器代碼傳送到傳送到用戶樣機(或在線仿真器用戶樣機(或在線仿真器)進行程序的調(diào)試)進行程序的調(diào)試和運行。和運行。反匯編反匯編分析現(xiàn)成產(chǎn)品的程序,要將二進制的機器分析現(xiàn)成產(chǎn)品的程序,要將二進制的機器代碼語言程序翻譯成匯編語言源程序。代碼語言程序翻譯成匯編語言源程序。4.3 4.3 匯編語言實

10、用程序設(shè)計匯編語言實用程序設(shè)計4.3.3 4.3.3 查表程序設(shè)計查表程序設(shè)計 數(shù)據(jù)補償、修正、計算、轉(zhuǎn)換等各種功能,具有程序數(shù)據(jù)補償、修正、計算、轉(zhuǎn)換等各種功能,具有程序簡單、執(zhí)行速度快等優(yōu)點。簡單、執(zhí)行速度快等優(yōu)點。查表就是根據(jù)自變量查表就是根據(jù)自變量x,x,在表格中尋找在表格中尋找y,y,使使y=f(x)y=f(x)。執(zhí)行查表指令時,發(fā)出讀程序存儲器選通脈沖執(zhí)行查表指令時,發(fā)出讀程序存儲器選通脈沖/PSEN/PSEN。在在MCS-51MCS-51的指令系統(tǒng)中,給用戶提供了的指令系統(tǒng)中,給用戶提供了兩條極為有兩條極為有用的查表指令:用的查表指令: MOVC AMOVC A,A+DPTRA+

11、DPTR MOVC A MOVC A,A+PCA+PC指令指令“MOVC AMOVC A,A+DPTR”A+DPTR”完成把完成把A A中的內(nèi)容作為一個中的內(nèi)容作為一個無符號數(shù)與無符號數(shù)與DPTRDPTR中的內(nèi)容相加,所得結(jié)果為某一程中的內(nèi)容相加,所得結(jié)果為某一程序序。指令執(zhí)行完指令執(zhí)行完,PC,PC的內(nèi)容不發(fā)生變化,仍指向查的內(nèi)容不發(fā)生變化,仍指向查表指令的下一條指令。表指令的下一條指令。優(yōu)點優(yōu)點在于預處理較少且不影響其它特殊功能寄在于預處理較少且不影響其它特殊功能寄存器的值,所以不必保護其它特殊功能寄存存器的值,所以不必保護其它特殊功能寄存器的原先值。器的原先值。缺點缺點在于該表格只能存放

12、在這條指令的地址在于該表格只能存放在這條指令的地址X3X2X1X0X3X2X1X0以下的以下的0000FFHFFH之中。表格之中。表格所在的所在的程序空間受到了限制。程序空間受到了限制。例例4-14-1 子程序的功能為:根據(jù)累加器子程序的功能為:根據(jù)累加器A A中的數(shù)中的數(shù)x x(0 09 9之間)查之間)查x x的平方表的平方表y y,根據(jù),根據(jù)x x的值查出相應(yīng)的平方的值查出相應(yīng)的平方y(tǒng) y。x x和和y y均為單字節(jié)數(shù)。均為單字節(jié)數(shù)。地地 址址 子程序子程序Y3Y2Y1Y0 ADD A,#01HY3Y2Y1Y0 ADD A,#01H Y3Y2Y1Y0+2 MOVC A,A+PC Y3Y2

13、Y1Y0+2 MOVC A,A+PCY3Y2Y1Y0+3 RETY3Y2Y1Y0+3 RET Y3Y2Y1Y0+4 DB 00H,01H,04H,09H,10H Y3Y2Y1Y0+4 DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H DB 19H,24H,31H,40H,51H第第1 1條指令條指令 ADD AADD A,#01H #01H 的作用是加上偏移量,可的作用是加上偏移量,可以根據(jù)以根據(jù)A A的內(nèi)容查出的內(nèi)容查出X X對應(yīng)的平方。對應(yīng)的平方。 MOVC AMOVC A,A+DPTR A+DPTR 這條指令的應(yīng)用范圍較為廣這條指令的應(yīng)用范圍較為

14、廣泛,一般情況下,大多使用該指令,使用該指令時泛,一般情況下,大多使用該指令,使用該指令時不必計算偏移量,使用該指令的優(yōu)點是表格可以設(shè)不必計算偏移量,使用該指令的優(yōu)點是表格可以設(shè)在在64K64K程序存儲器空間內(nèi)的任何地方,而不像程序存儲器空間內(nèi)的任何地方,而不像 MOVC MOVC A A,A+PCA+PC那樣只設(shè)在那樣只設(shè)在PCPC下面的下面的256256個單元中,使用較個單元中,使用較方便。方便。 上面的程序可改成如下形式:上面的程序可改成如下形式: PUSH DPH PUSH DPH ;保存;保存DPHDPH PUSH DPL PUSH DPL ;保存;保存DPLDPL MOV DPTR

15、 MOV DPTR,#TAB1#TAB1 MOVC A MOVC A,A+DPTRA+DPTR POP DPL POP DPL ;恢復;恢復DPLDPL POP DPH POP DPH ;恢復;恢復DPHDPH RET RETTAB1: DB 00HTAB1: DB 00H,01H01H,04H04H,09H09H,10H 10H DB 19H DB 19H,24H24H,31H31H,40H40H,51H51H例例4-24-2 在一個以在一個以MCS-51MCS-51為核心的溫度控制器中,溫度為核心的溫度控制器中,溫度傳感器輸出的電壓與溫度為非線性關(guān)系,傳感器輸傳感器輸出的電壓與溫度為非線性

16、關(guān)系,傳感器輸出的電壓已由出的電壓已由A/DA/D轉(zhuǎn)換為轉(zhuǎn)換為1010位二進制數(shù)。根據(jù)測得的位二進制數(shù)。根據(jù)測得的不同溫度下的電壓值數(shù)據(jù)構(gòu)成一個表,表中放溫度不同溫度下的電壓值數(shù)據(jù)構(gòu)成一個表,表中放溫度 值值y y,x x為電壓值數(shù)據(jù)。設(shè)測得的電壓值為電壓值數(shù)據(jù)。設(shè)測得的電壓值x x放入放入R2R3R2R3中,中,根據(jù)電壓值根據(jù)電壓值x x,查找對應(yīng)的溫度值,查找對應(yīng)的溫度值y y,仍放入,仍放入R2R3R2R3中。中。本例的本例的x x和和y y均為雙字節(jié)無符號數(shù)。程序如下:均為雙字節(jié)無符號數(shù)。程序如下: LTB2LTB2:MOV DPTR,#TAB2MOV DPTR,#TAB2 MOV A

17、,R3 MOV A,R3 CLR C CLR C RLC A RLC A MOV R3,A MOV R3,A XCH A,R2 XCH A,R2 RLC A RLC A XCH R2,A XCH R2,A ADD ADD A,DPL A,DPL ;(;(R2R3R2R3)+ +(DPTRDPTR) (DPTRDPTR) MOV DPL,AMOV DPL,A MOV A,DPH MOV A,DPH ADDC A,R2 ADDC A,R2 MOV DPH,A MOV DPH,A CLR A CLR A MOVC A,A+DPTR MOVC A,A+DPTR ;查第一字節(jié);查第一字節(jié) MOV R2,

18、A MOV R2,A ;第一字節(jié)存入;第一字節(jié)存入R2R2中中 CLR ACLR A INC DPTR INC DPTR MOVC A,A+DPTR MOVC A,A+DPTR ;查第二字節(jié);查第二字節(jié) MOV R3,A MOV R3,A ;第二字節(jié)存入;第二字節(jié)存入R3R3中中 RETRET TAB2:DW TAB2:DW ;溫度值表;溫度值表例例4-34-3 設(shè)有一個巡回檢測報警裝置,需對設(shè)有一個巡回檢測報警裝置,需對1616路輸入進路輸入進行檢測,行檢測,每路有一最大允許值,為雙字節(jié)數(shù)每路有一最大允許值,為雙字節(jié)數(shù)。運行運行時,需根據(jù)測量的路數(shù),找出每路的最大允許值。時,需根據(jù)測量的路數(shù)

19、,找出每路的最大允許值。看輸入值是否大于最大允許值,如大于就報警。根看輸入值是否大于最大允許值,如大于就報警。根據(jù)上述要求,編一個查表程序。據(jù)上述要求,編一個查表程序。 取路數(shù)為取路數(shù)為x(0 x15),yx(0 x15),y為最大允許值,放在表格中。為最大允許值,放在表格中。設(shè)進入查表程序前,路數(shù)設(shè)進入查表程序前,路數(shù)x x已放于已放于R2R2中,查表后最中,查表后最大值大值y y放于放于R3R4R3R4中。本例中的中。本例中的x x為單字節(jié)數(shù),為單字節(jié)數(shù),y y為雙為雙字節(jié)數(shù)。查表程序如下:字節(jié)數(shù)。查表程序如下:TB3:TB3: MOV A,R2MOV A,R2 ADD A,R2 ADD

20、A,R2 ;(R2)(R2)* *2(A)2(A) MOV R3,A MOV R3,A ;保存指針;保存指針 ADD A,#6 ADD A,#6 ;加偏移量;加偏移量MOVC A,A+PC MOVC A,A+PC ;查第一字節(jié);查第一字節(jié)XCH A,R3XCH A,R3 ADD A,#3ADD A,#3 MOVC A,A+PC MOVC A,A+PC ;查第二字節(jié);查第二字節(jié) MOV R4,AMOV R4,ARETRET TAB3: TAB3: DW 1520DW 1520,37213721,4264542645,7580 7580 ;最大值;最大值 ;表;表 DW 3483DW 3483,3

21、265732657,883883,99439943 DW 10000 DW 10000,4051140511,67586758,89318931 DW 4468 DW 4468,58715871,1328413284,2780827808表格長度不能超過表格長度不能超過256256個字節(jié),且表格只能存放于個字節(jié),且表格只能存放于MOVC MOVC A,A+PCA,A+PC指令以下的指令以下的256256個單元中。個單元中。查表指令查表指令(MOVC A,A+PC (MOVC A,A+PC 、 MOVC A,A+DPTR)MOVC A,A+DPTR)的區(qū)別的區(qū)別1 1)MOVC A,A+PCMO

22、VC A,A+PC表格長度不能超過表格長度不能超過256256個字節(jié),且表個字節(jié),且表格只能存放于格只能存放于MOVC A,A+PCMOVC A,A+PC指令以下的指令以下的256256個單元中。個單元中。 MOVC A,A+DPTRMOVC A,A+DPTR表格可以設(shè)在表格可以設(shè)在64K64K程序存儲器空間內(nèi)程序存儲器空間內(nèi)的任何地方的任何地方2 2) MOVC A,A+PC PCMOVC A,A+PC PC是執(zhí)行完本條指令后,指向下一是執(zhí)行完本條指令后,指向下一條指令的條指令的 地址,需加上偏移量地址,需加上偏移量 MOVC A,A+DPTR MOVC A,A+DPTR 不需要加偏移量。不

23、需要加偏移量。 3)根據(jù)表中指令的字節(jié)數(shù)不同,根據(jù)表中指令的字節(jié)數(shù)不同,A A分別乘以分別乘以1 1、2 2或或3 3,從表中取指令時,也要分從表中取指令時,也要分1 1、2 2或或3 3次進行。次進行。單字節(jié)指令單字節(jié)指令單字節(jié)指令單字節(jié)指令基址+0基址+1基址+2(A)=0(A)=1基址+0基址+1基址+2(A)=0對應(yīng)的一條指令(A)=1對應(yīng)的一條指令單字節(jié)指令A=A1雙字節(jié)指令A=A2基址+0基址+1基址+2(A)=0對應(yīng)的一條指令(A)=1對應(yīng)的一條指令三字節(jié)指令A=A3基址+3基址+4基址+54.3.5 4.3.5 數(shù)據(jù)極值查找程序設(shè)計數(shù)據(jù)極值查找程序設(shè)計在指定的數(shù)據(jù)區(qū)中找出最大值

24、(或最小值)。在指定的數(shù)據(jù)區(qū)中找出最大值(或最小值)。進行數(shù)值大小的比較,從這批數(shù)據(jù)中找出最進行數(shù)值大小的比較,從這批數(shù)據(jù)中找出最大值(或最小值)并存于某一單元中。大值(或最小值)并存于某一單元中。例例4-9 已知內(nèi)部已知內(nèi)部RAM ADDR為起始的數(shù)據(jù)塊為起始的數(shù)據(jù)塊內(nèi)數(shù)據(jù)是無符號數(shù),塊長在內(nèi)數(shù)據(jù)是無符號數(shù),塊長在LEN單元內(nèi),單元內(nèi),找出數(shù)據(jù)塊中最大值并存入找出數(shù)據(jù)塊中最大值并存入MAX單元。單元。程序如下:程序如下: ORG 2000H ORG 2000HLEN DATA 20HLEN DATA 20HMAX DATA 22HMAX DATA 22H MOV MAX,#00H MOV M

25、AX,#00H ; MAXMAX單元清零單元清零 MOV R0,#ADDR MOV R0,#ADDR ; ADDRADDR送送R0R0LOOP: MOV A,R0 LOOP: MOV A,R0 ; 數(shù)塊中某數(shù)送數(shù)塊中某數(shù)送A A CJNE A,MAX,NEXT1 CJNE A,MAX,NEXT1 ; A A和和(MAX)(MAX)比較比較NEXT1: JC NEXT NEXT1: JC NEXT ;若;若AA256NADD: JMP A+DPTRTBJ1: AJMP PRG0 AJMP PRG1 AJMP PRGn 二、使用地址偏移量的散轉(zhuǎn)程序二、使用地址偏移量的散轉(zhuǎn)程序例 按R2的內(nèi)容轉(zhuǎn)向6

26、個處理程序JMP3: MOV A,R2 MOV DPTR,#TBJ3 MOVC A,A+DPTR ;從表中讀取變址 JMP A+DPTRTBJ3:DB PRG0-TBJ3 DB PRG1-TBJ3 . DB PRG5-TBJ3PRG0:處理程序0PRG1:處理程序1PRG2:處理程序2PRG3:處理程序3PRG4:處理程序4PRG5:處理程序54.3.8 4.3.8 循環(huán)程序設(shè)計循環(huán)程序設(shè)計 計數(shù)循環(huán)結(jié)構(gòu)計數(shù)循環(huán)結(jié)構(gòu)DJNZ Rn,relDJNZ Rn,rel;工作寄存器作控制計數(shù)器;工作寄存器作控制計數(shù)器1 1、單循環(huán)定時程序、單循環(huán)定時程序例例 MOV R5,#TIMEMOV R5,#TI

27、MELOOP:NOP 1TLOOP:NOP 1T NOP 1T NOP 1T DJNZ R5 DJNZ R5,LOOP 2TLOOP 2T循環(huán)體為循環(huán)體為4T4T,若晶振為,若晶振為6MHz,6MHz,則則T=12/fosc=2T=12/fosc=2s s一次循環(huán)延遲時間:一次循環(huán)延遲時間:4 4* *T=8T=8s s程序的延遲時間:程序的延遲時間:8*TIME(s s)該程序最大延遲時間:該程序最大延遲時間:256*8=2048 (s s)2 2,多重循環(huán)定時,多重循環(huán)定時例例4-164-16 50ms 50ms延時程序。延時程序。 延時程序與延時程序與MCS-51MCS-51指令執(zhí)行時間

28、有很大的關(guān)指令執(zhí)行時間有很大的關(guān)系。在使用系。在使用12MHz12MHz晶振時,一個機器周期為晶振時,一個機器周期為1 1s,s,執(zhí)行一條執(zhí)行一條DJNZDJNZ指令的時間為指令的時間為2 2s s。這時,可用。這時,可用雙重循環(huán)方法寫出下面如下的延時雙重循環(huán)方法寫出下面如下的延時50ms50ms的程序:的程序:DEL: MOV R7,#200DEL: MOV R7,#200DEL1: MOV R6,#125 DEL1: MOV R6,#125 DEL2: DJNZ R6,DEL2 DEL2: DJNZ R6,DEL2 ;125125* *2=2502=250s s DJNZ R7,DEL1

29、DJNZ R7,DEL1 ;0.25ms0.25ms* *200=50ms200=50ms RET RET 以上延時程序不太精確,它沒有考慮到除以上延時程序不太精確,它沒有考慮到除“DJNZ R6,DEL2 ”DJNZ R6,DEL2 ”指令外的其它指令的執(zhí)行時間,如把其它指令的執(zhí)行時間指令外的其它指令的執(zhí)行時間,如把其它指令的執(zhí)行時間計算在內(nèi),它的延時時間為:計算在內(nèi),它的延時時間為: DEL: MOV R7,#200 1TDEL: MOV R7,#200 1TDEL1: MOV R6,#125 1TDEL1: MOV R6,#125 1TDEL2: DJNZ R6,DEL2 DEL2: D

30、JNZ R6,DEL2 ;125125* *2=2502=250s 2Ts 2T DJNZ R7,DEL1 2T DJNZ R7,DEL1 2T(250+1+2250+1+2)* *200+1=50.301ms200+1=50.301ms 如果要求比較精確的延時,可按如下修改:如果要求比較精確的延時,可按如下修改:DEL: MOV R7,#200 DEL: MOV R7,#200 1T1TDEL1: MOV R6,#123 DEL1: MOV R6,#123 1T1T NOP 1 NOP 1T TDEL2: DJNZ R6,DEL2 DEL2: DJNZ R6,DEL2 ; 123123* *

31、2T2T DJNZ R7,DEL1 DJNZ R7,DEL1 ;(1+1+123(1+1+123* *2+2)2+2)* *200+1=50001T=500001200+1=50001T=500001s=s=50.001ms50.001ms實際延遲時間為實際延遲時間為50.001ms50.001ms,注意。軟件延時程序,不允許有中,注意。軟件延時程序,不允許有中斷,否則將嚴重影響定時的準確性。斷,否則將嚴重影響定時的準確性。采用增減指令對定時程序進行微調(diào) MOV R0, #TIME 1T LOOP:ADD A,R1 1T INC DPTR 2T DJNZ R0,LOOP 2T在6MHz晶振下,

32、機器周期T=12/fosc=2T=12/fosc=2s s定時時間為:定時時間為:5 5* *2 2* *TIME(TIME(s s) )假設(shè)定時時間要求為假設(shè)定時時間要求為2424s,s,可以調(diào)整循環(huán)體的可以調(diào)整循環(huán)體的機器周期。機器周期。 MOV R0, #TIME 1T LOOP:ADD A,R1 1T INC DPTR 2T NOP 1T DJNZ R0,LOOP 2T使TIME=2定時時間=6*2s s* *2=242=24s s1、定點數(shù)的表示法、定點數(shù)的表示法1)原碼:符號位)原碼:符號位=0 正數(shù)正數(shù) 符號位符號位=1 負數(shù)負數(shù)加減運算時,必須按符號位的不同執(zhí)行不同的運算。加減

33、運算時,必須按符號位的不同執(zhí)行不同的運算。 正數(shù):正數(shù):N補補=N原原2)補碼:)補碼: N補補=數(shù)值位取反數(shù)值位取反+1 負數(shù):負數(shù): =2n-數(shù)值數(shù)值 n是整數(shù)的位數(shù)是整數(shù)的位數(shù) 補碼可直接帶符號位進行運算,用補碼可直接帶符號位進行運算,用OV位表示溢出與否位表示溢出與否 補碼表示法的優(yōu)點是加減運算方便: (83)10+(-4)10=(01010011)2+(11111100)2 =(01001111)2=(79)10 補碼表示的數(shù)在執(zhí)行乘除運算時,先轉(zhuǎn)換成原碼,在執(zhí)行原碼乘除,最后把積轉(zhuǎn)換成補碼 例 雙字節(jié)數(shù)取補子程序 (R4R5)取補(R4R5)CMPT: MOV A, R5 CPL

34、A ADD A, #1 MOV R5,A MOV A,R4 CPL A ADDC A,#0 MOV R4, A RET2.2.帶符號數(shù)的移位帶符號數(shù)的移位帶符號數(shù)進行算數(shù)移位時,必須保持最高位不變。(1)正數(shù):左移右移都移入0(2)負數(shù):原碼表示:符號位不變,左移右移 都移入0 補碼表示:符號位不變,右移移入 1,左移移入0例 雙字節(jié)原碼左移一位子程序。(R2R3)左移一位(R2R3)R2R3C0MOV A, R3CLR C ; 保證讓左移移入0RLC AMOV R3,AMOV A,R2RLC AMOV A.7,C ;恢復符號位MOV R2, AR2R3C0符號位不變符號位不變例 雙字節(jié)原碼右

35、移一位子程序(R2R3)右移一位( R2R3) 0MOV A,R2MOV C,A.7 ;保護符號位CLR A.7 ;移入0RRC AMOV R2,AMOV A,R3RRC AMOV R3,AR2R3CC符號位不變符號位不變A(R2)C符號位0例 雙字節(jié)補碼右移一位子程序功能(R2R3)右移一位(R2R3)MOV A, R2MOV C, A.7 ;保護符號位RRC A ;移入符號位MOV R2, AMOV A, R3RRC AMOV R3,AR2R3C符號位不變符號位不變1CA(R2)C符號位1三、定點數(shù)加減運算原碼的加減運算需根據(jù)符號位和不同的運算進行分類操作。補碼加減運算非常方便,一般采用補

36、碼進行加減運算。 例 雙字節(jié)補碼加法子程序 (R2R3)+(R6R7) (R4R5) R2 R3+ R6 R7 R4 R5MOV A ,R3ADD A, R7MOV R5, AMOV A, R2ADDC A ,R6MOV R4,A四、定點數(shù)乘法運算1)無符號數(shù)二進制乘法A=1011 B=1001 1011 1001 1011 0000 0000 + 1011 1100011 乘積A*B乘數(shù)左移與部分積相加乘數(shù)左移與部分積相加部分積右移部分積右移+ +被乘數(shù)。被乘數(shù)。算法:算法:從低位開始檢查各個乘數(shù)的位數(shù)(從低位開始檢查各個乘數(shù)的位數(shù)(乘數(shù)右移乘數(shù)右移)若乘數(shù)位數(shù)為若乘數(shù)位數(shù)為1 1,部分積右

37、移,部分積右移+ +被乘數(shù)被乘數(shù)部分積。部分積。若乘數(shù)位數(shù)為若乘數(shù)位數(shù)為0,部分積右移,部分積右移部分積。部分積。 2)MCS-51快速乘法把MCS51的單字節(jié)運算擴展為雙字節(jié)的乘法計算原理 R2 R3 R6 R7 R3R7H R3R7L R2R7H R2R7L R3R6H R3R6L R2R6H R2R6L R4 R5 R6 R7例 無符號雙字節(jié)快速乘法(R2R3)*(R6R7)(R4R5R6R7)MOV A, R3 MOV B, R7 MUL AB ; R3R7 BAXCH A, R7 R7= R3R7LMOV R5,B ; B=R5= R3R7HMOV B,R2MUL AB R2R7 B

38、AADD A,R5 A=R2R7L+R3R7HMOV R4,A R4=R2R7L+R3R7H CLR AADDC A,B MOV R5,A ; (R5)=R2R7H4.3.9 4.3.9 碼制轉(zhuǎn)換程序設(shè)計碼制轉(zhuǎn)換程序設(shè)計 在單片機應(yīng)用程序的設(shè)計中,經(jīng)常涉及到各種碼制的轉(zhuǎn)在單片機應(yīng)用程序的設(shè)計中,經(jīng)常涉及到各種碼制的轉(zhuǎn)換問題。在單片機系統(tǒng)內(nèi)部經(jīng)常采用二進制碼。在輸換問題。在單片機系統(tǒng)內(nèi)部經(jīng)常采用二進制碼。在輸入入/ /輸出中,按照人的習慣均采用代表十進制數(shù)的輸出中,按照人的習慣均采用代表十進制數(shù)的BCDBCD碼表示。此外,打印機要打印某數(shù)字字符,則需要將碼表示。此外,打印機要打印某數(shù)字字符,則需

39、要將該數(shù)字的二進制碼轉(zhuǎn)換為該字符的該數(shù)字的二進制碼轉(zhuǎn)換為該字符的ASCIIASCII碼碼。 轉(zhuǎn)換類型包括:轉(zhuǎn)換類型包括:二進制碼與二進制碼與ASCII碼之間的轉(zhuǎn)換碼之間的轉(zhuǎn)換 二進制與二進制與BCDBCD碼之間的轉(zhuǎn)換碼之間的轉(zhuǎn)換 一、一、二進制碼與二進制碼與ASCII碼之間的轉(zhuǎn)換碼之間的轉(zhuǎn)換 由ASCII碼字符表可知,09的ASCII碼為30H39H,AF的ASCII碼為41H46H例例 R0R0的低的低4 4位是一個二進制數(shù),表示(位是一個二進制數(shù),表示(0F0F) ,把,把它數(shù)碼轉(zhuǎn)換為它數(shù)碼轉(zhuǎn)換為ASCIIASCII代碼并存入代碼并存入R0R0說明:二進制說明:二進制+30H=+30H=其

40、其ASCIIASCII代碼代碼 二進制二進制 9 9; 二進制二進制+40H=其其ASCII代碼代碼 二進制二進制 9;三種方法:三種方法: 1)若)若R0 9 R0+30HR0; 若若R0 9 R0+37HR02 )利用利用DAA指令指令3)查表查表方法一:方法一:ORG 0400HMOV A,R0 ;取轉(zhuǎn)換值送AANL A,#0FH ;屏蔽高四位ADD A,#90H ;A中內(nèi)容+90HDA A ; 十進制調(diào)整ADDC A,#40H ;A中內(nèi)容+40HDA A ; 十進制調(diào)整MOV R0,A ;存轉(zhuǎn)換結(jié)果SJMP $ ;結(jié)束END 方法二:利用方法二:利用DA A指令指令方法三方法三 :查表

41、:查表ORG 0400HMOV A, R0 ANL A,#0FH ;屏蔽高4位ADD A,#03H ;地址調(diào)整MOVC A,A+PC ;查表MOV R0,A ;存結(jié)果SJMP,$ASCTAB: DB 0, 1,2,3,4 DB 5, 6,7,8,9 DB A, B,C,D,E,F END多位十六進制數(shù)轉(zhuǎn)換成ASCII碼思路:低四位轉(zhuǎn)換成低四位轉(zhuǎn)換成ASCIIASCII高四位轉(zhuǎn)換成高四位轉(zhuǎn)換成ASCIIASCII循環(huán)體完成一個循環(huán)體完成一個字節(jié)十六進制數(shù)字節(jié)十六進制數(shù)的轉(zhuǎn)換的轉(zhuǎn)換字節(jié)字節(jié)-1不為不為0轉(zhuǎn)移轉(zhuǎn)移結(jié)束結(jié)束例例 多位十六進制數(shù)轉(zhuǎn)換為多位十六進制數(shù)轉(zhuǎn)換為ASCIIASCII碼碼入口:入口

42、:(R0R0)= =十六進制數(shù)低位地址指針十六進制數(shù)低位地址指針(R2R2)= =字節(jié)數(shù)字節(jié)數(shù) 出口:出口:(R1R1)=ASCII=ASCII碼地址指針碼地址指針二、二、二進制碼到二進制碼到BCDBCD碼的轉(zhuǎn)換碼的轉(zhuǎn)換二進制二進制1111001B=121DBCD碼(一個字節(jié)表示一個BCD碼)0000000100000010120000000110000000100100001121壓縮BCD碼(一個字節(jié)表示2個BCD碼)方法一:通過除以方法一:通過除以10001000、100100、1010等等1010的次冪,獲得千、百、十的次冪,獲得千、百、十位數(shù)位數(shù) 例 8位二進制數(shù)轉(zhuǎn)換成BCD數(shù)(A)

43、為二進制數(shù),R0為十位數(shù)和個位數(shù)地址指針(壓縮的BCD碼)MOV B,#100DIV AB ;(A)=百位數(shù)MOV R0,A ; 存入RAMINC R0;MOV A, #10XCH A, BDIV A, B ; (A)=十位數(shù),(B)=個位數(shù)SWAP A ADD A,B ; 合成到(A)MOV R0, A 存入RAM該方法的缺點:被轉(zhuǎn)換數(shù)較大時,需進行多字節(jié)除該方法的缺點:被轉(zhuǎn)換數(shù)較大時,需進行多字節(jié)除法運算,運算速度較慢,程序缺乏通用性法運算,運算速度較慢,程序缺乏通用性方法二:Y=an2n+an-12n-1+an-22n-2+a0 =(an2)+an-1) 2+an-2 ) 2) 2 +a0(每次相加時進行BCD碼調(diào)整)例例 雙字節(jié)二進制數(shù)轉(zhuǎn)換為雙字節(jié)二進制數(shù)轉(zhuǎn)換為BCDBCD數(shù)數(shù)入口:入口:(R2R3R2R3)為雙字節(jié))為雙字節(jié)1616位二進制數(shù)位二進制數(shù)出口:(出口:(R4R5R6R4R5R6為轉(zhuǎn)換完的壓縮為轉(zhuǎn)換完的壓縮BCDBCD碼)碼)Y=a727+a626+a525+a0 =(a72)+a6) 2+a5 ) 2) 2 +a0(每次相加時進行BCD碼調(diào)整)計算結(jié)果計算結(jié)果2+ R2R3+ R2R3的次高位的次高位計算結(jié)果計算結(jié)果R2R3CR4R5R62CR4R5R6二進制位數(shù)二進制位數(shù)-1=0?結(jié)束結(jié)束R4R5

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論