freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

mcs51程序設(shè)計(完整版)

2025-09-16 10:02上一頁面

下一頁面
  

【正文】 ET END 上面程序先要在 RAM 的 40H、 41H 單元中輸入兩個數(shù) ,(輸入法見第二章軟件仿真部分)例如輸入 08 和 06,再看 86 是否送入 42H 單元。將加的這一部分寫成通用程序: AD1: MOV R0, 40H ; 設(shè) R0 為數(shù)據(jù)指針 MOV A, R0 ;取 N1 INC R0 ;修改指針 ADD A, R0 ; N1+N2 INC R0 MOV R0, A ;存結(jié)果 RET 使用這個程序之前,先將加數(shù)、被加數(shù)送入 40H、 41H 單元,完整的程序如下: ORG 0000H MOV 40H, 01H MOV 41H, 02H ACALL AD1 AD1: MOV R0, 40H ; 設(shè) R0 為數(shù)據(jù)指針 MOV A, R0 ;取 N1 INC R0 ;修改指針 ADD A, R0 ; N1+N2 INC R0 MOV R0, A ;存結(jié)果 RET END 標號 AD1 到 RET 的這段程序就為子程序, 圖 51 例 1 流程圖 有時將這些專用的子程序存入 ROM 中,不可改寫。 程序到此編寫完成,然后在仿真軟件中調(diào)試、驗證,若不對,反復(fù)修改程序,直到完全正確為止。編好的程序要用軟件仿真或硬件仿真檢驗其正確性。程序有簡有繁,有些復(fù)雜程序往往是由簡單的基本程序所構(gòu)成。 將編制出的程序在計算機上調(diào)試,直至實現(xiàn)預(yù)定的功能。 例 1: 編寫 1+2 的程序 首先用 ADD A, Rn 指令,該指令是將寄存器 Rn 中的數(shù)與累加器 A 中的數(shù)相加,結(jié)果存于 A 中,這就要求先將 1 和 2 分別送到 A 中和寄存器 Rn 中,而 Rn 有四組,每組有八個單元 R0~R7,首先要知道 Rn 在哪組,默認值(不設(shè)定值)是第 0 組,在同一個程序中,同組中的 Rn 不能重復(fù)使用,不然會數(shù)據(jù)出錯,唯獨 A 可反復(fù)使用,不出問題。如以上 1+2 的程序,也可以這樣寫,先將加數(shù)和被加數(shù)分別送入 40H、 41H 單元,加完后和送入 42H 單元。下面的程序都是講的通用子程序。根據(jù)判斷、比較的結(jié)果轉(zhuǎn)向不同的分支。執(zhí)行 JNC 指令后,形成了分支。因此,程序首先判斷被轉(zhuǎn)換數(shù)的符號,負數(shù)進行轉(zhuǎn)換,正數(shù)即為補碼。采用循環(huán)程序,使程序縮短,節(jié)省存儲單元。 控制部分:根據(jù)循環(huán)次數(shù)計數(shù)器的 狀態(tài)或循環(huán)條件,檢查循環(huán)是否能繼續(xù)進行,若循環(huán)次數(shù)到或循環(huán)條件不滿足,應(yīng)控制退出循環(huán),否則繼續(xù)循環(huán)。如圖 55( b)所示。 以上是內(nèi)部 RAM 單元清零,也可清外部 RAM 單元。 ( 2)循環(huán)次數(shù)末知的循環(huán)程序。 程序如下: ORG 0000H CONT: MOV R2, 00H ;初始長度設(shè)置 MOV R0, 50H ;數(shù)據(jù)指針 R0 置初值 NEXT: CJNE R0, 0DH, LOOP RET LOOP1 INC R0 INC R2 SJMP NEXT END 待測字符以 ASCII 碼形式存放在 RAM 中,回車符的 ASCII 碼為 0DH,程序中用一條 CJNE R0, 0DH, LOOP 指令實現(xiàn)字符比較及控制循環(huán)的任務(wù),當循環(huán)結(jié)束時, R2的內(nèi)容為字符串長度。開始編程序要全力以赴,不讓任何人打擾,不中斷思路,一 氣呵成。 程序初步編好后,在仿真軟件中調(diào)試,調(diào)試時先打開 Franklin 仿真軟件的數(shù)據(jù)窗口( Data View),在窗口中的 40H 為起點的 8 個單元中任意送數(shù),再打開 Franklin 仿真軟件的外部數(shù)據(jù)窗口( Xdata View),首先全速運行程序,看所有數(shù)據(jù)是否傳到 20xxH為起點的 8 個單元中,若不正確,再單步運行程序,看程序的每一步是否正確,若不正確,再反復(fù)修改,直到正確為止。首先全速運行程序,看所有數(shù)據(jù)是否傳到 4000H 為起點的 8 個單元中,若不正確,再單步運行程序,看程序的每一步是否正確,若不正確,再反復(fù)修改,直到正確為止。使用多重循環(huán)程序時,必須注意以下幾點: ( 1)循環(huán)嵌套,必須層次分明,不允許產(chǎn)生內(nèi)外層循環(huán)交叉。 可以結(jié)束比較。 簡化程序的邏輯結(jié)構(gòu),同時也便于子程序調(diào)試。使用這種方法程序最簡單,運算速度也最高。入口時,( R0),( R1)分別指向加數(shù)和被加數(shù)的低位字節(jié),出口時( R0)指向結(jié)果的高位字節(jié)。 實際使用時,不同的調(diào)用程序可使用不同的技術(shù)來決定或處理這些參數(shù)。 我們編寫程序時可以將例 18 當作子程序調(diào)用,子程序名為 HASC。修改棧指針的操作,這里并不需要,因為在子程序中,有 PUSH ACC(保護累加器內(nèi)容),已經(jīng)使棧指針加 1。子程 序根據(jù)棧內(nèi)的返回地址,決定從何處找到這些常數(shù),然后在需要時,從程序存貯器中讀出這些參數(shù)。下例中,字符串全以 0 結(jié)束。子程序在每一條 MOVC 指令前累加器裝入適當?shù)膮?shù),這樣基本上可“隨機訪問”參數(shù)表。以存放順序分,有有序與無序表;以存放地點分,有的表格存放在存儲器中(用 MOVC 指令訪 問),有的表存放在數(shù)據(jù)存儲器中(用MOVX 指令訪問)。由于每 一個情況都有判斷和轉(zhuǎn)移,如對 n 個情況,需要 n 個判斷和轉(zhuǎn)移,因此它的缺點是程序比較長。 R6=0,轉(zhuǎn) LOP0 R6=1,轉(zhuǎn) LOP1 R6=2,轉(zhuǎn) LOP2 把轉(zhuǎn)移標志,送累加器 A,轉(zhuǎn)移表首地址送 DPTR,利用 JMP A+DPTR 實現(xiàn)轉(zhuǎn)移 。用查表指令,找到對應(yīng)的轉(zhuǎn)向地址,把它裝入 DPTR 中。 例 27:用左移指令 RL A 編程 ORG 0000H MOV A, 0FEH LOP1: MOV P1。 例 26: 根據(jù) R3 的內(nèi)容轉(zhuǎn)向?qū)?yīng)處理程序。如果一個 2K范圍的存儲區(qū)內(nèi)放不下所有的處理程序時,把一些較長的處理程序放在其他存儲區(qū)域,只要在該處理程序的入口地址內(nèi)用 LJMP 指令即可。該指令是把累加器 A 的 8 位無符號數(shù)(作地址的低 8 位)與 16 位數(shù)據(jù)指針的內(nèi)容相加,其和送入程序計數(shù)器,作為轉(zhuǎn)移指令的地址。下面介紹幾種常用查表方法及程序。 前面介紹了四種基本的參數(shù)傳遞方法,實際上,可以按需要合并使用兩種或幾種參數(shù)傳遞方法,以達到減少程序長度,加快運行速度、節(jié)省工作單元等目標。 ACALL SOUT DB ‘ MCS51 CONTROLLER’ DB 0AH, 0DH, 0 : 后面緊接其他程序。 在實際應(yīng)用中,經(jīng)常需要發(fā)送各種字符串。因為一般在用棧指針傳遞參數(shù)的子程序中,均用數(shù)據(jù)指針 R0或 R1 來修改棧內(nèi)容(包括返回地址),并且一般在最后修改返回地址,故可在返回前,加入一條 MOV SP, R0 或 MOV SP, R1 指令,即可完成棧指針的修改。對于需多次使用該功能的程序的場合,需占用很多程序空間。 例 18:一位十六進制數(shù)轉(zhuǎn)換為 ASCII 碼子程序。 ORG 0000H NADD: MOV R7, 3 CLR C NADD1: MOV A, R0 ADDC A, R1 MOV R0, A DEC R0 DEC R0 DJNZ R7, NADD1 DJNZ R7, NADD1 INC R0 RET END 用堆棧來傳遞參數(shù) 堆??梢杂糜趥鬟f參數(shù)。 例 16:請編出能把 20H 單元內(nèi)兩個 BCD 數(shù)變換成相應(yīng) ASCII 碼放在 21H(高位 BCD數(shù)的 ASCII 碼)和 22H(低位 BCD 數(shù)的 ASCII 碼)單元的程序。 MCS51 指令系統(tǒng)中,提供了兩條調(diào)用子程序指令 ACALL 及 LCALL,和一條返回主程序的指令 RET。 程序如下: ORG 8000H MOV R2, CNT1 ;數(shù)列個數(shù) 1 LOOP1: MOV A, R2 ;外循環(huán)計數(shù)值 MOV R3, A ;內(nèi)循環(huán)計數(shù)值 MOV R1, 01 ;交換標志置 1 LOOP2: MOV A, R0 ;取數(shù)據(jù) MOV B, A ;暫存 B INC R0 CLR C SUBB A, R0 ;兩數(shù)比較 JC LESS ; Xi〈 XI+1 轉(zhuǎn) LESS MOV A, B ;取大數(shù) XCH A, R0 ;兩數(shù)交換位置 DEC R0 MOV R0, A ; INC R0 ;恢復(fù)數(shù)據(jù)指針 MOV R1, 02 ;置交換標志為 2 LESS: DJNZ R3, LOOP2 ;內(nèi)循環(huán)計數(shù)減 1,判一遍查完? DJNZ R2, LOOP3 ;外循環(huán)計數(shù)減 1,判排序結(jié)束 STOP: RET LOOP3: DJNZ R1, LOOP1 ;發(fā)生交換轉(zhuǎn)移 SJMP STOP ORG 50H ;(內(nèi)部 RAM) LIST: DB 0, 13, 3, 90, 27, 32, 11 ONT EQU 07H END 5 . 4 子程序和參數(shù)傳遞方法 在實際程序中,常常會多次進行一些相同的計算和操作。 ( 3)內(nèi)循環(huán)體可以直接轉(zhuǎn)入外循環(huán)體,實現(xiàn)一個循環(huán)由多個條件控制的循環(huán)結(jié)構(gòu)方式。 象這樣的小程序很有用的,一般將它編寫成通用的子程序: MOVE: MOV DPL, R2 MOV DPH, R3 MOVX A, DPTR MOV DPL, R4 MOV DPH, R5 MOVX A, DPTR CJNE R2, 0FFH, MOV1 INC R3 MOV1: INC R2 CJNE R2, 0FFH, MOV2 INC R5 MOV2: INC R4 CJNE R6, 00H, MOV3 CJNE R7, 00H, MOV4 MOV3: DEC R6 SJMP MOVE MOV4: DEC R6 DEC R7 SJMP MOVE RET 程 序中 R R3 定數(shù)據(jù)塊的首地址, R R5 定數(shù)據(jù)塊目標地址, R6 為傳送多少個數(shù)的低字節(jié), R7 為傳送多少個數(shù)的高字節(jié),使用此子程序時只要將這 6 個數(shù)送入,調(diào)用此程序就行。 仿照例 2 我們可寫 出程序如下: ORG 0000H MOV DPTR, 20xxH ;定外部存儲器取數(shù)單元的起始地址 MOVX A, DPTR ;讀出數(shù)送 A 暫存 MOV R0, 40H ;定內(nèi)部 RAM 存數(shù)單元的起始地址 MOV R0 , A ;送數(shù)到 40H 單元 MOV R7, 08 ;定送數(shù)的個數(shù) LOOP: INC R0 ;取數(shù)單元加 1,指向下一個單元 INC DPTR ;存數(shù)單元加 1,
點擊復(fù)制文檔內(nèi)容
研究報告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1