版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
項(xiàng)目4匯編語言程序設(shè)計(jì)項(xiàng)目4匯編語言程序設(shè)計(jì)1 什么是程序設(shè)計(jì)?程序設(shè)計(jì)=結(jié)構(gòu)+算法。 程序設(shè)計(jì)就像蓋房子,數(shù)據(jù)結(jié)構(gòu)就像磚、瓦,而算法就是設(shè)計(jì)圖紙。你若想蓋房子首先必須有原料(數(shù)據(jù)結(jié)構(gòu)),但是這些原料不能自動(dòng)地蓋起了你想要的房子;你必須按照設(shè)計(jì)圖紙(算法)上的說明一磚一瓦地去砌。這樣你才能擁有你想要的房子。程序設(shè)計(jì)也一樣,程序設(shè)計(jì)時(shí)你得按照程序規(guī)定的功能去編寫,而程序的功能是實(shí)現(xiàn)就是算法的具體體現(xiàn)。所以通俗地說:你必須按照特定的規(guī)則,把特定的功能語句和基本結(jié)構(gòu)按照特定的順序排列起來,形成一個(gè)有特定功能的程序,這就是:程序設(shè)計(jì)=結(jié)構(gòu)+算法。
一般說來,計(jì)算機(jī)程序設(shè)計(jì)語言種類很多,不僅有機(jī)器語言和匯編語言,還有很多高級(jí)語言。對(duì)單片機(jī)而言,通常使用匯編語言或C語言進(jìn)行程序設(shè)計(jì),程序較大時(shí)一般采用C語言編寫,但用匯編語言編寫的程序執(zhí)行的效率較高。程序設(shè)計(jì)完成后,然后利用計(jì)算機(jī)或人工方法將匯編語言或C語言程序轉(zhuǎn)化為單片機(jī)可以執(zhí)行的機(jī)器語言。轉(zhuǎn)換前的匯編語言或C語言程序被稱為源程序,轉(zhuǎn)換后的機(jī)器語言程序被稱為目標(biāo)程序,轉(zhuǎn)換過程也叫匯編過程,通過計(jì)算機(jī)或人工轉(zhuǎn)換的方法又被稱為計(jì)算機(jī)匯編或手工匯編。計(jì)算機(jī)匯編要使用專門的軟件,叫匯編軟件。項(xiàng)目4匯編語言程序設(shè)計(jì) 什么是程序設(shè)計(jì)?程序設(shè)計(jì)=結(jié)構(gòu)+算法。項(xiàng)目4匯編語言程序24.1源程序的編制4.1.1程序設(shè)計(jì)步驟在對(duì)單片機(jī)系統(tǒng)進(jìn)行程序設(shè)計(jì)時(shí),必須考慮硬件資源的配置,當(dāng)硬件系統(tǒng)設(shè)計(jì)完成后,可以按照以下步驟進(jìn)行程序設(shè)計(jì)。1.預(yù)完成任務(wù)的分析2.進(jìn)行算法的優(yōu)化3.繪制程序流程圖4.分配資源5.編寫源程序6.程序優(yōu)化7.編譯,調(diào)試,修改和最后確定源程序項(xiàng)目4匯編語言程序設(shè)計(jì)4.1源程序的編制4.1.1程序設(shè)計(jì)步驟項(xiàng)目4匯編語言程3 用圖形符號(hào)將總體設(shè)計(jì)思路及程序流向繪制在平面圖上。從而使程序的結(jié)構(gòu)關(guān)系直觀明了,便于檢查和修改,它直觀清晰的體現(xiàn)了程序的設(shè)計(jì)思路,是程序設(shè)計(jì)的依據(jù)。 繪制流程圖時(shí),首先畫出簡單的功能流程圖粗框圖,再對(duì)功能流程圖進(jìn)行擴(kuò)充和具體化,即對(duì)存儲(chǔ)器標(biāo)志位等單元做具體的分配和說明,把功能圖上的每一個(gè)粗框圖轉(zhuǎn)化為具體的存儲(chǔ)器或地址單元,從而繪制出詳細(xì)的程序流程圖。流線程序執(zhí)行順序流向線表示處理功能端點(diǎn)符號(hào)程序的開始和結(jié)束符號(hào)表示判斷功能判斷符號(hào)處理符號(hào)連接符號(hào)用來實(shí)現(xiàn)流程圖之間的連接程序流程圖的繪制項(xiàng)目4匯編語言程序設(shè)計(jì) 用圖形符號(hào)將總體設(shè)計(jì)思路及程序流向繪制在平面圖上。從而使44.1.2匯編語言源程序的格式 匯編語言源程序是由若干語句組成的,每一語句可由4個(gè)部分組成:標(biāo)號(hào)、操作碼、操作數(shù)及注釋。每一部分間以不同的分隔符分隔,語句格式如下:
[標(biāo)號(hào)]:操作碼[目的操作數(shù)][源操作數(shù)];[注釋]
其中[]項(xiàng)為可選項(xiàng),視具體的指令選用. 標(biāo)號(hào)是表示該語句所在地址的標(biāo)志符號(hào),使用標(biāo)號(hào)可方便程序中的其他語句訪問該語句。標(biāo)號(hào)由字母打頭的1-8個(gè)字母數(shù)字串組成,但指令保留符、寄存器名、位址記憶符、偽指令符等都不能作標(biāo)號(hào)使用。操作碼表示操作的性質(zhì),它是匯編指令中唯一不能缺省的部分。操作數(shù)表示操作的對(duì)象,在一條語句中,操作數(shù)可能是空白或以逗號(hào)分開的幾個(gè)。注釋是對(duì)語句或程序段功能的解釋說明有助于的閱讀和維護(hù)。項(xiàng)目4匯編語言程序設(shè)計(jì)4.1.2匯編語言源程序的格式項(xiàng)目4匯編語言程序設(shè)計(jì)54.1.3匯編語言源程序的匯編 將匯編語言源程序“翻譯”成機(jī)器語言目標(biāo)程序的過程稱為匯編,對(duì)單片機(jī)助記符的匯編有兩種方法:人工匯編和機(jī)器匯編。 人工匯編是用人工查表將源程序譯成機(jī)器碼。一般分為兩步進(jìn)行。第一步將源程序中的指令逐條譯成目標(biāo)碼,指令中的標(biāo)號(hào)地址待求。第二步由偽指令求出標(biāo)號(hào)所代表的具體地址,進(jìn)行有關(guān)程序存儲(chǔ)區(qū)的數(shù)據(jù)操作并進(jìn)行偏移量的計(jì)算。 機(jī)器匯編是將源程序輸入計(jì)算機(jī)后,由匯編程序?qū)崿F(xiàn)翻譯工作,產(chǎn)生相應(yīng)的機(jī)器碼。這是一種非常高效和方便的方法。項(xiàng)目4匯編語言程序設(shè)計(jì)4.1.3匯編語言源程序的匯編項(xiàng)目4匯編語言程序設(shè)計(jì)64.1.4偽指令 在機(jī)器匯編時(shí),對(duì)匯編過程進(jìn)行控制和指導(dǎo)的指令稱為偽指令。在匯編過程中,偽指令供匯編程序識(shí)別和執(zhí)行但不產(chǎn)生可執(zhí)行的目標(biāo)代碼。如規(guī)定匯編生成的目標(biāo)代碼在ROM中的存放區(qū)域,給源程序符號(hào)、標(biāo)號(hà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)時(shí),下條指令的存放地址由此重新定位,所以O(shè)RG定義地址的順序應(yīng)有小到大,且不能重疊。項(xiàng)目4匯編語言程序設(shè)計(jì)4.1.4偽指令項(xiàng)目4匯編語言程序設(shè)計(jì)72.匯編結(jié)束偽指令-END(EndofAssembly)指令格式:[標(biāo)號(hào)]:END功能:結(jié)束匯編語言源程序的操作。在源程序中只能有一條END,END后所寫的指令,匯編程序不予處理。項(xiàng)目4匯編語言程序設(shè)計(jì)2.匯編結(jié)束偽指令-END(EndofAssembly)83.符號(hào)賦值偽指令——EQU(EQUate)指令格式:字符名稱EQU數(shù)或匯編符號(hào)功能:將一個(gè)數(shù)或特定的匯編符號(hào)賦給指定的字符名稱。字符名稱為一自定的符號(hào),而不是標(biāo)號(hào),字符名稱后無“:”。字符名稱可用來作數(shù)據(jù)地址,立即數(shù),位地址或者是一代碼地址,其值可以是一個(gè)8位數(shù),也可以是16位數(shù)。例如:TESTEQU20HMOVA,TEST 這里字符名稱TEST就代表了內(nèi)部RAM20H地址單元。又例如:A1EQU10HMOVA,A1這里A1代表片內(nèi)RAM的直接地址單元10H。使用EQU偽指令可以把抽象的數(shù)字地址表示成有一定意義的符號(hào),增強(qiáng)程序的可讀性。項(xiàng)目4匯編語言程序設(shè)計(jì)3.符號(hào)賦值偽指令——EQU(EQUate)項(xiàng)目4匯編語言94.定義數(shù)據(jù)字節(jié)偽指令——DB(DefineByte) 格式:[標(biāo)號(hào):]DB<項(xiàng)或項(xiàng)表> 項(xiàng)或項(xiàng)表是指一個(gè)字節(jié),逗號(hào)隔開的8位二進(jìn)制的數(shù)或字符串,或撇號(hào)’括起來的ASCII字符串。 功能:從標(biāo)號(hào)指定的地址單元開始,在程序存儲(chǔ)器中存入一組8位二進(jìn)制數(shù),或者將一個(gè)數(shù)據(jù)表格存入程序存儲(chǔ)器。這條偽指令匯編后影響程序存儲(chǔ)器的內(nèi)容。例如:ORG1100HTAB:DB01H,04H,09H,10HDB00001111B,‘1’,‘A’,‘BC’項(xiàng)目4匯編語言程序設(shè)計(jì)4.定義數(shù)據(jù)字節(jié)偽指令——DB(DefineByte)項(xiàng)目105.定義數(shù)據(jù)字命令——DW(DefineWord)格式:[標(biāo)號(hào):]DW<項(xiàng)或項(xiàng)表>功能:DW的功能和DB類似,DW是從標(biāo)號(hào)指定的地址開始存放16位而非8位二進(jìn)制數(shù),存放時(shí),數(shù)據(jù)字的高8位在前(低地址),低8位在后(高地址)。例如:ORG5000HMOVA,#30H………ORG5020HADDTAB:DW1234H,100H,10………;END 一條DB和DW語句定義的數(shù)表其數(shù)的個(gè)數(shù)不得超過80個(gè)。當(dāng)數(shù)據(jù)的數(shù)目較多時(shí),可使用多個(gè)定義命令。在MCS-51程序設(shè)計(jì)應(yīng)用中,常以DW來定義地址。項(xiàng)目4匯編語言程序設(shè)計(jì)5.定義數(shù)據(jù)字命令——DW(DefineWord)項(xiàng)目4116.預(yù)留存儲(chǔ)區(qū)偽指令——DS(DefineStorage) 格式:[標(biāo)號(hào):]DS<表達(dá)式> 功能:本命令用于從指定地址開始,保留DS之后表達(dá)式的值所需數(shù)目的字節(jié)單元作為存儲(chǔ)區(qū)以備后用。匯編時(shí),對(duì)這些單元不賦值。例如:ORG0100HMOVA,#50H………ADDRTABL:DS05HDB20HEND 從標(biāo)號(hào)ADDRTABL代表的地址開始,保留5個(gè)連續(xù)的ROM地址單元,第6個(gè)單元存放20H。
對(duì)MCS-51單片機(jī)來說,DB,DW,DS偽指令只能對(duì)程序存儲(chǔ)器使用,而不能對(duì)數(shù)據(jù)存儲(chǔ)器進(jìn)行初始化。項(xiàng)目4匯編語言程序設(shè)計(jì)6.預(yù)留存儲(chǔ)區(qū)偽指令——DS(DefineStorage)127.位地址賦值偽指令——BIT 格式:[字符名稱]BIT<位地址> 功能:本命令用于給字符名稱賦以位地址。其中<位地址>可以是絕對(duì)地址,也可以是符號(hào)地址(即位符號(hào)名稱)。例如:AQBITP1.0A2BIT07H 這兩條指令分別把P1.0的位地址賦給變量AQ,位地址07H賦給符號(hào)名A2,在其后的編程中AQ和A2就可以作為位地址使用。項(xiàng)目4匯編語言程序設(shè)計(jì)7.位地址賦值偽指令——BIT項(xiàng)目4匯編語言程序設(shè)計(jì)134.1.5程序設(shè)計(jì)技巧1.模塊化程序設(shè)計(jì)方法 單片機(jī)應(yīng)用系統(tǒng)的程序一般由包含多個(gè)模塊的主程序和各種子程序組成。每一程序模塊都要完成一個(gè)明確的任務(wù),實(shí)現(xiàn)某個(gè)具體的功能,如發(fā)送、接收、延時(shí)、打印、顯示等。采用模塊化的程序設(shè)計(jì)方法,就是將這些不同的具體功能程序進(jìn)行獨(dú)立的設(shè)計(jì)和分別調(diào)試,最后將這些模塊程序裝配成整體程序并進(jìn)行聯(lián)調(diào)。項(xiàng)目4匯編語言程序設(shè)計(jì)4.1.5程序設(shè)計(jì)技巧項(xiàng)目4匯編語言程序設(shè)計(jì)14 把一個(gè)多功能的、復(fù)雜的程序劃分為若干個(gè)簡單的、功能單一的程序模塊的程序設(shè)計(jì)方法具有明顯的優(yōu)點(diǎn):1)單個(gè)模塊結(jié)構(gòu)的程序功能單一,易于設(shè)計(jì)、編寫、調(diào)試及修改;2)有利于程序的優(yōu)化和分工,從而可使多個(gè)程序員同時(shí)進(jìn)行程序的編寫和調(diào)試,加快軟件研制進(jìn)度;3)提高了程序的閱讀性和可靠性,使程序的結(jié)構(gòu)層次一目了然,同時(shí)4)對(duì)程序的修改可局部進(jìn)行,其他部分可以保持不變,便于功能擴(kuò)充和版本升級(jí);5)對(duì)于使用頻繁的子程序可以建立子程序庫,便于多個(gè)模塊調(diào)用。項(xiàng)目4匯編語言程序設(shè)計(jì) 把一個(gè)多功能的、復(fù)雜的程序劃分為若干個(gè)簡單的、功能單一的15 模塊的劃分有很大的靈活性,但也不能隨意劃分。劃分時(shí)應(yīng)遵循下述原則:1)每個(gè)模塊應(yīng)具有獨(dú)立的功能,能產(chǎn)生一個(gè)明確的結(jié)果,這就是單模塊的功能高內(nèi)聚性。2)模塊之間的控制耦合應(yīng)盡量簡單,數(shù)據(jù)耦合應(yīng)盡量少,這就是模塊間的低耦合性??刂岂詈鲜侵改K進(jìn)入和退出的條件及方式,數(shù)據(jù)耦合是指模塊間的信息交換(傳遞)方式、交換量的多少及交換的頻繁程度。3)模塊長度適中。模塊語句的長度通常在20條~100條的范圍較合適。模塊太長時(shí),分析和調(diào)試比較困難,失去了模塊化程序結(jié)構(gòu)的優(yōu)越性;過短則模塊的連接太復(fù)雜,信息交換太頻繁,因而也不合適。項(xiàng)目4匯編語言程序設(shè)計(jì) 模塊的劃分有很大的靈活性,但也不能隨意劃分。劃分時(shí)應(yīng)遵循162.程序設(shè)計(jì)技巧1)盡量采用循環(huán)結(jié)構(gòu)和子程序。2)盡量少用無條件轉(zhuǎn)移指令。3)對(duì)于通用的子程序,考慮到其通用性,除了用于存放子程序入口參數(shù)的寄存器外,子程序中用到的其他寄存器的內(nèi)容應(yīng)壓入堆棧(返回前再彈出)進(jìn)行現(xiàn)場保護(hù),并要特別注意堆棧操作的壓入和彈出的平衡。一般不必把標(biāo)志寄存器壓入堆棧。4)對(duì)于中斷處理子程序除了要保護(hù)程序中用到的寄存器外,還應(yīng)保護(hù)標(biāo)志寄存器。5)累加器是信息傳遞的樞紐。項(xiàng)目4匯編語言程序設(shè)計(jì)2.程序設(shè)計(jì)技巧項(xiàng)目4匯編語言程序設(shè)計(jì)174.2程序結(jié)構(gòu)4.2.1順序程序 順序結(jié)構(gòu)是按照邏輯操作順序,從某一條指令開始逐條順序執(zhí)行,直至某一條指令為止,無分支,也無循環(huán)。順序結(jié)構(gòu)是所有程序設(shè)計(jì)中最基本、最單純的程序結(jié)構(gòu)形式,在程序設(shè)計(jì)中使用最多,因而是一種最簡單且應(yīng)用最普遍的程序結(jié)構(gòu)。一般實(shí)際應(yīng)用程序遠(yuǎn)比順序結(jié)構(gòu)復(fù)雜得多,但它是組成復(fù)雜程序的基礎(chǔ)和主干。項(xiàng)目4匯編語言程序設(shè)計(jì)4.2程序結(jié)構(gòu)4.2.1順序程序項(xiàng)目4匯編語言程序設(shè)計(jì)18【例4.1】將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù)。 設(shè)內(nèi)部RAM40H、41H單元中分別存放著8位二進(jìn)制數(shù)。要求取出兩個(gè)單元的低半字節(jié),合并成一個(gè)字節(jié)后,存入42H單元。開始(40H)內(nèi)容送A,屏蔽高位A與R1或后送入(42H)交換高低位,送入R1(41H)內(nèi)容送A,屏蔽高位返回圖4-1例1程序流程圖項(xiàng)目4匯編語言程序設(shè)計(jì)【例4.1】將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù)。開始(40H)19【例4.2】用順序結(jié)構(gòu)程序編寫三字節(jié)無符號(hào)數(shù)的加法程序。設(shè)被加數(shù)存放在:40H(高字節(jié)),41H(中字節(jié)),42H(低字節(jié))加數(shù)存放在:43H(高字節(jié)),44H(中字節(jié)),45H(低字節(jié))運(yùn)算結(jié)果仍存在被加數(shù)單元中。開始取低字節(jié)數(shù)據(jù)返回相加后送回被加數(shù)單元取中字節(jié)數(shù)據(jù)帶進(jìn)位位相加后送回被加數(shù)單元取高字節(jié)數(shù)據(jù)帶進(jìn)位位相加后送回被加數(shù)單元圖4-2例2程序流程圖項(xiàng)目4匯編語言程序設(shè)計(jì)【例4.2】用順序結(jié)構(gòu)程序編寫三字節(jié)無符號(hào)數(shù)的加法程序。開始204.2.2分支程序 通常,單純的順序結(jié)構(gòu)程序只能解決一些簡單的算術(shù)、邏輯運(yùn)算,或者簡單的查表、傳送操作等。實(shí)際問題一般都是比較復(fù)雜的,總是伴隨有邏輯判斷或條件選擇,要求計(jì)算機(jī)能根據(jù)給定的條件進(jìn)行判斷,選擇不同的處理路徑,從而表現(xiàn)出某種智能。 根據(jù)程序要求改變程序執(zhí)行順序,即程序的流向有兩個(gè)或兩個(gè)以上的出口,根據(jù)指定的條件選擇程序流向的程序結(jié)構(gòu)我們稱為分支程序結(jié)構(gòu)。 通常根據(jù)分支程序中出口的個(gè)數(shù)分為單分支結(jié)構(gòu)程序(兩個(gè)出口)和多分支結(jié)構(gòu)程序(三個(gè)或三個(gè)以上出口)。 在MCS-51指令系統(tǒng)中,通過條件判斷實(shí)現(xiàn)單分支程序轉(zhuǎn)移的指令有JZ、JNZ、CJNE和DJNZ等。此外,還有以位狀態(tài)為條件,進(jìn)行程序分支的指令JC、JNC、JB、JNB和JBC等。使用這些指令,可以完成或?yàn)?、1,或?yàn)檎?、為?fù),以及相等、不相等各種條件判斷,以實(shí)現(xiàn)程序有條件地轉(zhuǎn)移。項(xiàng)目4匯編語言程序設(shè)計(jì)4.2.2分支程序項(xiàng)目4匯編語言程序設(shè)計(jì)211.兩分支程序設(shè)計(jì)【例4.3】兩個(gè)無符號(hào)數(shù)比較(兩分支)。內(nèi)部RAM的30H單元和31H單元各存放了一個(gè)8位無符號(hào)數(shù),請(qǐng)比較這兩個(gè)數(shù)的大小,大數(shù)放在32H中。開始X-YCy=1?30H→32H31H→32HYN結(jié)束4-3兩數(shù)比較流程圖項(xiàng)目4匯編語言程序設(shè)計(jì)1.兩分支程序設(shè)計(jì)開始X-YCy=1?30H→32H31H→222.三分支程序設(shè)計(jì)【例4.4】兩個(gè)無符號(hào)數(shù)比較(三分支程序)。內(nèi)部RAM的20H單元和30H單元各存放了一個(gè)8位有符號(hào)數(shù),根據(jù)下列條件編程點(diǎn)亮相應(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?黃燈點(diǎn)亮YN結(jié)束NY紅燈點(diǎn)亮綠燈點(diǎn)亮項(xiàng)目4匯編語言程序設(shè)計(jì)2.三分支程序設(shè)計(jì)開始X=Y?X>Y?黃燈點(diǎn)亮YN結(jié)束N233.散轉(zhuǎn)程序 散轉(zhuǎn)程序是指經(jīng)過某個(gè)條件判斷之后,程序有多個(gè)流向(三個(gè)以上)。MCS-51單片機(jī)指令系統(tǒng)中專門提供了散轉(zhuǎn)指令,使得散轉(zhuǎn)程序的編制更加簡潔。 【例4.5】在例4.4的電路的基礎(chǔ)上加兩個(gè)開關(guān)組成簡單的信號(hào)燈電路,如圖4-6所示,試編程實(shí)現(xiàn)以下功能。K0K10 0 都按下,紅黃綠燈全亮(狀態(tài)1)0 1 K0單獨(dú)按下,紅燈亮(狀態(tài)2)1 0K1單獨(dú)按下,綠燈亮(狀態(tài)3)1 1 都未按下,黃燈亮(狀態(tài)4)項(xiàng)目4匯編語言程序設(shè)計(jì)3.散轉(zhuǎn)程序項(xiàng)目4匯編語言程序設(shè)計(jì)24開始讀P1口引腳狀態(tài)→A轉(zhuǎn)移指令表基地址→DPTR屏蔽無關(guān)位散轉(zhuǎn)移狀態(tài)1狀態(tài)2狀態(tài)3狀態(tài)4返回返回返回返回項(xiàng)目4匯編語言程序設(shè)計(jì)開始讀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)處理項(xiàng)目4匯編語言程序設(shè)計(jì)4.2.3循環(huán)程序開始初始化循環(huán)處理循環(huán)控制循環(huán)完成?NY循261.單重循環(huán)程序設(shè)計(jì) 【例4.6】數(shù)據(jù)極值查找程序。設(shè)內(nèi)部RAM從30H單元開始存放有8個(gè)數(shù),找出其中最大的數(shù),放到60H單元。 解:極值查找操作的主要內(nèi)容是進(jìn)行數(shù)值大小比較。假定在比較過程中,以A存放大數(shù),與之逐個(gè)比較的另一個(gè)數(shù)放在50H單元。采用先執(zhí)行后判斷的結(jié)構(gòu),首先設(shè)定比較次數(shù),在比較結(jié)束后,把查找到的最大數(shù)送到60H單元。程序流程圖如圖4-9所示。開始數(shù)據(jù)區(qū)首地址→R0讀下一個(gè)數(shù)→50H(50H)→A(A)>(50H)?NYA→(60H)結(jié)束數(shù)據(jù)個(gè)數(shù)→R7讀第一個(gè)數(shù)→AR7-1→R7R7-1=0?NY項(xiàng)目4匯編語言程序設(shè)計(jì)1.單重循環(huán)程序設(shè)計(jì)開始數(shù)據(jù)區(qū)首地址→R0讀下一個(gè)數(shù)→50H27 【例4.7】將內(nèi)部RAM中30H單元開始的數(shù)據(jù)傳送到外部RAM1200H開始的存儲(chǔ)空間內(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)條件可以測(cè)試到,可以采用先判斷后執(zhí)行的程序結(jié)構(gòu)。流程圖如圖4-10所示。開始A=100?取內(nèi)部RAM數(shù)據(jù)→AYN結(jié)束傳送數(shù)據(jù)到外部RAM圖4-10例4.7流程圖項(xiàng)目4匯編語言程序設(shè)計(jì) 【例4.7】將內(nèi)部RAM中30H單元開始的數(shù)據(jù)傳送到外282.多重循環(huán)程序設(shè)計(jì)—定時(shí)程序 在循環(huán)內(nèi)套循環(huán)的程序結(jié)構(gòu)稱多重循環(huán),或稱循環(huán)嵌套。若把每重循環(huán)的內(nèi)部看作一個(gè)整體,則多重循環(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)生錯(cuò)誤。 定時(shí)程序是一種很典型的多重循環(huán)程序,其在單片機(jī)匯編語言程序設(shè)計(jì)中使用非常廣泛,例如定時(shí)檢測(cè)、定時(shí)掃描、定時(shí)中斷等。所謂定時(shí)就是讓CPU做一些與主程序功能無關(guān)的操作(例如將一個(gè)數(shù)字逐次減1直到為0)來空耗掉CPU的時(shí)間來達(dá)到延時(shí)的目的。由于我們知道CPU執(zhí)行每條指令的準(zhǔn)確時(shí)間,因此執(zhí)行整個(gè)延時(shí)程序的時(shí)間也可以精確計(jì)算出來。也就是說,我們可以寫出延時(shí)長度任意而且精度相當(dāng)高的延時(shí)程序。項(xiàng)目4匯編語言程序設(shè)計(jì)2.多重循環(huán)程序設(shè)計(jì)—定時(shí)程序項(xiàng)目4匯編語言程序設(shè)計(jì)29【例4.8】設(shè)計(jì)一個(gè)延時(shí)50ms的程序,設(shè)單片機(jī)時(shí)鐘晶振頻率為fosc=12MHz。 解:延時(shí)程序一般采用循環(huán)程序結(jié)構(gòu)編程,通過確定循環(huán)程序中的循環(huán)次數(shù)和循環(huán)程序段兩個(gè)因素來確定延時(shí)時(shí)間。題目給定fosc=12MHz,那么機(jī)器周期的計(jì)算方法:T機(jī)器=12T時(shí)鐘=12×(1/12M)=1μs。下面就是一個(gè)最簡單的單循環(huán)定時(shí)程序:MOVR7,#TIMELOOP:NOPNOP DJNZR7,LOOP NOP指令的機(jī)器周期為1,用來提高定時(shí)精度,DJNZ指令的機(jī)器周期為2,故一次循環(huán)共4個(gè)機(jī)器周期。一個(gè)機(jī)器周期是1μS,則一次循環(huán)的延遲時(shí)間為4μS。上面程序總的延遲時(shí)間為4×time(μS)。本程序的實(shí)際延遲時(shí)間取決于裝入寄存器R7的定時(shí)時(shí)間常數(shù)time。R7是8位寄存器,故這個(gè)程序的最長定時(shí)時(shí)間為256×4=1020(μS),即定時(shí)范圍是4~1024μS??梢妴窝h(huán)定時(shí)程序的時(shí)間延遲較小。項(xiàng)目4匯編語言程序設(shè)計(jì)【例4.8】設(shè)計(jì)一個(gè)延時(shí)50ms的程序,設(shè)單片機(jī)時(shí)鐘晶振頻率30 為了加長定時(shí)時(shí)間,通常采用多重循環(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最大定時(shí)時(shí)間計(jì)算公式為:(256×2+2+2)×256+1=132097(μS)若定時(shí)50ms,采取合適的TIME1和TIME2即可,如TIME1=200和TIME2=123。項(xiàng)目4匯編語言程序設(shè)計(jì) 為了加長定時(shí)時(shí)間,通常采用多重循環(huán)方法。流程圖如圖4-131 循環(huán)控制:在重復(fù)執(zhí)行循環(huán)體的過程中,不斷修改和判別循環(huán)變量,直到符合循環(huán)結(jié)束條件。一般情況下,循環(huán)控制有以下幾種方式:(1)計(jì)數(shù)循環(huán)——如果循環(huán)次數(shù)已知,用計(jì)數(shù)器計(jì)數(shù)來控制循環(huán)次數(shù),這種控制方式用得比較多。循環(huán)次數(shù)要在初始化部分予置,在控制部分修改,每循環(huán)一次計(jì)數(shù)器內(nèi)容減1。(2)條件控制循環(huán)——在循環(huán)次數(shù)未知的情況下,一般通過設(shè)立結(jié)束條件來控制循環(huán)的結(jié)束。(3)循環(huán)結(jié)束處理:這部分程序用于存放執(zhí)行循環(huán)程序所得結(jié)果以及恢復(fù)各工作單元的初值等。項(xiàng)目4匯編語言程序設(shè)計(jì) 循環(huán)控制:在重復(fù)執(zhí)行循環(huán)體的過程中,不斷修改和判別循環(huán)變324.2.4查表程序 在微型機(jī)控制系統(tǒng)中,有些參數(shù)的計(jì)算是非常復(fù)雜的,用計(jì)算法計(jì)算不僅程序長,難于計(jì)算,而且需要耗費(fèi)大量時(shí)間。還有一些非線性參數(shù),它們不是用一般算術(shù)運(yùn)算就可以計(jì)算出來,而是要涉及到指數(shù),對(duì)數(shù),三角函數(shù),以及積分,微分等運(yùn)算。所有這些運(yùn)算用匯編語言編程計(jì)算都比較復(fù)雜,有些甚至無法建立相應(yīng)的數(shù)學(xué)模型。為了解決這些問題,可以采用查表法。 所謂查表法,就是把事先計(jì)算或測(cè)得的數(shù)據(jù)按一定順序編制成表格,查表程序的任務(wù)就是根據(jù)被測(cè)參數(shù)的值或者中間結(jié)果,查出最終所需要的結(jié)果。它具有程序簡單,執(zhí)行速度快等優(yōu)點(diǎn)。 查表程序在微型機(jī)控制系統(tǒng)中應(yīng)用非常廣泛,例如,在鍵盤處理程序中,查找按鍵相應(yīng)的命令處理子程序的入口地址;在LED顯示程序中,獲得LED數(shù)碼管的顯示代碼;在一些快速計(jì)算的場合,根據(jù)自變量的值,從函數(shù)表上查找出相應(yīng)的函數(shù)值以及實(shí)現(xiàn)非線性修正、代碼轉(zhuǎn)換等等。所有這些應(yīng)用,都需采用查表技術(shù)。項(xiàng)目4匯編語言程序設(shè)計(jì)4.2.4查表程序項(xiàng)目4匯編語言程序設(shè)計(jì)33【例4.8】查表計(jì)算函數(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項(xiàng)目4匯編語言程序設(shè)計(jì)【例4.8】查表計(jì)算函數(shù)y=x!(x=0、1、2、…、7)的344.2.5子程序 在實(shí)際的程序設(shè)計(jì)中,常會(huì)遇到多次應(yīng)用的、完成相同的某種基本運(yùn)算或操作的程序段。如果每用一次都從頭編寫一次,這不僅麻煩,使程序冗長,而且浪費(fèi)存儲(chǔ)空間,還使程序的出錯(cuò)率增加,給程序的調(diào)試帶來困難。 所以,在實(shí)際的程序設(shè)計(jì)中,將那些需多次應(yīng)用的、完成相同的某種基本運(yùn)算或操作的程序段從整個(gè)程序中獨(dú)立出來,單獨(dú)編制成一個(gè)程序段,盡量使其標(biāo)準(zhǔn)化,并存放于某一存儲(chǔ)區(qū)域;需要時(shí)通過調(diào)用指令進(jìn)行調(diào)用。這樣的程序段,稱為子程序,如我們?cè)趯?shí)訓(xùn)中的延時(shí)子程序。項(xiàng)目4匯編語言程序設(shè)計(jì)4.2.5子程序項(xiàng)目4匯編語言程序設(shè)計(jì)35 子程序作為一個(gè)具有獨(dú)立功能的程序段,編程時(shí)需遵循以下原則:1.子程序的第一條指令必須有標(biāo)號(hào),明確子程序入口地址。2.以返回指令RET結(jié)束子程序。3.簡明扼要的子程序說明部分。4.較強(qiáng)的通用性和可浮動(dòng)性,盡可能避免使用具體的內(nèi)存單元和絕對(duì)轉(zhuǎn)移地址等。5.注意保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場。 另外,在編制子程序前,最好以程序注釋的形式對(duì)子程序進(jìn)行說明,說明內(nèi)容如下:1.子程序名:提供給主程序調(diào)用的名字。2.子程序功能:簡要說明子程序能完成的主要功能。3.入口參數(shù):主程序需要向子程序提供的參數(shù)。4.出口參數(shù):子程序執(zhí)行完之后向主程序返回的參數(shù)。5.占用資源:該子程序中使用了那些存儲(chǔ)單元、寄存器等。項(xiàng)目4匯編語言程序設(shè)計(jì) 子程序作為一個(gè)具有獨(dú)立功能的程序段,編程時(shí)需遵循以下原則:36演講完畢,謝謝觀看!演講完畢,謝謝觀看!37項(xiàng)目4匯編語言程序設(shè)計(jì)項(xiàng)目4匯編語言程序設(shè)計(jì)38 什么是程序設(shè)計(jì)?程序設(shè)計(jì)=結(jié)構(gòu)+算法。 程序設(shè)計(jì)就像蓋房子,數(shù)據(jù)結(jié)構(gòu)就像磚、瓦,而算法就是設(shè)計(jì)圖紙。你若想蓋房子首先必須有原料(數(shù)據(jù)結(jié)構(gòu)),但是這些原料不能自動(dòng)地蓋起了你想要的房子;你必須按照設(shè)計(jì)圖紙(算法)上的說明一磚一瓦地去砌。這樣你才能擁有你想要的房子。程序設(shè)計(jì)也一樣,程序設(shè)計(jì)時(shí)你得按照程序規(guī)定的功能去編寫,而程序的功能是實(shí)現(xiàn)就是算法的具體體現(xiàn)。所以通俗地說:你必須按照特定的規(guī)則,把特定的功能語句和基本結(jié)構(gòu)按照特定的順序排列起來,形成一個(gè)有特定功能的程序,這就是:程序設(shè)計(jì)=結(jié)構(gòu)+算法。
一般說來,計(jì)算機(jī)程序設(shè)計(jì)語言種類很多,不僅有機(jī)器語言和匯編語言,還有很多高級(jí)語言。對(duì)單片機(jī)而言,通常使用匯編語言或C語言進(jìn)行程序設(shè)計(jì),程序較大時(shí)一般采用C語言編寫,但用匯編語言編寫的程序執(zhí)行的效率較高。程序設(shè)計(jì)完成后,然后利用計(jì)算機(jī)或人工方法將匯編語言或C語言程序轉(zhuǎn)化為單片機(jī)可以執(zhí)行的機(jī)器語言。轉(zhuǎn)換前的匯編語言或C語言程序被稱為源程序,轉(zhuǎn)換后的機(jī)器語言程序被稱為目標(biāo)程序,轉(zhuǎn)換過程也叫匯編過程,通過計(jì)算機(jī)或人工轉(zhuǎn)換的方法又被稱為計(jì)算機(jī)匯編或手工匯編。計(jì)算機(jī)匯編要使用專門的軟件,叫匯編軟件。項(xiàng)目4匯編語言程序設(shè)計(jì) 什么是程序設(shè)計(jì)?程序設(shè)計(jì)=結(jié)構(gòu)+算法。項(xiàng)目4匯編語言程序394.1源程序的編制4.1.1程序設(shè)計(jì)步驟在對(duì)單片機(jī)系統(tǒng)進(jìn)行程序設(shè)計(jì)時(shí),必須考慮硬件資源的配置,當(dāng)硬件系統(tǒng)設(shè)計(jì)完成后,可以按照以下步驟進(jìn)行程序設(shè)計(jì)。1.預(yù)完成任務(wù)的分析2.進(jìn)行算法的優(yōu)化3.繪制程序流程圖4.分配資源5.編寫源程序6.程序優(yōu)化7.編譯,調(diào)試,修改和最后確定源程序項(xiàng)目4匯編語言程序設(shè)計(jì)4.1源程序的編制4.1.1程序設(shè)計(jì)步驟項(xiàng)目4匯編語言程40 用圖形符號(hào)將總體設(shè)計(jì)思路及程序流向繪制在平面圖上。從而使程序的結(jié)構(gòu)關(guān)系直觀明了,便于檢查和修改,它直觀清晰的體現(xiàn)了程序的設(shè)計(jì)思路,是程序設(shè)計(jì)的依據(jù)。 繪制流程圖時(shí),首先畫出簡單的功能流程圖粗框圖,再對(duì)功能流程圖進(jìn)行擴(kuò)充和具體化,即對(duì)存儲(chǔ)器標(biāo)志位等單元做具體的分配和說明,把功能圖上的每一個(gè)粗框圖轉(zhuǎn)化為具體的存儲(chǔ)器或地址單元,從而繪制出詳細(xì)的程序流程圖。流線程序執(zhí)行順序流向線表示處理功能端點(diǎn)符號(hào)程序的開始和結(jié)束符號(hào)表示判斷功能判斷符號(hào)處理符號(hào)連接符號(hào)用來實(shí)現(xiàn)流程圖之間的連接程序流程圖的繪制項(xiàng)目4匯編語言程序設(shè)計(jì) 用圖形符號(hào)將總體設(shè)計(jì)思路及程序流向繪制在平面圖上。從而使414.1.2匯編語言源程序的格式 匯編語言源程序是由若干語句組成的,每一語句可由4個(gè)部分組成:標(biāo)號(hào)、操作碼、操作數(shù)及注釋。每一部分間以不同的分隔符分隔,語句格式如下:
[標(biāo)號(hào)]:操作碼[目的操作數(shù)][源操作數(shù)];[注釋]
其中[]項(xiàng)為可選項(xiàng),視具體的指令選用. 標(biāo)號(hào)是表示該語句所在地址的標(biāo)志符號(hào),使用標(biāo)號(hào)可方便程序中的其他語句訪問該語句。標(biāo)號(hào)由字母打頭的1-8個(gè)字母數(shù)字串組成,但指令保留符、寄存器名、位址記憶符、偽指令符等都不能作標(biāo)號(hào)使用。操作碼表示操作的性質(zhì),它是匯編指令中唯一不能缺省的部分。操作數(shù)表示操作的對(duì)象,在一條語句中,操作數(shù)可能是空白或以逗號(hào)分開的幾個(gè)。注釋是對(duì)語句或程序段功能的解釋說明有助于的閱讀和維護(hù)。項(xiàng)目4匯編語言程序設(shè)計(jì)4.1.2匯編語言源程序的格式項(xiàng)目4匯編語言程序設(shè)計(jì)424.1.3匯編語言源程序的匯編 將匯編語言源程序“翻譯”成機(jī)器語言目標(biāo)程序的過程稱為匯編,對(duì)單片機(jī)助記符的匯編有兩種方法:人工匯編和機(jī)器匯編。 人工匯編是用人工查表將源程序譯成機(jī)器碼。一般分為兩步進(jìn)行。第一步將源程序中的指令逐條譯成目標(biāo)碼,指令中的標(biāo)號(hào)地址待求。第二步由偽指令求出標(biāo)號(hào)所代表的具體地址,進(jìn)行有關(guān)程序存儲(chǔ)區(qū)的數(shù)據(jù)操作并進(jìn)行偏移量的計(jì)算。 機(jī)器匯編是將源程序輸入計(jì)算機(jī)后,由匯編程序?qū)崿F(xiàn)翻譯工作,產(chǎn)生相應(yīng)的機(jī)器碼。這是一種非常高效和方便的方法。項(xiàng)目4匯編語言程序設(shè)計(jì)4.1.3匯編語言源程序的匯編項(xiàng)目4匯編語言程序設(shè)計(jì)434.1.4偽指令 在機(jī)器匯編時(shí),對(duì)匯編過程進(jìn)行控制和指導(dǎo)的指令稱為偽指令。在匯編過程中,偽指令供匯編程序識(shí)別和執(zhí)行但不產(chǎn)生可執(zhí)行的目標(biāo)代碼。如規(guī)定匯編生成的目標(biāo)代碼在ROM中的存放區(qū)域,給源程序符號(hào)、標(biāo)號(hà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)時(shí),下條指令的存放地址由此重新定位,所以O(shè)RG定義地址的順序應(yīng)有小到大,且不能重疊。項(xiàng)目4匯編語言程序設(shè)計(jì)4.1.4偽指令項(xiàng)目4匯編語言程序設(shè)計(jì)442.匯編結(jié)束偽指令-END(EndofAssembly)指令格式:[標(biāo)號(hào)]:END功能:結(jié)束匯編語言源程序的操作。在源程序中只能有一條END,END后所寫的指令,匯編程序不予處理。項(xiàng)目4匯編語言程序設(shè)計(jì)2.匯編結(jié)束偽指令-END(EndofAssembly)453.符號(hào)賦值偽指令——EQU(EQUate)指令格式:字符名稱EQU數(shù)或匯編符號(hào)功能:將一個(gè)數(shù)或特定的匯編符號(hào)賦給指定的字符名稱。字符名稱為一自定的符號(hào),而不是標(biāo)號(hào),字符名稱后無“:”。字符名稱可用來作數(shù)據(jù)地址,立即數(shù),位地址或者是一代碼地址,其值可以是一個(gè)8位數(shù),也可以是16位數(shù)。例如:TESTEQU20HMOVA,TEST 這里字符名稱TEST就代表了內(nèi)部RAM20H地址單元。又例如:A1EQU10HMOVA,A1這里A1代表片內(nèi)RAM的直接地址單元10H。使用EQU偽指令可以把抽象的數(shù)字地址表示成有一定意義的符號(hào),增強(qiáng)程序的可讀性。項(xiàng)目4匯編語言程序設(shè)計(jì)3.符號(hào)賦值偽指令——EQU(EQUate)項(xiàng)目4匯編語言464.定義數(shù)據(jù)字節(jié)偽指令——DB(DefineByte) 格式:[標(biāo)號(hào):]DB<項(xiàng)或項(xiàng)表> 項(xiàng)或項(xiàng)表是指一個(gè)字節(jié),逗號(hào)隔開的8位二進(jìn)制的數(shù)或字符串,或撇號(hào)’括起來的ASCII字符串。 功能:從標(biāo)號(hào)指定的地址單元開始,在程序存儲(chǔ)器中存入一組8位二進(jìn)制數(shù),或者將一個(gè)數(shù)據(jù)表格存入程序存儲(chǔ)器。這條偽指令匯編后影響程序存儲(chǔ)器的內(nèi)容。例如:ORG1100HTAB:DB01H,04H,09H,10HDB00001111B,‘1’,‘A’,‘BC’項(xiàng)目4匯編語言程序設(shè)計(jì)4.定義數(shù)據(jù)字節(jié)偽指令——DB(DefineByte)項(xiàng)目475.定義數(shù)據(jù)字命令——DW(DefineWord)格式:[標(biāo)號(hào):]DW<項(xiàng)或項(xiàng)表>功能:DW的功能和DB類似,DW是從標(biāo)號(hào)指定的地址開始存放16位而非8位二進(jìn)制數(shù),存放時(shí),數(shù)據(jù)字的高8位在前(低地址),低8位在后(高地址)。例如:ORG5000HMOVA,#30H………ORG5020HADDTAB:DW1234H,100H,10………;END 一條DB和DW語句定義的數(shù)表其數(shù)的個(gè)數(shù)不得超過80個(gè)。當(dāng)數(shù)據(jù)的數(shù)目較多時(shí),可使用多個(gè)定義命令。在MCS-51程序設(shè)計(jì)應(yīng)用中,常以DW來定義地址。項(xiàng)目4匯編語言程序設(shè)計(jì)5.定義數(shù)據(jù)字命令——DW(DefineWord)項(xiàng)目4486.預(yù)留存儲(chǔ)區(qū)偽指令——DS(DefineStorage) 格式:[標(biāo)號(hào):]DS<表達(dá)式> 功能:本命令用于從指定地址開始,保留DS之后表達(dá)式的值所需數(shù)目的字節(jié)單元作為存儲(chǔ)區(qū)以備后用。匯編時(shí),對(duì)這些單元不賦值。例如:ORG0100HMOVA,#50H………ADDRTABL:DS05HDB20HEND 從標(biāo)號(hào)ADDRTABL代表的地址開始,保留5個(gè)連續(xù)的ROM地址單元,第6個(gè)單元存放20H。
對(duì)MCS-51單片機(jī)來說,DB,DW,DS偽指令只能對(duì)程序存儲(chǔ)器使用,而不能對(duì)數(shù)據(jù)存儲(chǔ)器進(jìn)行初始化。項(xiàng)目4匯編語言程序設(shè)計(jì)6.預(yù)留存儲(chǔ)區(qū)偽指令——DS(DefineStorage)497.位地址賦值偽指令——BIT 格式:[字符名稱]BIT<位地址> 功能:本命令用于給字符名稱賦以位地址。其中<位地址>可以是絕對(duì)地址,也可以是符號(hào)地址(即位符號(hào)名稱)。例如:AQBITP1.0A2BIT07H 這兩條指令分別把P1.0的位地址賦給變量AQ,位地址07H賦給符號(hào)名A2,在其后的編程中AQ和A2就可以作為位地址使用。項(xiàng)目4匯編語言程序設(shè)計(jì)7.位地址賦值偽指令——BIT項(xiàng)目4匯編語言程序設(shè)計(jì)504.1.5程序設(shè)計(jì)技巧1.模塊化程序設(shè)計(jì)方法 單片機(jī)應(yīng)用系統(tǒng)的程序一般由包含多個(gè)模塊的主程序和各種子程序組成。每一程序模塊都要完成一個(gè)明確的任務(wù),實(shí)現(xiàn)某個(gè)具體的功能,如發(fā)送、接收、延時(shí)、打印、顯示等。采用模塊化的程序設(shè)計(jì)方法,就是將這些不同的具體功能程序進(jìn)行獨(dú)立的設(shè)計(jì)和分別調(diào)試,最后將這些模塊程序裝配成整體程序并進(jìn)行聯(lián)調(diào)。項(xiàng)目4匯編語言程序設(shè)計(jì)4.1.5程序設(shè)計(jì)技巧項(xiàng)目4匯編語言程序設(shè)計(jì)51 把一個(gè)多功能的、復(fù)雜的程序劃分為若干個(gè)簡單的、功能單一的程序模塊的程序設(shè)計(jì)方法具有明顯的優(yōu)點(diǎn):1)單個(gè)模塊結(jié)構(gòu)的程序功能單一,易于設(shè)計(jì)、編寫、調(diào)試及修改;2)有利于程序的優(yōu)化和分工,從而可使多個(gè)程序員同時(shí)進(jìn)行程序的編寫和調(diào)試,加快軟件研制進(jìn)度;3)提高了程序的閱讀性和可靠性,使程序的結(jié)構(gòu)層次一目了然,同時(shí)4)對(duì)程序的修改可局部進(jìn)行,其他部分可以保持不變,便于功能擴(kuò)充和版本升級(jí);5)對(duì)于使用頻繁的子程序可以建立子程序庫,便于多個(gè)模塊調(diào)用。項(xiàng)目4匯編語言程序設(shè)計(jì) 把一個(gè)多功能的、復(fù)雜的程序劃分為若干個(gè)簡單的、功能單一的52 模塊的劃分有很大的靈活性,但也不能隨意劃分。劃分時(shí)應(yīng)遵循下述原則:1)每個(gè)模塊應(yīng)具有獨(dú)立的功能,能產(chǎn)生一個(gè)明確的結(jié)果,這就是單模塊的功能高內(nèi)聚性。2)模塊之間的控制耦合應(yīng)盡量簡單,數(shù)據(jù)耦合應(yīng)盡量少,這就是模塊間的低耦合性。控制耦合是指模塊進(jìn)入和退出的條件及方式,數(shù)據(jù)耦合是指模塊間的信息交換(傳遞)方式、交換量的多少及交換的頻繁程度。3)模塊長度適中。模塊語句的長度通常在20條~100條的范圍較合適。模塊太長時(shí),分析和調(diào)試比較困難,失去了模塊化程序結(jié)構(gòu)的優(yōu)越性;過短則模塊的連接太復(fù)雜,信息交換太頻繁,因而也不合適。項(xiàng)目4匯編語言程序設(shè)計(jì) 模塊的劃分有很大的靈活性,但也不能隨意劃分。劃分時(shí)應(yīng)遵循532.程序設(shè)計(jì)技巧1)盡量采用循環(huán)結(jié)構(gòu)和子程序。2)盡量少用無條件轉(zhuǎn)移指令。3)對(duì)于通用的子程序,考慮到其通用性,除了用于存放子程序入口參數(shù)的寄存器外,子程序中用到的其他寄存器的內(nèi)容應(yīng)壓入堆棧(返回前再彈出)進(jìn)行現(xiàn)場保護(hù),并要特別注意堆棧操作的壓入和彈出的平衡。一般不必把標(biāo)志寄存器壓入堆棧。4)對(duì)于中斷處理子程序除了要保護(hù)程序中用到的寄存器外,還應(yīng)保護(hù)標(biāo)志寄存器。5)累加器是信息傳遞的樞紐。項(xiàng)目4匯編語言程序設(shè)計(jì)2.程序設(shè)計(jì)技巧項(xiàng)目4匯編語言程序設(shè)計(jì)544.2程序結(jié)構(gòu)4.2.1順序程序 順序結(jié)構(gòu)是按照邏輯操作順序,從某一條指令開始逐條順序執(zhí)行,直至某一條指令為止,無分支,也無循環(huán)。順序結(jié)構(gòu)是所有程序設(shè)計(jì)中最基本、最單純的程序結(jié)構(gòu)形式,在程序設(shè)計(jì)中使用最多,因而是一種最簡單且應(yīng)用最普遍的程序結(jié)構(gòu)。一般實(shí)際應(yīng)用程序遠(yuǎn)比順序結(jié)構(gòu)復(fù)雜得多,但它是組成復(fù)雜程序的基礎(chǔ)和主干。項(xiàng)目4匯編語言程序設(shè)計(jì)4.2程序結(jié)構(gòu)4.2.1順序程序項(xiàng)目4匯編語言程序設(shè)計(jì)55【例4.1】將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù)。 設(shè)內(nèi)部RAM40H、41H單元中分別存放著8位二進(jìn)制數(shù)。要求取出兩個(gè)單元的低半字節(jié),合并成一個(gè)字節(jié)后,存入42H單元。開始(40H)內(nèi)容送A,屏蔽高位A與R1或后送入(42H)交換高低位,送入R1(41H)內(nèi)容送A,屏蔽高位返回圖4-1例1程序流程圖項(xiàng)目4匯編語言程序設(shè)計(jì)【例4.1】將兩個(gè)半字節(jié)數(shù)合并成一個(gè)一字節(jié)數(shù)。開始(40H)56【例4.2】用順序結(jié)構(gòu)程序編寫三字節(jié)無符號(hào)數(shù)的加法程序。設(shè)被加數(shù)存放在:40H(高字節(jié)),41H(中字節(jié)),42H(低字節(jié))加數(shù)存放在:43H(高字節(jié)),44H(中字節(jié)),45H(低字節(jié))運(yùn)算結(jié)果仍存在被加數(shù)單元中。開始取低字節(jié)數(shù)據(jù)返回相加后送回被加數(shù)單元取中字節(jié)數(shù)據(jù)帶進(jìn)位位相加后送回被加數(shù)單元取高字節(jié)數(shù)據(jù)帶進(jìn)位位相加后送回被加數(shù)單元圖4-2例2程序流程圖項(xiàng)目4匯編語言程序設(shè)計(jì)【例4.2】用順序結(jié)構(gòu)程序編寫三字節(jié)無符號(hào)數(shù)的加法程序。開始574.2.2分支程序 通常,單純的順序結(jié)構(gòu)程序只能解決一些簡單的算術(shù)、邏輯運(yùn)算,或者簡單的查表、傳送操作等。實(shí)際問題一般都是比較復(fù)雜的,總是伴隨有邏輯判斷或條件選擇,要求計(jì)算機(jī)能根據(jù)給定的條件進(jìn)行判斷,選擇不同的處理路徑,從而表現(xiàn)出某種智能。 根據(jù)程序要求改變程序執(zhí)行順序,即程序的流向有兩個(gè)或兩個(gè)以上的出口,根據(jù)指定的條件選擇程序流向的程序結(jié)構(gòu)我們稱為分支程序結(jié)構(gòu)。 通常根據(jù)分支程序中出口的個(gè)數(shù)分為單分支結(jié)構(gòu)程序(兩個(gè)出口)和多分支結(jié)構(gòu)程序(三個(gè)或三個(gè)以上出口)。 在MCS-51指令系統(tǒng)中,通過條件判斷實(shí)現(xiàn)單分支程序轉(zhuǎn)移的指令有JZ、JNZ、CJNE和DJNZ等。此外,還有以位狀態(tài)為條件,進(jìn)行程序分支的指令JC、JNC、JB、JNB和JBC等。使用這些指令,可以完成或?yàn)?、1,或?yàn)檎?、為?fù),以及相等、不相等各種條件判斷,以實(shí)現(xiàn)程序有條件地轉(zhuǎn)移。項(xiàng)目4匯編語言程序設(shè)計(jì)4.2.2分支程序項(xiàng)目4匯編語言程序設(shè)計(jì)581.兩分支程序設(shè)計(jì)【例4.3】兩個(gè)無符號(hào)數(shù)比較(兩分支)。內(nèi)部RAM的30H單元和31H單元各存放了一個(gè)8位無符號(hào)數(shù),請(qǐng)比較這兩個(gè)數(shù)的大小,大數(shù)放在32H中。開始X-YCy=1?30H→32H31H→32HYN結(jié)束4-3兩數(shù)比較流程圖項(xiàng)目4匯編語言程序設(shè)計(jì)1.兩分支程序設(shè)計(jì)開始X-YCy=1?30H→32H31H→592.三分支程序設(shè)計(jì)【例4.4】兩個(gè)無符號(hào)數(shù)比較(三分支程序)。內(nèi)部RAM的20H單元和30H單元各存放了一個(gè)8位有符號(hào)數(shù),根據(jù)下列條件編程點(diǎn)亮相應(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?黃燈點(diǎn)亮YN結(jié)束NY紅燈點(diǎn)亮綠燈點(diǎn)亮項(xiàng)目4匯編語言程序設(shè)計(jì)2.三分支程序設(shè)計(jì)開始X=Y?X>Y?黃燈點(diǎn)亮YN結(jié)束N603.散轉(zhuǎn)程序 散轉(zhuǎn)程序是指經(jīng)過某個(gè)條件判斷之后,程序有多個(gè)流向(三個(gè)以上)。MCS-51單片機(jī)指令系統(tǒng)中專門提供了散轉(zhuǎn)指令,使得散轉(zhuǎn)程序的編制更加簡潔。 【例4.5】在例4.4的電路的基礎(chǔ)上加兩個(gè)開關(guān)組成簡單的信號(hào)燈電路,如圖4-6所示,試編程實(shí)現(xiàn)以下功能。K0K10 0 都按下,紅黃綠燈全亮(狀態(tài)1)0 1 K0單獨(dú)按下,紅燈亮(狀態(tài)2)1 0K1單獨(dú)按下,綠燈亮(狀態(tài)3)1 1 都未按下,黃燈亮(狀態(tài)4)項(xiàng)目4匯編語言程序設(shè)計(jì)3.散轉(zhuǎn)程序項(xiàng)目4匯編語言程序設(shè)計(jì)61開始讀P1口引腳狀態(tài)→A轉(zhuǎn)移指令表基地址→DPTR屏蔽無關(guān)位散轉(zhuǎn)移狀態(tài)1狀態(tài)2狀態(tài)3狀態(tài)4返回返回返回返回項(xiàng)目4匯編語言程序設(shè)計(jì)開始讀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)處理項(xiàng)目4匯編語言程序設(shè)計(jì)4.2.3循環(huán)程序開始初始化循環(huán)處理循環(huán)控制循環(huán)完成?NY循631.單重循環(huán)程序設(shè)計(jì) 【例4.6】數(shù)據(jù)極值查找程序。設(shè)內(nèi)部RAM從30H單元開始存放有8個(gè)數(shù),找出其中最大的數(shù),放到60H單元。 解:極值查找操作的主要內(nèi)容是進(jìn)行數(shù)值大小比較。假定在比較過程中,以A存放大數(shù),與之逐個(gè)比較的另一個(gè)數(shù)放在50H單元。采用先執(zhí)行后判斷的結(jié)構(gòu),首先設(shè)定比較次數(shù),在比較結(jié)束后,把查找到的最大數(shù)送到60H單元。程序流程圖如圖4-9所示。開始數(shù)據(jù)區(qū)首地址→R0讀下一個(gè)數(shù)→50H(50H)→A(A)>(50H)?NYA→(60H)結(jié)束數(shù)據(jù)個(gè)數(shù)→R7讀第一個(gè)數(shù)→AR7-1→R7R7-1=0?NY項(xiàng)目4匯編語言程序設(shè)計(jì)1.單重循環(huán)程序設(shè)計(jì)開始數(shù)據(jù)區(qū)首地址→R0讀下一個(gè)數(shù)→50H64 【例4.7】將內(nèi)部RAM中30H單元開始的數(shù)據(jù)傳送到外部RAM1200H開始的存儲(chǔ)空間內(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)條件可以測(cè)試到,可以采用先判斷后執(zhí)行的程序結(jié)構(gòu)。流程圖如圖4-10所示。開始A=100?取內(nèi)部RAM數(shù)據(jù)→AYN結(jié)束傳送數(shù)據(jù)到外部RAM圖4-10例4.7流程圖項(xiàng)目4匯編語言程序設(shè)計(jì) 【例4.7】將內(nèi)部RAM中30H單元開始的數(shù)據(jù)傳送到外652.多重循環(huán)程序設(shè)計(jì)—定時(shí)程序 在循環(huán)內(nèi)套循環(huán)的程序結(jié)構(gòu)稱多重循環(huán),或稱循環(huán)嵌套。若把每重循環(huán)的內(nèi)部看作一個(gè)整體,則多重循環(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)生錯(cuò)誤。 定時(shí)程序是一種很典型的多重循環(huán)程序,其在單片機(jī)匯編語言程序設(shè)計(jì)中使用非常廣泛,例如定時(shí)檢測(cè)、定時(shí)掃描、定時(shí)中斷等。所謂定時(shí)就是讓CPU做一些與主程序功能無關(guān)的操作(例如將一個(gè)數(shù)字逐次減1直到為0)來空耗掉CPU的時(shí)間來達(dá)到延時(shí)的目的。由于我們知道CPU執(zhí)行每條指令的準(zhǔn)確時(shí)間,因此執(zhí)行整個(gè)延時(shí)程序的時(shí)間也可以精確計(jì)算出來。也就是說,我們可以寫出延時(shí)長度任意而且精度相當(dāng)高的延時(shí)程序。項(xiàng)目4匯編語言程序設(shè)計(jì)2.多重循環(huán)程序設(shè)計(jì)—定時(shí)程序項(xiàng)目4匯編語言程序設(shè)計(jì)66【例4.8】設(shè)計(jì)一個(gè)延時(shí)50ms的程序,設(shè)單片機(jī)時(shí)鐘晶振頻率為fosc=12MHz。 解:延時(shí)程序一般采用循環(huán)程序結(jié)構(gòu)編程,通過確定循環(huán)程序中的循環(huán)次數(shù)和循環(huán)程序段兩個(gè)因素來確定延時(shí)時(shí)間。題目給定fosc=12MHz,那么機(jī)器周期的計(jì)算方法:T機(jī)器=12T時(shí)鐘=12×(1/12M)=1μs。下面就是一個(gè)最簡單的單循環(huán)定時(shí)程序:MOVR7,#TIMELOOP:NOPNOP DJNZR7,LOOP NOP指令的機(jī)器周期為1,用來提高定時(shí)精度,DJNZ指令的機(jī)器周期為2,故一次循環(huán)共4個(gè)機(jī)器周期。一個(gè)機(jī)器周期是1μS,則一次循環(huán)的延遲時(shí)間為4μS。上面程序總的延遲時(shí)間為4×time(μS)。本程序的實(shí)際延遲時(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025人保財(cái)險(xiǎn)鄂爾多斯市分公司招聘15人信息筆試歷年典型考點(diǎn)題庫附帶答案詳解
- 新員工培訓(xùn)課件表
- 2025云南眾成人才派遣有限責(zé)任公司招聘勞務(wù)派遣人員2人筆試參考題庫附帶答案詳解
- 2025中鐵集裝箱運(yùn)輸有限責(zé)任公司擬錄用畢業(yè)生筆試歷年常考點(diǎn)試題專練附帶答案詳解
- 2025中煤第三建設(shè)集團(tuán)(貴州)有限責(zé)任公司項(xiàng)目部技能人員招聘66人筆試參考題庫附帶答案詳解
- 2025中國鋁業(yè)集團(tuán)有限公司審計(jì)中心招聘24人筆試歷年備考題庫附帶答案詳解2套試卷
- 2025中國聯(lián)合網(wǎng)絡(luò)通信有限公司會(huì)昌縣分公司招聘17人筆試參考題庫附帶答案詳解
- 2025中國電子數(shù)據(jù)產(chǎn)業(yè)集團(tuán)社會(huì)招聘筆試參考題庫附帶答案詳解
- 2025中國水利報(bào)社公開招聘工作人員12人筆試歷年典型考點(diǎn)題庫附帶答案詳解
- 2025中國建筑國際集團(tuán)二○二一“海之子”春季招聘補(bǔ)錄40人筆試歷年??键c(diǎn)試題專練附帶答案詳解2套試卷
- 2026內(nèi)蒙古鄂爾多斯市伊金霍洛旗九泰熱力有限責(zé)任公司招聘熱電分公司專業(yè)技術(shù)人員16人備考考試試題及答案解析
- 2026中國電建招聘面試題及答案
- GB/T 36132-2025綠色工廠評(píng)價(jià)通則
- 車隊(duì)春節(jié)前安全培訓(xùn)內(nèi)容課件
- 2025年溫州肯恩三位一體筆試英語真題及答案
- 化學(xué)實(shí)驗(yàn)員應(yīng)該知道的100個(gè)實(shí)驗(yàn)室小常識(shí)
- 人教版五年級(jí)上冊(cè)數(shù)學(xué)第七單元《植樹問題》應(yīng)用題期末專項(xiàng)訓(xùn)練(含答案)
- 機(jī)關(guān)人員公務(wù)出差審批單
- 審計(jì)報(bào)告征求意見書模板
- 排水管渠(溝道)系統(tǒng)課件
- 第6章 受壓構(gòu)件截面承載力(6-3)
評(píng)論
0/150
提交評(píng)論