![匯編語言程序設(shè)計教材課件_第1頁](http://file4.renrendoc.com/view/69d2010390ea7573a1bbb0daa451aeea/69d2010390ea7573a1bbb0daa451aeea1.gif)
![匯編語言程序設(shè)計教材課件_第2頁](http://file4.renrendoc.com/view/69d2010390ea7573a1bbb0daa451aeea/69d2010390ea7573a1bbb0daa451aeea2.gif)
![匯編語言程序設(shè)計教材課件_第3頁](http://file4.renrendoc.com/view/69d2010390ea7573a1bbb0daa451aeea/69d2010390ea7573a1bbb0daa451aeea3.gif)
![匯編語言程序設(shè)計教材課件_第4頁](http://file4.renrendoc.com/view/69d2010390ea7573a1bbb0daa451aeea/69d2010390ea7573a1bbb0daa451aeea4.gif)
![匯編語言程序設(shè)計教材課件_第5頁](http://file4.renrendoc.com/view/69d2010390ea7573a1bbb0daa451aeea/69d2010390ea7573a1bbb0daa451aeea5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
項目4匯編語言程序設(shè)計項目4匯編語言程序設(shè)計1 什么是程序設(shè)計?程序設(shè)計=結(jié)構(gòu)+算法。 程序設(shè)計就像蓋房子,數(shù)據(jù)結(jié)構(gòu)就像磚、瓦,而算法就是設(shè)計圖紙。你若想蓋房子首先必須有原料(數(shù)據(jù)結(jié)構(gòu)),但是這些原料不能自動地蓋起了你想要的房子;你必須按照設(shè)計圖紙(算法)上的說明一磚一瓦地去砌。這樣你才能擁有你想要的房子。程序設(shè)計也一樣,程序設(shè)計時你得按照程序規(guī)定的功能去編寫,而程序的功能是實現(xiàn)就是算法的具體體現(xiàn)。所以通俗地說:你必須按照特定的規(guī)則,把特定的功能語句和基本結(jié)構(gòu)按照特定的順序排列起來,形成一個有特定功能的程序,這就是:程序設(shè)計=結(jié)構(gòu)+算法。
一般說來,計算機程序設(shè)計語言種類很多,不僅有機器語言和匯編語言,還有很多高級語言。對單片機而言,通常使用匯編語言或C語言進行程序設(shè)計,程序較大時一般采用C語言編寫,但用匯編語言編寫的程序執(zhí)行的效率較高。程序設(shè)計完成后,然后利用計算機或人工方法將匯編語言或C語言程序轉(zhuǎn)化為單片機可以執(zhí)行的機器語言。轉(zhuǎn)換前的匯編語言或C語言程序被稱為源程序,轉(zhuǎn)換后的機器語言程序被稱為目標(biāo)程序,轉(zhuǎn)換過程也叫匯編過程,通過計算機或人工轉(zhuǎn)換的方法又被稱為計算機匯編或手工匯編。計算機匯編要使用專門的軟件,叫匯編軟件。項目4匯編語言程序設(shè)計 什么是程序設(shè)計?程序設(shè)計=結(jié)構(gòu)+算法。項目4匯編語言程序24.1源程序的編制4.1.1程序設(shè)計步驟在對單片機系統(tǒng)進行程序設(shè)計時,必須考慮硬件資源的配置,當(dāng)硬件系統(tǒng)設(shè)計完成后,可以按照以下步驟進行程序設(shè)計。1.預(yù)完成任務(wù)的分析2.進行算法的優(yōu)化3.繪制程序流程圖4.分配資源5.編寫源程序6.程序優(yōu)化7.編譯,調(diào)試,修改和最后確定源程序項目4匯編語言程序設(shè)計4.1源程序的編制4.1.1程序設(shè)計步驟項目4匯編語言程3 用圖形符號將總體設(shè)計思路及程序流向繪制在平面圖上。從而使程序的結(jié)構(gòu)關(guān)系直觀明了,便于檢查和修改,它直觀清晰的體現(xiàn)了程序的設(shè)計思路,是程序設(shè)計的依據(jù)。 繪制流程圖時,首先畫出簡單的功能流程圖粗框圖,再對功能流程圖進行擴充和具體化,即對存儲器標(biāo)志位等單元做具體的分配和說明,把功能圖上的每一個粗框圖轉(zhuǎn)化為具體的存儲器或地址單元,從而繪制出詳細的程序流程圖。流線程序執(zhí)行順序流向線表示處理功能端點符號程序的開始和結(jié)束符號表示判斷功能判斷符號處理符號連接符號用來實現(xiàn)流程圖之間的連接程序流程圖的繪制項目4匯編語言程序設(shè)計 用圖形符號將總體設(shè)計思路及程序流向繪制在平面圖上。從而使44.1.2匯編語言源程序的格式 匯編語言源程序是由若干語句組成的,每一語句可由4個部分組成:標(biāo)號、操作碼、操作數(shù)及注釋。每一部分間以不同的分隔符分隔,語句格式如下:
[標(biāo)號]:操作碼[目的操作數(shù)][源操作數(shù)];[注釋]
其中[]項為可選項,視具體的指令選用. 標(biāo)號是表示該語句所在地址的標(biāo)志符號,使用標(biāo)號可方便程序中的其他語句訪問該語句。標(biāo)號由字母打頭的1-8個字母數(shù)字串組成,但指令保留符、寄存器名、位址記憶符、偽指令符等都不能作標(biāo)號使用。操作碼表示操作的性質(zhì),它是匯編指令中唯一不能缺省的部分。操作數(shù)表示操作的對象,在一條語句中,操作數(shù)可能是空白或以逗號分開的幾個。注釋是對語句或程序段功能的解釋說明有助于的閱讀和維護。項目4匯編語言程序設(shè)計4.1.2匯編語言源程序的格式項目4匯編語言程序設(shè)計54.1.3匯編語言源程序的匯編 將匯編語言源程序“翻譯”成機器語言目標(biāo)程序的過程稱為匯編,對單片機助記符的匯編有兩種方法:人工匯編和機器匯編。 人工匯編是用人工查表將源程序譯成機器碼。一般分為兩步進行。第一步將源程序中的指令逐條譯成目標(biāo)碼,指令中的標(biāo)號地址待求。第二步由偽指令求出標(biāo)號所代表的具體地址,進行有關(guān)程序存儲區(qū)的數(shù)據(jù)操作并進行偏移量的計算。 機器匯編是將源程序輸入計算機后,由匯編程序?qū)崿F(xiàn)翻譯工作,產(chǎn)生相應(yīng)的機器碼。這是一種非常高效和方便的方法。項目4匯編語言程序設(shè)計4.1.3匯編語言源程序的匯編項目4匯編語言程序設(shè)計64.1.4偽指令 在機器匯編時,對匯編過程進行控制和指導(dǎo)的指令稱為偽指令。在匯編過程中,偽指令供匯編程序識別和執(zhí)行但不產(chǎn)生可執(zhí)行的目標(biāo)代碼。如規(guī)定匯編生成的目標(biāo)代碼在ROM中的存放區(qū)域,給源程序符號、標(biāo)號賦值,指示匯編結(jié)束等。每種匯編程序都有自己的偽指令,標(biāo)準(zhǔn)的MCS-51定義的偽指令常用的有以下7條。1.匯編其始地址偽指令——ORG(Origin)格式:ORG16位地址功能:規(guī)定該指令后的下一段源程序經(jīng)匯編后生成的代碼存放的起始地址。例如:ORG0500HSTART:MOVA,R0……END ORG偽指令總是出現(xiàn)在每段源程序或數(shù)據(jù)塊的開始,匯編語言源程序中多處使用ORG指令,可使程序員把子程序、數(shù)據(jù)塊存放在ROM的任何位置。每當(dāng)ORG出現(xiàn)時,下條指令的存放地址由此重新定位,所以O(shè)RG定義地址的順序應(yīng)有小到大,且不能重疊。項目4匯編語言程序設(shè)計4.1.4偽指令項目4匯編語言程序設(shè)計72.匯編結(jié)束偽指令-END(EndofAssembly)指令格式:[標(biāo)號]:END功能:結(jié)束匯編語言源程序的操作。在源程序中只能有一條END,END后所寫的指令,匯編程序不予處理。項目4匯編語言程序設(shè)計2.匯編結(jié)束偽指令-END(EndofAssembly)83.符號賦值偽指令——EQU(EQUate)指令格式:字符名稱EQU數(shù)或匯編符號功能:將一個數(shù)或特定的匯編符號賦給指定的字符名稱。字符名稱為一自定的符號,而不是標(biāo)號,字符名稱后無“:”。字符名稱可用來作數(shù)據(jù)地址,立即數(shù),位地址或者是一代碼地址,其值可以是一個8位數(shù),也可以是16位數(shù)。例如:TESTEQU20HMOVA,TEST 這里字符名稱TEST就代表了內(nèi)部RAM20H地址單元。又例如:A1EQU10HMOVA,A1這里A1代表片內(nèi)RAM的直接地址單元10H。使用EQU偽指令可以把抽象的數(shù)字地址表示成有一定意義的符號,增強程序的可讀性。項目4匯編語言程序設(shè)計3.符號賦值偽指令——EQU(EQUate)項目4匯編語言94.定義數(shù)據(jù)字節(jié)偽指令——DB(DefineByte) 格式:[標(biāo)號:]DB<項或項表> 項或項表是指一個字節(jié),逗號隔開的8位二進制的數(shù)或字符串,或撇號’括起來的ASCII字符串。 功能:從標(biāo)號指定的地址單元開始,在程序存儲器中存入一組8位二進制數(shù),或者將一個數(shù)據(jù)表格存入程序存儲器。這條偽指令匯編后影響程序存儲器的內(nèi)容。例如:ORG1100HTAB:DB01H,04H,09H,10HDB00001111B,‘1’,‘A’,‘BC’項目4匯編語言程序設(shè)計4.定義數(shù)據(jù)字節(jié)偽指令——DB(DefineByte)項目105.定義數(shù)據(jù)字命令——DW(DefineWord)格式:[標(biāo)號:]DW<項或項表>功能:DW的功能和DB類似,DW是從標(biāo)號指定的地址開始存放16位而非8位二進制數(shù),存放時,數(shù)據(jù)字的高8位在前(低地址),低8位在后(高地址)。例如:ORG5000HMOVA,#30H………ORG5020HADDTAB:DW1234H,100H,10………;END 一條DB和DW語句定義的數(shù)表其數(shù)的個數(shù)不得超過80個。當(dāng)數(shù)據(jù)的數(shù)目較多時,可使用多個定義命令。在MCS-51程序設(shè)計應(yīng)用中,常以DW來定義地址。項目4匯編語言程序設(shè)計5.定義數(shù)據(jù)字命令——DW(DefineWord)項目4116.預(yù)留存儲區(qū)偽指令——DS(DefineStorage) 格式:[標(biāo)號:]DS<表達式> 功能:本命令用于從指定地址開始,保留DS之后表達式的值所需數(shù)目的字節(jié)單元作為存儲區(qū)以備后用。匯編時,對這些單元不賦值。例如:ORG0100HMOVA,#50H………ADDRTABL:DS05HDB20HEND 從標(biāo)號ADDRTABL代表的地址開始,保留5個連續(xù)的ROM地址單元,第6個單元存放20H。
對MCS-51單片機來說,DB,DW,DS偽指令只能對程序存儲器使用,而不能對數(shù)據(jù)存儲器進行初始化。項目4匯編語言程序設(shè)計6.預(yù)留存儲區(qū)偽指令——DS(DefineStorage)127.位地址賦值偽指令——BIT 格式:[字符名稱]BIT<位地址> 功能:本命令用于給字符名稱賦以位地址。其中<位地址>可以是絕對地址,也可以是符號地址(即位符號名稱)。例如:AQBITP1.0A2BIT07H 這兩條指令分別把P1.0的位地址賦給變量AQ,位地址07H賦給符號名A2,在其后的編程中AQ和A2就可以作為位地址使用。項目4匯編語言程序設(shè)計7.位地址賦值偽指令——BIT項目4匯編語言程序設(shè)計134.1.5程序設(shè)計技巧1.模塊化程序設(shè)計方法 單片機應(yīng)用系統(tǒng)的程序一般由包含多個模塊的主程序和各種子程序組成。每一程序模塊都要完成一個明確的任務(wù),實現(xiàn)某個具體的功能,如發(fā)送、接收、延時、打印、顯示等。采用模塊化的程序設(shè)計方法,就是將這些不同的具體功能程序進行獨立的設(shè)計和分別調(diào)試,最后將這些模塊程序裝配成整體程序并進行聯(lián)調(diào)。項目4匯編語言程序設(shè)計4.1.5程序設(shè)計技巧項目4匯編語言程序設(shè)計14 把一個多功能的、復(fù)雜的程序劃分為若干個簡單的、功能單一的程序模塊的程序設(shè)計方法具有明顯的優(yōu)點:1)單個模塊結(jié)構(gòu)的程序功能單一,易于設(shè)計、編寫、調(diào)試及修改;2)有利于程序的優(yōu)化和分工,從而可使多個程序員同時進行程序的編寫和調(diào)試,加快軟件研制進度;3)提高了程序的閱讀性和可靠性,使程序的結(jié)構(gòu)層次一目了然,同時4)對程序的修改可局部進行,其他部分可以保持不變,便于功能擴充和版本升級;5)對于使用頻繁的子程序可以建立子程序庫,便于多個模塊調(diào)用。項目4匯編語言程序設(shè)計 把一個多功能的、復(fù)雜的程序劃分為若干個簡單的、功能單一的15 模塊的劃分有很大的靈活性,但也不能隨意劃分。劃分時應(yīng)遵循下述原則:1)每個模塊應(yīng)具有獨立的功能,能產(chǎn)生一個明確的結(jié)果,這就是單模塊的功能高內(nèi)聚性。2)模塊之間的控制耦合應(yīng)盡量簡單,數(shù)據(jù)耦合應(yīng)盡量少,這就是模塊間的低耦合性??刂岂詈鲜侵改K進入和退出的條件及方式,數(shù)據(jù)耦合是指模塊間的信息交換(傳遞)方式、交換量的多少及交換的頻繁程度。3)模塊長度適中。模塊語句的長度通常在20條~100條的范圍較合適。模塊太長時,分析和調(diào)試比較困難,失去了模塊化程序結(jié)構(gòu)的優(yōu)越性;過短則模塊的連接太復(fù)雜,信息交換太頻繁,因而也不合適。項目4匯編語言程序設(shè)計 模塊的劃分有很大的靈活性,但也不能隨意劃分。劃分時應(yīng)遵循162.程序設(shè)計技巧1)盡量采用循環(huán)結(jié)構(gòu)和子程序。2)盡量少用無條件轉(zhuǎn)移指令。3)對于通用的子程序,考慮到其通用性,除了用于存放子程序入口參數(shù)的寄存器外,子程序中用到的其他寄存器的內(nèi)容應(yīng)壓入堆棧(返回前再彈出)進行現(xiàn)場保護,并要特別注意堆棧操作的壓入和彈出的平衡。一般不必把標(biāo)志寄存器壓入堆棧。4)對于中斷處理子程序除了要保護程序中用到的寄存器外,還應(yīng)保護標(biāo)志寄存器。5)累加器是信息傳遞的樞紐。項目4匯編語言程序設(shè)計2.程序設(shè)計技巧項目4匯編語言程序設(shè)計174.2程序結(jié)構(gòu)4.2.1順序程序 順序結(jié)構(gòu)是按照邏輯操作順序,從某一條指令開始逐條順序執(zhí)行,直至某一條指令為止,無分支,也無循環(huán)。順序結(jié)構(gòu)是所有程序設(shè)計中最基本、最單純的程序結(jié)構(gòu)形式,在程序設(shè)計中使用最多,因而是一種最簡單且應(yīng)用最普遍的程序結(jié)構(gòu)。一般實際應(yīng)用程序遠比順序結(jié)構(gòu)復(fù)雜得多,但它是組成復(fù)雜程序的基礎(chǔ)和主干。項目4匯編語言程序設(shè)計4.2程序結(jié)構(gòu)4.2.1順序程序項目4匯編語言程序設(shè)計18【例4.1】將兩個半字節(jié)數(shù)合并成一個一字節(jié)數(shù)。 設(shè)內(nèi)部RAM40H、41H單元中分別存放著8位二進制數(shù)。要求取出兩個單元的低半字節(jié),合并成一個字節(jié)后,存入42H單元。開始(40H)內(nèi)容送A,屏蔽高位A與R1或后送入(42H)交換高低位,送入R1(41H)內(nèi)容送A,屏蔽高位返回圖4-1例1程序流程圖項目4匯編語言程序設(shè)計【例4.1】將兩個半字節(jié)數(shù)合并成一個一字節(jié)數(shù)。開始(40H)19【例4.2】用順序結(jié)構(gòu)程序編寫三字節(jié)無符號數(shù)的加法程序。設(shè)被加數(shù)存放在:40H(高字節(jié)),41H(中字節(jié)),42H(低字節(jié))加數(shù)存放在:43H(高字節(jié)),44H(中字節(jié)),45H(低字節(jié))運算結(jié)果仍存在被加數(shù)單元中。開始取低字節(jié)數(shù)據(jù)返回相加后送回被加數(shù)單元取中字節(jié)數(shù)據(jù)帶進位位相加后送回被加數(shù)單元取高字節(jié)數(shù)據(jù)帶進位位相加后送回被加數(shù)單元圖4-2例2程序流程圖項目4匯編語言程序設(shè)計【例4.2】用順序結(jié)構(gòu)程序編寫三字節(jié)無符號數(shù)的加法程序。開始204.2.2分支程序 通常,單純的順序結(jié)構(gòu)程序只能解決一些簡單的算術(shù)、邏輯運算,或者簡單的查表、傳送操作等。實際問題一般都是比較復(fù)雜的,總是伴隨有邏輯判斷或條件選擇,要求計算機能根據(jù)給定的條件進行判斷,選擇不同的處理路徑,從而表現(xiàn)出某種智能。 根據(jù)程序要求改變程序執(zhí)行順序,即程序的流向有兩個或兩個以上的出口,根據(jù)指定的條件選擇程序流向的程序結(jié)構(gòu)我們稱為分支程序結(jié)構(gòu)。 通常根據(jù)分支程序中出口的個數(shù)分為單分支結(jié)構(gòu)程序(兩個出口)和多分支結(jié)構(gòu)程序(三個或三個以上出口)。 在MCS-51指令系統(tǒng)中,通過條件判斷實現(xiàn)單分支程序轉(zhuǎn)移的指令有JZ、JNZ、CJNE和DJNZ等。此外,還有以位狀態(tài)為條件,進行程序分支的指令JC、JNC、JB、JNB和JBC等。使用這些指令,可以完成或為0、1,或為正、為負,以及相等、不相等各種條件判斷,以實現(xiàn)程序有條件地轉(zhuǎn)移。項目4匯編語言程序設(shè)計4.2.2分支程序項目4匯編語言程序設(shè)計211.兩分支程序設(shè)計【例4.3】兩個無符號數(shù)比較(兩分支)。內(nèi)部RAM的30H單元和31H單元各存放了一個8位無符號數(shù),請比較這兩個數(shù)的大小,大數(shù)放在32H中。開始X-YCy=1?30H→32H31H→32HYN結(jié)束4-3兩數(shù)比較流程圖項目4匯編語言程序設(shè)計1.兩分支程序設(shè)計開始X-YCy=1?30H→32H31H→222.三分支程序設(shè)計【例4.4】兩個無符號數(shù)比較(三分支程序)。內(nèi)部RAM的20H單元和30H單元各存放了一個8位有符號數(shù),根據(jù)下列條件編程點亮相應(yīng)的發(fā)光二極管,電路如圖4-4所示,。若(20H)=(30H),則P2.0管腳連接的黃色LED發(fā)光;若(20H)>(30H),則P2.1管腳連接的綠色LED發(fā)光;若(20H)<(30H),則P2.2管腳連接的紅色LED發(fā)光。開始X=Y?X>Y?黃燈點亮YN結(jié)束NY紅燈點亮綠燈點亮項目4匯編語言程序設(shè)計2.三分支程序設(shè)計開始X=Y?X>Y?黃燈點亮YN結(jié)束N233.散轉(zhuǎn)程序 散轉(zhuǎn)程序是指經(jīng)過某個條件判斷之后,程序有多個流向(三個以上)。MCS-51單片機指令系統(tǒng)中專門提供了散轉(zhuǎn)指令,使得散轉(zhuǎn)程序的編制更加簡潔。 【例4.5】在例4.4的電路的基礎(chǔ)上加兩個開關(guān)組成簡單的信號燈電路,如圖4-6所示,試編程實現(xiàn)以下功能。K0K10 0 都按下,紅黃綠燈全亮(狀態(tài)1)0 1 K0單獨按下,紅燈亮(狀態(tài)2)1 0K1單獨按下,綠燈亮(狀態(tài)3)1 1 都未按下,黃燈亮(狀態(tài)4)項目4匯編語言程序設(shè)計3.散轉(zhuǎn)程序項目4匯編語言程序設(shè)計24開始讀P1口引腳狀態(tài)→A轉(zhuǎn)移指令表基地址→DPTR屏蔽無關(guān)位散轉(zhuǎn)移狀態(tài)1狀態(tài)2狀態(tài)3狀態(tài)4返回返回返回返回項目4匯編語言程序設(shè)計開始讀P1口引腳狀態(tài)→A轉(zhuǎn)移指令表基地址→DPTR屏蔽無關(guān)位254.2.3循環(huán)程序 循環(huán)結(jié)構(gòu)程序是把需要多次重復(fù)使用的程序段,利用轉(zhuǎn)移指令反復(fù)轉(zhuǎn)向該程序段,從而大大縮短程序代碼,減少占用程序空間,程序結(jié)構(gòu)也大大優(yōu)化。循環(huán)程序可以分為單重循環(huán)和多重循環(huán),其通常有兩種編制方法:一種是先執(zhí)行后判斷,另一種是先判斷后執(zhí)行。如圖4-8所示。開始初始化循環(huán)處理循環(huán)控制循環(huán)完成?NY循環(huán)結(jié)束結(jié)束開始初始化循環(huán)控制循環(huán)完成?NY循環(huán)結(jié)束結(jié)束循環(huán)處理項目4匯編語言程序設(shè)計4.2.3循環(huán)程序開始初始化循環(huán)處理循環(huán)控制循環(huán)完成?NY循261.單重循環(huán)程序設(shè)計 【例4.6】數(shù)據(jù)極值查找程序。設(shè)內(nèi)部RAM從30H單元開始存放有8個數(shù),找出其中最大的數(shù),放到60H單元。 解:極值查找操作的主要內(nèi)容是進行數(shù)值大小比較。假定在比較過程中,以A存放大數(shù),與之逐個比較的另一個數(shù)放在50H單元。采用先執(zhí)行后判斷的結(jié)構(gòu),首先設(shè)定比較次數(shù),在比較結(jié)束后,把查找到的最大數(shù)送到60H單元。程序流程圖如圖4-9所示。開始數(shù)據(jù)區(qū)首地址→R0讀下一個數(shù)→50H(50H)→A(A)>(50H)?NYA→(60H)結(jié)束數(shù)據(jù)個數(shù)→R7讀第一個數(shù)→AR7-1→R7R7-1=0?NY項目4匯編語言程序設(shè)計1.單重循環(huán)程序設(shè)計開始數(shù)據(jù)區(qū)首地址→R0讀下一個數(shù)→50H27 【例4.7】將內(nèi)部RAM中30H單元開始的數(shù)據(jù)傳送到外部RAM1200H開始的存儲空間內(nèi),直到發(fā)現(xiàn)數(shù)據(jù)‘100’停止傳送。開始A=100?取內(nèi)部RAM數(shù)據(jù)→AYN結(jié)束傳送數(shù)據(jù)到外部RAM圖4-10例4.7流程圖解:由于循環(huán)次數(shù)事先不知道,但是循環(huán)條件可以測試到,可以采用先判斷后執(zhí)行的程序結(jié)構(gòu)。流程圖如圖4-10所示。開始A=100?取內(nèi)部RAM數(shù)據(jù)→AYN結(jié)束傳送數(shù)據(jù)到外部RAM圖4-10例4.7流程圖項目4匯編語言程序設(shè)計 【例4.7】將內(nèi)部RAM中30H單元開始的數(shù)據(jù)傳送到外282.多重循環(huán)程序設(shè)計—定時程序 在循環(huán)內(nèi)套循環(huán)的程序結(jié)構(gòu)稱多重循環(huán),或稱循環(huán)嵌套。若把每重循環(huán)的內(nèi)部看作一個整體,則多重循環(huán)的結(jié)構(gòu)與單重循環(huán)的結(jié)構(gòu)是一樣的,也由四部分組成。 多重循環(huán)的執(zhí)行過程是從內(nèi)向外逐層展開的。內(nèi)層執(zhí)行完全部循環(huán)后,外層則完成一次循環(huán),逐次類推。因此,每執(zhí)行一次外層循環(huán),內(nèi)層必須重新設(shè)置初值,故每層均包含完整的循環(huán)程序結(jié)構(gòu)。層次必須分明,層次之間不能有交叉;否則,將產(chǎn)生錯誤。 定時程序是一種很典型的多重循環(huán)程序,其在單片機匯編語言程序設(shè)計中使用非常廣泛,例如定時檢測、定時掃描、定時中斷等。所謂定時就是讓CPU做一些與主程序功能無關(guān)的操作(例如將一個數(shù)字逐次減1直到為0)來空耗掉CPU的時間來達到延時的目的。由于我們知道CPU執(zhí)行每條指令的準(zhǔn)確時間,因此執(zhí)行整個延時程序的時間也可以精確計算出來。也就是說,我們可以寫出延時長度任意而且精度相當(dāng)高的延時程序。項目4匯編語言程序設(shè)計2.多重循環(huán)程序設(shè)計—定時程序項目4匯編語言程序設(shè)計29【例4.8】設(shè)計一個延時50ms的程序,設(shè)單片機時鐘晶振頻率為fosc=12MHz。 解:延時程序一般采用循環(huán)程序結(jié)構(gòu)編程,通過確定循環(huán)程序中的循環(huán)次數(shù)和循環(huán)程序段兩個因素來確定延時時間。題目給定fosc=12MHz,那么機器周期的計算方法:T機器=12T時鐘=12×(1/12M)=1μs。下面就是一個最簡單的單循環(huán)定時程序:MOVR7,#TIMELOOP:NOPNOP DJNZR7,LOOP NOP指令的機器周期為1,用來提高定時精度,DJNZ指令的機器周期為2,故一次循環(huán)共4個機器周期。一個機器周期是1μS,則一次循環(huán)的延遲時間為4μS。上面程序總的延遲時間為4×time(μS)。本程序的實際延遲時間取決于裝入寄存器R7的定時時間常數(shù)time。R7是8位寄存器,故這個程序的最長定時時間為256×4=1020(μS),即定時范圍是4~1024μS??梢妴窝h(huán)定時程序的時間延遲較小。項目4匯編語言程序設(shè)計【例4.8】設(shè)計一個延時50ms的程序,設(shè)單片機時鐘晶振頻率30 為了加長定時時間,通常采用多重循環(huán)方法。流程圖如圖4-11所示。開始外循環(huán)次數(shù)TIME1→R7內(nèi)循環(huán)次數(shù)TIME2→R6空操作R6-1=0?NYR7-1=0?NY返回圖4-11多重循環(huán)流程圖程序如下:
MOVR7,#TIME1LOOP2:MOVR6,#TIME2LOOP1:NOPDJNZR6,LOOP1 DJNZR7,LOOP2RET最大定時時間計算公式為:(256×2+2+2)×256+1=132097(μS)若定時50ms,采取合適的TIME1和TIME2即可,如TIME1=200和TIME2=123。項目4匯編語言程序設(shè)計 為了加長定時時間,通常采用多重循環(huán)方法。流程圖如圖4-131 循環(huán)控制:在重復(fù)執(zhí)行循環(huán)體的過程中,不斷修改和判別循環(huán)變量,直到符合循環(huán)結(jié)束條件。一般情況下,循環(huán)控制有以下幾種方式:(1)計數(shù)循環(huán)——如果循環(huán)次數(shù)已知,用計數(shù)器計數(shù)來控制循環(huán)次數(shù),這種控制方式用得比較多。循環(huán)次數(shù)要在初始化部分予置,在控制部分修改,每循環(huán)一次計數(shù)器內(nèi)容減1。(2)條件控制循環(huán)——在循環(huán)次數(shù)未知的情況下,一般通過設(shè)立結(jié)束條件來控制循環(huán)的結(jié)束。(3)循環(huán)結(jié)束處理:這部分程序用于存放執(zhí)行循環(huán)程序所得結(jié)果以及恢復(fù)各工作單元的初值等。項目4匯編語言程序設(shè)計 循環(huán)控制:在重復(fù)執(zhí)行循環(huán)體的過程中,不斷修改和判別循環(huán)變324.2.4查表程序 在微型機控制系統(tǒng)中,有些參數(shù)的計算是非常復(fù)雜的,用計算法計算不僅程序長,難于計算,而且需要耗費大量時間。還有一些非線性參數(shù),它們不是用一般算術(shù)運算就可以計算出來,而是要涉及到指數(shù),對數(shù),三角函數(shù),以及積分,微分等運算。所有這些運算用匯編語言編程計算都比較復(fù)雜,有些甚至無法建立相應(yīng)的數(shù)學(xué)模型。為了解決這些問題,可以采用查表法。 所謂查表法,就是把事先計算或測得的數(shù)據(jù)按一定順序編制成表格,查表程序的任務(wù)就是根據(jù)被測參數(shù)的值或者中間結(jié)果,查出最終所需要的結(jié)果。它具有程序簡單,執(zhí)行速度快等優(yōu)點。 查表程序在微型機控制系統(tǒng)中應(yīng)用非常廣泛,例如,在鍵盤處理程序中,查找按鍵相應(yīng)的命令處理子程序的入口地址;在LED顯示程序中,獲得LED數(shù)碼管的顯示代碼;在一些快速計算的場合,根據(jù)自變量的值,從函數(shù)表上查找出相應(yīng)的函數(shù)值以及實現(xiàn)非線性修正、代碼轉(zhuǎn)換等等。所有這些應(yīng)用,都需采用查表技術(shù)。項目4匯編語言程序設(shè)計4.2.4查表程序項目4匯編語言程序設(shè)計33【例4.8】查表計算函數(shù)y=x!(x=0、1、2、…、7)的值xY值Y地址000TABLE00TABLE+1101TABLE+200TABLE+3202TABLE+400TABLE+5306TABLE+600TABLE+7424TABLE+800TABLE+9520TABLE+A01TABLE+B620TABLE+C07TABLE+D740TABLE+E50TABLE+F項目4匯編語言程序設(shè)計【例4.8】查表計算函數(shù)y=x!(x=0、1、2、…、7)的344.2.5子程序 在實際的程序設(shè)計中,常會遇到多次應(yīng)用的、完成相同的某種基本運算或操作的程序段。如果每用一次都從頭編寫一次,這不僅麻煩,使程序冗長,而且浪費存儲空間,還使程序的出錯率增加,給程序的調(diào)試帶來困難。 所以,在實際的程序設(shè)計中,將那些需多次應(yīng)用的、完成相同的某種基本運算或操作的程序段從整個程序中獨立出來,單獨編制成一個程序段,盡量使其標(biāo)準(zhǔn)化,并存放于某一存儲區(qū)域;需要時通過調(diào)用指令進行調(diào)用。這樣的程序段,稱為子程序,如我們在實訓(xùn)中的延時子程序。項目4匯編語言程序設(shè)計4.2.5子程序項目4匯編語言程序設(shè)計35 子程序作為一個具有獨立功能的程序段,編程時需遵循以下原則:1.子程序的第一條指令必須有標(biāo)號,明確子程序入口地址。2.以返回指令RET結(jié)束子程序。3.簡明扼要的子程序說明部分。4.較強的通用性和可浮動性,盡可能避免使用具體的內(nèi)存單元和絕對轉(zhuǎn)移地址等。5.注意保護現(xiàn)場和恢復(fù)現(xiàn)場。 另外,在編制子程序前,最好以程序注釋的形式對子程序進行說明,說明內(nèi)容如下:1.子程序名:提供給主程序調(diào)用的名字。2.子程序功能:簡要說明子程序能完成的主要功能。3.入口參數(shù):主程序需要向子程序提供的參數(shù)。4.出口參數(shù):子程序執(zhí)行完之后向主程序返回的參數(shù)。5.占用資源:該子程序中使用了那些存儲單元、寄存器等。項目4匯編語言程序設(shè)計 子程序作為一個具有獨立功能的程序段,編程時需遵循以下原則:36演講完畢,謝謝觀看!演講完畢,謝謝觀看!37項目4匯編語言程序設(shè)計項目4匯編語言程序設(shè)計38 什么是程序設(shè)計?程序設(shè)計=結(jié)構(gòu)+算法。 程序設(shè)計就像蓋房子,數(shù)據(jù)結(jié)構(gòu)就像磚、瓦,而算法就是設(shè)計圖紙。你若想蓋房子首先必須有原料(數(shù)據(jù)結(jié)構(gòu)),但是這些原料不能自動地蓋起了你想要的房子;你必須按照設(shè)計圖紙(算法)上的說明一磚一瓦地去砌。這樣你才能擁有你想要的房子。程序設(shè)計也一樣,程序設(shè)計時你得按照程序規(guī)定的功能去編寫,而程序的功能是實現(xiàn)就是算法的具體體現(xiàn)。所以通俗地說:你必須按照特定的規(guī)則,把特定的功能語句和基本結(jié)構(gòu)按照特定的順序排列起來,形成一個有特定功能的程序,這就是:程序設(shè)計=結(jié)構(gòu)+算法。
一般說來,計算機程序設(shè)計語言種類很多,不僅有機器語言和匯編語言,還有很多高級語言。對單片機而言,通常使用匯編語言或C語言進行程序設(shè)計,程序較大時一般采用C語言編寫,但用匯編語言編寫的程序執(zhí)行的效率較高。程序設(shè)計完成后,然后利用計算機或人工方法將匯編語言或C語言程序轉(zhuǎn)化為單片機可以執(zhí)行的機器語言。轉(zhuǎn)換前的匯編語言或C語言程序被稱為源程序,轉(zhuǎn)換后的機器語言程序被稱為目標(biāo)程序,轉(zhuǎn)換過程也叫匯編過程,通過計算機或人工轉(zhuǎn)換的方法又被稱為計算機匯編或手工匯編。計算機匯編要使用專門的軟件,叫匯編軟件。項目4匯編語言程序設(shè)計 什么是程序設(shè)計?程序設(shè)計=結(jié)構(gòu)+算法。項目4匯編語言程序394.1源程序的編制4.1.1程序設(shè)計步驟在對單片機系統(tǒng)進行程序設(shè)計時,必須考慮硬件資源的配置,當(dāng)硬件系統(tǒng)設(shè)計完成后,可以按照以下步驟進行程序設(shè)計。1.預(yù)完成任務(wù)的分析2.進行算法的優(yōu)化3.繪制程序流程圖4.分配資源5.編寫源程序6.程序優(yōu)化7.編譯,調(diào)試,修改和最后確定源程序項目4匯編語言程序設(shè)計4.1源程序的編制4.1.1程序設(shè)計步驟項目4匯編語言程40 用圖形符號將總體設(shè)計思路及程序流向繪制在平面圖上。從而使程序的結(jié)構(gòu)關(guān)系直觀明了,便于檢查和修改,它直觀清晰的體現(xiàn)了程序的設(shè)計思路,是程序設(shè)計的依據(jù)。 繪制流程圖時,首先畫出簡單的功能流程圖粗框圖,再對功能流程圖進行擴充和具體化,即對存儲器標(biāo)志位等單元做具體的分配和說明,把功能圖上的每一個粗框圖轉(zhuǎn)化為具體的存儲器或地址單元,從而繪制出詳細的程序流程圖。流線程序執(zhí)行順序流向線表示處理功能端點符號程序的開始和結(jié)束符號表示判斷功能判斷符號處理符號連接符號用來實現(xiàn)流程圖之間的連接程序流程圖的繪制項目4匯編語言程序設(shè)計 用圖形符號將總體設(shè)計思路及程序流向繪制在平面圖上。從而使414.1.2匯編語言源程序的格式 匯編語言源程序是由若干語句組成的,每一語句可由4個部分組成:標(biāo)號、操作碼、操作數(shù)及注釋。每一部分間以不同的分隔符分隔,語句格式如下:
[標(biāo)號]:操作碼[目的操作數(shù)][源操作數(shù)];[注釋]
其中[]項為可選項,視具體的指令選用. 標(biāo)號是表示該語句所在地址的標(biāo)志符號,使用標(biāo)號可方便程序中的其他語句訪問該語句。標(biāo)號由字母打頭的1-8個字母數(shù)字串組成,但指令保留符、寄存器名、位址記憶符、偽指令符等都不能作標(biāo)號使用。操作碼表示操作的性質(zhì),它是匯編指令中唯一不能缺省的部分。操作數(shù)表示操作的對象,在一條語句中,操作數(shù)可能是空白或以逗號分開的幾個。注釋是對語句或程序段功能的解釋說明有助于的閱讀和維護。項目4匯編語言程序設(shè)計4.1.2匯編語言源程序的格式項目4匯編語言程序設(shè)計424.1.3匯編語言源程序的匯編 將匯編語言源程序“翻譯”成機器語言目標(biāo)程序的過程稱為匯編,對單片機助記符的匯編有兩種方法:人工匯編和機器匯編。 人工匯編是用人工查表將源程序譯成機器碼。一般分為兩步進行。第一步將源程序中的指令逐條譯成目標(biāo)碼,指令中的標(biāo)號地址待求。第二步由偽指令求出標(biāo)號所代表的具體地址,進行有關(guān)程序存儲區(qū)的數(shù)據(jù)操作并進行偏移量的計算。 機器匯編是將源程序輸入計算機后,由匯編程序?qū)崿F(xiàn)翻譯工作,產(chǎn)生相應(yīng)的機器碼。這是一種非常高效和方便的方法。項目4匯編語言程序設(shè)計4.1.3匯編語言源程序的匯編項目4匯編語言程序設(shè)計434.1.4偽指令 在機器匯編時,對匯編過程進行控制和指導(dǎo)的指令稱為偽指令。在匯編過程中,偽指令供匯編程序識別和執(zhí)行但不產(chǎn)生可執(zhí)行的目標(biāo)代碼。如規(guī)定匯編生成的目標(biāo)代碼在ROM中的存放區(qū)域,給源程序符號、標(biāo)號賦值,指示匯編結(jié)束等。每種匯編程序都有自己的偽指令,標(biāo)準(zhǔn)的MCS-51定義的偽指令常用的有以下7條。1.匯編其始地址偽指令——ORG(Origin)格式:ORG16位地址功能:規(guī)定該指令后的下一段源程序經(jīng)匯編后生成的代碼存放的起始地址。例如:ORG0500HSTART:MOVA,R0……END ORG偽指令總是出現(xiàn)在每段源程序或數(shù)據(jù)塊的開始,匯編語言源程序中多處使用ORG指令,可使程序員把子程序、數(shù)據(jù)塊存放在ROM的任何位置。每當(dāng)ORG出現(xiàn)時,下條指令的存放地址由此重新定位,所以O(shè)RG定義地址的順序應(yīng)有小到大,且不能重疊。項目4匯編語言程序設(shè)計4.1.4偽指令項目4匯編語言程序設(shè)計442.匯編結(jié)束偽指令-END(EndofAssembly)指令格式:[標(biāo)號]:END功能:結(jié)束匯編語言源程序的操作。在源程序中只能有一條END,END后所寫的指令,匯編程序不予處理。項目4匯編語言程序設(shè)計2.匯編結(jié)束偽指令-END(EndofAssembly)453.符號賦值偽指令——EQU(EQUate)指令格式:字符名稱EQU數(shù)或匯編符號功能:將一個數(shù)或特定的匯編符號賦給指定的字符名稱。字符名稱為一自定的符號,而不是標(biāo)號,字符名稱后無“:”。字符名稱可用來作數(shù)據(jù)地址,立即數(shù),位地址或者是一代碼地址,其值可以是一個8位數(shù),也可以是16位數(shù)。例如:TESTEQU20HMOVA,TEST 這里字符名稱TEST就代表了內(nèi)部RAM20H地址單元。又例如:A1EQU10HMOVA,A1這里A1代表片內(nèi)RAM的直接地址單元10H。使用EQU偽指令可以把抽象的數(shù)字地址表示成有一定意義的符號,增強程序的可讀性。項目4匯編語言程序設(shè)計3.符號賦值偽指令——EQU(EQUate)項目4匯編語言464.定義數(shù)據(jù)字節(jié)偽指令——DB(DefineByte) 格式:[標(biāo)號:]DB<項或項表> 項或項表是指一個字節(jié),逗號隔開的8位二進制的數(shù)或字符串,或撇號’括起來的ASCII字符串。 功能:從標(biāo)號指定的地址單元開始,在程序存儲器中存入一組8位二進制數(shù),或者將一個數(shù)據(jù)表格存入程序存儲器。這條偽指令匯編后影響程序存儲器的內(nèi)容。例如:ORG1100HTAB:DB01H,04H,09H,10HDB00001111B,‘1’,‘A’,‘BC’項目4匯編語言程序設(shè)計4.定義數(shù)據(jù)字節(jié)偽指令——DB(DefineByte)項目475.定義數(shù)據(jù)字命令——DW(DefineWord)格式:[標(biāo)號:]DW<項或項表>功能:DW的功能和DB類似,DW是從標(biāo)號指定的地址開始存放16位而非8位二進制數(shù),存放時,數(shù)據(jù)字的高8位在前(低地址),低8位在后(高地址)。例如:ORG5000HMOVA,#30H………ORG5020HADDTAB:DW1234H,100H,10………;END 一條DB和DW語句定義的數(shù)表其數(shù)的個數(shù)不得超過80個。當(dāng)數(shù)據(jù)的數(shù)目較多時,可使用多個定義命令。在MCS-51程序設(shè)計應(yīng)用中,常以DW來定義地址。項目4匯編語言程序設(shè)計5.定義數(shù)據(jù)字命令——DW(DefineWord)項目4486.預(yù)留存儲區(qū)偽指令——DS(DefineStorage) 格式:[標(biāo)號:]DS<表達式> 功能:本命令用于從指定地址開始,保留DS之后表達式的值所需數(shù)目的字節(jié)單元作為存儲區(qū)以備后用。匯編時,對這些單元不賦值。例如:ORG0100HMOVA,#50H………ADDRTABL:DS05HDB20HEND 從標(biāo)號ADDRTABL代表的地址開始,保留5個連續(xù)的ROM地址單元,第6個單元存放20H。
對MCS-51單片機來說,DB,DW,DS偽指令只能對程序存儲器使用,而不能對數(shù)據(jù)存儲器進行初始化。項目4匯編語言程序設(shè)計6.預(yù)留存儲區(qū)偽指令——DS(DefineStorage)497.位地址賦值偽指令——BIT 格式:[字符名稱]BIT<位地址> 功能:本命令用于給字符名稱賦以位地址。其中<位地址>可以是絕對地址,也可以是符號地址(即位符號名稱)。例如:AQBITP1.0A2BIT07H 這兩條指令分別把P1.0的位地址賦給變量AQ,位地址07H賦給符號名A2,在其后的編程中AQ和A2就可以作為位地址使用。項目4匯編語言程序設(shè)計7.位地址賦值偽指令——BIT項目4匯編語言程序設(shè)計504.1.5程序設(shè)計技巧1.模塊化程序設(shè)計方法 單片機應(yīng)用系統(tǒng)的程序一般由包含多個模塊的主程序和各種子程序組成。每一程序模塊都要完成一個明確的任務(wù),實現(xiàn)某個具體的功能,如發(fā)送、接收、延時、打印、顯示等。采用模塊化的程序設(shè)計方法,就是將這些不同的具體功能程序進行獨立的設(shè)計和分別調(diào)試,最后將這些模塊程序裝配成整體程序并進行聯(lián)調(diào)。項目4匯編語言程序設(shè)計4.1.5程序設(shè)計技巧項目4匯編語言程序設(shè)計51 把一個多功能的、復(fù)雜的程序劃分為若干個簡單的、功能單一的程序模塊的程序設(shè)計方法具有明顯的優(yōu)點:1)單個模塊結(jié)構(gòu)的程序功能單一,易于設(shè)計、編寫、調(diào)試及修改;2)有利于程序的優(yōu)化和分工,從而可使多個程序員同時進行程序的編寫和調(diào)試,加快軟件研制進度;3)提高了程序的閱讀性和可靠性,使程序的結(jié)構(gòu)層次一目了然,同時4)對程序的修改可局部進行,其他部分可以保持不變,便于功能擴充和版本升級;5)對于使用頻繁的子程序可以建立子程序庫,便于多個模塊調(diào)用。項目4匯編語言程序設(shè)計 把一個多功能的、復(fù)雜的程序劃分為若干個簡單的、功能單一的52 模塊的劃分有很大的靈活性,但也不能隨意劃分。劃分時應(yīng)遵循下述原則:1)每個模塊應(yīng)具有獨立的功能,能產(chǎn)生一個明確的結(jié)果,這就是單模塊的功能高內(nèi)聚性。2)模塊之間的控制耦合應(yīng)盡量簡單,數(shù)據(jù)耦合應(yīng)盡量少,這就是模塊間的低耦合性??刂岂詈鲜侵改K進入和退出的條件及方式,數(shù)據(jù)耦合是指模塊間的信息交換(傳遞)方式、交換量的多少及交換的頻繁程度。3)模塊長度適中。模塊語句的長度通常在20條~100條的范圍較合適。模塊太長時,分析和調(diào)試比較困難,失去了模塊化程序結(jié)構(gòu)的優(yōu)越性;過短則模塊的連接太復(fù)雜,信息交換太頻繁,因而也不合適。項目4匯編語言程序設(shè)計 模塊的劃分有很大的靈活性,但也不能隨意劃分。劃分時應(yīng)遵循532.程序設(shè)計技巧1)盡量采用循環(huán)結(jié)構(gòu)和子程序。2)盡量少用無條件轉(zhuǎn)移指令。3)對于通用的子程序,考慮到其通用性,除了用于存放子程序入口參數(shù)的寄存器外,子程序中用到的其他寄存器的內(nèi)容應(yīng)壓入堆棧(返回前再彈出)進行現(xiàn)場保護,并要特別注意堆棧操作的壓入和彈出的平衡。一般不必把標(biāo)志寄存器壓入堆棧。4)對于中斷處理子程序除了要保護程序中用到的寄存器外,還應(yīng)保護標(biāo)志寄存器。5)累加器是信息傳遞的樞紐。項目4匯編語言程序設(shè)計2.程序設(shè)計技巧項目4匯編語言程序設(shè)計544.2程序結(jié)構(gòu)4.2.1順序程序 順序結(jié)構(gòu)是按照邏輯操作順序,從某一條指令開始逐條順序執(zhí)行,直至某一條指令為止,無分支,也無循環(huán)。順序結(jié)構(gòu)是所有程序設(shè)計中最基本、最單純的程序結(jié)構(gòu)形式,在程序設(shè)計中使用最多,因而是一種最簡單且應(yīng)用最普遍的程序結(jié)構(gòu)。一般實際應(yīng)用程序遠比順序結(jié)構(gòu)復(fù)雜得多,但它是組成復(fù)雜程序的基礎(chǔ)和主干。項目4匯編語言程序設(shè)計4.2程序結(jié)構(gòu)4.2.1順序程序項目4匯編語言程序設(shè)計55【例4.1】將兩個半字節(jié)數(shù)合并成一個一字節(jié)數(shù)。 設(shè)內(nèi)部RAM40H、41H單元中分別存放著8位二進制數(shù)。要求取出兩個單元的低半字節(jié),合并成一個字節(jié)后,存入42H單元。開始(40H)內(nèi)容送A,屏蔽高位A與R1或后送入(42H)交換高低位,送入R1(41H)內(nèi)容送A,屏蔽高位返回圖4-1例1程序流程圖項目4匯編語言程序設(shè)計【例4.1】將兩個半字節(jié)數(shù)合并成一個一字節(jié)數(shù)。開始(40H)56【例4.2】用順序結(jié)構(gòu)程序編寫三字節(jié)無符號數(shù)的加法程序。設(shè)被加數(shù)存放在:40H(高字節(jié)),41H(中字節(jié)),42H(低字節(jié))加數(shù)存放在:43H(高字節(jié)),44H(中字節(jié)),45H(低字節(jié))運算結(jié)果仍存在被加數(shù)單元中。開始取低字節(jié)數(shù)據(jù)返回相加后送回被加數(shù)單元取中字節(jié)數(shù)據(jù)帶進位位相加后送回被加數(shù)單元取高字節(jié)數(shù)據(jù)帶進位位相加后送回被加數(shù)單元圖4-2例2程序流程圖項目4匯編語言程序設(shè)計【例4.2】用順序結(jié)構(gòu)程序編寫三字節(jié)無符號數(shù)的加法程序。開始574.2.2分支程序 通常,單純的順序結(jié)構(gòu)程序只能解決一些簡單的算術(shù)、邏輯運算,或者簡單的查表、傳送操作等。實際問題一般都是比較復(fù)雜的,總是伴隨有邏輯判斷或條件選擇,要求計算機能根據(jù)給定的條件進行判斷,選擇不同的處理路徑,從而表現(xiàn)出某種智能。 根據(jù)程序要求改變程序執(zhí)行順序,即程序的流向有兩個或兩個以上的出口,根據(jù)指定的條件選擇程序流向的程序結(jié)構(gòu)我們稱為分支程序結(jié)構(gòu)。 通常根據(jù)分支程序中出口的個數(shù)分為單分支結(jié)構(gòu)程序(兩個出口)和多分支結(jié)構(gòu)程序(三個或三個以上出口)。 在MCS-51指令系統(tǒng)中,通過條件判斷實現(xiàn)單分支程序轉(zhuǎn)移的指令有JZ、JNZ、CJNE和DJNZ等。此外,還有以位狀態(tài)為條件,進行程序分支的指令JC、JNC、JB、JNB和JBC等。使用這些指令,可以完成或為0、1,或為正、為負,以及相等、不相等各種條件判斷,以實現(xiàn)程序有條件地轉(zhuǎn)移。項目4匯編語言程序設(shè)計4.2.2分支程序項目4匯編語言程序設(shè)計581.兩分支程序設(shè)計【例4.3】兩個無符號數(shù)比較(兩分支)。內(nèi)部RAM的30H單元和31H單元各存放了一個8位無符號數(shù),請比較這兩個數(shù)的大小,大數(shù)放在32H中。開始X-YCy=1?30H→32H31H→32HYN結(jié)束4-3兩數(shù)比較流程圖項目4匯編語言程序設(shè)計1.兩分支程序設(shè)計開始X-YCy=1?30H→32H31H→592.三分支程序設(shè)計【例4.4】兩個無符號數(shù)比較(三分支程序)。內(nèi)部RAM的20H單元和30H單元各存放了一個8位有符號數(shù),根據(jù)下列條件編程點亮相應(yīng)的發(fā)光二極管,電路如圖4-4所示,。若(20H)=(30H),則P2.0管腳連接的黃色LED發(fā)光;若(20H)>(30H),則P2.1管腳連接的綠色LED發(fā)光;若(20H)<(30H),則P2.2管腳連接的紅色LED發(fā)光。開始X=Y?X>Y?黃燈點亮YN結(jié)束NY紅燈點亮綠燈點亮項目4匯編語言程序設(shè)計2.三分支程序設(shè)計開始X=Y?X>Y?黃燈點亮YN結(jié)束N603.散轉(zhuǎn)程序 散轉(zhuǎn)程序是指經(jīng)過某個條件判斷之后,程序有多個流向(三個以上)。MCS-51單片機指令系統(tǒng)中專門提供了散轉(zhuǎn)指令,使得散轉(zhuǎn)程序的編制更加簡潔。 【例4.5】在例4.4的電路的基礎(chǔ)上加兩個開關(guān)組成簡單的信號燈電路,如圖4-6所示,試編程實現(xiàn)以下功能。K0K10 0 都按下,紅黃綠燈全亮(狀態(tài)1)0 1 K0單獨按下,紅燈亮(狀態(tài)2)1 0K1單獨按下,綠燈亮(狀態(tài)3)1 1 都未按下,黃燈亮(狀態(tài)4)項目4匯編語言程序設(shè)計3.散轉(zhuǎn)程序項目4匯編語言程序設(shè)計61開始讀P1口引腳狀態(tài)→A轉(zhuǎn)移指令表基地址→DPTR屏蔽無關(guān)位散轉(zhuǎn)移狀態(tài)1狀態(tài)2狀態(tài)3狀態(tài)4返回返回返回返回項目4匯編語言程序設(shè)計開始讀P1口引腳狀態(tài)→A轉(zhuǎn)移指令表基地址→DPTR屏蔽無關(guān)位624.2.3循環(huán)程序 循環(huán)結(jié)構(gòu)程序是把需要多次重復(fù)使用的程序段,利用轉(zhuǎn)移指令反復(fù)轉(zhuǎn)向該程序段,從而大大縮短程序代碼,減少占用程序空間,程序結(jié)構(gòu)也大大優(yōu)化。循環(huán)程序可以分為單重循環(huán)和多重循環(huán),其通常有兩種編制方法:一種是先執(zhí)行后判斷,另一種是先判斷后執(zhí)行。如圖4-8所示。開始初始化循環(huán)處理循環(huán)控制循環(huán)完成?NY循環(huán)結(jié)束結(jié)束開始初始化循環(huán)控制循環(huán)完成?NY循環(huán)結(jié)束結(jié)束循環(huán)處理項目4匯編語言程序設(shè)計4.2.3循環(huán)程序開始初始化循環(huán)處理循環(huán)控制循環(huán)完成?NY循631.單重循環(huán)程序設(shè)計 【例4.6】數(shù)據(jù)極值查找程序。設(shè)內(nèi)部RAM從30H單元開始存放有8個數(shù),找出其中最大的數(shù),放到60H單元。 解:極值查找操作的主要內(nèi)容是進行數(shù)值大小比較。假定在比較過程中,以A存放大數(shù),與之逐個比較的另一個數(shù)放在50H單元。采用先執(zhí)行后判斷的結(jié)構(gòu),首先設(shè)定比較次數(shù),在比較結(jié)束后,把查找到的最大數(shù)送到60H單元。程序流程圖如圖4-9所示。開始數(shù)據(jù)區(qū)首地址→R0讀下一個數(shù)→50H(50H)→A(A)>(50H)?NYA→(60H)結(jié)束數(shù)據(jù)個數(shù)→R7讀第一個數(shù)→AR7-1→R7R7-1=0?NY項目4匯編語言程序設(shè)計1.單重循環(huán)程序設(shè)計開始數(shù)據(jù)區(qū)首地址→R0讀下一個數(shù)→50H64 【例4.7】將內(nèi)部RAM中30H單元開始的數(shù)據(jù)傳送到外部RAM1200H開始的存儲空間內(nèi),直到發(fā)現(xiàn)數(shù)據(jù)‘100’停止傳送。開始A=100?取內(nèi)部RAM數(shù)據(jù)→AYN結(jié)束傳送數(shù)據(jù)到外部RAM圖4-10例4.7流程圖解:由于循環(huán)次數(shù)事先不知道,但是循環(huán)條件可以測試到,可以采用先判斷后執(zhí)行的程序結(jié)構(gòu)。流程圖如圖4-10所示。開始A=100?取內(nèi)部RAM數(shù)據(jù)→AYN結(jié)束傳送數(shù)據(jù)到外部RAM圖4-10例4.7流程圖項目4匯編語言程序設(shè)計 【例4.7】將內(nèi)部RAM中30H單元開始的數(shù)據(jù)傳送到外652.多重循環(huán)程序設(shè)計—定時程序 在循環(huán)內(nèi)套循環(huán)的程序結(jié)構(gòu)稱多重循環(huán),或稱循環(huán)嵌套。若把每重循環(huán)的內(nèi)部看作一個整體,則多重循環(huán)的結(jié)構(gòu)與單重循環(huán)的結(jié)構(gòu)是一樣的,也由四部分組成。 多重循環(huán)的執(zhí)行過程是從內(nèi)向外逐層展開的。內(nèi)層執(zhí)行完全部循環(huán)后,外層則完成一次循環(huán),逐次類推。因此,每執(zhí)行一次外層循環(huán),內(nèi)層必須重新設(shè)置初值,故每層均包含完整的循環(huán)程序結(jié)構(gòu)。層次必須分明,層次之間不能有交叉;否則,將產(chǎn)生錯誤。 定時程序是一種很典型的多重循環(huán)程序,其在單片機匯編語言程序設(shè)計中使用非常廣泛,例如定時檢測、定時掃描、定時中斷等。所謂定時就是讓CPU做一些與主程序功能無關(guān)的操作(例如將一個數(shù)字逐次減1直到為0)來空耗掉CPU的時間來達到延時的目的。由于我們知道CPU執(zhí)行每條指令的準(zhǔn)確時間,因此執(zhí)行整個延時程序的時間也可以精確計算出來。也就是說,我們可以寫出延時長度任意而且精度相當(dāng)高的延時程序。項目4匯編語言程序設(shè)計2.多重循環(huán)程序設(shè)計—定時程序項目4匯編語言程序設(shè)計66【例4.8】設(shè)計一個延時50ms的程序,設(shè)單片機時鐘晶振頻率為fosc=12MHz。 解:延時程序一般采用循環(huán)程序結(jié)構(gòu)編程,通過確定循環(huán)程序中的循環(huán)次數(shù)和循環(huán)程序段兩個因素來確定延時時間。題目給定fosc=12MHz,那么機器周期的計算方法:T機器=12T時鐘=12×(1/12M)=1μs。下面就是一個最簡單的單循環(huán)定時程序:MOVR7,#TIMELOOP:NOPNOP DJNZR7,LOOP NOP指令的機器周期為1,用來提高定時精度,DJNZ指令的機器周期為2,故一次循環(huán)共4個機器周期。一個機器周期是1μS,則一次循環(huán)的延遲時間為4μS。上面程序總的延遲時間為4×time(μS)。本程序的實際延遲時間取決于裝入
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年鋰電池用特種玻璃粉項目立項申請報告模范
- 2025年二手教練車銷售合同格式
- 2025年乳制品代理銷售合同
- 2025年阻沙固沙網(wǎng)項目立項申請報告模板
- 2025年不動產(chǎn)權(quán)購房合同范本
- 2025年家禽購銷合同協(xié)議
- 2025年陶瓷基體項目申請報告模范
- 2025年健身器材購置合同
- 2025年合伙型股權(quán)分配合同
- 2025年度制造業(yè)租賃協(xié)議樣式
- 2024年司法考試完整真題及答案
- 【化學(xué)】高中化學(xué)手寫筆記
- 2024年執(zhí)業(yè)藥師繼續(xù)教育專業(yè)答案
- 2024年安全員-C證考試題庫及答案(1000題)
- 膽管惡性腫瘤護理查房課件
- 企事業(yè)單位全面風(fēng)險清單(含內(nèi)控風(fēng)險-2023版-雷澤佳編制)
- 高標(biāo)準(zhǔn)農(nóng)田建設(shè)項目監(jiān)理日志
- [整理]10kv開關(guān)站標(biāo)準(zhǔn)設(shè)計說明(最終版)
- 分級診療制度管理辦法
- 公務(wù)員入職登記表
- 九年級新目標(biāo)英語單詞表默寫最新版
評論
0/150
提交評論