版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第第4 4章章 AT89C51AT89C51匯編語匯編語 言程序設(shè)計(jì)言程序設(shè)計(jì)12內(nèi)容概要內(nèi)容概要匯編語言能匯編語言能直接控制單片機(jī)硬件直接控制單片機(jī)硬件的的編程語言編程語言。因此,要求程序設(shè)計(jì)者要因此,要求程序設(shè)計(jì)者要 “軟、硬結(jié)合軟、硬結(jié)合” 。本章介紹匯編語言程序設(shè)計(jì)的本章介紹匯編語言程序設(shè)計(jì)的基本知識(shí)基本知識(shí), ,以及一些以及一些基本基本的程序設(shè)計(jì)的程序設(shè)計(jì)。4.1 匯編語言程序設(shè)計(jì)概述匯編語言程序設(shè)計(jì)概述程序是指令的有序集合。程序是指令的有序集合。單片機(jī)運(yùn)行就是執(zhí)行指令序列的過程。單片機(jī)運(yùn)行就是執(zhí)行指令序列的過程。編寫這一指令序列的過程稱為編寫這一指令序列的過程稱為程序設(shè)計(jì)。程序設(shè)計(jì)
2、。4.1.1 4.1.1 單片機(jī)編程語言單片機(jī)編程語言常用的編程語言是常用的編程語言是匯編語言匯編語言和和高級(jí)語言高級(jí)語言。1 1匯編語言匯編語言用英文字符來代替機(jī)器語言,這些英文字符被稱為用英文字符來代替機(jī)器語言,這些英文字符被稱為助記符匯助記符匯編語言:編語言:用助記符表示的指令。用助記符表示的指令。優(yōu)點(diǎn):優(yōu)點(diǎn):用匯編語言編寫程序效率高,占用存儲(chǔ)空間小,運(yùn)行用匯編語言編寫程序效率高,占用存儲(chǔ)空間小,運(yùn)行速度快,能編寫出最優(yōu)化的程序,速度快,能編寫出最優(yōu)化的程序,缺點(diǎn):缺點(diǎn):可讀性差,離不開具體的硬件,是面向可讀性差,離不開具體的硬件,是面向“硬件硬件”的語的語言通用性差。言通用性差。32
3、2高級(jí)語言高級(jí)語言不受具體不受具體“硬件硬件”的限制,的限制,優(yōu)點(diǎn):優(yōu)點(diǎn):通用性強(qiáng),直觀、易懂、通用性強(qiáng),直觀、易懂、易學(xué),可讀性好。易學(xué),可讀性好。目前多數(shù)的目前多數(shù)的51單片機(jī)用戶單片機(jī)用戶使用使用C語言(語言(C51)來進(jìn)行程序設(shè)來進(jìn)行程序設(shè)計(jì)計(jì),但在對(duì),但在對(duì)程序的程序的空間空間和和時(shí)間時(shí)間要求較高的場合,匯編語言仍必要求較高的場合,匯編語言仍必不可少。不可少。在這種場合下,可使用在這種場合下,可使用C C語言和匯編語言混合編程。在很多語言和匯編語言混合編程。在很多需要直接控制硬件且對(duì)實(shí)時(shí)性要求較高的場合,則更是非用匯需要直接控制硬件且對(duì)實(shí)時(shí)性要求較高的場合,則更是非用匯編語言不可。編
4、語言不可。掌握匯編語言并能進(jìn)行程序設(shè)計(jì),是學(xué)習(xí)和掌握單片機(jī)程序掌握匯編語言并能進(jìn)行程序設(shè)計(jì),是學(xué)習(xí)和掌握單片機(jī)程序設(shè)計(jì)的設(shè)計(jì)的基本功之一基本功之一。44.1.2 4.1.2 匯編語言語句和格式匯編語言語句和格式兩種基本語句:兩種基本語句:指令語句指令語句和和偽指令語句偽指令語句。(1 1)指令語句)指令語句已在第已在第3 3章介紹。每一指令語句在匯編時(shí)都產(chǎn)生一個(gè)指令代章介紹。每一指令語句在匯編時(shí)都產(chǎn)生一個(gè)指令代碼(機(jī)器代碼),執(zhí)行該指令代碼對(duì)應(yīng)著機(jī)器的一種操作。碼(機(jī)器代碼),執(zhí)行該指令代碼對(duì)應(yīng)著機(jī)器的一種操作。(2 2)偽指令語句)偽指令語句是控制匯編(翻譯)過程的一些是控制匯編(翻譯)過程
5、的一些控制命令控制命令。在匯編時(shí)。在匯編時(shí)沒有沒有機(jī)器代碼機(jī)器代碼與之對(duì)應(yīng)。與之對(duì)應(yīng)。5匯編語言語句是符合典型的匯編語言的匯編語言語句是符合典型的匯編語言的四分段四分段格式格式:標(biāo)號(hào)字段標(biāo)號(hào)字段和和操作碼字段操作碼字段之間要有之間要有冒號(hào)冒號(hào)“:”分隔;分隔;操作碼字段操作碼字段和和操作數(shù)字段間操作數(shù)字段間的分界符是的分界符是空格空格;雙操作數(shù)雙操作數(shù)之間用之間用逗號(hào)逗號(hào)相隔;相隔;操作數(shù)字段操作數(shù)字段和和注釋字段注釋字段之間的分界符用之間的分界符用分號(hào)分號(hào)“;”。任何語句都必須有操作碼字段任何語句都必須有操作碼字段,其余各段為任選項(xiàng)。,其余各段為任選項(xiàng)。6標(biāo)號(hào)字段標(biāo)號(hào)字段(LABLE)操作碼
6、字段操作碼字段(OPCODE)操作數(shù)字段操作數(shù)字段(OPRAND)注釋字段注釋字段(COMMENT)【例例】下面是一段程序的下面是一段程序的四分段四分段書寫格式。書寫格式。標(biāo)號(hào)字段標(biāo)號(hào)字段 操作碼字段操作碼字段 操作數(shù)字段操作數(shù)字段 注釋字段注釋字段START:MOVA,#00H ;0A MOVR1,#10 ;10R1MOVR2,#00000011B ;03HR2LOOP: ADDA,R2 ;(A)+(R2)ADJNZR1,LOOP ;R1減減1不為零,則跳不為零,則跳LOOP處處NOPHERE:SJMPHERE上述上述4個(gè)字段應(yīng)該遵守的個(gè)字段應(yīng)該遵守的基本語法規(guī)則基本語法規(guī)則如下。如下。71
7、 1標(biāo)號(hào)字段標(biāo)號(hào)字段語句所在地址的標(biāo)志符號(hào),才能被訪問。如標(biāo)號(hào)語句所在地址的標(biāo)志符號(hào),才能被訪問。如標(biāo)號(hào)“STARTSTART”和和“LOOPLOOP”等。有關(guān)標(biāo)號(hào)規(guī)定如下:等。有關(guān)標(biāo)號(hào)規(guī)定如下:(1 1)標(biāo)號(hào)后必須跟冒號(hào)標(biāo)號(hào)后必須跟冒號(hào)“:”。(2 2)標(biāo)號(hào)由標(biāo)號(hào)由1 18 8個(gè)個(gè)ASCIIASCII碼字符組成,第一個(gè)字符必須是字母。碼字符組成,第一個(gè)字符必須是字母。(3 3)同一標(biāo)號(hào)在一個(gè)程序中只能定義一次,不能重復(fù)定義。同一標(biāo)號(hào)在一個(gè)程序中只能定義一次,不能重復(fù)定義。(4 4)不能使用匯編語言已經(jīng)定義的符號(hào)作為標(biāo)號(hào),如指令助記符、不能使用匯編語言已經(jīng)定義的符號(hào)作為標(biāo)號(hào),如指令助記符、偽指
8、令以及寄存器的符號(hào)名稱等。偽指令以及寄存器的符號(hào)名稱等。(5 5)標(biāo)號(hào)的有無,取決于本程序中的其他語句是否訪問該條語句。標(biāo)號(hào)的有無,取決于本程序中的其他語句是否訪問該條語句。如無其他語句訪問,則該語句前不需標(biāo)號(hào)。如無其他語句訪問,則該語句前不需標(biāo)號(hào)。892 2操作碼字段操作碼字段操作碼字段規(guī)定了語句執(zhí)行的操作,操作碼是匯編語言指令中操作碼字段規(guī)定了語句執(zhí)行的操作,操作碼是匯編語言指令中唯一不能空缺的部分。唯一不能空缺的部分。3 3操作數(shù)字段操作數(shù)字段指令的操作數(shù)或操作數(shù)地址。指令的操作數(shù)或操作數(shù)地址。在本字段中,在本字段中,操作數(shù)的個(gè)數(shù)因指令的不同而不同。操作數(shù)的個(gè)數(shù)因指令的不同而不同。通常有
9、單操通常有單操作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。如果是多操作數(shù),則操作數(shù)之間要以如果是多操作數(shù),則操作數(shù)之間要以逗號(hào)逗號(hào)隔開。隔開。4 4注釋字段注釋字段用于解釋指令或程序的含義,對(duì)可讀性非常有用。用于解釋指令或程序的含義,對(duì)可讀性非常有用。使用時(shí)使用時(shí)須以分號(hào)開頭須以分號(hào)開頭,長度不限,一行寫不下,長度不限,一行寫不下可換行可換行書寫,但注意也要以分號(hào)開頭。書寫,但注意也要以分號(hào)開頭。 匯編時(shí),遇到匯編時(shí),遇到“;” ” 就停止就停止“翻譯翻譯”。因此,注釋字。因此,注釋字段不會(huì)產(chǎn)生機(jī)器代碼。段不會(huì)產(chǎn)生機(jī)器代碼。104.1.3 4.1.3 偽指令偽指令 在匯
10、編語言源程序中應(yīng)有在匯編語言源程序中應(yīng)有向匯編程序發(fā)出的指示信息向匯編程序發(fā)出的指示信息,告訴它如何完成匯編工作,這是通過告訴它如何完成匯編工作,這是通過偽指令偽指令來實(shí)現(xiàn)。來實(shí)現(xiàn)。 偽指令不屬于指令系統(tǒng)中的匯編語言指令,它偽指令不屬于指令系統(tǒng)中的匯編語言指令,它是程序員是程序員發(fā)給匯編程序的發(fā)給匯編程序的命令命令,也稱為,也稱為匯編程序控制命令匯編程序控制命令。 只有在匯編前的源程序中才有偽指令。只有在匯編前的源程序中才有偽指令。 “偽偽”體現(xiàn)在體現(xiàn)在匯編后,偽指令匯編后,偽指令沒有相應(yīng)的機(jī)器代碼產(chǎn)生。沒有相應(yīng)的機(jī)器代碼產(chǎn)生。 偽指令具有控制匯編程序的輸入偽指令具有控制匯編程序的輸入/ /輸
11、出、定義數(shù)據(jù)和符輸出、定義數(shù)據(jù)和符號(hào)、條件匯編、分配存儲(chǔ)空間等功能。號(hào)、條件匯編、分配存儲(chǔ)空間等功能。11不同匯編語言的偽指令有所不同,但基本內(nèi)容相同。不同匯編語言的偽指令有所不同,但基本內(nèi)容相同。介紹介紹常用的偽指令常用的偽指令。1ORG(ORiGin)匯編起始地址命令)匯編起始地址命令源程序的開始,用一條源程序的開始,用一條ORG偽指令規(guī)定偽指令規(guī)定程序的起始地程序的起始地址址。如果不用如果不用ORG,則匯編得到的目標(biāo)程序,則匯編得到的目標(biāo)程序?qū)膶?000H地地址開始。例如:址開始。例如:ORG2000HSTART:MOVA,#00H 即規(guī)定標(biāo)號(hào)即規(guī)定標(biāo)號(hào)START代表地址為代表地址為
12、2000H開始。開始。在一源程序中,可多次用在一源程序中,可多次用ORG指令,規(guī)定不同的程序段的指令,規(guī)定不同的程序段的起始地址。但是,起始地址。但是,地址必須由小到大排列,且不能交叉、地址必須由小到大排列,且不能交叉、重疊。例如:重疊。例如:ORG2000HORG2500HORG3000H這種順序是正確的。若按下面順序的排列則是錯(cuò)誤的,因?yàn)榈刂烦霈F(xiàn)了交叉。ORG2500HORG2000HORG3000H132. 2. END(END of Assembly)END(END of Assembly)匯編終止命令匯編終止命令源程序源程序結(jié)束標(biāo)志結(jié)束標(biāo)志,終止源程序的匯編工作。終止源程序的匯編工作
13、。整個(gè)源程序整個(gè)源程序中只能有一條中只能有一條ENDEND命令,且命令,且位于程序的最后位于程序的最后。如果。如果ENDEND出現(xiàn)出現(xiàn)在程序中間,其后的源程序,將不進(jìn)行匯編處理。在程序中間,其后的源程序,將不進(jìn)行匯編處理。3 3EQUEQU(EQUateEQUate)標(biāo)號(hào)賦值命令)標(biāo)號(hào)賦值命令用于用于給標(biāo)號(hào)賦值給標(biāo)號(hào)賦值。賦值后,標(biāo)號(hào)值在整個(gè)程序有效。賦值后,標(biāo)號(hào)值在整個(gè)程序有效。例如:例如:TESTTESTEQU 2000HEQU 2000H表示表示TEST=2000HTEST=2000H,匯編時(shí),凡是遇到,匯編時(shí),凡是遇到TESTTEST時(shí),均以時(shí),均以2000H2000H來代替。來代替。
14、144DB(Define Byte)定義數(shù)據(jù)字節(jié)命令)定義數(shù)據(jù)字節(jié)命令用于從指定的地址開始,在程序存儲(chǔ)器連續(xù)單元中定義用于從指定的地址開始,在程序存儲(chǔ)器連續(xù)單元中定義字節(jié)數(shù)據(jù)。例如:字節(jié)數(shù)據(jù)。例如:ORG2000HDB30H,40H,24,C,B匯編后匯編后(2000H)=30H(2001H)=40H(2002H)=18H(十進(jìn)制數(shù)十進(jìn)制數(shù)24)(2003H)=43H(字符字符“C”的的ASCII碼碼)(2004H)=42H(字符字符“B”的的ASCII碼碼)155DW(Define Word)定義數(shù)據(jù)字命令)定義數(shù)據(jù)字命令該命令用于從指定的地址開始,在程序存儲(chǔ)器的連續(xù)單該命令用于從指定的地址
15、開始,在程序存儲(chǔ)器的連續(xù)單元中定義元中定義16位的數(shù)據(jù)字。例如:位的數(shù)據(jù)字。例如:ORG2000HDW1246H,7BH,10匯編后匯編后(2000H)=12H;第;第1個(gè)字個(gè)字(2001H)=46H(2002H)=00H;第;第2個(gè)字個(gè)字(2003H)=7BH(2004H)=00H;第;第3個(gè)字個(gè)字(2005H)=0AH16注意:注意:DBDB、DWDW和和DSDS命令命令只能對(duì)程序存儲(chǔ)器有效,只能對(duì)程序存儲(chǔ)器有效,不能對(duì)不能對(duì)數(shù)據(jù)存儲(chǔ)器數(shù)據(jù)存儲(chǔ)器使用。使用。7 7BIT BIT 位定義命令位定義命令用于給字符名稱賦以位地址,位地址可以是絕對(duì)位地用于給字符名稱賦以位地址,位地址可以是絕對(duì)位地
16、址,也可是符號(hào)地址。例如:址,也可是符號(hào)地址。例如:QAQABIT P1.6BIT P1.6功能是把功能是把P1.6P1.6的位地址賦給變量的位地址賦給變量QAQA。17184.1.2 4.1.2 編制程序的步驟編制程序的步驟1.1.任務(wù)分析(硬件、軟件系統(tǒng)分析)任務(wù)分析(硬件、軟件系統(tǒng)分析)2.2.確定算法和工作步驟;確定算法和工作步驟;3.3.程序總體設(shè)計(jì)和流程圖繪制程序總體設(shè)計(jì)和流程圖繪制關(guān)于流程圖符號(hào):關(guān)于流程圖符號(hào):開始、結(jié)束開始、結(jié)束-圓角矩形圓角矩形工作任務(wù)工作任務(wù)-矩形矩形判斷分支判斷分支-菱形菱形程序流向程序流向-程序連接程序連接-開始結(jié)束194. 4. 分配內(nèi)存,確定程序與
17、數(shù)據(jù)區(qū)存放地址;分配內(nèi)存,確定程序與數(shù)據(jù)區(qū)存放地址;5. 5. 編寫源程序;編寫源程序;6. 6. 調(diào)試、修改,最終確定程序。調(diào)試、修改,最終確定程序。204.1.3 4.1.3 方法技巧方法技巧1. 1. 模塊化設(shè)計(jì)(按功能分:顯示、打模塊化設(shè)計(jì)(按功能分:顯示、打 印、輸入、發(fā)送等)印、輸入、發(fā)送等)2. 2. 盡量采用循環(huán)及子程序結(jié)構(gòu)(節(jié)省內(nèi)存)盡量采用循環(huán)及子程序結(jié)構(gòu)(節(jié)省內(nèi)存)214.2 4.2 匯編語言基本程序結(jié)構(gòu)匯編語言基本程序結(jié)構(gòu) n順序結(jié)構(gòu)順序結(jié)構(gòu)n分支程序結(jié)構(gòu)分支程序結(jié)構(gòu)n循環(huán)程序結(jié)構(gòu)循環(huán)程序結(jié)構(gòu)n子程序結(jié)構(gòu)子程序和參數(shù)傳遞方法子程序結(jié)構(gòu)子程序和參數(shù)傳遞方法22程序的基本組
18、成程序的基本組成ORG 0000HLJMP START ;轉(zhuǎn)向主程序ORG 0003HLJMP INTE0 ;轉(zhuǎn)向外中斷0服務(wù)子程序ORG 000BHLJMP INTTFO ;轉(zhuǎn)向定時(shí)/計(jì)數(shù)器0服務(wù)子程序 ;可按實(shí)際需要設(shè)置服務(wù)子程序ORG 0030HSTART:MOV A,#00H ;主程序從0030H單元開始MOV R1,#dataMOV R0,#00HDJNZ R1,LOOP0 ;初始化程序段 ;主程序主體區(qū)段23ORG 3100HA0: ;子程序A0RETA1 ;子程序A1RETORG 4100hINTIE0: ;外部中斷0中斷服務(wù)程序RETIORG 4800HINTTFO: ;定時(shí)/
19、計(jì)數(shù)器0中斷服務(wù)程序RETI ;其他中斷服務(wù)程序段ORG 5500HDBL0:DB 43,56, ;固定表格參量區(qū)段END ;結(jié)束 244.2.14.2.1順序結(jié)構(gòu)順序結(jié)構(gòu)25例:變量存在內(nèi)部RAM的20H單元中,其取值范圍:05,編成,查表法求其平方值開始表格首地址送DPTR變量送A(20H) A查平方表(A+DPTR) A結(jié)束結(jié)果送21H單元:A 21H26org 1000hstart: mov dptr,#table mov a,20h movc a,a+dptr mov 21h,a sjmp $org 2000htable: db 0,1,4,9,16,25 end27例例:將:將20
20、20H H單元的壓縮單元的壓縮(Packed Packed )BCDBCD碼拆成兩個(gè)碼拆成兩個(gè)ACSIIACSII碼存入碼存入2121H H、22H22H單元。單元。內(nèi)部RAM22H21H20H6 93 63 9BCD 0 1 2. 9ASCII 30H 31H 32H . 39H28方法1(20H)A10HBA/B,A中為高中為高4位位BCD碼,碼,B中為低中為低4位位BCD碼碼B+30HBB(21H)A+30HAA(22H)開始結(jié)束290 (21H) (20H)AA與(21H)的低4位交換(21H)+30H(21H)A的高低半字節(jié)交換A+30HAA(22H)開始結(jié)束方法2:304.2.2分
21、支轉(zhuǎn)移程序設(shè)計(jì)分支轉(zhuǎn)移程序設(shè)計(jì)分為無條件轉(zhuǎn)移分為無條件轉(zhuǎn)移和和有條件轉(zhuǎn)移有條件轉(zhuǎn)移。無條件分支轉(zhuǎn)移程序很簡單,不討論。有條件分支轉(zhuǎn)移程序無條件分支轉(zhuǎn)移程序很簡單,不討論。有條件分支轉(zhuǎn)移程序按結(jié)構(gòu)類型來分,又分為按結(jié)構(gòu)類型來分,又分為單分支單分支選擇結(jié)構(gòu)選擇結(jié)構(gòu)和和多分支多分支選擇結(jié)構(gòu)選擇結(jié)構(gòu)。1單分支選擇結(jié)構(gòu)單分支選擇結(jié)構(gòu) 僅有僅有兩個(gè)出口兩個(gè)出口,兩者選一兩者選一。一般根據(jù)運(yùn)算結(jié)果的狀態(tài)標(biāo)志,。一般根據(jù)運(yùn)算結(jié)果的狀態(tài)標(biāo)志,用用條件判跳指令條件判跳指令來選擇并轉(zhuǎn)移。來選擇并轉(zhuǎn)移。3031【例例】 求單字節(jié)有符號(hào)數(shù)的二進(jìn)制補(bǔ)碼求單字節(jié)有符號(hào)數(shù)的二進(jìn)制補(bǔ)碼正數(shù)補(bǔ)碼正數(shù)補(bǔ)碼是其本身,是其本身,負(fù)數(shù)補(bǔ)
22、碼負(fù)數(shù)補(bǔ)碼是其是其反碼加反碼加1。因此,應(yīng)首。因此,應(yīng)首先判被轉(zhuǎn)換數(shù)的符號(hào),負(fù)數(shù)進(jìn)行轉(zhuǎn)換,正數(shù)本身即為補(bǔ)碼。先判被轉(zhuǎn)換數(shù)的符號(hào),負(fù)數(shù)進(jìn)行轉(zhuǎn)換,正數(shù)本身即為補(bǔ)碼。設(shè)二進(jìn)制數(shù)放在A中,其補(bǔ)碼放回到A中,框圖如圖圖所示所示。3132參考程序如下:CMPT:JNB Acc.7,RETURN ;(A)0,不需轉(zhuǎn)換MOV C,Acc.7;符號(hào)位保存CPL A;(A)求反,加1ADD A,#1MOV Acc.7,C;符號(hào)位存在A的最高位RETURN:RET33此外,單分支選擇結(jié)構(gòu)還有所示的幾種形式。33圖 單分支選擇結(jié)構(gòu)2 圖 單分支選擇結(jié)構(gòu)3342多分支選擇結(jié)構(gòu)多分支選擇結(jié)構(gòu)當(dāng)程序的判別部分有兩個(gè)以上兩個(gè)
23、以上的出口出口時(shí),為多分支選擇結(jié)構(gòu)。有兩種形式,如所示。34 圖圖 多分支選擇結(jié)構(gòu)1 1 圖圖 多分支選擇結(jié)構(gòu)235指令系統(tǒng)提供了非常有用的指令系統(tǒng)提供了非常有用的兩種多分支選擇指令兩種多分支選擇指令:間接轉(zhuǎn)移指令間接轉(zhuǎn)移指令 JMP A+DPTR比較轉(zhuǎn)移指令比較轉(zhuǎn)移指令 CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE Ri,#data,rel間接轉(zhuǎn)移指令間接轉(zhuǎn)移指令“JMP A+DPTR”由數(shù)據(jù)指針由數(shù)據(jù)指針DPTR決定多決定多分支轉(zhuǎn)移分支轉(zhuǎn)移程序的程序的首地址首地址,由,由A的內(nèi)容選擇對(duì)應(yīng)分支的內(nèi)容選擇對(duì)應(yīng)分支。4條條比較
24、轉(zhuǎn)移指令比較轉(zhuǎn)移指令CJNE能對(duì)兩個(gè)欲比較的單元內(nèi)容進(jìn)能對(duì)兩個(gè)欲比較的單元內(nèi)容進(jìn)行比較,當(dāng)行比較,當(dāng)不相等不相等時(shí),程序?qū)崿F(xiàn)相對(duì)轉(zhuǎn)移;若時(shí),程序?qū)崿F(xiàn)相對(duì)轉(zhuǎn)移;若兩者相等兩者相等,則順序往下執(zhí)行。則順序往下執(zhí)行。3536簡單的分支轉(zhuǎn)移程序的設(shè)計(jì),常采用逐次比較法逐次比較法,就是把所有不同的情況一個(gè)一個(gè)地進(jìn)行比較,發(fā)現(xiàn)符合就轉(zhuǎn)向?qū)?yīng)的處理程序。缺點(diǎn)是程序太長,有n種可能的情況,就需有n個(gè)判斷和轉(zhuǎn)移。復(fù)雜的分支轉(zhuǎn)移程序的設(shè)計(jì),可用直接轉(zhuǎn)移指令(LJMP或AJMP指令)組成一個(gè)轉(zhuǎn)移表,然后把該單元的內(nèi)容讀入累加器A,轉(zhuǎn)移表首地址放入DPTR中,再利用間接轉(zhuǎn)移指令實(shí)現(xiàn)分支轉(zhuǎn)移。3637例例:設(shè)變量:設(shè)變
25、量x x以補(bǔ)碼形式存放在片內(nèi)以補(bǔ)碼形式存放在片內(nèi)RAM 30HRAM 30H單元單元中,變量中,變量y y與與x x的關(guān)系是:的關(guān)系是:編程根據(jù)編程根據(jù)x x的值求的值求y y值并放回原單元。值并放回原單元。0, 50,200,xxxHxxy38A=?y=x+50y=20Hy=x0取x 即(30h) A開始存y 即y 30h結(jié)束39 ORG 0100HSTART:MOV A,30H JZ NEXT ;x=0,轉(zhuǎn)移 ANL A,#80H ;保留符號(hào)位 JZ ED ;x0,轉(zhuǎn)移 MOV A,#05H ;x0,不轉(zhuǎn)移 ADD A,30H MOV 30H,A SJMP ED NEXT:MOV 30H,
26、#20H ED:SJMP $40STARTSTART:MOV DPTRMOV DPTR,#TAB#TAB MOV A MOV A,R7R7 ADD A,R7 ADD A,R7 ;R7R72 2A A MOV R3,A ; MOV R3,A ;暫存暫存R3R3 MOVC A,A+DPTR MOVC A,A+DPTR ;取高位地址取高位地址 XCH XCH A A ,R3R3 INC A INC A MOVC A MOVC A,A+DPTR A+DPTR ;取低位地址取低位地址 MOV DPL MOV DPL,A A MOV DPH MOV DPH,R3 R3 ;轉(zhuǎn)移地址送入轉(zhuǎn)移地址送入DPTRD
27、PTR CLR A CLR A JMP A+DPTR JMP A+DPTR TAB: TAB: DWDW P0 P0 DWDW P1 P1 DW DW PN PN例例2 2 :根據(jù)根據(jù)R7R7的內(nèi)容,轉(zhuǎn)至對(duì)應(yīng)的分支程序。設(shè)的內(nèi)容,轉(zhuǎn)至對(duì)應(yīng)的分支程序。設(shè)R7R7的內(nèi)容為的內(nèi)容為0 0N N,對(duì)應(yīng),對(duì)應(yīng)的處理程序地址分別為的處理程序地址分別為P0P0P7P7P0高位P0低位TABP1高位P1低位TAB+2414.2.3 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)程序中含有可以反復(fù)執(zhí)行的程序段,稱循環(huán)體循環(huán)體。例如,求100個(gè)數(shù)的累加和,沒必要連續(xù)安排100條加法指令,用一條加法指令使其循環(huán)執(zhí)行100次。因此可縮短程
28、序長縮短程序長度度和程序所占的內(nèi)存單元數(shù)量更少占的內(nèi)存單元數(shù)量更少,使程序結(jié)構(gòu)緊湊程序結(jié)構(gòu)緊湊。41421循環(huán)程序的結(jié)構(gòu)循環(huán)程序的結(jié)構(gòu)主要由以下四部分組成。(1)循環(huán)初始化)循環(huán)初始化完成循環(huán)前的準(zhǔn)備工作。例如,循環(huán)控制計(jì)數(shù)初值的設(shè)置、地址指針的起始地址的設(shè)置、為變量預(yù)置初值等。(2)循環(huán)處理)循環(huán)處理完成實(shí)際的處理工作,反復(fù)循環(huán)執(zhí)行的部分,故又稱循環(huán)體。(3)循環(huán)控制)循環(huán)控制在重復(fù)執(zhí)行循環(huán)體的過程中,不斷修改循環(huán)控制變量,直到符合結(jié)束條件,就結(jié)束循環(huán)程序的執(zhí)行。4243循環(huán)結(jié)束控制方法分為循環(huán)計(jì)數(shù)控制法和條件控制法。(4)循環(huán)結(jié)束)循環(huán)結(jié)束這部分是對(duì)循環(huán)程序執(zhí)行的結(jié)果進(jìn)行分析、處理和存放。
29、2循環(huán)結(jié)構(gòu)的控制循環(huán)結(jié)構(gòu)的控制分為循環(huán)計(jì)數(shù)控制結(jié)構(gòu)循環(huán)計(jì)數(shù)控制結(jié)構(gòu)和條件控制結(jié)構(gòu)條件控制結(jié)構(gòu)。圖4-8是計(jì)數(shù)循環(huán)控制結(jié)構(gòu),圖4-9是條件控制結(jié)構(gòu)。434444圖4-8 計(jì)數(shù)循環(huán)控制結(jié)構(gòu) 圖4-9 條件控制結(jié)構(gòu)45(1)計(jì)數(shù)循環(huán)控制結(jié)構(gòu))計(jì)數(shù)循環(huán)控制結(jié)構(gòu)依據(jù)計(jì)數(shù)器的值來決定循環(huán)次數(shù),一般為減1計(jì)數(shù)器,計(jì)數(shù)器減到“0”時(shí),結(jié)束循環(huán)。計(jì)數(shù)器初值在初始化設(shè)定。MCS51指令系統(tǒng)提供了功能極強(qiáng)的循環(huán)控制指令:DJNZ Rn,rel;以工作寄存器作控制計(jì)數(shù)器DJNZ direct,rel;以直接尋址單元作控制計(jì)數(shù)器例如例如,計(jì)算n個(gè)數(shù)據(jù)的和,計(jì)算公式為 。如直接按公式編寫程序,則n=100時(shí),需編寫連續(xù)的
30、100次加法。這樣程序?qū)⑻L,并且n可變時(shí),將無法編寫出程序。451niiyx46公式要改寫為用程序?qū)崿F(xiàn)的形式,用下式表示程序框圖見圖。46圖圖 求數(shù)據(jù)和的程序框圖求數(shù)據(jù)和的程序框圖47【例例】 求n個(gè)單字節(jié)無符號(hào)數(shù)xi的和,xi按i順序存放在AT89C51單片機(jī)內(nèi)部RAM從50H開始的單元中,n放在R2中,和(雙字節(jié))放在R3R4中。程序如下:ADD1:MOVR2,#n ;加法次數(shù)n送R2MOV R3,#0 ;R3存放和的高8位,初始值為0MOV R4,#0 ;R4存放和的低8位,初始值為0 MOV R0,#50HLOOP: MOV A,R4 ADD A,R0 MOV R4,A INC R0
31、 CLR A4748 ADDC A,R3 MOV R3,A DJNZ R2,LOOP ;判加法循環(huán)次數(shù)是否已到?END用寄存器R2作為計(jì)數(shù)控制變量,R0作為變址單元,用它來尋址xi。一般來說,循環(huán)工作部分中的數(shù)據(jù)應(yīng)該用間接方式來尋址,如這里用:ADD A,R0計(jì)數(shù)控制計(jì)數(shù)控制只有在循環(huán)次數(shù)已知循環(huán)次數(shù)已知的情況下才適用。循環(huán)次循環(huán)次數(shù)未知數(shù)未知,不能用循環(huán)次數(shù)來控制,往往需要根據(jù)某種條件需要根據(jù)某種條件來判斷是否應(yīng)該終止循環(huán)。4849(2)條件控制結(jié)構(gòu))條件控制結(jié)構(gòu)循環(huán)控制中,設(shè)置一個(gè)條件,判是否滿足該條件,如滿足,則循環(huán)結(jié)束。如不滿足該條件則循環(huán)繼續(xù)?!纠?一串字符,依次存放在內(nèi)部RAM
32、從30H單元開始的連續(xù)單元中,字符串以0AH為結(jié)束標(biāo)志,測試字符串長度字符串長度。采用逐個(gè)字符依次與“0AH”比較(設(shè)置的條件)的方法。設(shè)置一個(gè)累計(jì)字符串長度的長度計(jì)數(shù)器和一個(gè)用于指定字符串指針。如果字符與“0AH”不等不等,則長度計(jì)數(shù)器和字符串指針都加1;如果比較相等相等,則表示該字符為“0AH”,字符串結(jié)束字符串結(jié)束,計(jì)數(shù)器值就是字符串的長度。程序如下:4950MOVR4,#0FFH;長度計(jì)數(shù)器初值送R4MOV R1,#2FH;字符串指針初值送R1NEXT:INC R4INC R1CJNE R1,#0AH,NEXT;比較,不等則進(jìn)行下一 ;字符比較END上面兩例都是在一個(gè)循環(huán)程序中不再包含
33、其他循環(huán)程序,則稱該循環(huán)程序?yàn)閱窝h(huán)程序。如果一個(gè)循環(huán)程序中包含了其他循環(huán)程序,則稱為多重循環(huán)程序。最常見的多重循環(huán)是由DJNZ指令構(gòu)成的軟件延時(shí)程序,是常用程序之一。5051例: 50ms延時(shí)子程序。設(shè)晶振頻率為12MHz,則機(jī)器周期為1us。DEL: MOV R7,#200 ;1MCDEL1:MOV R6,#123 ;1MC NOP ;1MC DJNZ R6,$ ;2MC DJNZ R7,DEL1 ;2MC RET ;2MC延時(shí)時(shí)間:t=1+200(1+1+2*123)+2+2 50000us=50ms524.2.4 4.2.4 子程序的設(shè)計(jì)子程序的設(shè)計(jì) 將那些需多次應(yīng)用的、完成相同的某種
34、基本運(yùn)算或操作將那些需多次應(yīng)用的、完成相同的某種基本運(yùn)算或操作的程序段從整個(gè)程序中獨(dú)立出來,單獨(dú)編成一個(gè)程序段,的程序段從整個(gè)程序中獨(dú)立出來,單獨(dú)編成一個(gè)程序段,需要時(shí)進(jìn)行調(diào)用。這樣的程序段稱為需要時(shí)進(jìn)行調(diào)用。這樣的程序段稱為子程序子程序。 優(yōu)點(diǎn):優(yōu)點(diǎn):采用子程序可使程序結(jié)構(gòu)簡單,縮短程序的設(shè)計(jì)采用子程序可使程序結(jié)構(gòu)簡單,縮短程序的設(shè)計(jì)時(shí)間,減少占用的程序存儲(chǔ)空間。時(shí)間,減少占用的程序存儲(chǔ)空間。 子程序在程序設(shè)計(jì)中非常重要,讀者應(yīng)熟練掌握子程序子程序在程序設(shè)計(jì)中非常重要,讀者應(yīng)熟練掌握子程序的設(shè)計(jì)方法。的設(shè)計(jì)方法。52531 1子程序的設(shè)計(jì)原則和應(yīng)注意的問題子程序的設(shè)計(jì)原則和應(yīng)注意的問題編寫子
35、程序應(yīng)注意以下問題:編寫子程序應(yīng)注意以下問題: (1 1)子程序的入口地址,前必須有標(biāo)號(hào)。)子程序的入口地址,前必須有標(biāo)號(hào)。 (2 2)主程序調(diào)用子程序,是通過調(diào)用指令來實(shí)現(xiàn)。有)主程序調(diào)用子程序,是通過調(diào)用指令來實(shí)現(xiàn)。有兩兩條子程序調(diào)用指令條子程序調(diào)用指令: 絕對(duì)調(diào)用指令絕對(duì)調(diào)用指令A(yù)CALL addr11ACALL addr11。雙字節(jié),。雙字節(jié),addr11addr11指出了指出了調(diào)用的目的地址,調(diào)用的目的地址,PCPC中中1616位地址中的高位地址中的高5 5位不變,被調(diào)用的位不變,被調(diào)用的子程序的首地址與絕對(duì)調(diào)用指令的下一條指令的高子程序的首地址與絕對(duì)調(diào)用指令的下一條指令的高5 5位
36、地址位地址相同,即只能在同一個(gè)相同,即只能在同一個(gè)2KB2KB區(qū)內(nèi)。區(qū)內(nèi)。 長調(diào)用指令長調(diào)用指令LCALL addr16LCALL addr16。三字節(jié),三字節(jié),addr16addr16為直接調(diào)為直接調(diào)用的目的地址,子程序可放在用的目的地址,子程序可放在64KB64KB程序存儲(chǔ)器區(qū)任意位置。程序存儲(chǔ)器區(qū)任意位置。5354(3 3)子程序結(jié)構(gòu)中必須用到)子程序結(jié)構(gòu)中必須用到堆棧堆棧,用來進(jìn)行斷點(diǎn)和現(xiàn)場的,用來進(jìn)行斷點(diǎn)和現(xiàn)場的保護(hù)。保護(hù)。(4 4)子程序返回主程序時(shí),)子程序返回主程序時(shí),最后一條指令必須是最后一條指令必須是RETRET指令指令,功能是把功能是把堆棧中的斷點(diǎn)地址堆棧中的斷點(diǎn)地址彈出
37、送入彈出送入PCPC指針中,從而實(shí)現(xiàn)子程指針中,從而實(shí)現(xiàn)子程序返回后從主程序斷點(diǎn)處繼續(xù)執(zhí)行主程序。序返回后從主程序斷點(diǎn)處繼續(xù)執(zhí)行主程序。(5 5)子程序可以)子程序可以嵌套嵌套,即主程序可以調(diào)用子程序,子程序,即主程序可以調(diào)用子程序,子程序又可以調(diào)用另外的子程序。又可以調(diào)用另外的子程序。54552子程序的基本結(jié)構(gòu)子程序的基本結(jié)構(gòu)典型的子程序的基本結(jié)構(gòu)如下:MAIN: ;MAIN為主程序入口標(biāo)號(hào)LCALL SUB;調(diào)用子程序SUB 子程序SUB:PUSH PSW;現(xiàn)場保護(hù) PUSH AccPOP Acc ;現(xiàn)場恢復(fù),注意要先進(jìn)后出POP PSW RET;最后一條指令必須為RET55子程序處理程序
38、段子程序子程序56例:利用查表法求平方和 ,設(shè)a、b、c分別存于內(nèi)部RAM的DA、DB、DC三個(gè)單元中。 MOV A,DA ;取a ACALL SQR ;調(diào)用查表子程序 MOV R1,A ;a的平方暫存R1中 MOV A,DB ;取b ACALL SQR ;調(diào)用查表子程序 ADD A,R1 ;求出平方和暫存阿A中 MOV DC,A ;結(jié)果存于DC 中 SJMP $SQR:MOV DPTR,#TAB ;子程序 MOVC A,A+DPTR RETTAB: DB 0,1,4,9,16,25,36,49,64,81 END 22bac利用累加器或寄存器傳遞參數(shù)4.2.5 4.2.5 常用算法程序常用算
39、法程序 1. 1. 查表程序設(shè)計(jì)查表程序設(shè)計(jì) 查表程序是一種常用程序查表程序是一種常用程序, ,避免避免復(fù)雜的運(yùn)算或轉(zhuǎn)換過程,復(fù)雜的運(yùn)算或轉(zhuǎn)換過程,可完成數(shù)據(jù)補(bǔ)償、修正、計(jì)算、轉(zhuǎn)換等各種功能,具有程序可完成數(shù)據(jù)補(bǔ)償、修正、計(jì)算、轉(zhuǎn)換等各種功能,具有程序簡單、執(zhí)行速度快等簡單、執(zhí)行速度快等優(yōu)點(diǎn)優(yōu)點(diǎn)。 查表查表是根據(jù)是根據(jù)自變量自變量x x,在表格,在表格尋找尋找y y,使,使y y = =f f( (x x) )。單片機(jī)。單片機(jī)中,數(shù)據(jù)表格存放于中,數(shù)據(jù)表格存放于程序存儲(chǔ)器程序存儲(chǔ)器內(nèi),在執(zhí)行查表指令時(shí),發(fā)內(nèi),在執(zhí)行查表指令時(shí),發(fā)出讀程序存儲(chǔ)器選通脈沖出讀程序存儲(chǔ)器選通脈沖 。兩條兩條極為有用的
40、查表指令如下:極為有用的查表指令如下:(1 1)MOVC MOVC A A,A+DPTRA+DPTR(2 2)MOVC MOVC A A,A+PCA+PC57兩條指令的功能完全相同,具體使用有差別。兩條指令的功能完全相同,具體使用有差別。指令指令“MOVC AMOVC A,A+DPTRA+DPTR” 把把A A中內(nèi)容與中內(nèi)容與DPTRDPTR中的內(nèi)容相加中的內(nèi)容相加,結(jié)果為某一程序存儲(chǔ)單元的地址,然后把該地址單元的內(nèi)容,結(jié)果為某一程序存儲(chǔ)單元的地址,然后把該地址單元的內(nèi)容送到送到A A中。中。指令指令“MOVC AMOVC A,A+PCA+PC” ,PCPC的內(nèi)容與的內(nèi)容與A A的內(nèi)容相加后所
41、得的內(nèi)容相加后所得的數(shù)作為某一程序存儲(chǔ)器單元的地址,根據(jù)地址取出程序存儲(chǔ)的數(shù)作為某一程序存儲(chǔ)器單元的地址,根據(jù)地址取出程序存儲(chǔ)器相應(yīng)單元中的內(nèi)容送到累加器器相應(yīng)單元中的內(nèi)容送到累加器A A,指令執(zhí)行后,指令執(zhí)行后,PCPC的內(nèi)容不發(fā)的內(nèi)容不發(fā)生變化,仍指向該查表指令的下一條指令。生變化,仍指向該查表指令的下一條指令。優(yōu)點(diǎn):優(yōu)點(diǎn):在于預(yù)處理較少且不影響其他特殊功能寄存器的值,在于預(yù)處理較少且不影響其他特殊功能寄存器的值,不必保護(hù)其他特殊功能寄存器。不必保護(hù)其他特殊功能寄存器。5859缺點(diǎn):缺點(diǎn):在于該表格只能存放在這條指令的地址在于該表格只能存放在這條指令的地址X3X2X1X0X3X2X1X0以
42、下以下00H00HFFHFFH之中,即只能存放在地址范圍之中,即只能存放在地址范圍X3X2X1X0+1X3X2X1X0+1X3X2X1X0+100HX3X2X1X0+100H中,這就使得表格所在的程序空間受到了中,這就使得表格所在的程序空間受到了限制。限制。下面說明下面說明查表指令的用法查表指令的用法和和計(jì)算偏移量計(jì)算偏移量應(yīng)注意的問題。應(yīng)注意的問題?!纠?設(shè)計(jì)一子程序,功能是根據(jù)累加器A中的數(shù)x(09之間)查x的平方表y,根據(jù)x的值查出相應(yīng)的平方y(tǒng)。本例中的x和y均為單字節(jié)數(shù)。 地地 址址 子程序子程序Y3Y2Y1Y0ADD A,#01HY3Y2Y1Y0+2MOVC A,A+PCY3Y2
43、Y1Y0+3RETY3Y2Y1Y0+4DB 00H,01H,04H,09H,10HDB 19H,24H,31H,40H,51H;數(shù)09的平方表60指令指令“ADD AADD A,#01H#01H”的作用的作用是是A A中的內(nèi)容加上中的內(nèi)容加上 “01H01H”, “ “01H01H”即為查表指令與平方表之間的即為查表指令與平方表之間的“RETRET”指令所占的字節(jié)數(shù)。指令所占的字節(jié)數(shù)。加上加上 “ “01H01H”后,可保證后,可保證PCPC指向表首指向表首,累加器,累加器A A中原來的內(nèi)容僅是從表首開始向下查找多少個(gè)中原來的內(nèi)容僅是從表首開始向下查找多少個(gè)單元。單元。在進(jìn)入程序前,在進(jìn)入程序
44、前,A A的內(nèi)容在的內(nèi)容在000009H09H之間,如之間,如A A中的內(nèi)容中的內(nèi)容為為02H02H,它的平方為,它的平方為04H04H,可根據(jù),可根據(jù)A A的內(nèi)容查出的內(nèi)容查出x x的平方的平方指令指令“MOVC AMOVC A,A+DPTRA+DPTR” 應(yīng)用范圍較廣,使用該指應(yīng)用范圍較廣,使用該指令時(shí)不必計(jì)算偏移量,優(yōu)點(diǎn)是表格可以設(shè)在令時(shí)不必計(jì)算偏移量,優(yōu)點(diǎn)是表格可以設(shè)在64KB64KB程序存儲(chǔ)程序存儲(chǔ)器空間內(nèi)的任何地方,而不像器空間內(nèi)的任何地方,而不像“MOVC AMOVC A,A+PCA+PC”那樣只那樣只設(shè)在設(shè)在PCPC下面的下面的256256個(gè)單元中,所以使用較方便。個(gè)單元中,所
45、以使用較方便。61如果DPTR已被使用,則在查表前必須保護(hù)DPTR,且結(jié)束后恢復(fù)DPTR,例4-3可改成如下形式: PUSH DPH ;保存DPH PUSH DPL ;保存DPL MOV DPTR,#TAB1MOVC A,A+DPTRPOP DPL ;恢復(fù)DPLPOP DPH ;恢復(fù)DPHRETTAB1: DB 00H,01H,04H,09H,10H;平方表 DB 19H,24H,31H,40H,51H實(shí)際查表,有時(shí)x為單字節(jié)數(shù),y為雙字節(jié)數(shù)。來看下例。62【例例4-4】有一巡回檢測報(bào)警裝置,需對(duì)16路(x)輸入進(jìn)行檢測,每路有一個(gè)最大允許值(y),為雙字節(jié)數(shù)。需根據(jù)測量的路數(shù)(x),查表找出
46、對(duì)應(yīng)該路的最大允許值(y),看輸入值是否大于最大允許值,如果大于就報(bào)警。取路數(shù)為x(0 x15),y為最大允許值,放在表格中。設(shè)進(jìn)入查表程序前,假設(shè)路數(shù)x已放于R2中,查表后該路的最大允許值y放于R3R4中。查表的程序如下:63 TB3: MOV A,R2ADDA,R2 ;(R2)*2(A)MOV R3,A ;保存指針 ADDA,#6 ;加偏移量MOVC A,A+PC ;查第一字節(jié)XCH A,R3 ADD A,#3 MOVC A,A+PC ;查第二字節(jié) MOVR4,ARETTAB3: DW 1520,3721,42645,7580 ;最大值表 DW 3483,32657,883,9943DW
47、10000,40511,6758,8931DW 4468,5871,13284,2780864表格長度不能超過表格長度不能超過256B256B,且表格只能存放于,且表格只能存放于“MOVC AMOVC A,A+PCA+PC”指令以下的指令以下的256256個(gè)單元中,如需把表格放在程序存儲(chǔ)個(gè)單元中,如需把表格放在程序存儲(chǔ)器空間的任何地方,應(yīng)使用指令器空間的任何地方,應(yīng)使用指令“ “ MOVC AMOVC A,A+DPTRA+DPTR”?!纠?-54-5】 以以AT89C51AT89C51為核心的溫度控制器,溫度傳感器為核心的溫度控制器,溫度傳感器輸出的電壓與溫度為非線性關(guān)系,傳感器輸出的電壓已
48、由輸出的電壓與溫度為非線性關(guān)系,傳感器輸出的電壓已由A/DA/D轉(zhuǎn)換為轉(zhuǎn)換為1010位二進(jìn)制數(shù)。測得的不同溫度下的電壓值數(shù)據(jù)位二進(jìn)制數(shù)。測得的不同溫度下的電壓值數(shù)據(jù)構(gòu)成一個(gè)表,表中溫度值為構(gòu)成一個(gè)表,表中溫度值為y y(雙字節(jié)無符號(hào)數(shù)),(雙字節(jié)無符號(hào)數(shù)),x x(雙字(雙字節(jié)無符號(hào)數(shù))為電壓值數(shù)據(jù)。設(shè)測得電壓值節(jié)無符號(hào)數(shù))為電壓值數(shù)據(jù)。設(shè)測得電壓值x x放入放入R2R3R2R3中,中,根據(jù)根據(jù)電壓值電壓值x x,查找對(duì)應(yīng)的,查找對(duì)應(yīng)的溫度值溫度值y y,仍放入,仍放入R2R3R2R3中。參考程中。參考程序:序:65 LTB2: MOVDPTR,#TAB2MOVA,R3CLRC RLCA MO
49、VR3,A XCHA,R2 RLCA XCHR2,A ADDA,DPL ;(R2R3)+(DPTR)(DPTR) MOVDPL,A MOVA,DPH ADDC A,R2 MOVDPH,A CLRA66MOVC A,A+DPTR ;查第一字節(jié)MOVR2,A ;第一字節(jié)存入R2中CLRAINCDPTRMOVC A,A+DPTR ;查第二字節(jié)MOVR3,A ;第二字節(jié)存入R3中RETTAB2: DW, , ;溫度值表由于使用了指令“MOVC A,A+DPTR”,表TAB2可放入64KB程序存儲(chǔ)器空間任何位置,表格的長度可大于256B。672. 關(guān)鍵字查找程序設(shè)計(jì)關(guān)鍵字查找程序設(shè)計(jì)在表中查找關(guān)鍵字的操
50、作,也稱為數(shù)據(jù)檢索。有兩種方法,即順序檢索和對(duì)分檢索。a順序檢索順序檢索要檢索的表是無序無序的,檢索時(shí)只能從第只能從第1項(xiàng)開始逐項(xiàng)查項(xiàng)開始逐項(xiàng)查找找,判斷所取數(shù)據(jù)是否與關(guān)鍵字相等?!纠?從50個(gè)字節(jié)的無序表中查找一個(gè)關(guān)鍵字“xxH”。ORG1000HMOV30H,#xxH;關(guān)鍵字xxH送30H單元MOVR1,#50;查找次數(shù)送R1MOVA,#14;修正值送AMOV DPTR,#TAB4 ;表首地址送DPTR68LOOP: PUSH AccMOVC A, A+PC;查表結(jié)果送A CJNE A,40H,LOOP1;(40H)不等于關(guān)鍵字則轉(zhuǎn)LOOP1 MOV R2,DPH;查到關(guān)鍵字,把地址送
51、R2,R3MOV R3,DPLDONE: RETLOOP1:POP Acc;修正值彈出INC A;A+1AINC DPTR;修改數(shù)據(jù)指針DPTRDJNZ R1,LOOP;R10,未查完,繼續(xù)查找MOVR2,#00H;R1=0,R2和R3清0MOVR3,#00H;表中50個(gè)數(shù)已查完AJMPDONE;從子程序返回 TAB4: DB ,;50個(gè)無序數(shù)據(jù)表69b對(duì)分檢索對(duì)分檢索對(duì)分檢索的前提是檢索的數(shù)據(jù)表已經(jīng)排好序已經(jīng)排好序,以便于按照對(duì)分原則取數(shù)。如何進(jìn)行數(shù)據(jù)排序,稍后介紹。對(duì)分檢索的方法對(duì)分檢索的方法:取數(shù)據(jù)表中間位置的數(shù)與關(guān)鍵字進(jìn)行比較,如相等,則查找結(jié)束。如果取數(shù)大于關(guān)鍵字取數(shù)大于關(guān)鍵字,則下次對(duì)分檢索的范圍是從數(shù)據(jù)區(qū)起點(diǎn)到本次取數(shù)處。如果取數(shù)小于關(guān)鍵字取數(shù)小于關(guān)鍵字,則下次對(duì)分檢索的范圍是從本次取數(shù)數(shù)據(jù)區(qū)起點(diǎn)到數(shù)據(jù)區(qū)終點(diǎn)。依此類推,逐漸縮小檢索范圍,減少次數(shù),大大提高查找速度。70713. 數(shù)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 市場門面租賃合同書
- 文字作品委托代理合同樣本
- 廣告制作安裝合同
- 終止租賃合同案例分析
- 公司合伙經(jīng)營協(xié)議書樣本
- 家庭裝飾協(xié)議書樣本
- 國際貿(mào)易獨(dú)家經(jīng)銷協(xié)議范本
- 仿寫標(biāo)題2:舊房回遷房交易協(xié)議
- 涉外許可證合同的保密協(xié)議
- 企業(yè)勞動(dòng)合同問答
- 人教版小學(xué)數(shù)學(xué)四年級(jí)上冊(cè)教材分析
- 國家執(zhí)業(yè)醫(yī)師資格考試題庫(針灸學(xué))
- 茅臺(tái)紅酒推銷文案策劃案例
- 期中達(dá)標(biāo)測試卷(試題)-2024-2025學(xué)年統(tǒng)編版(2024)語文一年級(jí)上冊(cè)
- 2024年地質(zhì)礦產(chǎn)勘測行業(yè)技能鑒定考試-地質(zhì)錄井技能考試近5年真題集錦(頻考類試題)帶答案
- 第四章第1節(jié) 陸地與海洋第1課時(shí)教學(xué)設(shè)計(jì)-2024-2025學(xué)年商務(wù)星球版七年級(jí)上冊(cè)地理
- 社保知識(shí)競賽考試題及答案
- 九上道德與法治期中復(fù)習(xí)提綱(知識(shí)梳理)(全冊(cè))
- 1-4單元期中提升卷(試題)-2024-2025學(xué)年五年級(jí)上冊(cè)數(shù)學(xué)人教版
- 五年級(jí)上冊(cè)小數(shù)四則混合運(yùn)算練習(xí)100道及答案
- 生物化學(xué)第二章核酸的結(jié)構(gòu)和功能
評(píng)論
0/150
提交評(píng)論