C單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)實(shí)用_第1頁(yè)
C單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)實(shí)用_第2頁(yè)
C單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)實(shí)用_第3頁(yè)
C單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)實(shí)用_第4頁(yè)
C單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)實(shí)用_第5頁(yè)
已閱讀5頁(yè),還剩59頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

會(huì)計(jì)學(xué)1C單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)實(shí)用4.1單片機(jī)程序程序設(shè)計(jì)語(yǔ)言概述4.1.1機(jī)器語(yǔ)言和匯編語(yǔ)言4.1.2單片機(jī)使用的高級(jí)語(yǔ)言(1)BASIC語(yǔ)言(2)C語(yǔ)言(3)PL/M語(yǔ)言4.1.380C51單片機(jī)匯編語(yǔ)言的語(yǔ)句格式第1頁(yè)/共64頁(yè)匯編語(yǔ)言程序設(shè)計(jì)必須注意如下特點(diǎn):(1)設(shè)計(jì)人員必須詳細(xì)了解單片機(jī)的硬件結(jié)構(gòu),以便在程序設(shè)計(jì)中熟練使用;(2)必須熟悉匯編語(yǔ)言指令的功能和用法;(3)在程序設(shè)計(jì)前,必須分析設(shè)計(jì)任務(wù),確定所用算法,確定程序結(jié)構(gòu),確定數(shù)據(jù)的類(lèi)型、數(shù)據(jù)的結(jié)構(gòu),必須對(duì)數(shù)據(jù)的存放、寄存器和工作單元的使用以及所用硬件資源等作出具體安排;(4)根據(jù)分析,畫(huà)出程序設(shè)計(jì)流程圖;(5)根據(jù)程序設(shè)計(jì)流程圖編寫(xiě)程序。第2頁(yè)/共64頁(yè)4.2匯編語(yǔ)言程序的基本結(jié)構(gòu)形式

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

第3頁(yè)/共64頁(yè)

(3)程序結(jié)構(gòu):順序或循環(huán)結(jié)構(gòu)(4)數(shù)據(jù)類(lèi)型:三字節(jié)、二進(jìn)制、無(wú)符號(hào)數(shù)(5)數(shù)據(jù)結(jié)構(gòu):升序或降序排列

(6)RAM單元安排:(內(nèi)部RAM字節(jié)單元、位地址空間)(7)采用寄存器間接尋址方式(R0、R1)加數(shù)(N1)高字節(jié)(8位)中字節(jié)(8位)低字節(jié)(8位)加數(shù)(N2)高字節(jié)(8位)中字節(jié)(8位)低字節(jié)(8位)加數(shù)(N1)加數(shù)(N2)和(N3)52H單元低字節(jié)(8位)55H單元低字節(jié)(8位)52H單元低字節(jié)(8位)51H單元中字節(jié)(8位)54H單元中字節(jié)(8位)51H單元中字節(jié)(8位)50H單元高字節(jié)(8位)52H單元高字節(jié)(8位)50H單元高字節(jié)(8位)00H位進(jìn)位位第4頁(yè)/共64頁(yè)

(8)程序設(shè)計(jì)流程框圖;第5頁(yè)/共64頁(yè)

(9)程序清單;

ORG1000HMOVRO,#52H;加數(shù)N1的低字節(jié)地址送地址指針R0MOVR1,#55H;加數(shù)N2的低字節(jié)地址送地址指針R1MOVA,@R0;取N1的低字節(jié)

ADDA,@R1;N1、N2低字節(jié)相加

MOV@R0,A;保存N1、N2低字節(jié)和

DECR0;修改加數(shù)N1的地址指針內(nèi)容

DECR1;修改加數(shù)N2的地址指針內(nèi)容

MOVA,@R0;取N1的中間字節(jié)

ADDCA, @R1;N1、N2中間字節(jié)帶低字節(jié)和進(jìn)位相加

MOV@R0,A;保存N1、N2中間字節(jié)和

DECR0;修改加數(shù)N1的地址指針內(nèi)容第6頁(yè)/共64頁(yè)DECR1;修改加數(shù)N2的地址指針內(nèi)容

MOVA,@R0;取N1的高字節(jié)

ADDCA,@R1;N1、N2高字節(jié)帶中間字節(jié)和進(jìn)位相加

MOV@R0,A;保存N1、N2高字節(jié)和

MOV00H,

C;高字節(jié)和的進(jìn)位送00H位保存

END

思考題:

1)上述程序中,如果只采用ADDC指令,應(yīng)如何修改程序?

2)如果N1、N2,N3均為十進(jìn)制數(shù),應(yīng)如何修改程序?

3)如果加數(shù)N1在內(nèi)部RAM50H、51H和52H單元中,而加數(shù)N2與和N3均在外部RAM0053H、0054H和0055H單元中,其它條件不變,應(yīng)如何修改程序?

4)如果N1、N2,N3均存放在外部RAM單元,應(yīng)如何修改程序?第7頁(yè)/共64頁(yè)例:設(shè)內(nèi)部RAM40H,41H單元中分別存放8位二進(jìn)制數(shù),現(xiàn)分別取這兩個(gè)單元中的半個(gè)字節(jié),合并成一個(gè)新字節(jié)存放在42H單元中。要求如下:42H單元新字節(jié)的低半字節(jié)取自40H單元的低半字節(jié),而高半字節(jié)取自41H單元的低半字節(jié)。解:(1)分析任務(wù):拆字、合字第8頁(yè)/共64頁(yè)

(2)算法:邏輯運(yùn)算(3)程序結(jié)構(gòu):順序(4)數(shù)據(jù)類(lèi)型:?jiǎn)巫止?jié)、二進(jìn)制、無(wú)符號(hào)數(shù)(5)數(shù)據(jù)結(jié)構(gòu):升序或降序排列

(6)程序設(shè)計(jì)流程框圖;第9頁(yè)/共64頁(yè)

(7)程序清單;

ORG2000HSTART:MOVR1,#40H;初始化數(shù)據(jù)指針R1的內(nèi)容

MOVA,@R1;取40H單元內(nèi)容送AANLA,#0FH;保留40H單元內(nèi)容低4位

INCR1;修改數(shù)據(jù)指針R1的內(nèi)容

XCHA,@R1;(A)與@R1內(nèi)容互換

ANLA,#0FH;保留41H單元內(nèi)容低四位

SWAPA;41H單元內(nèi)容高低半字節(jié)互換

ORLA,@R1;合字生成新字節(jié)

INCR1;修改數(shù)據(jù)指針R1的內(nèi)容

MOV@R1,A;新字節(jié)送42H單元保存

END作業(yè)題:上例中其它條件不變,要求如下:42H單元新字節(jié)的低半字節(jié)取自40H單元的低半字節(jié),而高半字節(jié)取自41H單元的高半字節(jié)。第10頁(yè)/共64頁(yè)(1)單分支程序單分支程序是通過(guò)條件轉(zhuǎn)移指令實(shí)現(xiàn)的,即根據(jù)條件對(duì)程序的執(zhí)行進(jìn)行判斷,滿(mǎn)足條件則進(jìn)行程序轉(zhuǎn)移,不滿(mǎn)足條件程序就順序執(zhí)行。在MCS-51指令系統(tǒng)中,可利用JZ,JNZ,CJNE,DJNZ,JC,JNC,JB,JNB,JBC等指令,完成為0、為1、為正、為負(fù)以及相等、不相等等各種條件判斷。例:兩個(gè)8位無(wú)符號(hào)二進(jìn)制數(shù)比較大小。假設(shè)在外部RAM中有ST1、ST2和ST3共3個(gè)連續(xù)單元(單元地址從小到大),其中ST1、ST2單元中存放著兩個(gè)8位無(wú)符號(hào)二進(jìn)制數(shù)N1,N2,要求找出其中的大數(shù)并存入ST3單元中。4.2.2分支程序結(jié)構(gòu)第11頁(yè)/共64頁(yè)解:(1)分析任務(wù):比較兩個(gè)數(shù)的大?。?)算法:算術(shù)運(yùn)算、控制轉(zhuǎn)移(3)程序結(jié)構(gòu):?jiǎn)畏种В?)數(shù)據(jù)類(lèi)型:?jiǎn)巫止?jié)、二進(jìn)制、無(wú)符號(hào)數(shù)(5)數(shù)據(jù)結(jié)構(gòu):?jiǎn)卧刂飞蚺帕?/p>

(6)RAM單元安排:外部RAM單元(7)采用寄存器間接尋址方式(R0、R1或DPTR)(8)程序設(shè)計(jì)流程框圖;(9)程序清單;思考題(補(bǔ)充作業(yè)題):上例中,如果采用CJNEA,direct,rel指令,應(yīng)如何修改程序?第12頁(yè)/共64頁(yè)返回第13頁(yè)/共64頁(yè)ORG8000HSTART:CLRC;進(jìn)位清0MOVDPTR,#ST1;設(shè)數(shù)據(jù)指針

MOVXA, @DPTR;A←((ST1)),取N1MOVR2,A;暫存N1INCDPTR;DPTR←ST2(指向N2單元)

MOVXA,@DPTR;取N2存于A中

SUBBA,R2;N1,N2比較(N2-N1,差在A中)

JNCBIG1;N2≥N1,轉(zhuǎn)BIG1,N2<N1,順序執(zhí)行

XCHA, R2;N1,N2互換,A←N1SJMPBIG0BIG1:MOVXA, @DPTR;A←N2BIGO:INCDPTR;DPTR←ST3(指向N3單元)

MOVX@DPTR,A;ST3←大數(shù)

END返回

第14頁(yè)/共64頁(yè)(2)多分支程序假設(shè)多分支程序中,分支序號(hào)的最大值為n,則多分支轉(zhuǎn)移結(jié)構(gòu)如圖所示:

MCS-51指令系統(tǒng)沒(méi)有多分支轉(zhuǎn)移指令,無(wú)法使用單條指令完成多分支轉(zhuǎn)移。要實(shí)現(xiàn)多分支轉(zhuǎn)移,可采用以下幾種方法:第15頁(yè)/共64頁(yè)

假設(shè)分支序號(hào)值保存在累加器A中,則可使用CJNEA,#data,rel指令,其分支流程如圖所示:

(a)使用多條CJNE指令,通過(guò)逐次比較,實(shí)現(xiàn)分支程序轉(zhuǎn)移第16頁(yè)/共64頁(yè)例:已知:127≥X≥-128,求Y。設(shè)X,Y分別存放在外部RAM1000H和2000H單元中。解:(1)分析任務(wù):解方程(2)算法:控制轉(zhuǎn)移(3)程序結(jié)構(gòu):多分支(4)數(shù)據(jù)類(lèi)型:?jiǎn)巫止?jié)、二進(jìn)制、有符號(hào)數(shù)(5)RAM單元安排:外部RAM單元(6)采用寄存器間接尋址方式(R0、R1或DPTR)(7)程序設(shè)計(jì)流程框圖(8)程序清單;思考題(補(bǔ)充作業(yè)題):上例中,如果采用CJNE指令,應(yīng)如何修改程序?第17頁(yè)/共64頁(yè)返回第18頁(yè)/共64頁(yè)AREEQU1000H;

BUFEQU2000H;

ORG1000HSTART:MOVDPTR,#ARE;數(shù)據(jù)X的地址送數(shù)據(jù)指針DPTRMOVXA,@DPTR;A←取數(shù)據(jù)XJZSUL;X=0轉(zhuǎn)SULJBACC.7,NEG;X<0轉(zhuǎn)NEG,否則,X>0MOVA,#01H;

SJMPSUL;

NEG:MOVA,#0FFH;(0FFH為-1補(bǔ)碼)SUL:MOVDPTR,#BUF;數(shù)據(jù)Y的地址送數(shù)據(jù)指針DPTRMOVX@DPTR,A;保存Y值

END返回第19頁(yè)/共64頁(yè)

首先,在程序中建立一個(gè)轉(zhuǎn)移指令表,在表格中存放轉(zhuǎn)移指令,然后,通過(guò)查轉(zhuǎn)移指令表的方式實(shí)現(xiàn)多分支程序轉(zhuǎn)移。這種方法主要利用散轉(zhuǎn)指令JMP@A+DPTR,此指令采用變址尋址方式,操作過(guò)程:(PC)←((A)+(DPTR)),CPU根據(jù)PC的內(nèi)容來(lái)實(shí)現(xiàn)多分支程序轉(zhuǎn)移。DPTR中送轉(zhuǎn)移指令表的表首地址(常用轉(zhuǎn)移指令表的名稱(chēng)標(biāo)號(hào)代替),而A中送轉(zhuǎn)移指令表中存放的轉(zhuǎn)移指令的序號(hào)(常常從第0條開(kāi)始)。例如,有多個(gè)分支程序,如要通過(guò)AJMP轉(zhuǎn)移指令進(jìn)行轉(zhuǎn)移,則應(yīng)把這些轉(zhuǎn)移指令按序?qū)懭朕D(zhuǎn)移指令表中,并設(shè)置一個(gè)序號(hào)指針(例如R3),序號(hào)往往從0開(kāi)始,然后可使用以下查表程序?qū)崿F(xiàn)程序轉(zhuǎn)移。(b)使用查轉(zhuǎn)移指令表的方法實(shí)現(xiàn)多分支程序轉(zhuǎn)移第20頁(yè)/共64頁(yè)MOVA,R3;分支程序序號(hào)送ARLA;分支程序序號(hào)乘2MOVDPTR,#BRTAB;BRTAB為轉(zhuǎn)移指令表名稱(chēng)標(biāo)號(hào),

JMP@A+DPTR;也為轉(zhuǎn)移指令表首地址BRTAB:AJMPROUT0;分支程序0的轉(zhuǎn)移指令

AJMPROUT1;分支程序1的轉(zhuǎn)移指令

AJMPROUT2;┇

AJMPROUT127;分支程序127的轉(zhuǎn)移指令ROUT0:………;分支程序0ROUT1:………;┇ROUT127:………;分支程序127第21頁(yè)/共64頁(yè)

由于AJMP指令是二字節(jié)指令,因此,程序中通過(guò)RLA指令將分支序號(hào)乘2。轉(zhuǎn)移指令表中最多只能安排128條分支轉(zhuǎn)移指令,如需多于128條,則必須另行修改程序。由于AJMP指令轉(zhuǎn)移范圍是2KB,因此,分支程序應(yīng)安排在以JMP@A+DPTR指令為中心的2KB范圍之內(nèi),否則會(huì)出錯(cuò)。如果轉(zhuǎn)移指令表中的轉(zhuǎn)移指令是LJMP指令,則分支程序可安排在64KBROM空間的任何地方。但轉(zhuǎn)移指令表中的轉(zhuǎn)移指令的條數(shù)最多為85條(LJMP指令是三字節(jié)指令),上述程序應(yīng)作相應(yīng)的修改。

MOVA,R3;

MOVB,#03H;

MULAB;第22頁(yè)/共64頁(yè)MOVDPTR,#BRTAB;BRTAB為轉(zhuǎn)移指令表名稱(chēng)標(biāo)號(hào),

JMP@A+DPTR;也為轉(zhuǎn)移指令表首地址BRTAB:LJMPROUT0;分支程序0的轉(zhuǎn)移指令

LJMPROUT1;分支程序1的轉(zhuǎn)移指令

LJMPROUT2;┇

LJMPROUT85;分支程序85的轉(zhuǎn)移指令ROUT0:………;分支程序0ROUT1:………;┇ROUT85:………;分支程序85第23頁(yè)/共64頁(yè)返回第24頁(yè)/共64頁(yè)4.2.3循環(huán)程序結(jié)構(gòu)MCS-51匯編語(yǔ)言指令系統(tǒng)沒(méi)有專(zhuān)用的循環(huán)指令,但可以使用條件轉(zhuǎn)移指令通過(guò)條件判斷來(lái)控制循環(huán)是繼續(xù)還是結(jié)束。循環(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)行分析、處理和存放。第25頁(yè)/共64頁(yè)

單循環(huán)程序一般有以下兩種典型結(jié)構(gòu):第26頁(yè)/共64頁(yè)

雙重循環(huán)程序的結(jié)構(gòu):第27頁(yè)/共64頁(yè)

在應(yīng)用系統(tǒng)程序設(shè)計(jì)時(shí),有時(shí)經(jīng)常需要將數(shù)據(jù)存儲(chǔ)器中各部分地址單元作為工作單元,以存放程序執(zhí)行的中間值或執(zhí)行結(jié)果,因此,在使用這些工作單元之前,必須將工作單元清零。工作單元清零可用循環(huán)程序完成。例:假設(shè)在內(nèi)部RAM區(qū),開(kāi)辟96個(gè)工作單元,工作單元首地址為20H,則工作單元清零程序子程序如下:ORG1000HCLR0:MOVR0,#20H;循環(huán)初始化部分

MOVR7,#96;

CLRALOOP:MOV@R0,A;循環(huán)體部分

INCR0;修改變量

DJNZR7,LOOP;循環(huán)控制部分

RETEND思考題(補(bǔ)充作業(yè)題):如采用CJNE指令,應(yīng)如何修改程序?第28頁(yè)/共64頁(yè)

例:兩個(gè)三字節(jié)二進(jìn)制無(wú)符號(hào)數(shù)相加,被加數(shù)放在內(nèi)部RAM20H~22H單元(低字節(jié)存放在低地址單元,高字節(jié)存放在高地址單元,即低位在前,高位在后),加數(shù)放在2AH~2CH單元,和放在20H~22H單元,最高位如有進(jìn)位,則放在23H單元中。解:數(shù)據(jù)類(lèi)型(二、十進(jìn)制數(shù),有、無(wú)符號(hào)數(shù));數(shù)據(jù)結(jié)構(gòu)(升、降序排列)被加數(shù)(N1)高字節(jié)(8位)中字節(jié)(8位)低字節(jié)(8位)加數(shù)(N2)高字節(jié)(8位)中字節(jié)(8位)低字節(jié)(8位)被加數(shù)(N1)加數(shù)(N2)和(N3)20H單元低字節(jié)(8位)2AH單元低字節(jié)(8位)20H單元低字節(jié)(8位)21H單元中字節(jié)(8位)2BH單元中字節(jié)(8位)21H單元中字節(jié)(8位)22H單元高字節(jié)(8位)2CH單元高字節(jié)(8位)22H單元高字節(jié)(8位)23H單元進(jìn)位位第29頁(yè)/共64頁(yè)被加數(shù)N1高字節(jié)(8位)中字節(jié)(8位)低字節(jié)(8位)加數(shù)N2高字節(jié)(8位)中字節(jié)(8位)低字節(jié)(8位)

+)進(jìn)位位(CY)進(jìn)位位(CY)進(jìn)位位(CY)和N3進(jìn)位高字節(jié)(8位)中字節(jié)(8位)低字節(jié)(8位)

程序流程框圖

程序清單思考題:統(tǒng)計(jì)正數(shù)、負(fù)數(shù)、零的個(gè)數(shù)。第30頁(yè)/共64頁(yè)ORG0030HADDDUO:MOVR0,#20H;循環(huán)初始化部分

MOVR1,#2AH;

MOVR7,#03H;循環(huán)次數(shù)

CLRC;

LOOP:MOVA,@R0;循環(huán)體部分

ADDCA,@R1;

MOV@R0,A;

INCR0;修改指針變量

INCR1;

DJNZR7,LOOP;循環(huán)控制部分

CLRA;循環(huán)結(jié)束處理部分

ADDCA,#00H;

MOV@R0,A;

RET;

END返回第31頁(yè)/共64頁(yè)返回第32頁(yè)/共64頁(yè)

例:把內(nèi)部RAM中起始地址為DATA的數(shù)據(jù)串傳送到外部RAM以BUFFER為首地址的區(qū)域,直到發(fā)現(xiàn)“$”字符的ASCⅡ碼為止,同時(shí)規(guī)定數(shù)據(jù)串最大長(zhǎng)度為32個(gè)字節(jié)。解:(1)分析任務(wù):數(shù)據(jù)傳送;(2)算法:比較、控制轉(zhuǎn)移(3)程序結(jié)構(gòu):分支、循環(huán)(4)數(shù)據(jù)類(lèi)型:多字節(jié)字符串

(5)RAM單元安排:內(nèi)部RAM單元、外部RAM單元(6)采用寄存器間接尋址方式(R0、R1或DPTR)第33頁(yè)/共64頁(yè)

(7)程序流程框圖;第34頁(yè)/共64頁(yè)ORG0030HDATACS:MOVR0,#DATA;DATA數(shù)據(jù)區(qū)首地址

MOVDPTR,#BUFFER;BUFFER數(shù)據(jù)區(qū)首地址

MOVR1,#20H;最大數(shù)據(jù)串長(zhǎng)

LOOP:MOVA,@R0;取數(shù)據(jù)

SUBBA,#24H;判是否為“$”字符

JZLOOP1;是“$”字符,轉(zhuǎn)結(jié)束

MOVX@DPTR,A;數(shù)據(jù)傳送

INCR0;

INCDPTR;

DJNZR1,LOOP;循環(huán)控制

LOOP1:RET;結(jié)束

END第35頁(yè)/共64頁(yè)4.380C51單片機(jī)匯編語(yǔ)言程序設(shè)計(jì)舉例4.3.2定時(shí)程序在單片機(jī)的控制應(yīng)用中,常有定時(shí)的需要,如定時(shí)中斷、定時(shí)檢測(cè)和定時(shí)掃描等。定時(shí)功能除可以使用純硬件電路、可編程定時(shí)/計(jì)數(shù)器實(shí)現(xiàn)外,還可以使用軟件程序(定時(shí)程序)完成。定時(shí)程序是典型的循環(huán)程序,它是通過(guò)執(zhí)行一個(gè)具有固定延遲時(shí)間的循環(huán)體來(lái)實(shí)現(xiàn)定時(shí)的。(1)單循環(huán)定時(shí)程序

MOVR5,#TIME;LOOP:NOP;

NOP;

DJNZR5,LOOP;第36頁(yè)/共64頁(yè)

假設(shè)單片機(jī)晶振頻率fosc=6MHz,則一個(gè)機(jī)器周期為2μs,NOP、DJNZ指令分別是單、雙機(jī)器周期指令。定時(shí)程序的總延遲時(shí)間是循環(huán)程序段延時(shí)時(shí)間的整數(shù)倍,由于R5是8位寄存器,因此,這個(gè)定時(shí)程序的最長(zhǎng)定時(shí)時(shí)間為:

256(28)×8=2048(μs)(2)較長(zhǎng)時(shí)間的定時(shí)程序(多重循環(huán)定時(shí)子程序)

TIME:MOVR5,#TTME1;

LOOP:MOVR4,#TEME2;

LOOP1:NOP;

NOP;

DJNZR4,LOOP1;

DJNZR5,LOOP2;

RET;第37頁(yè)/共64頁(yè)

這個(gè)定時(shí)子程序的最長(zhǎng)定時(shí)時(shí)間為:

[256(28)×4+2+1]×256(28)×2+4=525828(μs)(3)調(diào)整定時(shí)時(shí)間在定時(shí)程序中可通過(guò)在循環(huán)程序段中增減指令的方法對(duì)定時(shí)時(shí)間進(jìn)行微調(diào)。例:MOVR0,#TTME;

LOOP:ADDA,R1;

INCDPTR;

DJNZR0,LOOP;由于ADD、INC、DJNZ指令的機(jī)器周期分別為1、2、2,所以,該程序定時(shí)時(shí)間為=(1+2+2)×2μs×Time(μs)。第38頁(yè)/共64頁(yè)假定要求定時(shí)時(shí)間為24us。對(duì)于這個(gè)定時(shí)程序,只須增加一條NOP指令即可實(shí)現(xiàn)。

MOVR0,#TIME;LOOP:ADDA,R1;

INCDPTR;

NOP;

DJNZR0,LOOP;只須TIME取2,即可得到精確的24μs定時(shí)。(4)以一個(gè)基本的延時(shí)程序滿(mǎn)足不同的定時(shí)要求如果一個(gè)系統(tǒng)有多個(gè)定時(shí)需要,我們就可以設(shè)計(jì)一個(gè)基本延時(shí)程序,使其延時(shí)時(shí)間為各定時(shí)時(shí)間的最大公約數(shù),然后可以以此基本程序作為子程序,通過(guò)調(diào)用的方法實(shí)現(xiàn)所需不同定時(shí)。

第39頁(yè)/共64頁(yè)

例:在單片機(jī)應(yīng)用系統(tǒng)中,假設(shè)需要的定時(shí)時(shí)間分別為5S、10S、20S,可設(shè)計(jì)一個(gè)1S延時(shí)子程序DELAY,則5S、10S、20S的定時(shí)時(shí)間可通過(guò)調(diào)用DELAY實(shí)現(xiàn)。

MOVR0,#05H;5S定時(shí)

LOOP:LCALLDELAY;

DJNZR0,LOOP1;┋

MOVR0,#0AH;10S定時(shí)

LOOP2:LCALLDELAY;

DJNZR0,LOOP2;┋

MOVR0,#14H;20S定時(shí)

LOOP3:LCALLDELAY;

DJNZR0,LOOP3;┋第40頁(yè)/共64頁(yè)4.3.3查表程序所謂查表程序,就是指預(yù)先把數(shù)據(jù)以表格形式存放在程序存儲(chǔ)器中,然后使用程序讀出,這種能讀出表格數(shù)據(jù)的程序就稱(chēng)之為查表程序。查表操作對(duì)單片機(jī)的控制應(yīng)用十分重要,查表程序常用于實(shí)現(xiàn)非線(xiàn)性修正,非線(xiàn)性函數(shù)轉(zhuǎn)換以及代碼轉(zhuǎn)換等場(chǎng)合。

MCS-51單片機(jī)指令系統(tǒng)中有兩條專(zhuān)用查表指令:(1)MOVCA,@A+DPTR;A←((A)+(DPTR))(2)MOVCA,

@A+PC;A←((A)+(PC))這兩條查表指令的功能是完全相同的,其共同優(yōu)點(diǎn)是:能在不改變PC和DPTR的狀態(tài)下,只根據(jù)A的內(nèi)容就可以取出表格中的數(shù)據(jù)。注意:A的內(nèi)容均為8位無(wú)符號(hào)數(shù)。第41頁(yè)/共64頁(yè)對(duì)于第一條指令,適用于64KBROM范圍內(nèi)查表(即數(shù)據(jù)表格的大小和位置可以在64KB程序存儲(chǔ)器中任意安排,一個(gè)數(shù)據(jù)表格可以被多個(gè)程序塊使用),編寫(xiě)查表程序時(shí),首先把表的首地址送入DPTR中,再要將查表的數(shù)據(jù)序號(hào)(或下標(biāo)值)送入A中,然后就可以使用該指令進(jìn)行查表操作,并把結(jié)果送A中。對(duì)于第二條指令,常用于“本地”范圍查表(即數(shù)據(jù)表格只能放在該指令后面256個(gè)地址單元之內(nèi),而且表格只能被本程序使用),編寫(xiě)查表程序時(shí),首先把查表數(shù)據(jù)的序號(hào)送入A中,再把從查表指令的下一條指令的首地址到表的首地址間的偏移量與A值相加,然后再使用該指令進(jìn)行查表操作,并把結(jié)果送入A中。第42頁(yè)/共64頁(yè)例:設(shè)計(jì)一個(gè)子程序,其功能為根據(jù)x的內(nèi)容(0~9之間)查平方表,求出相應(yīng)的結(jié)果y(y=x2)。假設(shè)x的內(nèi)容已存放在內(nèi)部RAM30H單元中,求出y的內(nèi)容存放在內(nèi)部RAM40H單元中。

ORG1000H1000HSQR:MOVA,30H;A←x1002HPUSHDPH;現(xiàn)場(chǎng)保護(hù)1004HPUSHDPL;1006HMOVDPTR,#TAB1;DPTR←表首地址TAB11009HMOVCA,@A+DPTR;查表得y100AHMOV40H,A;40H←y100CHPOPDPL;現(xiàn)場(chǎng)恢復(fù)100EHPOPDPH;1010HRET1011HTAB1:DB00H,01H,04H,09H,10H,19HDB24H,31H,40H,51H第43頁(yè)/共64頁(yè)上例中,如果使用MOVCA,@A+PC指令,則編程如下:

ORG1000H1000HSQR:MOVA,30H;A←x1002HPUSHDPH;現(xiàn)場(chǎng)保護(hù)1004HPUSHDPL;1006HADDA,#07H;加偏移量1008HMOVCA,@A+PC;查表得y1009HMOV40H,A;40H←y100BHPOPDPL;現(xiàn)場(chǎng)恢復(fù)100DHPOPDPH;100FHRET1010HTAB1:DB00H,01H,04H,09H,10H,19HDB24H,31H,40H,51H此題中,偏移量=1010H-1009H=07H第44頁(yè)/共64頁(yè)4.4單片機(jī)匯編語(yǔ)言源程序的編輯和匯編

4.580C51單片機(jī)匯編語(yǔ)言偽指令

匯編語(yǔ)言程序必須轉(zhuǎn)換為二進(jìn)制的機(jī)器代碼程序,單片機(jī)才能夠執(zhí)行。匯編語(yǔ)言程序轉(zhuǎn)換為機(jī)器代碼程序的過(guò)程,稱(chēng)之為匯編。匯編的方法有兩種:即機(jī)器交叉匯編和手工匯編。所謂手工匯編,就是指程序設(shè)計(jì)人員通過(guò)查指令編碼表,逐個(gè)把助記符指令“翻譯”成機(jī)器碼。手工匯編方法通常用于短、小程序的匯編。長(zhǎng)程序則必須通過(guò)機(jī)器交叉匯編的方法進(jìn)行匯編。所謂機(jī)器交叉匯編,就是指程序設(shè)計(jì)人員使用一種計(jì)算機(jī)的匯編程序去匯編另一種計(jì)算機(jī)的源程序,具體地說(shuō)就是運(yùn)行匯編程序進(jìn)行匯編的是一種計(jì)算機(jī),而運(yùn)行匯編得到的目標(biāo)程序的則是另一種計(jì)算機(jī)。單片機(jī)只能采用機(jī)器交叉匯編的方法對(duì)匯編語(yǔ)言程序進(jìn)行匯編第45頁(yè)/共64頁(yè)

對(duì)匯編語(yǔ)言程序進(jìn)行機(jī)器交叉匯編時(shí),必須告訴計(jì)算機(jī)的匯編程序應(yīng)該如何完成匯編工作,這一任務(wù)就是通過(guò)使用偽指令來(lái)實(shí)現(xiàn)的。偽指令是程序設(shè)計(jì)人員發(fā)給匯編程序的指令,也稱(chēng)匯編命令或匯編程序控制指令。它具有控制匯編程序的輸入輸出、定義數(shù)據(jù)和符號(hào)、條件匯編、分配存儲(chǔ)空間等功能。偽指令沒(méi)有與之相對(duì)應(yīng)的二進(jìn)制機(jī)器代碼,因此,在匯編語(yǔ)言指令系統(tǒng)匯總表中,查不到相對(duì)應(yīng)的二進(jìn)制機(jī)器代碼。不同匯編語(yǔ)言的偽指令也有所不同,但一些基本指令是相同的。手工匯編不需要偽指令,但機(jī)器交叉匯編必須使用偽指令。在對(duì)匯編語(yǔ)言程序進(jìn)行機(jī)器交叉匯編前,偽指令存在于匯編語(yǔ)言程序中,但匯編后得到的機(jī)器代碼程序中不存在偽指令相對(duì)應(yīng)的二進(jìn)制機(jī)器代碼,這一點(diǎn)請(qǐng)?zhí)貏e注意。第46頁(yè)/共64頁(yè)(1)ORG(ORiGin)匯編起始地址命令本命令總出現(xiàn)在匯編語(yǔ)言源程序的開(kāi)頭位置,用于規(guī)定目標(biāo)程序的起始地址,即此命令后面的程序或數(shù)據(jù)塊的起始地址。命令格式:[〈標(biāo)號(hào):〉]ORG〈地址〉

其中[〈標(biāo)號(hào):〉]是選擇項(xiàng),根據(jù)需要選用,〈地址〉項(xiàng),通常為16位絕對(duì)地址,但也可以使用標(biāo)號(hào)或表達(dá)式表示。在匯編語(yǔ)言程序的開(kāi)始,通常都用一條ORG偽指令來(lái)規(guī)定程序的起始地址,如果不用ORG規(guī)定,則匯編得到的目標(biāo)程序?qū)?000H開(kāi)始。例:ORG8000H即規(guī)定標(biāo)號(hào)START代表地址8000H,

START:MOVA,#00H;目標(biāo)程序的第一條指令從8000H┇開(kāi)始。第47頁(yè)/共64頁(yè)(2)END(ENDofassembly)匯編終止命令

本命令用于終止匯編語(yǔ)言源程序的匯編工作,END是匯編語(yǔ)言源程序的結(jié)束標(biāo)志,因此,在整個(gè)匯編語(yǔ)言源程序中只能有一個(gè)END指令,且位于程序的最后。如果END命令出現(xiàn)在程序中間,則在END之后的指令,匯編程序?qū)⒉挥杼幚?。命令格式:[〈標(biāo)號(hào):〉]END[〈表達(dá)式〉]

(3)EQU(EQUate)賦值命令本命令用于給字符名稱(chēng)賦予一個(gè)特定值,賦值以后,其值在整個(gè)程序中有效。命令格式:〈字符名稱(chēng)〉EQU〈賦值項(xiàng)〉

其中〈賦值項(xiàng)〉可以是常數(shù),地址,標(biāo)號(hào)或表達(dá)式,其值為8位或16位二進(jìn)制數(shù)。賦值以后的字符名稱(chēng)既可以作地址使用,也可以作立即數(shù)使用。第48頁(yè)/共64頁(yè)

例:HOUREQU30HORG1000HSTART:MOVHOUR,#40H;等同于

START:MOV30H,#40H;(4)DB(DefineByte)定義數(shù)據(jù)字節(jié)命令本命令用于從指定的地址單元開(kāi)始,在程序存儲(chǔ)器的連續(xù)單元中定義字節(jié)數(shù)據(jù)。命令格式:[〈標(biāo)號(hào):〉]DB〈8位數(shù)表〉

常使用本命令存放數(shù)據(jù)表格。例:存放7段數(shù)碼管(共陽(yáng)極)顯示的十六進(jìn)制基數(shù)(0~F)的十六進(jìn)制數(shù)的字形代碼,可使用多條DB命令定義。第49頁(yè)/共64頁(yè)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(xiàn)

查表時(shí),為確定數(shù)據(jù)區(qū)的起始地址,可采用兩種方法:

a)根據(jù)DB命令前一條指令的地址確定。把該地址加上它的字節(jié)數(shù)就是DB的定義的數(shù)據(jù)字節(jié)的起始地址。例:8100:MOVA,#49H;一字節(jié)指令

TAB:DB0COH,0F9H,0A4H,0B0H;┋定義的7段數(shù)碼管(共陽(yáng)極)顯示的十六進(jìn)制基數(shù)(0~F)的十六進(jìn)制數(shù)的字形代碼從8101H地址單元開(kāi)始存放。第50頁(yè)/共64頁(yè)b)使用0RG命令專(zhuān)門(mén)規(guī)定。例:ORG8100HTAB:DB0COH,0F9H,0A4H,0B0H;┋定義的7段數(shù)碼管(共陽(yáng)極)顯示的十六進(jìn)制基數(shù)(0~F)的十六進(jìn)制數(shù)的字形代碼從8101H地址單元開(kāi)始存放。(5)DW(DefineWord)定義數(shù)據(jù)字命令本命令用于從指定地址開(kāi)始,在程序存儲(chǔ)器單元中定義16位的數(shù)據(jù)字。命令格式:[〈標(biāo)號(hào):〉]DW〈16位數(shù)表〉

存放時(shí),數(shù)據(jù)字的高8位在前(低地址),低8位在后(高地址)。第51頁(yè)/共64頁(yè)

例:DW“AA”;存入41H,42H。

DB和DW定義的數(shù)表,數(shù)的個(gè)數(shù)不得超過(guò)80個(gè)。如數(shù)據(jù)的數(shù)目較多時(shí),可使用多個(gè)定義命令。在MCS-51程序設(shè)計(jì)應(yīng)用中,常以DB來(lái)定義數(shù)據(jù),以DW來(lái)定義地址。(6)DS(DefineStonage)定義存儲(chǔ)區(qū)命令本命令用于從指定地址開(kāi)始,保留指定數(shù)目的字節(jié)單元作為存儲(chǔ)器,供程序運(yùn)行使用,匯編時(shí),對(duì)這些單元不賦值。命令格式:[〈標(biāo)號(hào):〉]DS〈16位數(shù)表〉

例:ORG8100HDS08H

從8100H地址開(kāi)始,保留8個(gè)連續(xù)的地址單元。第52頁(yè)/共64頁(yè)(7)BIT位定義命令

本命令用于給字符名稱(chēng)賦以位地址命令格式:〈字符名稱(chēng)〉BIT〈位地址〉

其中〈位地址〉可以是絕對(duì)地址,也可以是符號(hào)地址(即位符號(hào)名稱(chēng))例:AQBITP1.0

把P1.0的位地址賦給變量AQ,在其后的編程中,AQ就可以作為位地址使用。

第53頁(yè)/共64頁(yè)補(bǔ)充內(nèi)容:子程序結(jié)構(gòu)

子程序結(jié)構(gòu)是一種非常重要的程序結(jié)構(gòu)。在一個(gè)程序中經(jīng)常遇到反復(fù)多次某程序段的情況,如果重復(fù)書(shū)寫(xiě)這個(gè)程序段,會(huì)使程序變得冗長(zhǎng)而雜亂。對(duì)此,可采用子程序結(jié)構(gòu),即把重復(fù)的程序段編寫(xiě)為一個(gè)子程序,通過(guò)主程序調(diào)用而使用它。這樣不但減少了編程工作量,而且也縮短了程序的長(zhǎng)度。調(diào)用和返回構(gòu)成了子程序調(diào)用的完整過(guò)程。為了實(shí)現(xiàn)這一過(guò)程,必須有子程序調(diào)用指令和返回指令。調(diào)用指令在主程序中使用,而返回指令則應(yīng)該是子程序的最后一條指令。執(zhí)行完這條指令后,程序返回主程序斷點(diǎn)處繼續(xù)執(zhí)行。第54頁(yè)/共64頁(yè)(1)子程序的編程原則在實(shí)際的單片機(jī)應(yīng)用系統(tǒng)軟件設(shè)計(jì)中,為了程序結(jié)構(gòu)更加清晰,易于設(shè)計(jì),易于修改,增強(qiáng)程序可讀性,基本上都要使用子程序結(jié)構(gòu)。子程序作為一個(gè)具有獨(dú)立功能的程序段,編程時(shí)需遵循以下原則:

a)子程序的第一條指令必須有標(biāo)號(hào),明確子程序入口地址;

b)以返回指令RET結(jié)束子程序;

c)子程序說(shuō)明部分;子程序名稱(chēng):提供給主程序調(diào)用的名字,通常用符號(hào)或子程序第一條語(yǔ)句的標(biāo)號(hào)來(lái)表示。子程序功能:簡(jiǎn)要說(shuō)明子程序能完成的主要功能。子程序入口參數(shù):主程序需要向子程序提供的參數(shù)。第55頁(yè)/共64頁(yè)

子程序出口參數(shù):子程序執(zhí)行完之后向主程序返回的參數(shù)。子程序占用資源:子程序中使用了哪些存儲(chǔ)單元、寄存器等子程序堆棧深度:子程序占用堆棧區(qū)的最大字節(jié)數(shù)。子程序嵌套情況:子程序中繼續(xù)調(diào)用子程序的情況。子程序的字節(jié)數(shù):子程序中所有指令字節(jié)數(shù)的總和。子程序執(zhí)行時(shí)間:子程序中所有指令的機(jī)器周期數(shù)總和。這些說(shuō)明是寫(xiě)給程序員看的,供以后使用子程序時(shí)參考。

d)較強(qiáng)的通用性和可浮動(dòng)性,盡可能避免使用具體的內(nèi)存單元和絕對(duì)轉(zhuǎn)移地址等。

e)注意保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)。子程序在編制過(guò)程中經(jīng)常會(huì)用到一些通用單元,如工作寄存器、累加器、數(shù)據(jù)指針DPTR以及PSW等。而這些工作單元在調(diào)用第56頁(yè)/共64頁(yè)它的主程序中也會(huì)用到,為此,需要將子程序用到的這些通用編程資源加以保護(hù),稱(chēng)為保護(hù)現(xiàn)場(chǎng)。在子程序執(zhí)行完后需恢復(fù)這些單元的內(nèi)容,稱(chēng)為恢復(fù)現(xiàn)場(chǎng)。通常保護(hù)和恢復(fù)現(xiàn)場(chǎng)是在子程序中利用堆棧操作實(shí)現(xiàn)的,在子程序的開(kāi)始部分把子程序中要用到的編程資源都保護(hù)起來(lái),在執(zhí)行返回指令之前恢復(fù)現(xiàn)場(chǎng),這是一種比較規(guī)范的方法。

另外,保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)也可以在主程序中實(shí)現(xiàn)。在調(diào)用子程序前保護(hù)現(xiàn)場(chǎng),子程序返回后恢復(fù)現(xiàn)場(chǎng),這種方式比較靈活,可以根據(jù)當(dāng)時(shí)的需要確定要保護(hù)的內(nèi)容。第57頁(yè)/共64頁(yè)(2)參數(shù)傳遞的方法主程序調(diào)用子程序時(shí),主程序和子程序之間存在著參數(shù)互相傳遞的問(wèn)題。參數(shù)傳遞一般有以下幾種方法:

1)寄存器傳遞參數(shù)通過(guò)寄存器A傳遞入口參數(shù)和出口參數(shù)。例:假設(shè)a、b均小于10,計(jì)算c=a2+b2,其中a事先存在內(nèi)部RAM的31H單元,b事先存在32H單元,請(qǐng)把c存入33H單元。

SQR:y=x2子程序

ORG0000H;主程序

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論