第一篇:2013單片機實驗教案
單片機技術實驗
教
案
馮
杰 實驗一(1)順序結構程序設計
一、實驗目的
掌握匯編語言設計和調試方法。
二、實驗內容
把外部RAM中2000h單元的內容拆開,高位送2001h單元,低位送2002h單元,2001h、2002h高位清零,一般本程序用于把數據送顯示緩沖區時用。
三、程序流程
四、實驗步驟
1、LED環境
⑴在“P.”狀態下按“0→EV/UN”,裝載實驗所需的代碼程序。
⑵在“P.”狀態下鍵入0000,然后按“STEP”或“EXEC”進入實驗項目的調試與運行。
2、PC環境
在與PC聯機狀態下,編譯、連接、下載PH51se02.asm,用連續或單步方式運行程序。
3、運行結果檢查
⑴在單步運行時每走一步可觀察其運行結果。
⑵在連續運行狀態下,應按“暫停圖標”或實驗箱上的“暫停按鈕”,使系統無條件退出用戶運行狀態返回監控,然后再用相應的命令鍵觀察與檢查2000~2002h中內容變化情況。
五、思考
如何用斷點方式調試本程序。
ORG 0000H LJMP START
ORG 0030H START: MOV DPTR,#2000H
MOVX A,@DPTR ANL A,#0F0H SWAP A MOV DPTR,#2001H MOVX @DPTR,A
MOV DPTR ,#2000H MOVX A,@DPTR ANL A,0FH MOV DPTR,#2002H MOVX @DPTR,A SJMP $ END 實驗一(2)循環結構程序設計
一、實驗目的
熟悉MCS-51指令系統,掌握程序設計方法。
二、實驗內容
編寫并調試一個排序子程序,其功能為用冒泡法將內容RAM中幾個單元字節無符號的正整數,按從小到大的次序重新排列。
三、程序框圖
四、實驗步驟
1、LED環境
⑴在“P.”狀態下按“0→EV/UN”,裝載實驗所需的代碼程序。
⑵對片內RAM地址50h~5AH進行不規則置數。
⑶在“P.”狀態下鍵入0000,然后按“STEP”或“EXEC”進入實驗項目的調試與運行。
2、PC環境
在與PC聯機狀態下,編譯、連接、下載PH51se05.asm,用連續或單步方式運行程序。
3、運行結果檢查
⑴在單步運行時每走一步可觀察其運行結果。
⑵在連續運行狀態下,應按“暫停圖標”或實驗箱上的“暫停按鈕”,使系統無條件退出用戶運行狀態返回監控,然后再用相應的命令鍵觀察與檢查片內50~5Ah中內容是否按從 小到大排列。
五、思考:修改程序把50~5Ah中內容按從小到大排列。
ORG 0000H LJMP START ORG 0030H MOV R7,#09H MOV R6,#00H;清除標志 CLR C MOV A,@R0 INC R0 SUBB A,@R0 JC LOOP1 MOV R6,#01H DEC R0 MOV A,@R0 INC R0 XCH A,@R0 MOV @R0,A DJNZ R7,START1 CJNE R6,#00H,START SJMP $ END START:
MOV R0,#50H START1:
DEC R0
INC R0 LOOP1:
實驗一(3)選擇結構程序設計
一、實驗目的
掌握匯編語言的編程。
二、實驗內容
編寫程序,根據送入的數據轉移運行。
三、程序框圖
四、實驗步驟
1、LED環境
⑴在“P.”狀態下按“0→EV/UN”,裝載實驗所需的代碼程序。⑵在20H中分次送入00、01、02、03。
⑶在“P.”狀態下鍵入0A10,然后按“STEP”或“EXEC”進入實驗項目的調試與運行。
2、PC環境
在與PC聯機狀態下,編譯、連接、下載PH51se08.asm,用連續或單步方式運行程序。
3、運行結果檢查
(1)在單步運行時每走一步可觀察其運行結果。
(2)在連續運行狀態下,應按“暫停圖標”或實驗箱上的“暫停按鈕”,使系統無條件退出用戶運行狀態返回監控,然后觀察每次運行程序后,數碼管上數字循環情況。
ORG 0000H
LJMP START
ORG 0030H START: MOV 20H,#00H MOV A,20H MOV B,#03H
MUL AB
MOV DPTR,#TAB
JMP @A+DPTR
SJMP $ ORG 3000H TAB:
LJMP LOOPA
LJMP LOOPB
LJMP LOOPC
LOOPA: MOV A,#01H LOOPA1: MOV P1,A
LCALL DELAY1S
RL A
LJMP LOOPA1
LOOPB: MOV A,#03H LOOPB1: MOV P1,A
LCALL DELAY1S
RL A
LJMP LOOPB1
LOOPC: MOV A,#05H LOOPC1: MOV P1,A
LCALL DELAY1S
RL A
LJMP LOOPC1
DELAY1S: DELAY1S3: DELAY1S2: DELAY1S1:
MOV R7,#10 MOV R6,#200 MOV R5,#250 DJNZ R5,DELAY1S1 DJNZ R6,DELAY1S2 DJNZ R7,DELAY1S3 RET END
實驗二 中斷實驗
一、實驗目的
熟悉單片機中斷概念及中斷編程方法。
二、實驗內容
編寫程序,從P3.3輸入脈沖,記錄輸入脈沖個數,并用P1口外部鏈接的發光二極管顯示技術結果。
二、參考程序
ORG 0000H
LJMP START
ORG 0013H
LJMP INT1_COUNT
ORG 0030H START:
MOV SP,#60H
MOV A,#00H
SETB IT1;下降邊沿觸發方式
SETB EX1;開啟INT1中斷
SETB EA
SJMP $ INT1_COUNT:
INC A
MOV P1,A
RETI
END
實驗三 LED顯示實驗
一、實驗要求
利用實驗系統提供的顯示設備,動態顯示一行數據。
二、實驗目的
⑴了解數碼管動態顯示的原理; ⑵了解用總線方式控制數碼管顯示。
三、實驗說明
本實驗系統提供了8位七段碼LED顯示電路,學生只要按地址輸出相應數據,就可以實現對顯示器的控制。
四、程序框圖
ORG 0000H LJMP START ORG 0030H START: MOV SP,#60H MOV 50H,#8CH;顯示字符P.MOV 51H,#40H MOV 52H,#79H MOV 53H,#24H MOV 54H,#30H MOV 55H,#19H MOV 56H,#12H MOV 57H,#02H
LOOP1: LCALL DISPLAY
LJMP LOOP1
DISPLAY: MOV P2,#0FH MOV P0,50H LCALL DELAY20MS
MOV P2,#1FH MOV P0,51H LCALL DELAY20MS
MOV P2,#2FH MOV P0,52H LCALL DELAY20MS MOV P2,#3FH MOV P0,53H LCALL DELAY20MS
MOV P2,#4FH MOV P0,54H LCALL DELAY20MS
MOV P2,#5FH MOV P0,55H LCALL DELAY20MS
MOV P2,#6FH MOV P0,56H LCALL DELAY20MS
MOV P2,#7FH MOV P0,57H LCALL DELAY20MS
LJMP DISPLAY
DELAY20MS: MOV R7,#20 DELAY1: MOV R6,#100 DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET
TAB: DB 40H,79H,24H,30H,19H,12H,02H;0 1 2 3 4 5 6 DB 78H,00H,10H,08H,03H,46H,21H,06H,0EH;7 8 9 A B C D E F的字符碼
TAB1: DB 8CH;P.TAB2: DB 7FH;END 的字符碼的字符碼
空,不顯示的字符
鍵盤電路實驗
電路圖:
程序:
;用int1中斷實現按鍵功能,鍵值存放在4fh單元中;通過P1口輸出按鍵值,用發光二極管顯示按鍵值;通過P2.4--P2.6和三八譯碼器輸出八列按鍵掃描碼;通過P2.0---P2.3讀入按鍵的行值;行列值組合,就是按鍵的鍵值 ORG 0000H LJMP START ORG 0013H LJMP key_value ORG 0030H START: MOV 4fH,#00h;存放按鍵鍵值單元 MOV P1,#00H MOV P2,#0FFH setb ex1 setb it1 setb ea KEY_SCAN: MOV P2,#0FH LCALL DELAY5MS
MOV P2,#1FH LCALL DELAY5MS
MOV P2,#2FH LCALL DELAY5MS
MOV P2,#3FH LCALL DELAY5MS
MOV P2,#4FH LCALL DELAY5MS
MOV P2,#5FH LCALL DELAY5MS
MOV P2,#6FH LCALL DELAY5MS
MOV P2,#7FH LCALL DELAY5MS
LJMP KEY_SCAN
DELAY5MS: MOV R7,#40 DELAY1: MOV R6,#100 DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET
KEY_VALUE: PUSH ACC PUSH PSW MOV A,P2 MOV 4FH,A MOV P1,A POP PSW POP ACC RETI END
LED和鍵盤綜合實驗
電路圖:
參考程序:
ORG 0000H LJMP START ORG 0013H LJMP KEY_VALUE ORG 0030H START: MOV SP,#60H
MOV 4fH,#00h;存放按鍵鍵值單元 MOV P2,#0FFH setb ex1 setb it1 setb ea
MOV 50H,#0CH;顯示字符P.MOV 51H,#0CH MOV 52H,#7FH MOV 53H,#7FH MOV 54H,#7FH MOV 55H,#7FH MOV 56H,#7FH MOV 57H,#0CH
LOOP1: LCALL DISPLAY
LJMP LOOP1
DISPLAY: MOV P2,#0FH MOV P0,50H LCALL DELAY20MS
MOV P2,#1FH MOV P0,51H LCALL DELAY20MS
MOV P2,#2FH MOV P0,52H LCALL DELAY20MS
MOV P2,#3FH MOV P0,53H LCALL DELAY20MS
MOV P2,#4FH MOV P0,54H LCALL DELAY20MS
MOV P2,#5FH MOV P0,55H LCALL DELAY20MS
MOV P2,#6FH MOV P0,56H LCALL DELAY20MS
MOV P2,#7FH MOV P0,57H LCALL DELAY20MS
LJMP DISPLAY
DELAY20MS: MOV R7,#20 DELAY1: MOV R6,#100 DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET
KEY_VALUE: PUSH ACC PUSH PSW MOV 4FH,P2 LCALL KEY_VALUE_DISP POP PSW POP ACC RETI
KEY_VALUE_DISP: MOV A,4FH ANL A,#0F0H SWAP A MOV DPTR,#TAB MOVC A,@A+DPTR MOV 56H,A MOV A,4FH ANL A,#0FH MOVC A,@A+DPTR MOV 57H,A RET
TAB: DB 40H,79H,24H,30H,19H,12H,02H;0 1 2 3 4 5 6的字符碼 DB 78H,00H,10H,08H,03H,46H,21H,06H,0EH;7 8 9 A B C D E F的字符碼
TAB1: DB 8CH;P.的字符碼
TAB2: DB 7FH;空,不顯示的字符 END
實驗四 A/D轉換實驗
一、實驗目的
(1)掌握A/D轉換與單片機接口的方法;(2)了解A/D芯片0809轉換性能及編程方法;(3)通過實驗了解單片機如何進行數據采集。
二、實驗內容
利用實驗系統上的0809做A/D轉換器,實驗系統上的電位器提供模擬量輸入,編制程序,將模擬量轉換成數字,通過數碼管顯示出來。
三、程序框圖
四、實驗電路
五、實驗步驟
把0809的零通道INT0用插針接至AINl孔,0809CS位FFE0孔,運行程序,數碼管顯示0809.XX,后二位顯示當前采集的電壓轉換的數字量,調節W1,該二位將隨著電壓變化而相應變化。
六、思考
修改程序,用其它通道輪流采樣顯示。
實驗五 電腦時鐘(定時器、中斷綜合實驗)
一、實驗目的
熟悉MCS-51定時器,串行口和中斷初始化編程方法,了解定時器的應用實時程序的設計與調試技巧。
二、實驗內容
編寫程序,從本實驗系統鍵盤上輸入時間初值,用定時器產生0.1S定時中斷,對時鐘計數器計數,并將數值實時地送數碼管顯示。
三、程序框圖
四、實驗步驟
連續運行程序,在鍵盤上輸入時間初值,按執行鍵EXEC執行,數碼管上實時顯示時間值。
五、思考
(1)電子鐘走時精度和程序中那些常數有關?
(2)修改程序使定時器工作方式改變,調節有關參數,進一步提高精度。
六、參考程序
ORG 0000H LJMP START ORG 000BH LJMP T0_INT ORG 0030H START: MOV 50H,#00H;時的低位字符碼 MOV 51H,#00H;時的高位字符碼 MOV 52H,#00H;“-”的字符碼 MOV 53H,#00H;分的低位字符碼 MOV 54H,#00H;分的高位字符碼 MOV 55H,#00H;“-”的字符碼 MOV 56H,#00H;秒的低位字符碼 MOV 57H,#00H;秒的高位字符碼 MOV 5FH,#00H;存放小時的單元 MOV 5EH,#00H;存放分鐘的單元 MOV 5DH,#00H;存放秒的單元 MOV 5CH,#00H;存放T0中斷次數,50次為1秒
MOV SP,#60H;設置堆棧棧頂 MOV TH0,#???;設置T0定時器初值 MOV TL0,#??? MOV TMOD,#00000001H;T0工作在定時方式,工作方式0
SETB ET0;開放T0中斷 SETB EA;開放總中斷 SETB TR0;啟動定時器T0 LOOP: mov P2,#11111110H MOV R0,#50H loop1: MOV R7,#08H LOOP2: MOV A,@R0 MOV P1,A LCALL DELAY INC R0 MOV A,P2 RL A
MOV P2,A DJNZ R7, LOOP2 LJMP LOOP SJMP $
DELAY: MOV R6,#2;延時程序 DELAY1: MOV R5,#10 DELAY2: MOV R4,#100 DELAY3: DJNZ R4,DELAY3 DJNZ R5,DELAY2 DJNZ R6,DELAY1 RET 16 T0_INT: CLR TR0 PUSH ACC MOV A,5CH CJNE A,#50H,T0_INT1 MOV 5CH,#00H MOV A,5DH CJNE A,#59H,T0_INT2 MOV 5DH,#00H MOV A,5EH CJNE A,#59H,T0_INT3 MOV 5EH,#00H MOV A,5FH CJNE A,#23H,T0_INT4 MOV 5FH,#00H LJMP T0_END T0_INT1: INC 5CH LJMP T0_END T0_INT2: INC 5DH LJMP T0_END T0_INT3: INC 5EH LJMP T0_END T0_INT4: INC 5FH T0_END: MOV A,5FH
MOV B,#10 DIV AB MOV 51H,A MOV A,B MOV 50H,A MOV A,5EH MOV B,#10 DIV AB MOV 54H,A MOV A,B MOV 53H,A MOV A,5DH MOV B,#10 DIV AB MOV 57H,A MOV A,B MOV 56H,A POP ACC
MOV TH0,#??? MOV TL0,#??? SETB TR0 RETI
實驗六 LCD液晶顯示屏實驗
一、實驗目的
⑴掌握單片機擴展液晶顯示接口的設計與編程。⑵利用字符式液晶顯示器顯示字符。
二、實驗內容
編制程序,在液晶顯示器上顯示:
學生所在的院系的漢語拼音字母和學生的名字。分兩行顯示。
三、實驗電路
四、參考程序
DAT1 DAT2 EQU EQU 30H;第一參數單元 31H;第二參數單元 32H;指令代碼單元 0100H;指令通道地址 0000H;數據通道地址 COM EQU C_ADD EQU D_ADD EQU
org 0000h ljmp main org 0030h;主程序
MAIN: MOV SP,#60H;
lcall delay;上電延時
LCALL INT;初始化
LCALL CLEAR;清緩沖區 TEST: LCALL hgnu_disp;顯示“WELCOM TO HGNU” LCALL PL_XW_ZKB;顯示 “P_L :”
“X_W :”
“ZKB:” sjmp test
;上電延時子程序 delay: MOV R6,#50H;MOV R7,#00H;DELY1: NOP DJNZ R7,DELY1;上電延時
DJNZ R6,DELY1;ret;讀狀態字子程序
R_ST: MOV DPTR,#C_ADD;設置指令通道 MOVX A,@DPTR;RET;判斷狀態位STA1,STA0子程序(讀寫指令和數據),在指令的讀,寫
;數據之前這兩個標志必須同時為“1” ST01: LCALL R_ST;JNB ACC.0,ST01;JNB ACC.1,ST01;RET;判斷狀位STA2子程序(數據自動讀狀態),該位
;在數據自動操作過程中取代STA0和STA1有效。在連續讀過程中每讀一次;之前都要確認STA2=1 ST2: LCALL R_ST;JNB ACC.2,ST2;RET;判斷STA3子程序(數據自動寫狀態)ST3: LCALL R_ST;JNB ACC.3,ST3;RET;判斷狀態位STA6子程序(屏讀/屏拷貝狀態)ST6: LCALL R_ST;JB ACC.6,ERR;RET ERR: LJMP ST6;;出錯處理
;寫指令和寫數據子程序..;雙字節參數指令寫入入口
PR1: LCALL ST01;判斷狀態位STA1,STA0 MOV A,DAT1;取第一參數單元數據
LCALL PR13;寫入參數;單字節參數指令寫入入口
PR11: LCALL ST01;判斷狀態位STA1,STA0 MOV A,DAT2;取第二參數單元數據 LCALL PR13;寫入參數
;無參數指令寫入入口
PR12: LCALL ST01;無參數指令寫入入口
MOV A,COM;取指令代碼單元數據
MOV DPTR,#c_ADD;設置指令通道地址/數據寫入入口
LJMP PR14;寫入指令代碼
PR13: MOV DPTR,#D_ADD;設置數據通道地址/數據寫入入口 PR14: MOVX @DPTR,A;寫入操作 RET;讀數據子程序 PR2: LCALL ST01;判斷狀態位
MOV DPTR,#D_ADD;設置數據通道地址
MOVX A,@DPTR;讀數據操作 MOV DAT2,A;數據存入第二參數/數據單元
RET;初始化子程序
INT:
;顯示區域設置
MOV DAT1,#00H;設置文本顯示區首地址
MOV DAT2,#00h;MOV COM,#40H;LCALL PR1;雙字節參數指令寫入入口
MOV DAT1,#16;設置文本顯示區域寬度
MOV DAT2,#00H;即一行顯示所占字節數
MOV COM,#41H;LCALL PR1;雙字節參數指令寫入入口
MOV DAT1,#00H;設置顯示區域首地址
MOV DAT2,#00H;或文本屬性區域首地址
MOV COM,#42H;LCALL PR1;雙字節參數指令寫入入口
MOV DAT1,#10H;設置圖形顯示區域寬度
MOV DAT2,#00H;或為文本屬性區域狂寬度
MOV COM,#43H;即一行顯示所占字節數
LCALL PR1;雙字節參數指令寫入入口
;顯示光標設置
MOV COM,#0A1H;光標形狀設置
LCALL PR12;
;設置光標初始位置,是字符行和字符列,第0行第15列
MOV DAT1,#0;光標行位置
MOV DAT2,#0;光標列位置
MOV COM,#21H;LCALL PR1;雙字節參數指令寫入入口
;顯示方式設置,使用內部字符發生器
MOV COM,#80H;顯示方式設置,邏輯“或”合成 LCALL PR12;無參數指令寫入入口+
MOV COM,#97H;僅用文本顯示
LCALL PR12;無參數指令寫入入口
;顯示開關方式
RET
;寫數據子程序,8*8點陣
;R6中裝入顯示位置的列數(字符的個數),每行16個字符,R7中裝入顯示位置距左上角的字符行數
;5FH單元中裝入待顯示的字符碼 DISP: mov b,r7
mov a,#16 mul ab mov r7,a CLR C mov a,R6
ADD A,R7 MOV R6,A;R7*16+R6
MOV DAT1,R6;設置顯示RAM首地址,水平方向字符數
MOV DAT2,#00H;固定送00H MOV COM,#24H;地址指針指令
LCALL PR1;MOV
dat2,5fH;取要顯示的字符
MOV COM,#0c4H;數據寫,地址不變 LCALL PR11;寫入數據
RET;清顯示緩沖區(16*8單元)clear: MOV 5FH,#00H
MOV R5,#0 CLEAR0: MOV R4,#0 CLEAR1: MOV A,R5
MOV R7,A MOV A,R4 MOV R6,A CLEAR2: LCALL DISP
INC R4 CJNE R4,#16,CLEAR1
mov r4,#00h
INC R5
CJNE R5,#8,CLEAR0 CLEAR9: RET;顯示頻率、相位、占空比、相位差等字符。(P_L :;PL_XW_ZKB:MOV R7,#3 MOV R6,#0 MOV
5fh,#30H;“P” LCALL DISP MOV R7,#3 MOV R6,#1 MOV
5fh,#3FH;“_” LCALL DISP MOV R7,#3 MOV R6,#2 MOV
5fh,#2CH;“L”
X_W :
ZKB:)
LCALL DISP MOV R7,#3 MOV R6,#3 MOV
5fh,#1AH;“: ” LCALL DISP MOV R6,#0 MOV
5fh,#38H;“X” LCALL DISP MOV R7,#5 MOV R6,#1 MOV
5fh,#3FH;“_” LCALL DISP MOV R7,#5 MOV R6,#2 MOV
5fh,#37H;“W” LCALL DISP MOV R7,#5 MOV R6,#3 MOV
5fh,#1AH;“: ” LCALL DISP
MOV R7,#5
MOV R7,#7 MOV R6,#0 MOV
5fh,#3AH;“Z” LCALL DISP
MOV R7,#7 MOV R6,#1 MOV
5fh,#2BH;“K” LCALL DISP MOV R7,#7 MOV R6,#2 MOV
5fh,#22H;“B ” LCALL DISP MOV R7,#7 MOV R6,#3 MOV
5fh,#1AH;“: ” LCALL DISP RET;頂行顯示“黃岡師院物科院“的英文名稱。;”welcome to hgnu!“ hgnu_DISP:
MOV R7,#0;顯示位置的行列數
MOV R6,#0 MOV
5fh,#37H;”W“ LCALL DISP MOV R7,#0 MOV R6,#1 MOV
5fh,#25H;”E“ LCALL DISP MOV R7,#0 MOV R6,#2 MOV
5fh,#2CH;”L“ LCALL DISP MOV R7,#0 MOV R6,#3 MOV
5fh,#23H;”C“ LCALL DISP MOV R7,#0 MOV R6,#4 MOV
5fh,#2FH;”0“ LCALL DISP MOV R7,#0 MOV R6,#5 MOV
5fh,#2DH;”M“ LCALL DISP MOV R7,#0 MOV R6,#6 MOV
5fh,#25H;”E“ LCALL DISP MOV R7,#0 MOV R6,#7 MOV
5fh,#00H;” “ LCALL DISP MOV R7,#0 MOV R6,#8 MOV
5fh,#34H;”T“ LCALL DISP MOV R7,#0 MOV R6,#9 MOV
5fh,#2FH;”O“ LCALL DISP MOV R7,#0 MOV R6,#10 MOV
5fh,#00H;” “ LCALL DISP MOV R7,#0 MOV R6,#11 MOV
5fh,#28H;”H“ LCALL DISP
MOV R7,#0 MOV R6,#12 MOV
5fh,#27H;”G“ LCALL DISP MOV R7,#0 MOV R6,#13 MOV
5fh,#2EH;”N“ LCALL DISP MOV R7,#0 MOV R6,#14 MOV
5fh,#35H;”U“ LCALL DISP RET tab: db 10h,11h,12h,13h,14h,15h,16h,17h,18h,19h;”0-----9“
db 21h,22h,23h,24h,25h,26h;”A-----F" end
實驗七 直流電機轉速測量與控制實驗
一、實驗目的
1.掌握直流電機的驅動原理。2.了解直流電機調速的方法。
二、實驗內容
1.用0832 D/A轉換電路后的輸出經放大后驅動直流電機。
2.編制程序改變0832輸出經放大后的方波信號的占空比來控制電機轉速。本實驗中 D/A輸出為雙極性輸出,因此電機可以正反向旋轉。
三、程序流程
三、實驗電路
五、參考程序
DATA_TH0 EQU 00H DATA_TL0 EQU 00H;信號周期為130ms DATA_TH1 EQU 20H DATA_TL1 EQU 00H;高電平時間65ms ORG 0000H LJMP MAIN ORG 0003H LJMP INT_0;啟動電機按鍵
ORG 000BH LJMP T_0;T0確定輸出信號的周期(或者頻率)ORG 0013H LJMP INT_1;電機轉動方向控制按鍵 ORG 001BH LJMP T_1;T1確定輸出信號高電平的時間期
ORG 0030H MAIN: MOV SP,#60H
CLR P1.0 CLR P1.1;關閉電機
setb 20h.0;初始化電機正轉
clr 20h.1;初始狀態時,電機停止轉動 MOV TMOD,#11H SETB IT0 SETB EX0 SETB IT1 SETB EX1 SETB ET0 SETB ET1 SETB EA
SJMP $
T_0: JNB 20H.1,T_01;
MOV TH1,#DATA_TH1
MOV TL1,#DATA_TL1 SETB TR1
MOV TH0,#DATA_TH0 MOV TL0,#DATA_TL0 SETB TR0 JNB 20H.0,T_02 setb P1.0 clr P1.1 LJMP T_05 T_02: clr P1.0 setb P1.1 LJMP T_05 T_01: CLR P1.0
CLR P1.1 CLR TR0 CLR TR1 RETI CLR TR1 T_05: T_1: clr p1.0 clr p1.1 RETI int_1: CPL 20H.1;電機啟動標志求反,開啟電機或者關閉電機
JNB 20H.1,INT_11;啟動標志不為1,則停止電機,關閉定時器
MOV TH1,#DATA_TH1;啟動標志為1,則開啟定時器1和定時器2,輸出PWM波
MOV TL1,#DATA_TL1 SETB TR1
MOV TH0,#DATA_TH0
MOV TL0,#DATA_TL0 SETB TR0 JNB 20H.0,INT_12;轉動方向標志不為1,則反轉,否則正轉 setb P1.0 clr P1.1 LJMP INT_19 setb P1.1 LJMP INT_19 INT_12: clr P1.0 INT_11: CLR P1.0 CLR P1.1 CLR TR0 CLR TR1 INT_19: RETI 26
INT_0: CPL 20H.0 RETI END
實驗八 步進電機控制實驗
一、實驗目的
1.了解步進電機控制的基本原理。2.掌握步進電機轉動編程方法。
二、實驗內容
從鍵盤上輸入正、反轉命令,轉速參數和轉動步數顯示在顯示器上,CPU再讀取顯示器上顯示的正、反轉命令,轉速級數(16級)和轉動步數后執行。轉動步數減為零時停止轉動。
三、實驗電路圖
四、參考程序
ORG 0000H
ljmp main ORG 000BH LJMP COUNT0 ORG 001BH LJMP COUNT1 ORG 0100H MAIN: MOV P0,#0FFH;輸送脈沖口,SETB P1.2;MOV R0,#1;延時變化變量 LOOP1: MOV P0,#0FCH LCALL DELAY MOV P0,#0F6H LCALL DELAY MOV P0,#0F3H LCALL DELAY MOV P0,#0F9H LCALL DELAY JNB P1.2,LOOP2 MOV TMOD,#01010101B MOV TH0,#0FFH MOV TL0,#0FFH MOV TH1,#0FFH MOV TL1,#0FFH SETB TR0 SETB TR1 SETB ET0 SETB ET1 SETB EA MOV DPTR,#TABLE MOV A,R0 MOVC A,@A+DPTR MOV P2,A JMP LOOP1 LOOP2: MOV P0,#0FCH LCALL DELAY MOV P0,#0F9H LCALL DELAY MOV P0,#0F3H LCALL DELAY MOV P0,#0F6H LCALL DELAY JB P1.2,LOOP1 MOV TMOD,#01010101B MOV TH0,#0FFH MOV TL0,#0FFH MOV TH1,#0FFH MOV TL1,#0FFH 28 SETB TR0 SETB TR1 SETB ET0 SETB ET1 SETB EA MOV DPTR,#TABLE MOV A,R0 MOVC A,@A+DPTR MOV P2,A JMP LOOP2 SJMP $ COUNT0: MOV TH0,#0FFH;減速中斷 MOV TL0,#0FFH CJNE R0,#9,L4 JMP L5 L4: INC R0
L5: setb TR0 RETI COUNT1: MOV TH1,#0FFH;加速中斷 MOV TL1,#0FFH CJNE R0,#1,L6 JMP L7 L6: DEC R0 L7: setb TR1 RETI DELAY: MOV A,R0;延時 MOV R1,A L1: MOV R2,#50 L2: MOV R3,#250 L3: DJNZ R3,L3 DJNZ R2,L2 DJNZ R1,L1 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;顯示程序查表,共陰 END
第二篇:單片機實驗教案
實驗一
數據傳送
一、實驗目的
1、熟悉單片機指令系統,掌握單片機循環程序設計方法
2、掌握單片機數據排序方法.二.實驗內容:
預先向單片機內部RAM 50H 開始填入一批數據,以00H結尾.編這批數據按從小到大的順序進行排序.三、實驗步驟:
a.先向單片機內部RAM50H開始填入一批數據,以00H結尾
b.編程求出這批數據的長度,存入R7中,編程將這批數據按從小到大順序
四、參考程序:
ORG 0030H
MOV R0,#50H
MOV R7,#00H
CLR 00H
LOOP2:CJNE @R0,#00H ,TB
LJMP MAIN
TB: INC R7
INC R0
LJMP LOOP2
MAIN:MOV R0,#50H
DJNZ R7,LOOP3
LJMP A0
LOOP3: MOV B, R7
MOV A,@R0 LOOP:INC R0
MOV R2,A
SUBB A,@R0
MOV A,R2
JC NEXT
SETB 00H
XCH A,@R0
DEC R0
XCH A,@R0
INC R0 NEXT:MOV A,@R0
DJNZ B,LOOP
JB 00H,MAIN
A0 :SJMP $
END 實驗二 循環結構程序設計
一、實驗目的
1、熟悉單片機指令系統,掌握單片機循環程序設計方法
2、掌握單片機數據排序方法.二.實驗內容:
預先向單片機內部RAM 50H 開始填入一批數據,以00H結尾.編這批數據按從小到大的順序進行排序.三、實驗步驟:
a.先向單片機內部RAM50H開始填入一批數據,以00H結尾
b.編程求出這批數據的長度,存入R7中,編程將這批數據按從小到大順序
四、參考程序: ORG 1000H MOV R0,#50H MOV R7,#00H LOOP: MOV A,@R0
INC R0 CJNE A, #00H,LOOP1 SJMP LOOP2 LOOP1:INC R7 SJMP LOOP LOOP2:MOV R0, #50H CLR 00H;(00H)=00H為標志位
MOV A,R7 MOV R6,A LOOP3:MOV A,@R0 INC R0 MOV 30H,@R0 CJNE A,30H,LOOP4 LOOP4:JC LOOP5
XCH A,@R0 DEC R0 XCH A,@R0 INC R0 SETB 00H INC R0 LOOP5:DJNZ R6,LOOP3 JB 00H,LOOP2 SJMP $ END
實驗三 信號燈控制
一、實驗目的
(1)學習P1口的使用方法;
(2)學習延時子程序的編寫。
(3)掌握proteus仿真軟件的基本使用。
二、實驗內容
做單一燈的左移右移,硬件電路如圖4.4.1所示,八個發光二極管L1-L8分別接在單片機的P1.0-P1.7接口上,輸出“0”時,發光二極管亮,開始時P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重復循環。
三、程序流程圖:
四、參考程序 ORG 0 START: MOV R2,#8 MOV A,#0FEH SETB C LOOP: MOV P1,A LCALL DELAY RLC A DJNZ R2,LOOP MOV R2,#8 LOOP1: MOV P1,A LCALL DELAY RRC A DJNZ R2,LOOP1 LJMP START DELAY: MOV R5,#20;D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END
實驗四 脈沖計數實驗
一、實驗目的:
1)掌握定時計數器的使用。2)學習延遲程序的編寫和使用。
3)熟悉proteus仿真軟件的使用方法。
二、實驗內容:
1)開始時,顯示“00”,第一次按下SP1后就開始計時。2)第二次按下SP1后,計時停止。3)
第三次按下SP1時,計時歸零。
三、主程序流程圖
四、中斷服務程序流程圖如下:
五、參考程序如下: TCNTA EQU 30H TCNTB EQU 31H SEC EQU 32H KEYCNT EQU 33H SP1 BIT P3.5 ORG 00H LJMP START ORG 0BH LJMP INT_T0 START: MOV KEYCNT,#00H MOV SEC,#00H MOV A,SEC MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P2,A MOV TMOD,#02H SETB ET0 SETB EA WT: JB SP1,WT LCALL DELY10MS JB SP1,WT INC KEYCNT MOV A,KEYCNT CJNE A,#01H,KN1 SETB TR0 MOV TH0,#06H MOV TL0,#06H MOV TCNTA,#00H MOV TCNTB,#00H LJMP DKN KN1: CJNE A,#02H,KN2 CLR TR0 LJMP DKN KN2: CJNE A,#03H,DKN MOV SEC,#00H MOV A,SEC MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P2,A MOV KEYCNT,#00H DKN: JNB SP1,$ LJMP WT DELY10MS: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET INT_T0: INC TCNTA MOV A,TCNTA CJNE A,#100,NEXT MOV TCNTA,#00H INC TCNTB MOV A,TCNTB CJNE A,#4,NEXT MOV TCNTB,#00H INC SEC MOV A,SEC CJNE A,#100,DONE MOV SEC,#00H DONE: MOV A,SEC MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P2,A NEXT: RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END
實驗五 8255控制交通燈
一、實驗目的
進一步了解8255芯片的結構及編程方法,學習模擬交通控制的實現方法。
二、實驗內容
用8255做輸出口,控制十二個發光二極管燃滅,模擬交通燈管理。
四、參考程序如下: ;交通燈
ORG 0030H
JOD0:MOV SP,#60H
MOV DPTR,#0FFDBH
MOV A,#88H
;8255初始化
MOVX @DPTR,A
MOV DPTR,#0FFD8H
MOV A,#0B6H
MOVX @DPTR,A
INC DPTR
MOV A,#0DH
MOVX @DPTR,A;點亮4個紅燈
MOV R2,#25H;延時
LCALL DELY
JOD3:MOV DPTR,#0FFD8H
MOV A,#75H
MOVX @DPTR,A
INC DPTR
MOV A,#0DH
MOVX @DPTR,A
;東西綠燈亮,南北紅燈亮
MOV R2,#55H
LCALL DELY
;延時
MOV R7,#05H
;閃爍次數
JOD1:MOV DPTR,#0FFD8H
MOV A,#0F3H
MOVX @DPTR,A
INC DPTR
MOV A,#0CH
MOVX @DPTR,A
;東西黃燈亮,南北紅燈亮
MOV R2,#20H
LCALL DELY
;延時
MOV DPTR,#0FFD8H
MOV A,#0F7H
MOVX @DPTR,A
INC DPTR
MOV A,#0DH
MOVX @DPTR,A
;南北紅燈亮
MOV R2,#20H
LCALL DELY
;延時
DJNZ R7,JOD1
;閃爍次數未到繼續
MOV DPTR,#0FFD8H
MOV A,#0AEH
MOVX @DPTR,A
INC DPTR
MOV A,#0BH
MOVX @DPTR,A;東西紅燈亮,南北綠燈亮
MOV R2,#55H
LCALL DELY
;延時
MOV R7,#05H
;閃爍次數
JOD2:MOV DPTR,#0FFD8H
MOV A,#9EH
MOVX @DPTR,A
INC DPTR
MOV A,#07H
MOVX @DPTR,A
;東西紅燈亮,南北黃燈亮
MOV R2,#20H
LCALL DELY
;延時
MOV DPTR,#0FFD8H
MOV A,#0BEH
MOVX @DPTR,A
INC DPTR
MOV A,#0FH
MOVX @DPTR,A
;東西紅燈亮
MOV R2,#20H
LCALL DELY
;延時
DJNZ R7,JOD2
;閃爍次數未到繼續
LJMP JOD3
ORG 0213H
DELY:PUSH 02H
DEL2:PUSH 02H
DEL3:PUSH 02H
DEL4:DJNZ R2,DEL4
POP 02H
DJNZ R2,DEL3
POP 02H
DJNZ R2,DEL2
POP 02H
DJNZ R2,DELY
RET
END
實驗六 A/D轉換
一、實驗目的
1.掌握A/D轉換與單片機的接口方法 2.了解A/D芯片0809性能及編程方法 3.通過實驗了解單片機如何進行數據采集
二、實驗內容
1.利用proteus軟件仿真,實現A/D轉換實驗。
2.實驗要求通過電位器提供模擬量的輸入,編寫程序,將模擬量轉換成數字量,通過數碼管顯示出來。
三、參考程序如下: LED_0 EQU 30H
;存放三個數碼管的段碼 LED_1 EQU 31H LED_2 EQU 32H
ADC EQU 35H;存放轉換后的數據 ST BIT P3.2 OE BIT P3.0 EOC BIT P3.1 ORG 00H
START: MOV LED_0,#00H MOV LED_1,#00H MOV LED_2,#00H MOV DPTR,#TABLE;送段碼表首地址
SETB P3.4 SETB P3.5 CLR P3.6
;選擇ADC0808的通道3
WAIT: CLR ST SETB ST CLR ST
;啟動轉換
JNB EOC,$
;等待轉換結束
SETB OE
;允許輸出
MOV ADC,P1
;暫存轉換結果
CLR OE
;關閉輸出
;MOV A,ADC
;將AD轉換結果轉換成BCD碼
;MOV B,#100;DIV AB;MOV LED_2,A;MOV A,B;MOV B,#10;DIV AB;MOV LED_1,A;MOV LED_0,B lcall
intov LCALL DISP
;顯示AD轉換結果
SJMP WAIT
intov:;mov a,led_1;m;ov b,#10;mul ab
;add a,led_0;mov r1,a;mov a,led_2;mov b,#100;mul ab;add a,r1 mov dptr,#tab mov a,adc
movc a,@a+dptr mov b,#2 div ab mov r1,b mov b,#10 div ab mov led_2,a mov led_1,b cjne r1,#01,kk1
mov led_0,#05 back:
ret kk1:
mov led_0,#00
ajmp back
DISP: mov
dptr,#table
MOV A,LED_0
MOVC A,@A+DPTR
CLR P2.3 MOV P0,A LCALL DELAY SETB P2.3
mov
dptr,#table MOV A,LED_1 MOVC A,@A+DPTR CLR P2.2 MOV P0,A LCALL DELAY SETB P2.2
mov
dptr,#table MOV A,LED_2 MOVC A,@A+DPTR setb
acc.7 CLR P2.1
;數碼顯示子程序 MOV P0,A LCALL DELAY SETB P2.1 RET DELAY: MOV R6,#10
;延時5毫秒 D1: MOV R7,#250 DJNZ R7,$ DJNZ R6,D1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH
tab:db 0, 0 ,0 , 1, 0, 2, 0, db 4, 0, 0, 5, 0, 6, 0, 0, 7, 0 db 8, 0, 0, 9, 0, 0, 10, 0, 11, 0 db 0, 12, 0, 13, 0, 0, 14, 0, 15, 0 db 0, 16, 0, 17, 0, 0, 18, 0, 19, 0 db 0, 20, 0, 0, 21, 0, 22, 0, 0, 23 db 0, 24, 0, 0, 25, 0, 26, 0, 0, 27 db 0, 28, 0, 0, 29, 0, 0, 30, 0, 31 db 0, 0, 32, 0, 33, 0, 0, 34, 0, 35 db 0, 0, 36, 0, 37, 0, 0, 38, 0, 39 db 0, 0, 40, 0, 0, 41, 0, 42, 0, 0 db 43, 0, 44, 0, 0, 45, 0, 46, 0, 0 db 47, 0, 48, 0, 0, 49, 0, 50, 0, 0 db 51, 0, 0, 52, 0, 53, 0, 0, 54, 0 db 55, 0, 0, 56, 0, 57, 0, 0, 58, 0 db 59, 0, 0, 60, 0, 0, 61, 0, 62, 0 db 0, 63, 0, 64, 0, 0, 65, 0, 66, 0 db 0, 67, 0, 68, 0, 0, 69, 0, 70, 0 db 0, 71, 0, 0, 72, 0, 73, 0, 0, 74 db 0, 75, 0, 0, 76, 0, 77, 0, 0, 78 db 0, 79, 0, 0, 80, 0, 0, 81, 0, 82 db 0, 0, 83, 0, 84, 0, 0, 85, 0, 86 db 0, 0, 87, 0, 88, 0, 0, 89, 0, 90 db 0, 0, 91, 0, 0, 92, 0, 93, 0, 0 db 94, 0, 95, 0, 0, 96, 0, 97, 0, 0 db 98, 0, 99, 0, 0, 100, 0, 0, 0
END
0, 3, 0
第三篇:單片機實驗教案
實驗一 集成開發環境keil c51的使用與調試
Keil C51 u Vision2 是德國Keil公司開發的基于Windows環境的8051軟件開發平臺,它集項目管理、源程序編輯、程序調試于一體,是一個強大的集成開發環境。
u Vision2 支持Keil的各種8051工具,包括:C編譯器,宏匯編譯器、連接/定位器及Object-hex轉換程序,可以幫助用戶快速有效的實現嵌入式系統的設計與調試。
1.1 硬件安裝
1、連接51CPU板,在實驗箱右下角有三個插座:J1、J2、J3,用來連接51CPU板,在51CPU板上有一個小撥碼開關:J18,是單片機的EA腳,是用來選擇讀片內還是片外ROM的,撥向左邊為讀片內ROM;撥向右邊為讀片外ROM。
2、KEIL仿真器與實驗箱的連接:將KEIL仿真器40芯的排線連到51CPU板的40芯插座上,仿真器的USB連接線連到微機的USB口。
3、八段數碼管右上角的兩個撥碼小開關是用來設置工作模式的,將兩個撥碼小開關同時撥向右邊是選擇51單片機工作模式,此時應撥向右邊。
1.2 新建一個項目文件
首先點擊 Keil uVision2,進入uVision2界面。點擊工具欄Project選項中的New Project,準備開始建立自己的項目。
輸入工程文件名稱,并選擇保存工程文件的目錄。
為項目文件選擇一個目標器件(如ATMEL89C51),如圖所示。
用鼠標對項目工作區的目標1,點擊右鍵在彈出的菜單中選擇“為目標‘目標1’設置選項”如下圖所示。
在“為目標‘目標1’設置選項”中,點擊“調試”菜單,在此菜單中可選擇是使用硬件仿真,還是軟件仿真,連接實驗箱做實驗時選擇硬件仿真,點擊硬件仿真選項后面的[設置]選項,在此對對話框中選擇串口和波特率,串口根據所連電腦來決定。波特率為38400。
軟件仿真 硬件仿真 選擇串口 選擇波特率
點擊“文件/新建”創建源程序文件并輸入程序代碼。
在文本框中輸入原程序,如下圖所示
點擊“文件/保存“對程序進行保存
用鼠標對項目工作區的目標1,點擊右鍵在彈出的菜單中選擇添加文件到原代碼組,如下圖所示
在彈出的添加文件框中,選擇需要添加到項目中的文件
點擊編譯連接的圖標,對項目文件進行編譯
點擊“調試/啟動/停止調試”進入調試界面
在調試界面中可以對程序進行單步或者全速運行的調試
連機/停止 全速運行
單步
若要查看內存中的數據,點擊“視圖/存儲器窗口”
在此地址框中,輸入不同的指令查看內部數據
如果需要查看一些內部數據,在菜單欄點擊[視圖/存儲窗口]。
C:0X地址 顯示程序存儲區數據 X:0X地址 顯示數據存儲區中數據 D:0X地址 顯示CPU內部存儲區中數據
注意:仿真器使用者使用時應注意:
Keil C仿真器用戶程序在全速運行時,如果需暫停運行,請按實驗儀鍵盤“RST”,此時仿真器存儲器數據清零。如果您要再次運行您所編寫的程序,就必須重新裝載運行。
1.3 實驗指導使用說明
點擊“幫助/使用手冊”打開“HK系列實驗指導”
選擇“軟件實驗”右邊的下三角可選擇實驗類別或者芯片查詢
點擊實驗目的、實驗電路、實驗連線、實驗程序可查看關于實驗的具體介紹
在芯片查詢中,可查看常用芯片的管腳定義
實驗二 程序設計實驗
C51中進行絕對地址訪問:
(1)在頭文件中加入
#include
XWORD PBYTE DWORD 指向內存空間的絕對地址。(具體看課本Page 71~72)
(3)使用指針進行絕對地址訪問(具體看課本Page68~71,課后用指針對下面實驗程序進行修改)
例如:
#define ADDR
XBYTE[0x8000]
定義ADDR為 片外RAM地址0x8000的內容
Segment = CBYTE[0x0002]
將程序存儲器的0002H地址的內容賦值給Segment
Segment = XBYTE[0x0002]
將向片外RAM的0002H地址的內容賦值給Segment
XBYTE[0x0002]=57
將57賦值給片外RAM0002H絕對地址
實驗1:將片外8000H中的內容拆開,高位送8001H地址低位,低位送8002H的地址低位,8001H和8002H地址單元的高位清零。#include
#define a0 XBYTE[0x8000] #define a1 XBYTE[0x8001] #define a2 XBYTE[0x8002]
void main(){ a0 = 0xab;a1 = a0 & 0x0f;a2 = a0 >> 4;}
實驗2:使用絕對地址進行char型數組賦值,數組的首地址為片外8000H #include
for(i=0;i<10;i++){
XBYTE[0x8000+i]=i;} }
請對上述實驗進行修改:使用絕對地址進行int型數組賦值,數組的首地址為片外8000H
實驗3:將內部RAM中的50H-5AH中的無符號數,按照從小到大的次序重新排列
#include
#define uint unsigned int #define uchar unsigned char uint i,j;uchar temp;void main(){ for(i=0;i<=10;i++)//賦初值
{
DBYTE[0x50+i]=10-i;} for(i=0;i<=10;i++){
for(j=i+1;j<10;j++)
{
if(DBYTE[0x50+i]>DBYTE[0x50+j])
{
temp=DBYTE[0x50+i];
DBYTE[0x50+i]=DBYTE[0x50+j];
DBYTE[0x50+j]=temp;
}
} } } 實驗三
單片機I/O接口實驗
1.看懂電路圖
2.用開關分別控制,左邊4盞燈同時亮,右邊的4盞熄滅,開關導向另一邊,左邊4盞熄滅,右邊4盞點亮。#include
//查閱sbit和bit 的區別 #define uint unsigned int #define uchar unsigned char void main(){ While(1){ if(P3_0 == 0)
{
P0 = 0x0f;} else P0=0xf0;} }
3.下面按照實驗書本的要求做實驗,并調試程序延時時間。
實驗四
八段數碼管滾動顯示程序設計
1.了解擴展電路的基本結構。
2. 清楚8155各個寄存器的物理地址是怎么得到的。
3.弄清楚8155、74LS164、UA2003三塊芯片的各個引腳的基本功能。
4.74LS164的串行輸入的程序代碼的編寫
/* “驗證式"?實驗十一
八段數碼管顯示
*/ #include
XBYTE[0xe103] /* 鍵盤讀入口 */
unsigned char LEDBuf[LEDLen];/* 顯示緩沖 */ code unsigned char LEDMAP[] = { /* 八段管顯示碼 */
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 };
void Delay(unsigned char CNT){
unsigned char i;
while(CNT--!=0)
for(i=100;i!=0;i--);}
void DisplayLED(){
unsigned char i, j;
unsigned char Pos;
unsigned char LED;
Pos = 0x20;/* 從左邊開始顯示 */
for(i = 0;i < LEDLen;i++)
{
OUTBIT = 0;
/* 關所有八段管 */
LED = LEDBuf[i];
for(j = 0;j < 8;j++)
{
/*送164*/
if(LED & 0x80)DAT164 = 1;
else DAT164 = 0;
CLK164 = CLK164|0x02;
CLK164 = CLK164&0xfd;
LED <<= 1;
}
OUTBIT = Pos;/* 顯示一位八段管 */
Delay(1);
Pos >>= 1;
/* 顯示下一位 */
}
OUTBIT = 0;
/* 關所有八段管 */ }
void main(){
unsigned char i = 0;
unsigned char j;
CAddr = mode;
while(1){
LEDBuf[0] = LEDMAP[ i
& 0x0f];
LEDBuf[1] = LEDMAP[(i+1)& 0x0f];
LEDBuf[2] = LEDMAP[(i+2)& 0x0f];
LEDBuf[3] = LEDMAP[(i+3)& 0x0f];
LEDBuf[4] = LEDMAP[(i+4)& 0x0f];
LEDBuf[5] = LEDMAP[(i+5)& 0x0f];
i++;
for(j=0;j<30;j++)
DisplayLED();
/* 延時 */
} }
集成開發環境詳細設置解說
在第二章中,我們已經簡介了單片機軟件Keil C51的開發過程。即: 1.建立一個工程項目,選擇芯片,確定選項。2.建立匯編源文件或C源文件。3.用項目管理器生成各種應用文件。4.檢查并修改源文件中的錯誤。5.編譯連接通過后進行軟件模擬仿真。6.編譯連接通過后進行硬件模擬仿真。7.編程操作。8.應用。
這里我們介紹工程的較詳細設置及常用調試方法。20.1
工程項目的建立、源程序文件的建立及加載
Keil C51軟件UVision打開后,程序窗口的左邊有一個項目工作區管理窗口,該窗口有3個標簽,分別是Files、Regs和Books,這3個標簽頁分別顯示當前項目的文件結構、CPU的寄存器及部分特殊功能寄存器的值(調試時才出現)和所選CPU的附加說明文件,如果是第一次啟動Keil C51,那么這3個標簽頁全是空的(圖20-1)。
圖20-1
Keil C51打開后界面
20.1.1
建立工程文件
在單片機項目開發中,有時有多個的源程序文件,并且還要為項目選擇CPU以確定編譯、匯編、連接的參數,指定調試的方式等。為便于管理,Keil C51使用工程項目(Project)的方法,將這些參數設置和所需的所有文件都放在一個工程項目中,只能對工程項目而不能對單一的源程序進行編譯(匯編)和連接等操作。
先在硬盤上建立一個需保存工程文件的目錄(例如在“我的文檔” 中建立一個test的文件夾),為便于管理及使用,目錄名稱可與工程名稱一致。選擇“工程>新工程”菜單(圖20-2)。彈出對話框,要求給將要建立的工程起一個名字,可以在編輯框中輸入一個名字(例如test),擴展名不必輸入(默認的擴展名為.uv2)。點擊“保存”按鈕(圖20-3)。隨后彈出一個“為目標target選擇設備”(Select Device for Target “Target1”)對話框,這個對話框要求選擇目標CPU(即你所用單片機芯片的型號),Keil C51支持的CPU很多,我們選擇Atmel公司的AT89C51(或AT89S51)芯片,用鼠標單擊Atmel前的“+”號,選擇“AT89C51(或AT89S51)”單片機后按確定(圖20-4)。隨即系統彈出是否拷貝8051啟動代碼到工程項目并添加到當前項目組的提示(Copy Standard 8051 Startup Code to Project Folder and Add File to Project ?),我們選否。此時,在工程窗口的文件頁中,出現了“Target 1”,前面有“+”號,點擊“+”號展開,可以看到下一層的“Source Group1”。
圖20-2
選擇“工程>新工程”菜單界面
圖20-3
建立新工程界面
圖20-4
選擇單片機型號界面
20.1.2
源程序文件的建立
使用菜單“文件>新建”或者點擊工具欄的新建文件按鈕(圖20-5),即在右側打開一個新的文本編輯窗口,在該窗口中可以輸入匯編語言源程序或C語言源程序(圖20-6)。程序輸入完成后,選擇“文件”,在下拉菜單中選中“另存為”,將該文件以擴展名為.asm格式(匯編語言源程序)或.c格式(C語言源程序)保存在剛才所建立的一個文件夾中(test),這里假設源程序文件名為test.asm(圖20-7)。
圖20-5
新建源程序文件界面
圖20-6
打開新的文本編輯窗口
圖20-7
“另存為” 對話框
源程序文件也可以使用任意的文本編輯器編寫。20.1.3
添加文件到當前項目組中
這時的工程項目還是一個空的工程,里面什么文件也沒有,把剛才編寫好的源程序test.asm加載進工程。單擊工程管理器中“Target 1”前的“+”號,出現“Source Group1”后再單擊,加亮后右擊。在出現的下拉窗口中選擇“Add Files to Group‘Source Group1’”(圖20-8)。注意,該對話框下面的“文件類型”默認為C source file(*.c),也就是以C為擴展名的文件,如我們的文件是以asm為擴展名的,那么在列表框中找不到test.asm,要將文件類型改掉。點擊對話框中“文件類型”后的下拉列表,找到并選中“Asm Source File(*.a51,*.asm)”,這樣在列表框中就可以找到test.asm文件了(圖20-9)。我們可以在增加文件窗口中選擇剛才以asm格式(或c格式)編輯的文件,鼠標單擊“ADD”按鈕,這時源程序文件便加入到Source Group1這個組里了,隨后關閉此對話窗口。點擊 “ Source Group1”前的“+”號,可以看到test.asm文件已在其中(圖20-10)。雙擊后,即可打開該源程序。
圖20-8
Add Files to Group‘Source Group1’界面
圖20-9
Add Files to Group‘Source Group1’對話框
圖20-10
test.asm文件
20.2
工程項目的詳細設置 工程建立好以后,還要對工程進行進一步的設置,以滿足要求。
首先點擊左邊窗口的Target1,然后使用菜單“項目>目標‘target1’選項 ”即出現對工程設置的對話框,共有8個頁面,默認為對象頁面(圖20-11)。絕大部分設置項通常可以采用默認值。
圖20-11
對象頁面
20.2.1
對象頁面
時鐘(MHz)后面的數值是晶振頻率值,默認值是所選目標CPU的最高可用頻率值,對于AT89C51而言是24MHz,而AT89S51是33MHz。該數值與最終產生的目標代碼無關,僅用于軟件模擬調試時顯示程序執行時間。正確設置該數值可使顯示時間與實際所用時間一致,一般將其設置成與你實際所用的晶振頻率相同。
儲存器模式用于設置RAM使用情況,有3個選擇項,Small:是所有變量都在單片機的內部RAM中。Compact:變量存儲在外部RAM里,使用8位間接尋址。Large:變量存儲在外部RAM里,使用16位間接尋址,可以使用全部外部的擴展RAM。
1.Small:一般使用Small來存儲變量,此時單片機優先將變量存儲在內部RAM里,如果內部RAM空間不夠,才會存到外部RAM中。
2.Compact:Compact的方式要通過程序來指定頁的高位地址,編程較復雜,如果外部RAM很少,只有256字節,那么對該256字節的讀取就比較快。如果超過256字節,而且需要不斷地進行切換,就較麻煩,Compact模式適用于比較少的外部RAM的情況。
3.Large:Large模式是指變量會優先分配到外部RAM里。需要注意的是,3種存儲方式都支持內部256字節和外部64KB的RAM。因為變量存儲在內部RAM里,運算速度比存儲在外部RAM要快得多,大部分的應用都是選擇Small模式。
代碼ROM大小用于設置ROM空間的使用,也有3個選擇項,Small、Compact及Large。1.Small:只用低于2K的程序空間,適用于AT89C2051這些芯片,2051只有2K的代碼空間,所以跳轉地址只有2KB,編譯的時候會使用ACALL AJMP這些短跳轉指令,而不會使用LCALL LJMP指令。如果代碼地址跳轉超過2K,那么會出錯。
2.Compact:單個函數的代碼量不能超過2K,整個程序可以使用64K程序空間。3.Large:可用全部64K空間,表示程序或子函數代碼都可以大到64KB,使用code bank還可以更大。通常都選用該方式。選擇Large方式速度不會比Small慢很多,所以一般沒有必要選擇Compact和Small方式。
操作系統選項中,Keil C51提供了兩種操作系統:Rtx tiny和Rtx full,通常我們不使用任何操作系統,用該項的默認值:None(不使用任何操作系統)。Use on-chip ROM(0x0-0xFFF)選擇項,表示使用片上的ROM(選中該項并不會影響最終生成的目標代碼量),該選項取決于單片機應用系統,如果單片機的EA接高電平,則選中這個選項,表示使用內部ROM,如果單片機的EA接低電平,表示使用外部ROM,則不選中該選項。
片外代碼(CODE)儲存器:表示片外ROM的開始地址和大小,如果沒有外接程序存儲器,那么不需要填任何數據。這里假設使用一個片外ROM,地址從0x7000開始,一般填16進制的數,Size(尺寸)為片外ROM的大小。假設外接ROM的大小為0x2000字節,則最多可以外接3塊片外ROM。
片外數據(XDATA)儲存器:用于確定系統擴展RAM的地址范圍,可以填上外接Xdata外部數據存儲器的起始地址和大小,這些選擇項必須根據所用硬件來決定。如果僅僅是89C51單片應用,未進行任何擴展,那么無需設置。
代碼分段:是使用Code Banking技術。Keil C51可以支持程序代碼超過64KB的情況,最大可以有2MB的程序代碼。如果代碼超過64KB,那么就要使用Code Banking技術,以支持更多的程序空間。
20.2.2
輸出頁面
輸出頁面中(圖20-12),按鈕“選擇目標(OBJ)目錄”是用來選擇最終的目標文件所在的文件夾,默認是與工程文件在同一個文件夾中。
圖20-12
Output頁面
“可執行文件名”:設置生成的目標文件的名字,缺省情況下和項目的名字一樣。Create Executable:如果要生成OMF以及HEX文件,一般選中“調試信息”和“瀏覽信息”。選中“調試信息”將會產生調試信息,這些信息用于調試,如果需要對程序進行調試,應當選中該項。“瀏覽信息”是產生各種信息,該信息可以用菜單“查看” 進行瀏覽,一般取默認值。“生成hex文件”用于生成可執行代碼文件,默認情況下該項未被選中,如果要燒錄芯片做硬件實驗,就必須選中該項。
Create Library:選中該項時將生成lib庫文件,一般的應用是不生成庫文件的。構造后操作欄中有以下幾個設置。
完成時“嘀”一聲提示:編譯完成之后發出“咚”的聲音。
開始調試:馬上啟動調試(軟件仿真或硬件仿真),根據需要來設置,一般是不選中。運行用戶程序#
1、運行用戶程序#2:這個選項可以設置編譯完之后所要運行的其他應用程序(比如有些用戶自己編寫了燒寫芯片的程序,編譯完便執行該程序,將Hex文件寫入芯片),或者調用外部的仿真程序。可根據自己的需要設置。
20.2.3
列表頁面
列表頁面用于調整生成的列表文件選項。在匯編或編譯完成后將產生(*.lst)的列表文件,在連接完成后也將產生(*.m51)的列表文件,該頁用于對列表文件的內容和形式進行細致的調節,其中比較常用的選項是“C Compile Listing”下的“匯編代碼”項,選中該項可以在列表文件中生成C語言源程序所對應的匯編代碼(圖20-13)。
圖20-13
Listing頁面
20.2.4
C51頁面
C51頁面用于對Keil C51軟件的C51編譯器的編譯過程進行控制(圖20-14),其中比較常用的是“代碼優化選項”組,該組中級別是優化等級,C51在對源程序進行編譯時,可以對代碼多至9級優化,默認使用第8級,一般不必修改,如果在編譯中出現一些問題,可以降低優化級別再試。“側重”是選擇編譯優先方式,第一項是代碼大小優化(最終生成的代碼量小),第二項是執行速度優先(最終生成的代碼速度快),第三項缺省。默認的是速度優先,可根據需要更改。
圖20-14
C51頁面
20.2.5
調試頁面
調試頁面中(圖20-15)有兩類仿真形式可選:“使用模擬器”和“Keil Monitor-51 Driver”,前一種是純軟件仿真,后一種是帶有Monitor-51目標仿真器的仿真。對于沒有Monitor-51目標仿真器的用戶,只有采用軟件仿真。默認方式下的仿真是軟件仿真(使用模擬器)。
圖20-15
Debug頁面 啟動時加載程序:選擇這項之后,Keil C51會自動裝載程序代碼。
一直運行到main():調試C語言程序時可以選擇這一項,PC會自動運行到main程序處。
工程設置對話框中的其他各頁面與C51編譯選項、A51的匯編選項、BL51連接器的連接選項等用法有關,這里均取默認值。
設置完成后按確認返回主界面,工程文件就建立、設置完畢了。20.3
編譯、連接
在設置好工程后,即可進行編譯、連接。選擇主菜單欄中的“項目”,在下拉菜單中選中“構造對象”(圖20-16),對當前工程進行編譯、連接,這時輸出窗口出現源程序的編譯結果。如果選擇“重新構造所有對象文件”將會對當前工程中的所有文件重新進行編譯,然后再連接,這樣最終產生的目標代碼是最新的。
圖20-16
編譯、連接操作
以上操作也可以通過工具欄按鈕直接進行。
編譯過程中的信息將出現在輸出窗口中的構造頁中,如果源程序中有語法錯誤,將提示錯誤ERROR(S)的類型和行號,雙擊該行,可以定位到出錯的位置。對源程序進行修改沒有語法錯誤后,重新進行編譯、連接,編譯成功后,最終可得到hex格式的文件(如test.hex),該文件可被編程器讀入并寫到芯片中,同時還會產生一些其他相關的文件,可被用于Keil C51的仿真與調試。20.4
Keil C51集成開發環境軟件的調試方法 20.4.1
常用調試命令
在對工程成功地進行編譯(匯編)、連接以后,在主菜單中打開“調試”欄,點擊“開始/停止調試模式”,即可進入軟件模擬仿真調試狀態,Keil C51內建了一個仿真CPU用來模擬執行程序,該仿真CPU功能非常強大,可以在沒有硬件和仿真器的情況下進行程序的調試,但是在時序上,軟件模擬仿真是達不到硬件的時序的。進入調試狀態后,“調試”欄菜單項中原來不能用的命令現在已經可以使用了。“調試”欄菜單上的大部分命令可以在調試界面上找到對應的快捷按鈕,從左到右依次是復位、運行、暫停、單步、單步跳過、執行完當前子程序、運行到當前行、下一狀態、打開跟蹤、觀察跟蹤、反匯編窗口、觀察窗口、代碼作用范圍分析、1#串行窗口、內存窗口、性能分析、工具按鈕等命令(圖20-17)。
圖20-17
軟件模擬仿真調試狀態
使用菜單“單步到之外”或相應命令或功能鍵F10可以用“單步跳過”形式執行命令,所謂“單步跳過”,是指將匯編語言中的子程序或高級語言中的函數作為一個語句一步執行完。使用菜單“單步”或相應的命令按鈕或使用快捷鍵F11可以單步執行程序(即一條一條語句執行),通過單步執行程序,可以找出一些問題的所在,但是僅依靠單步執行來查錯效率較低。
20.4.2
斷點設置
程序調試時,一些程序行必須滿足一定的條件才能被執行到(如程序中某變量達到一定的值、按鍵被按下、串口接收到數據、有中斷產生等),這些條件往往是異步發生或難以預先設定的,這類問題使用單步執行的方法是很難調試的,這時就要使用到程序調試中的另一種非常重要的方法:斷點設置。斷點設置的方法有多種,常用的是在某一程序行設置斷點(圖20-18),設置好斷點后可以全速運行程序,一旦執行到該程序行即停止,可在此時觀察有關變量值,以確定問題所在。在程序行設置/移除斷點的方法是將光標定位于需要設置斷點的程序行,使用菜單:“調試>設置/取消斷點”設置或移除斷點,也可以用鼠標在該行雙擊實現同樣的功能;另外“使能/禁止斷點”用來開啟或暫停光標所在行的斷點功能;其它還有“禁止所有斷點”、“取消所有斷點”等設置。這些功能也可以用工具條上的快捷按鈕進行設置。
圖20-18
斷點設置
20.4.3
在線匯編
在進入Keil C51的調試環境以后,若發現程序有錯,可以直接對源程序進行修改,但是要使修改后的代碼起作用,必須先退出調試環境,重新進行編譯、連接后再次進入調試。如果調試時只是需要對某些程序行進行臨時的試驗修改(如修改參數以得到所需的延時時間),那么這樣的重復過程顯得太麻煩,為此Keil C51軟件提供了在線匯編的能力。將光標定位于需要修改的程序行上,用菜單“調試>在線匯編”即可出現如圖20-19所示的對話框,在“輸入新指令”后面的編緝框內直接輸入需更改的程序語句,輸入完后鍵入回車將自動指向下一條語句,可以繼續修改。如果不再需要修改,可以點擊右上角的關閉按鈕關閉窗口。
圖20-19
在線匯編對話框
20.4.4
程序調試時的常用窗口 Keil C51軟件在調試程序時提供了多個窗口,主要包括輸出窗口(Output Windows)、查看和呼叫堆棧窗口(Watch & Call Statck Windows)、存儲器窗口(Memory Window)、反匯編窗口(Dissambly Window)和串行窗口(Serial Window)等。進入調試模式后,可以通過菜單“查看”(View)下的相應命令打開或關閉這些窗口。圖20-20是輸出窗口、查看和呼叫堆棧觀察窗口和存儲器窗口,各窗口的大小可以使用鼠標調整。進入調試程序后,輸出窗口自動切換到Command頁。
圖20-20
輸出窗口、查看和呼叫堆棧窗口和存儲器窗口
存儲器窗口
存儲器窗口中可以顯示系統各種內存中的值,通過在“地址”(Address)后的編緝框內輸入“字母:數字”即可顯示相應內存值,其中字母可以是C、D、I、X,分別代表代碼存儲空間、直接尋址的片內存儲空間、間接尋址的片內存儲空間、擴展的外部RAM空間,數字代表想要查看的地址。例如輸入“D:0x20”即可觀察到地址20H開始的片內RAM單元值;鍵入“C:0x100”即可顯示從100H開始的ROM單元中的值,即查看程序的二進制代碼。該窗口的顯示值可以以各種形式顯示,如十進制、十六進制、字符型等,改變顯示方式的方法是點鼠標右鍵,在彈出的快捷菜單中選擇,該菜單用分隔條分成三部分,其中第一部分與第二部分的三個選項為同一級別,選中第一部分的任一選項,內容將以整數形式顯示,而選中第二部分的ASCII項則將以字符型式顯示,選中Float項將以相鄰四字節組成的浮點數形式顯示,選中Double項則將相鄰8字節組成雙精度形式顯示。第一部分又有多個選擇項,其中Decimal項是一個開關,如果選中該項,則窗口中的值將以十進制的形式顯示,否則按默認的十六進制方式顯示。Unsigned和Signed后分別有三個選項:Char、Int、Long分別代表以單字節方式顯示、將相鄰雙字節組成整型數方式顯示、將相鄰四字節組成長整型方式顯示,而Unsigned和Signed則分別代表無符號形式和有符號形式,究竟從哪一個單元開始的相鄰單元則與你的設置有關。以整型為例,如果你輸入的是“I:0”,那么00H和01H單元的內容將會組成一個整型數,而如果你輸入的是“I:1”,01H和02H單元的內容會組成一個整型數,依此類推。第三部分的Modify Memory at X:xx用于更改鼠標處的內存單元值,選中該項即出現如圖20-21所示的對話框,可以在對話框內輸入要修改的內容。
圖20-21
更改內存單元值 工程窗口寄存器頁
圖20-22是工程窗口寄存器頁的內容,寄存器頁包括了當前的工作寄存器組和系統寄存器組。系統寄存器組有一些是實際存在的寄存器,如A、B、DPTR、SP、PSW等,有一些是實際中并不存在或雖然存在卻不能對其操作的,如PC、States等。每當程序中執行到對其寄存器的操作時,該寄存器會以反色(藍底白字)顯示,用鼠標單擊然后按下F2鍵,即可修改該值。
圖20-22
工程窗口寄存器頁 查看和呼叫堆棧觀察窗口
這也是很重要的一個窗口,工程窗口中不僅可以觀察到工作寄存器和有限的寄存器如A、B、DPTR等,如果需要觀察其他寄存器的值或者在高級語言編程時需要直接觀察變量,還要借助于這個窗口了。
一般情況下,我們僅在單步執行時才對變量值的變化感興趣,全速運行時,變量的值是不變的,只有在程序停下來之后,才會將這些值的最新變化反映出來。但是,在一些特殊場合我們也可能需要在全速運行時觀察變量的變化,此時可以點擊查看>定期窗口更新,確認該項處于被選中狀態,即可在全速運行時動態地觀察有關值的變化。但是,選中該項,將會使程序模擬執行的速度變慢。
Keil C51提供了串行窗口,我們可以直接在串行窗口中鍵入字符,該字符雖不會被顯示出來,但卻能傳遞到仿真CPU中,如果仿真CPU通過串行口發送字符,那么這些字符會在串行窗口顯示出來,用該窗口可以在沒有硬件的情況下用鍵盤模擬串口通信。由于該項涉及到高級語言編程,這里就不具體介紹了。
20.5
外圍接口工具
為了能夠比較直觀地了解單片機中定時器、中斷、并行端口、串行端門等常用外設的使用情況,Keil C51提供了一些外圍接口對話框,通過“外圍設備”菜單選擇。“外圍設備”的下拉菜單內容與你建立項目時所選的CPU有關。如果是選擇的89C51這一類單片機,那么將會有Interrupt(中斷)、I/O Ports(并行I/O口)、Serial(串行口)、Timer(定時/計數器)這四個外圍設備菜單(圖20-23)。打開這些對話框,列出了外圍設備的當前使用情況,各標志位的情況等,可以在這些對話框中直觀地觀察和更改各外圍設備的運行情況。
圖20-23
外圍設備菜單 20.5.1
P1□作為輸入端□
程序每執行一個循環之前,修改一次P1端口的值(圖20-24),觀察變量的值是直接觀看屏幕右下角的變量表;另外的方法是將鼠標移動到源程序的變量處,等待大約1秒鐘左右,屏幕上即可彈出該變量的相關信息。
圖20-24
P1□作為輸入端□ 20.5.2
P1□作為輸出端□
執行循環時觀察P1口的輸出。由于P1口只用于輸出,故無須修改端口值(圖20-25)。
圖20-25
P1□作為輸出端□
20.5.3
外部中斷INT0 外部中斷INT0對應于P3.2口線,因此,用鼠標單擊“外設>Port3”窗口從右向左數第三位(P3.2口線對應的位),每單擊一下,即產生一次中斷,原因是外部中斷是下降沿或低電平有效(圖20-26)。
圖20-26
外部中斷INT0 另外,也可以點擊“外設>Interrupt”,在出現圖20-27所示中斷對話界面后,進行設置。
圖20-27
中斷對話界面 20.5.4
定時器/計數器0 MCS-51系列單片機有兩至三個定時器/計數器,均可以作為定時器或計數器使用。點擊“外設>Timer0”即出現圖20-28所示定時/計數器0的外圍接口界面,可以直接選擇Mode組中的下拉列表以確定定時/計數工作方式(0~3四種工作方式,設定定時初值等),點擊選中TR0,status后的stop(停止)就變成了run(運行)。如果全速運行程序,此時TH0、TL0后的值也快速地開始變化(要求“定期窗口更新”處于選中狀態),直觀地演示了定時/計數器的工作情況。
圖20-28
定時/計數器0的外圍接口界面
第四篇:單片機實驗教案
單片機技術實驗
教
馮
案
杰
實驗一(1)順序結構程序設計
一、實驗目的
掌握匯編語言設計和調試方法。熟悉KeilC和Protus仿真軟件的使用。
二、實驗內容
1、電路如圖一所示。將A的內容通過P2口送LED發光二極管顯示。
2、修改程序,實現跑馬燈的顯示效果。
四、實驗步驟
1、在計算機某個硬盤中建立項目文件夾。例如“shiyan1”或者“ex1”。
2、啟動KEILC程序。
3、打開主菜單中的“project”下的“new project”建立新的項目。按照要求輸入項目文件名,例如“shiyan1.prj”。注意:項目應該建立在第一部的文件夾中。
4、打開主菜單中的“file”下的“new file”,建立新的匯編語言文件。錄入程序,并將文件命名為“ex1.asm”,存入項目文件夾中。
5、將第四步建立的文件加入到項目中。
6、編譯項目文件,查錯。
7、啟動protus軟件,將電路圖一輸入計算機,并存到項目文件夾中。
8、在protus軟件中,使用鼠標左鍵雙擊,將第六步編譯后所產生的“shiyan1.hex”文件寫入到單片機中。
9、在protus軟件中運行程序。
10、將A中的內容修改為“0AAH”,重新編譯程序,并運行,觀察結果。
五、思考
如何用斷點方式調試本程序。
ORG 0000H
LJMP START
ORG 0030H START: MOV A,#55H
MOV P1,A
SJMP $ END
實驗一(2)循環結構程序設計
一、實驗目的
熟悉MCS-51指令系統,掌握程序設計方法。
二、實驗內容
編寫并調試一個排序子程序,其功能為用冒泡法將內容RAM中幾個單元字節無符號的正整數,按從小到大的次序重新排列。
三、程序框圖
四、實驗步驟
1、LED環境
⑴在“P.”狀態下按“0→EV/UN”,裝載實驗所需的代碼程序。⑵對片內RAM地址50h~5AH進行不規則置數。
⑶在“P.”狀態下鍵入0000,然后按“STEP”或“EXEC”進入實驗項目的調試與運行。
2、PC環境
在與PC聯機狀態下,編譯、連接、下載PH51se05.asm,用連續或單步方式運行程序。
3、運行結果檢查
⑴在單步運行時每走一步可觀察其運行結果。
⑵在連續運行狀態下,應按“暫停圖標”或實驗箱上的“暫停按鈕”,使系統無條件退出用戶運行狀態返回監控,然后再用相應的命令鍵觀察與檢查片內50~5Ah中內容是否按從小到大排列。
五、思考:修改程序把50~5Ah中內容按從小到大排列。
ORG 0000H LJMP START ORG 0030H
START:
MOV R7,#09H MOV R6,#00H;清除標志 CLR C MOV A,@R0 INC R0 SUBB A,@R0 JC LOOP1 MOV R6,#01H DEC R0 MOV A,@R0 INC R0 XCH A,@R0 MOV @R0,A DJNZ R7,START1 CJNE R6,#00H,START SJMP $ END
MOV R0,#50H START1:
DEC R0
INC R0 LOOP1:
實驗一(3)選擇結構程序設計
一、實驗目的
掌握匯編語言的編程。
二、實驗內容
編寫程序,根據送入的數據轉移運行。
三、程序框圖
四、實驗步驟
ORG 0000H
LJMP START
ORG 0030H START: MOV 20H,#00H MOV A,20H
MOV B,#03H
MUL AB
MOV DPTR,#TAB
JMP @A+DPTR
SJMP $ ORG 3000H TAB:
LOOPA: MOV A,#01H LOOPA1:
LOOPB: MOV A,#03H LOOPB1:
LOOPC: MOV A,#07H LOOPC1:
DELAY1S: DELAY1S3: DELAY1S2: DELAY1S1:
LJMP LOOPA LJMP LOOPB LJMP LOOPC MOV P1,A LCALL DELAY1S RL A LJMP LOOPA1 MOV P1,A LCALL DELAY1S RL A LJMP LOOPB1 MOV P1,A LCALL DELAY1S RL A LJMP LOOPC1 MOV R7,#5 MOV R6,#200 MOV R5,#250 DJNZ R5,DELAY1S1 DJNZ R6,DELAY1S2 DJNZ R7,DELAY1S3 RET END
實驗二 中斷實驗
一、實驗目的
熟悉單片機中斷概念及中斷編程方法。
二、實驗內容
編寫程序,從P3.3輸入脈沖,記錄輸入脈沖個數,并用P1口外部鏈接的發光二極管顯示計數結果。
二、參考程序
ORG 0000H
LJMP START
ORG 0013H
LJMP INT1_COUNT
ORG 0030H START:
MOV SP,#60H
MOV A,#00H
SETB IT1;下降邊沿觸發方式
SETB EX1;開啟INT1中斷
SETB EA
SJMP $ INT1_COUNT:
INC A
MOV P1,A
RETI
END
實驗三 LED顯示實驗
一、實驗要求
利用實驗系統提供的顯示設備,動態顯示一行數據。
二、實驗目的
⑴了解數碼管動態顯示的原理; ⑵了解用總線方式控制數碼管顯示。
三、實驗說明
UN2003芯片,是7個帶驅動的反相器。8個數碼管均為共陰極接法。
四、程序框圖
匯編語言參考程序:
ORG 0000H LJMP START ORG 0030H START: MOV SP,#60H MOV 50H,#8CH;顯示字符P.MOV 51H,#40H MOV 52H,#79H MOV 53H,#24H MOV 54H,#30H MOV 55H,#19H MOV 56H,#12H MOV 57H,#02H
LOOP1: LCALL DISPLAY
LJMP LOOP1
DISPLAY: MOV P2,#0FH MOV P0,50H LCALL DELAY20MS
MOV P2,#1FH MOV P0,51H LCALL DELAY20MS
MOV P2,#2FH MOV P0,52H LCALL DELAY20MS
MOV P2,#3FH MOV P0,53H LCALL DELAY20MS
MOV P2,#4FH MOV P0,54H LCALL DELAY20MS
MOV P2,#5FH MOV P0,55H LCALL DELAY20MS
MOV P2,#6FH MOV P0,56H LCALL DELAY20MS
MOV P2,#7FH MOV P0,57H LCALL DELAY20MS
LJMP DISPLAY
DELAY20MS: MOV R7,#20 DELAY1: MOV R6,#100 DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET
TAB: DB 40H,79H,24H,30H,19H,12H,02H;0 1 2 3 4 5 6 DB 78H,00H,10H,08H,03H,46H,21H,06H,0EH;7 8 9 A B C D E F的字符碼
TAB1: DB 8CH;P.TAB2: DB 7FH;END 的字符碼的字符碼
空,不顯示的字符
鍵盤電路實驗
電路圖:
程序:
;用int1中斷實現按鍵功能,鍵值存放在4fh單元中;通過P1口輸出按鍵值,用發光二極管顯示按鍵值;通過P2.4--P2.6和三八譯碼器輸出八列按鍵掃描碼;通過P2.0---P2.3讀入按鍵的行值;行列值組合,就是按鍵的鍵值 ORG 0000H LJMP START ORG 0013H LJMP key_value ORG 0030H START: MOV 4fH,#00h;存放按鍵鍵值單元 MOV P1,#00H MOV P2,#0FFH setb ex1 setb it1 setb ea KEY_SCAN: MOV P2,#0FH LCALL DELAY5MS
MOV P2,#1FH LCALL DELAY5MS
MOV P2,#2FH
LCALL DELAY5MS
MOV P2,#3FH LCALL DELAY5MS
MOV P2,#4FH LCALL DELAY5MS
MOV P2,#5FH LCALL DELAY5MS
MOV P2,#6FH LCALL DELAY5MS
MOV P2,#7FH LCALL DELAY5MS
LJMP KEY_SCAN
DELAY5MS: MOV R7,#40 DELAY1: MOV R6,#100 DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET
KEY_VALUE: PUSH ACC PUSH PSW MOV A,P2 MOV 4FH,A MOV P1,A POP PSW POP ACC RETI END
LED和鍵盤綜合實驗
電路圖:
參考程序:
ORG 0000H LJMP START ORG 0013H LJMP KEY_VALUE ORG 0030H START: MOV SP,#60H
MOV 4fH,#00h;存放按鍵鍵值單元 MOV P2,#0FFH setb ex1 setb it1 setb ea
MOV 50H,#0CH;顯示字符P.MOV 51H,#0CH MOV 52H,#7FH MOV 53H,#7FH MOV 54H,#7FH MOV 55H,#7FH MOV 56H,#7FH
MOV 57H,#0CH
LOOP1: LCALL DISPLAY
LJMP LOOP1
DISPLAY: MOV P2,#0FH MOV P0,50H LCALL DELAY20MS
MOV P2,#1FH MOV P0,51H LCALL DELAY20MS
MOV P2,#2FH MOV P0,52H LCALL DELAY20MS
MOV P2,#3FH MOV P0,53H LCALL DELAY20MS
MOV P2,#4FH MOV P0,54H LCALL DELAY20MS
MOV P2,#5FH MOV P0,55H LCALL DELAY20MS
MOV P2,#6FH MOV P0,56H LCALL DELAY20MS
MOV P2,#7FH MOV P0,57H LCALL DELAY20MS
LJMP DISPLAY
DELAY20MS: MOV R7,#20 DELAY1: MOV R6,#100 DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1
RET
KEY_VALUE: PUSH ACC PUSH PSW MOV 4FH,P2 LCALL KEY_VALUE_DISP POP PSW POP ACC RETI
KEY_VALUE_DISP: MOV A,4FH ANL A,#0F0H SWAP A MOV DPTR,#TAB MOVC A,@A+DPTR MOV 56H,A MOV A,4FH ANL A,#0FH MOVC A,@A+DPTR MOV 57H,A RET
TAB: DB 40H,79H,24H,30H,19H,12H,02H;0 1 2 3 4 5 6的字符碼 DB 78H,00H,10H,08H,03H,46H,21H,06H,0EH;7 8 9 A B C D E F的字符碼
TAB1: DB 8CH;P.的字符碼
TAB2: DB 7FH;空,不顯示的字符 END
實驗四 A/D轉換實驗
一、實驗目的
(1)掌握A/D轉換與單片機接口的方法;(2)了解A/D芯片0809轉換性能及編程方法;(3)通過實驗了解單片機如何進行數據采集。
二、實驗內容
利用實驗系統上的0809做A/D轉換器,實驗系統上的電位器提供模擬量輸入,編制程序,將模擬量轉換成數字,通過數碼管顯示出來。
三、程序框圖
四、實驗電路
五、實驗步驟
把0809的零通道INT0用插針接至AINl孔,0809CS位FFE0孔,運行程序,數碼管顯示0809.XX,后二位顯示當前采集的電壓轉換的數字量,調節W1,該二位將隨著電壓變化而相應變化。
六、思考
修改程序,用其它通道輪流采樣顯示。
實驗五 電腦時鐘(定時器、中斷綜合實驗)
一、實驗目的
熟悉MCS-51定時器,串行口和中斷初始化編程方法,了解定時器的應用實時程序的設計與調試技巧。
二、實驗內容
編寫程序,從本實驗系統鍵盤上輸入時間初值,用定時器產生0.1S定時中斷,對時鐘計數器計數,并將數值實時地送數碼管顯示。
三、程序框圖
四、實驗步驟
連續運行程序,在鍵盤上輸入時間初值,按執行鍵EXEC執行,數碼管上實時顯示時間值。
五、思考
(1)電子鐘走時精度和程序中那些常數有關?
(2)修改程序使定時器工作方式改變,調節有關參數,進一步提高精度。
六、參考程序
ORG 0000H LJMP START ORG 000BH LJMP T0_INT ORG 0030H START: MOV 50H,#00H;時的低位字符碼 MOV 51H,#00H;時的高位字符碼 MOV 52H,#00H;“-”的字符碼 MOV 53H,#00H;分的低位字符碼 MOV 54H,#00H;分的高位字符碼 MOV 55H,#00H;“-”的字符碼 MOV 56H,#00H;秒的低位字符碼 MOV 57H,#00H;秒的高位字符碼 MOV 5FH,#00H;存放小時的單元 MOV 5EH,#00H;存放分鐘的單元 MOV 5DH,#00H;存放秒的單元 MOV 5CH,#00H;存放T0中斷次數,50次為1秒
MOV SP,#60H;設置堆棧棧頂 MOV TH0,#???;設置T0定時器初值 MOV TL0,#??? MOV TMOD,#00000001H;T0工作在定時方式,工作方式0
SETB ET0;開放T0中斷 SETB EA;開放總中斷 SETB TR0;啟動定時器T0 LOOP: mov P2,#11111110H MOV R0,#50H loop1: MOV R7,#08H LOOP2: MOV A,@R0 MOV P1,A LCALL DELAY INC R0 MOV A,P2 RL A MOV P2,A
DJNZ R7, LOOP2 LJMP LOOP SJMP $
DELAY: MOV R6,#2;延時程序 DELAY1: MOV R5,#10 DELAY2: MOV R4,#100 DELAY3: DJNZ R4,DELAY3 DJNZ R5,DELAY2 DJNZ R6,DELAY1 RET 16
T0_INT: CLR TR0 PUSH ACC MOV A,5CH CJNE A,#50H,T0_INT1 MOV 5CH,#00H MOV A,5DH CJNE A,#59H,T0_INT2 MOV 5DH,#00H MOV A,5EH CJNE A,#59H,T0_INT3 MOV 5EH,#00H MOV A,5FH CJNE A,#23H,T0_INT4 MOV 5FH,#00H LJMP T0_END T0_INT1: INC 5CH LJMP T0_END T0_INT2: INC 5DH LJMP T0_END T0_INT3: INC 5EH LJMP T0_END T0_INT4: INC 5FH T0_END: MOV A,5FH
MOV B,#10 DIV AB MOV 51H,A MOV A,B MOV 50H,A MOV A,5EH MOV B,#10 DIV AB MOV 54H,A MOV A,B MOV 53H,A MOV A,5DH MOV B,#10 DIV AB MOV 57H,A MOV A,B MOV 56H,A POP ACC
MOV TH0,#??? MOV TL0,#??? SETB TR0 RETI
實驗六 LCD液晶顯示屏實驗
一、實驗目的
⑴掌握單片機擴展液晶顯示接口的設計與編程。⑵利用字符式液晶顯示器顯示字符。
二、實驗內容
編制程序,在液晶顯示器上顯示:
學生所在的院系的漢語拼音字母和學生的名字。分兩行顯示。
三、實驗電路
四、參考程序
DAT1 EQU 30H;第一參數單元 DAT2 EQU 31H;第二參數單元 COM EQU 32H;指令代碼單元 C_ADD EQU 0100H;指令通道地址 D_ADD EQU 0000H;數據通道地址
org 0000h ljmp main org 0030h;主程序
MAIN: MOV SP,#60H;
lcall delay;上電延時
LCALL INT;初始化
LCALL CLEAR;清緩沖區
TEST: LCALL hgnu_disp;顯示“WELCOM TO HGNU” LCALL PL_XW_ZKB;顯示 “P_L :”
“X_W :”
“ZKB:” sjmp test
;上電延時子程序
delay: MOV R6,#50H;MOV R7,#00H;DELY1: NOP
DJNZ R7,DELY1;上電延時
DJNZ R6,DELY1;ret;讀狀態字子程序
R_ST: MOV DPTR,#C_ADD;設置指令通道
MOVX A,@DPTR;RET;判斷狀態位STA1,STA0子程序(讀寫指令和數據),在指令的讀,寫
;數據之前這兩個標志必須同時為“1” ST01: LCALL R_ST;JNB ACC.0,ST01;JNB ACC.1,ST01;RET;判斷狀位STA2子程序(數據自動讀狀態),該位
;在數據自動操作過程中取代STA0和STA1有效。在連續讀過程中每讀一次;之前都要確認STA2=1 ST2: LCALL R_ST;JNB ACC.2,ST2;RET;判斷STA3子程序(數據自動寫狀態)ST3: LCALL R_ST;JNB ACC.3,ST3;RET;判斷狀態位STA6子程序(屏讀/屏拷貝狀態)ST6: LCALL R_ST;JB ACC.6,ERR;RET ERR: LJMP ST6;;出錯處理
;寫指令和寫數據子程序..;雙字節參數指令寫入入口
PR1: LCALL ST01;判斷狀態位STA1,STA0 MOV A,DAT1;取第一參數單元數據
LCALL PR13;寫入參數;單字節參數指令寫入入口
PR11: LCALL ST01;判斷狀態位STA1,STA0 MOV A,DAT2;取第二參數單元數據
LCALL PR13;寫入參數;無參數指令寫入入口
PR12: LCALL ST01;無參數指令寫入入口
MOV A,COM;取指令代碼單元數據
MOV DPTR,#c_ADD;設置指令通道地址/數據寫入入口
LJMP PR14;寫入指令代碼
PR13: MOV DPTR,#D_ADD;設置數據通道地址/數據寫入入口 PR14: MOVX @DPTR,A;寫入操作
RET;讀數據子程序 PR2: LCALL ST01;判斷狀態位
MOV DPTR,#D_ADD;設置數據通道地址
MOVX A,@DPTR;讀數據操作
MOV DAT2,A;數據存入第二參數/數據單元
RET;初始化子程序
INT:
;顯示區域設置
MOV DAT1,#00H;設置文本顯示區首地址
MOV DAT2,#00h;
MOV COM,#40H;LCALL PR1;雙字節參數指令寫入入口
MOV DAT1,#16;設置文本顯示區域寬度
MOV DAT2,#00H;即一行顯示所占字節數
MOV COM,#41H;LCALL PR1;雙字節參數指令寫入入口
MOV DAT1,#00H;設置顯示區域首地址
MOV DAT2,#00H;或文本屬性區域首地址
MOV COM,#42H;LCALL PR1;雙字節參數指令寫入入口
MOV DAT1,#10H;設置圖形顯示區域寬度
MOV DAT2,#00H;或為文本屬性區域狂寬度
MOV COM,#43H;即一行顯示所占字節數
LCALL PR1;雙字節參數指令寫入入口
;顯示光標設置
MOV COM,#0A1H;光標形狀設置
LCALL PR12;
;設置光標初始位置,是字符行和字符列,第0行第15列
MOV DAT1,#0;光標行位置
MOV DAT2,#0;光標列位置
MOV COM,#21H;LCALL PR1;雙字節參數指令寫入入口
;顯示方式設置,使用內部字符發生器
MOV COM,#80H;顯示方式設置,邏輯“或”合成LCALL PR12;無參數指令寫入入口+
;顯示開關方式
MOV COM,#97H;僅用文本顯示
LCALL PR12;無參數指令寫入入口
RET
;寫數據子程序,8*8點陣
;R6中裝入顯示位置的列數(字符的個數),每行16個字符,R7中裝入顯示位置距左上角的字符行數
;5FH單元中裝入待顯示的字符碼
DISP: mov b,r7
mov a,#16 mul ab mov r7,a CLR C mov a,R6
ADD A,R7 MOV R6,A;R7*16+R6
MOV DAT1,R6;設置顯示RAM首地址,水平方向字符數
MOV DAT2,#00H;固定送00H MOV COM,#24H;地址指針指令
LCALL PR1;MOV
dat2,5fH;取要顯示的字符
MOV COM,#0c4H;數據寫,地址不變
LCALL PR11;寫入數據
RET;清顯示緩沖區(16*8單元)clear: MOV 5FH,#00H
MOV R5,#0 CLEAR0: MOV R4,#0 CLEAR1: MOV A,R5
MOV R7,A MOV A,R4 MOV R6,A CLEAR2: LCALL DISP
INC R4 CJNE R4,#16,CLEAR1
mov r4,#00h
INC R5
CJNE R5,#8,CLEAR0 CLEAR9: RET;顯示頻率、相位、占空比、相位差等字符。(P_L :;PL_XW_ZKB:MOV R7,#3 MOV R6,#0 MOV
5fh,#30H;“P” LCALL DISP MOV R7,#3 MOV R6,#1 MOV
5fh,#3FH;“_” LCALL DISP MOV R7,#3 MOV R6,#2 MOV
5fh,#2CH;“L”
X_W :
ZKB:)
LCALL DISP MOV R7,#3 MOV R6,#3 MOV
5fh,#1AH;“: ” LCALL DISP
MOV R7,#5 MOV R6,#0 MOV
5fh,#38H;“X” LCALL DISP MOV R7,#5 MOV R6,#1 MOV
5fh,#3FH;“_” LCALL DISP MOV R7,#5 MOV R6,#2 MOV
5fh,#37H;“W” LCALL DISP MOV R7,#5 MOV R6,#3 MOV
5fh,#1AH;“: ” LCALL DISP
MOV R7,#7 MOV R6,#0 MOV
5fh,#3AH;“Z” LCALL DISP MOV R7,#7 MOV R6,#1 MOV
5fh,#2BH;“K” LCALL DISP MOV R7,#7 MOV R6,#2 MOV
5fh,#22H;“B ” LCALL DISP MOV R7,#7 MOV R6,#3 MOV
5fh,#1AH;“: ” LCALL DISP RET;頂行顯示“黃岡師院物科院“的英文名稱。;”welcome to hgnu!“ hgnu_DISP:
MOV R7,#0;顯示位置的行列數
MOV R6,#0 MOV
5fh,#37H;”W“ LCALL DISP MOV R7,#0 MOV R6,#1 MOV
5fh,#25H;”E“ LCALL DISP MOV R7,#0 MOV R6,#2 MOV
5fh,#2CH;”L“ LCALL DISP MOV R7,#0 MOV R6,#3 MOV
5fh,#23H;”C“ LCALL DISP MOV R7,#0 MOV R6,#4 MOV
5fh,#2FH;”0“ LCALL DISP MOV R7,#0 MOV R6,#5 MOV
5fh,#2DH;”M“ LCALL DISP MOV R7,#0 MOV R6,#6 MOV
5fh,#25H;”E“ LCALL DISP MOV R7,#0 MOV R6,#7 MOV
5fh,#00H;” “ LCALL DISP MOV R7,#0 MOV R6,#8 MOV
5fh,#34H;”T“ LCALL DISP MOV R7,#0 MOV R6,#9 MOV
5fh,#2FH;”O“ LCALL DISP MOV R7,#0 MOV R6,#10 MOV
5fh,#00H;” “ LCALL DISP MOV R7,#0 MOV R6,#11 MOV
5fh,#28H;”H“ LCALL DISP
MOV R7,#0 MOV R6,#12 MOV
5fh,#27H;”G“ LCALL DISP MOV R7,#0 MOV R6,#13 MOV
5fh,#2EH;”N“ LCALL DISP MOV R7,#0 MOV R6,#14 MOV
5fh,#35H;”U“ LCALL DISP RET tab: db 10h,11h,12h,13h,14h,15h,16h,17h,18h,19h;”0-----9“
db 21h,22h,23h,24h,25h,26h;”A-----F" end
實驗七 直流電機轉速測量與控制實驗
一、實驗目的
1.掌握直流電機的驅動原理。2.了解直流電機調速的方法。
二、實驗內容
1.用0832 D/A轉換電路后的輸出經放大后驅動直流電機。
2.編制程序改變0832輸出經放大后的方波信號的占空比來控制電機轉速。本實驗中 D/A輸出為雙極性輸出,因此電機可以正反向旋轉。
三、程序流程
三、實驗電路
五、參考程序
DATA_TH0 EQU 00H DATA_TL0 EQU 00H;信號周期為130ms DATA_TH1 EQU 20H DATA_TL1 EQU 00H;高電平時間65ms ORG 0000H LJMP MAIN ORG 0003H LJMP INT_0;啟動電機按鍵
ORG 000BH LJMP T_0;T0確定輸出信號的周期(或者頻率)
ORG 0013H LJMP INT_1;電機轉動方向控制按鍵
ORG 001BH LJMP T_1;T1確定輸出信號高電平的時間期
ORG 0030H MAIN: MOV SP,#60H CLR P1.0 CLR P1.1;關閉電機
setb 20h.0;初始化電機正轉
clr 20h.1;初始狀態時,電機停止轉動
MOV TMOD,#11H SETB IT0 SETB EX0 SETB IT1 SETB EX1 SETB ET0 SETB ET1 SETB EA
SJMP $
T_0: JNB 20H.1,T_01;
MOV TH1,#DATA_TH1
MOV TL1,#DATA_TL1 SETB TR1
MOV TH0,#DATA_TH0
MOV TL0,#DATA_TL0
SETB TR0
JNB 20H.0,T_02
setb P1.0
clr P1.1
LJMP T_05 T_02: clr P1.0
setb P1.1
LJMP T_05
T_01: CLR P1.0
CLR P1.1
CLR TR0
CLR TR1 T_05: RETI T_1: CLR TR1
clr p1.0
clr p1.1
RETI int_1: CPL 20H.1;電機啟動標志求反,開啟電機或者關閉電機
JNB 20H.1,INT_11;啟動標志不為1,則停止電機,關閉定時器
MOV TH1,#DATA_TH1;啟動標志為1,則開啟定時器1和定時器2,輸出PWM波
MOV TL1,#DATA_TL1 SETB TR1
MOV TH0,#DATA_TH0
MOV TL0,#DATA_TL0
SETB TR0
JNB 20H.0,INT_12;轉動方向標志不為1,則反轉,否則正轉
setb P1.0
clr P1.1
LJMP INT_19 INT_12: clr P1.0
setb P1.1
LJMP INT_19 INT_11: CLR P1.0
CLR P1.1
CLR TR0
CLR TR1 INT_19: RETI 26
INT_0: CPL 20H.0 RETI END
實驗八 步進電機控制實驗
一、實驗目的
1.了解步進電機控制的基本原理。2.掌握步進電機轉動編程方法。
二、實驗內容
從鍵盤上輸入正、反轉命令,轉速參數和轉動步數顯示在顯示器上,CPU再讀取顯示器上顯示的正、反轉命令,轉速級數(16級)和轉動步數后執行。轉動步數減為零時停止轉動。
三、實驗電路圖
四、參考程序
ORG 0000H
ljmp main ORG 000BH LJMP COUNT0
ORG 001BH LJMP COUNT1 ORG 0100H MAIN: MOV P0,#0FFH;輸送脈沖口,SETB P1.2;MOV R0,#1;延時變化變量 LOOP1: MOV P0,#0FCH LCALL DELAY MOV P0,#0F6H LCALL DELAY MOV P0,#0F3H LCALL DELAY MOV P0,#0F9H LCALL DELAY JNB P1.2,LOOP2 MOV TMOD,#01010101B MOV TH0,#0FFH MOV TL0,#0FFH MOV TH1,#0FFH MOV TL1,#0FFH SETB TR0 SETB TR1 SETB ET0 SETB ET1 SETB EA MOV DPTR,#TABLE MOV A,R0 MOVC A,@A+DPTR MOV P2,A JMP LOOP1 LOOP2: MOV P0,#0FCH LCALL DELAY MOV P0,#0F9H LCALL DELAY MOV P0,#0F3H LCALL DELAY MOV P0,#0F6H LCALL DELAY JB P1.2,LOOP1 MOV TMOD,#01010101B MOV TH0,#0FFH MOV TL0,#0FFH MOV TH1,#0FFH MOV TL1,#0FFH 28
SETB TR0 SETB TR1 SETB ET0 SETB ET1 SETB EA MOV DPTR,#TABLE MOV A,R0 MOVC A,@A+DPTR MOV P2,A JMP LOOP2 SJMP $ COUNT0: MOV TH0,#0FFH;減速中斷 MOV TL0,#0FFH CJNE R0,#9,L4 JMP L5 L4: INC R0
L5: setb TR0 RETI COUNT1: MOV TH1,#0FFH;加速中斷 MOV TL1,#0FFH CJNE R0,#1,L6 JMP L7 L6: DEC R0 L7: setb TR1 RETI DELAY: MOV A,R0;延時 MOV R1,A L1: MOV R2,#50 L2: MOV R3,#250 L3: DJNZ R3,L3 DJNZ R2,L2 DJNZ R1,L1 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;顯示程序查表,共陰 END
第五篇:單片機實驗
實驗
一、MCS51單片機基本開發環境
1. 實驗目的:
1)熟悉軟件的集成開發環境 2)掌握單片機軟件設計流程
3)掌握單片機存貯器結構及各窗口之間的聯系 2. 實驗內容:
1)用三種方法實現將累加器A內容改為20H
方法1--MOV A,#20H 方法2—MOV R0,#20H MOV A,R0 方法3—MOV R0,#20H XCH A,R0 心得:越往下做實驗時就越感覺這題根本不能說是題目,但不得不說在沒接觸過編程軟件,剛開始學的匯編,第一次做的實驗就光這道題都覺得不知道做什么.所以凡是總有開始,不了解情況的多簡單的都會覺得難.2)將58H位單元置為1,觀察內部RAM中2BH內容的變化 代碼:
SETB 2BH.0 JMP $ END 心得:這是關于內部存儲中對單元和字節了解,不理解很容易做錯.比如開始寫的指令為
MOV R0,#58H;MOV @R0,#1
這是錯誤的指令。這就需要認真去了解單片機中的字節地址與位地址的關系。80C51中有位尋址區和字節尋址區。題目中58H為位地址,2BH為字節地址,且58H為2B字節的最低位。由于58H屬于位尋址區,可用位操作指令 SETB 進行置位,SETB 2BH.0 執行后,2BH中內容變為01
3)如果當前狀態為有進位、工作寄存器使用區2,請用3種方法設置這種狀態
代碼:
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寫了三段代碼,可分別完成題目要求。不過實驗時只是對代碼進行了錯誤調試,沒有對結果進行檢驗。其中值得注意的是對于布爾(位)操作指令的用法,比如傳送指令必須經累加器C,如第二段中MOV P0,#01H;MOV C,P0.0,以及對于位尋址的方式(如需用到“.”隔開)的應用。4)編一個小程序將內部RAM中的20H單元的內容送到21H單元并調試
代碼:
MOV R0,#20H MOV @R0,#10H MOV R1,#21H MOV @R1,20H JMP $ END
5)用程序將堆棧指針指向60H,然后在堆棧中依次壓入01,02,03,04,05五個數,觀察哪些單元內容發生了變化,各變為多少?從哪些窗口可以發現這些變化?順序將堆棧中的五個數放入30H~34H五個單元中,編程實現之。
代碼:
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)將外部數據存貯器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位的寄存器,在使用時若與八位寄存器進行數據交換時需分為高八位DPH與低八位DPL來用。7)若要求程序從0010H單元開始運行,可用兩種方法實現?
方法一 ORG 0010H 方法二 AJMP 0010H
3. 選做實驗內容:數據傳送 目的:
1)掌握8051單片機內部數據存貯器、外部數據存貯器的數據傳送特點和應用 2)掌握MOV,MOVX和MOVC類指令的用法及區別 內容:
1)將片內RAM數據區20H為首地址的十六個字節傳送到30H為首地址的數據區,即: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)將外部數據存儲器2000H~200FH單元的十六個數傳送至內部數據存儲器的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
總體心得體會:
第一次做實驗主要是熟悉了解了下單片機編程軟件的使用,開始接觸時在對其軟件不是太了解的情況下實驗編程做的確實很亂,不清楚該怎樣進行,比如不知如何進行對指令的調試,也不清楚該如何觀察結果,沒有一個整體的概念,所以在了解其開發環境上花了不少時間。經過一段時間的摸索后也終于了解了其具體的使用,也能夠順利的對指令的編程運用。運行指令時遇到的一些問題需要注意的也在上面各題中做了說明。還有需要注意的是:進入軟件仿真時需要對存儲空間進行查看的方法是在Address窗口中輸入:d:00h 顯示內部數據存儲器從00h開始的單元; x:1000h 顯示外部數據存儲器從1000h開始的單元; c:0000H 顯示程序存儲器內容。還有由于偽指令 END 定義的原因,在程序末需加一條死循環調轉指令(如 JMP $)使程序不會進入其他未知空間執行其他指令。實驗
二、加、減法實驗
1. 實驗目的
1)正確使用單片機的加減運算指令
2)掌握不同指令對于程序狀態字的影響及程序狀態字的意義、用處 3)掌握ADD,ADDC,SUBB和DA A等指令的用法 4)學習模塊化程序設計方法 2. 實驗內容
1)編寫3字節二進制加法子程序,并用主程序調用不同的加數和被加數來檢測該子程序的正確性。需考慮有進位和無進位情況。程序入口為: 加數:22H,21H,20H三字節,22H為最高位
被加數:32H,31H,30H三字節,32H為最高位
程序出口為: 23H,22H,21H,20H四字節,23H為最高位 例如:地址:23 22 21 20 32 31 30 執行前數據: 01 23 45 FF 01 01 執行后數據: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;加數1地址、和的地址 MOV R1, #30H;加數2地址 CLR C MOV R2, #3;循環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)編寫三字節二進制減法子程序 入口:被減數: 52H,51H,50H, 50H為最低位
減數: 42H,41H,40H, 40H為最低位
出口:差:外部數據存貯器2003H~2000H(2000H為最低位)用主程序調用多組數據來調試,需考慮無借位和有借位兩種情況。例如:
執行前:地址: 52 51 50 42 41 40
數據: 90 80 70 10 10 10
執行后:地址: 2003 2002 2001 2000
數據: 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;被減數地址 MOV R1, #40H;減數地址 MOV DPTR, #2000H;差的地址 CLR C MOV R2, #3;循環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位十進制加法子程序(十進制數采用壓縮BCD碼存放)入口: 加數:24H—20H,低地址放低字節
被加數:29H—25H,低地址放低字節
出口 和:4005H—4000H,低地址放低字節
要求調用多組數據調試,注意觀察PSW的變化,理解DA A指令的含義。例如:
執行前地址:24 23 22 21 20 29 28 27 26 25
數據:12 34 56 78 90 88 99 33 12 74
執行后地址:4005 4004 4003 4002 4001 4000
數據: 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;加數1地址 MOV R1, #25H;加數2地址 MOV DPTR,#4000H CLR C MOV R2, #5;循環5次 LOOP: MOV A, @R0;取 ADDC A, @R1;加
DA A;調整為BCD碼 MOVX @DPTR, A;存 INC R0 INC R1 INC DPTR DJNZ R2, LOOP POP PSW RET END