版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第
章
匯編語(yǔ)言程序設(shè)計(jì)本章內(nèi)容SingleChipMicrocomputer§4-0概述§4-2運(yùn)算程序設(shè)計(jì)§4-3數(shù)據(jù)的拆拼和轉(zhuǎn)換§4-1循環(huán)程序設(shè)計(jì)§4-5查表程序§4-6散轉(zhuǎn)程序設(shè)計(jì)§4-7I/O端口控制程序§4-8子程序調(diào)用時(shí)的參數(shù)傳遞第
章
匯編語(yǔ)言程序設(shè)計(jì)本章內(nèi)容SingleCh概述最早人們只能用機(jī)器語(yǔ)言(二進(jìn)制)編寫程序;為了方便記憶,人們開始用助記符形式的匯編語(yǔ)言編寫程序,稱為低級(jí)語(yǔ)言。然后再用匯編系統(tǒng)將其翻譯成機(jī)器語(yǔ)言,該過(guò)程稱為匯編;為了用更接近人的語(yǔ)言編寫程序,程序設(shè)計(jì)師們發(fā)明了高級(jí)語(yǔ)言,如:BASIC、FORTRAN、PASCAL、然后再用編譯系統(tǒng)將其翻譯成機(jī)器語(yǔ)言,該過(guò)程稱為編譯;機(jī)器只能識(shí)別機(jī)器語(yǔ)言。所以必須用編譯系統(tǒng)將高級(jí)語(yǔ)言編寫的源程序編譯成機(jī)器語(yǔ)言,用匯編系統(tǒng)將用匯編語(yǔ)言編寫的源程序匯編成機(jī)器語(yǔ)言;由低級(jí)或高級(jí)語(yǔ)言構(gòu)成的程序稱為源程序,由機(jī)器語(yǔ)言構(gòu)成的程序稱作目標(biāo)程序;一、設(shè)計(jì)語(yǔ)言概述最早人們只能用機(jī)器語(yǔ)言(二進(jìn)制)編寫程序;一、設(shè)計(jì)語(yǔ)
源程序目標(biāo)程序
低級(jí)語(yǔ)言機(jī)器語(yǔ)言匯編高級(jí)語(yǔ)言機(jī)器語(yǔ)言編譯源二、程序設(shè)計(jì)方法一、程序設(shè)計(jì)
利用計(jì)算機(jī)能夠接受的語(yǔ)言把解決問(wèn)題的方法和步驟描述出來(lái),也就是編制計(jì)算機(jī)的程序,人們常說(shuō)的軟件設(shè)計(jì)。對(duì)于單片機(jī)應(yīng)用程序,我們可以把它看成是操作系統(tǒng)和應(yīng)用軟件的集合。二、程序設(shè)計(jì)步驟
用匯編語(yǔ)言編寫一個(gè)程序的過(guò)程大致可分為以下幾個(gè)步驟:1、分析問(wèn)題,明確所要解決問(wèn)題的具體要求。二、程序設(shè)計(jì)方法一、程序設(shè)計(jì)利用計(jì)算機(jī)能夠接
2、確定算法。根據(jù)實(shí)際問(wèn)題的要求和指令系統(tǒng)的特點(diǎn),決定所要采用的計(jì)算公式和計(jì)算方法,這就是常說(shuō)的算法。算法是進(jìn)行程序設(shè)計(jì)的依據(jù),它決定了程序的正確性和程序的質(zhì)量。
3、制定程序框圖。根據(jù)算法,制定出運(yùn)算步驟的順序,再把運(yùn)算過(guò)程畫成流程圖。
4、確定數(shù)據(jù)格式,分配工作單元,將程序框圖進(jìn)一步細(xì)化。
5、根據(jù)流程圖和指令系統(tǒng),編寫出匯編語(yǔ)言源程序。
6、程序測(cè)試。由于單片機(jī)沒(méi)有自開發(fā)功能,因而必須借助仿真器,以單步、斷點(diǎn)、連續(xù)方式調(diào)試程序,直到完全正確為止。特別地,對(duì)于有硬件的應(yīng)用系統(tǒng),必須將軟件和硬件結(jié)合起來(lái)調(diào)試,直到軟件、硬件能協(xié)調(diào)一致,渾然一體為止。2、確定算法。根據(jù)實(shí)際問(wèn)題的要求和指令系統(tǒng)的
7、程序優(yōu)化。這一環(huán)節(jié)很容易被廣大設(shè)計(jì)人員所忽略。它是指從程序結(jié)構(gòu)上對(duì)程序加以調(diào)整,精減一些冗余指令,以加快程序的執(zhí)行速度,節(jié)省程序存儲(chǔ)空間,從而提高系統(tǒng)的可靠性。7、程序優(yōu)化。這一環(huán)節(jié)很容易被廣大設(shè)計(jì)人員所§4-1循環(huán)程序設(shè)計(jì)一、循環(huán)程序結(jié)構(gòu)開始N結(jié)束Y循環(huán)結(jié)束控制修改控制變量循環(huán)工作部分置初值
在單片機(jī)應(yīng)用程序設(shè)計(jì)中,循環(huán)程序的使用非常廣泛。單循環(huán)的結(jié)構(gòu)如下圖所示:
其主體為循環(huán)體,由循環(huán)工作部分和修改控制變量構(gòu)成。同其他語(yǔ)言一樣,循環(huán)程序可以實(shí)現(xiàn)嵌套,構(gòu)成多重循環(huán)。但切不可形成交叉。只能將整個(gè)循環(huán)程序作為外循環(huán)的循環(huán)體?!?-1循環(huán)程序設(shè)計(jì)一、循環(huán)程序結(jié)構(gòu)開始N結(jié)束Y循環(huán)結(jié)二、循環(huán)程序設(shè)計(jì)舉例例1、延時(shí)程序設(shè)計(jì)DELAY: MOV R7,#200 ;1個(gè)機(jī)器周期DE1: MOV R6,#123 ;1 NOP ;1DE2: DJNZ R6,DE2 ;2 DJNZ R7,DE1 ;2 RET ;2如晶體振蕩器頻率為12MHz,則其延時(shí)時(shí)間為:1+(1+1+2*123+2)*200+2=50.003ms(機(jī)器周期1μs)這是一個(gè)50ms的精確延時(shí)程序。DELAY.ASM二、循環(huán)程序設(shè)計(jì)舉例例1、延時(shí)程序設(shè)計(jì)DELAY: MOV
在RAM中,從50H開始連續(xù)存放N個(gè)單字節(jié)無(wú)符號(hào)數(shù),N存放在R2中,試編程求這N個(gè)數(shù)的和,結(jié)果放在R4R3中。程序清單如下:NSUM: MOV R0,#50HMOV R3,#00H;清零MOV R4,#00HLOOP: MOV A,R3 ADD A,@R0 MOV R3,A CLR A ADDCA,R4 MOV R4,A INC R0 DJNZ R2,LOOP RET例2、數(shù)據(jù)求和在RAM中,從50H開始連續(xù)存放N個(gè)單字節(jié)無(wú)§4-2運(yùn)算程序設(shè)計(jì)一、多字節(jié)加法
例4-3-1設(shè)有兩個(gè)4字節(jié)的二進(jìn)制數(shù)2F5BA7C3H和14DF35B8H,分別放在以40H和50H為起始地址的單元中(低位在低地址),試編程求這個(gè)數(shù)之和,結(jié)果放在以40H為起始地址的單元中。 ORG 0000H LJMP JAFA ORG 0100HJAFA:MOVR0,#40H MOV R1,#50H MOV R2,#04H LCALLJASUBLJMP $
以上為主程序JASUB:CLR CJASUB1:MOV A,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1 DJNZR2,JASUB1 RET ENDADDC A,RnADDC A,directADDC A,@RiADDC A,#data§4-2運(yùn)算程序設(shè)計(jì)一、多字節(jié)加法例4-
本程序適合于N個(gè)字節(jié)的兩數(shù)求和,但并不嚴(yán)密,當(dāng)最后一次加法有進(jìn)位時(shí)并沒(méi)有相應(yīng)處理,實(shí)際應(yīng)用時(shí)應(yīng)根據(jù)實(shí)際情況稍作修改。本程序適合于N個(gè)字節(jié)的兩數(shù)求和,但并不嚴(yán)密,例2:有兩組BCD碼分別存放在23H、22H單元和33H、32H單元,求它們的和并送入43H、42H單元中去。(高位在前,低位在后)分析:·········32H33H42HA22H23H43H···00111000011001010001000110000111BCD碼83HBCD碼11H多字節(jié)BCD碼加法例2:有兩組BCD碼分別存放在23H、22H單元和33H、3例2:有兩組BCD碼(如:1183H和5678H),分別存放在23H、22H單元和33H、32H單元,求它們的和,并送入43H、42H單元中去。(高位在前,低位在后)解:流程圖(框圖)如何?請(qǐng)同學(xué)們自己繪制流程圖。
開始(22H)A(32H)+AA十進(jìn)制調(diào)整(33H)+AAA(43H)結(jié)束A(42H)(23H)A
十進(jìn)制調(diào)整例2:有兩組BCD碼(如:1183H和5678H),分別存ORG0000HMOVA,22HADDA,32HDAAMOV42H,AMOVA,23HADDCA,33HDAAMOV43H,ASJMP$END
此條加法指令可否改用帶進(jìn)位的(ADDC)?開始(22H)A(32H)+AA十進(jìn)制調(diào)整(33H)+AAA(43H)結(jié)束A(42H)(23H)A
十進(jìn)制調(diào)整開始(22H)A(32H)+AA十進(jìn)制調(diào)整(33H)+ORG2000HCLRCMOVA,22HADDCA,32HDAAMOV42H,AMOVA,23HADDCA,33HDAAMOV43H,AEND·········32H33H42HA22H23H43H···100000110101011000010001011110001000001101111000+111110110110000100010001010101100110011101101000PCPCPCPCPCPCPCPCPC1111101101100001PC01101000PC01100111·········32H33H42HA22H23H43H··多字節(jié)BCD碼加法(P53)
與多字節(jié)加法程序類似,但需在加法指令后加一條十進(jìn)制加法調(diào)整指令。主程序與前面相同。DADD:CLR CJAD1: MOV A,@R0 ADDC A,@R1 DA A MOV @R0,A INC R0 INC R1 DJNZ R2,JAD1 RET ORG 0000H LJMP JABCD ORG 0100HJABCD:MOV R0,#40H MOV R1,#50H MOV R2,#04H LCALLDADD LJMP $以上為主程序BCDADD.ASM多字節(jié)BCD碼加法(P53)與多字節(jié)加法程序二、多字節(jié)減法 多字節(jié)減法程序和多字節(jié)加法程序類似,只需將加法指令換為減法指令即可。例:在43H~40H依次存放被減數(shù)443ADD7BH;在53H~50H中依次存放減數(shù)14DF35B8H,試編程求二者之差二、多字節(jié)減法 多字節(jié)減法程序和多字節(jié)加法程序類似,只需將
ORG 0000H LJMP JIAN ORG 0100HJIAN:MOV R0,#40H MOV R1,#50H MOV R2,#04H LCALLJIANSUB LJMP $
以上為主程序JIANSUB:CLR CJIAN1:MOV A,@R0 SUBB A,@R1 MOV @R0,A INC R0 INC R1 DJNZR2,JIAN1 RET END此程序也可以推廣到N個(gè)字節(jié)的情況。 ORG 0000HJIANSUB:CLR C四、多字節(jié)數(shù)乘法
MCS-51系列單片機(jī)指令系統(tǒng)僅能提供8位乘法指令若需進(jìn)行8位以上的乘法運(yùn)算,則需通過(guò)編程實(shí)現(xiàn)。設(shè)(R4)(R3)中為十六位被乘數(shù),R2中為8位乘數(shù),其積存放在R7R6R5中。由于(R4)(R3)*(R2)=[(R4)*256+(R3)]*(R2) =(R4)*(R2)*256+(R3)*R2R4R3BAR6R5R7BA+R2×(R4)*(R2)*256(R3)*(R2)四、多字節(jié)數(shù)乘法MCS-51系列單片機(jī)指令系CHENFA: MOV A,R2
MOV B,R3 MUL AB ;(R3)*(R2) MOV R5,A MOV R6,B MOV A,R2 MOV B,R4 MUL AB ;(R2)*(R4) ADD A,R6 MOV R6,A MOV A,B ADDC A,#00H;加進(jìn)位位 MOV R7,A RETCHENFA: MOV A,R2五、多字節(jié)除法
51指令系統(tǒng)提供一條8位的除法指令,但要想用于多位除法運(yùn)算則較為困難。因此,在進(jìn)行多字節(jié)除法運(yùn)算時(shí),多采用手工算法相同的思路。五、多字節(jié)除法51指令系統(tǒng)提供一條8位的除法§4-3數(shù)據(jù)的拆拼和轉(zhuǎn)換
在實(shí)際應(yīng)用中,經(jīng)常會(huì)遇到實(shí)際需要的數(shù)據(jù)格式同得到的數(shù)據(jù)格式不完全相符的情況,如采集到的數(shù)據(jù)、運(yùn)算的結(jié)果、輸出的數(shù)據(jù)等,這就需要對(duì)其進(jìn)行適當(dāng)?shù)霓D(zhuǎn)換,以符合實(shí)際情況的要求。這就是通常所說(shuō)的數(shù)據(jù)拆拼和轉(zhuǎn)換。一、數(shù)據(jù)的拆拼BBCD:MOV A,7CH ANL A,#0FH MOV R5,A MOV A,7CH
ANL A,#0F0H SWAP A MOV R6,A RET例:轉(zhuǎn)換前7CH中為壓縮BCD碼XY程序清單:0Y0X
轉(zhuǎn)換后R6R5中為非壓縮BCD碼§4-3數(shù)據(jù)的拆拼和轉(zhuǎn)換在實(shí)際應(yīng)用中,經(jīng)常例4-4-2拆拼前(20H)=X7X6X5X4X3X2X1X0 拆拼后(21H)=X0X1X2X3X4X5X6X7DESORT:MOVA,20H MOV R6,A MOV R7,#08HRESO:CLR C MOV A,R6 RLC A MOV R6,A MOV A,21H RRC A MOV 21H,ADJNZ R7,RESO RET A5A00A2A1A4A3A60000000A7A7A400A1A0A3A2A5A7000000A6A6例4-4-2拆拼前(20H)=X7X6X5X4X補(bǔ)充內(nèi)容例1:將20H單元的兩個(gè)壓縮BCD碼拆開變成ASCII碼,存入21H、22H單元。(假設(shè)20H中的BCD碼為00110100)什么是BCD碼?什么是ASCII碼?BCD碼與ASCII碼關(guān)系·········20H21H22HAB0011壓縮BCD碼001100110100低四位ASII碼高四位ASII碼壓縮BCD碼拆開變成ASCII碼補(bǔ)充內(nèi)容例1:將20H單元的兩個(gè)壓縮BCD碼拆開變成ASCI二進(jìn)制與ASCII碼的相互關(guān)系為:數(shù)字0~9對(duì)應(yīng)的ASCII碼為30H~39H,即加30H字母A~F對(duì)應(yīng)的ASCII碼為41H~46H,即加37H二進(jìn)制與ASCII碼的相互關(guān)系為:方法1:將BCD碼除以10H,恰好是將BCD碼分別移到了A、B的低4位。然后再各自與30H相或,即成為ASCII碼。方法2:利用半字節(jié)交換指令來(lái)實(shí)現(xiàn)。方法1:將BCD碼除以10H,恰好是將BCD碼分別移到了A、ORG0000HMOVA,20HMOVB,#10HDIVABORLB,#30HMOV22H,BORLA,#30HMOV21H,ASJMP$
開始(20H)A10HBA/B(A中為高4位BCD碼,B中為低4位BCD碼)B+30HBB(22H)A+30HAA(21H)結(jié)束簡(jiǎn)單程序例1---方法1源程序如下:·········20H21H22HAB00110100PCPCPC0011010000010000PC0011000000000100PC00110100PCPCPC0011PCORG0000H開始(20H)A10HBAORG0000HMOVR0,#20HMOVA,#30HXCHDA,@R0MOV22H,AMOVA,@R0SWAPAORLA,#30HMOV21H,ASJMP$簡(jiǎn)單程序例1---方法2
開始#20HR0#30HAA的低4位(20H)的低4位A(22H)(20H)AA的低4位A的高4位A(21H)結(jié)束A+30HAPCPCPCPCPCPCPCPCPC源程序如下:·········20H21H22HAR000110010000000110100000001000011010000110000001100000011PC0011
二、數(shù)據(jù)的轉(zhuǎn)換
在計(jì)算機(jī)內(nèi)部,任何數(shù)據(jù)都是以二進(jìn)制的形式存儲(chǔ),但是,當(dāng)我們?cè)谧鱅/O操作時(shí),往往需要其它形式的數(shù)據(jù)格式,如ASCII碼、BCD碼、八進(jìn)制數(shù)等,這就需要做一些數(shù)據(jù)格式的互換操作。1、ASCII碼到二進(jìn)制數(shù)的相互轉(zhuǎn)換二進(jìn)制與ASCII碼的相互關(guān)系為:數(shù)字0~9對(duì)應(yīng)的ASCII碼為30H~39H,即加30H字母A~F對(duì)應(yīng)的ASCII碼為41H~46H,即加37H(1)ASCII到二進(jìn)制的轉(zhuǎn)換通過(guò)以上介紹的二者之間的關(guān)系,不難畫出流程圖:二、數(shù)據(jù)的轉(zhuǎn)換在計(jì)算機(jī)內(nèi)部,任何數(shù)據(jù)都是以二開始取操作數(shù)清進(jìn)位標(biāo)志減30H差>9?轉(zhuǎn)換正確結(jié)束減07HY轉(zhuǎn)換正確NASCTOHEX: MOV A,R2 CLR C SUBB A,#30H MOV R2,ACJNEA,#0AH,NEXTNEXT:JC TOK SUBB A,#07H MOV R2,ATOK:
RET例4-4-3轉(zhuǎn)換前R2為ASCII碼,轉(zhuǎn)換后R2為二進(jìn)制開始取操作數(shù)清進(jìn)位標(biāo)志減30H差>9?轉(zhuǎn)換正確結(jié)束減07HY(2)二進(jìn)制到ASCII碼當(dāng)二進(jìn)制數(shù)<0AH時(shí),加30H即得相應(yīng)的ASCII,當(dāng)二進(jìn)制數(shù)介于0AH、0FH之間(包括0AH、0FH),則加37H即得到相應(yīng)的ASCII。(2)二進(jìn)制到ASCII碼當(dāng)二進(jìn)制數(shù)<0AH時(shí),加30H即得2、BCD碼與二進(jìn)制的相互轉(zhuǎn)換(1)BCD到二進(jìn)制的轉(zhuǎn)換3615=3*103+6*102+1*10+5=[(3*10+6)*10+1]*10+5由壓縮BCD碼到非壓縮BCD碼的轉(zhuǎn)換較為簡(jiǎn)單,在前面我們已經(jīng)涉及,在此不再重復(fù)。例:如下圖所示15H36H41H40H壓縮BCD碼3H6H1H5H43H42H41H40H非壓縮BCD碼1FH0EHR3R2二進(jìn)制數(shù)2、BCD碼與二進(jìn)制的相互轉(zhuǎn)換(1)BCD到二進(jìn)制的轉(zhuǎn)換36高位BCD碼的地址->(R0)計(jì)數(shù)初值3->(R7)初值送結(jié)果單元0->(R3)((R0))->(R2)(R3R2)*10->(R3R2)(R0)-1->(R0)(R3R2)+((R0))+(Cy)->(R3R2)(R7)-1=0?結(jié)束YN3615=3*103+6*102+1*10+5=[(3*10+6)*10+1]*10+5R3R23H6H1H5H43H42H41H40HR0高位BCD碼的地址->(R0)計(jì)數(shù)初值3->(R7)初值送
MOV R0,#43H ;指向高位 MOV R3,#00H ;結(jié)果單元清零 MOV A,@R0 MOV R2,A ;轉(zhuǎn)換初值送R2ML10: MOV A,R2 MOV B,#0AH MUL AB ;R2乘10 MOV R2,A ;暫存R2*10低位 MOV A,B XCH A,R3 ;暫存R2*10高位 MOV B,#0AH MUL AB ;R3*10 ADD A,R3 ;R3*10低位加 MOV R3,A ;為什么不處理BBCDHEX: MOV R7,#03H ;計(jì)數(shù)初值 MOV R0,#43H ;指向高位BCDHEX: MOV
MOV A,@R0 ADD A,R2 ;結(jié)果與低單元相加 MOV R2,A MOV A,R3 ADDC A,#00H ;加低位進(jìn)位位 MOV R3,A ;保存結(jié)果 DJNZ R7,ML10 RET
由于二位壓縮BCD碼的表示范圍為0~9999,其對(duì)應(yīng)二進(jìn)制為0~270H,不會(huì)超過(guò)兩個(gè)字節(jié),因而不必考慮R3*10的高位。JAFA: DEC R0 ;指向下一位 MOV A,@R0由于二位壓縮BCD碼的例:如下圖所示(2)二進(jìn)制到BCD的轉(zhuǎn)換15H36HR3R2二進(jìn)制數(shù)3H8H4H5H43H42H41H40H非壓縮BCD碼1H44H
如上圖所示,雙字節(jié)二進(jìn)制數(shù)的表示范圍為0~65535,因而需要5個(gè)BCD碼位來(lái)表示。從二進(jìn)制到BCD碼,我們采用連減的辦法,其原理如下:待轉(zhuǎn)換的二進(jìn)制數(shù)-104夠減,萬(wàn)位加1,再減不夠減,恢復(fù)余數(shù),再減103以此類推,直到得到個(gè)位為止。例:如下圖所示(2)二進(jìn)制到BCD的轉(zhuǎn)換15H36HR3104=2710H 103=03E8H 102=0064H 10=0AHBBCD:MOV R0,#44H ;數(shù)據(jù)指針 MOV R7,#04H ;計(jì)數(shù)初值 MOV DPTR,#PWTAB MOV R6,#00H ;偏移量BBC1: MOV A,R6 MOVCA,@A+DPTR MOV R4,A ;查冪值表低位 INC R6 MOV A,R6 MOVCA,@A+DPTR MOV R5,A ;查冪值高位 INC R6 MOV @R0,#00H104=2710H 103=03E8H 102=0064H
MOV A,R2 SUBB A,R4 ;減低位 MOV R2,A MOV A,R3 SUBB A,R5 ;減高位 MOV R3,A JC BBC3 ;不夠減則恢復(fù)余數(shù) INC @R0 ;夠減則結(jié)果單元加1 SJMP BBC2BBC3: MOV A,R2 ADD A,R4 ;恢復(fù)余數(shù)低位 MOV R2,A MOV A,R3 ADDC A,R5 ;恢復(fù)余數(shù)高位 MOV R3,ABBC2: CLR C MOV A,R2BBC2: CLR C
DJNZ R7,BBC1 ;未減完則繼續(xù) MOV A,R2 MOV @R0,A ;保存?zhèn)€位 RETPWTAB:DB 10H,27H ;10000 DB 0E8H,03H ;1000 DB 64H,00H ;100 DB 0AH,00H ;10
DEC R0 ;指向下一單元 DJNZ R7,BBC1 ;未減完則繼續(xù) DEC R0 ;§4-5查表程序
查表程序中一種常用的非數(shù)值運(yùn)算程序,應(yīng)用非常廣泛。使用查表程序可以完成數(shù)據(jù)的補(bǔ)償、計(jì)算、轉(zhuǎn)換等各種功能,具有程序簡(jiǎn)單、執(zhí)行速度快、精度高等優(yōu)點(diǎn),而這正是單片機(jī)在測(cè)控場(chǎng)合或智能化儀表中所需要的。§4-5查表程序 查表程序中一種常用的非數(shù)值運(yùn)算程序,應(yīng)一、以DPTR為基地址的查表程序MOVC A,@A+DPTR1、其操作步驟如下:初始化DPTR:將表格的首地址放入DPTR中,作為基地址。
初始化ACC:A中應(yīng)該放所要查詢的數(shù)據(jù)在表格中的順序號(hào)。執(zhí)行結(jié)果:在執(zhí)行該指令后,A中存放的是在表格中查到的數(shù)據(jù)。一、以DPTR為基地址的查表程序MOVC 注意事項(xiàng)在查詢表格時(shí),若所要查詢的數(shù)據(jù)是雙字節(jié)的,則在初始化A中的數(shù)應(yīng)為順序號(hào)的2倍,且應(yīng)執(zhí)行兩次本指令。對(duì)于單字節(jié)表格而言,表項(xiàng)的個(gè)數(shù)應(yīng)不大于256個(gè),若大于256時(shí),則應(yīng)適當(dāng)修改DPTR的值。表格的存放位置。注意事項(xiàng)在查詢表格時(shí),若所要查詢的數(shù)據(jù)是雙字節(jié)的,則在初始化二、以PC為基地址的查表指令MOVC A,@A+PC表格存放地址=PC+偏移量+X(表項(xiàng))二、以PC為基地址的查表指令MOVC A,@A+PC1、操作步驟(1)將待查表的項(xiàng)數(shù)送給ACC。(2)疊加偏移量,表頭和當(dāng)前PC的地址偏移量加到表項(xiàng)上。(3)執(zhí)行結(jié)果。1、操作步驟(1)將待查表的項(xiàng)數(shù)送給ACC。2、注意事項(xiàng)(1)對(duì)于雙字節(jié)表格,其處理方法與以DPTR為基地址的情況相同。(2)對(duì)于單字節(jié)表格而言,其項(xiàng)數(shù)應(yīng)不大于256。(3)對(duì)于雙字節(jié)表格而言,其項(xiàng)數(shù)應(yīng)不大于128。2、注意事項(xiàng)(1)對(duì)于雙字節(jié)表格,其處理方法與以DPTR為三、兩種方式的比較1、PC僅能對(duì)所謂本地表格操作,即表格項(xiàng)數(shù)不得大于256,且偏移量可能隨程序的變化而變化,計(jì)算較為麻煩,其優(yōu)點(diǎn)是少用寄存器。2、DPTR使用起來(lái)非常靈活,表項(xiàng)數(shù)不受限制,且表格可以放在64K的任意地方。三、兩種方式的比較1、PC僅能對(duì)所謂本地表格操作,即表格項(xiàng)數(shù)例:
在一個(gè)溫度測(cè)量裝置中,測(cè)出的電壓與溫度為非線性關(guān)系。設(shè)測(cè)得的電壓為X,用10位二進(jìn)制數(shù)表示?,F(xiàn)要求采用查表法實(shí)現(xiàn)線性化處理。VTT1V1非線形V1=KT1例: 在一個(gè)溫度測(cè)量裝置中,測(cè)出的電壓與溫度為非線性關(guān)系。設(shè)分析10位二進(jìn)制位的表示范圍為0~1023,因而有1024個(gè)電壓值,從而可以建立一個(gè)表格,其項(xiàng)數(shù)為1024個(gè)。存放溫度值Y的單元地址=表首地址+(X*2)設(shè)測(cè)得的電壓值已存放在20H,21H中,(20H為高字節(jié)),查表后的溫度值存放在22H,23H中,(22H為高字節(jié))。分析10位二進(jìn)制位的表示范圍為0~1023,因而有10例:程序清單LTB2: MOV DPTR,#TAB2
MOV A,21H;(20H21H)*2 CLR C RLC A;低八位*2 MOV 21H,A;
MOV A,20H;表首+(20H21H)*2 RLC A;高八位*2+CY MOV 20H,A MOV A,21H ADD A,DPL MOV DPL,A MOV A,20H ADDC A,DPH;為什么帶進(jìn)位加 MOV DPH,A;完成地址計(jì)算測(cè)得的電壓值存放(20H21H)中(20H為高字節(jié)),查表后的溫度值存放在(22H23H)中(22H為高字節(jié))例:程序清單LTB2: MOV DPTR,#TAB2測(cè)得的例:程序清單(續(xù)) CLR A ;查表
為什么清A?? MOVC A,@A+DPTR MOV 22H,A INC DPTR CLR A MOVC A,@A+DPTR MOV 23H,A RETTAB2: DW ………….. ;溫度表值 DW …………..例:程序清單(續(xù)) CLR A ;查§4-6散轉(zhuǎn)程序設(shè)計(jì) 在程序設(shè)計(jì)中,不外有三種情況:順序、循環(huán)和條件分支程序。其中順序程序設(shè)計(jì)最為簡(jiǎn)單,而循環(huán)程序設(shè)計(jì)在前面已經(jīng)學(xué)習(xí)過(guò)。分支程序(如下圖所示)又可分為兩大類:字節(jié)條件和位條件,即CJNE和JC、JB、JZ類指令。位條件轉(zhuǎn)移指令很容易實(shí)現(xiàn)簡(jiǎn)單條件轉(zhuǎn)移,當(dāng)要實(shí)現(xiàn)多分支轉(zhuǎn)移時(shí),可以通過(guò)CJNE來(lái)實(shí)現(xiàn),這就是所謂散轉(zhuǎn)程序設(shè)計(jì),但實(shí)現(xiàn)起來(lái)則較為麻煩。(A)=0?YYY(A)=1?N(A)=2?NN§4-6散轉(zhuǎn)程序設(shè)計(jì) 在程序設(shè)計(jì)中,不外有三種情況:順序例: 測(cè)試P1口輸入的100個(gè)數(shù)中0~9各數(shù)的概率分布程序(A)=0?YYY(A)=1?N(A)=2?NN操作0操作1操作2終點(diǎn)例: 測(cè)試P1口輸入的100個(gè)數(shù)中0~9各數(shù)的概率分布程序( MOV40H,#100MOVP1,#0FFH;準(zhǔn)備輸入READ:MOVA,P1CHK0:CJNEA,#0,CHK1 INC30H DJNZ40H,READ SJMPEENDCHK1:CJNEA,#1,CHK2 INC31H DJNZ40H,READ SJMPEENDCHK2:CJNEA,#2,CHK3 INC32H DJNZ40H,READ SJMPEENDCHK3:CJNEA,#3,CHK4 INC33H DJNZ40H,READ SJMPEENDCHK4:CJNEA,#4,CHK5 INC34H DJNZ40H,READ SJMPEENDCHK5:CJNEA,#5,CHK6 INC35H DJNZ40H,READ SJMPEEND程序清單 MOV40H,#100CHK3:CJNECHK6:CJNEA,#6,CHK7 INC36H DJNZ40H,READ SJMPEENDCHK7:CJNEA,#7,CHK8 INC37H DJNZ40H,READ SJMPEENDCHK8:CJNEA,#8,CHK9 INC38H DJNZ40H,READ SJMPEENDCHK9:INC39H DJNZ40H,READEEND:SJMP$
利用條件轉(zhuǎn)移類指令來(lái)實(shí)現(xiàn)分支,程序較為簡(jiǎn)單,容易實(shí)現(xiàn),但應(yīng)特別注意的是:在分析問(wèn)題時(shí),一定要邏輯嚴(yán)密,充分判斷出各種可能出現(xiàn)的條件標(biāo)志。CHK6:CJNEA,#6,CHK7CHK9:I二、利用轉(zhuǎn)移指令來(lái)實(shí)現(xiàn)的程序散轉(zhuǎn)JMP @A+DPTR其執(zhí)行過(guò)程可以分為三步:(1)將轉(zhuǎn)移表首地址送入DPTR作為基地址。(2)將條件標(biāo)志單元內(nèi)容裝入A中作為變址,在裝入前,還應(yīng)根據(jù)轉(zhuǎn)移表項(xiàng)內(nèi)容作相應(yīng)變化。(3)實(shí)現(xiàn)轉(zhuǎn)移。我們可以根據(jù)轉(zhuǎn)移表的不同來(lái)分為三種散轉(zhuǎn)程序:二、利用轉(zhuǎn)移指令來(lái)實(shí)現(xiàn)的程序散轉(zhuǎn)JMP @A+DPTR1、采用轉(zhuǎn)移指令表的散轉(zhuǎn)程序設(shè)計(jì) 這類散轉(zhuǎn)程序的核心部分——轉(zhuǎn)移表部分由無(wú)條件轉(zhuǎn)移指令A(yù)JMP或LJMP構(gòu)成。 其轉(zhuǎn)移范圍分別為64K或2KBytes。1、采用轉(zhuǎn)移指令表的散轉(zhuǎn)程序設(shè)計(jì) 這類散轉(zhuǎn)程序的核心部分——例:要求根據(jù)R7的內(nèi)容轉(zhuǎn)向各個(gè)操作程序。
即(R7)=0,轉(zhuǎn)向OPR0 即(R7)=1,轉(zhuǎn)向OPR1 即(R7)=2,轉(zhuǎn)向OPR2 …………… 即(R7)=n,轉(zhuǎn)向OPRn 例:要求根據(jù)R7的內(nèi)容轉(zhuǎn)向各個(gè)操作程序。
即(R程序清單JUMP1: MOV DPTR,#JPTAB1 MOV A,R7 ADD A,R7 ;(R7)*2(A) JNC NOAD ;判斷是否有進(jìn)位 INC DPH ;有加到高字節(jié)地址NOAD: JMP @A+DPTRJPTAB1: AJMP OPR0 AJMP OPR1 …………….. AJMP OPRn程序清單JUMP1: MOV DPTR,#JPTAB1
注意事項(xiàng)(1)在本例中,由于AJMP指令的指令長(zhǎng)度為2個(gè)字節(jié),因而在散轉(zhuǎn)時(shí)采用自加的方法使變址實(shí)現(xiàn)乘2;若改用LJMP指令,由于其指令長(zhǎng)度為3字節(jié),因而應(yīng)使變址乘3來(lái)修下正。當(dāng)修正產(chǎn)生進(jìn)位時(shí),要將進(jìn)位加到DPH中。 (2)由于R7是單字節(jié),因而散轉(zhuǎn)點(diǎn)不能大于256個(gè)。為了克服此局限性,我們考慮:通過(guò)修改DPTR的辦法來(lái)增加散轉(zhuǎn)點(diǎn),使這最大散轉(zhuǎn)點(diǎn)N可達(dá)到N<=(最大存儲(chǔ)容量—散轉(zhuǎn)表首地址)/3。注意事項(xiàng)(1)在本例中,由于AJMP指令的指令長(zhǎng)度為2個(gè)例:要求根據(jù)R6R7中的數(shù)據(jù)轉(zhuǎn)向?qū)?yīng)的操作程序JUMP2: MOV DPTR,#JPTAB2 MOV A,R6 MOV B,#03H ;(R6)*3(BA) MUL AB ADD A,DPH MOV DPH,A例:要求根據(jù)R6R7中的數(shù)據(jù)轉(zhuǎn)向?qū)?yīng)的操作程序JUMP2:例續(xù) MOV A,R7 MOV B,#03H MUL AB XCH A,B ADD A,DPH MOV DPH,A; XCH A,B;恢復(fù)低位 JMP @A+DPTRJPTAB2: LJMP OPR0 LJMP OPR1 …………….. LJMP OPRn例續(xù) MOV A,R72、采用轉(zhuǎn)向地址偏移量表散轉(zhuǎn)程序 本方法的關(guān)鍵在于建立一個(gè)轉(zhuǎn)向地址偏移量表,需要程序員認(rèn)真計(jì)算,否則會(huì)產(chǎn)生錯(cuò)誤。2、采用轉(zhuǎn)向地址偏移量表散轉(zhuǎn)程序 本方法的關(guān)鍵在于建立一個(gè)轉(zhuǎn)例:要求按R7的內(nèi)容轉(zhuǎn)向5個(gè)操作程序。JUMP3: MOV A,R7 MOV DPTR,#TAB3 MOVCA,@A+DPTR JMP @A+DPTRTAB3: DB OPR0-TAB3 DB OPR1-TAB3 ……. DB OPR4-TAB3OPR0:OPR1:OPR2:……本例的散轉(zhuǎn)范圍小于256,同上例一樣,本例也可通過(guò)變通的方法,使這能在64K范圍內(nèi)實(shí)現(xiàn)散轉(zhuǎn)。例:要求按R7的內(nèi)容轉(zhuǎn)向5個(gè)操作程序。JUMP3: MOV§4-7I/O端口控制程序 通過(guò)前面的學(xué)習(xí),我們知道單片機(jī)有32個(gè)I/O口可供編程者使用。由于結(jié)構(gòu)上的原因,I/O口作為輸出時(shí),由于端口具有鎖存功能,不需外接鎖存器;但是,當(dāng)把它作為輸入口時(shí),雖然具有輸入緩沖器,但不具有輸入鎖存器,因此在CPU完成讀引腳前,輸入的數(shù)據(jù)必須一直保持在引腳上。為此,我們需要借助一些特定的接口電路來(lái)實(shí)現(xiàn)輸入功能?!?-7I/O端口控制程序 通過(guò)前面的學(xué)習(xí),我們知道單片一、BCD撥碼盤與單片機(jī)的接口 如右圖所示,A為公共端,當(dāng)A接VCC時(shí),撥碼盤輸出正邏輯,當(dāng)A接GND時(shí),撥碼盤輸出負(fù)邏輯。其輸出范圍為0000~1001,因而稱之為BCD撥碼盤。一、BCD撥碼盤與單片機(jī)的接口 如右圖所示,A為公共端,當(dāng)ABCD撥碼盤與單片機(jī)的接口
BCD撥碼盤與單片機(jī)的接口電路如右圖所示:通過(guò)讀取P1口的低四位即可獲得BCD撥碼盤的狀態(tài)信息。BCD撥碼盤與單片機(jī)的接口 BCD撥碼盤與單片機(jī)的接口電路如二、多片BCD撥盤與單片機(jī)的接口如圖所示:通過(guò)對(duì)P1口的高四位進(jìn)行掃描,使P1.4~P1.7依次為“0”,然后查詢P1口低四位的狀態(tài),從而得到撥盤的狀態(tài)信息。由于撥盤在控制端為“0”時(shí)選中該位,因此撥盤的輸出為反碼,經(jīng)與非門后,讀出的狀態(tài)信息為正碼。二、多片BCD撥盤與單片機(jī)的接口如圖所示:通過(guò)對(duì)P1口的高四三、撥碼輸入程序?qū)?位BCD碼按千,百,十,個(gè)位依次讀入,然后存放在30H_33H中。RDS: MOV R0,#30H MOV R2,#7FH;首先選中千位 MOV R3,#04HLOOP: MOVA,R2 MOV P1,A;讀千位,同時(shí)低四位輸出“1” MOV A,P1 ANL A,#0FH MOV @R0,A;讀入低四位,保存 INC R0 MOV A,R2 RR A MOV R2,A;R2指向下一位 DJNZ R3,LOOP RET三、撥碼輸入程序?qū)?位BCD碼按千,百,十,個(gè)位依次讀入,然§4-8子程序調(diào)用時(shí)的參數(shù)傳遞在進(jìn)行程序設(shè)計(jì)時(shí),為保證程序的高效、可靠的運(yùn)行,增加程序的可讀性、可懂性,我們提倡結(jié)構(gòu)化編程,而結(jié)構(gòu)化編程的重要一點(diǎn)就是子程序的編制。在進(jìn)行程序設(shè)計(jì)時(shí),有些程序段是被多次使用到,但每次使用時(shí),需要對(duì)某個(gè)寄存器的內(nèi)容稍作修改。為了避免多次多次重復(fù)編寫同樣的程序,節(jié)省存儲(chǔ)空間,我們就可以把這樣的程序段獨(dú)立出來(lái),形成一個(gè)獨(dú)立的子程序,每次要使用前,先對(duì)需要修改的寄存器進(jìn)行修改后,用ACALL或LCALL調(diào)用,這里修改的寄存器我們稱之為入口參數(shù),子程序執(zhí)行的結(jié)果,我們稱之為出口參數(shù),參數(shù)修改方式則稱之為參數(shù)傳遞?!?-8子程序調(diào)用時(shí)的參數(shù)傳遞在進(jìn)行程序設(shè)計(jì)時(shí),為保證程常通過(guò)寄存器傳遞參數(shù)這種方法應(yīng)用最為廣泛、也最易使用,它是在調(diào)用子程序之前,對(duì)需要修改的寄存器預(yù)先修改后,再來(lái)調(diào)用子程序。常通過(guò)寄存器傳遞參數(shù)這種方法應(yīng)用最為廣泛、也最易使用,它是在例:試編程對(duì)30H~3AH單元清零MAIN: ………..………… MOV R0,#30H MOV R7,#0AH LCALL SUBRT ….SUBRT: MOV A,#00HRESU: MOV @R0,A INC R0 DJNZ R7,RESU RET例:試編程對(duì)30H~3AH單元清零MAIN: ………..…第
章
匯編語(yǔ)言程序設(shè)計(jì)本章內(nèi)容SingleChipMicrocomputer§4-0概述§4-2運(yùn)算程序設(shè)計(jì)§4-3數(shù)據(jù)的拆拼和轉(zhuǎn)換§4-1循環(huán)程序設(shè)計(jì)§4-5查表程序§4-6散轉(zhuǎn)程序設(shè)計(jì)§4-7I/O端口控制程序§4-8子程序調(diào)用時(shí)的參數(shù)傳遞第
章
匯編語(yǔ)言程序設(shè)計(jì)本章內(nèi)容SingleCh概述最早人們只能用機(jī)器語(yǔ)言(二進(jìn)制)編寫程序;為了方便記憶,人們開始用助記符形式的匯編語(yǔ)言編寫程序,稱為低級(jí)語(yǔ)言。然后再用匯編系統(tǒng)將其翻譯成機(jī)器語(yǔ)言,該過(guò)程稱為匯編;為了用更接近人的語(yǔ)言編寫程序,程序設(shè)計(jì)師們發(fā)明了高級(jí)語(yǔ)言,如:BASIC、FORTRAN、PASCAL、然后再用編譯系統(tǒng)將其翻譯成機(jī)器語(yǔ)言,該過(guò)程稱為編譯;機(jī)器只能識(shí)別機(jī)器語(yǔ)言。所以必須用編譯系統(tǒng)將高級(jí)語(yǔ)言編寫的源程序編譯成機(jī)器語(yǔ)言,用匯編系統(tǒng)將用匯編語(yǔ)言編寫的源程序匯編成機(jī)器語(yǔ)言;由低級(jí)或高級(jí)語(yǔ)言構(gòu)成的程序稱為源程序,由機(jī)器語(yǔ)言構(gòu)成的程序稱作目標(biāo)程序;一、設(shè)計(jì)語(yǔ)言概述最早人們只能用機(jī)器語(yǔ)言(二進(jìn)制)編寫程序;一、設(shè)計(jì)語(yǔ)
源程序目標(biāo)程序
低級(jí)語(yǔ)言機(jī)器語(yǔ)言匯編高級(jí)語(yǔ)言機(jī)器語(yǔ)言編譯源二、程序設(shè)計(jì)方法一、程序設(shè)計(jì)
利用計(jì)算機(jī)能夠接受的語(yǔ)言把解決問(wèn)題的方法和步驟描述出來(lái),也就是編制計(jì)算機(jī)的程序,人們常說(shuō)的軟件設(shè)計(jì)。對(duì)于單片機(jī)應(yīng)用程序,我們可以把它看成是操作系統(tǒng)和應(yīng)用軟件的集合。二、程序設(shè)計(jì)步驟
用匯編語(yǔ)言編寫一個(gè)程序的過(guò)程大致可分為以下幾個(gè)步驟:1、分析問(wèn)題,明確所要解決問(wèn)題的具體要求。二、程序設(shè)計(jì)方法一、程序設(shè)計(jì)利用計(jì)算機(jī)能夠接
2、確定算法。根據(jù)實(shí)際問(wèn)題的要求和指令系統(tǒng)的特點(diǎn),決定所要采用的計(jì)算公式和計(jì)算方法,這就是常說(shuō)的算法。算法是進(jìn)行程序設(shè)計(jì)的依據(jù),它決定了程序的正確性和程序的質(zhì)量。
3、制定程序框圖。根據(jù)算法,制定出運(yùn)算步驟的順序,再把運(yùn)算過(guò)程畫成流程圖。
4、確定數(shù)據(jù)格式,分配工作單元,將程序框圖進(jìn)一步細(xì)化。
5、根據(jù)流程圖和指令系統(tǒng),編寫出匯編語(yǔ)言源程序。
6、程序測(cè)試。由于單片機(jī)沒(méi)有自開發(fā)功能,因而必須借助仿真器,以單步、斷點(diǎn)、連續(xù)方式調(diào)試程序,直到完全正確為止。特別地,對(duì)于有硬件的應(yīng)用系統(tǒng),必須將軟件和硬件結(jié)合起來(lái)調(diào)試,直到軟件、硬件能協(xié)調(diào)一致,渾然一體為止。2、確定算法。根據(jù)實(shí)際問(wèn)題的要求和指令系統(tǒng)的
7、程序優(yōu)化。這一環(huán)節(jié)很容易被廣大設(shè)計(jì)人員所忽略。它是指從程序結(jié)構(gòu)上對(duì)程序加以調(diào)整,精減一些冗余指令,以加快程序的執(zhí)行速度,節(jié)省程序存儲(chǔ)空間,從而提高系統(tǒng)的可靠性。7、程序優(yōu)化。這一環(huán)節(jié)很容易被廣大設(shè)計(jì)人員所§4-1循環(huán)程序設(shè)計(jì)一、循環(huán)程序結(jié)構(gòu)開始N結(jié)束Y循環(huán)結(jié)束控制修改控制變量循環(huán)工作部分置初值
在單片機(jī)應(yīng)用程序設(shè)計(jì)中,循環(huán)程序的使用非常廣泛。單循環(huán)的結(jié)構(gòu)如下圖所示:
其主體為循環(huán)體,由循環(huán)工作部分和修改控制變量構(gòu)成。同其他語(yǔ)言一樣,循環(huán)程序可以實(shí)現(xiàn)嵌套,構(gòu)成多重循環(huán)。但切不可形成交叉。只能將整個(gè)循環(huán)程序作為外循環(huán)的循環(huán)體。§4-1循環(huán)程序設(shè)計(jì)一、循環(huán)程序結(jié)構(gòu)開始N結(jié)束Y循環(huán)結(jié)二、循環(huán)程序設(shè)計(jì)舉例例1、延時(shí)程序設(shè)計(jì)DELAY: MOV R7,#200 ;1個(gè)機(jī)器周期DE1: MOV R6,#123 ;1 NOP ;1DE2: DJNZ R6,DE2 ;2 DJNZ R7,DE1 ;2 RET ;2如晶體振蕩器頻率為12MHz,則其延時(shí)時(shí)間為:1+(1+1+2*123+2)*200+2=50.003ms(機(jī)器周期1μs)這是一個(gè)50ms的精確延時(shí)程序。DELAY.ASM二、循環(huán)程序設(shè)計(jì)舉例例1、延時(shí)程序設(shè)計(jì)DELAY: MOV
在RAM中,從50H開始連續(xù)存放N個(gè)單字節(jié)無(wú)符號(hào)數(shù),N存放在R2中,試編程求這N個(gè)數(shù)的和,結(jié)果放在R4R3中。程序清單如下:NSUM: MOV R0,#50HMOV R3,#00H;清零MOV R4,#00HLOOP: MOV A,R3 ADD A,@R0 MOV R3,A CLR A ADDCA,R4 MOV R4,A INC R0 DJNZ R2,LOOP RET例2、數(shù)據(jù)求和在RAM中,從50H開始連續(xù)存放N個(gè)單字節(jié)無(wú)§4-2運(yùn)算程序設(shè)計(jì)一、多字節(jié)加法
例4-3-1設(shè)有兩個(gè)4字節(jié)的二進(jìn)制數(shù)2F5BA7C3H和14DF35B8H,分別放在以40H和50H為起始地址的單元中(低位在低地址),試編程求這個(gè)數(shù)之和,結(jié)果放在以40H為起始地址的單元中。 ORG 0000H LJMP JAFA ORG 0100HJAFA:MOVR0,#40H MOV R1,#50H MOV R2,#04H LCALLJASUBLJMP $
以上為主程序JASUB:CLR CJASUB1:MOV A,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1 DJNZR2,JASUB1 RET ENDADDC A,RnADDC A,directADDC A,@RiADDC A,#data§4-2運(yùn)算程序設(shè)計(jì)一、多字節(jié)加法例4-
本程序適合于N個(gè)字節(jié)的兩數(shù)求和,但并不嚴(yán)密,當(dāng)最后一次加法有進(jìn)位時(shí)并沒(méi)有相應(yīng)處理,實(shí)際應(yīng)用時(shí)應(yīng)根據(jù)實(shí)際情況稍作修改。本程序適合于N個(gè)字節(jié)的兩數(shù)求和,但并不嚴(yán)密,例2:有兩組BCD碼分別存放在23H、22H單元和33H、32H單元,求它們的和并送入43H、42H單元中去。(高位在前,低位在后)分析:·········32H33H42HA22H23H43H···00111000011001010001000110000111BCD碼83HBCD碼11H多字節(jié)BCD碼加法例2:有兩組BCD碼分別存放在23H、22H單元和33H、3例2:有兩組BCD碼(如:1183H和5678H),分別存放在23H、22H單元和33H、32H單元,求它們的和,并送入43H、42H單元中去。(高位在前,低位在后)解:流程圖(框圖)如何?請(qǐng)同學(xué)們自己繪制流程圖。
開始(22H)A(32H)+AA十進(jìn)制調(diào)整(33H)+AAA(43H)結(jié)束A(42H)(23H)A
十進(jìn)制調(diào)整例2:有兩組BCD碼(如:1183H和5678H),分別存ORG0000HMOVA,22HADDA,32HDAAMOV42H,AMOVA,23HADDCA,33HDAAMOV43H,ASJMP$END
此條加法指令可否改用帶進(jìn)位的(ADDC)?開始(22H)A(32H)+AA十進(jìn)制調(diào)整(33H)+AAA(43H)結(jié)束A(42H)(23H)A
十進(jìn)制調(diào)整開始(22H)A(32H)+AA十進(jìn)制調(diào)整(33H)+ORG2000HCLRCMOVA,22HADDCA,32HDAAMOV42H,AMOVA,23HADDCA,33HDAAMOV43H,AEND·········32H33H42HA22H23H43H···100000110101011000010001011110001000001101111000+111110110110000100010001010101100110011101101000PCPCPCPCPCPCPCPCPC1111101101100001PC01101000PC01100111·········32H33H42HA22H23H43H··多字節(jié)BCD碼加法(P53)
與多字節(jié)加法程序類似,但需在加法指令后加一條十進(jìn)制加法調(diào)整指令。主程序與前面相同。DADD:CLR CJAD1: MOV A,@R0 ADDC A,@R1 DA A MOV @R0,A INC R0 INC R1 DJNZ R2,JAD1 RET ORG 0000H LJMP JABCD ORG 0100HJABCD:MOV R0,#40H MOV R1,#50H MOV R2,#04H LCALLDADD LJMP $以上為主程序BCDADD.ASM多字節(jié)BCD碼加法(P53)與多字節(jié)加法程序二、多字節(jié)減法 多字節(jié)減法程序和多字節(jié)加法程序類似,只需將加法指令換為減法指令即可。例:在43H~40H依次存放被減數(shù)443ADD7BH;在53H~50H中依次存放減數(shù)14DF35B8H,試編程求二者之差二、多字節(jié)減法 多字節(jié)減法程序和多字節(jié)加法程序類似,只需將
ORG 0000H LJMP JIAN ORG 0100HJIAN:MOV R0,#40H MOV R1,#50H MOV R2,#04H LCALLJIANSUB LJMP $
以上為主程序JIANSUB:CLR CJIAN1:MOV A,@R0 SUBB A,@R1 MOV @R0,A INC R0 INC R1 DJNZR2,JIAN1 RET END此程序也可以推廣到N個(gè)字節(jié)的情況。 ORG 0000HJIANSUB:CLR C四、多字節(jié)數(shù)乘法
MCS-51系列單片機(jī)指令系統(tǒng)僅能提供8位乘法指令若需進(jìn)行8位以上的乘法運(yùn)算,則需通過(guò)編程實(shí)現(xiàn)。設(shè)(R4)(R3)中為十六位被乘數(shù),R2中為8位乘數(shù),其積存放在R7R6R5中。由于(R4)(R3)*(R2)=[(R4)*256+(R3)]*(R2) =(R4)*(R2)*256+(R3)*R2R4R3BAR6R5R7BA+R2×(R4)*(R2)*256(R3)*(R2)四、多字節(jié)數(shù)乘法MCS-51系列單片機(jī)指令系CHENFA: MOV A,R2
MOV B,R3 MUL AB ;(R3)*(R2) MOV R5,A MOV R6,B MOV A,R2 MOV B,R4 MUL AB ;(R2)*(R4) ADD A,R6 MOV R6,A MOV A,B ADDC A,#00H;加進(jìn)位位 MOV R7,A RETCHENFA: MOV A,R2五、多字節(jié)除法
51指令系統(tǒng)提供一條8位的除法指令,但要想用于多位除法運(yùn)算則較為困難。因此,在進(jìn)行多字節(jié)除法運(yùn)算時(shí),多采用手工算法相同的思路。五、多字節(jié)除法51指令系統(tǒng)提供一條8位的除法§4-3數(shù)據(jù)的拆拼和轉(zhuǎn)換
在實(shí)際應(yīng)用中,經(jīng)常會(huì)遇到實(shí)際需要的數(shù)據(jù)格式同得到的數(shù)據(jù)格式不完全相符的情況,如采集到的數(shù)據(jù)、運(yùn)算的結(jié)果、輸出的數(shù)據(jù)等,這就需要對(duì)其進(jìn)行適當(dāng)?shù)霓D(zhuǎn)換,以符合實(shí)際情況的要求。這就是通常所說(shuō)的數(shù)據(jù)拆拼和轉(zhuǎn)換。一、數(shù)據(jù)的拆拼BBCD:MOV A,7CH ANL A,#0FH MOV R5,A MOV A,7CH
ANL A,#0F0H SWAP A MOV R6,A RET例:轉(zhuǎn)換前7CH中為壓縮BCD碼XY程序清單:0Y0X
轉(zhuǎn)換后R6R5中為非壓縮BCD碼§4-3數(shù)據(jù)的拆拼和轉(zhuǎn)換在實(shí)際應(yīng)用中,經(jīng)常例4-4-2拆拼前(20H)=X7X6X5X4X3X2X1X0 拆拼后(21H)=X0X1X2X3X4X5X6X7DESORT:MOVA,20H MOV R6,A MOV R7,#08HRESO:CLR C MOV A,R6 RLC A MOV R6,A MOV A,21H RRC A MOV 21H,ADJNZ R7,RESO RET A5A00A2A1A4A3A60000000A7A7A400A1A0A3A2A5A7000000A6A6例4-4-2拆拼前(20H)=X7X6X5X4X補(bǔ)充內(nèi)容例1:將20H單元的兩個(gè)壓縮BCD碼拆開變成ASCII碼,存入21H、22H單元。(假設(shè)20H中的BCD碼為00110100)什么是BCD碼?什么是ASCII碼?BCD碼與ASCII碼關(guān)系·········20H21H22HAB0011壓縮BCD碼001100110100低四位ASII碼高四位ASII碼壓縮BCD碼拆開變成ASCII碼補(bǔ)充內(nèi)容例1:將20H單元的兩個(gè)壓縮BCD碼拆開變成ASCI二進(jìn)制與ASCII碼的相互關(guān)系為:數(shù)字0~9對(duì)應(yīng)的ASCII碼為30H~39H,即加30H字母A~F對(duì)應(yīng)的ASCII碼為41H~46H,即加37H二進(jìn)制與ASCII碼的相互關(guān)系為:方法1:將BCD碼除以10H,恰好是將BCD碼分別移到了A、B的低4位。然后再各自與30H相或,即成為ASCII碼。方法2:利用半字節(jié)交換指令來(lái)實(shí)現(xiàn)。方法1:將BCD碼除以10H,恰好是將BCD碼分別移到了A、ORG0000HMOVA,20HMOVB,#10HDIVABORLB,#30HMOV22H,BORLA,#30HMOV21H,ASJMP$
開始(20H)A10HBA/B(A中為高4位BCD碼,B中為低4位BCD碼)B+30HBB(22H)A+30HAA(21H)結(jié)束簡(jiǎn)單程序例1---方法1源程序如下:·········20H21H22HAB00110100PCPCPC0011010000010000PC0011000000000100PC00110100PCPCPC0011PCORG0000H開始(20H)A10HBAORG0000HMOVR0,#20HMOVA,#30HXCHDA,@R0MOV22H,AMOVA,@R0SWAPAORLA,#30HMOV21H,ASJMP$簡(jiǎn)單程序例1---方法2
開始#20HR0#30HAA的低4位(20H)的低4位A(22H)(20H)AA的低4位A的高4位A(21H)結(jié)束A+30HAPCPCPCPCPCPCPCPCPC源程序如下:·········20H21H22HAR000110010000000110100000001000011010000110000001100000011PC0011
二、數(shù)據(jù)的轉(zhuǎn)換
在計(jì)算機(jī)內(nèi)部,任何數(shù)據(jù)都是以二進(jìn)制的形式存儲(chǔ),但是,當(dāng)我們?cè)谧鱅/O操作時(shí),往往需要其它形式的數(shù)據(jù)格式,如ASCII碼、BCD碼、八進(jìn)制數(shù)等,這就需要做一些數(shù)據(jù)格式的互換操作。1、ASCII碼到二進(jìn)制數(shù)的相互轉(zhuǎn)換二進(jìn)制與ASCII碼的相互關(guān)系為:數(shù)字0~9對(duì)應(yīng)的ASCII碼為30H~39H,即加30H字母A~F對(duì)應(yīng)的ASCII碼為41H~46H,即加37H(1)ASCII到二進(jìn)制的轉(zhuǎn)換通過(guò)以上介紹的二者之間的關(guān)系,不難畫出流程圖:二、數(shù)據(jù)的轉(zhuǎn)換在計(jì)算機(jī)內(nèi)部,任何數(shù)據(jù)都是以二開始取操作數(shù)清進(jìn)位標(biāo)志減30H差>9?轉(zhuǎn)換正確結(jié)束減07HY轉(zhuǎn)換正確NASCTOHEX: MOV A,R2 CLR C SUBB A,#30H MOV R2,ACJNEA,#0AH,NEXTNEXT:JC TOK SUBB A,#07H MOV R2,ATOK:
RET例4-4-3轉(zhuǎn)換前R2為ASCII碼,轉(zhuǎn)換后R2為二進(jìn)制開始取操作數(shù)清進(jìn)位標(biāo)志減30H差>9?轉(zhuǎn)換正確結(jié)束減07HY(2)二進(jìn)制到ASCII碼當(dāng)二進(jìn)制數(shù)<0AH時(shí),加30H即得相應(yīng)的ASCII,當(dāng)二進(jìn)制數(shù)介于0AH、0FH之間(包括0AH、0FH),則加37H即得到相應(yīng)的ASCII。(2)二進(jìn)制到ASCII碼當(dāng)二進(jìn)制數(shù)<0AH時(shí),加30H即得2、BCD碼與二進(jìn)制的相互轉(zhuǎn)換(1)BCD到二進(jìn)制的轉(zhuǎn)換3615=3*103+6*102+1*10+5=[(3*10+6)*10+1]*10+5由壓縮BCD碼到非壓縮BCD碼的轉(zhuǎn)換較為簡(jiǎn)單,在前面我們已經(jīng)涉及,在此不再重復(fù)。例:如下圖所示15H36H41H40H壓縮BCD碼3H6H1H5H43H42H41H40H非壓縮BCD碼1FH0EHR3R2二進(jìn)制數(shù)2、BCD碼與二進(jìn)制的相互轉(zhuǎn)換(1)BCD到二進(jìn)制的轉(zhuǎn)換36高位BCD碼的地址->(R0)計(jì)數(shù)初值3->(R7)初值送結(jié)果單元0->(R3)((R0))->(R2)(R3R2)*10->(R3R2)(R0)-1->(R0)(R3R2)+((R0))+(Cy)->(R3R2)(R7)-1=0?結(jié)束YN3615=3*103+6*102+1*10+5=[(3*10+6)*10+1]*10+5R3R23H6H1H5H43H42H41H40HR0高位BCD碼的地址->(R0)計(jì)數(shù)初值3->(R7)初值送
MOV R0,#43H ;指向高位 MOV R3,#00H ;結(jié)果單元清零 MOV A,@R0 MOV R2,A ;轉(zhuǎn)換初值送R2ML10: MOV A,R2 MOV B,#0AH MUL AB ;R2乘10 MOV R2,A ;暫存R2*10低位 MOV A,B XCH A,R3 ;暫存R2*10高位 MOV B,#0AH MUL AB ;R3*10 ADD A,R3 ;R3*10低位加 MOV R3,A ;為什么不處理BBCDHEX: MOV R7,#03H ;計(jì)數(shù)初值 MOV R0,#43H ;指向高位BCDHEX: MOV
MOV A,@R0 ADD A,R2 ;結(jié)果與低單元相加 MOV R2,A MOV A,R3 ADDC A,#00H ;加低位進(jìn)位位 MOV R3,A ;保存結(jié)果 DJNZ R7,ML10 RET
由于二位壓縮BCD碼的表示范圍為0~9999,其對(duì)應(yīng)二進(jìn)制為0~270H,不會(huì)超過(guò)兩個(gè)字節(jié),因而不必考慮R3*10的高位。JAFA: DEC R0 ;指向下一位 MOV A,@R0由于二位壓縮BCD碼的例:如下圖所示(2)二進(jìn)制到BCD的轉(zhuǎn)換15H36HR3R2二進(jìn)制數(shù)3H8H4H5H43H42H41H40H非壓縮BCD碼1H44H
如上圖所示,雙字節(jié)二進(jìn)制數(shù)的表示范圍為0~65535,因而需要5個(gè)BCD碼位來(lái)表示。從二進(jìn)制到BCD碼,我們采用連減的辦法,其原理如下:待轉(zhuǎn)換的二進(jìn)制數(shù)-104夠減,萬(wàn)位加1,再減不夠減,恢復(fù)余數(shù),再減103以此類推,直到得到個(gè)位為止。例:如下圖所示(2)二進(jìn)制到BCD的轉(zhuǎn)換15H36HR3104=2710H 103=03E8H 102=0064H 10=0AHBBCD:MOV R0,#44H ;數(shù)據(jù)指針 MOV R7,#04H ;計(jì)數(shù)初值 MOV DPTR,#PWTAB MOV R6,#00H ;偏移量BBC1: MOV A,R6 MOVCA,@A+DPTR MOV R4,A ;查冪值表低位 INC R6 MOV A,R6 MOVCA,@A+DPTR MOV R5,A ;查冪值高位 INC R6 MOV @R0,#00H104=2710H 103=03E8H 102=0064H
MOV A,R2 SUBB A,R4 ;減低位 MOV R2,A MOV A,R3 SUBB A,R5 ;減高位 MOV R3,A JC BBC3 ;不夠減則恢復(fù)余數(shù) INC @R0 ;夠減則結(jié)果單元加1 SJMP BBC2BBC3: MOV A,R2 ADD A,R4 ;恢復(fù)余數(shù)低位 MOV R2,A MOV A,R3 ADDC A,R5 ;恢復(fù)余數(shù)高位 MOV R3,ABBC2: CLR C MOV A,R2BBC2: CLR C
DJNZ R7,BBC1 ;未減完則繼續(xù) MOV A,R2 MOV @R0,A ;保存?zhèn)€位 RETPWTAB:DB 10H,27H ;10000 DB 0E8H,03H ;1000 DB 64H,00H ;100 DB 0AH,00H ;10
DEC R0 ;指向下一單元 DJNZ R7,BBC1 ;未減完則繼續(xù) DEC R0
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度高速公路LED顯示屏購(gòu)銷合同
- 2024年度智能機(jī)場(chǎng)行李處理系統(tǒng)供應(yīng)合同
- 2024年度軟件許可合同:CRM系統(tǒng)銷售管理專用
- DB4117T 221-2019 夏季番茄嫁接育苗技術(shù)規(guī)程
- DB4115T 046-2018 信陽(yáng)傳統(tǒng)風(fēng)味小吃烹飪技藝 金絲貢馓
- DB4114T 161-2021 甘薯機(jī)械化生產(chǎn)技術(shù)規(guī)程
- 押題08城鎮(zhèn)變化與區(qū)域發(fā)展-備戰(zhàn)2023年高考地理之考前押大題(解析版)
- 2024年房產(chǎn)交易協(xié)議模板
- 2024年商業(yè)門面租賃合同格式
- 2024年擔(dān)保公司債務(wù)契約匯編:個(gè)人與企業(yè)間借款協(xié)議指南
- 2024江蘇省沿海開發(fā)集團(tuán)限公司招聘23人高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 2024年計(jì)算機(jī)二級(jí)WPS考試題庫(kù)380題(含答案)
- 22G101三維彩色立體圖集
- 大學(xué)生安全文化智慧樹知到期末考試答案章節(jié)答案2024年中南大學(xué)
- 建筑施工安全生產(chǎn)治本攻堅(jiān)三年行動(dòng)方案(2024-2026年)
- 人教版小學(xué)英語(yǔ)單詞表(完整版)
- DL-T 1476-2023 電力安全工器具預(yù)防性試驗(yàn)規(guī)程
- 國(guó)家開放大學(xué)《心理健康教育》形考任務(wù)1-9參考答案
- MOOC 法理學(xué)-西南政法大學(xué) 中國(guó)大學(xué)慕課答案
- 《短視頻拍攝與制作》課件-3短視頻拍攝的三大技巧
- 【川教版】《生命 生態(tài) 安全》四上第11課《預(yù)防流感》課件
評(píng)論
0/150
提交評(píng)論