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

正文內(nèi)容

mcs51程序設(shè)計(jì)-預(yù)覽頁

2025-08-27 10:02 上一頁面

下一頁面
 

【正文】 MOV R1, A ;存放第二個(gè)半字節(jié) RET END 上面程序要在 40H 中輸入兩個(gè)數(shù),例如 86 再看 6 是否送入 41H 單元, 8 是否送入 42H單元。 下面舉兩個(gè)分支程序的例子。用減法指令通過借位( CY)的狀態(tài)判兩數(shù)的大小,是兩個(gè)無符號(hào)數(shù)比較大小時(shí)常用的方法。執(zhí)行 SJMP指令后,實(shí)現(xiàn)程序的轉(zhuǎn)移。設(shè) ASCII 碼放在累加器 A 中,轉(zhuǎn)換結(jié)果放回 A 中。設(shè)二進(jìn)制數(shù)放在累加器 A 中,其補(bǔ)碼放回到 A中。它們的特點(diǎn)是,每一條指令至多執(zhí)行一次。重復(fù)次數(shù)越多,循環(huán)程序的優(yōu)越性就越明顯。如:設(shè)置循環(huán)次數(shù)計(jì)數(shù)器的初值,地址指針置初值,為循環(huán)變量賦初值等。 通常 4 部分又稱為循環(huán)體。如圖 55( a)所示。 循環(huán)結(jié)構(gòu)的程序,不論是先處理后判斷,還是先判斷后處理,其關(guān)鍵是控制循環(huán)的次數(shù)。 單循環(huán)程序 ( 1)循環(huán)次數(shù)已知的循環(huán)程序。 例如:設(shè)有 50 個(gè)外部 RAM 單元要清“ 0”,即為循環(huán)次數(shù)存放在 R2 寄存器中,其首址存放在 DPTR 中,設(shè)為 20xxH。 例 8 :多個(gè)單字節(jié)數(shù)據(jù)求和 已知有 n 個(gè)單字節(jié)數(shù)據(jù),依次存放在內(nèi)部 RAM 40H 單元開始的連續(xù)單元中。以上介紹的幾個(gè)循環(huán)程序例子,它們的循環(huán)次數(shù)都是已知的,適合用計(jì)數(shù)器置初值的方法。 例 9 : 測(cè)試字符串長(zhǎng)度 設(shè)有一串字符依次存放在從 50H 單元開始的連續(xù)單元中,該字符串以回車符為結(jié)束標(biāo)志,測(cè)得的字符串長(zhǎng)度存入 R2 中。 循環(huán)程序在數(shù)據(jù)傳送 方面的應(yīng)用 數(shù)據(jù)傳送在程序編寫中占有很重要的位置,編程離不開數(shù)據(jù)的處理和傳送,初編程時(shí)往往是不知道數(shù)據(jù)怎么處理。 例 10: 將內(nèi)部 RAM以 40H 為起始地址的 8 個(gè)單元中的內(nèi)容傳到以 60H 為起始地址的 8 個(gè)單元中。編程有很大的靈活性,很高的技巧,首先應(yīng)該多看實(shí)例,有些指令的用法比較特殊專一,要記下來,如以上程序,還有查表程序,散轉(zhuǎn)程序等等。調(diào)試此程序時(shí)要打開 Franklin 仿真軟件的數(shù)據(jù)窗口( Data View),在窗口中的 40H 為 起點(diǎn)的 8 個(gè)單元中送數(shù),首先全速運(yùn)行程序,看所有數(shù)據(jù)是否傳到 60H 為起點(diǎn)的 8 個(gè)單元中,若不正確,單步運(yùn)行程序,看程序的每一步是否正確,若還不正確,再反復(fù)修改,直到正確為止。 例 12: 將外部存儲(chǔ)器以 20xxH 為起始地址的 8 個(gè)單元中的內(nèi)容傳到內(nèi)部 RAM以 40H為起始地址的 8 個(gè)單元中。 例 13: 將外部存儲(chǔ)器以 20xxH 為起始地址的 8 個(gè)單元中的內(nèi)容傳到外部存儲(chǔ)器以4000H 為起始地址的 8 個(gè)單元中。 此程序傳數(shù)的最大個(gè)數(shù)為 FFH 即 256 個(gè),超過此數(shù)該程序就有問題,該問題出在高字節(jié)不能改變,要使高字節(jié)也能變,程序要作如下變動(dòng): ORG 0000H MOV R2, 00H ;定外部存儲(chǔ)器取數(shù)單元的起始地址低字節(jié) MOV R3, 20H ;定外部存儲(chǔ)器取數(shù)單元的起始地址高字節(jié) MOV R4, 00H ;定外部存儲(chǔ)器存數(shù)單元的起始地址低字節(jié) MOV R5, 40H ;定外部存儲(chǔ)器存數(shù)單元的起始地址高字節(jié) MOV R6, 08H ;定送數(shù)的個(gè)數(shù)低字 節(jié) MOV R7, 04H ;定送數(shù)的個(gè)數(shù)高字節(jié) MOV A, R7 JZ LOP2 JNZ LOP ;以上三句是判一下 R7 高字節(jié)是否為 0 LOP1: MOV DPL, R2 MOV DPH, R3 MOV A, DPTR ;讀出 20xx 單元的數(shù)送 A 暫存 INC DPTR ;取數(shù)單元加 1,指向下一個(gè)單元 MOV R2, DPL MOV R3, DPH ;新地址送 R R3,為送下一個(gè)作準(zhǔn)備 MOV DPL, R4 MOV DPH, R5 MOVX DPTR, A ;送數(shù)到 4000H 單元 INC DPTR ;存數(shù)單元加 1,指向下一個(gè)單元 MOV R4, DPL MOV R5, DPH ;新地址送 R R5,為送下一個(gè)作準(zhǔn)備 LOP: DJNZ R7, LOP1 ;高字節(jié)送完了嗎?未完轉(zhuǎn)到 LOP1 繼續(xù)送 LOP2: DJNZ R6, LOP1 ;未完接著轉(zhuǎn)去送低字節(jié),完了順序執(zhí)行, END ;結(jié)束程序。 例 14: 10 秒延時(shí)程序 延時(shí)程序與 MCS51 執(zhí)行指令的時(shí)間有關(guān),如果使用 6MHz 晶振,一個(gè)機(jī)器周期為2μ s,計(jì)算出執(zhí)行一條指令以至一個(gè)循環(huán)所需要的時(shí)間,給出相應(yīng)的循環(huán)次數(shù),便能達(dá)到延時(shí)的目的。 ( 2)外循環(huán)可以一層層向內(nèi)循環(huán)進(jìn)入,結(jié)束時(shí)由里往外一層層退出。如此反復(fù)比較,直至數(shù)列排序完成為止。 設(shè)數(shù)列首地址在 R0 寄存器中, R2 為外循環(huán)次數(shù)計(jì)數(shù)器, R3 為內(nèi)循環(huán)次數(shù)計(jì)數(shù)器,R1 為交換標(biāo)志。因此對(duì)一些常用的程序段,以子程序的形式,事先存放在存儲(chǔ)器的某一區(qū)域,當(dāng)主程序在運(yùn)行時(shí),需要用子程序時(shí),只要執(zhí)行調(diào)用子程序的指令,使程序轉(zhuǎn)至子程序。 節(jié)省存儲(chǔ)器空間。 調(diào)用子程序時(shí),主程序應(yīng)先把有關(guān)的參數(shù)(入口參數(shù))存放在約定的位置,子程序在執(zhí)行時(shí),可以從約定的位置取得參數(shù),當(dāng)子程序執(zhí)行完,將得到的結(jié)果(出口參數(shù))存入約定的位置,返回主程序后,主程序可以從這些約定的位置上取到需要的結(jié)果,這就是參數(shù)的傳遞。它的缺點(diǎn)是工作寄存 器數(shù)量有限,不能傳遞太多的數(shù)據(jù);主程序必須先把數(shù)據(jù)送到工作寄存器;參數(shù)個(gè)數(shù)固定,不能由主程序任意改定。一般如參數(shù)在內(nèi)部 RAM中,可用 R0 或 R1 作指針。利用 MS51 的帶進(jìn)位加法指令,可以直接編寫出下面的程序。返回主程序后,可用 POP 指令得到這些結(jié)果參數(shù)。下面以幾個(gè)簡(jiǎn)單的例子說明用堆棧來傳遞參數(shù)的方法。它不改變累加器的值。 ORG 0000H HA24: MOV A, 50H SWAP A PUSH ACC ACALL HASC POP ACC MOV R1, A INC R1 PUSH 50H ACALL HASC POP ACC MOV R1, A INC R1 MOV A, 51H SWAP A PUSH ACC ACALL HASC POP ACC MOV R1, A INC R1 PUSH 51H ACALL HASC POP ACC MOV R1, A END HASC 子程序只完成了一位十六進(jìn)制數(shù)到 ASCII 碼的轉(zhuǎn)換,對(duì)于一個(gè)字節(jié)中兩個(gè)十六進(jìn)制數(shù),需由主程序把它分成兩個(gè)一位十六進(jìn)制數(shù),然后兩次調(diào)用 HASC,才能完成轉(zhuǎn)換。在子程序中,必須對(duì)堆棧內(nèi)的返回地址和棧指針進(jìn)行修改。如果在子程序出口處,棧指針與實(shí)際的棧內(nèi)容不相符合,這時(shí)應(yīng)修改棧指針。如果有許多常數(shù)參數(shù),這種技術(shù)不太有效,因?yàn)槊總€(gè)參數(shù)需要一個(gè)寄存器傳遞,并且在每次調(diào)用子程序時(shí)需分別用指令把它們裝入寄存器中。 例 22:字符串發(fā)送子程序。為了簡(jiǎn)便,也可把字符串放在 EPROM 獨(dú)立區(qū)域中,然后用傳遞字符串首地址的方法來傳遞參數(shù)。 ORG 0000H SOUT: POP DPH ;棧中指針 POP DPL SOT1: CLR A MOVC A, A+DPTR INC DPTR JZ SEND JNB TI, $ ; $為本條指令地址 CLR TI MOV SBUF, A SJMP SOT1 SEND: JMP A+DPTR END 下面從發(fā)送字符串‘ MCS51 CONTROLLER’為例,說明該子程序使用 方法。 ( 2) 它可適用與 ACALL 或 LCALL,因?yàn)檫@兩種調(diào)用指令均把下一條指令或數(shù)據(jù)字節(jié)的地址壓入棧中。 ( 4) 子程序只使用累加器 A 和數(shù)據(jù)指針 DPTR,應(yīng)用程序可以在調(diào)用前,把這些寄存器壓入堆棧中,保護(hù)它們的內(nèi)容。 x 有各種結(jié)構(gòu),如:有時(shí) x 可取小于 n( n 為定值)的自然數(shù)子集;有時(shí), x 取值范圍較大,并且不會(huì)取到該范圍中的所有值,即對(duì)某些 x, f( x)無定義,例如 x 為不定長(zhǎng)的字符串或 x 為某些 ASCII 字符。表格的存放內(nèi)容也各有不同,有的只存放 y 值,有的既有 x 值又有y 值。 程序?yàn)椋? ORG 0000H START: MOV DPTR, TABLE LOOP: CLR A MOVC A, A+DPTR CJNE A, 03H, LOOP1 JMP START LOOP1: MOV P1, A ACALL DEL INC DPTR JMP LOOP TAB: DB 01H, 02H, 04H, 08H, 10H, 20H, 40H, 80H DB 80H, 40H, 20H, 10H, 08H, 04H, 02H, 01H DB 00H, 0FFH, 00H, 0FFH, 00H, 0FFH, 03H DEL: MOV R7, 0FFH DEL1: MOV R6, 0FFH DEL2: DJNZ R6, DEL2 DJNZ R7, DEL1 RET END 5 . 6 散轉(zhuǎn)程序設(shè)計(jì) 散轉(zhuǎn)程序是分支程序的一種。 MCS51 指令系統(tǒng)中有一條跳轉(zhuǎn)指 JMP ADPTR,用它可以容易地實(shí)現(xiàn)散轉(zhuǎn)功能。 用轉(zhuǎn)移指令表實(shí) 現(xiàn)散轉(zhuǎn) 在許多場(chǎng)合中,要根據(jù)某一單元的值 0, 1, 2,?, n 分別轉(zhuǎn)向處理程序 0,處理程序 1,??處理程序 n。 標(biāo)號(hào)為 LOP0 的程序?yàn)橛?P1 口控制的彩燈兩端向中間點(diǎn)亮,標(biāo)號(hào)為 LOP1 的程序?yàn)? 由 P1 口控制的彩燈左移順次點(diǎn)亮, 標(biāo)號(hào)為 LOP2 的程序?yàn)橛?P1 口控制的 彩燈右移順次點(diǎn)亮 程序如下: ORG 0000H MOV DPTR, TAB1 MOV A, R6 ADD A, R6 JNC PAD INC DPH PAD: JMP A+DPTR TAB1: AJMP LOP0 AJMP LOP1 AJMP LOP2 LOP1: MOV A, 0FEH LP1: MOV P1, A ACALL DEL RL A AJMP LP1 RET LOP2: MOV A, 7FH LP2: MOV P1, A ACALL DEL RR A AJMP LP2 RET LOP0: MOV R0, 00H LOOP: CLR A MOV A, R0 ADD A, 0CH MOVC A, A+PC CJNE A, 03H, LOOP1 JMP START LOOP1: MOV P1, A ACALL DEL INC R0 JMP LOOP TAB: DB 81H, 42H, 24H, 18H, 03H DEL: MOV R4, 0FFH DEL1: MOV R3, 0FFH DEL2: DJNZ R3, DEL2 DJNZ R4, DEL1 RET END 本例僅適用于散轉(zhuǎn)表首地址 TAB1 和處理程序入口地址 LOP0, LOP1,?? LOPn 在同一個(gè) 2K范圍的存儲(chǔ)區(qū)的情況。由于 LJMP 是 3 字節(jié)的指令,在組成指令轉(zhuǎn)移表時(shí),當(dāng)執(zhí)行 JMP A+DPTR 指令時(shí),可能出現(xiàn) DPTR 低 8 位向高 8 位的進(jìn)位,用加法指令對(duì) DPTR 直接修改來實(shí)現(xiàn)。將累加器清零后用 JMP A+DPTR 直接轉(zhuǎn) 向各個(gè)處理程序的入口。如大于 256 時(shí),應(yīng)采用雙字節(jié)數(shù)加法運(yùn)算修改 DPTR
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報(bào)告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1