第四章程序設計基礎ppt課件_第1頁
第四章程序設計基礎ppt課件_第2頁
第四章程序設計基礎ppt課件_第3頁
第四章程序設計基礎ppt課件_第4頁
第四章程序設計基礎ppt課件_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第4章 程序設計根底4.1 MCS-51單片機匯編言語的偽指令 MCS-51單片機中除了前面講述的指令系統(tǒng)中111條指令外,還有另一類指令,這類指 令稱為偽指令。例如在程序的開頭處有ORG,程序終了處END,等等。這些指令在匯編后 不產(chǎn)活力器碼,只是在程序進展匯編時,向匯編軟件提供程序中的一些特殊信息。比如,程序起止,定義的數(shù)據(jù),表格存放位置等。 下面引見單片機匯編言語程序設計中,常用的偽指令有以下幾種:1. 起始偽指令ORG ORG偽指令的功能是規(guī)定這條下面源程序和數(shù)據(jù)的起始地址格式為:ORG Addrl6.例如:ORG 2000H START: MOV A即規(guī)定標號START所在地址為20

2、00H,也就是第一條指令從2000H開場存放。普通說來,ORG Addrl6,表示了一個源程序或數(shù)據(jù)塊的起始地址。在一段程序中允許多次運用ORG指令,以規(guī)定不同的程序段或數(shù)據(jù)塊的起始位置,并規(guī)定地址從小到大,不允許重疊。 2終了偽指令END END偽指令用來指示源程序到此全部終了,在匯編時,當匯編程序檢測到源程序中 的該指令時,它就以為源程序曾經(jīng)到此為止。對END后面的指令都不予匯編。因此一個 源程序只能有一個END語句,且放在整個程序的末尾。 3賦值偽指令EQU 格式:字符稱號EQU常數(shù)或匯編符號 EQU偽指令的功能是將一個常數(shù)和匯編符號賦給字符稱號在運用中要留意:1字 符稱號不等于標號,不

3、用“:來作分隔符:(2)和MOV傳送指令不一樣,用EQU賦值的常數(shù)和匯編符號,其值在整個程序中有效;(3)運用EQU偽指令時必需先賦值,后運用:(4)用EQU賦過值的符號稱號可以用作數(shù)據(jù)地址,代碼地址,位地址或是一個立刻數(shù)??梢允?位或16位的。例如:ABC EQU 30HDLY EQU 8034HMOV A, ABCLCALL DLY這里ABC代表了30H的內(nèi)存單元。DLY定義16位地址,實踐是一個子程序的入口地址。4定義字符指令DB 格式:DB 8位二進制常數(shù)表DB偽指令的功能是從ROM的指定的地址單元開場存入DB后面的數(shù)據(jù),這些數(shù)據(jù) 可以是用逗號隔開的字節(jié)串或括在單引號中的ASCII字符

4、串。例如:ORG 2000HDB 54HTAB: DB 0B7H 34H 96HSTR: DB 6AB4定義字符指令DB 經(jīng)匯編后:(2000H)=54H(2001H)=B7H(2002H)=34H (2003H)=96H (2004H)=36H (2005H)=41H (2006H)=42H 其中36H,41H,42H分別是6、A、B的ASCII編碼值。 5定義字偽指令DW 格式:DW 16位數(shù)據(jù)表該指令用于從指定地址開場,在程序儲存器的延續(xù)單元中定義雙字節(jié)的數(shù)據(jù)。例如:ORG 1000HTAB:DW 3456H,7BH,10H 匯編后 (1000H)=34H (1001H)=56H(100

5、2H)=00H (1003H)=7BH (1004H)=00H (1005H)=10H 6定義儲存空間偽指令DS格式:DS 表達式在匯編時,從指令地址開場保管DS之后表達式的值所規(guī)定的儲存單元以備后用。例如:ORG 1000HDS 08HDB 30H匯編后,從1000H保管8個單元,然后(1008H)=30H。 留意:以上DB,DW,DS只對程序儲存器起作用,它們不能對數(shù)據(jù)儲存器進展初始化。 7位地址符號命令BIT格式:字符名 BIT 位地址 其功能是將BIT之后的位地址值賦給字符名。例如: A1 BIT P1.0 A2 BIT P1.1 SETB A1 ; (P1.0)1 CLR A2 ;

6、(P1.1)04.2 匯編言語程序的根本構造匯編言語程序普通有4種構造方式:順序構造,分支構造,循環(huán)構造利子程序構造。1順序構造順序構造是最簡單的程序構造,其特點:程序中的語句由前向后順序執(zhí)行,直到最后,這種程序中的無分支、循環(huán)和子程序調(diào)用。2分支程序分支程序是經(jīng)過條件轉(zhuǎn)移指令實現(xiàn)的,根據(jù)程序執(zhí)行中的條件對程序進展判別,滿足 條件那么進展程序轉(zhuǎn)移,不滿足條件就順序執(zhí)行。對于MCS-51單片機,能實現(xiàn)分支轉(zhuǎn)移的指令有JZ,JNZ,CJNE,DJNZ和位形狀條件判別指令JC,JNC,JB,JNB等。這些指令條件判別在指令系統(tǒng)中曾經(jīng)作了闡明。分支程序又分為單分支和多分支構造: 2分支程序(1)單分支

7、程序。單分支程序都是運用前述的條件轉(zhuǎn)移指令實現(xiàn)的。例4.1:假設內(nèi)部RAM40H與41H單元中有兩個無符號數(shù),現(xiàn)要求將其大者存入40H中,小者存入41H中。2分支程序源程序如下: MOV A, 40H CLR C SUBB A 41H JNC WAIT MOV A, 40H XCH A, 41H MOV 40H,A WAIT: SJMP WAIT 2分支程序例4.2:設變量X存于內(nèi)部RAM20H單元,函數(shù)值Y存于21H單元,試按照下式要求對Y賦值。 X+3 X0 Y= 20 X=0 X X0 流程圖如圖4.2所示:2分支程序源程序如下: MOV A, 20H JZ ZERO ;(A)=0 JB

8、 ACC.7, STORE ADD A, #03H SJMP STOREZERO: MOV ASTORE:MOV 21H (2) 多分支程序例4.3在某單片機運用系統(tǒng)中,接有一鍵盤,鍵值(代表哪個鍵被按下)存放在內(nèi)部 RAM的40H單元內(nèi)。設計一段程序?qū)崿F(xiàn)如下功能:假設(40H)=00H,調(diào)用子程序SUBl;假設(40H)=01H,調(diào)用子程序SUB2:假設(40H)=02H,調(diào)用子程序SUB3;假設(40H)=03H,調(diào)用子程序SUB4;假設(40H)=04H,調(diào)用子程序SUB5。 解:先畫出本例的表示流程圖如圖4.3: (2) 多分支程序程序如下: MOV A,40H MOV DPTR, #

9、TABLE RL A ; (A) (A)2 ADD A, 40H JMP A+DPTRTABLE:LCALL SUBl LCALL SUB2 LCALL SUB3 LCALL SUB4 LCALL SUB5上例的這種構造通常又稱為散轉(zhuǎn)構造。在本例中,由于LCALL指令是3字節(jié)指令,為保證JMP指令執(zhí)行后能正確調(diào)用相應子程序,所以JMP指令前要將(40H)乘3并存入A中。 3循環(huán)構造程序設計中,經(jīng)常需求延續(xù)反復執(zhí)行某段程序,處理這種問題最好采用循環(huán)構造的程序來完成,這種設計方法可大大地簡化程序。循環(huán)程序普通如下四部分組成:置循環(huán)初值用來設置循環(huán)初值,如:預置變量,計數(shù)器數(shù)據(jù)指針初值等,為循環(huán)作預

10、備。循環(huán)體循環(huán)體指要求反復執(zhí)行的程序段,經(jīng)過它完成對數(shù)據(jù)進展實踐處置的義務。 3循環(huán)構造修正控制變量普通用一個任務存放器Rn作為對循環(huán)次數(shù)的計數(shù),每循環(huán)一次計數(shù)器減一,即修正循環(huán)控制變量。 循環(huán)控制部分控制循環(huán)次數(shù),當循環(huán)一定的次數(shù)后當滿足循環(huán)終了條件時,停頓循環(huán)。(1)循環(huán)次數(shù)知的單循環(huán)例4.4:設計一段程序,統(tǒng)計累加器A的8位數(shù)中1的個數(shù),把結(jié)果存入30H單元中。 解題思緒:用RLC指令把A帶上Cy循環(huán)左移8次,每移一次,判移入Cy的能否為1,假設為1,(30H)+1。流程圖如圖4.5。 MOV 30H,#00H ;循環(huán)初值 MOV R2, #08H LOOP:RLC A JNC NEXT

11、 INC 30HNEXT: DJNZ R2(2). 條件控制的單重循環(huán)例4.5設字符串存放在RAM31H開場的單元中,以“$作為終了標志,現(xiàn)要求計算該字符串的長度,并將其存放在20H中。 程序如下: CRL A MOV R0,#31HLOOP: CJNE R0,#24H,NEXT ;與“$(ASCII值為十六進制24)比較 SJMP COMP ;找到“$終了NEXT: INC A ;不為“$那么計數(shù)器加1 INC R0 ;修正地址指針 SJMP LOOPCOMP: MOV 20H,A ;存結(jié)果4子程序 1子程序的概念 在程序設計中,經(jīng)常發(fā)生一些程序段被頻繁運用,如一些數(shù)學函數(shù)的計算,二十進制轉(zhuǎn)

12、換,顯示程序,延時程序等,為了防止反復節(jié)省內(nèi)存,常把這些程序作為一種獨立的,規(guī)范化的通用程序段,供需求時調(diào)用,這些獨立程序段稱為子程序。 主程序可以經(jīng)過專門的指令來調(diào)用子程序,稱子程序調(diào)用。當子程序執(zhí)行終了后,再由返主指令,前往到原程序,并帶回結(jié)果。2子程序設計幾點留意 l子程序的第一條指令地址稱為子程序的入口地址。該指令前必需求有標志,標號最 好以子程序功能命名,以便主程序調(diào)用,這樣會一目了然,例如延時程序常以DELAY作為標號。l主程序調(diào)用子程序是經(jīng)過LCALL、ACALL指令完成的。例如LCALL DELAY執(zhí) 行調(diào)用延時子程序,子程序前往主程序是經(jīng)過執(zhí)行RET指令來完成的。l子程序內(nèi)部

13、假設有控制轉(zhuǎn)移指令,最好運用相對轉(zhuǎn)移指令,以便匯編時生成不隨子 程序的存放地址改動而改動的代碼,子程序可以存放ROM空間的恣意位置。l 在子程序開場部分要留意現(xiàn)場維護,在退出子程序之前要恢復現(xiàn)場。維護現(xiàn)場和恢 復現(xiàn)場操作普通用PUSH和POP指令完成,要遵守“先進后出、后入先出的原那么。2子程序設計幾點留意在子程序運轉(zhuǎn)時,不可防止地要改動一些存放器或數(shù)據(jù)存儲器的內(nèi)容,有時這些內(nèi)容是主程序不可短少的,因此,在子程序調(diào)用時,應該先將有關存放器或存儲器的內(nèi)容維護起來,子程序前往前再恢復原來的內(nèi)容,這一過程稱為現(xiàn)場的維護與恢復?,F(xiàn)場維護通常由堆棧來完成,在子程序的開場部分運用壓棧指令,將需求維護的內(nèi)容

14、壓入堆棧;在子程序前往前經(jīng)過出棧指令,將原有的內(nèi)容彈出堆棧,送到原來的存放器或存儲器單元中,從而實現(xiàn)了現(xiàn)場維護與恢復。3子程序參數(shù)傳送 調(diào)用子程序時,主程序應把子程序運用的有關參數(shù)送入商定的位置,子程序運轉(zhuǎn)時,可以從商定的位置得到有關的參數(shù),這類由主程序提供應予子程序的參數(shù)叫做入口參數(shù)。同樣,在子程序終了前,也應把運算結(jié)果送到指定的位置,前往主程序后,主程序可以從指定的位置得到需求的結(jié)果,這類由子程序前往主程序的參數(shù)叫做入口參數(shù)。實現(xiàn)參數(shù)傳送有多種方法,常用的方法有以下三種:3子程序參數(shù)傳送1) 用任務存放器或累加器傳送參數(shù)。數(shù)據(jù)經(jīng)過R0-R7或累加器A來傳送。在調(diào)用前,先將數(shù)據(jù)送入存放器或者

15、累加器,供子程序運用。子程序執(zhí)行后結(jié)果參數(shù)仍由存放器和累加器送回。其優(yōu)點是程序簡單,速度快。缺陷是傳送的參數(shù)不能太多。2) 用指針存放器傳送參數(shù)。為了能傳送較多的數(shù)據(jù),可以運用指針存放器傳送參數(shù)。由于數(shù)據(jù)通常是存放在存儲器中,可用指針來指示數(shù)據(jù)的位置,并可實現(xiàn)變長度運算。假設數(shù)據(jù)在內(nèi)部RAM中,可以用R0或R1作為數(shù)據(jù)指針,假設參數(shù)在外部RAM中,可以運用DPTR作指針。3) 用堆棧傳送參數(shù)。運用堆棧進展參數(shù)傳送時,主程序運用PUSH指令把參數(shù)壓入堆棧,進入子程序后可以經(jīng)過堆棧指針POP指令來間接訪問堆棧中的參數(shù)。同樣,子程序的出口參數(shù)也可用堆棧傳送給主程序。請留意,在調(diào)用子程序時,斷點地址自

16、動進棧,占用兩個單元,在于程序中彈出參數(shù)時,不要把斷點地址也彈出。另外,在執(zhí)行RET指令時,要自動彈出斷點地址,以便正確前往。 3子程序參數(shù)傳送例4.6利用累加器傳送參數(shù)設有一個從21H開場存放的數(shù)據(jù)塊,每個單元均有一個十六進制數(shù)(0-F),數(shù)據(jù)塊長度存放在20H中,編程將他們轉(zhuǎn)化為相應ASCII碼,并存放在41H開場的單元中。根據(jù)ASCII碼表,0-9的ASCII碼為30H-39H,即只需加上30H就可得到相應ASCII碼,而A-F的ASCII碼為41H-46H,即只需加上37H也可得到相應的ASCII碼。 4.3 適用程序設計舉例4.3.1 數(shù)制轉(zhuǎn)換程序1二進制轉(zhuǎn)換成BCD碼十進制例4.7

17、:將RAM中30H單元中二進制數(shù)轉(zhuǎn)換為3位BCD碼格式的十進制數(shù),2位BCD碼占用2個字節(jié)單元,即百位數(shù)BCD碼放在32H單元中,十位和個位BCD碼放在31H單元中。2將二進制數(shù)轉(zhuǎn)成ASCII碼例4.8:將A中的二進制數(shù)(0-F)轉(zhuǎn)化為相應的ASCII碼CNV: ADD A,#90HDA AADC A,#40HDA ARET假設執(zhí)行ADD A,#90H和DA A兩條指令后產(chǎn)生進位,那么闡明被轉(zhuǎn)換二進制數(shù)不大于09H,否那么小于0AH,后兩條指令在于產(chǎn)生正確的高位ASCII代碼;二進制數(shù)大于09H時為4H;二進制數(shù)大于0AH時為3H。3BCD碼十進制轉(zhuǎn)換成二進制例4.9:假設在內(nèi)部RAM中40H

18、單元內(nèi)存中存有一個BCD十進制數(shù),設計一段程序把這個數(shù)轉(zhuǎn)換成二進制數(shù),并存入41H單元中。用(40H)16,商就是二進制數(shù)的高4位,余數(shù)就是二進制數(shù)的低4位,把這高、低4位組合,便是對應的二進制數(shù)。程序如下: MOV A,40H MOV B,#16 DIV AB SWAP A ADD A,B MOV 41H,A 4.3.2 算術和邏輯運算類程序設計1多字節(jié)加減運算利用ADDCSUBB指令及Cy標志位,能實現(xiàn)多字節(jié)的加減運算。運算時,從低字 節(jié)到高字節(jié)順序進展。假設參與運算是無符號數(shù),在產(chǎn)生進位(加法)或借位(減法)時,將置位Cy。假設參與運算的是有符號補碼,因原始輸入的數(shù)據(jù)最高位為符號位,故溢

19、出標志OV將指示溢出的情況。例4.10有二個多字節(jié)數(shù)相減,被減數(shù)的最低字節(jié)以R0為指針,減數(shù)的最低字節(jié)以R1為指針,數(shù)據(jù)長度由R2指示。減法結(jié)果送入原被減數(shù)所在的各單元。最后檢查能否有溢出。程序如下: SUBSTR:CLR C;清借位 SUBSI: MOV A,R0;取被減數(shù)字節(jié) SUBB A,R1 ;取減數(shù)字節(jié) MOV R0, A ;存差字節(jié) INC R0;指向下一個字節(jié) INC R1 DJNZ R2, SUBSI ;循環(huán)能否完成 JB OV, OVFU ;判溢出 RET ;OV=0,無溢出,前往 OVFU:(溢出處置) ;OV=1溢出 RET 2查找最大值例4.11:在內(nèi)部RAM 30H-

20、37H單元中存有8個無符號數(shù),設計一段程序找出其中最大值存入40H中。 首先取(30H),40H,后繼的字節(jié)取到A中將(A)與(40H)比較,將大數(shù)存入(40H)中。程序如下: 2查找最大值3延時程序在單片機運用程序中,經(jīng)常需求延時來到達控制目的。實現(xiàn)延時有兩種方法:一種采用內(nèi)部定時計數(shù)器來實現(xiàn)。在以后章節(jié)中表達:另一種是采用軟件延時方法。下面來引見軟件延時。例4.12:知單片機的晶振頻率fosc=12MHz,試計算執(zhí)行下面程序需求多少時間? DLYl: MOV R2,#data ;執(zhí)行時需1個機器周期 LOOP: NOP ;執(zhí)行時需1個機器周期 DJNZ R2 LOOP ;執(zhí)行時需2個機器周

21、期 RET ;執(zhí)行時需2個機器周期 解:由于晶振為12MHz,所以1個機器周期=1s,綜合計算執(zhí)行上段程序的時間為: T=1+ (1+2) data+2) 1s 當data1=01H,延時時間最短,T=6s;data=00H (相當于256),延時時間最長,T=771s。 在運用中,假設需求加長延時時間,可添加NOP例4.13:假設單片機晶振頻率fosc=12MHz, 試計算執(zhí)行下面程序需求多少時間? 這是一個雙重循環(huán)程序,LOOPl是外層循環(huán),循環(huán)次數(shù)為data1,LOOP2 是內(nèi)層循環(huán),循環(huán)次數(shù)為data2。 執(zhí)行該段程序時間T=(1+(1+2) data2+2) datal+2) 1s當

22、datal和data2都取01H時,延時時間最短,T=9s;當datal和data2都取00H時,延時時間最長,T=197379s。 4.3.3 查表程序設計在單片機運用系統(tǒng)中,查表程序的設計廣泛用于LED顯示的段碼控制,數(shù)據(jù)計算,代碼轉(zhuǎn)換等各種場所。 查表,首先在內(nèi)存中建立一個表格,表格中的數(shù)據(jù)可以經(jīng)過DB,DW偽指令來實現(xiàn),然后,根據(jù)自變量X,經(jīng)過查表指令,在表格中查找與其有某種關系的Y值。查表指令有如下兩條: MOVC A, A+DPTR MOVC A A+PC (1) 用DPTR作為基地址的查表方法 先將所查的表格首地址存入DPTR中 將訪問項的偏移值存入A 采用MOVC A,A+DPTR (2) 用PC作為基地址的查表方法 以PC為根底的方式用于較小部分的表格,它具有不影響數(shù)據(jù)指針的優(yōu)點,對于 中斷效力程序或數(shù)據(jù)指針DPTR不允許改動的場所,它的方法是: 先將欲查訪表的項數(shù)裝入累加器A中; 再將計算查表指令所在地址(該地址+1)到表首地址的偏移量,再加到累加器A中 執(zhí)行MOVC A A+PC指令,將查表內(nèi)容取出送入A中 例4.14:計算在R3存

溫馨提示

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

評論

0/150

提交評論