第五章 8051基本電路與輸出輸入實例
§ 5-1 基本電路
8051單晶片是同步式的順序邏輯系統,整個系統的工作完全是依賴系統內部的時脈信號,用以來產生各種動作週期及同步信號。在8051單晶片中已內建時脈產生器,在使用時只需接上石英振盪晶體及電容就可以讓系統產生正確的時脈信號。
為方便說明及應用,對於往後章節中之實例均利用下列之基本硬體時脈振盪電路。
§ 5-2 資料的輸出實例
下圖是本例的電路圖:程式1:以邏輯旋轉指令,輸出P0到P3之走馬燈。
;
;
本程式以P0到P3為輸出
程式下載
;
;
應用指令:
;
旋轉指令RL
;
互斥或指令XRL
;
包括進位旗標之右旋轉指令RLC
;
邏輯相反指令CPL
;
;
動作: 當LED全亮時則逐點暗掉,當LED全暗時則逐點亮起
;
說明: 暫存器R0用以控制P0到P3為全亮或全暗,R1用以控制目前掃描的位置
;
ORG 00H
JMP START ;規避00H至2FH間之中斷向量執行位址
ORG 30H
;
MOV SP,#30H ;將堆疊指標重新指向
MOV A,#00H
MOV P3,A ;輸出資料至埠3
CALL DELAY
MOV P2,A ;輸出資料至埠2
CALL DELAY
MOV P1,A ;輸出資料至埠1
CALL DELAY
MOV P0,A ;輸出資料至埠0
CALL DELAY
START: MOV A,#01H
RT0: MOV R1,A
XRL A,P0 ;與埠0執行互斥或
MOV P0,A ;輸出資料至埠0
CALL DELAY ;呼叫0.2秒延遲副程式
MOV A,R1
CLR C
;清除進位旗標
RLC A
;與進位旗標一起向左旋轉
JNC RT0
;若進位旗標不為0則跳回再次執行
MOV A,#01H
RT1: MOV R1,A
XRL A,P1
;與埠1執行互斥或
MOV P1,A ;輸出資料至埠1
CALL DELAY ;呼叫0.2秒延遲副程式
MOV A,R1
CLR C
;清除進位旗標
RLC A
;與進位旗標一起向左旋轉
JNC RT1
;若進位旗標不為0則跳回再次執行
MOV A,#01H
RT2: MOV R1,A
XRL A,P2
;與埠2執行互斥或
MOV P2,A
;輸出資料至埠2
CALL DELAY ;呼叫0.2秒延遲副程式
MOV A,R1
CLR C
;清除進位旗標
RLC A
;與進位旗標一起向左旋轉
JNC RT2
;若進位旗標不為0則跳回再次執行
MOV A,#01H
RT3: MOV R1,A
XRL A,P3
;與埠3執行互斥或
MOV P3,A
;輸出資料至埠3
CALL DELAY ;呼叫0.2秒延遲副程式
MOV A,R1
CLR C
;清除進位旗標
RLC A
;與進位旗標一起向左旋轉
JNC RT3
;若進位旗標不為0則跳回再次執行
JMP START
DELAY: MOV R5,#10
;延遲時間約為 R5*20 mS
D1: MOV R6,#40
D2: MOV R7,#249
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
程式2:以查表法,輸出P0到P3之走馬燈。
;
; 本程式以P0到P3為輸出(查表法運用)
程式下載
;
; 應用指令:
;
BD虛指令用以定義資料
;
間接資料指標暫存器DPTR之設定與索引定指法應用
;
比較是否相等指令CJNE,若不等則跳躍
;
暫存器累加1指令
;
; 動作: LED逐一亮起後再逐一滅掉
; 說明: 利用間接資料指標暫存器DPTR讀取資料庫之資料並顯示在各輸出埠上
;
ORG 00H
JMP START
;規避00H至2FH間之中斷向量執行位址
ORG 30H
;
MOV SP,#30H
;將堆疊指標重新指向
START: MOV A,#00
MOV P3,A
;輸出資料至埠3
CALL DELAY
;呼叫0.2秒延遲副程式
MOV P2,A
;輸出資料至埠2
CALL DELAY
;呼叫0.2秒延遲副程式
MOV P1,A
;輸出資料至埠1
CALL DELAY
;呼叫0.2秒延遲副程式
MOV P0,A
;輸出資料至埠0
CALL DELAY
;呼叫0.2秒延遲副程式
LOOP: MOV DPTR,#DAT ;載入資料DAT之位址至資料指標暫存器DPTR中
RT0: MOV A,#0
MOVC A,@A+DPTR ;載入DPTR所指位址之資料至累積器A中
MOV P0,A
;輸出資料至埠0
CALL DELAY
;呼叫0.2秒延遲副程式
INC DPTR
;將DPTR加1, 即用於指向下一筆資料
CJNE A,#FFH,RT0 ;比較A是否為值FFH, 若否則跳回RT0重新執行
RT1: MOV A,#0
MOVC A,@A+DPTR ;載入DPTR所指位址之資料至累積器A中
MOV P1,A
CALL DELAY
INC DPTR
CJNE A,#FFH,RT1
RT2: MOV A,#0
MOVC A,@A+DPTR ;載入DPTR所指位址之資料至累積器A中
MOV P2,A
CALL DELAY
INC DPTR
CJNE A,#FFH,RT2
RT3: MOV A,#0
MOVC A,@A+DPTR ;載入DPTR所指位址之資料至累積器A中
MOV P3,A
CALL DELAY
INC DPTR
CJNE A,#FFH,RT3
RT4: MOV A,#0
MOVC A,@A+DPTR ;載入DPTR所指位址之資料至累積器A中
MOV P3,A
;輸出資料至埠3
CALL DELAY
;呼叫0.2秒延遲副程式
INC DPTR
;將DPTR加1, 即用於指向下一筆資料
CJNE A,#0,RT4 ;比較A是否為值0, 若否則跳回RT4重新執行
RT5: MOV A,#0
MOVC A,@A+DPTR ;載入DPTR所指位址之資料至累積器A中
MOV P2,A
CALL DELAY
INC DPTR
CJNE A,#0,RT5
RT6: MOV A,#0
MOVC A,@A+DPTR ;載入DPTR所指位址之資料至累積器A中
MOV P1,A
CALL DELAY
INC DPTR
CJNE A,#0,RT6
RT7: MOV A,#0
MOVC A,@A+DPTR ;載入DPTR所指位址之資料至累積器A中
MOV P0,A
CALL DELAY
INC DPTR
CJNE A,#0,RT7
JMP LOOP
DELAY: MOV R5,#10
D1: MOV
R6,#40
D2: MOV
R7,#249
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
DAT: DB
01H,03H,07H,0FH,1FH,3FH,7FH,FFH
DB 01H,03H,07H,0FH,1FH,3FH,7FH,FFH
DB 01H,03H,07H,0FH,1FH,3FH,7FH,FFH
DB 01H,03H,07H,0FH,1FH,3FH,7FH,FFH
DB 7FH,3FH,1FH,0FH,07H,03H,01H,00H
DB 7FH,3FH,1FH,0FH,07H,03H,01H,00H
DB 7FH,3FH,1FH,0FH,07H,03H,01H,00H
DB 7FH,3FH,1FH,0FH,07H,03H,01H,00H
END
程式技巧說明:
在上列兩程式均將P0~P3做為輸出埠,程式中ORG為虛指令,用以告知編譯器將其下之程式,放置於程式記憶體中之位址。由於8051之中斷向量位址,如下圖,故程式撰寫時應養成不使用這部分之記憶體。
|
中斷源 |
中斷向量 |
|
Reset
Timer0
Timer1 UART ( TXD ) UART ( RXD ) |
0000H 0003H 000BH 0013H 001BH 0023H 002BH |
首先,8051啟動後,須給予一Reset信號,則程式由0000H位址開始執行,而程式中JMP START指令則是用以規避中斷向量,故ORG 30H則指定另一程式記憶體放置起始點。
另外,CALL DELAY指令則是用以呼叫延遲副程式,而在副程式中是以RET做為結束,執行到RET後則在跳回主程式中繼續執行。
§ 5-3 資料的輸入實例:
下圖示本例之電路圖:程式:以P3.7為切換開關設定不同顯示P0~P2之走馬燈模式,當P3.7為0時P0到P2為全亮或全暗,當全亮則逐點暗掉,若全暗則會逐點亮起。P3.0~P3.6則用以設定走馬燈執行的速度。
;
;
本程式以P0到P2為輸出,P3為輸入,
程式檔
;
;
應用指令:
;
旋轉指令RL
;
互斥或指令XRL
;
堆疊PUSH和POP
;
;
動作: 以P3.7為切換開關設定不同顯示方式,
;
當P3.7為0時LED全亮時則逐點暗掉,當LED全暗時則逐點亮起,
;
P3.0~6為延遲時間長短控制
;
;
說明: 暫存器R0用以控制P0到P3為全亮或全暗,R1用以控制目前掃描的位置
;
暫存器R2用以儲存延遲時間之設定
;
ORG 00H
JMP INIT
;規避00H至2FH間之中斷向量執行位址
ORG 30H
INIT:
MOV SP,#30H ;將堆疊指標重新指向
MOV R2,#25
;暫存器R2設定初始延遲時間25*20mS
MOV A,#00H
;將埠2至埠0設定為全滅
MOV R3,A
MOV A,R3
MOV P2,A
CALL DELAY
MOV A,R3
MOV P1,A
CALL DELAY
MOV A,R3
MOV P0,A
CALL DELAY
START: MOV R2,#25
;暫存器R5設定初始延遲時間25*20mS
MOV A,R3
CPL A
MOV R3,A
MOV P2,A
CALL DELAY
MOV A,R3
MOV P1,A
CALL DELAY
MOV A,R3
MOV P0,A
CALL DELAY
LOOP: MOV A,P3
;讀入埠3之設定資料
CPL A
;將資料作反相邏輯運算
PUSH A
;將累積器A資料存入堆疊中
ANL A,#7FH
;將累積器A資料與值7FH做邏輯AND運算
MOV R2,A
;將累積器A資料存入R5中做為延遲時間之設定值
MOV A,#01H
RT0:
MOV R1,A
XRL A,P0
MOV P0,A
CALL DELAY
MOV A,R1
CLR C
RLC A
JNC RT0
MOV A,#01H
RT1:
MOV R1,A
XRL A,P1
MOV P1,A
CALL DELAY
MOV A,R1
CLR C
RLC A
JNC RT1
MOV A,#01H
RT2:
MOV R1,A
XRL A,P2
MOV P2,A
MOV R3,A
CALL DELAY
MOV A,R1
CLR C
RLC A
JNC RT2
POP A
;將之前堆疊中資料取出
JB A.7,LOOP
;若累積器A為1則跳回到LOOP重新執行
JMP START
;若累積器A為0則跳回到START重新執行
DELAY: MOV A,R2
;載入R2之延遲時間設定
MOV R5,A
JNZ D1
;若累積器A不為0則跳到D0執行
MOV R5,#25
;當R5為0時則重設延遲時間為25*20mS
D1:
MOV R6,#40
D2:
MOV R7,#249
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END