單片機(jī)及應(yīng)用第四章單片機(jī)匯編語言程序設(shè)計(jì)_第1頁
單片機(jī)及應(yīng)用第四章單片機(jī)匯編語言程序設(shè)計(jì)_第2頁
單片機(jī)及應(yīng)用第四章單片機(jī)匯編語言程序設(shè)計(jì)_第3頁
單片機(jī)及應(yīng)用第四章單片機(jī)匯編語言程序設(shè)計(jì)_第4頁
單片機(jī)及應(yīng)用第四章單片機(jī)匯編語言程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

單片機(jī)及應(yīng)用第四章單片機(jī)匯編語言程序設(shè)計(jì)第1頁,課件共70頁,創(chuàng)作于2023年2月4.1單片機(jī)程序設(shè)計(jì)語言概述4.1.1機(jī)器語言和匯編語言1、機(jī)器語言:直接用二進(jìn)制代碼指令表達(dá)的計(jì)算機(jī)語言。計(jì)算機(jī)可以直接識(shí)別,不需要進(jìn)行任何翻譯。每臺(tái)機(jī)器的指令,其格式和代碼所代表的含義都是硬性規(guī)定的。機(jī)器語言是其它各種程序設(shè)計(jì)語言的基礎(chǔ),但難記、難用、已出錯(cuò)。第2頁,課件共70頁,創(chuàng)作于2023年2月4.1.1機(jī)器語言和匯編語言2、匯編語言:用助記符和專門的語言規(guī)則表示指令的功能和特征的面向機(jī)器的程序設(shè)計(jì)語言。匯編語言是對(duì)機(jī)器語言的改進(jìn),比機(jī)器語言高級(jí)。匯編語言的最大優(yōu)點(diǎn)是助記符與機(jī)器指令一一對(duì)應(yīng)。用匯編語言編寫的程序占用存儲(chǔ)空間小,運(yùn)行速度快,程序效率高。此外,匯編語言能直接管理和控制硬件資源。

缺點(diǎn):比高級(jí)語言難記憶和使用,程序設(shè)計(jì)的技巧性較高,編程難度較大。要求使用者必須精通單片機(jī)的硬件系統(tǒng)和指令系統(tǒng)。缺乏通用性,程序不易移植。第3頁,課件共70頁,創(chuàng)作于2023年2月4.1.2單片機(jī)使用的高級(jí)語言對(duì)于8051單片機(jī),現(xiàn)有4種語言支持,即匯編、PL/M、C和BASIC。C語言應(yīng)用廣泛 移植性好; 開發(fā)效率高。

keilc51高級(jí)語言的不足: 生成的目標(biāo)代碼較長(zhǎng);

程序運(yùn)行速度較慢。

第4頁,課件共70頁,創(chuàng)作于2023年2月4.1.380C51單片機(jī)匯編語言的語句格式80C51匯編語言的語句格式如下:[<標(biāo)號(hào)>:]<操作碼>[<操作數(shù)>];[<注釋>]1.標(biāo)號(hào) 是語句地址的標(biāo)志符號(hào),標(biāo)號(hào)的幾點(diǎn)規(guī)定:1~8個(gè)ASCII字符組成,第一個(gè)字符必須是字母。不能使用本匯編語言已經(jīng)定義的符號(hào)作為標(biāo)號(hào)。標(biāo)號(hào)后面必須跟以冒號(hào)“:”。同一標(biāo)號(hào)在一個(gè)程序中只能定義一次。標(biāo)號(hào)可有可無。第5頁,課件共70頁,創(chuàng)作于2023年2月4.1.380C51單片機(jī)匯編語言的語句格式2.操作碼

用于規(guī)定語句執(zhí)行的操作內(nèi)容,用指令助記符表示。不能空缺。3.操作數(shù)操作數(shù)用于為指令操作提供數(shù)據(jù)??赡苡?~3個(gè)操作數(shù),各操作數(shù)之間以逗號(hào)分隔。第6頁,課件共70頁,創(chuàng)作于2023年2月4.注釋不屬于語句的功能部分,只是對(duì)語句的解釋說明,以“;”開頭。4.1.380C51單片機(jī)匯編語言的語句格式5.分界符(分隔符)用于把語句中的各部分隔開,以便于區(qū)分。分界符包括空格、冒號(hào)、分號(hào)或逗號(hào)等符號(hào)。第7頁,課件共70頁,創(chuàng)作于2023年2月4.2匯編語言程序的基本結(jié)構(gòu)形式四種基本結(jié)構(gòu)形式:順序程序結(jié)構(gòu)、分支程序結(jié)構(gòu)、循環(huán)程序結(jié)構(gòu)、子程序。4.2.1順序程序結(jié)構(gòu) 順序結(jié)構(gòu)程序是最簡(jiǎn)單的程序結(jié)構(gòu)。程序既無分支、循環(huán),也不調(diào)用子程序,程序執(zhí)行時(shí)一條接一條地按順序執(zhí)行指令。第8頁,課件共70頁,創(chuàng)作于2023年2月例13字節(jié)無符號(hào)數(shù)的加法運(yùn)算。其中被加數(shù)在內(nèi)部RAM的50H、51H和52H單元中;加數(shù)在內(nèi)部RAM的53H、54H和55H單元中;要求把相加之和存放在50H、51H和52H單元中,進(jìn)位存放在位尋址區(qū)的20H位中。4.2.1順序程序結(jié)構(gòu)我們一起來編寫程序。第9頁,課件共70頁,創(chuàng)作于2023年2月MOVR0,#52H ;被加數(shù)的低字節(jié)地址MOVR1,#55H ;加數(shù)的低字節(jié)地址MOVA,@R0ADDA,@R1 ;低字節(jié)相加MOV@R0,A ;存低字節(jié)相加結(jié)果DECR0DECR1MOVA,@R0ADDCA,@R1 ;中間字節(jié)帶進(jìn)位相加MOV@R0,A ;存中間字節(jié)相加結(jié)果DECR0DECR1MOVA,@R0ADDCA,@R1 ;高字節(jié)帶進(jìn)位相加MOV@R0,A ;存高字節(jié)相加結(jié)果MOV20H,C ;存放進(jìn)位的單元地址4.2.1順序程序結(jié)構(gòu)第10頁,課件共70頁,創(chuàng)作于2023年2月分支結(jié)構(gòu)也稱為選擇結(jié)構(gòu)。要分支,就要用條件或變址尋址轉(zhuǎn)移指令,就要有地址標(biāo)號(hào)。分支結(jié)構(gòu)又可分為單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。4.2.2分支程序結(jié)構(gòu)1.單分支程序結(jié)構(gòu)單分支程序結(jié)構(gòu)即二中選一,通過條件判斷實(shí)現(xiàn),條件成立一支,條件不成立一支。

例2假定在外部RAM中有ST1、ST2和ST3三個(gè)連續(xù)單元,其中ST1和ST2單元中存放著兩個(gè)無符號(hào)二進(jìn)制數(shù),試找出其中的大數(shù)并存入ST3單元中。

第11頁,課件共70頁,創(chuàng)作于2023年2月1.單分支程序結(jié)構(gòu)4.2.2分支程序結(jié)構(gòu) MOVDPTR,#ST1 ;設(shè)置數(shù)據(jù)指針

MOVXA,@DPTR ;取第1個(gè)數(shù)

MOVR2,A ;第1個(gè)數(shù)存于R2 INCDPTR ;數(shù)據(jù)指針加1 MOVXA,@DPTR ;取第2個(gè)數(shù)

CLRC ;進(jìn)位位清0

CJNEA,R2,NEXT ;兩數(shù)比較

JNCBIGER ;若第2個(gè)數(shù)不小,則轉(zhuǎn)向BIGER XCHA,R2 ;若第1個(gè)數(shù)大,則整字節(jié)交換BIGER:INCDPTR MOVX@DPTR,A ;存大數(shù)第12頁,課件共70頁,創(chuàng)作于2023年2月1.單分支程序結(jié)構(gòu)例3假定采集的溫度值Ta放在累加器A中。此外,在內(nèi)部RAM54H單元存放溫度下限值T54,在55H單元存放溫度上限值T55。若Ta>T55,程序轉(zhuǎn)向JW(降溫處理程序);若Ta<T54,則程序轉(zhuǎn)向SW(升溫處理程序);若T55≥Ta≥T54,則程序轉(zhuǎn)向FH(返回主程序)。4.2.2分支程序結(jié)構(gòu)第13頁,課件共70頁,創(chuàng)作于2023年2月1.單分支程序結(jié)構(gòu)TC:CJNEA,55H,LOOP1 ;若Ta≠T55,則轉(zhuǎn)向LOOP1 AJMPFH ;若Ta=T55,則返回LOOP1:JNCJW

;若(CY)=0,表明Ta>T55,轉(zhuǎn)降溫處理程序 CJNEA,54H,LOOP2 ;若Ta≠T54,則轉(zhuǎn)向LOOP2 AJMPFH ;若Ta=T54,則返回LOOP2:JCSW

;若(CY)=1,表明Ta<T54,轉(zhuǎn)升溫處理程序FH:RET ;若T55≥Ta≥T54,則返回主程序4.2.2分支程序結(jié)構(gòu)該例為多重單分支結(jié)構(gòu),通過一系列條件判斷,進(jìn)行逐級(jí)分支。多重單分支結(jié)構(gòu)多使用數(shù)值比較轉(zhuǎn)移指令CJNE實(shí)現(xiàn)。第14頁,課件共70頁,創(chuàng)作于2023年2月2.多分支程序結(jié)構(gòu)

4.2.2分支程序結(jié)構(gòu)第15頁,課件共70頁,創(chuàng)作于2023年2月2.多分支程序結(jié)構(gòu)與多重單分支結(jié)構(gòu)的不同:多重單分支結(jié)構(gòu)在不同的區(qū)域做不同的事情;多分支結(jié)構(gòu)在不同的點(diǎn)上做不同的事情。多分支結(jié)構(gòu)多用變址尋址轉(zhuǎn)移指令“JMP@A+DPTR”實(shí)現(xiàn),且需要有數(shù)據(jù)表格配合;多重單分支結(jié)構(gòu)多使用數(shù)據(jù)比較轉(zhuǎn)移指令CJNE實(shí)現(xiàn)。

4.2.2分支程序結(jié)構(gòu)第16頁,課件共70頁,創(chuàng)作于2023年2月(1)通過地址偏移表實(shí)現(xiàn)程序多分支設(shè)分支序號(hào)存放在片內(nèi)RAMADDRi單元中,示例程序如下: MOVA,ADDRi ;分支序號(hào)i送A MOVDPTR,#BRTAB ;地址表首址送DPTR MOVCA,@A+DPTR ;取偏移量 JMP@A+DPTR ;轉(zhuǎn)相應(yīng)分支BRTAB:DBBR0-BRTAB ;地址偏移表 DBBR1-BRTAB DBBRn-BRTABBR0: … ;分支程序BR1: …BRn: …4.2.2分支程序結(jié)構(gòu)

2.多分支程序結(jié)構(gòu)第17頁,課件共70頁,創(chuàng)作于2023年2月(2)通過轉(zhuǎn)移指令表實(shí)現(xiàn)程序多分支

MOVA,ADDRi RLA ;分支序號(hào)值乘以2 MOVDPTR,#BRTAB ;轉(zhuǎn)移指令表首址 JMP@A+DPTRBRTAB: AJMPBR0 ;轉(zhuǎn)分支程序0 AJMPBR1 ;轉(zhuǎn)分支程序1 …… AJMPBR127 ;轉(zhuǎn)分支程序1274.2.2分支程序結(jié)構(gòu)

2.多分支程序結(jié)構(gòu)第18頁,課件共70頁,創(chuàng)作于2023年2月(3)其他實(shí)現(xiàn)程序多分支的方法例4用RET指令實(shí)現(xiàn)多分支程序

MOVDPTR,#BRTAB ;分支入口地址表首址 MOVA,ADDRi RLA ;分支轉(zhuǎn)移值乘以2 MOVR1,A ;暫存到R1 INCA MOVCA,@A+DPTR ;取低位地址 PUSHACC ;低位地址入棧 MOVA,R1 ;恢復(fù)A值 MOVCA,@A+DPTR ;取高位地址 PUSHACC ;高位地址入棧 RET ;分支入口地址裝入PCBRTAB: DWBR0 ;分支程序入口地址表 DWBR1 …… DWBR1274.2.2分支程序結(jié)構(gòu)

2.多分支程序結(jié)構(gòu)第19頁,課件共70頁,創(chuàng)作于2023年2月4.2.3循環(huán)程序結(jié)構(gòu)循環(huán)就是重復(fù)執(zhí)行某個(gè)程序段。匯編語言通常使用減1條件轉(zhuǎn)移指令來實(shí)現(xiàn)和控制循環(huán)。4.2匯編語言程序的基本結(jié)構(gòu)形式前章例18將內(nèi)部RAM從DATA單元開始的10個(gè)無符號(hào)數(shù)相加,相加結(jié)果送SUM單元保存。

MOVR0,#0AH;設(shè)置循環(huán)次數(shù)

MOVR1,#DATA;R1作地址指針,指向數(shù)據(jù)塊首地址

CLRA ;A清零LOOP:ADDA,@R1;加一個(gè)數(shù)

INCR1 ;修改指針,指向下一個(gè)數(shù)

DJNZR0,LOOP;R0減1,不為0循環(huán)

MOVSUM,A;存10個(gè)數(shù)相加的和第20頁,課件共70頁,創(chuàng)作于2023年2月4.2.3循環(huán)程序結(jié)構(gòu)循環(huán)程序由初始化和循環(huán)體兩部分組成。初始化:指針、計(jì)數(shù)器和累加器等循環(huán)體是循環(huán)程序的主體,是反復(fù)執(zhí)行的動(dòng)作。例5通過查找結(jié)束標(biāo)志(回車符)來統(tǒng)計(jì)字符串長(zhǎng)度的循環(huán)程序。分析:假定字符串存放在內(nèi)部RAM從40H單元開始的連續(xù)存儲(chǔ)單元中。為找到結(jié)束標(biāo)志,應(yīng)采用逐個(gè)字符依次與回車符(ASCII碼0DH)比較的方法。同時(shí)在程序中還應(yīng)設(shè)置一個(gè)字符串指針以順序定位字符,設(shè)置一個(gè)字符長(zhǎng)度計(jì)數(shù)器以累計(jì)字符個(gè)數(shù)。第21頁,課件共70頁,創(chuàng)作于2023年2月 MOVR2,#0FFH ;設(shè)置長(zhǎng)度計(jì)數(shù)器初值 MOVR0,#3FH ;設(shè)置字符串指針初值LOOP:INCR2 INCR0 CJNE@R0,#0DH,LOOP

4.2.3循環(huán)程序結(jié)構(gòu)第22頁,課件共70頁,創(chuàng)作于2023年2月例6多字節(jié)無符號(hào)數(shù)相加。4.2.3循環(huán)程序結(jié)構(gòu)分析:設(shè)被加數(shù)與加數(shù)分別在以ADR1與ADR2為初址的片內(nèi)數(shù)據(jù)存儲(chǔ)器區(qū)域中,自低字節(jié)起,由低到高依次存放;它們的字節(jié)數(shù)為L(zhǎng),要求加得的和放回被加數(shù)的單元。流程框圖如右。第23頁,課件共70頁,創(chuàng)作于2023年2月

MOVR0,#ADR1 MOVR1,#ADR2 MOVR2,#L CLRCLOOP:MOVA,@R0 ;通過R0間址,取得被加數(shù)的一個(gè)字節(jié)

ADDCA,@R1 ;通過R1間址,取得加數(shù)的一個(gè)字 ;節(jié),與被加數(shù)的相應(yīng)字節(jié)相加

MOV@R0,A ;加得的和通過R0間址放回原被加數(shù)單元

INCR0 ;修改指針,指向下一個(gè)相加的數(shù)

INCR1 DJNZR2,LOOP ;循環(huán)實(shí)現(xiàn)多字節(jié)數(shù)相加4.2.3循環(huán)程序結(jié)構(gòu)第24頁,課件共70頁,創(chuàng)作于2023年2月4.2.4子程序結(jié)構(gòu)4.2匯編語言程序的基本結(jié)構(gòu)形式前章例3“用查表法把累加器中的十六進(jìn)指數(shù)轉(zhuǎn)換為ASCII碼的程序”也是按子程序設(shè)計(jì)的。

HBA:INCA MOVCA,@A+PC RET ;十六進(jìn)制數(shù)ASCII碼表

DB30H,31H,…,39H,41H, 42H,…,46H第25頁,課件共70頁,創(chuàng)作于2023年2月4.2.4子程序結(jié)構(gòu)子程序的組成:程序名:就是標(biāo)號(hào),位于第一條可執(zhí)行指令前。主程序以該名調(diào)用它。程序體:規(guī)定要做的事情。返回語句RET。參數(shù):在結(jié)構(gòu)上看不出來,也可以沒有。通過參數(shù)傳送信息。參數(shù)可通過寄存器、存儲(chǔ)單元或堆棧傳送。第26頁,課件共70頁,創(chuàng)作于2023年2月4.380C51單片機(jī)匯編語言程序設(shè)計(jì)舉例4.3.1算術(shù)運(yùn)算程序1.加減法運(yùn)算(1)多個(gè)不帶符號(hào)的單字節(jié)數(shù)相加例7假設(shè)有多個(gè)單字節(jié)數(shù),依次存放在外部RAM21H開始的連續(xù)單元中,要求把計(jì)算結(jié)果存放在R1和R2中(假定相加的和不超過2字節(jié)數(shù))。其中R1為高位字節(jié)。第27頁,課件共70頁,創(chuàng)作于2023年2月 MOVDPTR,#21H ;設(shè)置數(shù)據(jù)指針 MOVR3,#N ;字節(jié)個(gè)數(shù) MOVR1,#00H ;和的高位字節(jié)清0 MOVR2,#00H ;和的低位字節(jié)清0LOOP: MOVXA,@DPTR ;取一個(gè)加數(shù) ADDA,R2 ;單字節(jié)數(shù)相加 MOVR2,A ;和的低8位送R2 JNCLOOP1 INCR1 ;有進(jìn)位,則和的高8位加1LOOP1: INCR0 ;指向下一個(gè)單元 DJNZR3,LOOP第28頁,課件共70頁,創(chuàng)作于2023年2月

4.3.1算術(shù)運(yùn)算程序

1.加減法運(yùn)算(2)兩個(gè)不帶符號(hào)的多字節(jié)數(shù)相減例8設(shè)有兩個(gè)N字節(jié)數(shù)分別存放在內(nèi)部RAM單元中,低字節(jié)在前,高字節(jié)在后,分別由R0指定被減數(shù)單元地址,由R1指定減數(shù)單元地址,其差存放在原被減數(shù)單元中。第29頁,課件共70頁,創(chuàng)作于2023年2月

4.3.1算術(shù)運(yùn)算程序

1.加減法運(yùn)算MSUB:CLRC ;清進(jìn)位位 MOVR2,#N ;設(shè)定字節(jié)數(shù)LOOP:MOVA,@R0;從低字節(jié)開始逐個(gè)取被減數(shù)字節(jié) SUBBA,@R1 ;兩數(shù)相減 MOV@R0,A ;存字節(jié)相減的差 INCR0 INCR1 DJNZR2,LOOP;減法是否完成 RET第30頁,課件共70頁,創(chuàng)作于2023年2月2.乘法運(yùn)算

4.3.1算術(shù)運(yùn)算程序例9假定要進(jìn)行兩個(gè)雙字節(jié)無符號(hào)數(shù)的乘法運(yùn)算,被乘數(shù)和乘數(shù)分別存放于寄存器R2、R3和R6、R7中(其中R2和R6分別為高位字節(jié)),相乘的結(jié)果(積)依次存放在R4、R5、R6、R7單元中。試編寫程序?qū)崿F(xiàn)該乘法運(yùn)算。分析:因?yàn)槌藬?shù)和被乘數(shù)各為2字節(jié),因此,必須進(jìn)行4次乘法運(yùn)算,得到4次部分乘積。部分積的高字節(jié)用H標(biāo)識(shí),部分積低字節(jié)用L標(biāo)識(shí)。此外,還要處理部分積相加產(chǎn)生的進(jìn)位。其豎式運(yùn)算如下頁示意圖。第31頁,課件共70頁,創(chuàng)作于2023年2月兩個(gè)雙字節(jié)無符號(hào)數(shù)乘法示意圖第32頁,課件共70頁,創(chuàng)作于2023年2月DBMUL: MOVA,R3 MOVB,R7 MULAB;R3×R7(得第1次部分積) XCHA,R7;原R7內(nèi)容送A,R7←R3R7L MOVR5,B;R5←R3R7H MOVB,R2 MULAB;R2×R7(得第2次部分積) ADDA,R5;R2R7L+R3R7H MOVR4,A;R4←和 CLRA ADDCA,B;R2R7H+(R2R7L+R5時(shí)產(chǎn)生的進(jìn)位) MOVR5,A;R5←和 MOVA,R6 MOVB,R3 MULAB;R3×R6(得第3次部分積) ADDA,R4;R3R6L+R4第33頁,課件共70頁,創(chuàng)作于2023年2月XCHA,R6 ;A←R6,R6←R3R6L+R4(在R6中得到乘積的 ;第3字節(jié))XCHA,B ;A←R3R6H,B←R6ADDCA,R5 ;R3R6H+R5+(R3R6L+R4時(shí)產(chǎn)生的進(jìn)位)MOVR5,A ;R5←和MOVF0,C ;F0←進(jìn)位MOVA,R2MULAB ;R2×R6(得第4次部分積)ADDA,R5 ;R2R6L+R5MOVR5,A ;在R5中得到乘積的第2字節(jié)CLRAMOVACC.0,C ;累加器最高位←進(jìn)位MOVC,F0ADDCA,B ;R2R6H+F0+ACC.0MOVR4,A ;在R4中得到乘積的第1字節(jié)RET第34頁,課件共70頁,創(chuàng)作于2023年2月4.3.1算術(shù)運(yùn)算程序例10試編寫程序?qū)崿F(xiàn)雙字節(jié)無符號(hào)的數(shù)除法運(yùn)算。3.除法運(yùn)算按主程序設(shè)計(jì): 輸入?yún)?shù):R7R6:被除數(shù),R5R4:除數(shù); 輸出參數(shù):R7R6:商, R5R4:余數(shù),

F0:溢出標(biāo)志(1:溢出,0:未溢出)。第35頁,課件共70頁,創(chuàng)作于2023年2月4.3.1算術(shù)運(yùn)算程序

3.除法運(yùn)算算法分析:①能否象乘法那樣利用單字節(jié)除法指令DIVAB來實(shí)現(xiàn)2字節(jié)數(shù)的除法呢?不能。只能用豎式計(jì)算,一位一位地計(jì)算,如下圖。第36頁,課件共70頁,創(chuàng)作于2023年2月4.3.1算術(shù)運(yùn)算程序

3.除法運(yùn)算算法分析:②2字節(jié)除法運(yùn)算是按位進(jìn)行的。2個(gè)字節(jié),16個(gè)二進(jìn)制位,要試商16次,做16次減法、16次移位。如果用循環(huán)程序?qū)崿F(xiàn),要循環(huán)16次,每循環(huán)1次,做1次試商、1次減法、1次移位。我們把循環(huán)次數(shù)存放在R1中。第37頁,課件共70頁,創(chuàng)作于2023年2月4.3.1算術(shù)運(yùn)算程序

3.除法運(yùn)算算法分析:③豎式運(yùn)算,減數(shù)右移位。計(jì)算機(jī)中,減數(shù)不動(dòng),余數(shù)左移位(為什么?)。我們把余數(shù)存放在R3R2中(為什么不能直接存放在R5R4中?)。第38頁,課件共70頁,創(chuàng)作于2023年2月4.3.1算術(shù)運(yùn)算程序

3.除法運(yùn)算

首次試商在最高位,前面需補(bǔ)15個(gè)0。如果把余數(shù)R3R2初始化為0,把余數(shù)和被除數(shù)R3R2R7R6一起左移一位,再進(jìn)行試商,做減法,正好可以通過R3R2-R5R4實(shí)現(xiàn)。夠減,商1;不夠減,商0。商0,余數(shù)R3R2不變;商1,余數(shù)R3R2為相減之差。商放在哪里呢?移位后,被除數(shù)R7R6的最低位不再有意義,商可以放在這位。

這樣,移位、余數(shù)減除數(shù)、修改余數(shù)、存放商,循環(huán)16次,除法完成,被除數(shù)已全部移到余數(shù)R3R2中,并逐次被減得到最終余數(shù),被除數(shù)R7R6已被16位商所代替。算法分析:第39頁,課件共70頁,創(chuàng)作于2023年2月4.3.1算術(shù)運(yùn)算程序

3.除法運(yùn)算算法分析:④除法運(yùn)算需要對(duì)被除數(shù)和除數(shù)進(jìn)行判定:若除數(shù)為0,則除法無法進(jìn)行,置標(biāo)志位F0為1。若被除數(shù)為0,除數(shù)不為0,則商為0,立即結(jié)束。下頁給出2字節(jié)數(shù)除法運(yùn)算的流程圖。

第40頁,課件共70頁,創(chuàng)作于2023年2月4.3.1算術(shù)運(yùn)算程序

3.除法運(yùn)算第41頁,課件共70頁,創(chuàng)作于2023年2月TB_DIV:CLRF0 ;清溢出標(biāo)志單元MOVA,R5JNZZERO ;若除數(shù)不為0,則跳轉(zhuǎn)MOVA,R4JNZZERO ;若除數(shù)不為0,則跳轉(zhuǎn)SETBF0 ;除數(shù)為0,設(shè)置溢出標(biāo)志RETZERO:MOVA,R7JNZSTART ;若被除數(shù)高字節(jié)不為0,則開始除法運(yùn)算MOVA,R6JNZSTART ;若被除數(shù)低字節(jié)不為0,則開始除法運(yùn)算MOVR4,#0 ;若被除數(shù)為0,余數(shù)清0MOVR5,#0RET ;結(jié)束,返回第42頁,課件共70頁,創(chuàng)作于2023年2月START:CLRA ;開始除法運(yùn)算MOVR2,A ;余數(shù)單元清0MOVR3,AMOVR1,#10HLOOP:CLRC ;進(jìn)行一位除法運(yùn)算MOVA,R6RLCA ;被除數(shù)左移一位MOVR6,AMOVA,R7RLCAMOVR7,AMOVA,R2 ;移出的被除數(shù)高位送余數(shù)單元RLCAMOVR2,AMOVA,R3RLCA第43頁,課件共70頁,創(chuàng)作于2023年2月MOVR3,AMOVA,R2 ;余數(shù)減除數(shù),低位先減SUBBA,R4MOVR0,A ;保存低位相減結(jié)果MOVA,R3 ;再減高位SUBBA,R5JCNEXT ;若不夠減,則轉(zhuǎn)移INCR6 ;若夠減,則商為1MOVR3,A

;相減結(jié)果送回余數(shù)單元MOVA,R0MOVR2,ANEXT:DJNZR1,LOOP ;不夠16次,繼續(xù)第44頁,課件共70頁,創(chuàng)作于2023年2月MOVA,R3 ;余數(shù)送輸出寄存器R5R4MOVR5,AMOVA,R2MOVR4,ARET第45頁,課件共70頁,創(chuàng)作于2023年2月4.3.1算術(shù)運(yùn)算程序

3.除法運(yùn)算

匯編應(yīng)用除法運(yùn)算比較復(fù)雜,程序比較長(zhǎng)。我們可以把其中的移位和試商(即余數(shù)減除數(shù)、修改余數(shù)、存放商)分別編寫成子程序,而在除法程序中進(jìn)行調(diào)用。第46頁,課件共70頁,創(chuàng)作于2023年2月4.3.1算術(shù)運(yùn)算程序

3.除法運(yùn)算移位子程序SHIFTL:輸入?yún)?shù):R3R2R7R6:4字節(jié)無符號(hào)數(shù);輸出參數(shù):R3R2R7R6:4字節(jié)無符號(hào)數(shù)。SHIFTL:CLRC MOVA,R6 RLCA MOVR6,A MOVA,R7 RLCA MOVR7,A MOVA,R2

RLCA MOVR2,A MOVA,R3 RLCA MOVR3,A RET第47頁,課件共70頁,創(chuàng)作于2023年2月4.3.1算術(shù)運(yùn)算程序

3.除法運(yùn)算試商子程序RES1BIT:輸入?yún)?shù):R5R4:除數(shù),

R3R2:余數(shù),

CY,R6[0]:0;輸出參數(shù):R3R2:余數(shù), R6[0]:一位商。第48頁,課件共70頁,創(chuàng)作于2023年2月4.3.1算術(shù)運(yùn)算程序

3.除法運(yùn)算RES1BIT: MOVA,R2 ;余數(shù)減除數(shù),低位先減

SUBBA,R4 MOVR0,A ;保存低位相減結(jié)果

MOVA,R3 ;再減高位

SUBBA,R5 JCSHANG0 ;若不夠減,商0,返回

INCR6 ;若夠減,則商為1 MOVR3,A

;相減結(jié)果送回余數(shù)單元

MOVA,R0 MOVR2,ASHANG0: RET第49頁,課件共70頁,創(chuàng)作于2023年2月4.3.1算術(shù)運(yùn)算程序

3.除法運(yùn)算原除法程序改寫為第50頁,課件共70頁,創(chuàng)作于2023年2月TB_DIV:CLRF0 ;清溢出標(biāo)志單元MOVA,R5JNZZERO ;若除數(shù)不為0,則跳轉(zhuǎn)MOVA,R4JNZZERO ;若除數(shù)不為0,則跳轉(zhuǎn)SETBF0 ;除數(shù)為0,設(shè)置溢出標(biāo)志RETZERO:MOVA,R7JNZSTART ;若被除數(shù)高字節(jié)不為0,則開始除法運(yùn)算MOVA,R6JNZSTART ;若被除數(shù)低字節(jié)不為0,則開始除法運(yùn)算MOVR4,#0 ;若被除數(shù)為0,余數(shù)清0MOVR5,#0RET ;結(jié)束,返回第51頁,課件共70頁,創(chuàng)作于2023年2月4.3.1算術(shù)運(yùn)算程序

3.除法運(yùn)算START:CLRA ;開始除法運(yùn)算

MOVR2,A ;余數(shù)單元清0 MOVR3,A MOVR1,#10HLOOP:ACALLSHIFTL ACALLRES1BITNEXT:DJNZR1,LOOP ;不夠16次,繼續(xù)

MOVA,R3 ;余數(shù)送輸出寄存器R5R4 MOVR5,A MOVA,R2 MOVR4,A RET第52頁,課件共70頁,創(chuàng)作于2023年2月4.3.1算術(shù)運(yùn)算程序

3.除法運(yùn)算任務(wù):試編寫一個(gè)4字節(jié)無符號(hào)數(shù)的除法程序。第53頁,課件共70頁,創(chuàng)作于2023年2月4.3.2定時(shí)程序在單片機(jī)的控制應(yīng)用中經(jīng)常有定時(shí)的需要,例如定時(shí)檢測(cè)和定時(shí)掃描等。定時(shí)功能除可使用定時(shí)器/計(jì)數(shù)器外,還可以使用程序?qū)崿F(xiàn)。4.380C51單片機(jī)匯編語言程序設(shè)計(jì)舉例1.單循環(huán)定時(shí)程序

MOVR5,#TIMELOOP:NOPNOPDJNZR5,LOOP第54頁,課件共70頁,創(chuàng)作于2023年2月4.3.2定時(shí)程序1.單循環(huán)定時(shí)程序NOP指令的機(jī)器周期為1,DJNZ指令的機(jī)器周期為2,則一次循環(huán)共4個(gè)機(jī)器周期。若單片機(jī)的晶振頻率為6MHz,則一個(gè)機(jī)器周期是2μs,因此,一次循環(huán)的延遲時(shí)間為8μs。定時(shí)程序的總延遲時(shí)間是循環(huán)程序段延時(shí)時(shí)間的整數(shù)倍,故該程序的延遲時(shí)間為8×TIME(μs)。TIME是裝入寄存器R5的時(shí)間常數(shù),R5是8位寄存器,因此,這個(gè)程序的最長(zhǎng)定時(shí)時(shí)間(不計(jì)“MOVR5,#TIME”指令)為:256×8μs=2048μs。4.380C51單片機(jī)匯編語言程序設(shè)計(jì)舉例第55頁,課件共70頁,創(chuàng)作于2023年2月2.較長(zhǎng)時(shí)間的定時(shí)程序單循環(huán)定時(shí)程序的時(shí)間延遲比較小。要加長(zhǎng)定時(shí)時(shí)間,可以采用多重循環(huán)程序。4.3.2定時(shí)程序 MOVR5,#TIME1LOOP2:MOVR4,#TIME2LOOP1:NOP NOP DJNZR4,LOOP1 DJNZR5,LOOP2 RET本程序的最大定時(shí)時(shí)間及計(jì)算公式為:(256×4μs+2μs+1μs)×256×2+4μs=525828μs第56頁,課件共70頁,創(chuàng)作于2023年2月3.定時(shí)程序的時(shí)間調(diào)整在定時(shí)程序中可通過增減指令的方法對(duì)定時(shí)時(shí)間進(jìn)行微調(diào)。譬如右邊的程序,在6MHz晶振頻率下的定時(shí)時(shí)間為10×TIME(μs)。如果要求定時(shí)時(shí)間為24μs,無論TIME取何值均得不到要求的定時(shí)時(shí)間。 MOVR0,#TIMELOOP:NOP NOP NOP DJNZR0,LOOP4.3.2定時(shí)程序第57頁,課件共70頁,創(chuàng)作于2023年2月3.定時(shí)程序的時(shí)間調(diào)整對(duì)此可通過在循環(huán)體內(nèi)增加一條NOP指令(見右邊調(diào)整后的程序)的方法,把循環(huán)程序段的機(jī)器周期數(shù)增加到6。這時(shí)只要TIME取值為2,就可以得到精確的24μs定時(shí)了。調(diào)整后的程序: MOVR0,#TIMELOOP:NOP NOP NOP NOP DJNZR0,LOOP4.3.2定時(shí)程序第58頁,課件共70頁,創(chuàng)作于2023年2月4.通過一個(gè)基本延時(shí)程序產(chǎn)生不同的定時(shí)例如,要求的定時(shí)時(shí)間分別為5s、10s和20s,已有一個(gè)1s的基本延時(shí)程序DELAY,則不同定時(shí)的調(diào)用情況如下。4.3.2定時(shí)程序

MOVR0,#05H ;5s延時(shí)LOOP1:LCALLDELAY DJNZR0,LOOP1 MOVR0,#0AH ;10s延時(shí)LOOP2:LCALLDELAY DJNZR0,LOOP2 MOVR0,#14H ;20s延時(shí)LOOP3:LCALLDELAY DJNZR0,LOOP3第59頁,課件共70頁,創(chuàng)作于2023年2月4.3.3查表程序1.查表指令按順序讀出存儲(chǔ)器中的數(shù)據(jù)稱為查表。80C51指令系統(tǒng)中有兩條專用的查表指令: MOVCA,@A+DPTR MOVCA,@A+PC這兩條MOVC指令在指令系統(tǒng)中稱為“程序存儲(chǔ)器讀指令”。它們的功能完全相同,使用時(shí)先確定好PC或DPTR的內(nèi)容,然后只需有規(guī)律地改變A的內(nèi)容,就可以從程序存儲(chǔ)器中讀出表格數(shù)據(jù)。4.380C51單片機(jī)匯編語言程序設(shè)計(jì)舉例第60頁,課件共70頁,創(chuàng)作于2023年2月2.查表程序舉例假定有4×4鍵盤,鍵掃描后把被按鍵的鍵碼放在累加器A中,鍵碼值與鍵處理子程序入口地址的對(duì)應(yīng)關(guān)系為:

鍵碼值 入口地址 0 RK0 1 RK1 2 RK2 假定鍵處理子程序在ROM64KB的范圍內(nèi)分布。要求以查表方法,按鍵碼值轉(zhuǎn)向?qū)?yīng)的鍵處理子程序。4.3.3查表程序第61頁,課件共70頁,創(chuàng)作于2023年2月我們用轉(zhuǎn)移指令表來實(shí)現(xiàn)鍵處理子程序。4.3.3查表程序KEYPROC:

MOVDPTR,#BS ;轉(zhuǎn)移指令表首址送DPTR MOVR2,A ;A*3 RLA ADDA,R2 JMP@A+DPTR BS: LJMPRK0 LJMPRK1 LJMPRK2第62頁,課件共70頁,創(chuàng)作于2023年2月編輯:編寫和修改程序的過程。匯編語言源程序:用匯編語言編寫的程序稱為匯編語言源程序。匯編:匯編語言源程序不能在單片機(jī)中直接執(zhí)行,必須將其“翻譯”為用二進(jìn)制代碼(機(jī)器語言)表示的目標(biāo)程序才能執(zhí)行。這個(gè)“翻譯”過程稱為匯編。

4.4單片機(jī)匯編語言源程序的編輯和匯編第63頁,課件共70頁,創(chuàng)作于2023年2月4.4.1手工編程與匯編手工編程:用筆和紙手工編寫和修改程序的過程。手工匯編:把匯編語言源程序用手工方法逐條“翻譯”成機(jī)器代碼的過程。手工匯編通常通過查表的方法進(jìn)行“翻譯”。4

溫馨提示

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