第一篇:單片機實驗9 多分支程序設(shè)計
實驗9 多分支程序設(shè)計
1、實驗內(nèi)容
用P1.0、P1.1控制流水燈的變化
P1.0、P1.1=00燈全滅
P1.0、P1.1=01單燈亮左循環(huán)
P1.0、P1.1=10單燈亮右循環(huán)
P1.0、P1.1=11雙燈亮左循環(huán)
燈亮的時時為1秒。用軟件延時實現(xiàn)。*用T0定時選作。
2、實驗步驟
1)打開PV32編程序。匯編正確進入調(diào)試界面。否則修改程序重新匯編直到通過。
2)打開P0、P1窗口給
3)調(diào)試燈全滅、單燈亮左循環(huán)、單燈亮右循環(huán)、雙燈亮左循環(huán)程序觀察并記祿寄存器、內(nèi)存的變化。判斷程序是否正確。若發(fā)現(xiàn)問題重返編輯界面,修改、存盤、匯編。返回調(diào)試界面調(diào)試通過。
4)設(shè)斷點調(diào)試主程序觀察并記祿寄存器、內(nèi)存的變化。判斷程序是否正確。若發(fā)現(xiàn)問題重返編輯界面,修改、存盤、匯編。返回調(diào)試界面調(diào)試通過。
首先將P1.0、P1.1置00觀察P2窗口燈是否全滅,然后改變P1.0、1.1的設(shè)置觀察流水燈運行是否正確。
5)流水燈運行中改變P1.0、1.1看流燈能否隨之變化。若執(zhí)行正確程序通過。否則在每個流水子程序中加入讀P1口散轉(zhuǎn)子程序。
3.實驗報告
1.寫出主程序流程圖、子程序流程圖、程序清單
2.根據(jù)記淥數(shù)據(jù)給程序加注解
3.調(diào)試心得
第二篇:單片機-分支程序設(shè)計教案
一、復(fù)習(xí)上次課內(nèi)容
1、什么是標(biāo)識符?
答:標(biāo)識符是程序員選擇的名字,用來標(biāo)識常量、變量、過程、段名等。
2、什么是偽指令?
答:注釋性的,沒有對應(yīng)的機器碼,不令計算機做任何操作,不產(chǎn)生目
標(biāo)程序,不影響程序的執(zhí)行。
二、講授新課
4.3分支程序設(shè)計
在很多實際問題中,都需要根據(jù)不同的情況進行不同的處理。這種
思想體現(xiàn)在程序設(shè)計中,就是根據(jù)不同條件而轉(zhuǎn)到不同的程序段去執(zhí)行,這就構(gòu)成了分支程序。分支程序的結(jié)構(gòu)有兩種,如圖4.2所示。
圖4.2 分支程序結(jié)構(gòu)
圖4.2(a)結(jié)構(gòu)使用條件轉(zhuǎn)移指令來實現(xiàn)分支,當(dāng)給出的條件成立時,執(zhí)行程序段A,否則執(zhí)行程序段B。
圖4.2(b)結(jié)構(gòu)使用散轉(zhuǎn)指令JMP來實現(xiàn)多分支轉(zhuǎn)移,它首先將分支程序按序號的值來實現(xiàn)分支轉(zhuǎn)移。
分支程序的特點是改變程序的執(zhí)行順序,跳過一些指令,去執(zhí)行另外一些指令。應(yīng)注意:對每一個分支都要單獨編寫一段程序,每一分支的開始地址賦給一個標(biāo)號。
在編寫分支程序時,關(guān)鍵是如何判斷分支的條件。在MCS-51系列單片機中可以直接用來判斷分支條件的指令并不多,只有累加器為零(或不為零)、比較條件轉(zhuǎn)移指令CJNE等,MCS-51單片機還提供了位條件轉(zhuǎn)移指令,如JC,JB等。把這些指令結(jié)合在一起使用,就可以完成各種各樣的條件判斷。
【例4-5】設(shè)補碼X放在內(nèi)部RAM30H單元中,函數(shù)Y與X有如下的關(guān)系式:
試編寫程序,根據(jù)X的值求出Y,并放回原單元。
解 取出X后先做取值范圍的判斷,用累加器A狀態(tài)轉(zhuǎn)移指令判斷X是否為0,用位狀態(tài)轉(zhuǎn)移指令判斷X是大于0還是小于0。程序流程圖如圖4.3所示。
程序如下:
MOV A,30H JZ ZER0 JNB ACC.7,PLUS
ADD A,#5 MOV 30H,A PLUS: SJMP $ ZERO: MOV 30H,#20H SJMP $ END 【例4-6】內(nèi)部RAM40H和41H單元中各有一無符號數(shù),比較其大小,將大數(shù)存放于內(nèi)部RAM60H單元,小數(shù)存放于內(nèi)部RAM61H單元,如兩數(shù)相等,則分別送往這2個單元。
解 用比較不等轉(zhuǎn)移指令CJNE比較力兩個無符號書,先確定它們是否相等,若不相等時再根據(jù)借位標(biāo)志確定這兩個無符號書的大小。程序框圖如圖4.4所示。程序如下:
LOOP:
AGEQ:
SJMP END $
XCH MOV A,61H 60H,A
;A<(41H)有借位
;A與(61H)交換 MOV MOV CJNE AJMP JNC A,40H 61H,41H A,41H,LOOP AGEQ AGEQ
;A≥(41H)則無借位
【例4-8】將ASCII碼制轉(zhuǎn)換為十六進制數(shù)。如果不是十六進制數(shù)得ASCII碼,用戶標(biāo)志位置1。解:由ASCII碼表知,30H~39H為0~9的ASCII碼,41H~46H為A~F的ASCII碼。在這一范圍的ASCII碼減去37H就可以獲得對應(yīng)的十六進制。設(shè)ASCII碼放在累加器A中,轉(zhuǎn)換結(jié)果放回A中。程序流程圖如圖4.5所示
三、課堂鞏固
四、課堂小結(jié)
五、作業(yè)
第三篇:分支結(jié)構(gòu)程序設(shè)計教案
感受分支結(jié)構(gòu)程序的作用
一、教學(xué)目標(biāo) 1.知識與技能目標(biāo)
(1)理解程序的分支結(jié)構(gòu)。(2)了解編程思路。2.過程與方法目標(biāo)
(1)借助多媒體教學(xué),強化學(xué)生的理解力和注意力。(2)能根據(jù)問題設(shè)計界面和編寫程序。3.情感、態(tài)度與價值觀目標(biāo)
(1)讓學(xué)生從無到有的探索過程中感受成功的喜悅。(2)培養(yǎng)學(xué)生探究精神與獨立操作能力。
二、教學(xué)重點和難點 1.教學(xué)重點:
使用visual basic語言的條件語句來實現(xiàn)分支結(jié)構(gòu),從而解決實際問題。
2、教學(xué)難點:
理解程序中流程的代碼描述。
三、教學(xué)方法
情境教學(xué)法、講授法、任務(wù)驅(qū)動法
四、教學(xué)準(zhǔn)備
1、教學(xué)環(huán)境。多媒體網(wǎng)絡(luò)教室。
2、教學(xué)資源。
學(xué)生用機需要安裝好visual Bastc語言環(huán)境。任務(wù)卡
五、教學(xué)過程
1.創(chuàng)設(shè)情境,導(dǎo)入新課
ppt演示導(dǎo)出課題“分支結(jié)構(gòu)”通過鏈接到“體型判斷”小程序,然后讓同學(xué)們自己推薦同學(xué)來測試是否偏胖或偏瘦或正常。學(xué)生的興趣度很高,積極的配合。
設(shè)計意圖:引起學(xué)生興趣,激發(fā)學(xué)生的學(xué)習(xí)熱情,點名課題。2.講授新課
(1)給出標(biāo)準(zhǔn)體重的計算公式,并簡介如何評判體型。
(2)列舉生活中需要進行條件選擇的例子來講解,幫學(xué)生理解分支結(jié)構(gòu)程序設(shè)計的概念。(3)關(guān)系表達式和邏輯表達式的簡介。(4)畫出if語句流程圖,了解簡單的if語句。
(5)教師操作“體型判斷”的案例,介紹框架控件的使用,編寫部分程序,回憶舊知。
設(shè)計意圖:師生共同構(gòu)思,寫出“體型判斷”源程序,讓學(xué)生對分支結(jié)構(gòu)的理解更深刻。
3.布置作業(yè),鞏固提高
以書本上的典型案例“體型判斷”讓學(xué)生操作,有不懂的看書本或任務(wù)卡。(巡回指導(dǎo),及時幫學(xué)生解決操作過程中存在的問題)
4.歸納總結(jié),加強記憶
先讓學(xué)生們歸納總結(jié)本節(jié)課所學(xué)的內(nèi)容,然后教師總結(jié),讓學(xué)生有一個更深刻的印象,并強調(diào)應(yīng)注意的幾個問題。
設(shè)計意圖:課堂小結(jié)的目的是強化認識,可以把課堂傳授的知識盡快地轉(zhuǎn)化為學(xué)生的知識;簡單扼要的課堂小結(jié),可使學(xué)生更深刻地理解分支結(jié)構(gòu)程序設(shè)計在實際生活中的應(yīng)用。
六、課后反思
整節(jié)課以學(xué)生動手為主,學(xué)生的興趣濃厚,課堂充滿活力,能夠達到預(yù)期目的。學(xué)生基本上都完成了課堂作業(yè),但是已經(jīng)做好的同學(xué)還沒能形成先預(yù)習(xí)下節(jié)課要講的內(nèi)容的好習(xí)慣,總體來說這節(jié)課是相對成功的。
第四篇:單片機實驗
實驗
一、MCS51單片機基本開發(fā)環(huán)境
1. 實驗?zāi)康模?/p>
1)熟悉軟件的集成開發(fā)環(huán)境 2)掌握單片機軟件設(shè)計流程
3)掌握單片機存貯器結(jié)構(gòu)及各窗口之間的聯(lián)系 2. 實驗內(nèi)容:
1)用三種方法實現(xiàn)將累加器A內(nèi)容改為20H
方法1--MOV A,#20H 方法2—MOV R0,#20H MOV A,R0 方法3—MOV R0,#20H XCH A,R0 心得:越往下做實驗時就越感覺這題根本不能說是題目,但不得不說在沒接觸過編程軟件,剛開始學(xué)的匯編,第一次做的實驗就光這道題都覺得不知道做什么.所以凡是總有開始,不了解情況的多簡單的都會覺得難.2)將58H位單元置為1,觀察內(nèi)部RAM中2BH內(nèi)容的變化 代碼:
SETB 2BH.0 JMP $ END 心得:這是關(guān)于內(nèi)部存儲中對單元和字節(jié)了解,不理解很容易做錯.比如開始寫的指令為
MOV R0,#58H;MOV @R0,#1
這是錯誤的指令。這就需要認真去了解單片機中的字節(jié)地址與位地址的關(guān)系。80C51中有位尋址區(qū)和字節(jié)尋址區(qū)。題目中58H為位地址,2BH為字節(jié)地址,且58H為2B字節(jié)的最低位。由于58H屬于位尋址區(qū),可用位操作指令 SETB 進行置位,SETB 2BH.0 執(zhí)行后,2BH中內(nèi)容變?yōu)椋埃?/p>
3)如果當(dāng)前狀態(tài)為有進位、工作寄存器使用區(qū)2,請用3種方法設(shè)置這種狀態(tài)
代碼:
ANL PSW,#01H MOV A,PSW
CJNE A,#01,LAB2 LAB1:JMP LAB1
LAB2: SETB PSW.4 MOV P0,#01H MOV R0,#18H CLR PSW.3 MOV C,P0.0 MOV PSW,R0 MOV PSW.4,C CPL C MOV PSW.3,C END
心得:以上LAB2寫了三段代碼,可分別完成題目要求。不過實驗時只是對代碼進行了錯誤調(diào)試,沒有對結(jié)果進行檢驗。其中值得注意的是對于布爾(位)操作指令的用法,比如傳送指令必須經(jīng)累加器C,如第二段中MOV P0,#01H;MOV C,P0.0,以及對于位尋址的方式(如需用到“.”隔開)的應(yīng)用。4)編一個小程序?qū)?nèi)部RAM中的20H單元的內(nèi)容送到21H單元并調(diào)試
代碼:
MOV R0,#20H MOV @R0,#10H MOV R1,#21H MOV @R1,20H JMP $ END
5)用程序?qū)⒍褩V羔樦赶?0H,然后在堆棧中依次壓入01,02,03,04,05五個數(shù),觀察哪些單元內(nèi)容發(fā)生了變化,各變?yōu)槎嗌??從哪些窗口可以發(fā)現(xiàn)這些變化?順序?qū)⒍褩V械奈鍌€數(shù)放入30H~34H五個單元中,編程實現(xiàn)之。
代碼:
MOV R1,#60H MOV SP,R1 MOV DPL,#1H LAB1:PUSH DPL INC DPL MOV A,DPL CJNE A,#6,LAB1 POP 34H POP 33H POP 32H POP 31H POP 30H JMP $ END
6)將外部數(shù)據(jù)存貯器1000H~100FH 16個單元中存放00H~0FH 代碼:
MOV DPTR,#1000H MOV R1,#10H LOOP:MOVX @DPTR,#1234H MOVX A,@DPTR MOV @R1,A INC DPTR INC R1 CJNE R1,#40H,LOOP JMP $ END
心得:此處需要訪問片外存儲空間,需要借助寄存器DPTR,需注意其為16位的寄存器,在使用時若與八位寄存器進行數(shù)據(jù)交換時需分為高八位DPH與低八位DPL來用。7)若要求程序從0010H單元開始運行,可用兩種方法實現(xiàn)?
方法一 ORG 0010H 方法二 AJMP 0010H
3. 選做實驗內(nèi)容:數(shù)據(jù)傳送 目的:
1)掌握8051單片機內(nèi)部數(shù)據(jù)存貯器、外部數(shù)據(jù)存貯器的數(shù)據(jù)傳送特點和應(yīng)用 2)掌握MOV,MOVX和MOVC類指令的用法及區(qū)別 內(nèi)容:
1)將片內(nèi)RAM數(shù)據(jù)區(qū)20H為首地址的十六個字節(jié)傳送到30H為首地址的數(shù)據(jù)區(qū),即:20H~2FH送30H~3FH
代碼: ORG 0000H JMP MAIN ORG 0030H MAIN:MOV R0,#20H MOV R1,#30H LOOP:MOV @R0,#1234H MOVA,@R0 MOV @R1,A INC R0 INC R1 CJNE R1,#30H,LOOP JMP $ END
2)將外部數(shù)據(jù)存儲器2000H~200FH單元的十六個數(shù)傳送至內(nèi)部數(shù)據(jù)存儲器的30H~3FH 代碼: ORG 0000H JMP MAIN ORG 0030H MAIN: MOV DPTR,#2000H MOV R1,#30H LOOP:MOVX @DPTR,#12H MOVX A,@DPTR MOV @R1,A INC DPTR INC R1 CJNE R1,#40H,LOOP JMP $ END
總體心得體會:
第一次做實驗主要是熟悉了解了下單片機編程軟件的使用,開始接觸時在對其軟件不是太了解的情況下實驗編程做的確實很亂,不清楚該怎樣進行,比如不知如何進行對指令的調(diào)試,也不清楚該如何觀察結(jié)果,沒有一個整體的概念,所以在了解其開發(fā)環(huán)境上花了不少時間。經(jīng)過一段時間的摸索后也終于了解了其具體的使用,也能夠順利的對指令的編程運用。運行指令時遇到的一些問題需要注意的也在上面各題中做了說明。還有需要注意的是:進入軟件仿真時需要對存儲空間進行查看的方法是在Address窗口中輸入:d:00h 顯示內(nèi)部數(shù)據(jù)存儲器從00h開始的單元; x:1000h 顯示外部數(shù)據(jù)存儲器從1000h開始的單元; c:0000H 顯示程序存儲器內(nèi)容。還有由于偽指令 END 定義的原因,在程序末需加一條死循環(huán)調(diào)轉(zhuǎn)指令(如 JMP $)使程序不會進入其他未知空間執(zhí)行其他指令。實驗
二、加、減法實驗
1. 實驗?zāi)康?/p>
1)正確使用單片機的加減運算指令
2)掌握不同指令對于程序狀態(tài)字的影響及程序狀態(tài)字的意義、用處 3)掌握ADD,ADDC,SUBB和DA A等指令的用法 4)學(xué)習(xí)模塊化程序設(shè)計方法 2. 實驗內(nèi)容
1)編寫3字節(jié)二進制加法子程序,并用主程序調(diào)用不同的加數(shù)和被加數(shù)來檢測該子程序的正確性。需考慮有進位和無進位情況。程序入口為: 加數(shù):22H,21H,20H三字節(jié),22H為最高位
被加數(shù):32H,31H,30H三字節(jié),32H為最高位
程序出口為: 23H,22H,21H,20H四字節(jié),23H為最高位 例如:地址:23 22 21 20 32 31 30 執(zhí)行前數(shù)據(jù): 01 23 45 FF 01 01 執(zhí)行后數(shù)據(jù):01 00 24 46
代碼:
ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 22H,#01H MOV 21H,#23H MOV 20H,#45H MOV 32H,#0FFH MOV 1H,#01H MOV 30H,#01H ACALL ADDI HERE:JMP HERE ORG 100H ADDI: PUSH PSW MOV R0, #20H;加數(shù)1地址、和的地址 MOV R1, #30H;加數(shù)2地址 CLR C MOV R2, #3;循環(huán)3次 LOOP: MOV A, @R0;取 ADDC A, @R1;加 MOV @R0, A;存 INC R0 INC R1 DJNZ R2, LOOP CLR A ADDC A, #0;得到進位 MOV 23H, A;保存 POP PSW RET END
2)編寫三字節(jié)二進制減法子程序 入口:被減數(shù): 52H,51H,50H, 50H為最低位
減數(shù): 42H,41H,40H, 40H為最低位
出口:差:外部數(shù)據(jù)存貯器2003H~2000H(2000H為最低位)用主程序調(diào)用多組數(shù)據(jù)來調(diào)試,需考慮無借位和有借位兩種情況。例如:
執(zhí)行前:地址: 52 51 50 42 41 40
數(shù)據(jù): 90 80 70 10 10 10
執(zhí)行后:地址: 2003 2002 2001 2000
數(shù)據(jù): 00 80 70 60 代碼:
ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 52H,#90H MOV 51H,#80H MOV 50H,#70H MOV 42H,#10H MOV 41H,#10H MOV 40H,#10H ACALL SUB1 HERE:JMP HERE SUB1: PUSH PSW MOV R0, #50H;被減數(shù)地址 MOV R1, #40H;減數(shù)地址 MOV DPTR, #2000H;差的地址 CLR C MOV R2, #3;循環(huán)3次 LOOP: MOV A, @R0;取 SUBB A, @R1;減 MOVX @DPTR, A;存 INC R0 INC R1 INC DPTR DJNZ R2, LOOP CLR A SUBB A, #0;得到借位 MOVX @DPTR, A;存 POP PSW RET END
3)編寫10位十進制加法子程序(十進制數(shù)采用壓縮BCD碼存放)入口: 加數(shù):24H—20H,低地址放低字節(jié)
被加數(shù):29H—25H,低地址放低字節(jié)
出口 和:4005H—4000H,低地址放低字節(jié)
要求調(diào)用多組數(shù)據(jù)調(diào)試,注意觀察PSW的變化,理解DA A指令的含義。例如:
執(zhí)行前地址:24 23 22 21 20 29 28 27 26 25
數(shù)據(jù):12 34 56 78 90 88 99 33 12 74
執(zhí)行后地址:4005 4004 4003 4002 4001 4000
數(shù)據(jù): 01 01 33 89 91 64
代碼:
ORG 0000H AJMP MAIN ORG 30H MAIN: MOV 24H,#12H MOV 23H,#34H MOV 22H,#56H MOV 21H,#78H MOV 20H,#90H MOV 29H,#88H MOV 28H,#99H MOV 27H,#33H MOV 26H,#12H MOV 5H,#74H ACALL ADD2 HERE:JMP HERE ADD2: PUSH PSW MOV R0, #20H;加數(shù)1地址 MOV R1, #25H;加數(shù)2地址 MOV DPTR,#4000H CLR C MOV R2, #5;循環(huán)5次 LOOP: MOV A, @R0;取 ADDC A, @R1;加
DA A;調(diào)整為BCD碼 MOVX @DPTR, A;存 INC R0 INC R1 INC DPTR DJNZ R2, LOOP POP PSW RET END
第五篇:單片機實驗
實驗一清0、移數(shù)
將片內(nèi)20H~2FH及片外0010H~001FH單元清0;
然后將片內(nèi)30H~3FH的數(shù)據(jù)移到片外0000H~000FH中;判斷:
若(30H)≤10,則求其平方存到31H中,并將位00H置1(其它位清0)若(30H)=10,則將AA存到31H中,并位01H置1(其它位清0)若(30H)≥10,則減10存到31H中,并位02H置1(其它位清0)
實驗二加法、排序
有兩個長度為10的無符號數(shù)分別放在片內(nèi)20H和30H為首的存儲單元中(低位),求其對應(yīng)項之和(帶進位位),結(jié)果放在40H為首的單元中(若最高位有進位則存在后續(xù)單元中),然后按升序排列放在50H為首的單元中
實驗三查表、散轉(zhuǎn)
設(shè)有一表格,表中數(shù)為:00H、11H、22H、33H、44H、55H、66H、77H、88H、99H、AAH、BBH、CCH、DDH、EEH、FFH。根據(jù)片外0001H單元的低4位的數(shù),取出表中相應(yīng)的值存到片內(nèi)30H中;根據(jù)片外0001H單元的高4位的數(shù),將片內(nèi)RAM區(qū)中可位尋址的相應(yīng)的位置1(從位00H~位0FH,只可有一個位地址為1)
實驗四外中斷
P1.0~P1.7接8個發(fā)光二極管,管腳INT0、INT1接兩個按鍵,分別定義為“L”和“R”。
要求:上電全滅,按 “L”(或R)鍵,最右(左)側(cè)燈亮,每按一次“L” ”(或R)鍵,則亮的燈向左(右)移一位,當(dāng)移到最左(右)端時,燈全滅
實驗五定時器
P1.0、P1.1分別接兩個發(fā)光二極管,INT0腳接
一按鍵做開關(guān),按一次開關(guān),則啟動,兩個發(fā)
光管一亮一滅,亮滅時間均為1秒;再按一次
開關(guān),則關(guān)閉,即兩個發(fā)光管都滅。
實驗六定時器、計數(shù)器
P3.2口輸出周期為2S的方波,T1口為脈沖輸入端,記錄輸入的脈沖個數(shù),脈沖個數(shù)由P1口所接的8個數(shù)碼管顯示(二進制),設(shè)一按鍵作為開關(guān)控制系統(tǒng)運行,關(guān)閉時數(shù)碼管全滅,P3.2無輸出。