版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、4.1 4.1 匯編語言程序設(shè)計(jì)概述匯編語言程序設(shè)計(jì)概述 4.1.1 4.1.1 機(jī)器語言、匯編語言和高級(jí)語言機(jī)器語言、匯編語言和高級(jí)語言用于程序設(shè)計(jì)的用于程序設(shè)計(jì)的語言基本上分為語言基本上分為3 3種:機(jī)器語言、種:機(jī)器語言、匯編語言和高級(jí)語言匯編語言和高級(jí)語言。 1.1.機(jī)器語言機(jī)器語言 二進(jìn)制代碼表示的指令、數(shù)字和符號(hào)簡稱為機(jī)二進(jìn)制代碼表示的指令、數(shù)字和符號(hào)簡稱為機(jī)器語言器語言 不易懂,難記憶,易出錯(cuò)。不易懂,難記憶,易出錯(cuò)。 2匯編語言匯編語言 英文助記符表示的指令稱為英文助記符表示的指令稱為符號(hào)語言符號(hào)語言或或匯編語言匯編語言匯編語言特點(diǎn):匯編語言特點(diǎn):面向機(jī)器的語言,程序設(shè)計(jì)員須對(duì)
2、面向機(jī)器的語言,程序設(shè)計(jì)員須對(duì)MCS-51MCS-51的硬件的硬件有相當(dāng)深入的了解。有相當(dāng)深入的了解。(1)(1) 助記符指令和機(jī)器指令一一對(duì)應(yīng),用匯編語言編助記符指令和機(jī)器指令一一對(duì)應(yīng),用匯編語言編寫的寫的程序效率高程序效率高,占用,占用存儲(chǔ)空間小存儲(chǔ)空間小,運(yùn)行,運(yùn)行速度快速度快,用匯編語言能編寫出最優(yōu)化的程序。用匯編語言能編寫出最優(yōu)化的程序。 能直接管理和控制硬件設(shè)備(功能部件),它能處理能直接管理和控制硬件設(shè)備(功能部件),它能處理中斷,也能直接訪問存儲(chǔ)器及中斷,也能直接訪問存儲(chǔ)器及I/OI/O接口電路。接口電路。匯編語言和機(jī)器語言都脫離不開具體機(jī)器的硬件,均匯編語言和機(jī)器語言都脫離不
3、開具體機(jī)器的硬件,均是面向是面向“機(jī)器機(jī)器”的語言,缺乏通用性。的語言,缺乏通用性。3 3高級(jí)語言高級(jí)語言不受具體機(jī)器的限制不受具體機(jī)器的限制, ,使用了許多數(shù)學(xué)公式和數(shù)學(xué)計(jì)算使用了許多數(shù)學(xué)公式和數(shù)學(xué)計(jì)算上的習(xí)慣用語,上的習(xí)慣用語,非常擅長于科學(xué)計(jì)算。非常擅長于科學(xué)計(jì)算。常用的如常用的如BASICBASIC、FORTRANFORTRAN以及以及C C語言等。語言等。高級(jí)語言優(yōu)點(diǎn):通用性強(qiáng),直觀、易懂、易學(xué),可讀高級(jí)語言優(yōu)點(diǎn):通用性強(qiáng),直觀、易懂、易學(xué),可讀性好。性好。使用使用C C語言(語言(C51C51)、)、PL/MPL/M語言來進(jìn)行語言來進(jìn)行MCS-51MCS-51的應(yīng)用程的應(yīng)用程序設(shè)計(jì)
4、。序設(shè)計(jì)。 對(duì)于程序的空間和時(shí)間要求很高的場合,匯編語言仍對(duì)于程序的空間和時(shí)間要求很高的場合,匯編語言仍是必不可缺的。是必不可缺的。 C C語言和匯編語言混合編程語言和匯編語言混合編程 在很多需要直接控制硬件的應(yīng)用場合,則更是非用匯在很多需要直接控制硬件的應(yīng)用場合,則更是非用匯編語言不可編語言不可 使用匯編語言編程,是單片機(jī)程序設(shè)計(jì)的使用匯編語言編程,是單片機(jī)程序設(shè)計(jì)的基本功之一基本功之一4.1.2 4.1.2 匯編語言語句的種類和格式匯編語言語句的種類和格式兩種基本類型:指令語句和偽指令語句兩種基本類型:指令語句和偽指令語句(1 1)指令語句)指令語句已在第已在第3 3章介紹章介紹每一條指令
5、語句在匯編時(shí)都產(chǎn)生一個(gè)指令代碼每一條指令語句在匯編時(shí)都產(chǎn)生一個(gè)指令代碼機(jī)機(jī)器代碼器代碼(2 2)偽指令語句)偽指令語句 是為匯編服務(wù)的。在匯編時(shí)是為匯編服務(wù)的。在匯編時(shí)沒有機(jī)器代碼與之對(duì)應(yīng)。沒有機(jī)器代碼與之對(duì)應(yīng)。 MCS-51MCS-51的匯編語言的的匯編語言的四分段格式四分段格式如下:如下: 標(biāo)號(hào)字段標(biāo)號(hào)字段 操作碼字段操作碼字段 操作數(shù)字段操作數(shù)字段 注釋字段注釋字段例例4-14-1 下面是一段匯編語言程序的四分段書寫格式下面是一段匯編語言程序的四分段書寫格式 基本語法規(guī)則:基本語法規(guī)則:1 1標(biāo)號(hào)字段標(biāo)號(hào)字段是語句所在地址的標(biāo)志符號(hào)是語句所在地址的標(biāo)志符號(hào) 標(biāo)號(hào)字段標(biāo)號(hào)字段 操作碼字段操
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美元符號(hào)美元符號(hào)$ $的使用的使用用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下指令:指令: JNB F0JNB F0, $ $與如下指令是等價(jià)的:與如下指令是等價(jià)的:HEREHERE:JNB F0JNB
7、F0,HEREHERE 再如:再如:HEREHERE:SJMP HERESJMP HERE可寫為:可寫為: SJMP $SJMP $4.2 4.2 匯編語言源程序的匯編匯編語言源程序的匯編匯編語言源程序匯編語言源程序 “ “翻譯翻譯”成機(jī)器代碼(指令代碼)的成機(jī)器代碼(指令代碼)的過程稱為過程稱為“匯編匯編”。匯編可分為。匯編可分為手工匯編手工匯編和和機(jī)器匯編機(jī)器匯編兩類兩類: :4.2.1 4.2.1 手工匯編手工匯編人工查表翻譯指令人工查表翻譯指令。但遇到的相對(duì)轉(zhuǎn)移指令的偏移量的。但遇到的相對(duì)轉(zhuǎn)移指令的偏移量的計(jì)算,要根據(jù)轉(zhuǎn)移的目標(biāo)地址計(jì)算偏移量,不但麻煩,計(jì)算,要根據(jù)轉(zhuǎn)移的目標(biāo)地址計(jì)算偏
8、移量,不但麻煩,且容易出錯(cuò)。且容易出錯(cuò)。4.2.2 4.2.2 機(jī)器匯編機(jī)器匯編用編輯軟件進(jìn)行源程序的編輯。編輯完成后,生成一個(gè)用編輯軟件進(jìn)行源程序的編輯。編輯完成后,生成一個(gè)ASCIIASCII碼文件,擴(kuò)展名為碼文件,擴(kuò)展名為“.ASM”.ASM”。然后在微計(jì)算機(jī)。然后在微計(jì)算機(jī)上運(yùn)行匯編程序,把匯編語言源程序翻譯成機(jī)器代碼。上運(yùn)行匯編程序,把匯編語言源程序翻譯成機(jī)器代碼。交叉匯編交叉匯編匯編后的機(jī)器代碼是在另一臺(tái)計(jì)算機(jī)(這匯編后的機(jī)器代碼是在另一臺(tái)計(jì)算機(jī)(這里是單片機(jī))上運(yùn)行。里是單片機(jī))上運(yùn)行。 MCS-51MCS-51單片機(jī)的應(yīng)用程序的完成,應(yīng)經(jīng)過三個(gè)步驟;單片機(jī)的應(yīng)用程序的完成,應(yīng)經(jīng)
9、過三個(gè)步驟;(1 1)在微計(jì)算機(jī)上,運(yùn)行編輯程序進(jìn)行源程序的輸入)在微計(jì)算機(jī)上,運(yùn)行編輯程序進(jìn)行源程序的輸入 和編輯;和編輯; (2 2)對(duì)源程序進(jìn)行交叉匯編得到機(jī)器代碼;)對(duì)源程序進(jìn)行交叉匯編得到機(jī)器代碼;(3 3)通過微計(jì)算機(jī)的串行口(或并行口)把機(jī)器代碼)通過微計(jì)算機(jī)的串行口(或并行口)把機(jī)器代碼傳送到傳送到用戶樣機(jī)(或在線仿真器用戶樣機(jī)(或在線仿真器)進(jìn)行程序的調(diào)試)進(jìn)行程序的調(diào)試和運(yùn)行。和運(yùn)行。反匯編反匯編分析現(xiàn)成產(chǎn)品的程序,要將二進(jìn)制的機(jī)器分析現(xiàn)成產(chǎn)品的程序,要將二進(jìn)制的機(jī)器代碼語言程序翻譯成匯編語言源程序。代碼語言程序翻譯成匯編語言源程序。4.3 4.3 匯編語言實(shí)用程序設(shè)計(jì)匯編
10、語言實(shí)用程序設(shè)計(jì)4.3.3 4.3.3 查表程序設(shè)計(jì)查表程序設(shè)計(jì) 數(shù)據(jù)補(bǔ)償、修正、計(jì)算、轉(zhuǎn)換等各種功能,具有程序數(shù)據(jù)補(bǔ)償、修正、計(jì)算、轉(zhuǎn)換等各種功能,具有程序簡單、執(zhí)行速度快等優(yōu)點(diǎn)。簡單、執(zhí)行速度快等優(yōu)點(diǎn)。查表就是根據(jù)自變量查表就是根據(jù)自變量x,x,在表格中尋找在表格中尋找y,y,使使y=f(x)y=f(x)。執(zhí)行查表指令時(shí),發(fā)出讀程序存儲(chǔ)器選通脈沖執(zhí)行查表指令時(shí),發(fā)出讀程序存儲(chǔ)器選通脈沖/PSEN/PSEN。在在MCS-51MCS-51的指令系統(tǒng)中,給用戶提供了的指令系統(tǒng)中,給用戶提供了兩條極為有兩條極為有用的查表指令:用的查表指令: MOVC A MOVC A,A+DPTRA+DPTR M
11、OVC A MOVC A,A+PCA+PC指令指令“MOVC AMOVC A,A+DPTR”A+DPTR”完成把完成把A A中的內(nèi)容作為一個(gè)中的內(nèi)容作為一個(gè)無符號(hào)數(shù)與無符號(hào)數(shù)與DPTRDPTR中的內(nèi)容相加,所得結(jié)果為某一程中的內(nèi)容相加,所得結(jié)果為某一程序序。指令執(zhí)行完指令執(zhí)行完,PC,PC的內(nèi)容不發(fā)生變化,仍指向查的內(nèi)容不發(fā)生變化,仍指向查表指令的下一條指令。表指令的下一條指令。優(yōu)點(diǎn)優(yōu)點(diǎn)在于預(yù)處理較少且不影響其它特殊功能寄在于預(yù)處理較少且不影響其它特殊功能寄存器的值,所以不必保護(hù)其它特殊功能寄存存器的值,所以不必保護(hù)其它特殊功能寄存器的原先值。器的原先值。缺點(diǎn)缺點(diǎn)在于該表格只能存放在這條指令的
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 Y3Y2Y1Y0+2
13、 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對(duì)應(yīng)的平方。對(duì)應(yīng)的平方。 MOVC AMOVC A,A+DPTR A+DPTR 這條指令的應(yīng)用范圍較為廣這條指令的應(yīng)用范圍較為廣泛,一般情
14、況下,大多使用該指令,使用該指令時(shí)泛,一般情況下,大多使用該指令,使用該指令時(shí)不必計(jì)算偏移量,使用該指令的優(yōu)點(diǎn)是表格可以設(shè)不必計(jì)算偏移量,使用該指令的優(yōu)點(diǎn)是表格可以設(shè)在在64K64K程序存儲(chǔ)器空間內(nèi)的任何地方,而不像程序存儲(chǔ)器空間內(nèi)的任何地方,而不像 MOVC MOVC A A,A+PCA+PC那樣只設(shè)在那樣只設(shè)在PCPC下面的下面的256256個(gè)單元中,使用較個(gè)單元中,使用較方便。方便。 上面的程序可改成如下形式:上面的程序可改成如下形式: PUSH DPH PUSH DPH ;保存;保存DPHDPH PUSH DPL PUSH DPL ;保存;保存DPLDPL MOV DPTR MOV D
15、PTR,#TAB1#TAB1 MOVC A MOVC A,A+DPTRA+DPTR POP DPL POP DPL ;恢復(fù);恢復(fù)DPLDPL POP DPH POP DPH ;恢復(fù);恢復(fù)DPHDPH RET RETTAB1: DB 00HTAB1: DB 00H,01H01H,04H04H,09H09H,10H 10H DB 19H DB 19H,24H24H,31H31H,40H40H,51H51H例例4-24-2 在一個(gè)以在一個(gè)以MCS-51MCS-51為核心的溫度控制器中,溫度為核心的溫度控制器中,溫度傳感器輸出的電壓與溫度為非線性關(guān)系,傳感器輸傳感器輸出的電壓與溫度為非線性關(guān)系,傳感器
16、輸出的電壓已由出的電壓已由A/DA/D轉(zhuǎn)換為轉(zhuǎn)換為1010位二進(jìn)制數(shù)。根據(jù)測得的位二進(jìn)制數(shù)。根據(jù)測得的不同溫度下的電壓值數(shù)據(jù)構(gòu)成一個(gè)表,表中放溫度不同溫度下的電壓值數(shù)據(jù)構(gòu)成一個(gè)表,表中放溫度 值值y y,x x為電壓值數(shù)據(jù)。設(shè)測得的電壓值為電壓值數(shù)據(jù)。設(shè)測得的電壓值x x放入放入R2R3R2R3中,中,根據(jù)電壓值根據(jù)電壓值x x,查找對(duì)應(yīng)的溫度值,查找對(duì)應(yīng)的溫度值y y,仍放入,仍放入R2R3R2R3中。中。本例的本例的x x和和y y均為雙字節(jié)無符號(hào)數(shù)。程序如下:均為雙字節(jié)無符號(hào)數(shù)。程序如下: LTB2LTB2:MOV DPTR,#TAB2MOV DPTR,#TAB2 MOV A,R3 MO
17、V 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,A MOV
18、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è)有一個(gè)巡回檢測報(bào)警裝置,需對(duì)設(shè)有一個(gè)巡回檢測報(bào)警裝置,需對(duì)1616路輸入進(jìn)路輸入進(jìn)行檢測,行檢測,每路有一最大允許值,為雙字節(jié)數(shù)每路有一最大允許值,為雙字節(jié)數(shù)。運(yùn)行運(yùn)行時(shí),需根據(jù)測量的路數(shù),找出每路的最大允許值。時(shí),需根據(jù)測量的路數(shù),找出每路的
19、最大允許值。看輸入值是否大于最大允許值,如大于就報(bào)警。根看輸入值是否大于最大允許值,如大于就報(bào)警。根據(jù)上述要求,編一個(gè)查表程序。據(jù)上述要求,編一個(gè)查表程序。 取路數(shù)為取路數(shù)為x(0 x15),yx(0 x15),y為最大允許值,放在表格中。為最大允許值,放在表格中。設(shè)進(jìn)入查表程序前,路數(shù)設(shè)進(jìn)入查表程序前,路數(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 A,R2 ;
20、(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,3265732
21、657,883883,99439943 DW 10000 DW 10000,4051140511,67586758,89318931 DW 4468 DW 4468,58715871,1328413284,2780827808表格長度不能超過表格長度不能超過256256個(gè)字節(jié),且表格只能存放于個(gè)字節(jié),且表格只能存放于MOVC MOVC A,A+PCA,A+PC指令以下的指令以下的256256個(gè)單元中。個(gè)單元中。查表指令查表指令(MOVC A,A+PC (MOVC A,A+PC 、 MOVC A,A+DPTR)MOVC A,A+DPTR)的區(qū)別的區(qū)別1 1)MOVC A,A+PCMOVC A,A
22、+PC表格長度不能超過表格長度不能超過256256個(gè)字節(jié),且表個(gè)字節(jié),且表格只能存放于格只能存放于MOVC A,A+PCMOVC A,A+PC指令以下的指令以下的256256個(gè)單元中。個(gè)單元中。 MOVC A,A+DPTRMOVC A,A+DPTR表格可以設(shè)在表格可以設(shè)在64K64K程序存儲(chǔ)器空間內(nèi)程序存儲(chǔ)器空間內(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,從表中取指令時(shí),也要分從表中取指令時(shí),也要分1 1、2 2或或3 3次進(jìn)行。次進(jìn)行。單字節(jié)指令單字節(jié)指令單字節(jié)指令單字節(jié)指令基址+0基址+1基址+2(A)=0(A)=1基址+0基址+1基址+2(A)=0對(duì)應(yīng)的一條指令(A)=1對(duì)應(yīng)的一條指令單字節(jié)指令A(yù)=A1雙字節(jié)指令A(yù)=A2基址+0基址+1基址+2(A)=0對(duì)應(yīng)的一條指令(A)=1對(duì)應(yīng)的一條指令三字節(jié)指令A(yù)=A3基址+3基址+4基址+54.3.5 4.3.5 數(shù)據(jù)極值查找程序設(shè)計(jì)數(shù)據(jù)極值查找程序設(shè)計(jì)在指定的數(shù)據(jù)區(qū)中找出最大值(或最小值)
24、。在指定的數(shù)據(jù)區(qū)中找出最大值(或最小值)。進(jìn)行數(shù)值大小的比較,從這批數(shù)據(jù)中找出最進(jìn)行數(shù)值大小的比較,從這批數(shù)據(jù)中找出最大值(或最小值)并存于某一單元中。大值(或最小值)并存于某一單元中。例例4-9 已知內(nèi)部已知內(nèi)部RAM ADDR為起始的數(shù)據(jù)塊為起始的數(shù)據(jù)塊內(nèi)數(shù)據(jù)是無符號(hào)數(shù),塊長在內(nèi)數(shù)據(jù)是無符號(hào)數(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 MAX,#00
25、H ; 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個(gè)處理程序J
26、MP3: 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è)計(jì)循環(huán)程序設(shè)計(jì) 計(jì)數(shù)循環(huán)結(jié)構(gòu)計(jì)數(shù)循環(huán)結(jié)構(gòu)DJNZ Rn,relDJNZ Rn,rel;工作寄存器作控制計(jì)數(shù)器;工作寄存器作控制計(jì)數(shù)器1 1、單循環(huán)定時(shí)程序、單循環(huán)定時(shí)程序例例 MOV R5,#TIMEMOV R5,#TIMELOOP
27、: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)延遲時(shí)間:一次循環(huán)延遲時(shí)間:4 4* *T=8T=8s s程序的延遲時(shí)間:程序的延遲時(shí)間:8*TIME(s s)該程序最大延遲時(shí)間:該程序最大延遲時(shí)間:256*8=2048 (s s)2 2,多重循環(huán)定時(shí),多重循環(huán)定時(shí)例例4-164-16 50ms 50ms延時(shí)程序。延時(shí)程序。 延時(shí)程序與延時(shí)程序與MCS-51MCS-51指令執(zhí)行時(shí)間有很大的關(guān)指
28、令執(zhí)行時(shí)間有很大的關(guān)系。在使用系。在使用12MHz12MHz晶振時(shí),一個(gè)機(jī)器周期為晶振時(shí),一個(gè)機(jī)器周期為1 1s,s,執(zhí)行一條執(zhí)行一條DJNZDJNZ指令的時(shí)間為指令的時(shí)間為2 2s s。這時(shí),可用。這時(shí),可用雙重循環(huán)方法寫出下面如下的延時(shí)雙重循環(huán)方法寫出下面如下的延時(shí)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=250 s s DJNZ R7,DEL1 DJNZ
29、R7,DEL1 ;0.25ms0.25ms* *200=50ms200=50ms RET RET 以上延時(shí)程序不太精確,它沒有考慮到除以上延時(shí)程序不太精確,它沒有考慮到除“DJNZ R6,DEL2 ”DJNZ R6,DEL2 ”指令外的其它指令的執(zhí)行時(shí)間,如把其它指令的執(zhí)行時(shí)間指令外的其它指令的執(zhí)行時(shí)間,如把其它指令的執(zhí)行時(shí)間計(jì)算在內(nèi),它的延時(shí)時(shí)間為:計(jì)算在內(nèi),它的延時(shí)時(shí)間為: DEL: MOV R7,#200 1TDEL: MOV R7,#200 1TDEL1: MOV R6,#125 1TDEL1: MOV R6,#125 1TDEL2: DJNZ R6,DEL2 DEL2: DJNZ R
30、6,DEL2 ;125125* *2=2502=250 s 2Ts 2T DJNZ R7,DEL1 2T DJNZ R7,DEL1 2T(250+1+2250+1+2)* *200+1=50.301ms200+1=50.301ms 如果要求比較精確的延時(shí),可按如下修改:如果要求比較精確的延時(shí),可按如下修改: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* *2T2T
31、 DJNZ R7,DEL1 DJNZ R7,DEL1 ;(1+1+123(1+1+123* *2+2)2+2)* *200+1=50001T=500001200+1=50001T=500001 s=s=50.001ms50.001ms實(shí)際延遲時(shí)間為實(shí)際延遲時(shí)間為50.001ms50.001ms,注意。軟件延時(shí)程序,不允許有中,注意。軟件延時(shí)程序,不允許有中斷,否則將嚴(yán)重影響定時(shí)的準(zhǔn)確性。斷,否則將嚴(yán)重影響定時(shí)的準(zhǔn)確性。采用增減指令對(duì)定時(shí)程序進(jìn)行微調(diào) MOV R0, #TIME 1T LOOP:ADD A,R1 1T INC DPTR 2T DJNZ R0,LOOP 2T在6MHz晶振下,機(jī)器周
32、期T=12/fosc=2T=12/fosc=2s s定時(shí)時(shí)間為:定時(shí)時(shí)間為:5 5* *2 2* *TIME(TIME(s)s)假設(shè)定時(shí)時(shí)間要求為假設(shè)定時(shí)時(shí)間要求為2424s,s,可以調(diào)整循環(huán)體的可以調(diào)整循環(huán)體的機(jī)器周期。機(jī)器周期。 MOV R0, #TIME 1T LOOP:ADD A,R1 1T INC DPTR 2T NOP 1T DJNZ R0,LOOP 2T使TIME=2定時(shí)時(shí)間=6*2s s* *2=242=24s s1、定點(diǎn)數(shù)的表示法、定點(diǎn)數(shù)的表示法1)原碼:符號(hào)位)原碼:符號(hào)位=0 正數(shù)正數(shù) 符號(hào)位符號(hào)位=1 負(fù)數(shù)負(fù)數(shù)加減運(yùn)算時(shí),必須按符號(hào)位的不同執(zhí)行不同的運(yùn)算。加減運(yùn)算時(shí),必
33、須按符號(hào)位的不同執(zhí)行不同的運(yùn)算。 正數(shù):正數(shù):N補(bǔ)補(bǔ)=N原原2)補(bǔ)碼:)補(bǔ)碼: N補(bǔ)補(bǔ)=數(shù)值位取反數(shù)值位取反+1 負(fù)數(shù):負(fù)數(shù): =2n-數(shù)值數(shù)值 n是整數(shù)的位數(shù)是整數(shù)的位數(shù) 補(bǔ)碼可直接帶符號(hào)位進(jìn)行運(yùn)算,用補(bǔ)碼可直接帶符號(hào)位進(jìn)行運(yùn)算,用OV位表示溢出與否位表示溢出與否 補(bǔ)碼表示法的優(yōu)點(diǎn)是加減運(yùn)算方便: (83)10+(-4)10=(01010011)2+(11111100)2 =(01001111)2=(79)10 補(bǔ)碼表示的數(shù)在執(zhí)行乘除運(yùn)算時(shí),先轉(zhuǎn)換成原碼,在執(zhí)行原碼乘除,最后把積轉(zhuǎn)換成補(bǔ)碼 例 雙字節(jié)數(shù)取補(bǔ)子程序 (R4R5)取補(bǔ)(R4R5)CMPT: MOV A, R5 CPL A ADD
34、 A, #1 MOV R5,A MOV A,R4 CPL A ADDC A,#0 MOV R4, A RET2.2.帶符號(hào)數(shù)的移位帶符號(hào)數(shù)的移位帶符號(hào)數(shù)進(jìn)行算數(shù)移位時(shí),必須保持最高位不變。(1)正數(shù):左移右移都移入0(2)負(fù)數(shù):原碼表示:符號(hào)位不變,左移右移 都移入0 補(bǔ)碼表示:符號(hào)位不變,右移移入 1,左移移入0例 雙字節(jié)原碼左移一位子程序。(R2R3)左移一位(R2R3)R2R3C0MOV A, R3CLR C ; 保證讓左移移入0RLC AMOV R3,AMOV A,R2RLC AMOV A.7,C ;恢復(fù)符號(hào)位MOV R2, AR2R3C0符號(hào)位不變符號(hào)位不變例 雙字節(jié)原碼右移一位子程
35、序(R2R3)右移一位( R2R3) 0MOV A,R2MOV C,A.7 ;保護(hù)符號(hào)位CLR A.7 ;移入0RRC AMOV R2,AMOV A,R3RRC AMOV R3,AR2R3CC符號(hào)位不變符號(hào)位不變A(R2)C符號(hào)位0例 雙字節(jié)補(bǔ)碼右移一位子程序功能(R2R3)右移一位(R2R3)MOV A, R2MOV C, A.7 ;保護(hù)符號(hào)位RRC A ;移入符號(hào)位MOV R2, AMOV A, R3RRC AMOV R3,AR2R3C符號(hào)位不變符號(hào)位不變1CA(R2)C符號(hào)位1三、定點(diǎn)數(shù)加減運(yùn)算原碼的加減運(yùn)算需根據(jù)符號(hào)位和不同的運(yùn)算進(jìn)行分類操作。補(bǔ)碼加減運(yùn)算非常方便,一般采用補(bǔ)碼進(jìn)行加減
36、運(yùn)算。 例 雙字節(jié)補(bǔ)碼加法子程序 (R2R3)+(R6R7) (R4R5) R2 R3+ R6 R7 R4 R5MOV A ,R3ADD A, R7MOV R5, AMOV A, R2ADDC A ,R6MOV R4,A四、定點(diǎn)數(shù)乘法運(yùn)算1)無符號(hào)數(shù)二進(jìn)制乘法A=1011 B=1001 1011 1001 1011 0000 0000 + 1011 1100011 乘積A*B乘數(shù)左移與部分積相加乘數(shù)左移與部分積相加部分積右移部分積右移+ +被乘數(shù)。被乘數(shù)。算法:算法:從低位開始檢查各個(gè)乘數(shù)的位數(shù)(從低位開始檢查各個(gè)乘數(shù)的位數(shù)(乘數(shù)右移乘數(shù)右移)若乘數(shù)位數(shù)為若乘數(shù)位數(shù)為1 1,部分積右移,部分積
37、右移+ +被乘數(shù)被乘數(shù)部分積。部分積。若乘數(shù)位數(shù)為若乘數(shù)位數(shù)為0,部分積右移,部分積右移部分積。部分積。 2)MCS-51快速乘法把MCS51的單字節(jié)運(yùn)算擴(kuò)展為雙字節(jié)的乘法計(jì)算原理 R2 R3 R6 R7 R3R7H R3R7L R2R7H R2R7L R3R6H R3R6L R2R6H R2R6L R4 R5 R6 R7例 無符號(hào)雙字節(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 BAADD
38、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è)計(jì)碼制轉(zhuǎn)換程序設(shè)計(jì) 在單片機(jī)應(yīng)用程序的設(shè)計(jì)中,經(jīng)常涉及到各種碼制的轉(zhuǎn)在單片機(jī)應(yīng)用程序的設(shè)計(jì)中,經(jīng)常涉及到各種碼制的轉(zhuǎn)換問題。在單片機(jī)系統(tǒng)內(nèi)部經(jīng)常采用二進(jìn)制碼。在輸換問題。在單片機(jī)系統(tǒng)內(nèi)部經(jīng)常采用二進(jìn)制碼。在輸入入/ /輸出中,按照人的習(xí)慣均采用代表十進(jìn)制數(shù)的輸出中,按照人的習(xí)慣均采用代表十進(jìn)制數(shù)的BCDBCD碼表示。此外,打印機(jī)要打印某數(shù)字字符,則需要將碼表示。此外,打印機(jī)要打印某數(shù)字字符,則需要將該數(shù)字
39、的二進(jìn)制碼轉(zhuǎn)換為該字符的該數(shù)字的二進(jìn)制碼轉(zhuǎn)換為該字符的ASCIIASCII碼碼。 轉(zhuǎn)換類型包括:轉(zhuǎn)換類型包括:二進(jìn)制碼與二進(jìn)制碼與ASCII碼之間的轉(zhuǎn)換碼之間的轉(zhuǎn)換 二進(jìn)制與二進(jìn)制與BCDBCD碼之間的轉(zhuǎn)換碼之間的轉(zhuǎn)換 一、一、二進(jìn)制碼與二進(jìn)制碼與ASCII碼之間的轉(zhuǎn)換碼之間的轉(zhuǎn)換 由ASCII碼字符表可知,09的ASCII碼為30H39H,AF的ASCII碼為41H46H例例 R0R0的低的低4 4位是一個(gè)二進(jìn)制數(shù),表示(位是一個(gè)二進(jìn)制數(shù),表示(0F0F) ,把,把它數(shù)碼轉(zhuǎn)換為它數(shù)碼轉(zhuǎn)換為ASCIIASCII代碼并存入代碼并存入R0R0說明:二進(jìn)制說明:二進(jìn)制+30H=+30H=其其ASCI
40、IASCII代碼代碼 二進(jìn)制二進(jìn)制 9 9; 二進(jìn)制二進(jìn)制+40H=其其ASCII代碼代碼 二進(jìn)制二進(jìn)制 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 ; 十進(jìn)制調(diào)整ADDC A,#40H ;A中內(nèi)容+40HDA A ; 十進(jìn)制調(diào)整MOV R0,A ;存轉(zhuǎn)換結(jié)果SJMP $ ;結(jié)束END 方法二:利用方法二:利用DA A指令指令方法三方法三 :查表:查表OR
41、G 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多位十六進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼思路:低四位轉(zhuǎn)換成低四位轉(zhuǎn)換成ASCIIASCII高四位轉(zhuǎn)換成高四位轉(zhuǎn)換成ASCIIASCII循環(huán)體完成一個(gè)循環(huán)體完成一個(gè)字節(jié)十六進(jìn)制數(shù)字節(jié)十六進(jìn)制數(shù)的轉(zhuǎn)換的轉(zhuǎn)換字節(jié)字節(jié)-1不為不為0轉(zhuǎn)移轉(zhuǎn)移結(jié)束結(jié)束例例 多位十六進(jìn)制數(shù)轉(zhuǎn)換為多位十六進(jìn)制數(shù)轉(zhuǎn)換為ASCIIASCII碼碼入口:入口:(R0R
42、0)= =十六進(jìn)制數(shù)低位地址指針十六進(jìn)制數(shù)低位地址指針(R2R2)= =字節(jié)數(shù)字節(jié)數(shù) 出口:出口:(R1R1)=ASCII=ASCII碼地址指針碼地址指針二、二、二進(jìn)制碼到二進(jìn)制碼到BCDBCD碼的轉(zhuǎn)換碼的轉(zhuǎn)換二進(jìn)制二進(jìn)制1111001B=121DBCD碼(一個(gè)字節(jié)表示一個(gè)BCD碼)0000000100000010120000000110000000100100001121壓縮BCD碼(一個(gè)字節(jié)表示2個(gè)BCD碼)方法一:通過除以方法一:通過除以10001000、100100、1010等等1010的次冪,獲得千、百、十的次冪,獲得千、百、十位數(shù)位數(shù) 例 8位二進(jìn)制數(shù)轉(zhuǎn)換成BCD數(shù)(A)為二進(jìn)制數(shù)
43、,R0為十位數(shù)和個(gè)位數(shù)地址指針(壓縮的BCD碼)MOV B,#100DIV AB ;(A)=百位數(shù)MOV R0,A ; 存入RAMINC R0;MOV A, #10XCH A, BDIV A, B ; (A)=十位數(shù),(B)=個(gè)位數(shù)SWAP A ADD A,B ; 合成到(A)MOV R0, A 存入RAM該方法的缺點(diǎn):被轉(zhuǎn)換數(shù)較大時(shí),需進(jìn)行多字節(jié)除該方法的缺點(diǎn):被轉(zhuǎn)換數(shù)較大時(shí),需進(jìn)行多字節(jié)除法運(yùn)算,運(yùn)算速度較慢,程序缺乏通用性法運(yùn)算,運(yùn)算速度較慢,程序缺乏通用性方法二:Y=an2n+an-12n-1+an-22n-2+a0 =(an2)+an-1) 2+an-2 ) 2) 2 +a0(每次相加時(shí)進(jìn)行BCD碼調(diào)整)例例 雙字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換為雙字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換為BCDBCD數(shù)數(shù)入口:入口:(R2R3R2R3)為雙字節(jié))為雙字節(jié)1616位二進(jìn)制數(shù)位二進(jìn)制數(shù)出口:(出口:(R4R5R6R4R5R6為轉(zhuǎn)換完的壓縮為轉(zhuǎn)換完的壓縮BCDBCD碼)碼)Y=a727+a626+a525+a0 =(a72)+a6) 2+a5 ) 2) 2 +a0(每次相加時(shí)進(jìn)行BCD碼調(diào)整)計(jì)算結(jié)果計(jì)算結(jié)果2+ R2R3+ R2R3的次高位的次高位計(jì)算結(jié)果計(jì)算結(jié)果R2R3CR4R5R62CR4R5R6二進(jìn)制位數(shù)二進(jìn)制位數(shù)-1=0?結(jié)束結(jié)束R4
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 勤工助學(xué)工作總結(jié)15篇
- 酒店實(shí)習(xí)報(bào)告模板錦集10篇
- 愛話題作文15篇
- 紋身操作手法課程設(shè)計(jì)
- 高中信息技術(shù) 鍵盤和鍵盤操作教案
- DB2301T 193-2024林糧間作技術(shù)規(guī)程
- 動(dòng)脈導(dǎo)管未閉課件
- 借證協(xié)議書(2篇)
- 兒童故事版權(quán)使用合同(2篇)
- 婦幼保健計(jì)劃生育服務(wù)中心傳染病衛(wèi)生應(yīng)急預(yù)案
- DB63-T 1672-2018+瀝青路面整治工程新舊路面聯(lián)結(jié)層技術(shù)規(guī)范
- 基于CAN通訊的儲(chǔ)能變流器并機(jī)方案及應(yīng)用分析報(bào)告-培訓(xùn)課件
- 園藝療法共課件
- 布氏、韋氏、洛氏硬度換算表
- 鋼筋混凝土地下通道課程設(shè)計(jì)
- 韓流對(duì)中國文化的影響課件
- 檢驗(yàn)檢測服務(wù)公司市場營銷計(jì)劃
- 醫(yī)務(wù)人員外出進(jìn)修流程圖
- DB32∕T 2349-2013 楊樹一元立木材積表
- 昌樂二中271高效課堂培訓(xùn)與評(píng)價(jià)ppt課件
- 豬場名詞及指標(biāo)講義
評(píng)論
0/150
提交評(píng)論