單片機(jī)教學(xué)講解課件_第1頁(yè)
單片機(jī)教學(xué)講解課件_第2頁(yè)
單片機(jī)教學(xué)講解課件_第3頁(yè)
單片機(jī)教學(xué)講解課件_第4頁(yè)
單片機(jī)教學(xué)講解課件_第5頁(yè)
已閱讀5頁(yè),還剩85頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章匯編語(yǔ)言程序設(shè)計(jì)4.1概述4.2MCS-51匯編語(yǔ)言程序設(shè)計(jì) 順序、循環(huán)、分支、子程序

第4章匯編語(yǔ)言程序設(shè)計(jì)4.1概述14.1概述4.1.1計(jì)算機(jī)常用的編程語(yǔ)言程序設(shè)計(jì)語(yǔ)言:低級(jí)語(yǔ)言和高級(jí)語(yǔ)言。低級(jí)語(yǔ)言:機(jī)器語(yǔ)言

匯編語(yǔ)言:采用特定的助記符號(hào)來(lái)描述機(jī)器指令高級(jí)語(yǔ)言:高級(jí)語(yǔ)言程序要經(jīng)過(guò)解釋程序或編譯程序的編譯,形成目標(biāo)程序后,才能執(zhí)行。常用的高級(jí)語(yǔ)言:BASIC,F(xiàn)ORTRAN,PASCAL,C等。4.1概述4.1.1計(jì)算機(jī)常用的編程語(yǔ)言24.1.2MCS-51匯編語(yǔ)言偽指令

1.ORG(Origin)匯編起始地址命令功能:用于規(guī)定目標(biāo)程序的起始地址。格式:

[標(biāo)號(hào):]ORG地址地址項(xiàng):16位絕對(duì)地址,也可以用標(biāo)號(hào)或表達(dá)式表示。如果不用ORG規(guī)定,則匯編得到的目標(biāo)程序?qū)?000H開始。4.1.2MCS-51匯編語(yǔ)言偽指令3一個(gè)源程序中,可多次使用ORG指令以規(guī)定不同程序段的起始位置。地址應(yīng)從小到大順序排列,不允許重疊。例如:ORG4000H LJMP MAIN

ORG 4200HMAIN: MOV A,30H

一個(gè)源程序中,可多次使用ORG指令以規(guī)定不同程序段的起始位置42.END(ENDofassembly)匯編終止命令

功能:用于終止源程序的匯編工作。 END之后的指令,匯編程序不予處理。格式:

[標(biāo)號(hào):]END[表達(dá)式]只有主程序模塊才有“表達(dá)式”項(xiàng),且“表達(dá)式”的值等于該程序模塊的入口地址。而其他程序模塊就沒有“表達(dá)式”項(xiàng)?!皹?biāo)號(hào):”也是選擇項(xiàng)。

一個(gè)源程序只能有一個(gè)END命令。2.END(ENDofassembly)匯編終止命令53.EQU(Equate)賦值命令功能:用于給字符名稱賦予一個(gè)特定值。賦值以后,其值在整個(gè)過(guò)程中有效。格式:

字符名稱EQU賦值項(xiàng)“賦值項(xiàng)”:可以是常數(shù)、地址、標(biāo)號(hào)或表達(dá)式。8位或16位二進(jìn)制數(shù)。賦值以后的字符名稱即可作地址使用,也可作立即數(shù)使用。 PA8155 EQU 8001H 給標(biāo)號(hào)PA8155賦值8001H。3.EQU(Equate)賦值命令64.DB(DefineByte)定義數(shù)據(jù)字節(jié)命令功能:用于從指定的地址單元開始,在程序存儲(chǔ)器中存放字節(jié)數(shù)據(jù)。格式: [標(biāo)號(hào):]DB8位數(shù)表例如: DB“howareyou?”;1個(gè)字節(jié)存放1個(gè)字符ASCII常使用本命令存放數(shù)據(jù)表格,例如存放數(shù)碼管顯示的十六進(jìn)制數(shù)的字形碼,可使用多條DB命令定義: DB C0H,F(xiàn)9H,A4H,B0H DB 99H,92H,82H, F8H DB 80H,90H,88H, 83H DB C6H,A1H,86H,84H4.DB(DefineByte)定義數(shù)據(jù)字節(jié)命令7查表時(shí),為確定數(shù)據(jù)區(qū)的起始位置,可采用兩種方法:(1)根據(jù)DB命令前一條指令的地址確定。例: 8100HMOV A,#49H(1字節(jié)) TAB:DB C0H,F9H,A4H,B0H(2)使用ORG指令專門規(guī)定例: ORG 8100H TAB:DB C0H,F9H,A4H,B0H定義的數(shù)碼管字形碼從8100地址開始存放。查表時(shí),為確定數(shù)據(jù)區(qū)的起始位置,可采用兩種方法:8

5.DW(DefineWord) 定義數(shù)據(jù)字命令功能:用于從指定地址開始,在程序存儲(chǔ)器單元中定義16位的數(shù)據(jù)字(兩個(gè)字節(jié))。格式:[標(biāo)號(hào):]DW16位數(shù)表存放規(guī)則:高8位在前(低地址),低8位在后(高地址)。例: DW100H,1ACH;按順序存01H,00H,01H,ACH DW “AA” ;存入41H,41H(ASCII碼) DW “A” ;存入00H,41H DW “ABC” ;不合法,大于兩個(gè)字節(jié)5.DW(DefineWord) 定義數(shù)據(jù)字命令9注意: DB和DW定義的數(shù)表,數(shù)的個(gè)數(shù)不得超過(guò)80個(gè)。 如果數(shù)據(jù)的數(shù)目較多時(shí),可使用多個(gè)定義命令。在MCS-51程序設(shè)計(jì)應(yīng)用中,常以DB定義數(shù)據(jù),以DW定義地址。注意: DB和DW定義的數(shù)表,數(shù)的個(gè)數(shù)不106.DS(DefineStorage)定義存儲(chǔ)區(qū)命令功能:用于從指定地址開始,保留指定數(shù)目的字節(jié)單元為存儲(chǔ)區(qū),供程序運(yùn)行使用。匯編時(shí)對(duì)這些單元不賦值。格式:[標(biāo)號(hào):]DS16位數(shù)表

例: ADDRTABL:DS20

例: ORG8100HDS 08H注意:對(duì)MSC-51單片機(jī)來(lái)說(shuō),DB、DW、DS命令只能對(duì)程序存儲(chǔ)器使用,不能對(duì)數(shù)據(jù)存儲(chǔ)器使用。6.DS(DefineStorage)定義存儲(chǔ)區(qū)命令117.BIT位定義命令功能:用于給字符名稱賦以位地址。格式:字符名稱BIT位地址例如:AAABIT40H BBBBIT 50H7.BIT位定義命令12

4.2MCS-51匯編語(yǔ)言程序設(shè)計(jì)

匯編和高級(jí)語(yǔ)言程序設(shè)計(jì)的過(guò)程:首先對(duì)問(wèn)題進(jìn)行分析,然后確定算法,再根據(jù)算法流程編寫程序,最后是調(diào)試程序。匯編語(yǔ)言程序設(shè)計(jì)的獨(dú)特點(diǎn)在于:(1)用匯編語(yǔ)言進(jìn)行程序設(shè)計(jì)時(shí),對(duì)數(shù)據(jù)的存放、寄存器和工作單元的使用等要由設(shè)計(jì)者安排。而高級(jí)語(yǔ)言程序設(shè)計(jì)時(shí),這些工作都由計(jì)算機(jī)軟件安排,程序設(shè)計(jì)者不必考慮。4.2MCS-51匯編語(yǔ)言程序設(shè)計(jì)13(2)匯編語(yǔ)言程序設(shè)計(jì)要求設(shè)計(jì)人員必須對(duì)所使用的計(jì)算機(jī)的硬件結(jié)構(gòu)有較為詳細(xì)的了解。特別是對(duì)各類寄存器、端口、定時(shí)器/計(jì)數(shù)器、中斷等內(nèi)容要熟悉,以便在程序設(shè)計(jì)時(shí)能熟練使用。 匯編語(yǔ)言程序共有四種結(jié)構(gòu)形式:順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu)(選擇結(jié)構(gòu))和子程序結(jié)構(gòu)。(2)匯編語(yǔ)言程序設(shè)計(jì)要求設(shè)計(jì)人員必須對(duì)所使用的計(jì)算機(jī)的硬144.2.1順序程序

例4.1設(shè)三字節(jié)無(wú)符號(hào)數(shù)相加,被加數(shù):在內(nèi)部RAM20H~22H單元(低位在前),加數(shù):在內(nèi)部RAM30H~32H單元(低位在前),結(jié)果:存于內(nèi)部RAM20~22H單元,進(jìn)位位存于23H單元。利用ADDC指令進(jìn)行多字節(jié)加法運(yùn)算。4.2.1順序程序15

ORG 5000HMOV R0,#20H ;被加數(shù)的低字節(jié)地址 MOV R1,#30H ;加數(shù)的低字節(jié)地址 MOV A,@R0 ADD A,@R1 ;低字節(jié)相加 MOV @R0,A ;存放字節(jié)相加結(jié)果

INC R0 INC R1 MOV

A, @R0 ADDC

A, @R1 ;中間字節(jié)帶進(jìn)位相加 MOV @R0,A ;存中間字節(jié)相加結(jié)果 ORG 5000H16 INC R0 INC R1 MOV

A, @R0 ADDC

A, @R1 ;高字節(jié)帶進(jìn)位相加 MOV

@R0,A ;存高字節(jié)相加結(jié)果

INC R0 MOV

A,#00H ADDC

A,

#00H MOV @R0,A ;進(jìn)位位送23H END INC R017例4.2將片內(nèi)RAM20H單元的內(nèi)容拆成兩段,每段4位。并將它們分別存入21H與22H單元中。(20H)=0101,1010=5AH (21H)=0AH;存放低4位 (22H)=05H;存放高4位

例4.2將片內(nèi)RAM20H單元的內(nèi)容拆成兩段,每段4位18 ORG 5000HSTART: MOV R0,#21H ;R0←21H MOV A,20H ;A←(20H)

ANL A,#0FH ;A←#0FH∧(A) MOV@R0,A ;(R0)←(A),保存低4位

INC R0 ;R0←(R0)+1 MOV A,20H ;A←(20H) SWAPA ;高低半字節(jié)交換

ANL A,#0FH;A∧#0FH MOV @R0,A ;(R0)←(A) END ORG 5000H194.2.2循環(huán)程序循環(huán)初態(tài)4.2.2循環(huán)程序循環(huán)初態(tài)20循環(huán)程序一般由四個(gè)主要部分組成:(1)初始化部分:為循環(huán)程序做準(zhǔn)備,如規(guī)定循環(huán)次數(shù)、給各變量和地址指針預(yù)置初值。(2)處理部分:為反復(fù)執(zhí)行的程序段,是循環(huán)程序的實(shí)體,也是循環(huán)程序的主體。(3)循環(huán)控制部分:這部分的作用是修改循環(huán)變量和控制變量,并判斷循環(huán)是否結(jié)束,直到符合結(jié)束條件時(shí),跳出循環(huán)為止。(4)結(jié)束部分:這部分主要是對(duì)循環(huán)程序的結(jié)果進(jìn)行分析、處理和存放。循環(huán)程序一般由四個(gè)主要部分組成:21

循環(huán):?jiǎn)沃匮h(huán)多重循環(huán)(二重以上)--循環(huán)嵌套。在多重循環(huán)程序中,只允許外重循環(huán)嵌套內(nèi)重循環(huán)程序,而不允許循環(huán)體互相交叉,另外,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部。 循環(huán):?jiǎn)沃匮h(huán)22例4.3把外部RAM5000~50FFH單元的內(nèi)容清零。 ORG4200HSTART1: MOV R0,#00H ;設(shè)置循環(huán)初始值 MOV DPTR,#5000H LOOP1: MOV A,#00H MOVX

@DPTR,A ;外部RAM單元清零 INC DPTR ;外部RAM單元加1 INC R0 ;循環(huán)次數(shù)加1

CJNE R0,#00H,LOOP1;循環(huán)控制,不等轉(zhuǎn)移 END例4.3把外部RAM5000~50FFH單元的內(nèi)容清零23例4.4設(shè)三字節(jié)無(wú)符號(hào)數(shù)相加,被加數(shù):內(nèi)部RAM20H~22H單元(低位在前),加數(shù):內(nèi)部RAM30H~32H單元(低位在前),結(jié)果:存于內(nèi)部RAM20~22H單元,進(jìn)位位存于23H單元。利用ADDC指令進(jìn)行多字節(jié)加法運(yùn)算。例4.4設(shè)三字節(jié)無(wú)符號(hào)數(shù)相加,24 ORG 4200H MOV R0,#20H ;被加數(shù)的低字節(jié)地址 MOV R1,#30H ;加數(shù)的低字節(jié)地址 MOV R2,#03H ;循環(huán)次數(shù) CLR CLOOP:

MOV

A,@R0 ADDC

A,@R1 ;低字節(jié)相加 MOV

@R0,A ;存放字節(jié)相加結(jié)果

INC

R0 INC

R1

DJNZ

R2,LOOP ;循環(huán)控制,R2遞減不為零轉(zhuǎn)移 MOVA,#00H ADDC

A,#00H MOV

@R0,A ;進(jìn)位位送23H END ORG 4200H25例4.5

把內(nèi)部RAM中起始地址為40H的數(shù)據(jù)串傳送到外部RAM以5000H為首地址的區(qū)域,直到發(fā)現(xiàn)“$”字符的ASCII碼為止。同時(shí)規(guī)定數(shù)據(jù)串的最大長(zhǎng)度為32個(gè)字節(jié)。例4.5把內(nèi)部RAM中起始地址為40H的數(shù)據(jù)串傳送26 ORG 4200H MOV R0,#40H ;內(nèi)部RAM起始地址 MOV DPTR,#5000H ;外部RAM起始地址

MOV R1,#20H ;最大串長(zhǎng)LOOP: MOV A,@R0 ;取數(shù)據(jù) CLR C ;清進(jìn)位位 MOV R2,A ;暫存

SUBB A,#24H ;判斷是否為“$”

JZ QUIT ;是,轉(zhuǎn)“QUIT” MOV A,R2

;不是,送入外部RAM MOVX

@DPTR,A INC

DPTR ;數(shù)據(jù)指針加1 INC

R0 ;R0加1 DJNZ

R1,LOOP ;循環(huán)次數(shù)控制,R1遞減,不為零轉(zhuǎn)移QUIT: END ORG 4200H27例4.6設(shè)MCS-51單片機(jī)的時(shí)鐘頻率為fosc=6MHz,試設(shè)計(jì)延時(shí)0.1s的延時(shí)程序。延時(shí)程序所花費(fèi)的時(shí)間是該程序指令的總機(jī)器周期數(shù)與機(jī)器周期的乘積。通常,延時(shí)程序采用MOV和DJNZ指令來(lái)實(shí)現(xiàn)。單循環(huán)延時(shí)程序,最大的循環(huán)次數(shù)位256,則程序段為:

MOV R0,#00H ;機(jī)器周期數(shù)為1DJNZ R0,$ ;機(jī)器周期數(shù)為2若單片機(jī)晶振為6MHz,則一個(gè)機(jī)器周期為2us。延時(shí)時(shí)間:(1+256×2)×2μs=1026μs。

需采用多重循環(huán)。

例4.6設(shè)MCS-51單片機(jī)的時(shí)鐘頻率為fosc=628多重循環(huán):在一個(gè)循環(huán)體中又包含了其它的循環(huán)程序。這種方式是實(shí)現(xiàn)延時(shí)程序的常用方法。使用多重循環(huán)時(shí),必須注意:(1)循環(huán)嵌套,必須層次分明,不允許產(chǎn)生內(nèi)外層循環(huán)交叉。(2)外循環(huán)可以一層層向內(nèi)循環(huán)進(jìn)入,結(jié)束時(shí)由里往外一層層退出。(3)內(nèi)循環(huán)可以直接轉(zhuǎn)入外循環(huán),實(shí)現(xiàn)一個(gè)循環(huán)由多個(gè)條件控制的循環(huán)結(jié)構(gòu)方式。多重循環(huán):在一個(gè)循環(huán)體中又包含了其它的循環(huán)29 MOV R7,#200 DELAY1: MOV R6,#125 DELAY2: DJNZ R6,DELAY2;125×4=500μs=0.5ms DJNZ R7,DELAY1;0.5×200=0.1s該段程序的延時(shí)時(shí)間約為0.1006s若需延時(shí)更長(zhǎng)時(shí)間,可采用多重循環(huán),如1s延時(shí)可采用3重循環(huán),而用7重循環(huán)可延時(shí)幾年。 MOV R7,#200 304.2.3分支程序(選擇)分支程序的基本結(jié)構(gòu):?jiǎn)畏种Ш投喾种А? 其特點(diǎn)是:各處理模塊是相互排斥的。4.2.3分支程序(選擇)3113條條件轉(zhuǎn)移指令,分別為:JZ,JNZ:累加器判零轉(zhuǎn)移指令;CJNE:比較條件轉(zhuǎn)移指令,4條;DJNZ:減1條件轉(zhuǎn)移指令,2條;JC,JNC,JB,JNB,JBC:位控制條件轉(zhuǎn)移指令等四類。13條條件轉(zhuǎn)移指令,分別為:32例4.7x,y均為8位二進(jìn)制數(shù),x存放在VAR單元中,函數(shù)值y存放在FUNC中,

按下式給y賦值.

例4.7x,y均為8位二進(jìn)制數(shù),x存放在VAR單元33單片機(jī)教學(xué)講解課件34 ORG 4200H

VAR

EQU

40H FUNC

EQU

50H

START: MOV A,VAR ;取x

JZ COMP ;為零轉(zhuǎn)COMP

JNB ACC.7,

POSI ;x>0,轉(zhuǎn)POSI

MOV A,

#0FFH ;x<0,(A)=-1,補(bǔ)碼 SJMP COMP

POSI: MOV A,#01HCOMP: MOV FUNC,A ;保存結(jié)果 END ORG 4200H35例4.8片內(nèi)RAMDATA1和DATA2兩個(gè)單元中存有兩個(gè)無(wú)符號(hào)數(shù)字,將兩個(gè)數(shù)中的小者存入30H單元。 ORG 4000H DATA1

EQU

34H DATA2

EQU

56H MOV

A, DATA1 ;第一數(shù)送A CLR

C

CJNE

A,

DATA2,

BIG SJMP

STORE ;相等,DATA1作為小的數(shù)BIG:JC STORE ;C=1跳轉(zhuǎn),即A<DATA2 MOV A,DATA2 STORE:MOV 30H, A ;小者送RAM

END例4.8片內(nèi)RAMDATA1和DATA2兩個(gè)單元中存有36例4.10假定R0中存放的是采集到的被按鍵鍵值,共有128個(gè)鍵值(0~127),根據(jù)該鍵值轉(zhuǎn)向不同鍵的處理程序中去。

跳轉(zhuǎn)方法:逐個(gè)比較,類似CASE。 使用散轉(zhuǎn)指令JMP@A+DPTR。

設(shè)(R0)=0~n,對(duì)應(yīng)的處理程序入口地址分別為PROG0~PROGn,且按照一定的規(guī)律排列。例4.10假定R0中存放的是采集到的被按鍵鍵值,共有1237ORG2000H

MOVDPTR,#TAB;設(shè)置處理程序入口首地址MOVA,R0

RLA

;為何要左移?NEXT:JMP@A+DPTR;轉(zhuǎn)向形成的散轉(zhuǎn)地址入口

TAB:AJMP PROG0;直接轉(zhuǎn)移地址表

AJMP PROG1……

AJMP PROGnORG2000H384.2.4子程序設(shè)計(jì)子程序與一般程序的主要區(qū)別是在子程序的末尾有一條子程序返回指令(RET),其功能是執(zhí)行完子程序后通過(guò)將堆棧內(nèi)的斷點(diǎn)地址彈出到PC而返回到主程序中。在編寫子程序時(shí)應(yīng)注意以下幾點(diǎn):

(1)要給每個(gè)子程序賦一個(gè)名字。

實(shí)際上是一個(gè)入口地址的代號(hào)。

(2)要能正確地傳遞參數(shù)。首先要有入口條件,說(shuō)明進(jìn)入子程序時(shí)它所要處理的數(shù)據(jù)如何得到,另外,要有出口條件,即處理的結(jié)果是如何存放的。4.2.4子程序設(shè)計(jì)39(3)注意保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。注意保存主程序和子程序共同涉及的但值不同的累加器、寄存器和單元的內(nèi)容。保護(hù)現(xiàn)場(chǎng):PUSH恢復(fù)現(xiàn)場(chǎng):POP(4)注意子程序的通用性。主程序調(diào)用子程序的指令:“LCALL”,“ACALL”。子程序返回指令:RET。子程序可以嵌套,嵌套次數(shù)從理論上說(shuō)是無(wú)限的,但實(shí)際上由于受堆棧深度的影響,嵌套次數(shù)是有限的。(3)注意保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。40例4.11設(shè)有a,b,c三個(gè)數(shù)(0~9),存于內(nèi)部RAM的DATAA、DATAB、和DATAC三個(gè)單元。編程實(shí)現(xiàn):c=a2+b2。設(shè)DATAA、DATAB、DATAC分別對(duì)應(yīng)內(nèi)部RAM的40H、41H和42H單元。例4.11設(shè)有a,b,c三個(gè)數(shù)(0~9),存于內(nèi)部RAM41 ORG 5000H DATAA EQU 40H DATAB EQU 41H

DATAC EQU 42HSTART: MOV

A, DATAA ;取第一操作數(shù) ACALL

SQR ;調(diào)用查表程序 MOV

R1,A ;a2暫存R1

MOV

A,DATAB ;取第二操作數(shù)

ACALL

SQR ;調(diào)用查表程序 ADD

A,R1 ;A←a2+b2 MOV

DATAC,A ORG 5000H42子程序:SQR:INC

A

;偏移量調(diào)整,為何?MOVC

A, @A+PC

;查平方表,PC自動(dòng)累加1 RETTAB:DB0,1,4,9,16,25,36,49,64,81 END 子程序:43例4.12向P1口輸出全高電平,延時(shí)1s后,再輸出全低電平,延時(shí)1s后,再輸出全高電平。 主程序: ORG 5000H MAIN: MOV P1,#0FFH ACALLDELAY MOV P1,#00H ACALLDELAY SJMP MAINEND例4.12向P1口輸出全高電平,延時(shí)1s后,再輸出全低電44子程序:DELAY: MOV R5,#10 ;假設(shè)Fosc=6MHzDELAY0: MOV R6,#200 DELAY1: MOV R7,#125

DELAY2: DJNZ R7,DELAY2

DJNZ R6,DELAY1

DJNZ R5,DELAY0

RET子程序:45第4章匯編語(yǔ)言程序設(shè)計(jì)4.1概述4.2MCS-51匯編語(yǔ)言程序設(shè)計(jì) 順序、循環(huán)、分支、子程序

第4章匯編語(yǔ)言程序設(shè)計(jì)4.1概述464.1概述4.1.1計(jì)算機(jī)常用的編程語(yǔ)言程序設(shè)計(jì)語(yǔ)言:低級(jí)語(yǔ)言和高級(jí)語(yǔ)言。低級(jí)語(yǔ)言:機(jī)器語(yǔ)言

匯編語(yǔ)言:采用特定的助記符號(hào)來(lái)描述機(jī)器指令高級(jí)語(yǔ)言:高級(jí)語(yǔ)言程序要經(jīng)過(guò)解釋程序或編譯程序的編譯,形成目標(biāo)程序后,才能執(zhí)行。常用的高級(jí)語(yǔ)言:BASIC,F(xiàn)ORTRAN,PASCAL,C等。4.1概述4.1.1計(jì)算機(jī)常用的編程語(yǔ)言474.1.2MCS-51匯編語(yǔ)言偽指令

1.ORG(Origin)匯編起始地址命令功能:用于規(guī)定目標(biāo)程序的起始地址。格式:

[標(biāo)號(hào):]ORG地址地址項(xiàng):16位絕對(duì)地址,也可以用標(biāo)號(hào)或表達(dá)式表示。如果不用ORG規(guī)定,則匯編得到的目標(biāo)程序?qū)?000H開始。4.1.2MCS-51匯編語(yǔ)言偽指令48一個(gè)源程序中,可多次使用ORG指令以規(guī)定不同程序段的起始位置。地址應(yīng)從小到大順序排列,不允許重疊。例如:ORG4000H LJMP MAIN

ORG 4200HMAIN: MOV A,30H

一個(gè)源程序中,可多次使用ORG指令以規(guī)定不同程序段的起始位置492.END(ENDofassembly)匯編終止命令

功能:用于終止源程序的匯編工作。 END之后的指令,匯編程序不予處理。格式:

[標(biāo)號(hào):]END[表達(dá)式]只有主程序模塊才有“表達(dá)式”項(xiàng),且“表達(dá)式”的值等于該程序模塊的入口地址。而其他程序模塊就沒有“表達(dá)式”項(xiàng)?!皹?biāo)號(hào):”也是選擇項(xiàng)。

一個(gè)源程序只能有一個(gè)END命令。2.END(ENDofassembly)匯編終止命令503.EQU(Equate)賦值命令功能:用于給字符名稱賦予一個(gè)特定值。賦值以后,其值在整個(gè)過(guò)程中有效。格式:

字符名稱EQU賦值項(xiàng)“賦值項(xiàng)”:可以是常數(shù)、地址、標(biāo)號(hào)或表達(dá)式。8位或16位二進(jìn)制數(shù)。賦值以后的字符名稱即可作地址使用,也可作立即數(shù)使用。 PA8155 EQU 8001H 給標(biāo)號(hào)PA8155賦值8001H。3.EQU(Equate)賦值命令514.DB(DefineByte)定義數(shù)據(jù)字節(jié)命令功能:用于從指定的地址單元開始,在程序存儲(chǔ)器中存放字節(jié)數(shù)據(jù)。格式: [標(biāo)號(hào):]DB8位數(shù)表例如: DB“howareyou?”;1個(gè)字節(jié)存放1個(gè)字符ASCII常使用本命令存放數(shù)據(jù)表格,例如存放數(shù)碼管顯示的十六進(jìn)制數(shù)的字形碼,可使用多條DB命令定義: DB C0H,F(xiàn)9H,A4H,B0H DB 99H,92H,82H, F8H DB 80H,90H,88H, 83H DB C6H,A1H,86H,84H4.DB(DefineByte)定義數(shù)據(jù)字節(jié)命令52查表時(shí),為確定數(shù)據(jù)區(qū)的起始位置,可采用兩種方法:(1)根據(jù)DB命令前一條指令的地址確定。例: 8100HMOV A,#49H(1字節(jié)) TAB:DB C0H,F9H,A4H,B0H(2)使用ORG指令專門規(guī)定例: ORG 8100H TAB:DB C0H,F9H,A4H,B0H定義的數(shù)碼管字形碼從8100地址開始存放。查表時(shí),為確定數(shù)據(jù)區(qū)的起始位置,可采用兩種方法:53

5.DW(DefineWord) 定義數(shù)據(jù)字命令功能:用于從指定地址開始,在程序存儲(chǔ)器單元中定義16位的數(shù)據(jù)字(兩個(gè)字節(jié))。格式:[標(biāo)號(hào):]DW16位數(shù)表存放規(guī)則:高8位在前(低地址),低8位在后(高地址)。例: DW100H,1ACH;按順序存01H,00H,01H,ACH DW “AA” ;存入41H,41H(ASCII碼) DW “A” ;存入00H,41H DW “ABC” ;不合法,大于兩個(gè)字節(jié)5.DW(DefineWord) 定義數(shù)據(jù)字命令54注意: DB和DW定義的數(shù)表,數(shù)的個(gè)數(shù)不得超過(guò)80個(gè)。 如果數(shù)據(jù)的數(shù)目較多時(shí),可使用多個(gè)定義命令。在MCS-51程序設(shè)計(jì)應(yīng)用中,常以DB定義數(shù)據(jù),以DW定義地址。注意: DB和DW定義的數(shù)表,數(shù)的個(gè)數(shù)不556.DS(DefineStorage)定義存儲(chǔ)區(qū)命令功能:用于從指定地址開始,保留指定數(shù)目的字節(jié)單元為存儲(chǔ)區(qū),供程序運(yùn)行使用。匯編時(shí)對(duì)這些單元不賦值。格式:[標(biāo)號(hào):]DS16位數(shù)表

例: ADDRTABL:DS20

例: ORG8100HDS 08H注意:對(duì)MSC-51單片機(jī)來(lái)說(shuō),DB、DW、DS命令只能對(duì)程序存儲(chǔ)器使用,不能對(duì)數(shù)據(jù)存儲(chǔ)器使用。6.DS(DefineStorage)定義存儲(chǔ)區(qū)命令567.BIT位定義命令功能:用于給字符名稱賦以位地址。格式:字符名稱BIT位地址例如:AAABIT40H BBBBIT 50H7.BIT位定義命令57

4.2MCS-51匯編語(yǔ)言程序設(shè)計(jì)

匯編和高級(jí)語(yǔ)言程序設(shè)計(jì)的過(guò)程:首先對(duì)問(wèn)題進(jìn)行分析,然后確定算法,再根據(jù)算法流程編寫程序,最后是調(diào)試程序。匯編語(yǔ)言程序設(shè)計(jì)的獨(dú)特點(diǎn)在于:(1)用匯編語(yǔ)言進(jìn)行程序設(shè)計(jì)時(shí),對(duì)數(shù)據(jù)的存放、寄存器和工作單元的使用等要由設(shè)計(jì)者安排。而高級(jí)語(yǔ)言程序設(shè)計(jì)時(shí),這些工作都由計(jì)算機(jī)軟件安排,程序設(shè)計(jì)者不必考慮。4.2MCS-51匯編語(yǔ)言程序設(shè)計(jì)58(2)匯編語(yǔ)言程序設(shè)計(jì)要求設(shè)計(jì)人員必須對(duì)所使用的計(jì)算機(jī)的硬件結(jié)構(gòu)有較為詳細(xì)的了解。特別是對(duì)各類寄存器、端口、定時(shí)器/計(jì)數(shù)器、中斷等內(nèi)容要熟悉,以便在程序設(shè)計(jì)時(shí)能熟練使用。 匯編語(yǔ)言程序共有四種結(jié)構(gòu)形式:順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、分支結(jié)構(gòu)(選擇結(jié)構(gòu))和子程序結(jié)構(gòu)。(2)匯編語(yǔ)言程序設(shè)計(jì)要求設(shè)計(jì)人員必須對(duì)所使用的計(jì)算機(jī)的硬594.2.1順序程序

例4.1設(shè)三字節(jié)無(wú)符號(hào)數(shù)相加,被加數(shù):在內(nèi)部RAM20H~22H單元(低位在前),加數(shù):在內(nèi)部RAM30H~32H單元(低位在前),結(jié)果:存于內(nèi)部RAM20~22H單元,進(jìn)位位存于23H單元。利用ADDC指令進(jìn)行多字節(jié)加法運(yùn)算。4.2.1順序程序60

ORG 5000HMOV R0,#20H ;被加數(shù)的低字節(jié)地址 MOV R1,#30H ;加數(shù)的低字節(jié)地址 MOV A,@R0 ADD A,@R1 ;低字節(jié)相加 MOV @R0,A ;存放字節(jié)相加結(jié)果

INC R0 INC R1 MOV

A, @R0 ADDC

A, @R1 ;中間字節(jié)帶進(jìn)位相加 MOV @R0,A ;存中間字節(jié)相加結(jié)果 ORG 5000H61 INC R0 INC R1 MOV

A, @R0 ADDC

A, @R1 ;高字節(jié)帶進(jìn)位相加 MOV

@R0,A ;存高字節(jié)相加結(jié)果

INC R0 MOV

A,#00H ADDC

A,

#00H MOV @R0,A ;進(jìn)位位送23H END INC R062例4.2將片內(nèi)RAM20H單元的內(nèi)容拆成兩段,每段4位。并將它們分別存入21H與22H單元中。(20H)=0101,1010=5AH (21H)=0AH;存放低4位 (22H)=05H;存放高4位

例4.2將片內(nèi)RAM20H單元的內(nèi)容拆成兩段,每段4位63 ORG 5000HSTART: MOV R0,#21H ;R0←21H MOV A,20H ;A←(20H)

ANL A,#0FH ;A←#0FH∧(A) MOV@R0,A ;(R0)←(A),保存低4位

INC R0 ;R0←(R0)+1 MOV A,20H ;A←(20H) SWAPA ;高低半字節(jié)交換

ANL A,#0FH;A∧#0FH MOV @R0,A ;(R0)←(A) END ORG 5000H644.2.2循環(huán)程序循環(huán)初態(tài)4.2.2循環(huán)程序循環(huán)初態(tài)65循環(huán)程序一般由四個(gè)主要部分組成:(1)初始化部分:為循環(huán)程序做準(zhǔn)備,如規(guī)定循環(huán)次數(shù)、給各變量和地址指針預(yù)置初值。(2)處理部分:為反復(fù)執(zhí)行的程序段,是循環(huán)程序的實(shí)體,也是循環(huán)程序的主體。(3)循環(huán)控制部分:這部分的作用是修改循環(huán)變量和控制變量,并判斷循環(huán)是否結(jié)束,直到符合結(jié)束條件時(shí),跳出循環(huán)為止。(4)結(jié)束部分:這部分主要是對(duì)循環(huán)程序的結(jié)果進(jìn)行分析、處理和存放。循環(huán)程序一般由四個(gè)主要部分組成:66

循環(huán):?jiǎn)沃匮h(huán)多重循環(huán)(二重以上)--循環(huán)嵌套。在多重循環(huán)程序中,只允許外重循環(huán)嵌套內(nèi)重循環(huán)程序,而不允許循環(huán)體互相交叉,另外,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部。 循環(huán):?jiǎn)沃匮h(huán)67例4.3把外部RAM5000~50FFH單元的內(nèi)容清零。 ORG4200HSTART1: MOV R0,#00H ;設(shè)置循環(huán)初始值 MOV DPTR,#5000H LOOP1: MOV A,#00H MOVX

@DPTR,A ;外部RAM單元清零 INC DPTR ;外部RAM單元加1 INC R0 ;循環(huán)次數(shù)加1

CJNE R0,#00H,LOOP1;循環(huán)控制,不等轉(zhuǎn)移 END例4.3把外部RAM5000~50FFH單元的內(nèi)容清零68例4.4設(shè)三字節(jié)無(wú)符號(hào)數(shù)相加,被加數(shù):內(nèi)部RAM20H~22H單元(低位在前),加數(shù):內(nèi)部RAM30H~32H單元(低位在前),結(jié)果:存于內(nèi)部RAM20~22H單元,進(jìn)位位存于23H單元。利用ADDC指令進(jìn)行多字節(jié)加法運(yùn)算。例4.4設(shè)三字節(jié)無(wú)符號(hào)數(shù)相加,69 ORG 4200H MOV R0,#20H ;被加數(shù)的低字節(jié)地址 MOV R1,#30H ;加數(shù)的低字節(jié)地址 MOV R2,#03H ;循環(huán)次數(shù) CLR CLOOP:

MOV

A,@R0 ADDC

A,@R1 ;低字節(jié)相加 MOV

@R0,A ;存放字節(jié)相加結(jié)果

INC

R0 INC

R1

DJNZ

R2,LOOP ;循環(huán)控制,R2遞減不為零轉(zhuǎn)移 MOVA,#00H ADDC

A,#00H MOV

@R0,A ;進(jìn)位位送23H END ORG 4200H70例4.5

把內(nèi)部RAM中起始地址為40H的數(shù)據(jù)串傳送到外部RAM以5000H為首地址的區(qū)域,直到發(fā)現(xiàn)“$”字符的ASCII碼為止。同時(shí)規(guī)定數(shù)據(jù)串的最大長(zhǎng)度為32個(gè)字節(jié)。例4.5把內(nèi)部RAM中起始地址為40H的數(shù)據(jù)串傳送71 ORG 4200H MOV R0,#40H ;內(nèi)部RAM起始地址 MOV DPTR,#5000H ;外部RAM起始地址

MOV R1,#20H ;最大串長(zhǎng)LOOP: MOV A,@R0 ;取數(shù)據(jù) CLR C ;清進(jìn)位位 MOV R2,A ;暫存

SUBB A,#24H ;判斷是否為“$”

JZ QUIT ;是,轉(zhuǎn)“QUIT” MOV A,R2

;不是,送入外部RAM MOVX

@DPTR,A INC

DPTR ;數(shù)據(jù)指針加1 INC

R0 ;R0加1 DJNZ

R1,LOOP ;循環(huán)次數(shù)控制,R1遞減,不為零轉(zhuǎn)移QUIT: END ORG 4200H72例4.6設(shè)MCS-51單片機(jī)的時(shí)鐘頻率為fosc=6MHz,試設(shè)計(jì)延時(shí)0.1s的延時(shí)程序。延時(shí)程序所花費(fèi)的時(shí)間是該程序指令的總機(jī)器周期數(shù)與機(jī)器周期的乘積。通常,延時(shí)程序采用MOV和DJNZ指令來(lái)實(shí)現(xiàn)。單循環(huán)延時(shí)程序,最大的循環(huán)次數(shù)位256,則程序段為:

MOV R0,#00H ;機(jī)器周期數(shù)為1DJNZ R0,$ ;機(jī)器周期數(shù)為2若單片機(jī)晶振為6MHz,則一個(gè)機(jī)器周期為2us。延時(shí)時(shí)間:(1+256×2)×2μs=1026μs。

需采用多重循環(huán)。

例4.6設(shè)MCS-51單片機(jī)的時(shí)鐘頻率為fosc=673多重循環(huán):在一個(gè)循環(huán)體中又包含了其它的循環(huán)程序。這種方式是實(shí)現(xiàn)延時(shí)程序的常用方法。使用多重循環(huán)時(shí),必須注意:(1)循環(huán)嵌套,必須層次分明,不允許產(chǎn)生內(nèi)外層循環(huán)交叉。(2)外循環(huán)可以一層層向內(nèi)循環(huán)進(jìn)入,結(jié)束時(shí)由里往外一層層退出。(3)內(nèi)循環(huán)可以直接轉(zhuǎn)入外循環(huán),實(shí)現(xiàn)一個(gè)循環(huán)由多個(gè)條件控制的循環(huán)結(jié)構(gòu)方式。多重循環(huán):在一個(gè)循環(huán)體中又包含了其它的循環(huán)74 MOV R7,#200 DELAY1: MOV R6,#125 DELAY2: DJNZ R6,DELAY2;125×4=500μs=0.5ms DJNZ R7,DELAY1;0.5×200=0.1s該段程序的延時(shí)時(shí)間約為0.1006s若需延時(shí)更長(zhǎng)時(shí)間,可采用多重循環(huán),如1s延時(shí)可采用3重循環(huán),而用7重循環(huán)可延時(shí)幾年。 MOV R7,#200 754.2.3分支程序(選擇)分支程序的基本結(jié)構(gòu):?jiǎn)畏种Ш投喾种А? 其特點(diǎn)是:各處理模塊是相互排斥的。4.2.3分支程序(選擇)7613條條件轉(zhuǎn)移指令,分別為:JZ,JNZ:累加器判零轉(zhuǎn)移指令;CJNE:比較條件轉(zhuǎn)移指令,4條;DJNZ:減1條件轉(zhuǎn)移指令,2條;JC,JNC,JB,JNB,JBC:位控制條件轉(zhuǎn)移指令等四類。13條條件轉(zhuǎn)移指令,分別為:77例4.7x,y均為8位二進(jìn)制數(shù),x存放在VAR單元中,函數(shù)值y存放在FUNC中,

按下式給y賦值.

例4.7x,y均為8位二進(jìn)制數(shù),x存放在VAR單元78單片機(jī)教學(xué)講解課件79 ORG 4200H

VAR

EQU

40H FUNC

EQU

50H

START: MOV A,VAR ;取x

JZ COMP ;為零轉(zhuǎn)COMP

JNB ACC.7,

POSI ;x>0,轉(zhuǎn)POSI

MOV A,

#0FFH ;x<0,(A)=-1,補(bǔ)碼 SJMP COMP

POSI: MOV A,#01HCOMP: MOV FUNC,A ;保存結(jié)果 END ORG 4200H80例4.8片內(nèi)RAMDATA1和DATA2兩個(gè)單元中存有兩個(gè)無(wú)符號(hào)數(shù)字,將兩個(gè)數(shù)中的小者存入30H單元。 ORG 4000H DATA1

EQU

34H DATA2

EQU

56H MOV

A, DATA1 ;第一數(shù)送A CLR

C

CJNE

A,

DATA2,

BIG SJMP

STORE ;相等,DATA1作為小的數(shù)BIG:JC STORE ;C=1跳轉(zhuǎn),即A<DATA2 MOV A,DATA2 STORE:MOV 30H, A ;小者送RAM

END例4.8片內(nèi)RAMDATA1和DATA2兩個(gè)單元中存有81例4.10假定R0中存放的是采集到的被按鍵鍵值,共有128個(gè)鍵值(0~127),根據(jù)該鍵值轉(zhuǎn)向不同鍵的處理程序中去。

跳轉(zhuǎn)方法:逐個(gè)比較,類似CASE。 使用散轉(zhuǎn)指

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論