單片機第四章匯編語言程序設計_第1頁
單片機第四章匯編語言程序設計_第2頁
單片機第四章匯編語言程序設計_第3頁
單片機第四章匯編語言程序設計_第4頁
單片機第四章匯編語言程序設計_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第第4 4章章 AT89C51AT89C51匯編語匯編語 言程序設計言程序設計12內容概要內容概要匯編語言能匯編語言能直接控制單片機硬件直接控制單片機硬件的的編程語言編程語言。因此,要求程序設計者要因此,要求程序設計者要 “軟、硬結合軟、硬結合” 。本章介紹匯編語言程序設計的本章介紹匯編語言程序設計的基本知識基本知識, ,以及一些以及一些基本基本的程序設計的程序設計。4.1 匯編語言程序設計概述匯編語言程序設計概述程序是指令的有序集合。程序是指令的有序集合。單片機運行就是執(zhí)行指令序列的過程。單片機運行就是執(zhí)行指令序列的過程。編寫這一指令序列的過程稱為編寫這一指令序列的過程稱為程序設計。程序設計

2、。4.1.1 4.1.1 單片機編程語言單片機編程語言常用的編程語言是常用的編程語言是匯編語言匯編語言和和高級語言高級語言。1 1匯編語言匯編語言用英文字符來代替機器語言,這些英文字符被稱為用英文字符來代替機器語言,這些英文字符被稱為助記符匯助記符匯編語言:編語言:用助記符表示的指令。用助記符表示的指令。優(yōu)點:優(yōu)點:用匯編語言編寫程序效率高,占用存儲空間小,運行用匯編語言編寫程序效率高,占用存儲空間小,運行速度快,能編寫出最優(yōu)化的程序,速度快,能編寫出最優(yōu)化的程序,缺點:缺點:可讀性差,離不開具體的硬件,是面向可讀性差,離不開具體的硬件,是面向“硬件硬件”的語的語言通用性差。言通用性差。32

3、2高級語言高級語言不受具體不受具體“硬件硬件”的限制,的限制,優(yōu)點:優(yōu)點:通用性強,直觀、易懂、通用性強,直觀、易懂、易學,可讀性好。易學,可讀性好。目前多數(shù)的目前多數(shù)的51單片機用戶單片機用戶使用使用C語言(語言(C51)來進行程序設來進行程序設計計,但在對,但在對程序的程序的空間空間和和時間時間要求較高的場合,匯編語言仍必要求較高的場合,匯編語言仍必不可少。不可少。在這種場合下,可使用在這種場合下,可使用C C語言和匯編語言混合編程。在很多語言和匯編語言混合編程。在很多需要直接控制硬件且對實時性要求較高的場合,則更是非用匯需要直接控制硬件且對實時性要求較高的場合,則更是非用匯編語言不可。編

4、語言不可。掌握匯編語言并能進行程序設計,是學習和掌握單片機程序掌握匯編語言并能進行程序設計,是學習和掌握單片機程序設計的設計的基本功之一基本功之一。44.1.2 4.1.2 匯編語言語句和格式匯編語言語句和格式兩種基本語句:兩種基本語句:指令語句指令語句和和偽指令語句偽指令語句。(1 1)指令語句)指令語句已在第已在第3 3章介紹。每一指令語句在匯編時都產生一個指令代章介紹。每一指令語句在匯編時都產生一個指令代碼(機器代碼),執(zhí)行該指令代碼對應著機器的一種操作。碼(機器代碼),執(zhí)行該指令代碼對應著機器的一種操作。(2 2)偽指令語句)偽指令語句是控制匯編(翻譯)過程的一些是控制匯編(翻譯)過程

5、的一些控制命令控制命令。在匯編時。在匯編時沒有沒有機器代碼機器代碼與之對應。與之對應。5匯編語言語句是符合典型的匯編語言的匯編語言語句是符合典型的匯編語言的四分段四分段格式格式:標號字段標號字段和和操作碼字段操作碼字段之間要有之間要有冒號冒號“:”分隔;分隔;操作碼字段操作碼字段和和操作數(shù)字段間操作數(shù)字段間的分界符是的分界符是空格空格;雙操作數(shù)雙操作數(shù)之間用之間用逗號逗號相隔;相隔;操作數(shù)字段操作數(shù)字段和和注釋字段注釋字段之間的分界符用之間的分界符用分號分號“;”。任何語句都必須有操作碼字段任何語句都必須有操作碼字段,其余各段為任選項。,其余各段為任選項。6標號字段標號字段(LABLE)操作碼

6、字段操作碼字段(OPCODE)操作數(shù)字段操作數(shù)字段(OPRAND)注釋字段注釋字段(COMMENT)【例例】下面是一段程序的下面是一段程序的四分段四分段書寫格式。書寫格式。標號字段標號字段 操作碼字段操作碼字段 操作數(shù)字段操作數(shù)字段 注釋字段注釋字段START:MOVA,#00H ;0A MOVR1,#10 ;10R1MOVR2,#00000011B ;03HR2LOOP: ADDA,R2 ;(A)+(R2)ADJNZR1,LOOP ;R1減減1不為零,則跳不為零,則跳LOOP處處NOPHERE:SJMPHERE上述上述4個字段應該遵守的個字段應該遵守的基本語法規(guī)則基本語法規(guī)則如下。如下。71

7、 1標號字段標號字段語句所在地址的標志符號,才能被訪問。如標號語句所在地址的標志符號,才能被訪問。如標號“STARTSTART”和和“LOOPLOOP”等。有關標號規(guī)定如下:等。有關標號規(guī)定如下:(1 1)標號后必須跟冒號標號后必須跟冒號“:”。(2 2)標號由標號由1 18 8個個ASCIIASCII碼字符組成,第一個字符必須是字母。碼字符組成,第一個字符必須是字母。(3 3)同一標號在一個程序中只能定義一次,不能重復定義。同一標號在一個程序中只能定義一次,不能重復定義。(4 4)不能使用匯編語言已經定義的符號作為標號,如指令助記符、不能使用匯編語言已經定義的符號作為標號,如指令助記符、偽指

8、令以及寄存器的符號名稱等。偽指令以及寄存器的符號名稱等。(5 5)標號的有無,取決于本程序中的其他語句是否訪問該條語句。標號的有無,取決于本程序中的其他語句是否訪問該條語句。如無其他語句訪問,則該語句前不需標號。如無其他語句訪問,則該語句前不需標號。892 2操作碼字段操作碼字段操作碼字段規(guī)定了語句執(zhí)行的操作,操作碼是匯編語言指令中操作碼字段規(guī)定了語句執(zhí)行的操作,操作碼是匯編語言指令中唯一不能空缺的部分。唯一不能空缺的部分。3 3操作數(shù)字段操作數(shù)字段指令的操作數(shù)或操作數(shù)地址。指令的操作數(shù)或操作數(shù)地址。在本字段中,在本字段中,操作數(shù)的個數(shù)因指令的不同而不同。操作數(shù)的個數(shù)因指令的不同而不同。通常有

9、單操通常有單操作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。作數(shù)、雙操作數(shù)和無操作數(shù)三種情況。如果是多操作數(shù),則操作數(shù)之間要以如果是多操作數(shù),則操作數(shù)之間要以逗號逗號隔開。隔開。4 4注釋字段注釋字段用于解釋指令或程序的含義,對可讀性非常有用。用于解釋指令或程序的含義,對可讀性非常有用。使用時使用時須以分號開頭須以分號開頭,長度不限,一行寫不下,長度不限,一行寫不下可換行可換行書寫,但注意也要以分號開頭。書寫,但注意也要以分號開頭。 匯編時,遇到匯編時,遇到“;” ” 就停止就停止“翻譯翻譯”。因此,注釋字。因此,注釋字段不會產生機器代碼。段不會產生機器代碼。104.1.3 4.1.3 偽指令偽指令 在匯

10、編語言源程序中應有在匯編語言源程序中應有向匯編程序發(fā)出的指示信息向匯編程序發(fā)出的指示信息,告訴它如何完成匯編工作,這是通過告訴它如何完成匯編工作,這是通過偽指令偽指令來實現(xiàn)。來實現(xiàn)。 偽指令不屬于指令系統(tǒng)中的匯編語言指令,它偽指令不屬于指令系統(tǒng)中的匯編語言指令,它是程序員是程序員發(fā)給匯編程序的發(fā)給匯編程序的命令命令,也稱為,也稱為匯編程序控制命令匯編程序控制命令。 只有在匯編前的源程序中才有偽指令。只有在匯編前的源程序中才有偽指令。 “偽偽”體現(xiàn)在體現(xiàn)在匯編后,偽指令匯編后,偽指令沒有相應的機器代碼產生。沒有相應的機器代碼產生。 偽指令具有控制匯編程序的輸入偽指令具有控制匯編程序的輸入/ /輸

11、出、定義數(shù)據(jù)和符輸出、定義數(shù)據(jù)和符號、條件匯編、分配存儲空間等功能。號、條件匯編、分配存儲空間等功能。11不同匯編語言的偽指令有所不同,但基本內容相同。不同匯編語言的偽指令有所不同,但基本內容相同。介紹介紹常用的偽指令常用的偽指令。1ORG(ORiGin)匯編起始地址命令)匯編起始地址命令源程序的開始,用一條源程序的開始,用一條ORG偽指令規(guī)定偽指令規(guī)定程序的起始地程序的起始地址址。如果不用如果不用ORG,則匯編得到的目標程序,則匯編得到的目標程序將從將從0000H地地址開始。例如:址開始。例如:ORG2000HSTART:MOVA,#00H 即規(guī)定標號即規(guī)定標號START代表地址為代表地址為

12、2000H開始。開始。在一源程序中,可多次用在一源程序中,可多次用ORG指令,規(guī)定不同的程序段的指令,規(guī)定不同的程序段的起始地址。但是,起始地址。但是,地址必須由小到大排列,且不能交叉、地址必須由小到大排列,且不能交叉、重疊。例如:重疊。例如:ORG2000HORG2500HORG3000H這種順序是正確的。若按下面順序的排列則是錯誤的,因為地址出現(xiàn)了交叉。ORG2500HORG2000HORG3000H132. 2. END(END of Assembly)END(END of Assembly)匯編終止命令匯編終止命令源程序源程序結束標志結束標志,終止源程序的匯編工作。終止源程序的匯編工作

13、。整個源程序整個源程序中只能有一條中只能有一條ENDEND命令,且命令,且位于程序的最后位于程序的最后。如果。如果ENDEND出現(xiàn)出現(xiàn)在程序中間,其后的源程序,將不進行匯編處理。在程序中間,其后的源程序,將不進行匯編處理。3 3EQUEQU(EQUateEQUate)標號賦值命令)標號賦值命令用于用于給標號賦值給標號賦值。賦值后,標號值在整個程序有效。賦值后,標號值在整個程序有效。例如:例如:TESTTESTEQU 2000HEQU 2000H表示表示TEST=2000HTEST=2000H,匯編時,凡是遇到,匯編時,凡是遇到TESTTEST時,均以時,均以2000H2000H來代替。來代替。

14、144DB(Define Byte)定義數(shù)據(jù)字節(jié)命令)定義數(shù)據(jù)字節(jié)命令用于從指定的地址開始,在程序存儲器連續(xù)單元中定義用于從指定的地址開始,在程序存儲器連續(xù)單元中定義字節(jié)數(shù)據(jù)。例如:字節(jié)數(shù)據(jù)。例如:ORG2000HDB30H,40H,24,C,B匯編后匯編后(2000H)=30H(2001H)=40H(2002H)=18H(十進制數(shù)十進制數(shù)24)(2003H)=43H(字符字符“C”的的ASCII碼碼)(2004H)=42H(字符字符“B”的的ASCII碼碼)155DW(Define Word)定義數(shù)據(jù)字命令)定義數(shù)據(jù)字命令該命令用于從指定的地址開始,在程序存儲器的連續(xù)單該命令用于從指定的地址

15、開始,在程序存儲器的連續(xù)單元中定義元中定義16位的數(shù)據(jù)字。例如:位的數(shù)據(jù)字。例如:ORG2000HDW1246H,7BH,10匯編后匯編后(2000H)=12H;第;第1個字個字(2001H)=46H(2002H)=00H;第;第2個字個字(2003H)=7BH(2004H)=00H;第;第3個字個字(2005H)=0AH16注意:注意:DBDB、DWDW和和DSDS命令命令只能對程序存儲器有效,只能對程序存儲器有效,不能對不能對數(shù)據(jù)存儲器數(shù)據(jù)存儲器使用。使用。7 7BIT BIT 位定義命令位定義命令用于給字符名稱賦以位地址,位地址可以是絕對位地用于給字符名稱賦以位地址,位地址可以是絕對位地

16、址,也可是符號地址。例如:址,也可是符號地址。例如:QAQABIT P1.6BIT P1.6功能是把功能是把P1.6P1.6的位地址賦給變量的位地址賦給變量QAQA。17184.1.2 4.1.2 編制程序的步驟編制程序的步驟1.1.任務分析(硬件、軟件系統(tǒng)分析)任務分析(硬件、軟件系統(tǒng)分析)2.2.確定算法和工作步驟;確定算法和工作步驟;3.3.程序總體設計和流程圖繪制程序總體設計和流程圖繪制關于流程圖符號:關于流程圖符號:開始、結束開始、結束-圓角矩形圓角矩形工作任務工作任務-矩形矩形判斷分支判斷分支-菱形菱形程序流向程序流向-程序連接程序連接-開始結束194. 4. 分配內存,確定程序與

17、數(shù)據(jù)區(qū)存放地址;分配內存,確定程序與數(shù)據(jù)區(qū)存放地址;5. 5. 編寫源程序;編寫源程序;6. 6. 調試、修改,最終確定程序。調試、修改,最終確定程序。204.1.3 4.1.3 方法技巧方法技巧1. 1. 模塊化設計(按功能分:顯示、打模塊化設計(按功能分:顯示、打 印、輸入、發(fā)送等)印、輸入、發(fā)送等)2. 2. 盡量采用循環(huán)及子程序結構(節(jié)省內存)盡量采用循環(huán)及子程序結構(節(jié)省內存)214.2 4.2 匯編語言基本程序結構匯編語言基本程序結構 n順序結構順序結構n分支程序結構分支程序結構n循環(huán)程序結構循環(huán)程序結構n子程序結構子程序和參數(shù)傳遞方法子程序結構子程序和參數(shù)傳遞方法22程序的基本組

18、成程序的基本組成ORG 0000HLJMP START ;轉向主程序ORG 0003HLJMP INTE0 ;轉向外中斷0服務子程序ORG 000BHLJMP INTTFO ;轉向定時/計數(shù)器0服務子程序 ;可按實際需要設置服務子程序ORG 0030HSTART:MOV A,#00H ;主程序從0030H單元開始MOV R1,#dataMOV R0,#00HDJNZ R1,LOOP0 ;初始化程序段 ;主程序主體區(qū)段23ORG 3100HA0: ;子程序A0RETA1 ;子程序A1RETORG 4100hINTIE0: ;外部中斷0中斷服務程序RETIORG 4800HINTTFO: ;定時/

19、計數(shù)器0中斷服務程序RETI ;其他中斷服務程序段ORG 5500HDBL0:DB 43,56, ;固定表格參量區(qū)段END ;結束 244.2.14.2.1順序結構順序結構25例:變量存在內部RAM的20H單元中,其取值范圍:05,編成,查表法求其平方值開始表格首地址送DPTR變量送A(20H) A查平方表(A+DPTR) A結束結果送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碼拆成兩個碼拆成兩個ACSIIACSII碼存入碼存入2121H H、22H22H單元。單元。內部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)開始結束290 (21H) (20H)AA與(21H)的低4位交換(21H)+30H(21H)A的高低半字節(jié)交換A+30HAA(22H)開始結束方法2:304.2.2分

21、支轉移程序設計分支轉移程序設計分為無條件轉移分為無條件轉移和和有條件轉移有條件轉移。無條件分支轉移程序很簡單,不討論。有條件分支轉移程序無條件分支轉移程序很簡單,不討論。有條件分支轉移程序按結構類型來分,又分為按結構類型來分,又分為單分支單分支選擇結構選擇結構和和多分支多分支選擇結構選擇結構。1單分支選擇結構單分支選擇結構 僅有僅有兩個出口兩個出口,兩者選一兩者選一。一般根據(jù)運算結果的狀態(tài)標志,。一般根據(jù)運算結果的狀態(tài)標志,用用條件判跳指令條件判跳指令來選擇并轉移。來選擇并轉移。3031【例例】 求單字節(jié)有符號數(shù)的二進制補碼求單字節(jié)有符號數(shù)的二進制補碼正數(shù)補碼正數(shù)補碼是其本身,是其本身,負數(shù)補

22、碼負數(shù)補碼是其是其反碼加反碼加1。因此,應首。因此,應首先判被轉換數(shù)的符號,負數(shù)進行轉換,正數(shù)本身即為補碼。先判被轉換數(shù)的符號,負數(shù)進行轉換,正數(shù)本身即為補碼。設二進制數(shù)放在A中,其補碼放回到A中,框圖如圖圖所示所示。3132參考程序如下:CMPT:JNB Acc.7,RETURN ;(A)0,不需轉換MOV C,Acc.7;符號位保存CPL A;(A)求反,加1ADD A,#1MOV Acc.7,C;符號位存在A的最高位RETURN:RET33此外,單分支選擇結構還有所示的幾種形式。33圖 單分支選擇結構2 圖 單分支選擇結構3342多分支選擇結構多分支選擇結構當程序的判別部分有兩個以上兩個

23、以上的出口出口時,為多分支選擇結構。有兩種形式,如所示。34 圖圖 多分支選擇結構1 1 圖圖 多分支選擇結構235指令系統(tǒng)提供了非常有用的指令系統(tǒng)提供了非常有用的兩種多分支選擇指令兩種多分支選擇指令:間接轉移指令間接轉移指令 JMP A+DPTR比較轉移指令比較轉移指令 CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE Ri,#data,rel間接轉移指令間接轉移指令“JMP A+DPTR”由數(shù)據(jù)指針由數(shù)據(jù)指針DPTR決定多決定多分支轉移分支轉移程序的程序的首地址首地址,由,由A的內容選擇對應分支的內容選擇對應分支。4條條比較

24、轉移指令比較轉移指令CJNE能對兩個欲比較的單元內容進能對兩個欲比較的單元內容進行比較,當行比較,當不相等不相等時,程序實現(xiàn)相對轉移;若時,程序實現(xiàn)相對轉移;若兩者相等兩者相等,則順序往下執(zhí)行。則順序往下執(zhí)行。3536簡單的分支轉移程序的設計,常采用逐次比較法逐次比較法,就是把所有不同的情況一個一個地進行比較,發(fā)現(xiàn)符合就轉向對應的處理程序。缺點是程序太長,有n種可能的情況,就需有n個判斷和轉移。復雜的分支轉移程序的設計,可用直接轉移指令(LJMP或AJMP指令)組成一個轉移表,然后把該單元的內容讀入累加器A,轉移表首地址放入DPTR中,再利用間接轉移指令實現(xiàn)分支轉移。3637例例:設變量:設變

25、量x x以補碼形式存放在片內以補碼形式存放在片內RAM 30HRAM 30H單元單元中,變量中,變量y y與與x x的關系是:的關系是:編程根據(jù)編程根據(jù)x x的值求的值求y y值并放回原單元。值并放回原單元。0, 50,200,xxxHxxy38A=?y=x+50y=20Hy=x0取x 即(30h) A開始存y 即y 30h結束39 ORG 0100HSTART:MOV A,30H JZ NEXT ;x=0,轉移 ANL A,#80H ;保留符號位 JZ ED ;x0,轉移 MOV A,#05H ;x0,不轉移 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 ;轉移地址送入轉移地址送入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的內容,轉至對應的分支程序。設的內容,轉至對應的分支程序。設R7R7的內容為的內容為0 0N N,對應,對應的處理程序地址分別為的處理程序地址分別為P0P0P7P7P0高位P0低位TABP1高位P1低位TAB+2414.2.3 循環(huán)程序設計循環(huán)程序設計程序中含有可以反復執(zhí)行的程序段,稱循環(huán)體循環(huán)體。例如,求100個數(shù)的累加和,沒必要連續(xù)安排100條加法指令,用一條加法指令使其循環(huán)執(zhí)行100次。因此可縮短程

28、序長縮短程序長度度和程序所占的內存單元數(shù)量更少占的內存單元數(shù)量更少,使程序結構緊湊程序結構緊湊。41421循環(huán)程序的結構循環(huán)程序的結構主要由以下四部分組成。(1)循環(huán)初始化)循環(huán)初始化完成循環(huán)前的準備工作。例如,循環(huán)控制計數(shù)初值的設置、地址指針的起始地址的設置、為變量預置初值等。(2)循環(huán)處理)循環(huán)處理完成實際的處理工作,反復循環(huán)執(zhí)行的部分,故又稱循環(huán)體。(3)循環(huán)控制)循環(huán)控制在重復執(zhí)行循環(huán)體的過程中,不斷修改循環(huán)控制變量,直到符合結束條件,就結束循環(huán)程序的執(zhí)行。4243循環(huán)結束控制方法分為循環(huán)計數(shù)控制法和條件控制法。(4)循環(huán)結束)循環(huán)結束這部分是對循環(huán)程序執(zhí)行的結果進行分析、處理和存放。

29、2循環(huán)結構的控制循環(huán)結構的控制分為循環(huán)計數(shù)控制結構循環(huán)計數(shù)控制結構和條件控制結構條件控制結構。圖4-8是計數(shù)循環(huán)控制結構,圖4-9是條件控制結構。434444圖4-8 計數(shù)循環(huán)控制結構 圖4-9 條件控制結構45(1)計數(shù)循環(huán)控制結構)計數(shù)循環(huán)控制結構依據(jù)計數(shù)器的值來決定循環(huán)次數(shù),一般為減1計數(shù)器,計數(shù)器減到“0”時,結束循環(huán)。計數(shù)器初值在初始化設定。MCS51指令系統(tǒng)提供了功能極強的循環(huán)控制指令:DJNZ Rn,rel;以工作寄存器作控制計數(shù)器DJNZ direct,rel;以直接尋址單元作控制計數(shù)器例如例如,計算n個數(shù)據(jù)的和,計算公式為 。如直接按公式編寫程序,則n=100時,需編寫連續(xù)的

30、100次加法。這樣程序將太長,并且n可變時,將無法編寫出程序。451niiyx46公式要改寫為用程序實現(xiàn)的形式,用下式表示程序框圖見圖。46圖圖 求數(shù)據(jù)和的程序框圖求數(shù)據(jù)和的程序框圖47【例例】 求n個單字節(jié)無符號數(shù)xi的和,xi按i順序存放在AT89C51單片機內部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作為計數(shù)控制變量,R0作為變址單元,用它來尋址xi。一般來說,循環(huán)工作部分中的數(shù)據(jù)應該用間接方式來尋址,如這里用:ADD A,R0計數(shù)控制計數(shù)控制只有在循環(huán)次數(shù)已知循環(huán)次數(shù)已知的情況下才適用。循環(huán)次循環(huán)次數(shù)未知數(shù)未知,不能用循環(huán)次數(shù)來控制,往往需要根據(jù)某種條件需要根據(jù)某種條件來判斷是否應該終止循環(huán)。4849(2)條件控制結構)條件控制結構循環(huán)控制中,設置一個條件,判是否滿足該條件,如滿足,則循環(huán)結束。如不滿足該條件則循環(huán)繼續(xù)?!纠?一串字符,依次存放在內部RAM

32、從30H單元開始的連續(xù)單元中,字符串以0AH為結束標志,測試字符串長度字符串長度。采用逐個字符依次與“0AH”比較(設置的條件)的方法。設置一個累計字符串長度的長度計數(shù)器和一個用于指定字符串指針。如果字符與“0AH”不等不等,則長度計數(shù)器和字符串指針都加1;如果比較相等相等,則表示該字符為“0AH”,字符串結束字符串結束,計數(shù)器值就是字符串的長度。程序如下:4950MOVR4,#0FFH;長度計數(shù)器初值送R4MOV R1,#2FH;字符串指針初值送R1NEXT:INC R4INC R1CJNE R1,#0AH,NEXT;比較,不等則進行下一 ;字符比較END上面兩例都是在一個循環(huán)程序中不再包含

33、其他循環(huán)程序,則稱該循環(huán)程序為單循環(huán)程序。如果一個循環(huán)程序中包含了其他循環(huán)程序,則稱為多重循環(huán)程序。最常見的多重循環(huán)是由DJNZ指令構成的軟件延時程序,是常用程序之一。5051例: 50ms延時子程序。設晶振頻率為12MHz,則機器周期為1us。DEL: MOV R7,#200 ;1MCDEL1:MOV R6,#123 ;1MC NOP ;1MC DJNZ R6,$ ;2MC DJNZ R7,DEL1 ;2MC RET ;2MC延時時間:t=1+200(1+1+2*123)+2+2 50000us=50ms524.2.4 4.2.4 子程序的設計子程序的設計 將那些需多次應用的、完成相同的某種

34、基本運算或操作將那些需多次應用的、完成相同的某種基本運算或操作的程序段從整個程序中獨立出來,單獨編成一個程序段,的程序段從整個程序中獨立出來,單獨編成一個程序段,需要時進行調用。這樣的程序段稱為需要時進行調用。這樣的程序段稱為子程序子程序。 優(yōu)點:優(yōu)點:采用子程序可使程序結構簡單,縮短程序的設計采用子程序可使程序結構簡單,縮短程序的設計時間,減少占用的程序存儲空間。時間,減少占用的程序存儲空間。 子程序在程序設計中非常重要,讀者應熟練掌握子程序子程序在程序設計中非常重要,讀者應熟練掌握子程序的設計方法。的設計方法。52531 1子程序的設計原則和應注意的問題子程序的設計原則和應注意的問題編寫子

35、程序應注意以下問題:編寫子程序應注意以下問題: (1 1)子程序的入口地址,前必須有標號。)子程序的入口地址,前必須有標號。 (2 2)主程序調用子程序,是通過調用指令來實現(xiàn)。有)主程序調用子程序,是通過調用指令來實現(xiàn)。有兩兩條子程序調用指令條子程序調用指令: 絕對調用指令絕對調用指令ACALL addr11ACALL addr11。雙字節(jié),。雙字節(jié),addr11addr11指出了指出了調用的目的地址,調用的目的地址,PCPC中中1616位地址中的高位地址中的高5 5位不變,被調用的位不變,被調用的子程序的首地址與絕對調用指令的下一條指令的高子程序的首地址與絕對調用指令的下一條指令的高5 5位

36、地址位地址相同,即只能在同一個相同,即只能在同一個2KB2KB區(qū)內。區(qū)內。 長調用指令長調用指令LCALL addr16LCALL addr16。三字節(jié),三字節(jié),addr16addr16為直接調為直接調用的目的地址,子程序可放在用的目的地址,子程序可放在64KB64KB程序存儲器區(qū)任意位置。程序存儲器區(qū)任意位置。5354(3 3)子程序結構中必須用到)子程序結構中必須用到堆棧堆棧,用來進行斷點和現(xiàn)場的,用來進行斷點和現(xiàn)場的保護。保護。(4 4)子程序返回主程序時,)子程序返回主程序時,最后一條指令必須是最后一條指令必須是RETRET指令指令,功能是把功能是把堆棧中的斷點地址堆棧中的斷點地址彈出

37、送入彈出送入PCPC指針中,從而實現(xiàn)子程指針中,從而實現(xiàn)子程序返回后從主程序斷點處繼續(xù)執(zhí)行主程序。序返回后從主程序斷點處繼續(xù)執(zhí)行主程序。(5 5)子程序可以)子程序可以嵌套嵌套,即主程序可以調用子程序,子程序,即主程序可以調用子程序,子程序又可以調用另外的子程序。又可以調用另外的子程序。54552子程序的基本結構子程序的基本結構典型的子程序的基本結構如下:MAIN: ;MAIN為主程序入口標號LCALL SUB;調用子程序SUB 子程序SUB:PUSH PSW;現(xiàn)場保護 PUSH AccPOP Acc ;現(xiàn)場恢復,注意要先進后出POP PSW RET;最后一條指令必須為RET55子程序處理程序

38、段子程序子程序56例:利用查表法求平方和 ,設a、b、c分別存于內部RAM的DA、DB、DC三個單元中。 MOV A,DA ;取a ACALL SQR ;調用查表子程序 MOV R1,A ;a的平方暫存R1中 MOV A,DB ;取b ACALL SQR ;調用查表子程序 ADD A,R1 ;求出平方和暫存阿A中 MOV DC,A ;結果存于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ù)補償、修正、計算、轉換等各種功能,具有程序簡單、執(zhí)行速度快等簡單、執(zhí)行速度快等優(yōu)點優(yōu)點。 查表查表是根據(jù)是根據(jù)自變量自變量x x,在表格,在表格尋找尋找y y,使,使y y = =f f( (x x) )。單片機。單片機中,數(shù)據(jù)表格存放于中,數(shù)據(jù)表格存放于程序存儲器程序存儲器內,在執(zhí)行查表指令時,發(fā)內,在執(zhí)行查表指令時,發(fā)出讀程序存儲器選通脈沖出讀程序存儲器選通脈沖 。兩條兩條極為有用的

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中內容與中內容與DPTRDPTR中的內容相加中的內容相加,結果為某一程序存儲單元的地址,然后把該地址單元的內容,結果為某一程序存儲單元的地址,然后把該地址單元的內容送到送到A A中。中。指令指令“MOVC AMOVC A,A+PCA+PC” ,PCPC的內容與的內容與A A的內容相加后所

41、得的內容相加后所得的數(shù)作為某一程序存儲器單元的地址,根據(jù)地址取出程序存儲的數(shù)作為某一程序存儲器單元的地址,根據(jù)地址取出程序存儲器相應單元中的內容送到累加器器相應單元中的內容送到累加器A A,指令執(zhí)行后,指令執(zhí)行后,PCPC的內容不發(fā)的內容不發(fā)生變化,仍指向該查表指令的下一條指令。生變化,仍指向該查表指令的下一條指令。優(yōu)點:優(yōu)點:在于預處理較少且不影響其他特殊功能寄存器的值,在于預處理較少且不影響其他特殊功能寄存器的值,不必保護其他特殊功能寄存器。不必保護其他特殊功能寄存器。5859缺點:缺點:在于該表格只能存放在這條指令的地址在于該表格只能存放在這條指令的地址X3X2X1X0X3X2X1X0以

42、下以下00H00HFFHFFH之中,即只能存放在地址范圍之中,即只能存放在地址范圍X3X2X1X0+1X3X2X1X0+1X3X2X1X0+100HX3X2X1X0+100H中,這就使得表格所在的程序空間受到了中,這就使得表格所在的程序空間受到了限制。限制。下面說明下面說明查表指令的用法查表指令的用法和和計算偏移量計算偏移量應注意的問題。應注意的問題。【例例】 設計一子程序,功能是根據(jù)累加器A中的數(shù)x(09之間)查x的平方表y,根據(jù)x的值查出相應的平方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中的內容加上中的內容加上 “01H01H”, “ “01H01H”即為查表指令與平方表之間的即為查表指令與平方表之間的“RETRET”指令所占的字節(jié)數(shù)。指令所占的字節(jié)數(shù)。加上加上 “ “01H01H”后,可保證后,可保證PCPC指向表首指向表首,累加器,累加器A A中原來的內容僅是從表首開始向下查找多少個中原來的內容僅是從表首開始向下查找多少個單元。單元。在進入程序前,在進入程序

44、前,A A的內容在的內容在000009H09H之間,如之間,如A A中的內容中的內容為為02H02H,它的平方為,它的平方為04H04H,可根據(jù),可根據(jù)A A的內容查出的內容查出x x的平方的平方指令指令“MOVC AMOVC A,A+DPTRA+DPTR” 應用范圍較廣,使用該指應用范圍較廣,使用該指令時不必計算偏移量,優(yōu)點是表格可以設在令時不必計算偏移量,優(yōu)點是表格可以設在64KB64KB程序存儲程序存儲器空間內的任何地方,而不像器空間內的任何地方,而不像“MOVC AMOVC A,A+PCA+PC”那樣只那樣只設在設在PCPC下面的下面的256256個單元中,所以使用較方便。個單元中,所

45、以使用較方便。61如果DPTR已被使用,則在查表前必須保護DPTR,且結束后恢復DPTR,例4-3可改成如下形式: PUSH DPH ;保存DPH PUSH DPL ;保存DPL MOV DPTR,#TAB1MOVC A,A+DPTRPOP DPL ;恢復DPLPOP DPH ;恢復DPHRETTAB1: DB 00H,01H,04H,09H,10H;平方表 DB 19H,24H,31H,40H,51H實際查表,有時x為單字節(jié)數(shù),y為雙字節(jié)數(shù)。來看下例。62【例例4-4】有一巡回檢測報警裝置,需對16路(x)輸入進行檢測,每路有一個最大允許值(y),為雙字節(jié)數(shù)。需根據(jù)測量的路數(shù)(x),查表找出

46、對應該路的最大允許值(y),看輸入值是否大于最大允許值,如果大于就報警。取路數(shù)為x(0 x15),y為最大允許值,放在表格中。設進入查表程序前,假設路數(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個單元中,如需把表格放在程序存儲個單元中,如需把表格放在程序存儲器空間的任何地方,應使用指令器空間的任何地方,應使用指令“ “ MOVC AMOVC A,A+DPTRA+DPTR”?!纠?-54-5】 以以AT89C51AT89C51為核心的溫度控制器,溫度傳感器為核心的溫度控制器,溫度傳感器輸出的電壓與溫度為非線性關系,傳感器輸出的電壓已

48、由輸出的電壓與溫度為非線性關系,傳感器輸出的電壓已由A/DA/D轉換為轉換為1010位二進制數(shù)。測得的不同溫度下的電壓值數(shù)據(jù)位二進制數(shù)。測得的不同溫度下的電壓值數(shù)據(jù)構成一個表,表中溫度值為構成一個表,表中溫度值為y y(雙字節(jié)無符號數(shù)),(雙字節(jié)無符號數(shù)),x x(雙字(雙字節(jié)無符號數(shù))為電壓值數(shù)據(jù)。設測得電壓值節(jié)無符號數(shù))為電壓值數(shù)據(jù)。設測得電壓值x x放入放入R2R3R2R3中,中,根據(jù)根據(jù)電壓值電壓值x x,查找對應的,查找對應的溫度值溫度值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程序存儲器空間任何位置,表格的長度可大于256B。672. 關鍵字查找程序設計關鍵字查找程序設計在表中查找關鍵字的操

50、作,也稱為數(shù)據(jù)檢索。有兩種方法,即順序檢索和對分檢索。a順序檢索順序檢索要檢索的表是無序無序的,檢索時只能從第只能從第1項開始逐項查項開始逐項查找找,判斷所取數(shù)據(jù)是否與關鍵字相等?!纠?從50個字節(jié)的無序表中查找一個關鍵字“xxH”。ORG1000HMOV30H,#xxH;關鍵字xxH送30H單元MOVR1,#50;查找次數(shù)送R1MOVA,#14;修正值送AMOV DPTR,#TAB4 ;表首地址送DPTR68LOOP: PUSH AccMOVC A, A+PC;查表結果送A CJNE A,40H,LOOP1;(40H)不等于關鍵字則轉LOOP1 MOV R2,DPH;查到關鍵字,把地址送

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個數(shù)已查完AJMPDONE;從子程序返回 TAB4: DB ,;50個無序數(shù)據(jù)表69b對分檢索對分檢索對分檢索的前提是檢索的數(shù)據(jù)表已經排好序已經排好序,以便于按照對分原則取數(shù)。如何進行數(shù)據(jù)排序,稍后介紹。對分檢索的方法對分檢索的方法:取數(shù)據(jù)表中間位置的數(shù)與關鍵字進行比較,如相等,則查找結束。如果取數(shù)大于關鍵字取數(shù)大于關鍵字,則下次對分檢索的范圍是從數(shù)據(jù)區(qū)起點到本次取數(shù)處。如果取數(shù)小于關鍵字取數(shù)小于關鍵字,則下次對分檢索的范圍是從本次取數(shù)數(shù)據(jù)區(qū)起點到數(shù)據(jù)區(qū)終點。依此類推,逐漸縮小檢索范圍,減少次數(shù),大大提高查找速度。70713. 數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論