單片機(jī)原理與應(yīng)用電子教案2_第1頁(yè)
單片機(jī)原理與應(yīng)用電子教案2_第2頁(yè)
單片機(jī)原理與應(yīng)用電子教案2_第3頁(yè)
單片機(jī)原理與應(yīng)用電子教案2_第4頁(yè)
單片機(jī)原理與應(yīng)用電子教案2_第5頁(yè)
已閱讀5頁(yè),還剩63頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章匯編語(yǔ)言程序設(shè)計(jì)簡(jiǎn)介4.1偽指令4.2匯編語(yǔ)言程序設(shè)計(jì)4.1偽指令一、匯編起始指令ORG指令格式為:ORGnn該指令的作用是指明后面的程序或數(shù)據(jù)塊的起始地址,它總是出現(xiàn)在每段源程序或數(shù)據(jù)塊的開始。式中,nn為16位地址,匯編時(shí)nn確定了此語(yǔ)句后面第一條指令或第一個(gè)數(shù)據(jù)的地址,此后的源程序或數(shù)據(jù)塊就依次連續(xù)存放在以后的地址內(nèi),直到遇到另一個(gè)ORG指令為止。例:ORG2000HMOVSP,#60HMOVR0,#2FHMOVR2,#0FFHORG偽指令說明其后面程序的目標(biāo)代碼在存儲(chǔ)器中存放的起始地址是2000H,即存儲(chǔ)器地址目標(biāo)程序2000H7581602003H782F2005H7AFF二、等值指令EQU指令格式:字符名稱EQU數(shù)字或匯編符號(hào)功能:使指令中的字符名稱等價(jià)于給定的數(shù)字或匯編符號(hào)。使用等值指令可給程序的編制、調(diào)試、修改帶來方便,如果在程序中要多次使用到某一地址,由EQU指令將其賦值給一個(gè)字符名稱,一旦需要對(duì)其進(jìn)行變動(dòng),只要改變EQU命令后面的數(shù)字即可,而不需要對(duì)程序中涉及到該地址的所有指令逐句進(jìn)行修改。但要注意,由EQU等值的字符名稱必須先賦值后使用,且在同一個(gè)源程序中,同一個(gè)標(biāo)號(hào)只能賦值一次。例:PA8155EQU8001H即給標(biāo)號(hào)PA8155賦值為8001H。三、定義字節(jié)指令DB指令格式: [標(biāo)號(hào):]DB8位二進(jìn)制數(shù)表功能:把8位二進(jìn)制數(shù)表依次存入從標(biāo)號(hào)開始的連續(xù)的存儲(chǔ)單元中。格式中,標(biāo)號(hào)區(qū)段可有可無,DB指令之后的8位二進(jìn)制數(shù)表是字節(jié)常數(shù)或用逗號(hào)隔開的字節(jié)串,也可以是用引號(hào)括起來的ASCII碼字符串(一個(gè)ASCII字符相當(dāng)于一個(gè)字節(jié))。例:ORG1000HBUF1:DB38H,7FH,80HBUF2:DB45H,66HORG偽指令指定了標(biāo)號(hào)BUF1的地址為1000H,而DB偽指令是將其后的二進(jìn)制數(shù)表38H,7FH,80H依次存放在1000H,1001H,1002H3個(gè)連續(xù)單元之中,BUF2也是一個(gè)標(biāo)號(hào),其地址與前一條偽指令連續(xù),即1003H,1004H地址單元中依次存放45H,66H。四、定義字指令DW指令格式:[標(biāo)號(hào):]DW16位數(shù)據(jù)表該指令的功能與DB相似,區(qū)別僅在于從指定地址開始存放的是指令中的16位數(shù)據(jù),而不是字節(jié)串。每個(gè)16位數(shù)據(jù)要占兩個(gè)存儲(chǔ)單元,高8位先存,低8位后存,這和MCS-51指令中的16位數(shù)據(jù)存放順序是一致的。五、匯編結(jié)束指令END指令格式:[標(biāo)號(hào):]END地址或標(biāo)號(hào)格式中標(biāo)號(hào)以及END后面的地址或標(biāo)號(hào)可有可無。功能:提供匯編結(jié)束標(biāo)志。匯編程序遇到END后就停止匯編,對(duì)END以后的語(yǔ)句不予處理,故END應(yīng)放在程序的結(jié)束處。4.2匯編語(yǔ)言程序設(shè)計(jì)4.2.1簡(jiǎn)單程序設(shè)計(jì)例1兩個(gè)無符號(hào)雙字節(jié)數(shù)相加。設(shè)被加數(shù)存放于內(nèi)部RAM的40H(高位字節(jié)),41H(低位字節(jié)),加數(shù)存放于50H(高位字節(jié)),51H(低位字節(jié)),和數(shù)存入40H和41H單元中。程序如下:START:CLRC;將Cy清零MOVR0,#41H;將被加數(shù)地址送數(shù)據(jù)指針R0MOVR1,#51H;將加數(shù)地址送數(shù)據(jù)指針R1AD1:MOVA,@R0;被加數(shù)低字節(jié)的內(nèi)容送入AADDA,@R1;兩個(gè)低字節(jié)相加MOV@R0,A;低字節(jié)的和存入被加數(shù)低字節(jié)中DECR0;指向被加數(shù)高位字節(jié)DECR1;指向加數(shù)高位字節(jié)MOVA,@R0;被加數(shù)高位字節(jié)送入AADDCA,@R1;兩個(gè)高位字節(jié)帶Cy相加MOV@R0,A;高位字節(jié)的和送被加數(shù)高位字節(jié)RET例2將兩個(gè)半半字節(jié)數(shù)數(shù)合并成成一個(gè)一一字節(jié)數(shù)數(shù)。設(shè)內(nèi)部RAM40H#,41H單元中中分別存存放著8位位二進(jìn)制制數(shù),要要求取取出兩個(gè)個(gè)單元中中的低半半字節(jié),并成成一個(gè)字字節(jié)后,存入入50H單元中中。程程序如如下:START:MOVR1,#40H;設(shè)置置R1為為數(shù)據(jù)指指針MOVA,@R1;取取出第一一個(gè)單元元中的內(nèi)內(nèi)容ANLA,#0FH;取第第一個(gè)數(shù)數(shù)的低半半字節(jié)SWAPA;移移至高半半字節(jié)INCR1;修修改數(shù)據(jù)據(jù)指針XCHA,@R1;取取第二二個(gè)單元元中的內(nèi)內(nèi)容ANLA,#0FH;取第第二個(gè)數(shù)數(shù)的低半半字節(jié)ORLA,@R1;拼字字MOV50H,A;存存放結(jié)果果RET4.2.2分分支程程序設(shè)計(jì)計(jì)圖4.1分分支結(jié)結(jié)構(gòu)框圖圖(a)單單分支支流程;(b)多多分支支流程例3x#,y均為為8位二二進(jìn)制數(shù)數(shù),設(shè)設(shè)x存存入R0,y存入R1,求求解:程序如下下:START:CJNER0,#00H,SUL1;R0中的數(shù)數(shù)與00比較不不等轉(zhuǎn)移移MOVR1,#00H;相等等,R1←←0SJMPSUL2SUL1:JCNEG;兩兩數(shù)不不等,若若(R0)<0,轉(zhuǎn)轉(zhuǎn)向NEGMOVR1,##01H;((R0)>0,則則R1←01HSJMPSUL2NEG:MOVR1,##0FFH;(R0)<0,則則R1←0FFHSUL2:RET圖4.2例4比較兩兩個(gè)無無符號(hào)號(hào)數(shù)的的大小小。設(shè)外部部RAM的的存儲(chǔ)儲(chǔ)單元元ST1和和ST2中中存放放兩個(gè)個(gè)不帶帶符號(hào)號(hào)的二二進(jìn)制制數(shù),找找出其其中的的大數(shù)數(shù)存入入外部部RAM中中的ST3單單元中中。圖4.3程序如如下::ORG1000HST1EQU2000HST2EQU2100HST3EQU2200HSTART:CLRC;清清零零CyMOVDPTR,##ST1;第第一個(gè)個(gè)數(shù)的的指針針MOVXA,@DPTR;取取第一一個(gè)數(shù)數(shù)MOVR2,A;保保存MOVDPTR,##ST2;第第二個(gè)個(gè)數(shù)的的指針針MOVXA,@DPTR;取取第二二個(gè)數(shù)數(shù)CLRCSUBBA,R2;兩兩數(shù)數(shù)比較較JNCBIG1;若若第二二個(gè)數(shù)數(shù)大,則則轉(zhuǎn)XCHA,R2;第第一個(gè)個(gè)數(shù)大大BIG0:MOVDPTR,##ST3MOVX@DPTR,A;存存大大數(shù)RETBIG1:MOVXA,@DPTR;第第二個(gè)個(gè)數(shù)大大SJMPBIG0RET4.2.3循循環(huán)程程序設(shè)設(shè)計(jì)一、循循環(huán)環(huán)程序序圖4.4循環(huán)程程序一一般由由四個(gè)個(gè)主要要部分分組成成:(1)初初始化化部分分:為為循循環(huán)程程序做做準(zhǔn)備備,如如規(guī)規(guī)定循循環(huán)次次數(shù)、、給給各變變量和和地址址指針針預(yù)置置初值值。(2)處處理部部分:為為反復(fù)復(fù)執(zhí)行行的程程序段段,是是循循環(huán)程程序的的實(shí)體體,也也是是循環(huán)環(huán)程序序的主主體。。(3)循循環(huán)控控制部部分:這這部分分的作作用是是修改改循環(huán)環(huán)變量量和控控制變變量,并并判斷斷循環(huán)環(huán)是否否結(jié)束束,直直到到符合合結(jié)束束條件件時(shí),跳跳出循循環(huán)為為止。。(4)結(jié)結(jié)束部部分:這這部分分主要要是對(duì)對(duì)循環(huán)環(huán)程序序的結(jié)結(jié)果進(jìn)進(jìn)行分分析、、處處理和和存放放。例5工作單單元清清零。。在應(yīng)用用系統(tǒng)統(tǒng)程序序設(shè)計(jì)計(jì)時(shí),有有時(shí)經(jīng)經(jīng)常需需要將將存儲(chǔ)儲(chǔ)器中中各部部分地地址單單元作作為工工作單單元,存存放程程序執(zhí)執(zhí)行的的中間間值或或執(zhí)行行結(jié)果果,工工作作單元元清零零工作作常常常放在在程序序的初初始化化部分分中。。設(shè)有有50個(gè)個(gè)工工作作單單元元,其其首首址址為為外外部部存存儲(chǔ)儲(chǔ)器器8000H單單元元,則則其其工工作作單單元元清清零零程程序序如如下下:CLEAR:CLRAMOVDPTR,##8000H;工工作作單單元元首首址址送送指指針針MOVR2,50;置置循循環(huán)環(huán)次次數(shù)數(shù)CLEAR1:MOVX@DPTR,AINCDPTR;修修改改指指針針DJNZR2,CLEAR1;控控制制循循環(huán)環(huán)RET例6設(shè)在在內(nèi)內(nèi)部部RAM的的BLOCK單單元元開開始始處處有有長(zhǎng)長(zhǎng)度度為為L(zhǎng)EN個(gè)個(gè)的的無無符符號(hào)號(hào)數(shù)數(shù)據(jù)據(jù)塊塊,試試編編一一個(gè)個(gè)求求和和程程序序,并并將將和和存存入入內(nèi)內(nèi)部部RAM的的SUM單單元元((設(shè)設(shè)和和不不超超過過8位位))。。BLOCKEQU20HLENEQU30HSUMEQU40HSTART:CLRA;清清累累加加器器AMOVR2,##LEN;數(shù)數(shù)據(jù)據(jù)塊塊長(zhǎng)長(zhǎng)度度送送R2MOVR1,##BLOCK;數(shù)數(shù)據(jù)據(jù)塊塊首首址址送送R1LOOP:ADDA,@R1;循循環(huán)環(huán)加加法法INCR1;修修改改地地址址指指針針DJNZR2,LOOP;修修改改計(jì)計(jì)數(shù)數(shù)器器并并判判斷斷MOVSUM,A;存存和和RET二、、多多重重循循環(huán)環(huán)例710秒延延時(shí)程序。。延時(shí)程序與與MCS-51執(zhí)行行指令的時(shí)時(shí)間有關(guān),如果使使用6MHz晶晶振,一一個(gè)機(jī)器周周期為2μs,計(jì)算出出一條指令令以至一個(gè)個(gè)循環(huán)所需需要的執(zhí)行行時(shí)間,給給出相應(yīng)應(yīng)的循環(huán)次次數(shù),便便能達(dá)到延延時(shí)的目的的。10秒秒延時(shí)程程序如下:DELAY:MOVR5,##100DEL0:MOVR6,##200DEL1:MOVR7,##248DEL2:DJNZR7,DEL2DJNZR6,DEL1DJNZR5,DEL0RET上例程序中中采用了多多重循環(huán)程程序,即即在一個(gè)循循環(huán)體中又又包含了其其它的循環(huán)環(huán)程序,這這種方式式是實(shí)現(xiàn)延延時(shí)程序的的常用方法法。使用用多重循環(huán)環(huán)時(shí),必必須注意:(1)循循環(huán)嵌套,必須層層次分明,不允許許產(chǎn)生內(nèi)外外層循環(huán)交交叉。(2)外外循環(huán)可以以一層層向向內(nèi)循環(huán)進(jìn)進(jìn)入,結(jié)結(jié)束時(shí)由里里往外一層層層退出。。(3)內(nèi)內(nèi)循環(huán)可以以直接轉(zhuǎn)入入外循環(huán),實(shí)現(xiàn)一一個(gè)循環(huán)由由多個(gè)條件件控制的循循環(huán)結(jié)構(gòu)方方式。例8在外部RAM中,BLOCK開始始的單元中中有一無符符號(hào)數(shù)據(jù)塊塊,其個(gè)個(gè)數(shù)為L(zhǎng)EN個(gè)個(gè)字節(jié)。試試將這些無無符號(hào)數(shù)按按遞減次序序重新排列列,并存存入原存儲(chǔ)儲(chǔ)區(qū)。ORG1000HSTART:MOVDPTR,#BLOCK;置地址址指針MOVP2,DPH;P2作作地址指針針高字節(jié)MOVR7,##LEN;置外外循環(huán)計(jì)數(shù)數(shù)初值DECR7;比比較與交換換n-1次LOOP0:CLRF0;交交換標(biāo)志清清0MOVR0,DPL;MOVR1,DPL;置相相鄰兩數(shù)地地址指針低低字節(jié)INCR1MOVR6,R7;置置內(nèi)循環(huán)環(huán)計(jì)數(shù)器初初值LOOP1:MOVXA,@R0;取數(shù)MOVB,A;暫存MOVXA,@R1;取取下一個(gè)個(gè)數(shù)CJNEA,B,NEXT;相鄰兩兩數(shù)比較,不等轉(zhuǎn)轉(zhuǎn)SJMPNOCHA;相等等不交換NEXT:JCNOCHA;Cy=1,則則前者大大于后者,不必交交換SETBF0;否則則,置交交換標(biāo)志MOVX@R0,A;XCHA,B;兩兩數(shù)交換,大者在在前,小小者在后MOVX@R1,A;NOCHA:INCR0INCR1;修修改指針針DJNZR6,LOOP1;內(nèi)循循環(huán)未完,則繼續(xù)續(xù)JNBF0,EXIT;若若從未交交換,則則結(jié)束DJNZR7,LOOP0;外外循循環(huán)未未完,則則繼續(xù)續(xù)EXIT:RET圖4.5例9設(shè)某系系統(tǒng)的的模數(shù)數(shù)轉(zhuǎn)換換器是是ADC0809,它它的轉(zhuǎn)轉(zhuǎn)換結(jié)結(jié)束信信號(hào)EOC連接接到8031的的P1.7端端,當(dāng)當(dāng)EOC的狀狀態(tài)由由低變變高時(shí)時(shí),則則結(jié)結(jié)束循循環(huán)等等待,并并讀取取轉(zhuǎn)換換值,其其程序序如下下:START:MOVDPTR,##addr;0809端端口地地址送送DPTRMOVA,##00H;啟啟動(dòng)動(dòng)0809轉(zhuǎn)換換MOVX@DPTR,ALOOP:JNBP1.7,LOOP;檢檢測(cè)測(cè)P1.7狀態(tài)態(tài),判判是是否轉(zhuǎn)轉(zhuǎn)換結(jié)結(jié)束MOVXCA,@DPTR;讀讀取取轉(zhuǎn)換換結(jié)果果…例10在內(nèi)部部RAM中從從50H單元元開始始的連連續(xù)單單元依依次存存放了了一串串字符符,該該字字符串串以回回車符符為結(jié)結(jié)束標(biāo)標(biāo)志,要要求測(cè)測(cè)試該該字符符串的的長(zhǎng)度度。程序如如下:START:MOVR2,##0FFHMOVR0,##4FH;數(shù)數(shù)據(jù)據(jù)指針針R0置初初值LOOP:INCR0INCR2CJNE@R0,##0DH,LOOPRET4.2.4散散轉(zhuǎn)轉(zhuǎn)程序序設(shè)計(jì)計(jì)散轉(zhuǎn)程程序是是分支支程序序的一一種,它它可根根據(jù)運(yùn)運(yùn)算結(jié)結(jié)果或或輸入入數(shù)據(jù)據(jù)將程程序轉(zhuǎn)轉(zhuǎn)入不不同的的分支支。MCS-51指指令令系統(tǒng)統(tǒng)中有有一條條跳轉(zhuǎn)轉(zhuǎn)指令令JMP@A+DPTR,用用它它可以以很容容易地地實(shí)現(xiàn)現(xiàn)散轉(zhuǎn)轉(zhuǎn)功能能。該該指令令把累累加器器的8位位無符符號(hào)數(shù)數(shù)與16位位數(shù)據(jù)據(jù)指針針的內(nèi)內(nèi)容相相加,并并把相相加的的結(jié)果果裝入入程序序計(jì)數(shù)數(shù)器PC,控控制程程序轉(zhuǎn)轉(zhuǎn)向目目標(biāo)地地址去去執(zhí)行行。此此指令令的特特點(diǎn)在在于,轉(zhuǎn)轉(zhuǎn)移的的目標(biāo)標(biāo)地址址不是是在編編程或或匯編編時(shí)預(yù)預(yù)先確確定的的,而而是是在程程序運(yùn)運(yùn)行過過程中中動(dòng)態(tài)態(tài)地確確定的的。目目標(biāo)地地址是是以數(shù)數(shù)據(jù)指指針DPTR的內(nèi)內(nèi)容為為起始始的256字字節(jié)節(jié)范圍圍內(nèi)的的指定定地址址,即即由由DPTR的的內(nèi)容容決定定分支支轉(zhuǎn)移移程序序的首首地址址,由由累累加器器A的的內(nèi)容容來動(dòng)動(dòng)態(tài)選選擇其其中的的某一一個(gè)分分支轉(zhuǎn)轉(zhuǎn)移程程序。。例11根據(jù)工工作寄寄存器器R0內(nèi)內(nèi)容的的不同同,使使程程序轉(zhuǎn)轉(zhuǎn)入相相應(yīng)的的分支支。(R0)=0對(duì)對(duì)應(yīng)應(yīng)的分分支程程序標(biāo)標(biāo)號(hào)為為PR0;(R0)=1對(duì)對(duì)應(yīng)應(yīng)的分分支程程序標(biāo)標(biāo)號(hào)為為PR1;(R0)=N對(duì)對(duì)應(yīng)應(yīng)的分分支程程序標(biāo)標(biāo)號(hào)為為PRN。?!绦蛉缛缦?LP0:MOVDPTR,##TAB;取取表頭頭地址址MOVA,R0ADDA,R0;R0內(nèi)內(nèi)容乘乘以2JNCLP1;無無進(jìn)進(jìn)位轉(zhuǎn)轉(zhuǎn)移INCDPH;加加進(jìn)位位位LP1:JMP@A+DPTR;跳跳至至散轉(zhuǎn)轉(zhuǎn)表中中相應(yīng)應(yīng)位置置TAB:AJMPPR0AJMPPR1AJMPPRN……本例程程序僅僅適用用于散散轉(zhuǎn)表表首地地址TAB和處處理程程序入入口地地址PR0,PR1,……,PRN在同同一個(gè)個(gè)2KB范范圍的的存儲(chǔ)儲(chǔ)區(qū)內(nèi)內(nèi)的情情形。。若超超出2KB范圍圍可在在分支支程序序入口口處安安排一一條長(zhǎng)長(zhǎng)跳轉(zhuǎn)轉(zhuǎn)指令令,可可采采用如如下程程序:MOVDPTR,##TABMOVA,R0MOVB,##03H;長(zhǎng)長(zhǎng)跳跳轉(zhuǎn)指指令占占3個(gè)個(gè)字節(jié)節(jié)MULABXCHA,BADDA,DPHMOVDPH,AXCHA,BJMP@A+DPTR;跳跳至散散轉(zhuǎn)表表中相相應(yīng)的的位置置TAB:LJMPPR0;跳跳至不不同的的分支支LJMPPR1LJMPPRN……4.2.5子子程序序和參參數(shù)傳傳遞一、子子程程序的的概念念通常把這這些基本本操作功功能編制制為程序序段作為為獨(dú)立的的子程序序,以以供不同同程序或或同一程程序反復(fù)復(fù)調(diào)用。。在程序序中需要要執(zhí)行這這種操作作的地方方放置一一條調(diào)用用指令,當(dāng)程程序執(zhí)行行到調(diào)用用指令,就轉(zhuǎn)轉(zhuǎn)到子程程序中完完成規(guī)定定的操作作,并并返回到到原來的的程序繼繼續(xù)執(zhí)執(zhí)行下去去。二、子子程序的的調(diào)用調(diào)用子程程序的指指令有““ACALL””和“LCALL”,執(zhí)行行調(diào)用指指令時(shí),先將將程序地地址指針針PC改改變(““ACALL””加2,““LCALL”加3),然后后PC值壓入入堆棧,用新新的地址址值代替替。執(zhí)行行返回指指令時(shí),再將將PC值彈出出。子程序調(diào)調(diào)用中,主程程序應(yīng)先先把有關(guān)關(guān)的參數(shù)數(shù)存入約約定的位位置,子子程序序在執(zhí)行行時(shí),可可以從從約定的的位置取取得參數(shù)數(shù),當(dāng)當(dāng)子程序序執(zhí)行完完,將將得到的的結(jié)果再再存入約約定的位位置,返返回主主程序后后,主主程序可可以從這這些約定定的位置置上取得得需要的的結(jié)果,這就就是參數(shù)數(shù)的傳遞遞。例12把內(nèi)部RAM某某一單元元中一個(gè)個(gè)字節(jié)的的十六進(jìn)進(jìn)制數(shù)轉(zhuǎn)轉(zhuǎn)換成兩兩位ASCII碼,結(jié)結(jié)果存存放在內(nèi)內(nèi)部RAM的連連續(xù)兩個(gè)個(gè)單元中中。假設(shè)一個(gè)個(gè)字節(jié)的的十六進(jìn)進(jìn)制數(shù)在在內(nèi)部RAM40H單元元,而而結(jié)果存存入50H#,51H單單元,可可以用用堆棧進(jìn)進(jìn)行參數(shù)數(shù)傳遞,程序序如下:MAIN:MOVR1,##50H;R1為為存結(jié)果果的指針針MOVA,40H;A為需需轉(zhuǎn)換的的十六進(jìn)進(jìn)制數(shù)SWAPA;先轉(zhuǎn)轉(zhuǎn)換高位位半字PUSHACC;壓棧棧LCALLHEASC;調(diào)調(diào)用將將低半字字節(jié)的內(nèi)內(nèi)容轉(zhuǎn)換換;成ASCII碼碼子程序序HEASCPOPACCMOV@R1,A;存存高半字字節(jié)轉(zhuǎn)換換結(jié)果INCR1PUSH40HLCALLHEASCPOPACCMOV@R1,A;存存低半字字節(jié)轉(zhuǎn)換換結(jié)果ENDHEASC:MOVR0,SPDECR0DECR0;R0指指向十十六進(jìn)制制數(shù)參數(shù)數(shù)地址XCHA,@R0;取取被轉(zhuǎn)換換參數(shù)ANLA,#0FH;保保留低半半字節(jié)ADDA,#2;修修改A值值MOVCA,@A+PC;查查表XCHA,@R0;結(jié)結(jié)果送送回堆棧棧RETTAB:DB30H,31H,32H,……4.2.6查查表程程序設(shè)計(jì)計(jì)查表程序序是一種種常用程程序,它它廣泛泛使用于于LED顯顯示控制制、打打印機(jī)打打印控制制、數(shù)據(jù)據(jù)補(bǔ)償、、數(shù)值計(jì)計(jì)算、轉(zhuǎn)轉(zhuǎn)換等功功能程序序中,這這類程程序具有有簡(jiǎn)單、、執(zhí)行速速度快等等特點(diǎn)。。所謂查表表法,就就是預(yù)預(yù)先將滿滿足一定定精度要要求的表表示變量量與函數(shù)數(shù)值之間間關(guān)系的的一張表表求出,然后后把這張張表存于于單片機(jī)機(jī)的程序序存儲(chǔ)器器中,這這時(shí)自自變量值值為單元元地址,相應(yīng)應(yīng)的函數(shù)數(shù)值為該該地址單單元中的的內(nèi)容。。查表,就是是根據(jù)變變量X在表表格中查查找對(duì)應(yīng)應(yīng)的函數(shù)數(shù)值Y,使使Y=f(X)。MCS-51指令令系統(tǒng)中中,有有兩條查查表指令令:MOVCA,@A+PCMOVCA,@A+DPTR例13一個(gè)十六六進(jìn)制數(shù)數(shù)存放在在內(nèi)部RAM的HEX單元元的低4位位中,將將其轉(zhuǎn)轉(zhuǎn)換成ASCII碼并并送回HEX單元。。十六進(jìn)制制0~9的ASCII碼為30H~~39H,A~~F的ASCII碼為為41H~46H,ASCII碼碼表格的的首地址址為ASCTAB。編編程如下下:ORG1000HHEXASC:MOVA,HEXANLA,#0FHADDA,#3;修修改指指針MOVCA,@A+PCMOVHEX,ARETASCTAB:DB30H,31H,32H,33H,34HDB35H,36H,37H,38H,39HDB41H,42H,43H,44H,45HDB46H在這個(gè)程程序中,查表表指令MOVCA,@A+PC到表表格首地地址有兩兩條指令令,占占用3個(gè)字字節(jié)地址址空間,故修修改指針針應(yīng)加3。例14設(shè)有有一一個(gè)個(gè)巡巡回回檢檢測(cè)測(cè)報(bào)報(bào)警警裝裝置置,需需對(duì)對(duì)96路路輸輸入入進(jìn)進(jìn)行行控控制制,每每路路有有一一個(gè)個(gè)額額定定的的最最大大值值,是是雙雙字字節(jié)節(jié)數(shù)數(shù)。。當(dāng)當(dāng)檢檢測(cè)測(cè)量量大大于于該該路路對(duì)對(duì)應(yīng)應(yīng)的的最最大大值值時(shí)時(shí),就就越越限限報(bào)報(bào)警警。。假假設(shè)設(shè)R2為為保保存存檢檢測(cè)測(cè)路路數(shù)數(shù)的的寄寄存存器器,其其對(duì)對(duì)應(yīng)應(yīng)的的最最大大額額定定值值存存放放于于31H和和32H單單元元中中。。查查找找最最大大額額定定值值的的程程序序如如下下:FMAX:MOVA,R2ADDA,R2;表表中中一一個(gè)個(gè)額額定定值值為為2個(gè)個(gè)字字節(jié)節(jié)MOV31H,AMOVDPTR,##TAB;表表首首址址MOVCA,@A+DPTR;查查表表讀讀取取第第一一個(gè)個(gè)字字節(jié)節(jié)XCHA,31H;第第一一個(gè)個(gè)字字節(jié)節(jié)內(nèi)內(nèi)容容存存入入31HINCDPTRMOVCA,@A+DPTR;查查表表讀讀取取第第二二個(gè)個(gè)字字節(jié)節(jié)MOV32H,A;第第二二字字節(jié)節(jié)的的內(nèi)內(nèi)容容存存入入32HTAB:DW1230H,1450H,...DW2230H,2440H,...DW3120H,3300H,...例15在一個(gè)個(gè)溫度度檢測(cè)測(cè)系統(tǒng)統(tǒng)中,溫溫度模模擬信信號(hào)由由10位位A/D輸入入。將將A/D結(jié)結(jié)果轉(zhuǎn)轉(zhuǎn)換為為對(duì)應(yīng)應(yīng)溫度度值,可可采用用查表表方法法實(shí)現(xiàn)現(xiàn)。先先由由實(shí)驗(yàn)驗(yàn)測(cè)試試出整整個(gè)溫溫度量量程范范圍內(nèi)內(nèi)的A/D轉(zhuǎn)換換結(jié)果果,把把A/D轉(zhuǎn)換換結(jié)果果000H~3FFH所所對(duì)應(yīng)應(yīng)的溫溫度值值組織織為一一個(gè)表表存儲(chǔ)儲(chǔ)在程程序存存儲(chǔ)器器中,那那么就就可以以根據(jù)據(jù)檢測(cè)測(cè)到的的模擬擬量的的A/D轉(zhuǎn)換換值查查找出出相應(yīng)應(yīng)的溫溫度值值。設(shè)測(cè)得得的A/D轉(zhuǎn)換換結(jié)果果已存存入20H,21H單元元中((高位位字節(jié)節(jié)在20H中,低低位字字節(jié)在在21H中中),查查表得得到的的溫度度值存存放在在22H,23H單單元((高位位字節(jié)節(jié)在22H中中,低低位位字節(jié)節(jié)在23H中))。程序如如下:FTMP:MOVDPTR,##TAB;DPTR←←表首首地址址MOVA,21H;((20H))(21H)××2CLRCRLCAMOV21H,AMOVA,20HRLCAMOV20H,AMOVA,21H;表表首地址址+偏移移量ADDCA,DPLMOVDPL,AMOVA,20HADDCA,DPHMOVDPH,ACLRAMOVCA,@A+DPTR;查查表得溫溫度值高高位字節(jié)節(jié)MOV22H,ACLRAINCDPTRMOVCA,@A+DPTR;查查表得溫溫度值低低位字節(jié)節(jié)MOV23H,ARETTAB:DW……4.2.7數(shù)數(shù)制轉(zhuǎn)換換例16將一個(gè)字字節(jié)二進(jìn)進(jìn)制數(shù)轉(zhuǎn)轉(zhuǎn)換成3位位BCD碼。設(shè)一個(gè)字字節(jié)二進(jìn)進(jìn)制數(shù)在在內(nèi)部RAM40H單元,轉(zhuǎn)換換結(jié)果放放入內(nèi)部部RAM50H,51H,52H單元中中(高位位在前)),程程序如下下:HEXBCD:MOVA,40HMOVB,##100DIVABMOV50H,AMOVA,##10XCHA,BDIVABMOV51H,AMOV52H,BRET例17設(shè)4位位BCD碼依依次存放放在內(nèi)存存RAM中中40H~43H單單元的低低4位位,高高4位位都為為0,要要求將其其轉(zhuǎn)換為為二進(jìn)制制數(shù),結(jié)結(jié)果存存入R2R3中。。一個(gè)十進(jìn)進(jìn)制數(shù)可可表示為為:Dn×10n+Dn-1×10n-1+…+D0×100=(…(((Dn×10+Dn-1)×10+Dn-2)×10+…))+D0當(dāng)n=3時(shí),上上式可可表示為為:((D3×10+D2)×10+D1)×10+D0BCDHEX:MOVR0,##40H;R0指指向最高高位地址址MOVR1,##03;計(jì)計(jì)數(shù)數(shù)值送送R1MOVR2,##0;存存放放結(jié)果果的高高位清清零MOVA,@R0MOVR3,ALOOP:MOVA,R3MOVB,##10MULABMOVR3,A;(R3)×10的的低低8位位送R3MOVA,BXCHA,R2;(R3)×10的的高8位位暫暫存R2MOVB,##10MULABADDA,R2MOVR2,A;R2×10+(R3×10))高8位位送送R2INCR0;取取下下一個(gè)個(gè)BCD數(shù)數(shù)MOVA,R3ADDA,@R0MOVR3,AMOVA,R2ADDCA,##0;加加低字字節(jié)來來的進(jìn)進(jìn)位MOVR2,ADJNZR1,LOOPRET4.2.8運(yùn)運(yùn)算算程序序一、加加、、減減法程程序例18將40H開開始存存放的的10個(gè)個(gè)字字節(jié)的的數(shù)與與50H開開始存存放的的10個(gè)個(gè)字節(jié)節(jié)的數(shù)數(shù)相減減(假假設(shè)被被減數(shù)數(shù)大于于減數(shù)數(shù))。。設(shè)被減減數(shù)指指針為為R0,減減數(shù)指指針為為R1,差差數(shù)放放回被被減數(shù)數(shù)單元元,R5存存放字字節(jié)個(gè)個(gè)數(shù),則則程序序如下下:SUB:MOVR0,##40HMOVR1,##50HMOVR5,##10CLRCSUB1:MOVA,@R0SUBBA,@R1MOV@R0,AINCR0INCR1DJNZR5,SUB1RET二、乘乘法法運(yùn)算算程序序在計(jì)算算機(jī)中中,常常將將乘法法采用用移位位和加加法來來實(shí)現(xiàn)現(xiàn)。例19將(R2R3))和((R6R7)中中雙字字節(jié)無無符號(hào)號(hào)數(shù)相相乘,結(jié)結(jié)果存存入R4R5R6R7。此乘法法可以以采用用部分分積右右移的的方法法來實(shí)實(shí)現(xiàn),其其程序序框圖圖如圖圖4.6所所示示,程程序序如下下:NMUL:MOVR4,##0;初初始化化MOVR5,##0CLRCMOVR0,##16NMUL1:MOVA,R4;CyR4R5R6R7右右移一一位RRCAMOVR4,AMOVA,R5RRCAMOVR5,AMOVA,R6RRCAMOVR6,AMOVA,R7RRCMOVR7,AJNCNMUL2;C為為移出乘數(shù)數(shù)的最低位位MOVA,R5;(R4R5)+(R6F7)→((R4R5)ADDA,R3MOVR5,AMOVA,R4ADDCA,R2MOVR4,ANMUL2:DJNZR0,NMUL1;循循環(huán)16位MOVA,R4;最后后結(jié)果再移移一位RRCAMOVR4,AMOVA,R5RRCAMOVR5,AMOVA,R6RRCAMOVR6,AMOVA,R7RRCAMOVR7,ARET圖4.6NMUL程序框圖圖例20假定被乘數(shù)數(shù)在(R4R3)中中,乘數(shù)數(shù)放在R2中,乘乘積放在R7R6和和R5中。。MCS-51中中有8位數(shù)的的乘法指令令MUL,用它來來實(shí)現(xiàn)多字字節(jié)乘法時(shí)時(shí),可表表示為(R4R3)×(R2)=[(R4)×28+(R3))]×(R2)=(R4))×(R2)×28+(R3))×(R2)其中(R4)×(R2)和((R3)××(R2))都是可直直接用MUL指令來來實(shí)現(xiàn),而而乘以28意味著左移移8位位。由此可可編寫如下下程序:NMUL1:MOVA,R2MOVB,R3MULAB;((R3))×(R2)MOVR5,A;積積的低位位送R5MOVR6,B;積積的高位位送R6MOVA,R2MOVB,R4MULAB;(R4)×((R2)ADDA,R6;((R3))×(R2)的高位位加(R4)×(R2)的低低位MOVA,BADDCA,#00H;(R4)×((R2)的的高位加CyMOVR7,A;結(jié)結(jié)果果送送R7RET三、、除除法法運(yùn)運(yùn)算算程程序序除法法是是乘乘法法的的逆逆運(yùn)運(yùn)算算,用用移移位位、、相相減減的的方方法法來來完完成成。。首首先先比比較較被被除除數(shù)數(shù)的的高高位位字字與與除除數(shù)數(shù),如如被被除除數(shù)數(shù)高高位位大大于于除除數(shù)數(shù),則

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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)論