




已閱讀5頁(yè),還剩60頁(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章 mcs-51匯編語(yǔ)言程序設(shè)計(jì),4.1 匯編語(yǔ)言程序設(shè)計(jì)概述 4.1.1 機(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)語(yǔ)言 用于程序設(shè)計(jì)的語(yǔ)言基本上分為3種:機(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)語(yǔ)言。 1.機(jī)器語(yǔ)言 二進(jìn)制代碼表示的指令、數(shù)字和符號(hào)簡(jiǎn)稱為機(jī)器語(yǔ)言 不易懂,難記憶,易出錯(cuò)。,2匯編語(yǔ)言 英文助記符表示的指令稱為符號(hào)語(yǔ)言或匯編語(yǔ)言 匯編語(yǔ)言特點(diǎn): 面向機(jī)器的語(yǔ)言,程序設(shè)計(jì)員須對(duì)mcs-51的硬件有相當(dāng)深入的了解。 助記符指令和機(jī)器指令一一對(duì)應(yīng),用匯編語(yǔ)言編寫(xiě)的程序效率高,占用存儲(chǔ)空間小,運(yùn)行速度快,用匯編語(yǔ)言能編寫(xiě)出最優(yōu)化的程序。,能直接管理和控制硬件設(shè)備(功能部件),它能處理中斷,也能直接訪問(wèn)存儲(chǔ)器及i/o接口電路。 匯編語(yǔ)言和機(jī)器語(yǔ)言都脫離不開(kāi)具體機(jī)器的硬件,均是面向“機(jī)器”的語(yǔ)言,缺乏通用性。 3高級(jí)語(yǔ)言 不受具體機(jī)器的限制,使用了許多數(shù)學(xué)公式和數(shù)學(xué)計(jì)算上的習(xí)慣用語(yǔ),非常擅長(zhǎng)于科學(xué)計(jì)算。常用的如basic、fortran以及c語(yǔ)言等。 高級(jí)語(yǔ)言優(yōu)點(diǎn):通用性強(qiáng),直觀、易懂、易學(xué),可讀性好。 使用c語(yǔ)言(c51)、pl/m語(yǔ)言來(lái)進(jìn)行mcs-51的應(yīng)用程序設(shè)計(jì)。 對(duì)于程序的空間和時(shí)間要求很高的場(chǎng)合,匯編語(yǔ)言仍是必不可缺的。,c語(yǔ)言和匯編語(yǔ)言混合編程 在很多需要直接控制硬件的應(yīng)用場(chǎng)合,則更是非用匯編語(yǔ)言不可 使用匯編語(yǔ)言編程,是單片機(jī)程序設(shè)計(jì)的基本功之一 4.1.2 匯編語(yǔ)言語(yǔ)句的種類和格式 兩種基本類型:指令語(yǔ)句和偽指令語(yǔ)句 (1)指令語(yǔ)句 已在第3章介紹 每一條指令語(yǔ)句在匯編時(shí)都產(chǎn)生一個(gè)指令代碼機(jī)器代碼 (2)偽指令語(yǔ)句 是為匯編服務(wù)的。在匯編時(shí)沒(méi)有機(jī)器代碼與之對(duì)應(yīng)。,mcs-51的匯編語(yǔ)言的四分段格式如下: 標(biāo)號(hào)字段 操作碼字段 操作數(shù)字段 注釋字段 例4-1 下面是一段匯編語(yǔ)言程序的四分段書(shū)寫(xiě)格式 基本語(yǔ)法規(guī)則: 1標(biāo)號(hào)字段 是語(yǔ)句所在地址的標(biāo)志符號(hào) 標(biāo)號(hào)字段 操作碼字段 操作數(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)容減1不 為零,則循環(huán) nop here: sjmp here,2美元符號(hào)$的使用 用于表示該轉(zhuǎn)移指令操作碼所在的地址。例如,如下指令: jnb f0, $ 與如下指令是等價(jià)的: here:jnb f0,here 再如: here:sjmp here 可寫(xiě)為: sjmp $,4.2 匯編語(yǔ)言源程序的匯編 匯編語(yǔ)言源程序 “翻譯”成機(jī)器代碼(指令代碼)的過(guò)程稱為“匯編”。匯編可分為手工匯編和機(jī)器匯編兩類: 4.2.1 手工匯編 人工查表翻譯指令。但遇到的相對(duì)轉(zhuǎn)移指令的偏移量的計(jì)算,要根據(jù)轉(zhuǎn)移的目標(biāo)地址計(jì)算偏移量,不但麻煩,且容易出錯(cuò)。 4.2.2 機(jī)器匯編 用編輯軟件進(jìn)行源程序的編輯。編輯完成后,生成一個(gè)ascii碼文件,擴(kuò)展名為“.asm”。然后在微計(jì)算機(jī)上運(yùn)行匯編程序,把匯編語(yǔ)言源程序翻譯成機(jī)器代碼。,4.3 匯編語(yǔ)言實(shí)用程序設(shè)計(jì) 4.3.3 查表程序設(shè)計(jì) 數(shù)據(jù)補(bǔ)償、修正、計(jì)算、轉(zhuǎn)換等各種功能,具有程序簡(jiǎn)單、執(zhí)行速度快等優(yōu)點(diǎn)。 查表就是根據(jù)自變量x,在表格中尋找y,使y=f(x)。 執(zhí)行查表指令時(shí),發(fā)出讀程序存儲(chǔ)器選通脈沖/psen。在mcs-51的指令系統(tǒng)中,給用戶提供了兩條極為有用的查表指令: movc a,a+dptr movc a,a+pc 指令“movc a,a+dptr”完成把a(bǔ)中的內(nèi)容作為一個(gè)無(wú)符號(hào)數(shù)與dptr中的內(nèi)容相加,所得結(jié)果為某一程序,。 指令執(zhí)行完,pc的內(nèi)容不發(fā)生變化,仍指向查表指令的下一條指令。 優(yōu)點(diǎn)在于預(yù)處理較少且不影響其它特殊功能寄存器的值,所以不必保護(hù)其它特殊功能寄存器的原先值。 缺點(diǎn)在于該表格只能存放在這條指令的地址x3x2x1x0以下的00ffh之中。表格所在的程序空間受到了限制。,例4-1 子程序的功能為:根據(jù)累加器a中的數(shù)x(09之間)查x的平方表y,根據(jù)x的值查出相應(yīng)的平方y(tǒng)。x和y均為單字節(jié)數(shù)。 地 址 子程序 y3y2y1y0 add a,#01h y3y2y1y0+2 movc a,a+pc y3y2y1y0+3 ret y3y2y1y0+4 db 00h,01h,04h,09h,10h db 19h,24h,31h,40h,51h 第1條指令 add a,#01h 的作用是加上偏移量,可以根據(jù)a的內(nèi)容查出x對(duì)應(yīng)的平方。,movc a,a+dptr 這條指令的應(yīng)用范圍較為廣泛,一般情況下,大多使用該指令,使用該指令時(shí)不必計(jì)算偏移量,使用該指令的優(yōu)點(diǎn)是表格可以設(shè)在64k程序存儲(chǔ)器空間內(nèi)的任何地方,而不像 movc a,a+pc那樣只設(shè)在pc下面的256個(gè)單元中,使用較方便。 上面的程序可改成如下形式:,push dph ;保存dph push dpl ;保存dpl mov dptr,#tab1 movc a,a+dptr pop dpl ;恢復(fù)dpl pop dph ;恢復(fù)dph ret tab1: db 00h,01h,04h,09h,10h db 19h,24h,31h,40h,51h 例4-2 在一個(gè)以mcs-51為核心的溫度控制器中,溫度傳感器輸出的電壓與溫度為非線性關(guān)系,傳感器輸出的電壓已由a/d轉(zhuǎn)換為10位二進(jìn)制數(shù)。根據(jù)測(cè)得的不同溫度下的電壓值數(shù)據(jù)構(gòu)成一個(gè)表,表中放溫度,值y,x為電壓值數(shù)據(jù)。設(shè)測(cè)得的電壓值x放入r2r3中,根據(jù)電壓值x,查找對(duì)應(yīng)的溫度值y,仍放入r2r3中。本例的x和y均為雙字節(jié)無(wú)符號(hào)數(shù)。程序如下: ltb2:mov dptr,#tab2 mov a,r3 clr c rlc a mov r3,a xch a,r2 rlc a xch r2,a add a,dpl ;(r2r3)+(dptr) (dptr),mov dpl,a mov a,dph addc a,r2 mov dph,a clr a movc a,a+dptr ;查第一字節(jié) mov r2,a ;第一字節(jié)存入r2中 clr a inc dptr movc a,a+dptr ;查第二字節(jié) mov r3,a ;第二字節(jié)存入r3中 ret tab2:dw ;溫度值表,例4-3 設(shè)有一個(gè)巡回檢測(cè)報(bào)警裝置,需對(duì)16路輸入進(jìn)行檢測(cè),每路有一最大允許值,為雙字節(jié)數(shù)。運(yùn)行時(shí),需根據(jù)測(cè)量的路數(shù),找出每路的最大允許值??摧斎胫凳欠翊笥谧畲笤试S值,如大于就報(bào)警。根據(jù)上述要求,編一個(gè)查表程序。 取路數(shù)為x(0x15),y為最大允許值,放在表格中。設(shè)進(jìn)入查表程序前,路數(shù)x已放于r2中,查表后最大值y放于r3r4中。本例中的x為單字節(jié)數(shù),y為雙字節(jié)數(shù)。查表程序如下: tb3: mov a,r2 add a,r2 ;(r2)*2(a) mov r3,a ;保存指針 add a,#6 ;加偏移量,movc a,a+pc ;查第一字節(jié) xch a,r3 add a,#3 movc a,a+pc ;查第二字節(jié) mov r4,a ret tab3: dw 1520,3721,42645,7580 ;最大值 ;表 dw 3483,32657,883,9943 dw 10000,40511,6758,8931 dw 4468,5871,13284,27808,表格長(zhǎng)度不能超過(guò)256個(gè)字節(jié),且表格只能存放于movc a,a+pc指令以下的256個(gè)單元中。 查表指令(movc a,a+pc 、 movc a,a+dptr)的區(qū)別 1)movc a,a+pc表格長(zhǎng)度不能超過(guò)256個(gè)字節(jié),且表格只能存放于movc a,a+pc指令以下的256個(gè)單元中。 movc a,a+dptr表格可以設(shè)在64k程序存儲(chǔ)器空間內(nèi)的任何地方 2) movc a,a+pc pc是執(zhí)行完本條指令后,指向下一條指令的 地址,需加上偏移量 movc a,a+dptr 不需要加偏移量。,3)根據(jù)表中指令的字節(jié)數(shù)不同,a分別乘以1、2或3,從表中取指令時(shí),也要分1、2或3次進(jìn)行。,單字節(jié)指令 a=a1,雙字節(jié)指令 a=a2,基址+0,基址+1,基址+2,(a)=0對(duì)應(yīng)的一條指令,(a)=1對(duì)應(yīng)的一條指令,三字節(jié)指令 a=a3,基址+3,基址+4,基址+5,4.3.5 數(shù)據(jù)極值查找程序設(shè)計(jì) 在指定的數(shù)據(jù)區(qū)中找出最大值(或最小值)。 進(jìn)行數(shù)值大小的比較,從這批數(shù)據(jù)中找出最大值(或最小值)并存于某一單元中。 例4-9 已知內(nèi)部ram addr為起始的數(shù)據(jù)塊內(nèi)數(shù)據(jù)是無(wú)符號(hào)數(shù),塊長(zhǎng)在len單元內(nèi),找出數(shù)據(jù)塊中最大值并存入max單元。 程序如下:,org 2000h len data 20h max data 22h mov max,#00h ; max單元清零 mov r0,#addr ; addr送r0 loop: mov a,r0 ; 數(shù)塊中某數(shù)送a cjne a,max,next1 ; a和(max)比較 next1: jc next ;若a(max),則next mov max,a ;若a(max),則大數(shù)送max next: inc r0 ;修改數(shù)據(jù)塊指針0 djnz len,loop ;若未完,則轉(zhuǎn)loop here: sjmp here end,4.3.6 數(shù)據(jù)排序程序設(shè)計(jì) 升序排,降序排。僅介紹無(wú)符號(hào)數(shù)據(jù)升序排。 冒泡法:相鄰數(shù)互換的排序方法,類似水中氣泡上浮 。排序時(shí)從前向后進(jìn)行相鄰兩個(gè)數(shù)的比較,次序與要求的順序不符時(shí),就將兩個(gè)數(shù)互換;順序符合要求不互換。 假設(shè)有7個(gè)原始數(shù)據(jù)的排列順序?yàn)椋?、4、1、2、5、7、3。第一次冒泡的過(guò)程是: 6、4、1、2、5、7、3 ;原始數(shù)據(jù)的排列 4、6、1、2、5、7、3 ;逆序,互換 4、1、6、2、5、7、3 ;逆序,互換 4、1、2、6、5、7、3 ;逆序,互換 4、1、2、5、6、7、3 ;逆序,互換,4、1、2、5、6、7、3 ;正序,不互換 4、1、2、5、6、3、7 ;逆序,互換,第一次冒 泡結(jié)束 如此進(jìn)行,各次冒泡的結(jié)果如下: 第1次冒泡結(jié)果:4、1、2、5、6、3、7 第2次冒泡結(jié)果:1、2、4、5、3、6、7 第3次冒泡結(jié)果:1、2、4、3、5、6、7 第4次冒泡結(jié)果:1、2、3、4、5、6、7 ;已完成排序 第5次冒泡結(jié)果:1、2、3、4、5、6、7 第6次冒泡結(jié)果:1、2、3、4、5、6、7 對(duì)于n個(gè)數(shù),理論上應(yīng)進(jìn)行(n-1)次冒泡,有時(shí)不到(n-1)次就已完成排序 。,如何判定排序是否已完成,看各次冒泡中是否有互換發(fā)生,如果有數(shù)據(jù)互換,則排序還沒(méi)完成。 在程序設(shè)計(jì)中,常使用設(shè)置互換標(biāo)志的方法,該標(biāo)志的狀態(tài)表示在一次冒泡中是否有互換進(jìn)行。 例4-10 假設(shè)8個(gè)數(shù)連續(xù)存放在20h為首地址的內(nèi)部ram單元中,使冒泡法進(jìn)行升序排序編程。設(shè)r7為比較次數(shù)計(jì)數(shù)器,初值為07h。tr0為冒泡過(guò)程中是否有數(shù)據(jù)互換的狀態(tài)標(biāo)志,tr0=0表示無(wú)互換發(fā)生,tr=1表明有互換發(fā)生。按前述冒泡序算法,程序如下:,sort: mov r0,#20h ;數(shù)據(jù)存儲(chǔ)區(qū)首單元地址 mov r7,#07h ;各次冒泡比較次數(shù) clr tr0 ;互換標(biāo)志清“0” loop: mov a,r0 ;取前數(shù) mov 2bh,a ;存前數(shù) inc r0 mov 2ah,r0 ;取后數(shù) clr c subb a,r0 ;前數(shù)減后數(shù) jc next ;前數(shù)小于后數(shù),不互換 mov r0, 2bh dec r0 mov r0,2ah ;兩個(gè)數(shù)交換位置 inc r0 ;準(zhǔn)備下一次比較 setb tr0 ;置互換標(biāo)志 next: djnz r7,loop ;返回,進(jìn)行下一次比較 jb tr0,sort ;返回,進(jìn)行下一次冒泡 here: sjmp here ;排序結(jié)束,4.3.7 散轉(zhuǎn)移程序設(shè)計(jì) 一、使用轉(zhuǎn)移指令的散轉(zhuǎn)程序 jmp a+dptr 需根據(jù)某一單元的內(nèi)容是0,1,n,來(lái)分別轉(zhuǎn)向處理程序0,處理程序1,處理程序n。 一個(gè)典型的例子就是當(dāng)單片機(jī)系統(tǒng)中的鍵盤(pán)按下時(shí),就會(huì)得到一個(gè)鍵值,根據(jù)不同的鍵值,跳向不同的鍵處理程序入口。 對(duì)于這種情況,可用直接轉(zhuǎn)移指令(ljmp或ajmp指令)組成一個(gè)轉(zhuǎn)移表,利用間接轉(zhuǎn)移指令實(shí)現(xiàn)分支轉(zhuǎn)移,例4-12 根據(jù)寄存器r2的內(nèi)容,轉(zhuǎn)向各個(gè)處理程序prgx(x=0n)。 (r2)=0,轉(zhuǎn)prg0 (r2)=1,轉(zhuǎn)prg1 (r2)=n, 轉(zhuǎn)prgn,jmp1: mov dptr,#tbj1 mov a,r2 add a,r2 ; (r2)*2 (a) jnc nadd inc dph ; (r2)*2 256 nadd: jmp a+dptr tbj1: ajmp prg0 ajmp prg1 ajmp prgn,二、使用地址偏移量的散轉(zhuǎn)程序 例 按r2的內(nèi)容轉(zhuǎn)向6個(gè)處理程序 jmp3: mov a,r2 mov dptr,#tbj3 movc a,a+dptr ;從表中讀取變址 jmp a+dptr tbj3:db prg0-tbj3 db prg1-tbj3 . db prg5-tbj3 prg0:處理程序0 prg1:處理程序1 prg2:處理程序2 prg3:處理程序3 prg4:處理程序4 prg5:處理程序5,4.3.8 循環(huán)程序設(shè)計(jì) 計(jì)數(shù)循環(huán)結(jié)構(gòu) djnz rn,rel;工作寄存器作控制計(jì)數(shù)器 1、單循環(huán)定時(shí)程序 例 mov r5,#time loop:nop 1t nop 1t djnz r5,loop 2t 循環(huán)體為4t,若晶振為6mhz,則t=12/fosc=2s 一次循環(huán)延遲時(shí)間:4*t=8s 程序的延遲時(shí)間:8*time(s) 該程序最大延遲時(shí)間:256*8=2048 (s),2,多重循環(huán)定時(shí) 例4-16 50ms延時(shí)程序。 延時(shí)程序與mcs-51指令執(zhí)行時(shí)間有很大的關(guān)系。在使用12mhz晶振時(shí),一個(gè)機(jī)器周期為1s,執(zhí)行一條djnz指令的時(shí)間為2s。這時(shí),可用雙重循環(huán)方法寫(xiě)出下面如下的延時(shí)50ms的程序: del: mov r7,#200 del1: mov r6,#125 del2: djnz r6,del2 ;125*2=250s djnz r7,del1 ;0.25ms*200=50ms ret,以上延時(shí)程序不太精確,它沒(méi)有考慮到除“djnz r6,del2 ”指令外的其它指令的執(zhí)行時(shí)間,如把其它指令的執(zhí)行時(shí)間計(jì)算在內(nèi),它的延時(shí)時(shí)間為: del: mov r7,#200 1t del1: mov r6,#125 1t del2: djnz r6,del2 ;125*2=250s 2t djnz r7,del1 2t (250+1+2)*200+1=50.301ms 如果要求比較精確的延時(shí),可按如下修改: del: mov r7,#200 1t del1: mov r6,#123 1t nop 1t del2: djnz r6,del2 ; 123*2t djnz r7,del1 ; (1+1+123*2+2)*200+1=50001t=500001s=50.001ms 實(shí)際延遲時(shí)間為50.001ms,注意。軟件延時(shí)程序,不允許有中斷,否則將嚴(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ī)器周期t=12/fosc=2s 定時(shí)時(shí)間為:5*2*time(s) 假設(shè)定時(shí)時(shí)間要求為24s,可以調(diào)整循環(huán)體的機(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*2=24s,4.3.8 定點(diǎn)數(shù)運(yùn)算程序設(shè)計(jì),1、定點(diǎn)數(shù)的表示法 1)原碼:符號(hào)位=0 正數(shù) 符號(hào)位=1 負(fù)數(shù) 加減運(yùn)算時(shí),必須按符號(hào)位的不同執(zhí)行不同的運(yùn)算。 正數(shù):n補(bǔ)=n原 2)補(bǔ)碼: n補(bǔ)=數(shù)值位取反+1 負(fù)數(shù): =2n-數(shù)值 n是整數(shù)的位數(shù) 補(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 a, #1 mov r5,a mov a,r4 cpl a addc a,#0 mov r4, a ret,2.帶符號(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),mov a, r3 clr c ; 保證讓左移移入0 rlc a mov r3,a mov a,r2 rlc a mov a.7,c ;恢復(fù)符號(hào)位 mov r2, a,r2,r3,c,0,符號(hào)位不變,例 雙字節(jié)原碼右移一位子程序 (r2r3)右移一位( r2r3) 0 mov a,r2 mov c,a.7 ;保護(hù)符號(hào)位 clr a.7 ;移入0 rrc a mov r2,a mov a,r3 rrc a mov r3,a,r2,r3,c,c,符號(hào)位不變,a(r2),c,符號(hào)位,0,例 雙字節(jié)補(bǔ)碼右移一位子程序 功能(r2r3)右移一位(r2r3) mov a, r2 mov c, a.7 ;保護(hù)符號(hào)位 rrc a ;移入符號(hào)位 mov r2, a mov a, r3 rrc a mov r3,a,r2,r3,c,符號(hào)位不變,1,c,a(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)行加減運(yùn)算。 例 雙字節(jié)補(bǔ)碼加法子程序 (r2r3)+(r6r7) (r4r5),mov a ,r3 add a, r7 mov r5, a mov a, r2 addc a ,r6 mov r4,a,四、定點(diǎn)數(shù)乘法運(yùn)算 1)無(wú)符號(hào)數(shù)二進(jìn)制乘法 a=1011 b=1001 1011 1001 1011 0000 0000 + 1011 1100011 乘積a*b,乘數(shù)左移與部分積相加部分積右移+被乘數(shù)。,算法: 從低位開(kāi)始檢查各個(gè)乘數(shù)的位數(shù)(乘數(shù)右移) 若乘數(shù)位數(shù)為1,部分積右移+被乘數(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,例 無(wú)符號(hào)雙字節(jié)快速乘法 (r2r3)*(r6r7)(r4r5r6r7) mov a, r3 mov b, r7 mul ab ; r3r7 ba xch a, r7 r7= r3r7l mov r5,b ; b=r5= r3r7h mov b,r2 mul ab r2r7 ba add a,r5 a=r2r7l+r3r7h mov r4,a r4=r2r7l+r3r7h clr a addc a,b mov r5,a ; (r5)=r2r7h ,4.3.9 碼制轉(zhuǎn)換程序設(shè)計(jì) 在單片機(jī)應(yīng)用程序的設(shè)計(jì)中,經(jīng)常涉及到各種碼制的轉(zhuǎn)換問(wèn)題。在單片機(jī)系統(tǒng)內(nèi)部經(jīng)常采用二進(jìn)制碼。在輸入/輸出中,按照人的習(xí)慣均采用代表十進(jìn)制數(shù)的bcd碼表示。此外,打印機(jī)要打印某數(shù)字字符,則需要將該數(shù)字的二進(jìn)制碼轉(zhuǎn)換為該字符的ascii碼。 轉(zhuǎn)換類型包括:二進(jìn)制碼與ascii碼之間的轉(zhuǎn)換 二進(jìn)制與bcd碼之間的轉(zhuǎn)換 一、二進(jìn)制碼與ascii碼之間的轉(zhuǎn)換 由ascii碼字符表可知,09的ascii碼為30h39h,af的ascii碼為41h46h,例 r0的低4位是一個(gè)二進(jìn)制數(shù),表示(0f) ,把它數(shù)碼轉(zhuǎn)換為ascii代碼并存入r0 說(shuō)明:二進(jìn)制+30h=其ascii代碼 二進(jìn)制 9; 二進(jìn)制+40h=其ascii代碼 二進(jìn)制 9;,三種方法: 1)若r0 9 r0+30hr0; 若r0 9 r0+37hr0,2 )利用daa指令,3)查表,方法一:,org 0400h mov a,r0 ;取轉(zhuǎn)換值送a anl a,#0fh ;屏蔽高四位 add a,#90h ;a中內(nèi)容+90h da a ; 十進(jìn)制調(diào)整 addc a,#40h ;a中內(nèi)容+40h da a ; 十進(jìn)制調(diào)整 mov r0,a ;存轉(zhuǎn)換結(jié)果 sjmp $ ;結(jié)束 end,方法二:利用da a指令,方法三 :查表 org 0400h mov 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)換成ascii 高四位轉(zhuǎn)換成ascii,循環(huán)體完成一個(gè)字節(jié)十六進(jìn)制數(shù)的轉(zhuǎn)換,字節(jié)-1不為0轉(zhuǎn)移,結(jié)束,例 多位十六進(jìn)制數(shù)轉(zhuǎn)換為ascii碼 入口: (r0)=十六進(jìn)制數(shù)低位地址指針 (r2)=字節(jié)數(shù) 出口: (r1)=ascii碼地址指針,二、二進(jìn)制碼到bcd碼的轉(zhuǎn)換 二進(jìn)制,1111001b=121d,bcd碼(一個(gè)字節(jié)表示一個(gè)bcd碼),00000001,00000010,1,2,00000001,1,壓縮bcd碼(一個(gè)字節(jié)表示2個(gè)bcd碼),方法一:通過(guò)除以1000、100、10等10的次冪,獲得千、百、十位數(shù),例 8位二進(jìn)制數(shù)轉(zhuǎn)換成bcd數(shù) (a)為二進(jìn)制數(shù),r0為十位數(shù)和個(gè)位數(shù)地址指針(壓縮的bcd碼) mov b,#100 div ab ;(a)=百位數(shù) mov r0,a ; 存入ram inc r0; mov a, #10 xch a, b div 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é)除法運(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)換為bcd數(shù) 入口:(r2r3)為雙字節(jié)16位二進(jìn)制數(shù) 出口:(r4r5r6為轉(zhuǎn)換完的壓縮bcd碼) y=a727+a626+a525+a0 =(a72)+a6) 2+a5 ) 2) 2 +a0 (每次相加時(shí)進(jìn)行bcd碼調(diào)整) 計(jì)算結(jié)果2+ r2r3的次高位計(jì)算結(jié)果,r2r3,c,二進(jìn)制位數(shù)-1=0?,結(jié)束,r4r5r6清零,n,y,y=a727+a626+a525+ a0 =(a72)+a6) 2+a5 ) 2) 2 +a0,da a 調(diào)整,例 雙字節(jié)二進(jìn)制數(shù)轉(zhuǎn)換為bcd數(shù) 入口:(r2r3)為雙字節(jié)16位二進(jìn)制數(shù) 出口:(r4r5r6為轉(zhuǎn)換完的壓縮bcd碼),r2r3,c,loop:
溫馨提示
- 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國(guó)數(shù)顯恒溫水浴鍋市場(chǎng)調(diào)查研究報(bào)告
- 2025至2031年中國(guó)硒酸酯多糖行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年中國(guó)天然食用色素行業(yè)市場(chǎng)運(yùn)行格局及投資前景預(yù)測(cè)分析報(bào)告
- 2025-2030年中國(guó)CRT電視市場(chǎng)深度調(diào)查與投資前景咨詢報(bào)告
- 2025-2030年中國(guó)DCS控制系統(tǒng)場(chǎng)需求狀況調(diào)研及投資前景預(yù)測(cè)研究報(bào)告
- 2025至2031年中國(guó)電工級(jí)結(jié)晶型硅微粉行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025-2030年中國(guó)1,3二氧五環(huán)行業(yè)運(yùn)營(yíng)狀況與發(fā)展趨勢(shì)研究報(bào)告
- 如何教育孩子的心得體會(huì)
- 煙臺(tái)科技學(xué)院《食品摻偽檢驗(yàn)技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 新質(zhì)生產(chǎn)力摘要
- 中國(guó)房地產(chǎn)指數(shù)系統(tǒng)百城價(jià)格指數(shù)報(bào)告(2022年6月)
- 寧波市建設(shè)工程資料統(tǒng)一用表(2022版)1 通用分冊(cè)
- 口腔科診斷證明書(shū)模板
- 10kV高壓開(kāi)關(guān)柜整定計(jì)算書(shū)
- 禮贊白衣天使512國(guó)際護(hù)士節(jié)護(hù)士表彰大會(huì)PPT課件(帶內(nèi)容)
- 競(jìng)爭(zhēng)性談判相關(guān)表格模板
- 中考物理“極值”與“取值范圍”問(wèn)題專題訓(xùn)練
- 2009年安徽省中考化學(xué)試卷【含答案可編輯】
- 越南工業(yè)到2025年發(fā)展戰(zhàn)略及到2035發(fā)展展望(提到鋼鐵)
- 電梯曳引機(jī)減速箱的設(shè)計(jì)、建模與運(yùn)動(dòng)仿真分析機(jī)械
- PV-1200-(中文版)氣候交變穩(wěn)定性試驗(yàn)(共4頁(yè))
評(píng)論
0/150
提交評(píng)論