89S51 電路板製
作
設備工具材料介紹
銲鎗
:
吸鍚器 :
設備及工具的介
紹
銲頭採用電子零件專
用
吸除多餘的錫
渣
銲鍚 鉻鐵架及海
綿
設備及工具的介
紹
三用電表
:歐姆檔及直流電壓
檔
邏輯測試筆
:測試電路節點的邏
輯準位 ( 紅 :1 綠
:0)
# 必要時除錯須用示波器或邏輯分
析儀
設備及工具的介
紹
剝線鉗 :
要能處理 OK 線 尖嘴鉗及斜口
鉗
小起子
材料的介紹
洞洞板 ( 萬用
板 ):
零件面 : 零件
均放置於此面
銲接面 : 不
可放置零件
# 單買一片約 30
元
材料的介紹
銅柱 OK 線 ( 銀絲
線 )
材料的介紹
AT89S51:
DIP 包裝 40 支腳
位不需燒錄器 ( 和 AT89C51 不
同 )用 ISP 電路進行程式下載
AT89S52 亦可使用 (ROM 更
大 )每片 50 元以下 購買容易
迷你型的 8051:
89S2051
材料的介紹
IC 腳座 :
40pin:8951 使
用
20pin
注意第一腳的位置 ( 缺
口 )
針腳 :
不需太長 (0.5 公分即夠
用 )
材料的介紹
電阻 :
½ w
¼ w: 洞洞板
上可緊臨併
排
排阻 : 打點的為 COM 點
等效電路 :
LED
:
3m
1.5m
331=33X10 =330 歐
姆
1
472=47X10 =4.7k 歐姆
2
材料的介紹
電容 :
電解質電容 :( 有正
負 )
陶瓷電容 :( 無正
負 )103=10X10 pF=0.01uF
3
30=30pF
石英振盪器 :(12MHz)
等效符號 :
104=10X10 pF=0.1uF
4
材料的介紹
指撥開關
:
按鈕開關
:
LED 陣
列 :
共陽極七
段顯示器
:
7447 解碼器 :
輸入 BCD 碼
(0000~1001)
輸出至共陽
7seg 顯示該數
字
AT89S5X 電路板製作過
程
電路板上分成四個子電
路
ISP 程式下載電
路
89S51 核心電路
I/O 電路 ( 可再增
加 )
電源電
路
製作步驟 :
1. 電路圖及零件準備
2. 洞洞板上的零件配置規
劃3. 將所有零件銲接固定於洞洞板零件
面上4. 在銲接面完成所有接
線5. 以目測及三用電表檢測電路板好
壞6. 通電實作
零件固定 :
1. 腳座定位 2. 缺口向上 , 注意第一腳
位置
3. 先固定對角兩銲
點
4. 確定腳座貼於零件
面
5. 將所有腳位加錫固
定
6. 所有 DIP 元件均按此要領 (LED 陣列及指撥
開關 )
零件固定 :
1. 固定 8+3 支針腳 ( 零件面不可翹起 , 銲接面針腳過長須剪短後再銲
接固定 )2. 固定 330 歐姆電阻 ( 顏色由左向右或由上
向下 )
固定電阻 , 電容 ,LED,OSC 等兩支腳元
件時 :以手指壓住其中一支腳 , 剪短另一支腳
先銲住剪短的腳位 , 固定後再處理另一
支腳
3. 再固定 6 支針
腳
零件固定 :
1. 固定 LED( 右 P
左 N)( 不可翹起 )
2. 固定振盪器電路
12MHz OSC
及 30p 陶瓷電
容均不分正負
3. 固定 0.1u(104)
電容及其餘 24 支針
腳
零件固定 :
1. 固定 8pin 指撥開關 ( 注意
方向 )2. 固定 9pin 10k 歐姆排阻 ( 打點向右
凸出 )
3. 固定 8 支針
腳
零件固定 :
1. 固定 10x1 LED 陣列 ( 注意方向 : 上 P
下 N)
3. 固定 330 歐姆色碼電阻 ( 控制左邊兩
顆 LED)
2. 固定 9pin 330 歐姆排阻 ( 打點向右
凸出 )
零件固定 :
1. 固定 5V 及 0V 針腳各 1 支
2. 固定電源指示 LED( 左 P 右 N)
3. 固定 470 歐姆限流電阻及 0.1u 濾波
電容
電路接線 : 5V
5V
0V
0V
0V
0V
U1
JP0
JP1
JP2
JP3
JP4
JP5
D1
C1
R1~R5
OSC
C2
C3
電路接線 : 5V
0V
DIP-SW
JP6 PR1
電路接線 :
5V
PR1
JP7
DIP-LED
PR2
R6
R7
電路接線 :
5V
5V
0V
0V
R
D
C
JP+
JP-
5V
5V
5V
電路接線 :
5V 電源可由電源供應器透過 JP+ 及 JP- 饋
入
亦可由電腦 USP 插座獲得
電路檢測 :
1. 以目測配合電路圖檢視電路是否正確 .
2. 以目測及三用電表檢測電路接線是否確實
接妥 .
通電檢測 :
1. 先不接 89S5X, 通上電源 , 電源指示 LED
應點亮 ,
3. 以三用電表歐姆做靜態測試 , 不可短路 .
2. 斷電後 , 接上 89S5X, 再接上電源 ,89S5X
不發燙 .3. 只要插拔任何 IC, 均需先行關閉電
源 .
各元件不發燙 .
1. 有印表機埠的電
腦
連線檢測 :
一 . 硬體接
線 :
連接
連接
2. 傳輸線 (25 公對 25
母 )
3. 轉接線 (25 公對 6pin 杜
邦線 )
連接
送
上
5v
電
源
4. 銲接完成的電路
板
連線檢測 :
一 . 硬體接
線 :
轉接線 (25 公對 6pin 杜邦線 ) 與電路板接
法
2
與
12
腳
直
接
短
路
連線檢測 :
二 . 程式下載軟
體 :
1. 執行下列兩者之一
電腦系統為 2000 或 XP
電腦系統為 98
下載軟體的操作介
面
2.
選
擇
單
晶
片
型
號
3.
取
得
單
晶
片
識
別
碼
4.
若
成
功
則
顯
示
該
晶
片
識
別
碼
若
失
敗
則
仍
顯
示
0
七段顯示器模組接線圖
七段顯示器採用共陽極
com 接至 5V( 一顆
7SEG 只須接一個 com)
限流電阻為 330 歐姆 ,
四分之一瓦特 , 電阻上
方利用 OK 線依序接至
7SEG 之各接腳
針 之定義由左至右依腳
序為 abcdefg, 最右為
dp 小數點
8051 程式發展流程
一.程式撰寫
二.組 ( 編 )
譯
四.程式燒錄(下載)
五.硬體功能測試
三.功能模擬
程式撰寫 ( 編輯 )
組 ( 編 ) 譯
功能模擬
組譯成功
程式燒錄 ( 下載 )
功能正確
硬體功能測試
功能正確
完成
yes
yes
yes
no
no
no
可以寫程式的環境 :
記事本 Keil C 亞將
可以寫的語言種類 :( 給人看的 )
Simlab
8051
mov a,#3ah
djnz 32h,loop
setb 20h.3
Loop:
add a,r4
void cmdb_init (void)
{
cmdndx = 0;
cmdbuf [0] = '0';
}
組合語言
c 語言
副 名檔 : *.asm
*.a
*.a51
副 名檔 : *.c
*.c51
ORG 0H
JMP INITIAL
INITIAL:
MOV R0,#11111100B
LOOP:
MOV P0,R0
CALL DELAY
MOV A,R0
RR A
MOV R0,A
JMP LOOP
DELAY:
MOV R5,#2
D1:
MOV R6,#250
D2:
MOV R7,#200
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
馬燈範例程式跑 ( 組合語言 ):
LED 亮燈數 (2 進制 8 位數 ,0
為亮 )
8051 接線位置 ,P0~P3( 埠 0~ 埠 3)
速度控制 (10 進制 ,1~255)
程式撰寫 ( 編輯 )
組 ( 編 ) 譯
功能模擬
組譯成功
程式燒錄 ( 下載 )
功能正確
硬體功能測試
功能正確
完成
yes
yes
yes
no
no
no
可以組譯的環境 :
Keil C 亞將 Simlab
8051僅可組譯
組合語言
組譯的方式 :
1. 在空白地方按滑鼠右鍵
2. 跳出對話方塊
3. 執行 => 編譯原始
檔
組譯成功的機械碼 (HEX 檔 ):
:10000000010278FC888012000EE803F801047D02EA
:0B0010007EFA7FC8DFFEDEFADDF6227C
:00000001FF
組譯完成的結果 :
成功 : 生產 副 名為檔 :
*.HEX 或 *.TSK 的
機械碼 案檔 ( 給 51 看的 )
失敗 : 重新修改程
式後再組譯
程式撰寫 ( 編輯 )
組 ( 編 ) 譯
功能模擬
組譯成功
程式燒錄 ( 下載 )
功能正確
硬體功能測試
功能正確
完成
yes
yes
yes
no
no
no
可以組譯的環境 :
Simlab
8051
程式撰寫 ( 編輯 )
組 ( 編 ) 譯
功能模擬
組譯成功
程式燒錄 ( 下載 )
功能正確
硬體功能測試
功能正確
完成
yes
yes
yes
no
no
no
1. 使用燒 器燒錄 錄
: 只要該燒 器有支援的型號均可燒錄 錄 ( 包含
AT89S52)
將組譯成功的 HEX 或檔 TSK 檔
2. 具 ISP 功能的 8051:
各廠牌僅能使用其專屬的下載軟體
缺點 :IC 要拔來拔去
優點 :IC 不需拔來拔去
ATMEL:AT89S5X PHILIPS:
P89C51RD2
燒錄 ( 下載 ) 至 8051 上
程式下載 驟步 :
1. 選擇晶片型號
2. 讀入組譯成功的 HEX
檔
3. 執行下載動作
( 外部硬體需先完成傳
輸線連接及通上電源 )
程式撰寫 ( 編輯 )
組 ( 編 ) 譯
功能模擬
組譯成功
程式燒錄 ( 下載 )
功能正確
硬體功能測試
功能正確
完成
yes
yes
yes
no
no
no
1. 利用杜邦排線將 8051 的 PORT 0
與
LED 陣列連接起來
2. 觀察動作情形是否和程式邏輯相符
8051 硬體架
構
8051 接 圖腳
AT89S52
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
8051 部結內
構
1.80511.8051 為為 88 位元位元 (8bits=1Byte)(8bits=1Byte)
微處理機。微處理機。
2.2. 程式記憶體程式記憶體 ROMROM :內建:內建
4Kbytes4Kbytes
(51),8Kbytes(52)(51),8Kbytes(52) 、最多可擴、最多可擴
充充
至至 64 Kbytes64 Kbytes 。機械碼。機械碼 (hex(hex
檔檔 )) 即即
燒錄至此處。燒錄至此處。
3.3. 資料記憶體資料記憶體 RAMRAM :內建:內建 256256
bytes(bytes( 特殊用特殊用 SFR 128SFR 128 個個 ,,
一般一般
用用 128128 個個 )) 、外部最多可擴、外部最多可擴
充至充至
64 Kbytes64 Kbytes 。。4.4. 四組四組可位元定址可位元定址的的 88 位元輸出入埠,即位元輸出入埠,即 P0P0 、、 P1P1 、、 P2P2 及及 P3P3 。。 (( 接各式接各式
輸入輸出裝置輸入輸出裝置 ))
5.5. 一個全雙工串列埠,即一個全雙工串列埠,即 UARTUART 。。 (( 可與電腦做可與電腦做
通訊通訊 ))
8.8. 五個中斷源,即五個中斷源,即 INT0INT0 、、 INT1(INT1( 外部中斷外部中斷 22 個個 )) 、、 T0T0 、、 T1(T1( 內部計時內部計時
計數器中斷計數器中斷
22 個個 )) 、、 RXDRXD 或或 TXD(TXD( 外部外部 UARTUART 中斷中斷 )) 。。9.9. 振盪器。振盪器。 (( 需外接石英振盪需外接石英振盪
4k=4x1024=40964k=4x1024=4096 個記憶體個記憶體
8k=8x1024=81928k=8x1024=8192 個記憶體個記憶體
64k=64x1024=6553664k=64x1024=65536 個記憶體個記憶體
6.26.2 個個 1616 位元計時計數器。位元計時計數器。 (( 可計數可計數 6553665536 次次 ,, 或或 6553665536 個指令週期的個指令週期的
時間時間 ))
7.7. 擴充記憶體用的控制線。擴充記憶體用的控制線。
51 部資料記憶內
體 1.1. 共有共有 256256 個記憶體個記憶體 ,, 位址由位址由 0~255(100~255(10
進制進制 ))
特殊功能
暫存器區 SFR
上 128 個記憶
體
一般功能
暫存器區
下 128 個記憶
體
2.2. 位址習慣用位址習慣用 1616 進制即進制即
00H~FFH00H~FFH3.3. 一般功能暫存器區位址為一般功能暫存器區位址為
00H~7FH(0~127)00H~7FH(0~127)4.SFR4.SFR 位址為位址為 80H~7FH(128~255)80H~7FH(128~255)
5.5. 每個記憶體均為每個記憶體均為 88 位元位元 (( 即即 1Byte)1Byte)
00
FF
H
7F
H
80
H
位址
6.6. 每個記憶體的每個位元能放每個記憶體的每個位元能放 00 或或 11
0 1 0 100 11
7.7. 一個記憶體內的資料範圍為一個記憶體內的資料範圍為
00000000B~11111111B00000000B~11111111B
資料
相當於相當於 1010 進制範圍為進制範圍為 0~2550~255
相當於相當於 1616 進制範圍為進制範圍為 00H~FFH00H~FFH
8.8. 記憶體又稱暫存器記憶體又稱暫存器
51 部資料記憶體內
(SFR)
1.1. 在在 SFR 128SFR 128 個暫存器中僅有個暫存器中僅有 2626 個有用途個有用途 ,, 其餘沒其餘沒
有使用有使用
左圖中左圖中 ,, 每個格子均為一每個格子均為一
個記憶體個記憶體 ,, 左右兩邊數字左右兩邊數字
為位址為位址
2.2. 此此 2626 個記憶體個記憶體 ,, 均有其特定名稱均有其特定名稱 ,, 所以位址並不所以位址並不
重要重要3. ACC3. ACC 為累積器為累積器 ,, 又簡稱又簡稱 A,A, 最為常用最為常用
4. PSW4. PSW 為程式狀態字語為程式狀態字語 ,, 記錄程式執行中的各種狀記錄程式執行中的各種狀
態態5. P0~P35. P0~P3 暫存器直接與暫存器直接與 5151 的外部的外部 I/OI/O 接腳連通接腳連通 ,, 改改
變變
P0~P3P0~P3 之值之值 ,, 即可改變接腳的電壓準位即可改變接腳的電壓準位 ,, 或改變外或改變外
部部 I/OI/O
6.6. 其餘暫存器亦各有其負責的其餘暫存器亦各有其負責的
功功
能能 ,, 如計時計數的設定如計時計數的設定 ,, 中中
斷的斷的
控制控制 ,, 串列傳輸控制串列傳輸控制 ,, 電源電源
控制控制
等等…等等…
例例 : MOV A,#5AH: MOV A,#5AH
MOV P3,AMOV P3,A
CPL ACPL A
JBJB
PSW.4,LOOPPSW.4,LOOP
8F8F
51 部資料記憶體內 ( 一般
用 ) 7F
H
位址 資料
00
H
1F
H
20
H
2F
H
30
H
可位元定址區
16 個
BANK0~BANK
3
暫存器庫
32 個
一般暫存器
80 個
R0
R1
R2
R3
R4
R5
R6
R7
R0
R1
R2
R3
R4
R5
R6
R7
R0
R1
R2
R3
R4
R5
R6
R7
R0
R1
R2
R3
R4
R5
R6
R7
BANK
0
BANK
1
BANK
2
BANK
3
沒有額外
設定均選
擇
BANK0
例例 : MOV R5,#2: MOV R5,#2
DJNZ R7,$DJNZ R7,$
MOV A,R3MOV A,R3
ORL A,R0ORL A,R0
例例 : MOV 6AH,#C2H: MOV 6AH,#C2H
ADD A,30HADD A,30H
MOV 4BH,33HMOV 4BH,33H
CJNECJNE
A,55H,LOOP3A,55H,LOOP3
ANL 70H,#AAHANL 70H,#AAH
SETB 30H.4SETB 30H.4 (x)(x)
CLR 46H.0CLR 46H.0 (x)(x)
例例 : MOV: MOV
28H,#01001001B28H,#01001001B
SETB 20H.7SETB 20H.7
CLR 2CH.1CLR 2CH.1
JB 26H.3,LOOP2JB 26H.3,LOOP2
.7 .6 .1.5 .4 .3 .2 .0
馬燈範例程式跑
外部硬體接線圖
LED 為低態動作
即 P0 輸出 1
時熄
1
1
1
1
1
1
1
1
=1
0
0
0
0
0
0
0
0
P0 當成輸出
埠可輸出 0 或 1
0:0V 1:5V
P0 輸出 0 時亮
ORG 0H ;ROM 位址 0H
JMP INITIAL ; 跳至 INITIAL
INITIAL:
MOV R0,#11111100B ; 設定亮兩燈
LOOP:
MOV P0,R0 ; 送至 P0 輸出
CALL DELAY ; 延時呼叫
MOV A,R0 ;R0 資料送至 A
RR A ; 將 A 資料右移
MOV R0,A ; 將資料回存
JMP LOOP ; 跳至 LOOP
;=================================
DELAY: ; 延時副程式
MOV R5,#2
D1:
MOV R6,#250
D2:
MOV R7,#200
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET ; 返回主程式
;=================================
END ; 程式結束
範例程式架構
1. 標籤欄 : 呼叫副程式或
程式跳躍時使用 , 同一
個程式 的標籤不可內
重複
2. 運算子欄 : 即指令 ,51
指令集共有 111 個指令
( 不含假指令 )
3. 運算元欄 : 該指令運算
或操作的對象或數值
4. 註解欄 : 可有可無 , 前
面要加分號 , 加程式增
的可讀性
指令 明說
:
MOV
R0,#11111100B
A
R0
R2
35
H
6A
H
P0
1111
1100
MOV
A,R0
1111
1100
MOV
35H,#3DH
0011
1101
MOV
A,#16
0001
0000
MOV R2,A
0001
0000
MOV
6AH,35H
0011
1101
MOV
35H,A
0001
0000
MOV
P0,R2
0001
0000
沒有這種指令:
MOV R2,R0
若真的要將 R0 之值儲存至
R2MOV
A,R0MOV
R2,A
或
MOV
35H,R0MOV
R2,35H
指令 明說
:
程式之執行一般都是往下執
行 , 一行接一行 , 但有時需
要跳至其它程式區段去執行
, 因此需要跳躍指令
“ 呼叫”是跳躍指令的一種 ,
但這種跳躍是需要返迴的 .
因此需搭配“返迴”指令 , “ 呼
叫”一般用 “ CALL” 即可 ,
後面接的即為目的地標籤 ,
標籤名稱自行決定 . 返迴是
回到 CALL 的下一行 . 若沒
有返迴 , 則會有錯誤 .
MOV A,#F3H
MOV P0,R0
CALL DELAY
MOV A,R0
.
.
DELAY:
.
.
RET
指令 明說
:
“ 直接跳躍”指令是無條件的
跳躍 , 也不需要返迴 . 一般
用 “ JMP” 即可 , 後面接的
即為要跳到的目的地標籤 ,
標籤名稱自行決定 .
.
.
MOV A,#F3H
MAIN:
MOV P0,R0
MOV A,R0
.
.
JMP MAIN
指令 明說
:
假設 A 的內容原先為 1100
1110
A
R0
1100
1110
1110
1100
A
PSW1
假設 PSW.7(C) 的內容為 1
SWAP A
RR
A
0111
0110
RRC
A
1011
1011
0
CPL A
0100
0100
RL A
1000
1000
RLC
A
0001
0000
CLR
A
0000
0000
沒有以下這些指令:
RL R0 RRC 35H
SWAP P2
CLR R7 CPL 28H
若真的要將 R0 之值左
旋 :MOV A,R0
RL A
MOV R0,A
ORG 0H ;ROM 位址 0H
JMP INITIAL ; 跳至 INITIAL
INITIAL:
MOV R0,#11111100B ; 設定亮兩燈
LOOP:
MOV P0,R0 ; 送至 P0 輸出
CALL DELAY ; 延時呼叫
MOV A,R0 ;R0 資料送至 A
RR A ; 將 A 資料右移
MOV R0,A ; 將資料回存
JMP LOOP ; 跳至 LOOP
;=================================
DELAY: ; 延時副程式
MOV R5,#2
D1:
MOV R6,#250
D2:
MOV R7,#200
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET ; 返回主程式
;=================================
END ; 程式結束
範例程式在 51 部動作情形內
R0
P0
A
1111110
0
P0 上的 8 顆
LED
RA
M
0111111
0
1111110
0
1111110
0
0111111
0
0111111
0
0011111
1
0011111
1
0011111
1
直
接
通
連
開始
將初始
值放入 R0
將 R0 內容
輸出至 P0
呼叫延遲
副程式
將 R0 內容
放入 A
將 A 內容
右移一位
將 A 內容
回存 R0
DELAY
將最外層重複
次數載入 R5
將中間層重複
次數載入 R6
將最內層重複
次數載入 R6
R7-1=0?
R6-1=0?
R5-1=0?
RET
範例程式流程圖
INITIAL
LOO
P
D2
D1
ORG 0H ;ROM 位址 0H
JMP INITIAL ; 跳至 INITIAL
INITIAL:
MOV R0,#11111100B ; 設定亮兩燈
LOOP:
MOV P0,R0 ; 送至 P0 輸出
CALL DELAY ; 延時呼叫
MOV A,R0 ;R0 資料送至 A
RR A ; 將 A 資料右移
MOV R0,A ; 將資料回存
JMP LOOP ; 跳至 LOOP
;=================================
DELAY: ; 延時副程式
MOV R5,#2
D1:
MOV R6,#250
D2:
MOV R7,#200
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET ; 返回主程式
;=================================
END ; 程式結束
設計霹靂燈程式
兩燈連續右移六次後 , 再換成連續左移六次……不
斷循環
跑馬燈為不斷右
移
計次迴圈的運用 :
D:Rn 或 direct 減
1J: 跳躍至 rel
N: 非
Z: 零
Rn:R0~R7
direct:20H~7FH
rel: 跳躍的目的地
標籤 ( 自行命
名 )
1
2
3
4
減 1 非 0 則跳
躍
減 1 為 0 則往
下
結論
:
右移動作 ( 含延時
及輸出 )
R2-1=0?
設定右移次數 =6 次
( 令 R2=6)
計次迴圈的運用 :
.
MOV R2,#6
RIGHT:
.
.
( 程式片段 )
.
.
DJNZ R2,RIGHT
.
RIGHT
右移動作 ( 含延時
及輸出 )
3AH-1=0?
設定右移次數 =6 次
( 令 3AH=6)
.
MOV 3AH,#6
RIGHT:
.
.
( 程式片段 )
.
.
DJNZ 3AH,RIGHT
.
RIGHT
沒有以下這些指令:
DJNZ A,RIGHT
DJNZ P0,RIGHT
DJNZ 3AH,$
代表 3AH 減 1 後非 0 就跳
回自己
減 1 後為 0 則往下執行 ,
$ 非標籤
開始
將初始
值放入 R0
設定右移次數
R2=6 次
輸出 , 延時 , 右移
DELAY
延時副程式 ( 略 )
RET
INITIAL
RIGHT
R2-1=0?
設定左移次數
R2=6 次
輸出 , 延時 , 左移
R2-1=0?
LEFT
將初始
值放入 R0
霹靂燈程式流程圖
8051 的時
序
何謂指令週期:
1.1. 在在 80518051 的的 1818 及及 1919 腳接上石英晶體振盪器腳接上石英晶體振盪器 (( 以以
12MHz12MHz 為例為例 ))
2.2. 則則 80518051 所收到的振盪頻率為所收到的振盪頻率為 12MHz12MHz
3.3. 振盪週期振盪週期 = == =
uSuS
11
12M12M
11
1212
4.4. 指令週期指令週期定義定義為振盪週期的為振盪週期的 1212 倍倍即即
== 1uS1uS
5.5. 同理若外接同理若外接 4MHz4MHz 的的石英晶體振盪器石英晶體振盪器 ,, 則指令週期應為則指令週期應為 3uS3uS
6.6. 石英晶體振盪器的頻率愈高石英晶體振盪器的頻率愈高 ,, 則指令週期愈短則指令週期愈短 ,CPU,CPU 處理時間愈短處理時間愈短 ,, 效能效能
也就愈好也就愈好
7.AT89S5X7.AT89S5X 系列依系列依 DATASHEETDATASHEET 指示指示 ,, 最高可外接最高可外接 33MHz33MHz 的石英晶體振的石英晶體振
盪器盪器
指令週期的影響 ( 以 12MHz 為
例 ) :
代表執行本指令代表執行本指令 11 次須花費次須花費 2424
個振盪週期即個振盪週期即 22 個指令週期即個指令週期即
2uS2uS
DJNZ
R6,D2
指令週期的影響 ( 以 12MHz 為
例 ) :
代表執行本指令代表執行本指令 11 次須花費次須花費 1212
個振盪週期即個振盪週期即 11 個指令週期即個指令週期即
11uSuS
MOV
R7,#200
不同的 MOV 動作所耗費的時間也會有所
不同
指令週期的影響 ( 以 12MHz 為
例 ):
80518051 的的 111111 個指令中個指令中 ,, 此二指令此二指令
所花費時最長所花費時最長 ,, 達達 4uS4uS
ORG 0H
JMP INITIAL
INITIAL:
MOV R0,#11111100B
LOOP:
MOV P0,R0
CALL DELAY
MOV A,R0
RR A
MOV R0,A
JMP LOOP
;================
DELAY:
MOV R5,#2
D1:
MOV R6,#250
D2:
MOV R7,#200
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
;================
END
範例程式時序分析 ( 以 12MHz 為
例 ):
2
1
1
1
2
如果本程式不加入 CALL DELAY
程 式 , 結果會如何 ?
結果 : 在 LOOP 迴圈內 , 只須 7uS 即
可完成
一輪 , 即 LED 每 7uS 就右旋一次 ,
人
的肉眼無法反應 , 只能看到所有
LED 均在微亮 ( 還是有右旋 , 只是
太快 )
因此加入延時副程式 , 將 LED 每
次亮的時間延長使人眼可以看的
出來右旋現象為止
2
.
.
MOV P0,R0
CALL DELAY
MOV A,R0
.
.
;================
DELAY:
MOV R5,#2
D1:
MOV R6,#250
D2:
MOV R7,#200
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
;================
END
延遲時間之計算 ( 以 12MHz 為例 ):
2
2
1
1
2
2
2
1
2
X200
X250
X250
X250
X2
X
2
X
2 X
2X
2
1
2
500
200000
100
04
2
合計 201511 個指令
週期即延遲 201511uS
大約為 0.2 秒
即每 0.2 秒 LED 右
旋一次
若 R5 放 5 則延遲
0.5 秒若 R5 放 20 則延遲 2
秒依此類推
由此可知 : 本程式中 ,CPU 大部份時間是在進行延時工作
(7:201511)而無法去做其它事情 , 此為致命缺點 , 若能使用計時器 , 則
次每 call delay 時間不同的做法 :
1. 寫不同的副程式
.
CALL DELAY_0.3S
.
CALL DELAY_1S
.
;========================
DELAY_0.3S:
MOV R5,#3
D1_0.3:
MOV R6,#250
D2_0.3:
MOV R7,#200
DJNZ R7,$
DJNZ R6,D2_0.3
DJNZ R5,D1_0.3
RET
;========================
DELAY_1S:
MOV R5,#10
D1_1:
MOV R6,#250
D2_1:
MOV R7,#200
DJNZ R7,$
DJNZ R6,D2_1
DJNZ R5,D1_1
RET
2. 呼叫前先設定時間
.
MOV R5,#3
CALL DELAY
.
MOV R5,#10
CALL DELAY
.
;========================
DELAY:
D1:
MOV R6,#250
D2:
MOV R7,#200
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
8051 輸入埠的應
用
8051 與開關的連接
:
按鈕開關 切換 ( 指撥 ) 開關
(a)(c) 為低態動作 : 開關 on=>8051 得到 0 訊
號 開關 off=>8051 得到 1 訊
號
(b)(d) 為高態動作 : 開關 on=>8051 得到 1 訊
號 開關 off=>8051 得到 0 訊
號
10k 電阻稱為上拉電阻 (pull up)
470 電阻稱為下拉電阻 (pull
8051 程式如何判斷開關狀
態 :
開關的 on 或 off 代表著 8051 要做兩種不同的
處置因此 8051 需要用檢 指令來檢 接 收到的查 查 腳
訊號是 0 或 1, 進而去執行相對應的功能
P2.3
檢 指令查 (1) :
JB
P2.3,ABCDE
.
.
JB P2.3,ABCDE
.
.
(P2.3=0 則執行此段程式 )
.
.
ABCDE:
.
.
(P2.3=1 則執行此段程式 )
.
.
記法 :1 跳 0 往
下
第二種處置
P2.3=1?
第一種處置
ABCDE:
1
0
檢 指令查 (2) :
JNB
P2.3,KEY_DOWN
.
.
CHECK:
JNB
P2.3,KEY_DOWN
JMP CHECK
.
.
KEYDOWN:
.
.
(P2.3=0 則執行此段程式 )
.
.
記法 :0 跳 1 往
下
P2.3=0 的處置
P2.3=0?
KEY_DOWN:
0
1
CHEC
K:
檢 指令查 (3) :
JB 及 JNB 指令不僅可以對 PORT0~PORT3 等
32 位元做檢 動作查 , 亦可對其它種類位元做檢
查 :
JB ACC.6,LOOP ;(ACC 即為 A)
JNB 28H.0,$
JNB PSW.4,MAIN
JB TF0,TIME_UP
範例程式 1:
功能 : 八個指撥開關對應到八個 LED, 開關
ON,LED 亮 . 開關 OFF,LED 熄 .
LED 接在 P0(P0
當輸出 ), 開關接
在 P2(P2 當輸
入 ), 均為低態動
作
範例程式 1:
SETTING
:
LOOP
:
ORG 0
SETTING:
MOV P2,#FFH
LOOP:
MOV A,P2
MOV P0,A
JMP LOOP
END
若 P2 上的開關如右
則 P2 暫存器的 容為內
11001110
P
2P
0
A
1100 1110
1100 1110
1100 1110
RA
M
若 P2 上的開關變成如
右
範例程式 2:
功能 :( 以四個指撥開關控制 LED 的四種狀
態 )
SW0(P2.0)
ON:SW1(P2.1)
ON:SW2(P2.2)
ON:SW3(P2.3)
ON:
開關全 OFF:
LED 全熄
狀態零
CASE0:
1
0
開始
規劃 P2 為輸入埠
P2.0=0?
SW0
狀態一
1
P2.1=0?
SW1
狀態二
1
P2.2=0?
SW2
狀態三
P2.3=0?
SW3
1
0
0
0
SETTING
:
LOOP
:
CASE1:
CASE2:
CASE3:
ORG 0
SETTING:
MOV P2,#FFH
LOOP:
JNB P2.0,CASE0
JNB P2.1,CASE1
JNB P2.2,CASE2
JNB P2.3,CASE3
MOV P0,#11111111B
JMP LOOP
CASE0:
MOV P0,#00111100B
JMP LOOP
CASE1:
MOV P0,#00000000B
JMP LOOP
CASE2:
MOV P0,#11000011B
JMP LOOP
CASE3:
MOV P0,#10101010B
JMP LOOP
END
範例程式 2:
範例程式 2:
問題 :
若有一個以上的開關 ON,
則 51 會去執行那一個 態狀
?
改進 :( 僅使用二個指撥開關 )
SW
1
SW
0OF
F
OF
F
OF
F
ON
ON OF
FON ON
狀態零
P2.0=0?
SW0
NO(1)
提示:
YES(0)
P2.1=0?
SW1
NO(1)
P2.1=0?
SW1
NO(1)
YES(0)
狀態一
狀態二
狀態三
YES(0)
(10)
(11)
(00)
(01)
LOOP
:
範例程式 3:
功能 : 以指撥開關模擬按鈕開
關 SW0=>PB0 按鈕 SW1=>PB1
按鈕若 PB0(ON) 按一下 , 則
P0.0 上的 LED 亮 . 若
PB1(OFF) 按一下 , P0.0 上的
LED 熄 .
PB0(O
N) PB1(OF
F)
M
M/
a
範例程式 3:
只讓一顆燈 ON 或 OFF=>( 只控制一位元為 0
或 1)
SETB P0.0 ; 將 P0.0 腳位直接設定為 1
CLR P0.0 ; 將 P0.0 腳位直接清除為 0
CPL P0.0 ; 將 P0.0 腳位由 0 變 1 或 1 變
0( 取補數 )
範例程式 3:
ORG 0
SETTING:
MOV P2,#FFH
LOOP:
JNB P2.0,LED_ON
JNB P2.1,LED_OFF
JMP LOOP
LED_ON:
CLR P0.0
JMP LOOP
LED_OFF:
SETB P0.0
JMP LOOP
END
LED_ON
:
SETTING
:
LOOP
:
LED_OFF:
(0
)
(0
)
(1
)
(1
)
若將 SW0 及 SW1 同時
按下 :
LED 會亮 , 此為通電優
先如何改成停止優先 ?
LED_ON
:
SETTING
:
LOOP
:
LED_OFF:
(0
)
(0
)
(1
)
(1
)
PB0
PB1
程式設計 :
SW
1
SW
0
OF
F
OF
F
OF
F
ON
ON OF
FON ON
馬燈跑 ( 單燈慢
速 )霹靂燈 ( 雙燈快
速 )左四燈與右四燈互閃 ( 慢
速 )八燈全亮全熄閃爍 ( 慢速 )
(P2.1) (P2.0)
程式 1 功能
:
程式 1 提示
:
跑馬燈
P2.0=0?
SW0
NO(1)
YES(0)
P2.1=0?
SW1
NO(1)
P2.1=0?
SW1
NO(1)
YES(0)
霹靂燈
左右互閃
八燈閃爍
YES(0)
LOOP
:
進入四個 態之一後狀 , 須定時返回
LOOP 標籤重新檢 開關的最新查 狀
態 , 讓 LED 可以隨時切換亮燈 態狀
若沒有返回 LOOP 再次檢 開關查
態狀 , 則程式會陷入該 態持續執狀
行而不會有切換至其它 態的機會狀
跳回 LOOP 的時機很重要 , 通常會
跟迴圈有關係 , 並且要注意初始值
設定的問題 ( 以完成一週期後再跳
回 LOOP 較為簡單 )
一週期
一週期
一週期
一週期
NO
NO
NO
NO
YES
YES
YES
YES
SW1=>PB1(OFF 按鈕 )
(P2.1)
SW0=>PB0(ON 按鈕 )
(P2.0)
SW2=>TH-
RY(P2.2)LED0=> 燈綠
(P0.0)
LED2=> 紅燈 ( 電磁開關 )
(P0.2)
LED1=> 燈黃
(P0.1)
LED3=> 蜂鳴器 (P0.3)
功能
: 1.PB0 按一下 , 燈熄綠 , 燈亮黃 ,3 秒
後 , 燈熄黃 , 紅燈亮 .PB1 按一下則紅
燈熄 , 燈亮綠 .( 先完成此局部功能再
處理下列功能 )
2. 若在紅燈亮時 ,TH-RY 動作則紅燈
熄 , 蜂鳴器動作 , 燈亮綠 .TH-RY 復
歸後 , 蜂鳴器停止動作 , 燈恆亮綠 .
程式 2 功能:
程式 2 提示
:
1. 斷電優先
紅黃燈熄
綠燈亮
PB1(OFF)
按下 ?
NO
YES
TH-RY
動作 ?
NO
PB0(ON)
按下 ?
N
O 綠燈熄
黃燈亮
LOOP
:
綠燈亮?
YES
清除
蜂鳴器
OFF:
N
O
3秒
黃燈熄
紅燈亮
YES
ON:
紅黃燈熄
綠燈亮
蜂鳴器動作
THRY:
YES
2. 燈亮的三秒鐘黃 內 , 按下
OFF
開關會沒有 法停辦
止 ,WHY?
程式 3 功能:
請撰寫小便斗自動沖水裝置之控制程式
SW0=> 距離感測器
(P2.0)
LED0=> 電源指示 ( 燈綠 )(P0.0)
LED2=> 沖水閥 (P0.2)
LED1=> 人體接近 ( 紅燈 )
(P0.1)
表法查
馬燈及霹靂燈的特色:跑
馬燈及霹靂燈的動作都是有規則的跑
馬燈為不斷地往左移跑 ( 或往右 )
霹靂燈為往左 ( 右 ) 移一定次數後再
往右 ( 左 ) 移一定次數…不斷重複
以上動作可用左移右移指令配合計次
迴圈指令即可達成
若亮燈 態沒有規則狀 , 則上述方法已
不敷使用 , 須藉 表法完成查
問題描述 ( 範例程式
1): P0 上 LED 的
態狀1
2
3
4
5
6
7
8
9
1
011
1
21
31
4
P0 暫存器 之內 值
11111111
11111110
11111100
11111000
11110000
11100000
11000000
10000000
00000000
11111111
11100111
11000011
10000001
00000000
ORG 0H
START:
MOV P0,#11111111B ;1
CALL DELAY
MOV P0,#11111110B ;2
CALL DELAY
MOV P0,#11111100B ;3
CALL DELAY
MOV P0,#11111000B ;4
CALL DELAY
MOV P0,#11110000B ;5
CALL DELAY
MOV P0,#11100000B ;6
CALL DELAY
MOV P0,#11000000B ;7
CALL DELAY
MOV P0,#10000000B ;8
CALL DELAY
MOV P0,#00000000B ;9
CALL DELAY
MOV P0,#11111111B ;10
CALL DELAY
MOV P0,#11100111B ;11
CALL DELAY
MOV P0,#11000011B ;12
CALL DELAY
MOV P0,#10000001B ;13
CALL DELAY
MOV P0,#00000000B ;14
CALL DELAY
JMP START
DELAY:
; 略
一般寫法 :
缺點 :(1) 態愈多程式愈長狀
(2) 寫法死板沒有彈性
1
2
3
4
5
6
7
8
9
1
011
1
21
31
4
表法的原理查
: 將 LED 的亮燈 態狀 直接寫成程式碼 ( 透過 DB 指令 )
並燒寫至 8051 的 ROM 內 , 待程式執行後 , 再以查
表指令 MOVC 將 態 詢複製到狀 值查 RAM 的 ACC
內 , 再予以輸出至 P0
TAB_START:
DB 11111111B
DB 11111110B
DB 11111100B
DB 11111000B
DB 11110000B
DB 11100000B
DB 11000000B
DB 10000000B
DB 00000000B
DB 11111111B
DB 11100111B
DB 11000011B
DB 10000001B
DB 00000000B
1111 1111
1111 1110
1111 1100
1111 1000
1111 0000
1110 0000
1100 0000
1000 0000
1100 0011
1000 0001
0000 0000
..
RO
M
燒錄
RA
MACC
表
查
ORG 00H
INITIAL:
MOV DPTR,#TAB_START
MOV R0,#0
MOV R1,#14
LOOP:
MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
CALL DELAY
INC R0
DJNZ R1,LOOP
JMP INITIAL
;
=================================
===
TAB_START:
DB 11111111B
DB 11111110B
DB 11111100B
DB 11111000B
DB 11110000B
DB 11100000B
DB 11000000B
DB 10000000B
DB 00000000B
DB 11111111B
DB 11100111B
DB 11000011B
DB 10000001B
DB 00000000B
;
=================================
===
DELAY:
MOV R5,#3
D1:
MOV R6,#200
D2:
MOV R7,#250
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
;
=================================
===
範例程式 1 程式
碼 : ( 使用 表查
法 )
表格
行號 地址 機械碼 程式碼
1 ORG 00H
2 INITIAL:
3 0000 900013 MOVDPTR,#TAB_START
4 0003 7800 MOV R0,#0
5 0005 790E MOV R1,#14
6 LOOP:
7 0007 E8 MOV A,R0
8 0008 93 MOVC A,@A+DPTR
9 0009 F580 MOV P0,A
10 000B 120021 CALL DELAY
11 000E 08 INC R0
12 000F D9F6 DJNZ R1,LOOP
13 0011 0100 JMP INITIAL
14 TAB_START:
15 0013 FF DB 11111111B
16 0014 FE DB 11111110B
17 0015 FC DB 11111100B
18 0016 F8 DB 11111000B
19 0017 F0 DB 11110000B
20 0018 E0 DB 11100000B
21 0019 C0 DB 11000000B
22 001A 80 DB 10000000B
23 001B 00 DB 00000000B
24 001C FF DB 11111111B
25 001D E7 DB 11100111B
26 001E C3 DB 11000011B
27 001F 81 DB 10000001B
組合語言與機械碼的對照 (LST 檔 ):
組
合
語
言
機
械
碼
(ROM)
組譯器
行號 地址 機械碼 程式碼
1 ORG 00H
2 INITIAL:
3 0000 900013 MOVDPTR,#TAB_START
4 0003 7800 MOV R0,#0
5 0005 790E MOV R1,#14
6 LOOP:
7 0007 E8 MOV A,R0
8 0008 93 MOVC A,@A+DPTR
9 0009 F580 MOV P0,A
10 000B 120021 CALLDELAY
11 000E 08 INC R0
12 000F D9F6 DJNZ R1,LOOP
13 0011 0100 JMP INITIAL
14 TAB_START:
15 0013 FF DB 11111111B
16 0014 FE DB 11111110B
17 0015 FC DB 11111100B
18 0016 F8 DB 11111000B
19 0017 F0 DB 11110000B
20 0018 E0 DB 11100000B
21 0019 C0 DB 11000000B
22 001A 80 DB 10000000B
23 001B 00 DB 00000000B
24 001C FF DB 11111111B
25 001D E7 DB 11100111B
26 001E C3 DB 11000011B
27 001F 81 DB 10000001B
組合語言與機械碼的對照 (LST 檔 ):
MOV A,R0 被譯成 E8 並燒至 ROM 的
0007H 位址
MOV P0,A 被譯成 F5 及 80 並燒至 ROM 的 0009H
及 000AH 位址CALL DELAY 被譯成 12 及 00 及 21 並燒至 ROM
的 000BH 及 000CH 及 000DH 位址
標籤不是指令 , 所以不會被譯成機械碼 , 但標籤代表一
個 ROM 的位址 ( 跳躍用 , 呼叫用或查表用 )
假指令是給組譯器看的 , 並不會被譯成機械
碼
資料 ( 機械
碼 )
位址
1001 0000
0000 0000
0001 0011
0111 1000
0000 0000
0111 1001
0000 1110
1110 1000
1001 0011
1101 1101
1111 0110
0010 0010
0000
H0001
H0002
H0003
H0004
H0005
H0006
H0007
H0008
H
002B
H002C
H002D
1111 0101
1000 0000
0009
H000A
H
…
…
ROM
的
容
內
行號 地址 機械碼 程式碼
14 TAB_START:
15 0013 FF DB
11111111B
16 0014 FE DB
11111110B
17 0015 FC DB
11111100B
18 0016 F8 DB
11111000B
19 0017 F0 DB
11110000B
20 0018 E0 DB
11100000B
21 0019 C0 DB
11000000B
22 001A 80 DB
10000000B
23 001B 00 DB
00000000B
24 001C FF DB
11111111B
25 001D E7 DB
表格部 程式碼及機械碼份 :
表格資料共 14 筆 , 從 ROM 的位址 0013H
開始放置 , 最後一筆的位址為 0020H
表格的啟始位址為 0013H, 由
TAB_START 標籤代表 , 因此撰寫程式時 ,
毋須了解表格內容放在那裡 , 只要有啟始標
籤即可 , 而且啟始位址為查表時重要依據 ,
視為基準量 ( 其值固定不變 ).
查表時 , 一次只能查一個位址的資料 , 例如
要查” C0”( 位址為 0019H) 這筆資料 , 則要
以 0013H+6 的方式來取得 , 其中 0013H
即為 TAB_START( 基準量 ),6 為偏移量
亦即只要控制偏移量之值 ( 不超過 13), 即
可讀取到表格中任一值
此例中 , 偏移量之範圍為 0~13
ORG 00H
INITIAL:
MOV DPTR,#TAB_START
MOV R0,#0
MOV R1,#14
LOOP:
MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
CALL DELAY
INC R0
DJNZ R1,LOOP
JMP INITIAL
;
=================================
===
TAB_START:
DB 11111111B
DB 11111110B
DB 11111100B
DB 11111000B
DB 11110000B
DB 11100000B
DB 11000000B
DB 10000000B
DB 00000000B
DB 11111111B
DB 11100111B
DB 11000011B
DB 10000001B
DB 00000000B
;
=================================
===
表的方式查 :
1. 先將表格 始位址 存至啟 DPTR 暫存器內 MOV DPTR,#TAB_START
2. 將 A 存入要 詢的資料的偏移量查 (0~13) MOV A,R0 ; 此時 A 內容為偏
移量
3. 利用 MOVC 指令 表查 MOVC A,@A+DPTR ; 此時 A 內容為對應的表格資
料
4. 再將 到資料輸出至查 P0 MOV P0,A
MOV 為 RAM 部的資料內
轉移 MOVC 為 ROM 複製
至 RAM
DPTR 為 RAM 部的暫存內
器是由 DPH 及 DPL 組成 ,
共 16 位元是 表法專用的查
1
2
3
4
表法的動作原理查 :
ORG 00H
INITIAL:
MOV DPTR,#TAB_START
MOV R0,#0
MOV R1,#14
LOOP:
MOV A,R0
MOVC A,@A+DPTR
MOV P0,A
CALL DELAY
INC R0
DJNZ R1,LOOP
JMP INITIAL
;
=================================
===
TAB_START:
DB 11111111B
DB 11111110B
DB 11111100B
DB 11111000B
DB 11110000B
DB 11100000B
DB 11000000B
DB 10000000B
DB 00000000B
DB 11111111B
DB 11100111B
DB 11000011B
DB 10000001B
DB 00000000B
;
=================================
===
DP
L
DP
HDPT
R
A
P0
R0
R1
RAM 內
容
…
資料 ( 機械
碼 )
位址
1111 1111
1111 1110
1111 1100
1111 1000
1111 0000
1110 0000
1100 0000
1000 0000
0000 0000
1100 0011
1000 0001
0000 0000
0013
H0014
H0015
H0016
H0017
H0018
H0019
H001A
H001B
H
001E
H001F
H0020
H
1111 1111
1110 0111
001C
H001D
H
ROM 表內
格
…
……
…
0000
00000001
0011
0偏移
量
1
4
計次迴圈
01111
1111
1111
1111
1
1
3
11111
1110
1111
1110
P0 上的
LED
2
1
2
21111
1100
1111
1100
範例程式 2:
自行設計 8 顆 LED 之廣告燈 ( 至少 50 種
狀態 )問題 : 最多可使用多少種狀
態 ?
範例程式 3:
自行設計 10 顆 LED 之廣告燈
提示 :8 顆接 P0,2 顆接 P2, 建表時
連續兩個表格內容視為同一筆資料 , 迴
圈跑一次 , 要查兩次表 , 一次
輸出至 P0, 另一次輸出至 P2,
然後才延時一次 .
TAB_START:
DB
11100000B ;P0
DB
11111111B ;P2
DB
00011111B ;P0
DB
1
2
3
範例程式 4:
自行設計 8 顆 LED 之廣告燈 (DELAY 時間不
同 )提示 : 建表時第一筆資料為延時時間 , 第
二筆資料為 LED 狀態 ( 兩筆資料為一組 ),
同一迴圈要查兩次表 TAB_START:
DB 5 ;0.5
秒
DB 11110000B
;LED
DB 10 ;1 秒
DB 00001111B
;LED
DB 2 ;0.2
秒
DB 11000011B
;LED
.
.
1
2
3
範例程式 5:
同上題 , 改為 10 顆
LED
範例程式 6:
設計紅綠燈程式 ( 綠燈不閃爍型及綠燈閃爍
型 )
表法查 FOR 七段顯示
器
七段顯示器介紹 :
共陽極 :
330x
8
5
V
5
V805
1P0~P
3
1 1 1 1 1 1 1 10 0
七段顯示器介紹 :
共陰極 :
0
V
0
V
805
1P0~P
3
0 0 0 0 0 0 0 011111
七段顯示器介紹 :
共陽極 :
0 1 0 0 1 0 0 1 5
a b c d e f g dp 顯示
0 0 0 0 0 0 1 1 0
1 0 0 1 1 1 1 1 1
0 0 1 0 0 1 0 1 2
0 0 0 0 1 1 0 1 3
1 0 0 1 1 0 0 1 4
1 1 0 0 0 0 0 1 6
0 0 0 1 1 1 1 1 7
0 0 0 0 0 0 0 1 8
0 0 0 1 1 0 0 1 9
1 1 1 1 1 1 1 1 全熄
七段顯示器介紹 :
共陰極 :
1 0 1 1 0 1 1 0 5
a b c d e f g dp 顯示
1 1 1 1 1 1 0 0 0
0 1 1 0 0 0 0 0 1
1 1 0 1 1 0 1 0 2
1 1 1 1 0 0 1 0 3
0 1 1 0 0 1 1 0 4
0 0 1 1 1 1 1 0 6
1 1 1 0 0 0 0 0 7
1 1 1 1 1 1 1 0 8
1 1 1 0 0 1 1 0 9
0 0 0 0 0 0 0 0 全熄
七段顯示器介紹 :
共陽極 :
以 8051 控制 7-SEG 可用如下指令 :
MOV P0,#10011111B ; 顯示 1
MOV P0,#10011001B ; 顯示 4
…
如此太過繁瑣 , 程式 大時龐 , 更顯麻煩
若能將 0~9 的顯示碼建立表格 , 用 表查
方式尋得後再予以輸出顯示 , 較為方便
TABLE:TABLE: ; abcde; abcde ff ggdpdp
DBDB 0000001000000111BB ;; 共陽極之共陽極之 00
DBDB 1001111100111111BB ;; 共陽極之共陽極之 11
DBDB 0010010001001011BB ;; 共陽極之共陽極之 22
DBDB 0000110000011011BB ;; 共陽極之共陽極之 33
DBDB 1001100100110011BB ;; 共陽極之共陽極之 44
DBDB 0100100010010011BB ;; 共陽極之共陽極之 55
DBDB 1100000110000011BB ;; 共陽極之共陽極之 66
DBDB 0001111000111111BB ;; 共陽極之共陽極之 77
DBDB 0000000000000011BB ;; 共陽極之共陽極之 88
DBDB 0001100000110011BB ;; 共陽極之共陽極之 99
1. 若偏移量為 0 則可查
到
0 的顯示碼 , 依此類推
2. 顯示碼的排序須依據
0~9 的順序排列
3. 偏移量的範圍為 0~9
不可超過
七段顯示器介紹 :
共陽極 :
建立表格方式:
TABLE:TABLE:
DBDB 00000011B00000011B
DBDB 10011111B10011111B
DBDB 00100101B00100101B
DBDB 00001101B00001101B
DBDB 10011001B10011001B
DBDB 01001001B01001001B
DBDB 11000001B11000001B
DBDB 00011111B00011111B
DBDB 00000001B00000001B
DBDB 00011001B00011001B
二進制 ( 一列一資料 )
TABLE:TABLE:
DBDB 03H03H
DBDB 9FH9FH
DBDB 25H25H
DBDB 0DH0DH
DBDB 99H99H
DBDB 49H49H
DBDB C1HC1H
DBDB 1FH1FH
DBDB 01H01H
DBDB 19H19H
十六進制
( 一列一資料 )
=
TABLE:TABLE:
DBDB 33
DBDB 159159
DBDB 3737
DBDB 1313
DBDB 153153
DBDB 7373
DBDB 193193
DBDB 3131
DBDB 11
DBDB 2525
十進制 ( 一
列一資料 )
=
TABLE:TABLE: DB 3,159,37,13,153,73,193,31,1,25DB 3,159,37,13,153,73,193,31,1,25
= 十進制 ( 一列多資料 )
TABLE:TABLE: DB 03H,9FH,25H,0DH,99H,49HDB 03H,9FH,25H,0DH,99H,49H
DB C1H,1FH,01H,19HDB C1H,1FH,01H,19H
十六進制 ( 一列多資料 )
=
範例程式 1:
以一顆 7-SEG 顯示自己的手機號碼
0→ 熄→ 9→ 熄→ 3→ 熄→ 3→ 熄→ 9→ 熄→ 4→ 熄→ 9→ 熄→ 0→ 熄→ 0→
熄→ 6→ 熄
數字亮 0.5 秒 , 熄 0.3 秒 , 最後一次熄 2
秒
# 電話號碼排序沒有規則
範例程式 1:
A=0
查表 , 輸
出 , 延時
開始
全熄
延時
A=9
查表 , 輸
出 , 延時
全熄
延時
A=6
查表 , 輸
出 , 延時
全熄
延時
ORGORG 0H0H
INITIAL:INITIAL:
MOVMOV DPTR,#TABLEDPTR,#TABLE
LOOP:LOOP:
MOVMOV A,#0A,#0 ;; 偏移量即顯示數字偏移量即顯示數字
MOVCMOVC A,@A+DPTRA,@A+DPTR
MOVMOV P0,AP0,A
MOVMOV R5,#5R5,#5
CALLCALL DELAYDELAY
MOVMOV P0,#11111111BP0,#11111111B    ;; 全熄全熄
MOVMOV R5,#3R5,#3
CALLCALL DELAYDELAY
..
..
..
MOVMOV P0,#11111111BP0,#11111111B
MOVMOV R5,#20R5,#20
CALLCALL DELAYDELAY
JMPJMP LOOPLOOP
TABLE:TABLE:
DBDB 0000001000000111BB ;; 共陽極之共陽極之 00
DBDB 1001111100111111BB ;; 共陽極之共陽極之 11
DBDB 0010010001001011BB ;; 共陽極之共陽極之 22
DBDB 0000110000011011BB ;; 共陽極之共陽極之 33
DBDB 1001100100110011BB ;; 共陽極之共陽極之 44
DBDB 0100100010010011BB ;; 共陽極之共陽極之 55
DBDB 1100000110000011BB ;; 共陽極之共陽極之 66
DBDB 0001111000111111BB ;; 共陽極之共陽極之 77
DBDB 0000000000000011BB ;; 共陽極之共陽極之 88
DBDB 0001100000110011BB ;; 共陽極之共陽極之 99
DELAY:DELAY:
略略
記錄表格頭
INITIAL
:
LOO
P:
缺點 :數字多則程式變長 , 可用其它方式改進
範例程式 2:
0~9 秒上數計時器
9 顯示完後先全熄
再從 0 開始上數
查表並
輸出 , 延時
R0=10?
R0=0
NO
YES
將 R0( 偏
移量 ) 加 1
全熄輸出
並延時
開始
延遲時間為 1 秒
INITIAL
: 記錄表格頭
R0=0( 偏移量 )
LOO
P:
ORGORG 0H0H
INITIAL:INITIAL:
MOVMOV DPTR,#TABLEDPTR,#TABLE
MOVMOV R0,#0R0,#0
LOOP:LOOP:
MOVMOV A,R0A,R0
MOVCMOVC A,@A+DPTRA,@A+DPTR
MOVMOV P0,AP0,A
CALLCALL DELAYDELAY
INCINC R0R0
CJNECJNE R0,#10,LOOPR0,#10,LOOP
MOVMOV R0,#0R0,#0
MOVMOV P0,#11111111bP0,#11111111b
CALLCALL DELAYDELAY
JMPJMP LOOPLOOP
TABLE:TABLE:
DBDB 0000001000000111BB ;; 共陽極之共陽極之 00
DBDB 1001111100111111BB ;; 共陽極之共陽極之 11
DBDB 0010010001001011BB ;; 共陽極之共陽極之 22
DBDB 0000110000011011BB ;; 共陽極之共陽極之 33
DBDB 1001100100110011BB ;; 共陽極之共陽極之 44
DBDB 0100100010010011BB ;; 共陽極之共陽極之 55
DBDB 1100000110000011BB ;; 共陽極之共陽極之 66
DBDB 0001111000111111BB ;; 共陽極之共陽極之 77
DBDB 0000000000000011BB ;; 共陽極之共陽極之 88
DBDB 0001100000110011BB ;; 共陽極之共陽極之 99
DELAY:DELAY:
略略
查表並
輸出 , 延時
R0=10?
R0=0
NO
YES
將 R0( 偏
移量 ) 加 1
全熄輸出
並延時
開始
INITIAL
: 記錄表格頭
R0=0( 偏移量 )
LOO
P:
範例程式 2:
範例程式 2:
CJNE R0,#10,ABC
.
.
CJNE R0,#10,ABC
.
(R0=10 則執行此段程式 )
.
.
ABC:
.
.
( 不相等則執行此段程式 )
.
.
記法 : 不同則跳 , 相同往
下
第二種處置
R0=10?
第一種處置
ABC:
NO
YES
C: 比較
J: 跳躍
N: 非
E: 相同
記錄表格一標籤
查表得要顯示的數字
R1-1=0?
令 R0=0( 第一次偏移量 )
令 R1=10(10 個數字 )
R0=0
R1=10
NO
YES
開始程式3 :
功能同範例程式1
將要顯示的數字也建立成表格 ( 表格
一 )NUM_TABLE:DB 0,9,3,3,9,4,9,0,0,6NUM_TABLE:DB 0,9,3,3,9,4,9,0,0,6 ;; 要顯示的數字要顯示的數字 (( 表格一表格一 ))
TABLE:TABLE: ;; 共陽極共陽極 7SEG7SEG 顯示碼顯示碼 (( 表格二表格二 ))
DBDB 00000011B00000011B
DBDB 10011111B10011111B
DBDB 00100101B00100101B
DBDB 00001101B00001101B
DBDB 10011001B10011001B
DBDB 01001001B01001001B
DBDB 11000001B11000001B
DBDB 00011111B00011111B
DBDB 00000001B00000001B
DBDB 00011001B00011001B
第一次 表查 ( 表格一 ) 得”要顯示
的數字” , 當成第二次 表查 ( 表格
二 ) 的偏移量去 出其查 顯示碼 , 並
輸出
記錄表格二標籤
查表得該數字顯示碼
輸出並延時
全熄輸出
並延時
R0+1
( 偏移量加 1)
INITIAL
:
LOO
P:
AAA:
全熄輸出
並延時
程式 4:
功能同範例程式 2( 但改為下數 )
加 1 指令 :INC R0
減 1 指令 :DEC
RO
程式 5:
修改範例程式 2 或程式 4, 但加入二
個按鈕開關 PB1 及 PB2
PB1: 開始計數或繼續計數
PB2: 暫停計數
範例程式6 :
設計 00~99 上數計時
器設定 30H 記憶體為個位
數 => 命名為 ONE
設定 31H 記憶體為拾位
數 => 命名為 TEN
1
.
2
.
3
.
可以任意設定起始值 ( 改常
數 )
4
.
個位數放 P0, 拾位數放
P25
.
99 之後直接跳 00, 不須全
熄6 間隔時間可任意設定 ( 改常
查個位數 , 輸出
查拾位數 , 輸出
並延時
ONE=10?
ONE=0
TEN=TEN+1
NO
YES
ONE=ONE+1
開始
INITIAL
: 記錄表格頭
設定初始值
LOO
P:
為變數命名
設定初始值
A
TEN=10?
TEN=0
NO
YES
A
TENTEN EQUEQU 31H31H
ONEONE EQUEQU 30H30H
TEN_VTEN_V EQUEQU 88
ONE_VONE_V EQUEQU 33
TIMEBASETIMEBASE EQUEQU 22
;======================;======================
ORGORG 0H0H
INITIAL:INITIAL:
MOVMOV DPTR,#TABLEDPTR,#TABLE
MOVMOV TEN,#TEN_VTEN,#TEN_V
MOVMOV ONE,#ONE_VONE,#ONE_V
LOOP:LOOP:
MOVMOV A,ONEA,ONE
MOVCMOVC A,@A+DPTRA,@A+DPTR
MOVMOV P0,AP0,A
MOVMOV A,TENA,TEN
MOVCMOVC A,@A+DPTRA,@A+DPTR
MOVMOV P2,AP2,A
CALLCALL DELAYDELAY
範例程式6 :
INCINC ONEONE
MOVMOV A,ONEA,ONE
CJNECJNE A,#10,LOOPA,#10,LOOP
MOVMOV ONE,#0ONE,#0
INCINC TENTEN
MOVMOV A,TENA,TEN
CJNECJNE A,#10,LOOPA,#10,LOOP
MOVMOV TEN,#0TEN,#0
JMPJMP LOOPLOOP
;=====================;=====================
TABLE:TABLE: 略略
;=====================;=====================
DELAY:DELAY:
MOVMOV R5,#TIMEBASER5,#TIMEBASE
略略
;=====================;=====================
ENDEND
查個位數 , 輸出
查拾位數 , 輸出
並延時
ONE=10?
ONE=0
TEN=TEN+1
NO
YES
ONE=ONE+1
開始
INITIAL
: 記錄表格頭
設定初始值
LOO
P:
為變數命名
設定初始值
A
TEN=10?
TEN=0
NO
YES
A
程式 7:
將範例程式 6 改成下
數
程式 8:
將範例程式 6 或程式
7 加入一個切換開關
SW
SW ON=> 上
數SW OFF=> 下
程式 9:
修改程式 6,7 或 8,
當拾位數為 0 時 ,
拾位數 7SEG 須不
亮 , 只亮個位數
SW 接至 P3.0, 程式
中以 SW 代替 (SW
EQU P3.0)
計時器之應用
8051 有兩個計時計數器 :
Timer0 及 Timer1
8052 則多一個計時計數器:
Timer2
與 Timer0 有關之暫存器 :TMOD TCON TL0
TH0與 Timer1 有關之暫存器 :TMOD TCON TL1
TH1與 Timer2 有關之暫存器 :T2CON TL2 TH2
計時計數器使用 驟步 (Timer0 及 1):
1. 設定計時計數器操作模式 (TMOD)
2. 設定計時或計數值 (THx 及
TLx)3. 動計時或計數器啟 (TCON)
4. 檢 計時計數器是否溢位查 (TCON)
Timer0:TH0 及
TL0Timer1:TH1 及
TL1
1.1. 計時計數器模式暫存器計時計數器模式暫存器 TMODTMOD
MOV
TMOD,#00000000B表示兩個都設定為計時
器 , 都是 部 動內 啟 , 且
均為模式 0
MOV
TMOD,#01000001BTimer0 為 部 動的內 啟
計時器 , 採用模式 1
Timer1 為 部 動的內 啟
計數器 , 採用模式 0
TMOD 共有八位元 , 位於
SFR 內
(1)(1) 以以 THxTHx 及及 TLxTLx 計量暫存器設定計量暫存器設定 ,, 且使用且使用 mode1 16mode1 16 位元模位元模
式式
2.2. 設定計時器計時時間設定計時器計時時間
此此 1616 位元可設定之數 為值位元可設定之數 為值
0~655350~65535
(2)(2) 設定 與時間的關係與值設定 與時間的關係與值 80518051 外接的石英振盪器頻率有關外接的石英振盪器頻率有關
若若 OSC=12MHzOSC=12MHz 指令週期指令週期
=1uS=1uS
計時時間計時時間 == 設定值設定值 XX 指令週期指令週期
則則 mode1mode1 之計時範圍為之計時範圍為 0S~65535uS(65mS0S~65535uS(65mS
左右左右 ))
(3)(3) 一般取整數較為恰當一般取整數較為恰當
計時計時 50mS=>50mS=> 設定設定
5000050000計時計時 10mS=>10mS=> 設定設定
1000010000
計時計時 2mS=>2mS=> 設定設定 20002000
高高 88 位位
元元
低低 88 位位
元元
2.2. 設定計時器計時時間設定計時器計時時間
MOVMOV TL0, #<(65536-TL0, #<(65536-5000050000)) ;; 取用低取用低 88 位元位元
MOVMOV TH0, #>(65536-TH0, #>(65536-5000050000)) ;; 取用高取用高 88 位元位元
或或
MOVMOV TL0, #(65536-TL0, #(65536-5000050000).MOD.32).MOD.32 ;; 取取 88 位元的餘數位元的餘數
MOVMOV TH0, #(65536-TH0, #(65536-5000050000)/32)/32 ;; 取取 88 位元的商數位元的商數
或或
MOVMOV TL0, #<TL0, #<-50000-50000 ;; 取用低取用低 88 位元位元
MOVMOV TH0, #>TH0, #>-50000-50000 ;; 取用高取用高 88 位元位元
(4)(4) 設定方式設定方式 (50mS(50mS 為例須設定為例須設定
50000)50000)
3.3. 動計時器啟動計時器啟
4.4. 檢 計時器是否溢位查檢 計時器是否溢位查 (( 計時計時
到到 ))TCON 共有八位元 , 位於
SFR 內
SETB TR0 ;SETB TR0 ; 動啟動啟
TIMER0TIMER0CLR TR0 ;CLR TR0 ; 暫停暫停
TIMER0TIMER0
SETB TR1 ;SETB TR1 ; 動啟動啟
TIMER1TIMER1CLR TR1 ;CLR TR1 ; 暫停暫停
TIMER1TIMER1
TIMER0TIMER0 溢位時溢位時 (( 計時計時
到到 ))
TF0TF0 會由會由 00 變變 11
可由可由 JBJB 指令檢 之查指令檢 之查
TIMER1TIMER1 溢位時溢位時 (( 計時計時
到到 ))
TF0TF0 會由會由 00 變變 11
開關的彈跳現象開關的彈跳現象
P2.3
KS ON P2.3 為 0
KS OFF P2.3 為 1
1
0
KS ON 一次 P2.3 理想上應只收到一次 0 電
位
但實際上 , 開關在按下及放開後 10m~20m
秒 ,P2.3 均可能會因彈跳收到好幾次 0 電位
KS 按下 KS 放
開
若應用至計數電路 , 就有可能會發生開關按
一次 , 而數字卻加了好幾下的情形
因此 , 電路須加上防彈跳電路
硬體防彈跳電路硬體防彈跳電路
軟體防彈跳程式軟體防彈跳程式
1
0
KS 按下 KS 放
開
1. 持續偵測開關電位 態狀 , 若為 1 則繼續偵
測
2. 若偵測到 0, 則 DELAY 20mS 以避開彈跳
階段
3.DELAY 完成後 , 再次偵測是否為 0, 若是 , 則代表為有效的訊
號
若否 , 則代表為雜訊
4. 開關放開的防彈跳亦同
範例程式範例程式 1:1:
功能功能 :: 以一個按以一個按
鈕開關控制一個鈕開關控制一個
七段顯示器的數七段顯示器的數
字字 ,, 按一下加一按一下加一
(0~9(0~9 循環循環 ,, 須具須具
防彈跳功能防彈跳功能 ))
仍然為 0?
顯示值加一
不可超過 10
延時 20mS
CALL DEBOUNCE
開始
SETTIN
G: 設定計時器模式
7SEG 顯示 0
LOO
P:
為變數命名
設定初始值
A
接腳收到 0?
NO(0)
YES(1
)
A
NO(1
)
YES(0)
接腳收到 1?
NO(1
)YES(0)
1
0
KS 按下 KS 放
開
仍然為 1?
NO(0)
YES(1
)
DEBOUNC
E
延時 20mS
CALL DEBOUNCE
設定計時時間
啟動計時器
計時到 ?
TFx=1?
RET
I
範例程式範例程式 1:1: COUNT EQU 20000
SW EQU P2.0
SEG7 EQU P0
;
================================
ORG 0H
SETTING:
MOV TMOD,#00010001B
MOV DPTR,#NUM_TABLE
MOV R0,#0
MOV A,R0
MOVC A,@A+DPTR
MOV SEG7,A
;
================================
LOOP:
SETB SW
KEYCHK:
JB SW,KEYCHK
CALL DEBOUNCE
JB SW,KEYCHK
INC R0
CJNE R0,#10,ABC
MOV R0,#0
ABC:
MOV A,R0
MOVC A,@A+DPTR
MOV SEG7,A
KEYCHK2:
JNB SW,KEYCHK2
CALL DEBOUNCE
JNB SW,KEYCHK2
JMP LOOP
NUM_TABLE:
DB 03H,9FH,25H,0DH,99H
DB 49H,C1H,1FH,01H,19H
;
================================
===
DEBOUNCE:
MOV TH0,#>(65536-COUNT)
MOV TL0,#<(65536-COUNT)
SETB TR0
WAIT:
JNB TF0,WAIT
CLR TF0
RET
;
================================
==
END
仍然為 0?
顯示值加一
不可超過 10
延時 20mS
CALL DEBOUNCE
開始
SETTIN
G: 設定計時器模式
7SEG 顯示 0
LOO
P:
為變數命名
設定初始值
A
接腳收到 0?
NO(0)
YES(1
)
A
NO(1
)
YES(0)
接腳收到 1?
NO(1
)YES(0)
仍然為 1?
NO(0)
YES(1
)
DEBOUNCE
延時 20mS
CALL DEBOUNCE
設定計時時間
啟動計時器
計時到 ?
TFx=1?
RET
I
程式程式 2:2:
功能功能 :: 在範例程式在範例程式 11 中加上另一按中加上另一按
鈕鈕
開關開關 ,, 使其能將顯示數字減一使其能將顯示數字減一
定時中斷
中斷:即打斷 8051 目前執行的程
序 , 而先行前往特定的中斷副程
式執行 , 待中斷副程式執行完
畢後 , 再返回原程式繼續執行
定時中斷: 隔一段固定時間即每 產
生一次中斷事件
8051 的 5 種中斷 (8052 多一種 ):
外部中斷 INT0 及 INT1
外部中斷 T0 及 T1(8052 多 T2 中斷 )
串列埠中斷
與 T0 中斷有關之暫存
器 :
與 T1 中斷有關之暫存
器 :
定時中斷使用 驟步 (T0 及 T1):
1. 設定中斷相關暫存器 (IE 及 IP)
2. 設定堆疊暫存器 始位址啟 (SP)
4. 動計時器啟 (TCON)=> 等待中
斷5. 中斷副程式執行完畢後 , 回 驟步 3
IE IP SP TMOD TCON TL0
TH0
IE IP SP TMOD TCON TL1
TH1
3. 設定計量暫存器數值 (THx 及
TLx)
同計時
器設定
1.1. 設定中斷致能暫存器設定中斷致能暫存器 IEIE
動啟 T1 中斷開
關 :
SETB
ET1
若只用一種中斷功能則
IP 暫存器可不用設定
IE 及 IP 均有八位元 , 位於 SFR
內
中斷優先等級暫存器中斷優先等級暫存器 IPIP
動中斷總開關啟 :SETB EA
2.2. 設定堆疊暫存器設定堆疊暫存器 SPSP
MOV SP,#70H ;30H~7FH 均可設定方式 :
作用:
MOV A,#5CH
MOV R0,A
主程式
PUSH A
MOV A,#0
MOV P3,A
POP A
RETI
中斷副程式
RA
M
SP=70
H
71
H
72
H
A
中 斷 源中 斷 源 中 斷 向 量中 斷 向 量
INT0INT0 03H03H
TF0TF0 0BH0BH
INT1INT1 13H13H
TF1TF1 1BH1BH
RI/TIRI/TI 23H23H
TF2/EXF2TF2/EXF2 2BH2BH
中斷向量中斷向量
:: 寫法寫法 ::
ORG 0H
JMP SETTING
ORG 1BH
JMP TIMER1_INT
SETTING:
TIMER1_INT:
範例程式1:範例程式1:
功能:以定時中斷法功能:以定時中斷法
重寫走馬燈重寫走馬燈
重新設定 R0 值
R1 左移並輸出顯示
開始
SETTIN
G:設定中斷開關及堆疊
設定計時器模式及計時量
設定中斷次數 (R0)
LED 亮一顆燈 (R1)
啟動計時器
MAIN
:
為變數命名
設定初始值
R0=0?
NO
YES(0)
TIMER1_INT
A 及 PSW 內容
送入堆疊
R0 值減一
RET
I
重新設定及計時量
及啟動計時器
將堆疊內容取出
送回 A 及 PSW
範例程式1:範例程式1:
重新設定 R0 值
R1 左移並輸出顯示
開始
SETTIN
G:設定中斷開關及堆疊
設定計時器模式及計時量
設定中斷次數 (R0)
LED 亮一顆燈 (R1)
啟動計時器
MAIN
:
為變數命名
設定初始值
R0=0?
NO
YES(0)
TIMER1_INT
A 及 PSW 內容
送入堆疊
R0 值減一
RET
I
重新設定及計時量
及啟動計時器
將堆疊內容取出
送回 A 及 PSW
COUNT EQU 50000
LED EQU P0
TIMEBASE EQU 10
;
==========================
=
ORG 0H
JMP SETTING
ORG 1BH
JMP TIMER1_INT
;
==========================
==
SETTING:
SETB EA
SETB ET1
MOV SP,#70H
MOV TMOD,#00010001B
MOV TH1,#>(65536-
COUNT)
MOV TL1,#<(65536-
COUNT)
MOV R0,#TIMEBASE
MOV R1,#11111110B
MOV LED,R1
SETB TR1
;
==========================
==
MAIN:
CJNE R0,#0,MAIN
MOV R0,#TIMEBASE
MOV A,R1
RL A
MOV R1,A
MOV LED,R1
JMP MAIN
;
==========================
==
TIMER1_INT:
PUSH A
PUSH PSW
DEC R0
MOV TH1,#>(65536-
COUNT)
MOV TL1,#<(65536-
COUNT)
SETB TR1
POP PSW
POP A
RETI
;
==========================
==
END
;
==========================
程式程式
22 ::
功能功能 :: 以定時中斷法重寫霹靂燈以定時中斷法重寫霹靂燈
多工程式之寫法
多工:利用電腦邊打 8051 程式 , 邊
聽 mp3 音樂 , 同時還可從網路
下載 案……檔 , 一部電腦可以
同時做三件事情 ( 甚至更多 ),
即所謂的多工系統 .
8051 多工:利用定時中斷 , 可輕易
寫 出多工功能的程式
範例程式1:範例程式1:
功能:走馬燈及單顆功能:走馬燈及單顆
七段顯示器倒數同時七段顯示器倒數同時
執行之程式執行之程式 (( 兩個功兩個功
能能 ))
重新設定 R0 值
R1 左移並輸出顯示
開始
SETTIN
G:
設定中斷開關及堆疊
設定計時器模式及計時量
設定中斷次數 (R0)( 走馬燈 )
LED 亮一顆燈 (R1)
記錄數字顯示碼之表格頭
設定中斷次數 (R2)( 倒數 )
7SEG 顯示” 9”(R3)
啟動計時器
MAIN
:
為變數命名
設定初始值
R0=0?
NO
YES(0)
TIMER1_INT
A 及 PSW 內容
送入堆疊
R0 值減一
RET
I
重新設定計時量
及啟動計時器
將堆疊內容取出
送回 A 及 PSW
重新設定 R2 值
R1 減 1 並輸出顯示
( 小於 0 須重設為 9)
R2=0?
NO
YES(0)
CASE2
:
R2 值減一
每 50mS 執
行此副程式一
次
走馬燈相關程式碼
一位數倒數相關程式碼
若要加上第三個或更多功
能 , 則在設定區 , 主程式區
及中斷副程式區均須加入
相關程式
其餘為定時中斷相關程
式碼
範例程式1:範例程式1:
重新設定 R0 值
R1 左移並輸出顯示
開始
SETTIN
G:
設定中斷開關及堆疊
設定計時器模式及計時量
設定中斷次數 (R0)( 走馬燈 )
LED 亮一顆燈 (R1)
記錄數字顯示碼之表格頭
設定中斷次數 (R2)( 倒數 )
7SEG 顯示” 9”(R3)
啟動計時器
MAIN
:
為變數命名
設定初始值
R0=0?
NO
YES(0)
TIMER1_INT
A 及 PSW 內容
送入堆疊
R0 值減一
RET
I
重新設定計時量
及啟動計時器
將堆疊內容取出
送回 A 及 PSW
COUNT EQU 50000
LED EQU P0
TIMEBASE EQU 15
SEG7 EQU P2
TIMEBASE2 EQU 20
;=========================
ORG 0H
JMP SETTING
ORG 1BH
JMP TIMER1_INT
;=========================
SETTING:
SETB EA
SETB ET1
MOV SP,#70H
MOV TMOD,#00010001B
MOV TH1,#>(65536-
COUNT)
MOV TL1,#<(65536-
COUNT)
MOV R0,#TIMEBASE
MOV R1,#11111110B
MOV LED,R1
MOV
DPTR,#NUM_TABLE
MOV R2,#TIMEBASE2
MOV R3,#9
MOV A,R3
MOVC A,@A+DPTR
MOV SEG7,A
SETB TR1
;=========================
MAIN:
CJNE R0,#0,CASE2
MOV R0,#TIMEBASE
MOV A,R1
RL   A
MOV R1,A
MOV LED,R1
CASE2:
CJNE R2,#0,MAIN
MOV R2,#TIMEBASE2
DEC R3
CJNE R3,#255,ABC
MOV R3,#9
ABC:
MOV A,R3
MOVC A,@A+DPTR
MOV SEG7,A
JMP MAIN
;========================
TIMER1_INT:
PUSH A
PUSH PSW
DEC R0
DEC R2
MOV TH1,#>(65536-
COUNT)
MOV TL1,#<(65536-
COUNT)
SETB TR1
POP PSW
POP A
RETI
;=====================
NUM_TABLE:
DB
03H,9FH,25H,0DH,99H
DB
49H,C1H,1FH,01H,19H
;====================
重新設定 R2 值
R1 減 1 並輸出顯示
( 小於 0 須重設為 9)
R2=0?
NO
YES(0)
CASE2
:
R2 值減一
程式程式
22 ::
功能功能 ::
1.1. 霹歷燈霹歷燈 (( 間隔間隔 50mS X50mS X 1111))
2.2. 右邊右邊 7SEG7SEG 由由 00 數至數至 9(9( 間隔間隔
50mS X50mS X 1515))
3.3. 左邊左邊 7SEG7SEG 由由 99 數至數至 0(0( 間隔間隔
50mS X50mS X 1919))
先完成先完成
再加入再加入
再加上再加上
多工顯示
若要將 8051 接上 4 顆七段顯示器 , 用之
前的方式 , 須接上 32 支 才能完成控制腳
, 在 8051 的 I/O 資源有限情形下 , 此舉
是非常浪費的 . 若有借助外部 7447 解碼
IC 的輔助 , 仍須 16 支腳 ( 但成本更高 ).
上述二法之優點為 7SEG 是全時恆亮 , 不
是輪流亮 .
8051
P0 P1 P2 P3
7447744774477447
8051
P0 P1
8051 多工顯示:利用掃描方式讓 4 顆七段
顯示器輪流亮 ( 一次只亮一顆 ), 只要輪流的
速度 快且控制得宜夠 , 就可讓人的眼睛看到
4 顆同時亮的假像 . 優點 : 只用八條線及一
顆 7447, 缺點 : 亮度較暗
7447
8051
掃描線
數
字
碼
P2P0
P1
P3
其
它
用
途
(24
支
腳
)
錯誤資料 :
0111 1100
1010 0111
手提箱顯示模組接線定義 :
資料 :11101001
資
料 :01110000資料 :10110011
資料 :11010001
千百拾個 8 4 2 1
若上述四筆資料不斷循環 ( 速度須夠
快 ), 則可以看到以下情形 :
至於循環速度 , 大約設定為 5mS
即可太快 LED 都不會亮 , 太慢則會
看見 4 顆顯示器輪流亮
8 支均為接地端 ( 接一支即
可 )
千 百 拾 個
1248個拾百千
高態動作低態動作
掃描碼 : 數字碼 :
資
料
範例程式範例程式 1:1:
功能功能 :: 以以 44 顆七段顯示器顯示一組四位數顆七段顯示器顯示一組四位數
(1357)(1357)
提示提示 ::
1.1. 先設定掃描碼先設定掃描碼 1110111011101110 並讓掃描碼每並讓掃描碼每 5mS5mS 左旋一次左旋一次
11101111110111
0011011101101110
1110111011011101
1101110110111011
1111101111110111
0011011101101110
1110111011011101
1101110110111011
11
2.2. 再檢 掃描碼那個位元為查再檢 掃描碼那個位元為查 0,0, 例如最左邊為例如最左邊為 0(0( 即顯示千位數即顯示千位數
THOTHO)) 則必須將掃描碼與千位數則必須將掃描碼與千位數合併合併成為輸出資料送至顯示模組成為輸出資料送至顯示模組
若只看高四位元即可發現若只看高四位元即可發現 :: 只要只要
四次就會重複四次就會重複 ,, 亦即亦即個拾百千個個拾百千個
拾百千拾百千………… ,, 因此每次左旋完成因此每次左旋完成
後取其高四位元即為掃描碼後取其高四位元即為掃描碼 ,, 而而
低四位元必須低四位元必須清為清為 00
THO=THO=0000000000010001 HUN=HUN=0000000000110011 TEN=TEN=0000000001010101
ONE=ONE=0000000001110111
(1)(1) 掃描碼掃描碼 0111011101110111 與與
常數常數 1111000011110000 做做 ANDAND
運算運算 ,, 以清除掃描碼低四以清除掃描碼低四
位元位元 011101011101
1111111100111100
0000
ANAN
DD 011101110000
0000
(2)(2) 前一步驟之結果與千前一步驟之結果與千
位數位數 THO=00000001THO=00000001 做做
OROR 運算運算 ,, 以產生輸出資以產生輸出資
料料
011101110000
0000000000000000
0101
OROR
011101110000
0101
顯示資料顯示資料 ,, 送至模組送至模組
COUNT EQU 5000
ONE EQU 30H
TEN EQU 31H
HUN EQU 32H
THO EQU 33H
TMP EQU 34H
SEG7_4 EQU P2
;====================
ORG 0H
JMP SETTING
ORG 1BH
JMP TIMER1_INT
;====================
SETTING:
SETB EA
SETB ET1
MOV SP,#70H
MOV TMOD,#00010001B
MOV TH1,#>(65536-COUNT)
MOV TL1,#<(65536-COUNT)
MOV R0,#11101110B
MOV ONE,#7
MOV TEN,#5
MOV HUN,#3
MOV THO,#1
SETB TR1
MAIN:
NOP
JMP MAIN
;=====================
TIMER1_INT:
PUSH A
PUSH PSW
MOV A,R0
RL A
MOV R0,A
THOCHK:
JB ACC.7,HUNCHK
MOV TMP,THO
ANL A,#11110000B
ORL TMP,A
JMP SHOW
HUNCHK:
JB ACC.6,TENCHK
MOV TMP,HUN
ANL A,#11110000B
ORL TMP,A
JMP SHOW
TENCHK:
JB ACC.5,ONECHK
MOV TMP,TEN
ANL A,#11110000B
ORL TMP,A
JMP SHOW
ONECHK:
MOV TMP,ONE
ANL A,#11110000B
ORL TMP,A
SHOW:
MOV SEG7_4,TMP
MOV TH1,#>(65536-COUNT)
MOV TL1,#<(65536-COUNT)
SETB TR1
POP PSW
POP A
RETI
;======================
END
;======================
範例程式範例程式 1:1:
不做任何事
開始
SETTIN
G:設定中斷開關及堆疊
設定計時器模式及計時量
設定掃描碼
設定要顯示的四位數
啟動計時器
MAIN
:
為變數命名
設定初始值
NO
TIMER1_INT
A 及 PSW 內容
送入堆疊
掃描值左旋
NO
YES
掃描碼千
位為 0?
千位數暫存至 TMP
掃描碼低四位元清除
掃描碼與千位數組合
成輸出資料
YES
掃描碼百
位為 0?
百位數暫存至 TMP
掃描碼低四位元清除
掃描碼與百位數組合
成輸出資料
YES
掃描碼拾
位為 0?
拾位數暫存至 TMP
掃描碼低四位元清除
掃描碼與拾位數組合
成輸出資料
個位數暫存至 TMP
掃描碼低四位元清除
掃描碼與個位數組合
成輸出資料
NO
THOCHK
:
HUNCH
K:
TENCHK
:
ONECH
K:
將輸出資料
輸出顯示
SHOW:
將 PSW 及 A 內
容自堆疊取出
RET
I
重新設定計時量
及啟動計時器
範例程式範例程式 2:2:
功能功能 :: 十進制十進制 44 位數上數計數器位數上數計數器 (( 每每 0.10.1 秒加秒加
1)1)
提示提示 :: 在範例程式在範例程式 11 主程式主程式中加入計數功能中加入計數功能NO
YES
0.1 秒時間到 ?
R1=TIMEBASE
ONE=ONE+1
( 個位數加 1)
MAIN
:
因為範例程式因為範例程式 11 之定時中斷時間為之定時中斷時間為
5mS,5mS, 所以須所以須中斷中斷 2020 次才等於次才等於 0.10.1 秒秒
ONE=10?
YES
NO
ONE=0
TEN=TEN+1
( 拾位數加 1)
TEN=10?
YES
NO
TEN=0
HUN=HUN+1
( 百位數加 1)
HUN=10?
YES
NO
HUN=0
THO=THO+1
( 千位數加 1)
THO=10?
YES
NO
THO=0
TIMEBASE EQU 20
;====================
ORG 0H
;====================
SETTING:
MOV R1,#TIMEBASE
;====================
MAIN:
CJNE R1,#0,MAIN
MOV R1,#TIMEBASE
INC ONE
MOV A,ONE
CJNE A,#10,MAIN
MOV ONE,#0
INC TEN
MOV A,TEN
CJNE A,#10,MAIN
MOV TEN,#0
INC HUN
MOV A,HUN
CJNE A,#10,MAIN
MOV HUN,#0
INC THO
MOV A,THO
CJNE A,#10,MAIN
MOV THO,#0
JMP MAIN
;====================
TIMER1_INT:
DEC R1
範例程式範例程式 2:2:
程式程式
3:3:功能功能 :: 簡易時簡易時
鐘鐘
說明說明 :: 四顆七段顯示四顆七段顯示 ,, 左邊兩顆為”時”左邊兩顆為”時” (( 顯示顯示
00~23)00~23)右邊兩顆為”分”右邊兩顆為”分” (( 顯示顯示
00~59)00~59)
另使用兩顆另使用兩顆 LED,LED, 以以 0.50.5 秒亮秒亮 0.50.5 秒熄方式顯示”秒熄方式顯示”
秒”秒”
說明說明 :: 四顆七段顯示四顆七段顯示 ,, 左邊兩顆為”分”左邊兩顆為”分” (( 顯示顯示
00~59)00~59)右邊兩顆為”秒”右邊兩顆為”秒” (( 顯示顯示
00~59)00~59)另使用兩顆另使用兩顆 LED,LED, 以以 0.50.5 秒亮秒亮 0.50.5 秒熄方式顯示”秒熄方式顯示”
秒”秒”
說明說明 :: 四顆七段顯示四顆七段顯示 ,, 左邊兩顆為”時”左邊兩顆為”時” (( 顯示顯示
00~23)00~23)右邊兩顆為”分”右邊兩顆為”分” (( 顯示顯示
00~59)00~59)
另使用兩顆另使用兩顆 LED,LED, 以以 0.50.5 秒亮秒亮 0.50.5 秒熄方式顯示”秒熄方式顯示”
秒”秒”
有興趣同學可再修改成以下功能有興趣同學可再修改成以下功能
揚聲器控制
揚聲器發聲:
蜂鳴器發聲:
送 0 或 1 至揚聲器都不會發出聲
音
0: 靜音 0: 靜音
1: 發聲 1: 發聲
0
1
只有在 0 變 1 及 1 變 0 的瞬間才
會發出聲音 , 因此準位變化的愈
頻繁 , 發出的聲音頻率愈高 , 反
之利用 8051 控制 1 與 0 的時間
即可控制揚聲器發出聲音的頻率
發音
8051 控制揚聲器的硬體電路
:
PORT1~POR
T3
只須使用一支 I/O 接腳 PORT
0
手提箱揚聲器及蜂鳴器模組接線定義 :
8 支均為接地端 ( 接一支即
可 )
揚聲器
蜂鳴器
音調 (Tone):
即聲音的頻率 , 以中音 Do 為例 , 其頻率
為 523Hz, 週期 =1912uS, 半週期
=956uS
0
956uS
1912u
S
1 1
0
亦即每 956uS 就要將輸出至揚聲器的
接 準位反相腳 (0 變 1,1 變 0), 若用定時
中斷須設定 THx=#>(65536-956) 相當於
THx=#252TLx=#<(65536-956) 相當於
TLx=#68
因為 65536-956=64580, 而 64580/256=252 餘 68
低低
音音
頻頻
率率
T/2T/2 THxTHx TLxTLx 中中
音音
頻率頻率 T/2T/2 THxTHx TLxTLx 高高
音音
頻率頻率 T/2T/2 THxTHx TLxTLx
DoDo 262262 19081908 248248 140140 DoDo 523523 956956 252252 6868 DoDo 10461046 478478 254254 3434
Do*Do* 277277 18051805 248248 243243 Do*Do* 554554 903903 252252 122122 Do*Do* 11091109 451451 254254 6262
ReRe 294294 17011701 249249 9292 ReRe 587587 852852 252252 173173 ReRe 11751175 426426 254254 8787
Re*Re* 311311 16081608 249249 185185 Re*Re* 622622 804804 252252 221221 Re*Re* 12451245 402402 254254 111111
MiMi 330330 15151515 250250 2121 MiMi 659659 759759 253253 1010 MiMi 13181318 379379 254254 133133
FaFa 349349 14331433 250250 104104 FaFa 698698 716716 253253 5252 FaFa 13971397 358358 254254 155155
Fa*Fa* 370370 13511351 250250 185185 Fa*Fa* 740740 676676 253253 9393 Fa*Fa* 14801480 338338 254254 175175
SoSo 392392 12761276 251251 55 SoSo 784784 638638 253253 131131 SoSo 15681568 319319 254254 194194
So*So* 415415 12051205 251251 7676 So*So* 831831 602602 253253 167167 So*So* 16611661 301301 254254 211211
LaLa 440440 11361136 251251 144144 LaLa 880880 568568 253253 200200 LaLa 17601760 284284 254254 228228
La*La* 464464 10781078 251251 208208 La*La* 932932 536536 253253 232232 La*La* 18651865 268268 254254 244244
SiSi 494494 10121012 252252 1212 SiSi 988988 506506 254254 66 SiSi 19761976 253253 255255 33
頻率單位為 Hz, 週期單位為
uS
各音階頻率 , 半週期及 THx TLx 對照
表 :
OSC=12M
Hz
範例程式範例程式 1:1:
功能功能 :: 以一開關控制揚聲器發聲以一開關控制揚聲器發聲
開關開關 OFF:OFF: 靜音 開關靜音 開關 ON:ON: 發聲發聲
提示提示 :: 開關開關 OFFOFF 時時 ,, 關掉關掉 T1T1 的定時中斷的定時中斷 =>=> CLRCLR
TR1TR1開關開關 ONON 時時 ,, 動啟動啟 T1T1 的定時中斷的定時中斷 =>=> SETBSETB
TR1TR1
而定時中斷時間則由聲音頻率所對應的而定時中斷時間則由聲音頻率所對應的
THxTHx 及及 TLxTLx 取得值取得值
範例程式範例程式 1:1:
先將開關接腳準位
設為高態
開始
SETTIN
G:
設定中斷開關及堆疊
設定計時器模式
MAIN
:
為變數命名 TIMER1_INT
A 及 PSW 內容
送入堆疊
揚聲器準位反相
將 PSW 及 A 內
容自堆疊取出
RET
I
重新設定計時量
及啟動計時器
SPK EQU P2.0
KEY1 EQU P0.0
H_TMP EQU 31H
L_TMP EQU 32H
;==========================
ORG 0H
JMP SETTING
ORG 1BH
JMP TIMER1_INT
;===========================
SETTING:
SETB EA
SETB ET1
MOV SP,#70H
MOV TMOD,#00010001B
;============================
MAIN:
SETB KEY1
JB KEY1,NOKEY
MOV H_TMP,#255 ; 高音 Si
MOV L_TMP,#3 ; 高音 Si
SETB TR1
JMP MAIN
NOKEY:
CLR TR1
JMP MAIN
;============================
;==========================
TIMER1_INT:
PUSH A
PUSH PSW
CPL SPK
MOV TH1,H_TMP
MOV TL1,L_TMP
SETB TR1
POP PSW
POP A
RETI
;==========================
END
NO(1
)
YES(
0)
開關是否
按下 ?
關閉 T1 的定時中斷
將聲頻的對應值
填入自訂暫存器
及 T1 的計量暫存器
NOKEY
:
啟動 T1 的定時中斷
程式程式 2:2:
功能功能 :: 設計簡易電子琴設計簡易電子琴
說明說明 :: 擴充範例程式一擴充範例程式一 ,, 將開關數量增加將開關數量增加
為為 88 個即可個即可 ,, 分別發出中音分別發出中音 Do~Do~ 高音高音
DoDo 等等 88 個音個音
揚聲器控制
音效及音樂的播放
低低
音音
頻頻
率率
T/2T/2 THxTHx TLxTLx 中中
音音
頻率頻率 T/2T/2 THxTHx TLxTLx 高高
音音
頻率頻率 T/2T/2 THxTHx TLxTLx
DoDo 262262 19081908 248248 140140 DoDo 523523 956956 252252 6868 DoDo 10461046 478478 254254 3434
Do*Do* 277277 18051805 248248 243243 Do*Do* 554554 903903 252252 122122 Do*Do* 11091109 451451 254254 6262
ReRe 294294 17011701 249249 9292 ReRe 587587 852852 252252 173173 ReRe 11751175 426426 254254 8787
Re*Re* 311311 16081608 249249 185185 Re*Re* 622622 804804 252252 221221 Re*Re* 12451245 402402 254254 111111
MiMi 330330 15151515 250250 2121 MiMi 659659 759759 253253 1010 MiMi 13181318 379379 254254 133133
FaFa 349349 14331433 250250 104104 FaFa 698698 716716 253253 5252 FaFa 13971397 358358 254254 155155
Fa*Fa* 370370 13511351 250250 185185 Fa*Fa* 740740 676676 253253 9393 Fa*Fa* 14801480 338338 254254 175175
SoSo 392392 12761276 251251 55 SoSo 784784 638638 253253 131131 SoSo 15681568 319319 254254 194194
So*So* 415415 12051205 251251 7676 So*So* 831831 602602 253253 167167 So*So* 16611661 301301 254254 211211
LaLa 440440 11361136 251251 144144 LaLa 880880 568568 253253 200200 LaLa 17601760 284284 254254 228228
La*La* 464464 10781078 251251 208208 La*La* 932932 536536 253253 232232 La*La* 18651865 268268 254254 244244
SiSi 494494 10121012 252252 1212 SiSi 988988 506506 254254 66 SiSi 19761976 253253 255255 33
頻率單位為 Hz, 週期單位為
uS
各音階頻率 , 半週期及 THx TLx 對照
表 :
OSC=12M
Hz
範例程式範例程式 1:1: 電話忙線音電話忙線音
392H392H
zz
0.50.5
秒秒
392H392H
zz
0.50.5
秒秒
靜音靜音
0.50.5
秒秒
靜音靜音
0.50.5
秒秒
T0T0 負責負責 0.50.5 秒的計時秒的計時 (50mS(50mS 定時中斷定時中斷
1010 次次 ))T1T1 負責負責 392Hz392Hz 的計時的計時 (( 定時中斷定時中斷
TH1=TH1=251251,TL1=,TL1=55))
以建立表格方式以建立表格方式 ,, 將上述資訊結構化將上述資訊結構化 ::
DB 10,251,5DB 10,251,5
靜音部份靜音部份 T0T0 定時中斷仍持續計時定時中斷仍持續計時 0.50.5 秒秒 ,, 而而
靜音沒有頻率問題靜音沒有頻率問題 ,, 以以 0,00,0 代替代替 ,, 表格資料如表格資料如
下下 ::
DB 10,0,0DB 10,0,0
若 表得到查若 表得到查 0,0, 則關閉則關閉 T1T1 的定時中斷功能的定時中斷功能 (CLR(CLR
TR1)TR1)
範例程式範例程式 1:1:T0_COUNT EQU 50000
SPK EQU P2.0
TIMES EQU 30H
H_TMP EQU 31H
L_TMP EQU 32H
;================================
ORG 0H
JMP SETTING
ORG 0BH
JMP TIMER0_INT
ORG 1BH
JMP TIMER1_INT
;================================
SETTING:
SETB EA
SETB ET0
SETB ET1
MOV SP,#70H
MOV TMOD,#00010001B
MOV TH0,#>(65536-T0_COUNT)
MOV TH0,#<(65536-T0_COUNT)
MOV DPTR,#TABLE
MOV R0,#0
SETB TR0
;================================
MAIN:
MOV A,R0
MOVC A,@A+DPTR
MOV TIMES,A
CJNE A,#255,SOUND
MOV R0,#0
JMP MAIN
SOUND:
CALL READ_TONE
SOUND1:
MOV A,TIMES
CJNE A,#0,SOUND1
CLR TR1
INC R0
JMP MAIN
;=========================
READ_TONE:
INC R0
MOV A,R0
MOVC A,@A+DPTR
MOV H_TMP,A
MOV TH1,H_TMP
INC R0
MOV A,R0
MOVC A,@A+DPTR
MOV L_TMP,A
MOV TL1,L_TMP
MOV A,H_TMP
CJNE A,#0,SPK_WORK
CLR TR1
RET
SPK_WORK:
SETB TR1
RET
;=========================
TIMER0_INT:
PUSH A
PUSH PSW
DEC TIMES
MOV TH0,#>(65536-T0_COUNT)
MOV TL0,#<(65536-T0_COUNT)
SETB TR0
POP PSW
POP A
RETI
;=================================
TIMER1_INT:
PUSH A
PUSH PSW
CPL SPK
MOV TH1,H_TMP
MOV TL1,L_TMP
SETB TR1
POP PSW
POP A
RETI
;=================================
TABLE:
DB 10,251,5 ;0.5S 發音 (392Hz)
DB 10,0,0 ;0.5S 靜音
DB 255 ; 結束碼
;============================
END
程式程式 2:2: 警車笛聲警車笛聲
262Hz262Hz
0.720.72 秒秒
349Hz349Hz
0.720.72 秒秒
262Hz262Hz
0.720.72 秒秒
349Hz349Hz
0.720.72 秒秒
程式程式 3:3: 電話鈴聲電話鈴聲
311311
HzHz
25m25m
SS
480480
HzHz
25m25m
SS
311311
HzHz
25m25m
SS
480480
HzHz
25m25m
SS
311311
HzHz
25m25m
SS
480480
HzHz
25m25m
SS
311311
HzHz
25m25m
SS
480480
HzHz
25m25m
SS
311311
HzHz
25m25m
SS
480480
HzHz
25m25m
SS
311311
HzHz
25m25m
SS
480480
HzHz
25m25m
SS
第一次第一次 第二次第二次 第三次第三次 第四次第四次 第十九次第十九次 第二十次第二十次
靜音二秒靜音二秒
程式程式 4:4: 消防車笛聲消防車笛聲
請自行設計請自行設計
程式程式 5:5: 音樂播放音樂播放
1 拍為 0.5 秒 (500mS)
1/2 拍為 0.25 秒 (250mS)
1/4 拍為 0.125 秒 (125mS)
1/8 拍為 0.0625(62.5mS)
8051 定時中斷時間最長為 65mS 左右 ,
因此設定每 62.5mS(62500) 中斷一次 :
節拍節拍 1/81/8 1/41/4 1/21/2 11 22
中斷次數中斷次數 11 22 44 88 1616
TL0=#<(65536-
62500)
TH0=#>(65536-62500)
程式程式 5:5: 音樂播放音樂播放
DB 3,252,68DB 3,252,68
DB 1,0,0DB 1,0,0
DB 4,252,68DB 4,252,68
DBDB
8,252,1738,252,173DB 8,252,68DB 8,252,68
DB 8,253,52DB 8,253,52
DB 16,253,10DB 16,253,10

89S51電路板

  • 1.
  • 2.
  • 3.
  • 4.
    設備及工具的介 紹 剝線鉗 : 要能處理 OK線 尖嘴鉗及斜口 鉗 小起子
  • 5.
    材料的介紹 洞洞板 ( 萬用 板): 零件面 : 零件 均放置於此面 銲接面 : 不 可放置零件 # 單買一片約 30 元
  • 6.
  • 7.
    材料的介紹 AT89S51: DIP 包裝 40支腳 位不需燒錄器 ( 和 AT89C51 不 同 )用 ISP 電路進行程式下載 AT89S52 亦可使用 (ROM 更 大 )每片 50 元以下 購買容易 迷你型的 8051: 89S2051
  • 8.
    材料的介紹 IC 腳座 : 40pin:8951使 用 20pin 注意第一腳的位置 ( 缺 口 ) 針腳 : 不需太長 (0.5 公分即夠 用 )
  • 9.
    材料的介紹 電阻 : ½ w ¼w: 洞洞板 上可緊臨併 排 排阻 : 打點的為 COM 點 等效電路 : LED : 3m 1.5m 331=33X10 =330 歐 姆 1 472=47X10 =4.7k 歐姆 2
  • 10.
    材料的介紹 電容 : 電解質電容 :(有正 負 ) 陶瓷電容 :( 無正 負 )103=10X10 pF=0.01uF 3 30=30pF 石英振盪器 :(12MHz) 等效符號 : 104=10X10 pF=0.1uF 4
  • 11.
    材料的介紹 指撥開關 : 按鈕開關 : LED 陣 列 : 共陽極七 段顯示器 : 7447解碼器 : 輸入 BCD 碼 (0000~1001) 輸出至共陽 7seg 顯示該數 字
  • 12.
  • 13.
  • 14.
    製作步驟 : 1. 電路圖及零件準備 2.洞洞板上的零件配置規 劃3. 將所有零件銲接固定於洞洞板零件 面上4. 在銲接面完成所有接 線5. 以目測及三用電表檢測電路板好 壞6. 通電實作
  • 15.
    零件固定 : 1. 腳座定位2. 缺口向上 , 注意第一腳 位置 3. 先固定對角兩銲 點 4. 確定腳座貼於零件 面 5. 將所有腳位加錫固 定 6. 所有 DIP 元件均按此要領 (LED 陣列及指撥 開關 )
  • 16.
    零件固定 : 1. 固定8+3 支針腳 ( 零件面不可翹起 , 銲接面針腳過長須剪短後再銲 接固定 )2. 固定 330 歐姆電阻 ( 顏色由左向右或由上 向下 ) 固定電阻 , 電容 ,LED,OSC 等兩支腳元 件時 :以手指壓住其中一支腳 , 剪短另一支腳 先銲住剪短的腳位 , 固定後再處理另一 支腳 3. 再固定 6 支針 腳
  • 17.
    零件固定 : 1. 固定LED( 右 P 左 N)( 不可翹起 ) 2. 固定振盪器電路 12MHz OSC 及 30p 陶瓷電 容均不分正負 3. 固定 0.1u(104) 電容及其餘 24 支針 腳
  • 18.
    零件固定 : 1. 固定8pin 指撥開關 ( 注意 方向 )2. 固定 9pin 10k 歐姆排阻 ( 打點向右 凸出 ) 3. 固定 8 支針 腳
  • 19.
    零件固定 : 1. 固定10x1 LED 陣列 ( 注意方向 : 上 P 下 N) 3. 固定 330 歐姆色碼電阻 ( 控制左邊兩 顆 LED) 2. 固定 9pin 330 歐姆排阻 ( 打點向右 凸出 )
  • 20.
    零件固定 : 1. 固定5V 及 0V 針腳各 1 支 2. 固定電源指示 LED( 左 P 右 N) 3. 固定 470 歐姆限流電阻及 0.1u 濾波 電容
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
    電路接線 : 5V 電源可由電源供應器透過JP+ 及 JP- 饋 入 亦可由電腦 USP 插座獲得
  • 26.
    電路檢測 : 1. 以目測配合電路圖檢視電路是否正確. 2. 以目測及三用電表檢測電路接線是否確實 接妥 . 通電檢測 : 1. 先不接 89S5X, 通上電源 , 電源指示 LED 應點亮 , 3. 以三用電表歐姆做靜態測試 , 不可短路 . 2. 斷電後 , 接上 89S5X, 再接上電源 ,89S5X 不發燙 .3. 只要插拔任何 IC, 均需先行關閉電 源 . 各元件不發燙 .
  • 27.
    1. 有印表機埠的電 腦 連線檢測 : 一. 硬體接 線 : 連接 連接 2. 傳輸線 (25 公對 25 母 ) 3. 轉接線 (25 公對 6pin 杜 邦線 ) 連接 送 上 5v 電 源 4. 銲接完成的電路 板
  • 28.
    連線檢測 : 一 .硬體接 線 : 轉接線 (25 公對 6pin 杜邦線 ) 與電路板接 法 2 與 12 腳 直 接 短 路
  • 29.
    連線檢測 : 二 .程式下載軟 體 : 1. 執行下列兩者之一 電腦系統為 2000 或 XP 電腦系統為 98 下載軟體的操作介 面 2. 選 擇 單 晶 片 型 號 3. 取 得 單 晶 片 識 別 碼 4. 若 成 功 則 顯 示 該 晶 片 識 別 碼 若 失 敗 則 仍 顯 示 0
  • 30.
    七段顯示器模組接線圖 七段顯示器採用共陽極 com 接至 5V(一顆 7SEG 只須接一個 com) 限流電阻為 330 歐姆 , 四分之一瓦特 , 電阻上 方利用 OK 線依序接至 7SEG 之各接腳 針 之定義由左至右依腳 序為 abcdefg, 最右為 dp 小數點
  • 31.
    8051 程式發展流程 一.程式撰寫 二.組 (編 ) 譯 四.程式燒錄(下載) 五.硬體功能測試 三.功能模擬
  • 32.
    程式撰寫 ( 編輯) 組 ( 編 ) 譯 功能模擬 組譯成功 程式燒錄 ( 下載 ) 功能正確 硬體功能測試 功能正確 完成 yes yes yes no no no 可以寫程式的環境 : 記事本 Keil C 亞將 可以寫的語言種類 :( 給人看的 ) Simlab 8051 mov a,#3ah djnz 32h,loop setb 20h.3 Loop: add a,r4 void cmdb_init (void) { cmdndx = 0; cmdbuf [0] = '0'; } 組合語言 c 語言 副 名檔 : *.asm *.a *.a51 副 名檔 : *.c *.c51
  • 33.
    ORG 0H JMP INITIAL INITIAL: MOVR0,#11111100B LOOP: MOV P0,R0 CALL DELAY MOV A,R0 RR A MOV R0,A JMP LOOP DELAY: MOV R5,#2 D1: MOV R6,#250 D2: MOV R7,#200 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END 馬燈範例程式跑 ( 組合語言 ): LED 亮燈數 (2 進制 8 位數 ,0 為亮 ) 8051 接線位置 ,P0~P3( 埠 0~ 埠 3) 速度控制 (10 進制 ,1~255)
  • 34.
    程式撰寫 ( 編輯) 組 ( 編 ) 譯 功能模擬 組譯成功 程式燒錄 ( 下載 ) 功能正確 硬體功能測試 功能正確 完成 yes yes yes no no no 可以組譯的環境 : Keil C 亞將 Simlab 8051僅可組譯 組合語言 組譯的方式 : 1. 在空白地方按滑鼠右鍵 2. 跳出對話方塊 3. 執行 => 編譯原始 檔
  • 35.
    組譯成功的機械碼 (HEX 檔): :10000000010278FC888012000EE803F801047D02EA :0B0010007EFA7FC8DFFEDEFADDF6227C :00000001FF 組譯完成的結果 : 成功 : 生產 副 名為檔 : *.HEX 或 *.TSK 的 機械碼 案檔 ( 給 51 看的 ) 失敗 : 重新修改程 式後再組譯
  • 36.
    程式撰寫 ( 編輯) 組 ( 編 ) 譯 功能模擬 組譯成功 程式燒錄 ( 下載 ) 功能正確 硬體功能測試 功能正確 完成 yes yes yes no no no 可以組譯的環境 : Simlab 8051
  • 37.
    程式撰寫 ( 編輯) 組 ( 編 ) 譯 功能模擬 組譯成功 程式燒錄 ( 下載 ) 功能正確 硬體功能測試 功能正確 完成 yes yes yes no no no 1. 使用燒 器燒錄 錄 : 只要該燒 器有支援的型號均可燒錄 錄 ( 包含 AT89S52) 將組譯成功的 HEX 或檔 TSK 檔 2. 具 ISP 功能的 8051: 各廠牌僅能使用其專屬的下載軟體 缺點 :IC 要拔來拔去 優點 :IC 不需拔來拔去 ATMEL:AT89S5X PHILIPS: P89C51RD2 燒錄 ( 下載 ) 至 8051 上
  • 38.
    程式下載 驟步 : 1.選擇晶片型號 2. 讀入組譯成功的 HEX 檔 3. 執行下載動作 ( 外部硬體需先完成傳 輸線連接及通上電源 )
  • 39.
    程式撰寫 ( 編輯) 組 ( 編 ) 譯 功能模擬 組譯成功 程式燒錄 ( 下載 ) 功能正確 硬體功能測試 功能正確 完成 yes yes yes no no no 1. 利用杜邦排線將 8051 的 PORT 0 與 LED 陣列連接起來 2. 觀察動作情形是否和程式邏輯相符
  • 40.
  • 41.
  • 42.
    8051 部結內 構 1.80511.8051 為為88 位元位元 (8bits=1Byte)(8bits=1Byte) 微處理機。微處理機。 2.2. 程式記憶體程式記憶體 ROMROM :內建:內建 4Kbytes4Kbytes (51),8Kbytes(52)(51),8Kbytes(52) 、最多可擴、最多可擴 充充 至至 64 Kbytes64 Kbytes 。機械碼。機械碼 (hex(hex 檔檔 )) 即即 燒錄至此處。燒錄至此處。 3.3. 資料記憶體資料記憶體 RAMRAM :內建:內建 256256 bytes(bytes( 特殊用特殊用 SFR 128SFR 128 個個 ,, 一般一般 用用 128128 個個 )) 、外部最多可擴、外部最多可擴 充至充至 64 Kbytes64 Kbytes 。。4.4. 四組四組可位元定址可位元定址的的 88 位元輸出入埠,即位元輸出入埠,即 P0P0 、、 P1P1 、、 P2P2 及及 P3P3 。。 (( 接各式接各式 輸入輸出裝置輸入輸出裝置 )) 5.5. 一個全雙工串列埠,即一個全雙工串列埠,即 UARTUART 。。 (( 可與電腦做可與電腦做 通訊通訊 )) 8.8. 五個中斷源,即五個中斷源,即 INT0INT0 、、 INT1(INT1( 外部中斷外部中斷 22 個個 )) 、、 T0T0 、、 T1(T1( 內部計時內部計時 計數器中斷計數器中斷 22 個個 )) 、、 RXDRXD 或或 TXD(TXD( 外部外部 UARTUART 中斷中斷 )) 。。9.9. 振盪器。振盪器。 (( 需外接石英振盪需外接石英振盪 4k=4x1024=40964k=4x1024=4096 個記憶體個記憶體 8k=8x1024=81928k=8x1024=8192 個記憶體個記憶體 64k=64x1024=6553664k=64x1024=65536 個記憶體個記憶體 6.26.2 個個 1616 位元計時計數器。位元計時計數器。 (( 可計數可計數 6553665536 次次 ,, 或或 6553665536 個指令週期的個指令週期的 時間時間 )) 7.7. 擴充記憶體用的控制線。擴充記憶體用的控制線。
  • 43.
    51 部資料記憶內 體 1.1.共有共有 256256 個記憶體個記憶體 ,, 位址由位址由 0~255(100~255(10 進制進制 )) 特殊功能 暫存器區 SFR 上 128 個記憶 體 一般功能 暫存器區 下 128 個記憶 體 2.2. 位址習慣用位址習慣用 1616 進制即進制即 00H~FFH00H~FFH3.3. 一般功能暫存器區位址為一般功能暫存器區位址為 00H~7FH(0~127)00H~7FH(0~127)4.SFR4.SFR 位址為位址為 80H~7FH(128~255)80H~7FH(128~255) 5.5. 每個記憶體均為每個記憶體均為 88 位元位元 (( 即即 1Byte)1Byte) 00 FF H 7F H 80 H 位址 6.6. 每個記憶體的每個位元能放每個記憶體的每個位元能放 00 或或 11 0 1 0 100 11 7.7. 一個記憶體內的資料範圍為一個記憶體內的資料範圍為 00000000B~11111111B00000000B~11111111B 資料 相當於相當於 1010 進制範圍為進制範圍為 0~2550~255 相當於相當於 1616 進制範圍為進制範圍為 00H~FFH00H~FFH 8.8. 記憶體又稱暫存器記憶體又稱暫存器
  • 44.
    51 部資料記憶體內 (SFR) 1.1. 在在SFR 128SFR 128 個暫存器中僅有個暫存器中僅有 2626 個有用途個有用途 ,, 其餘沒其餘沒 有使用有使用 左圖中左圖中 ,, 每個格子均為一每個格子均為一 個記憶體個記憶體 ,, 左右兩邊數字左右兩邊數字 為位址為位址 2.2. 此此 2626 個記憶體個記憶體 ,, 均有其特定名稱均有其特定名稱 ,, 所以位址並不所以位址並不 重要重要3. ACC3. ACC 為累積器為累積器 ,, 又簡稱又簡稱 A,A, 最為常用最為常用 4. PSW4. PSW 為程式狀態字語為程式狀態字語 ,, 記錄程式執行中的各種狀記錄程式執行中的各種狀 態態5. P0~P35. P0~P3 暫存器直接與暫存器直接與 5151 的外部的外部 I/OI/O 接腳連通接腳連通 ,, 改改 變變 P0~P3P0~P3 之值之值 ,, 即可改變接腳的電壓準位即可改變接腳的電壓準位 ,, 或改變外或改變外 部部 I/OI/O 6.6. 其餘暫存器亦各有其負責的其餘暫存器亦各有其負責的 功功 能能 ,, 如計時計數的設定如計時計數的設定 ,, 中中 斷的斷的 控制控制 ,, 串列傳輸控制串列傳輸控制 ,, 電源電源 控制控制 等等…等等… 例例 : MOV A,#5AH: MOV A,#5AH MOV P3,AMOV P3,A CPL ACPL A JBJB PSW.4,LOOPPSW.4,LOOP 8F8F
  • 45.
    51 部資料記憶體內 (一般 用 ) 7F H 位址 資料 00 H 1F H 20 H 2F H 30 H 可位元定址區 16 個 BANK0~BANK 3 暫存器庫 32 個 一般暫存器 80 個 R0 R1 R2 R3 R4 R5 R6 R7 R0 R1 R2 R3 R4 R5 R6 R7 R0 R1 R2 R3 R4 R5 R6 R7 R0 R1 R2 R3 R4 R5 R6 R7 BANK 0 BANK 1 BANK 2 BANK 3 沒有額外 設定均選 擇 BANK0 例例 : MOV R5,#2: MOV R5,#2 DJNZ R7,$DJNZ R7,$ MOV A,R3MOV A,R3 ORL A,R0ORL A,R0 例例 : MOV 6AH,#C2H: MOV 6AH,#C2H ADD A,30HADD A,30H MOV 4BH,33HMOV 4BH,33H CJNECJNE A,55H,LOOP3A,55H,LOOP3 ANL 70H,#AAHANL 70H,#AAH SETB 30H.4SETB 30H.4 (x)(x) CLR 46H.0CLR 46H.0 (x)(x) 例例 : MOV: MOV 28H,#01001001B28H,#01001001B SETB 20H.7SETB 20H.7 CLR 2CH.1CLR 2CH.1 JB 26H.3,LOOP2JB 26H.3,LOOP2 .7 .6 .1.5 .4 .3 .2 .0
  • 46.
  • 47.
    外部硬體接線圖 LED 為低態動作 即 P0輸出 1 時熄 1 1 1 1 1 1 1 1 =1 0 0 0 0 0 0 0 0 P0 當成輸出 埠可輸出 0 或 1 0:0V 1:5V P0 輸出 0 時亮
  • 48.
    ORG 0H ;ROM位址 0H JMP INITIAL ; 跳至 INITIAL INITIAL: MOV R0,#11111100B ; 設定亮兩燈 LOOP: MOV P0,R0 ; 送至 P0 輸出 CALL DELAY ; 延時呼叫 MOV A,R0 ;R0 資料送至 A RR A ; 將 A 資料右移 MOV R0,A ; 將資料回存 JMP LOOP ; 跳至 LOOP ;================================= DELAY: ; 延時副程式 MOV R5,#2 D1: MOV R6,#250 D2: MOV R7,#200 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET ; 返回主程式 ;================================= END ; 程式結束 範例程式架構 1. 標籤欄 : 呼叫副程式或 程式跳躍時使用 , 同一 個程式 的標籤不可內 重複 2. 運算子欄 : 即指令 ,51 指令集共有 111 個指令 ( 不含假指令 ) 3. 運算元欄 : 該指令運算 或操作的對象或數值 4. 註解欄 : 可有可無 , 前 面要加分號 , 加程式增 的可讀性
  • 49.
  • 50.
    指令 明說 : 程式之執行一般都是往下執 行 ,一行接一行 , 但有時需 要跳至其它程式區段去執行 , 因此需要跳躍指令 “ 呼叫”是跳躍指令的一種 , 但這種跳躍是需要返迴的 . 因此需搭配“返迴”指令 , “ 呼 叫”一般用 “ CALL” 即可 , 後面接的即為目的地標籤 , 標籤名稱自行決定 . 返迴是 回到 CALL 的下一行 . 若沒 有返迴 , 則會有錯誤 . MOV A,#F3H MOV P0,R0 CALL DELAY MOV A,R0 . . DELAY: . . RET
  • 51.
    指令 明說 : “ 直接跳躍”指令是無條件的 跳躍, 也不需要返迴 . 一般 用 “ JMP” 即可 , 後面接的 即為要跳到的目的地標籤 , 標籤名稱自行決定 . . . MOV A,#F3H MAIN: MOV P0,R0 MOV A,R0 . . JMP MAIN
  • 52.
    指令 明說 : 假設 A的內容原先為 1100 1110 A R0 1100 1110 1110 1100 A PSW1 假設 PSW.7(C) 的內容為 1 SWAP A RR A 0111 0110 RRC A 1011 1011 0 CPL A 0100 0100 RL A 1000 1000 RLC A 0001 0000 CLR A 0000 0000 沒有以下這些指令: RL R0 RRC 35H SWAP P2 CLR R7 CPL 28H 若真的要將 R0 之值左 旋 :MOV A,R0 RL A MOV R0,A
  • 53.
    ORG 0H ;ROM位址 0H JMP INITIAL ; 跳至 INITIAL INITIAL: MOV R0,#11111100B ; 設定亮兩燈 LOOP: MOV P0,R0 ; 送至 P0 輸出 CALL DELAY ; 延時呼叫 MOV A,R0 ;R0 資料送至 A RR A ; 將 A 資料右移 MOV R0,A ; 將資料回存 JMP LOOP ; 跳至 LOOP ;================================= DELAY: ; 延時副程式 MOV R5,#2 D1: MOV R6,#250 D2: MOV R7,#200 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET ; 返回主程式 ;================================= END ; 程式結束 範例程式在 51 部動作情形內 R0 P0 A 1111110 0 P0 上的 8 顆 LED RA M 0111111 0 1111110 0 1111110 0 0111111 0 0111111 0 0011111 1 0011111 1 0011111 1 直 接 通 連
  • 54.
    開始 將初始 值放入 R0 將 R0內容 輸出至 P0 呼叫延遲 副程式 將 R0 內容 放入 A 將 A 內容 右移一位 將 A 內容 回存 R0 DELAY 將最外層重複 次數載入 R5 將中間層重複 次數載入 R6 將最內層重複 次數載入 R6 R7-1=0? R6-1=0? R5-1=0? RET 範例程式流程圖 INITIAL LOO P D2 D1 ORG 0H ;ROM 位址 0H JMP INITIAL ; 跳至 INITIAL INITIAL: MOV R0,#11111100B ; 設定亮兩燈 LOOP: MOV P0,R0 ; 送至 P0 輸出 CALL DELAY ; 延時呼叫 MOV A,R0 ;R0 資料送至 A RR A ; 將 A 資料右移 MOV R0,A ; 將資料回存 JMP LOOP ; 跳至 LOOP ;================================= DELAY: ; 延時副程式 MOV R5,#2 D1: MOV R6,#250 D2: MOV R7,#200 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET ; 返回主程式 ;================================= END ; 程式結束
  • 55.
  • 56.
    計次迴圈的運用 : D:Rn 或direct 減 1J: 跳躍至 rel N: 非 Z: 零 Rn:R0~R7 direct:20H~7FH rel: 跳躍的目的地 標籤 ( 自行命 名 ) 1 2 3 4 減 1 非 0 則跳 躍 減 1 為 0 則往 下 結論 :
  • 57.
    右移動作 ( 含延時 及輸出) R2-1=0? 設定右移次數 =6 次 ( 令 R2=6) 計次迴圈的運用 : . MOV R2,#6 RIGHT: . . ( 程式片段 ) . . DJNZ R2,RIGHT . RIGHT 右移動作 ( 含延時 及輸出 ) 3AH-1=0? 設定右移次數 =6 次 ( 令 3AH=6) . MOV 3AH,#6 RIGHT: . . ( 程式片段 ) . . DJNZ 3AH,RIGHT . RIGHT 沒有以下這些指令: DJNZ A,RIGHT DJNZ P0,RIGHT DJNZ 3AH,$ 代表 3AH 減 1 後非 0 就跳 回自己 減 1 後為 0 則往下執行 , $ 非標籤
  • 58.
    開始 將初始 值放入 R0 設定右移次數 R2=6 次 輸出, 延時 , 右移 DELAY 延時副程式 ( 略 ) RET INITIAL RIGHT R2-1=0? 設定左移次數 R2=6 次 輸出 , 延時 , 左移 R2-1=0? LEFT 將初始 值放入 R0 霹靂燈程式流程圖
  • 59.
  • 60.
    何謂指令週期: 1.1. 在在 80518051的的 1818 及及 1919 腳接上石英晶體振盪器腳接上石英晶體振盪器 (( 以以 12MHz12MHz 為例為例 )) 2.2. 則則 80518051 所收到的振盪頻率為所收到的振盪頻率為 12MHz12MHz 3.3. 振盪週期振盪週期 = == = uSuS 11 12M12M 11 1212 4.4. 指令週期指令週期定義定義為振盪週期的為振盪週期的 1212 倍倍即即 == 1uS1uS 5.5. 同理若外接同理若外接 4MHz4MHz 的的石英晶體振盪器石英晶體振盪器 ,, 則指令週期應為則指令週期應為 3uS3uS 6.6. 石英晶體振盪器的頻率愈高石英晶體振盪器的頻率愈高 ,, 則指令週期愈短則指令週期愈短 ,CPU,CPU 處理時間愈短處理時間愈短 ,, 效能效能 也就愈好也就愈好 7.AT89S5X7.AT89S5X 系列依系列依 DATASHEETDATASHEET 指示指示 ,, 最高可外接最高可外接 33MHz33MHz 的石英晶體振的石英晶體振 盪器盪器
  • 61.
    指令週期的影響 ( 以12MHz 為 例 ) : 代表執行本指令代表執行本指令 11 次須花費次須花費 2424 個振盪週期即個振盪週期即 22 個指令週期即個指令週期即 2uS2uS DJNZ R6,D2
  • 62.
    指令週期的影響 ( 以12MHz 為 例 ) : 代表執行本指令代表執行本指令 11 次須花費次須花費 1212 個振盪週期即個振盪週期即 11 個指令週期即個指令週期即 11uSuS MOV R7,#200 不同的 MOV 動作所耗費的時間也會有所 不同
  • 63.
    指令週期的影響 ( 以12MHz 為 例 ): 80518051 的的 111111 個指令中個指令中 ,, 此二指令此二指令 所花費時最長所花費時最長 ,, 達達 4uS4uS
  • 64.
    ORG 0H JMP INITIAL INITIAL: MOVR0,#11111100B LOOP: MOV P0,R0 CALL DELAY MOV A,R0 RR A MOV R0,A JMP LOOP ;================ DELAY: MOV R5,#2 D1: MOV R6,#250 D2: MOV R7,#200 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET ;================ END 範例程式時序分析 ( 以 12MHz 為 例 ): 2 1 1 1 2 如果本程式不加入 CALL DELAY 程 式 , 結果會如何 ? 結果 : 在 LOOP 迴圈內 , 只須 7uS 即 可完成 一輪 , 即 LED 每 7uS 就右旋一次 , 人 的肉眼無法反應 , 只能看到所有 LED 均在微亮 ( 還是有右旋 , 只是 太快 ) 因此加入延時副程式 , 將 LED 每 次亮的時間延長使人眼可以看的 出來右旋現象為止 2
  • 65.
    . . MOV P0,R0 CALL DELAY MOVA,R0 . . ;================ DELAY: MOV R5,#2 D1: MOV R6,#250 D2: MOV R7,#200 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET ;================ END 延遲時間之計算 ( 以 12MHz 為例 ): 2 2 1 1 2 2 2 1 2 X200 X250 X250 X250 X2 X 2 X 2 X 2X 2 1 2 500 200000 100 04 2 合計 201511 個指令 週期即延遲 201511uS 大約為 0.2 秒 即每 0.2 秒 LED 右 旋一次 若 R5 放 5 則延遲 0.5 秒若 R5 放 20 則延遲 2 秒依此類推 由此可知 : 本程式中 ,CPU 大部份時間是在進行延時工作 (7:201511)而無法去做其它事情 , 此為致命缺點 , 若能使用計時器 , 則
  • 66.
    次每 call delay時間不同的做法 : 1. 寫不同的副程式 . CALL DELAY_0.3S . CALL DELAY_1S . ;======================== DELAY_0.3S: MOV R5,#3 D1_0.3: MOV R6,#250 D2_0.3: MOV R7,#200 DJNZ R7,$ DJNZ R6,D2_0.3 DJNZ R5,D1_0.3 RET ;======================== DELAY_1S: MOV R5,#10 D1_1: MOV R6,#250 D2_1: MOV R7,#200 DJNZ R7,$ DJNZ R6,D2_1 DJNZ R5,D1_1 RET 2. 呼叫前先設定時間 . MOV R5,#3 CALL DELAY . MOV R5,#10 CALL DELAY . ;======================== DELAY: D1: MOV R6,#250 D2: MOV R7,#200 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET
  • 67.
  • 68.
    8051 與開關的連接 : 按鈕開關 切換( 指撥 ) 開關 (a)(c) 為低態動作 : 開關 on=>8051 得到 0 訊 號 開關 off=>8051 得到 1 訊 號 (b)(d) 為高態動作 : 開關 on=>8051 得到 1 訊 號 開關 off=>8051 得到 0 訊 號 10k 電阻稱為上拉電阻 (pull up) 470 電阻稱為下拉電阻 (pull
  • 69.
    8051 程式如何判斷開關狀 態 : 開關的on 或 off 代表著 8051 要做兩種不同的 處置因此 8051 需要用檢 指令來檢 接 收到的查 查 腳 訊號是 0 或 1, 進而去執行相對應的功能 P2.3
  • 70.
    檢 指令查 (1): JB P2.3,ABCDE . . JB P2.3,ABCDE . . (P2.3=0 則執行此段程式 ) . . ABCDE: . . (P2.3=1 則執行此段程式 ) . . 記法 :1 跳 0 往 下 第二種處置 P2.3=1? 第一種處置 ABCDE: 1 0
  • 71.
    檢 指令查 (2): JNB P2.3,KEY_DOWN . . CHECK: JNB P2.3,KEY_DOWN JMP CHECK . . KEYDOWN: . . (P2.3=0 則執行此段程式 ) . . 記法 :0 跳 1 往 下 P2.3=0 的處置 P2.3=0? KEY_DOWN: 0 1 CHEC K:
  • 72.
    檢 指令查 (3): JB 及 JNB 指令不僅可以對 PORT0~PORT3 等 32 位元做檢 動作查 , 亦可對其它種類位元做檢 查 : JB ACC.6,LOOP ;(ACC 即為 A) JNB 28H.0,$ JNB PSW.4,MAIN JB TF0,TIME_UP
  • 73.
    範例程式 1: 功能 :八個指撥開關對應到八個 LED, 開關 ON,LED 亮 . 開關 OFF,LED 熄 . LED 接在 P0(P0 當輸出 ), 開關接 在 P2(P2 當輸 入 ), 均為低態動 作
  • 74.
    範例程式 1: SETTING : LOOP : ORG 0 SETTING: MOVP2,#FFH LOOP: MOV A,P2 MOV P0,A JMP LOOP END 若 P2 上的開關如右 則 P2 暫存器的 容為內 11001110 P 2P 0 A 1100 1110 1100 1110 1100 1110 RA M 若 P2 上的開關變成如 右
  • 75.
    範例程式 2: 功能 :(以四個指撥開關控制 LED 的四種狀 態 ) SW0(P2.0) ON:SW1(P2.1) ON:SW2(P2.2) ON:SW3(P2.3) ON: 開關全 OFF:
  • 76.
    LED 全熄 狀態零 CASE0: 1 0 開始 規劃 P2為輸入埠 P2.0=0? SW0 狀態一 1 P2.1=0? SW1 狀態二 1 P2.2=0? SW2 狀態三 P2.3=0? SW3 1 0 0 0 SETTING : LOOP : CASE1: CASE2: CASE3: ORG 0 SETTING: MOV P2,#FFH LOOP: JNB P2.0,CASE0 JNB P2.1,CASE1 JNB P2.2,CASE2 JNB P2.3,CASE3 MOV P0,#11111111B JMP LOOP CASE0: MOV P0,#00111100B JMP LOOP CASE1: MOV P0,#00000000B JMP LOOP CASE2: MOV P0,#11000011B JMP LOOP CASE3: MOV P0,#10101010B JMP LOOP END 範例程式 2:
  • 77.
    範例程式 2: 問題 : 若有一個以上的開關ON, 則 51 會去執行那一個 態狀 ? 改進 :( 僅使用二個指撥開關 ) SW 1 SW 0OF F OF F OF F ON ON OF FON ON
  • 78.
  • 79.
    範例程式 3: 功能 :以指撥開關模擬按鈕開 關 SW0=>PB0 按鈕 SW1=>PB1 按鈕若 PB0(ON) 按一下 , 則 P0.0 上的 LED 亮 . 若 PB1(OFF) 按一下 , P0.0 上的 LED 熄 . PB0(O N) PB1(OF F) M M/ a
  • 80.
    範例程式 3: 只讓一顆燈 ON或 OFF=>( 只控制一位元為 0 或 1) SETB P0.0 ; 將 P0.0 腳位直接設定為 1 CLR P0.0 ; 將 P0.0 腳位直接清除為 0 CPL P0.0 ; 將 P0.0 腳位由 0 變 1 或 1 變 0( 取補數 )
  • 81.
    範例程式 3: ORG 0 SETTING: MOVP2,#FFH LOOP: JNB P2.0,LED_ON JNB P2.1,LED_OFF JMP LOOP LED_ON: CLR P0.0 JMP LOOP LED_OFF: SETB P0.0 JMP LOOP END LED_ON : SETTING : LOOP : LED_OFF: (0 ) (0 ) (1 ) (1 ) 若將 SW0 及 SW1 同時 按下 : LED 會亮 , 此為通電優 先如何改成停止優先 ? LED_ON : SETTING : LOOP : LED_OFF: (0 ) (0 ) (1 ) (1 ) PB0 PB1
  • 82.
    程式設計 : SW 1 SW 0 OF F OF F OF F ON ON OF FONON 馬燈跑 ( 單燈慢 速 )霹靂燈 ( 雙燈快 速 )左四燈與右四燈互閃 ( 慢 速 )八燈全亮全熄閃爍 ( 慢速 ) (P2.1) (P2.0) 程式 1 功能 :
  • 83.
    程式 1 提示 : 跑馬燈 P2.0=0? SW0 NO(1) YES(0) P2.1=0? SW1 NO(1) P2.1=0? SW1 NO(1) YES(0) 霹靂燈 左右互閃 八燈閃爍 YES(0) LOOP : 進入四個態之一後狀 , 須定時返回 LOOP 標籤重新檢 開關的最新查 狀 態 , 讓 LED 可以隨時切換亮燈 態狀 若沒有返回 LOOP 再次檢 開關查 態狀 , 則程式會陷入該 態持續執狀 行而不會有切換至其它 態的機會狀 跳回 LOOP 的時機很重要 , 通常會 跟迴圈有關係 , 並且要注意初始值 設定的問題 ( 以完成一週期後再跳 回 LOOP 較為簡單 ) 一週期 一週期 一週期 一週期 NO NO NO NO YES YES YES YES
  • 84.
    SW1=>PB1(OFF 按鈕 ) (P2.1) SW0=>PB0(ON按鈕 ) (P2.0) SW2=>TH- RY(P2.2)LED0=> 燈綠 (P0.0) LED2=> 紅燈 ( 電磁開關 ) (P0.2) LED1=> 燈黃 (P0.1) LED3=> 蜂鳴器 (P0.3) 功能 : 1.PB0 按一下 , 燈熄綠 , 燈亮黃 ,3 秒 後 , 燈熄黃 , 紅燈亮 .PB1 按一下則紅 燈熄 , 燈亮綠 .( 先完成此局部功能再 處理下列功能 ) 2. 若在紅燈亮時 ,TH-RY 動作則紅燈 熄 , 蜂鳴器動作 , 燈亮綠 .TH-RY 復 歸後 , 蜂鳴器停止動作 , 燈恆亮綠 . 程式 2 功能:
  • 85.
    程式 2 提示 : 1.斷電優先 紅黃燈熄 綠燈亮 PB1(OFF) 按下 ? NO YES TH-RY 動作 ? NO PB0(ON) 按下 ? N O 綠燈熄 黃燈亮 LOOP : 綠燈亮? YES 清除 蜂鳴器 OFF: N O 3秒 黃燈熄 紅燈亮 YES ON: 紅黃燈熄 綠燈亮 蜂鳴器動作 THRY: YES 2. 燈亮的三秒鐘黃 內 , 按下 OFF 開關會沒有 法停辦 止 ,WHY?
  • 86.
    程式 3 功能: 請撰寫小便斗自動沖水裝置之控制程式 SW0=>距離感測器 (P2.0) LED0=> 電源指示 ( 燈綠 )(P0.0) LED2=> 沖水閥 (P0.2) LED1=> 人體接近 ( 紅燈 ) (P0.1)
  • 87.
  • 88.
    馬燈及霹靂燈的特色:跑 馬燈及霹靂燈的動作都是有規則的跑 馬燈為不斷地往左移跑 ( 或往右) 霹靂燈為往左 ( 右 ) 移一定次數後再 往右 ( 左 ) 移一定次數…不斷重複 以上動作可用左移右移指令配合計次 迴圈指令即可達成 若亮燈 態沒有規則狀 , 則上述方法已 不敷使用 , 須藉 表法完成查
  • 89.
    問題描述 ( 範例程式 1):P0 上 LED 的 態狀1 2 3 4 5 6 7 8 9 1 011 1 21 31 4 P0 暫存器 之內 值 11111111 11111110 11111100 11111000 11110000 11100000 11000000 10000000 00000000 11111111 11100111 11000011 10000001 00000000
  • 90.
    ORG 0H START: MOV P0,#11111111B;1 CALL DELAY MOV P0,#11111110B ;2 CALL DELAY MOV P0,#11111100B ;3 CALL DELAY MOV P0,#11111000B ;4 CALL DELAY MOV P0,#11110000B ;5 CALL DELAY MOV P0,#11100000B ;6 CALL DELAY MOV P0,#11000000B ;7 CALL DELAY MOV P0,#10000000B ;8 CALL DELAY MOV P0,#00000000B ;9 CALL DELAY MOV P0,#11111111B ;10 CALL DELAY MOV P0,#11100111B ;11 CALL DELAY MOV P0,#11000011B ;12 CALL DELAY MOV P0,#10000001B ;13 CALL DELAY MOV P0,#00000000B ;14 CALL DELAY JMP START DELAY: ; 略 一般寫法 : 缺點 :(1) 態愈多程式愈長狀 (2) 寫法死板沒有彈性 1 2 3 4 5 6 7 8 9 1 011 1 21 31 4
  • 91.
    表法的原理查 : 將 LED的亮燈 態狀 直接寫成程式碼 ( 透過 DB 指令 ) 並燒寫至 8051 的 ROM 內 , 待程式執行後 , 再以查 表指令 MOVC 將 態 詢複製到狀 值查 RAM 的 ACC 內 , 再予以輸出至 P0 TAB_START: DB 11111111B DB 11111110B DB 11111100B DB 11111000B DB 11110000B DB 11100000B DB 11000000B DB 10000000B DB 00000000B DB 11111111B DB 11100111B DB 11000011B DB 10000001B DB 00000000B 1111 1111 1111 1110 1111 1100 1111 1000 1111 0000 1110 0000 1100 0000 1000 0000 1100 0011 1000 0001 0000 0000 .. RO M 燒錄 RA MACC 表 查
  • 92.
    ORG 00H INITIAL: MOV DPTR,#TAB_START MOVR0,#0 MOV R1,#14 LOOP: MOV A,R0 MOVC A,@A+DPTR MOV P0,A CALL DELAY INC R0 DJNZ R1,LOOP JMP INITIAL ; ================================= === TAB_START: DB 11111111B DB 11111110B DB 11111100B DB 11111000B DB 11110000B DB 11100000B DB 11000000B DB 10000000B DB 00000000B DB 11111111B DB 11100111B DB 11000011B DB 10000001B DB 00000000B ; ================================= === DELAY: MOV R5,#3 D1: MOV R6,#200 D2: MOV R7,#250 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET ; ================================= === 範例程式 1 程式 碼 : ( 使用 表查 法 ) 表格
  • 93.
    行號 地址 機械碼程式碼 1 ORG 00H 2 INITIAL: 3 0000 900013 MOVDPTR,#TAB_START 4 0003 7800 MOV R0,#0 5 0005 790E MOV R1,#14 6 LOOP: 7 0007 E8 MOV A,R0 8 0008 93 MOVC A,@A+DPTR 9 0009 F580 MOV P0,A 10 000B 120021 CALL DELAY 11 000E 08 INC R0 12 000F D9F6 DJNZ R1,LOOP 13 0011 0100 JMP INITIAL 14 TAB_START: 15 0013 FF DB 11111111B 16 0014 FE DB 11111110B 17 0015 FC DB 11111100B 18 0016 F8 DB 11111000B 19 0017 F0 DB 11110000B 20 0018 E0 DB 11100000B 21 0019 C0 DB 11000000B 22 001A 80 DB 10000000B 23 001B 00 DB 00000000B 24 001C FF DB 11111111B 25 001D E7 DB 11100111B 26 001E C3 DB 11000011B 27 001F 81 DB 10000001B 組合語言與機械碼的對照 (LST 檔 ): 組 合 語 言 機 械 碼 (ROM) 組譯器
  • 94.
    行號 地址 機械碼程式碼 1 ORG 00H 2 INITIAL: 3 0000 900013 MOVDPTR,#TAB_START 4 0003 7800 MOV R0,#0 5 0005 790E MOV R1,#14 6 LOOP: 7 0007 E8 MOV A,R0 8 0008 93 MOVC A,@A+DPTR 9 0009 F580 MOV P0,A 10 000B 120021 CALLDELAY 11 000E 08 INC R0 12 000F D9F6 DJNZ R1,LOOP 13 0011 0100 JMP INITIAL 14 TAB_START: 15 0013 FF DB 11111111B 16 0014 FE DB 11111110B 17 0015 FC DB 11111100B 18 0016 F8 DB 11111000B 19 0017 F0 DB 11110000B 20 0018 E0 DB 11100000B 21 0019 C0 DB 11000000B 22 001A 80 DB 10000000B 23 001B 00 DB 00000000B 24 001C FF DB 11111111B 25 001D E7 DB 11100111B 26 001E C3 DB 11000011B 27 001F 81 DB 10000001B 組合語言與機械碼的對照 (LST 檔 ): MOV A,R0 被譯成 E8 並燒至 ROM 的 0007H 位址 MOV P0,A 被譯成 F5 及 80 並燒至 ROM 的 0009H 及 000AH 位址CALL DELAY 被譯成 12 及 00 及 21 並燒至 ROM 的 000BH 及 000CH 及 000DH 位址 標籤不是指令 , 所以不會被譯成機械碼 , 但標籤代表一 個 ROM 的位址 ( 跳躍用 , 呼叫用或查表用 ) 假指令是給組譯器看的 , 並不會被譯成機械 碼 資料 ( 機械 碼 ) 位址 1001 0000 0000 0000 0001 0011 0111 1000 0000 0000 0111 1001 0000 1110 1110 1000 1001 0011 1101 1101 1111 0110 0010 0010 0000 H0001 H0002 H0003 H0004 H0005 H0006 H0007 H0008 H 002B H002C H002D 1111 0101 1000 0000 0009 H000A H … … ROM 的 容 內
  • 95.
    行號 地址 機械碼程式碼 14 TAB_START: 15 0013 FF DB 11111111B 16 0014 FE DB 11111110B 17 0015 FC DB 11111100B 18 0016 F8 DB 11111000B 19 0017 F0 DB 11110000B 20 0018 E0 DB 11100000B 21 0019 C0 DB 11000000B 22 001A 80 DB 10000000B 23 001B 00 DB 00000000B 24 001C FF DB 11111111B 25 001D E7 DB 表格部 程式碼及機械碼份 : 表格資料共 14 筆 , 從 ROM 的位址 0013H 開始放置 , 最後一筆的位址為 0020H 表格的啟始位址為 0013H, 由 TAB_START 標籤代表 , 因此撰寫程式時 , 毋須了解表格內容放在那裡 , 只要有啟始標 籤即可 , 而且啟始位址為查表時重要依據 , 視為基準量 ( 其值固定不變 ). 查表時 , 一次只能查一個位址的資料 , 例如 要查” C0”( 位址為 0019H) 這筆資料 , 則要 以 0013H+6 的方式來取得 , 其中 0013H 即為 TAB_START( 基準量 ),6 為偏移量 亦即只要控制偏移量之值 ( 不超過 13), 即 可讀取到表格中任一值 此例中 , 偏移量之範圍為 0~13
  • 96.
    ORG 00H INITIAL: MOV DPTR,#TAB_START MOVR0,#0 MOV R1,#14 LOOP: MOV A,R0 MOVC A,@A+DPTR MOV P0,A CALL DELAY INC R0 DJNZ R1,LOOP JMP INITIAL ; ================================= === TAB_START: DB 11111111B DB 11111110B DB 11111100B DB 11111000B DB 11110000B DB 11100000B DB 11000000B DB 10000000B DB 00000000B DB 11111111B DB 11100111B DB 11000011B DB 10000001B DB 00000000B ; ================================= === 表的方式查 : 1. 先將表格 始位址 存至啟 DPTR 暫存器內 MOV DPTR,#TAB_START 2. 將 A 存入要 詢的資料的偏移量查 (0~13) MOV A,R0 ; 此時 A 內容為偏 移量 3. 利用 MOVC 指令 表查 MOVC A,@A+DPTR ; 此時 A 內容為對應的表格資 料 4. 再將 到資料輸出至查 P0 MOV P0,A MOV 為 RAM 部的資料內 轉移 MOVC 為 ROM 複製 至 RAM DPTR 為 RAM 部的暫存內 器是由 DPH 及 DPL 組成 , 共 16 位元是 表法專用的查 1 2 3 4
  • 97.
    表法的動作原理查 : ORG 00H INITIAL: MOVDPTR,#TAB_START MOV R0,#0 MOV R1,#14 LOOP: MOV A,R0 MOVC A,@A+DPTR MOV P0,A CALL DELAY INC R0 DJNZ R1,LOOP JMP INITIAL ; ================================= === TAB_START: DB 11111111B DB 11111110B DB 11111100B DB 11111000B DB 11110000B DB 11100000B DB 11000000B DB 10000000B DB 00000000B DB 11111111B DB 11100111B DB 11000011B DB 10000001B DB 00000000B ; ================================= === DP L DP HDPT R A P0 R0 R1 RAM 內 容 … 資料 ( 機械 碼 ) 位址 1111 1111 1111 1110 1111 1100 1111 1000 1111 0000 1110 0000 1100 0000 1000 0000 0000 0000 1100 0011 1000 0001 0000 0000 0013 H0014 H0015 H0016 H0017 H0018 H0019 H001A H001B H 001E H001F H0020 H 1111 1111 1110 0111 001C H001D H ROM 表內 格 … …… … 0000 00000001 0011 0偏移 量 1 4 計次迴圈 01111 1111 1111 1111 1 1 3 11111 1110 1111 1110 P0 上的 LED 2 1 2 21111 1100 1111 1100
  • 98.
    範例程式 2: 自行設計 8顆 LED 之廣告燈 ( 至少 50 種 狀態 )問題 : 最多可使用多少種狀 態 ? 範例程式 3: 自行設計 10 顆 LED 之廣告燈 提示 :8 顆接 P0,2 顆接 P2, 建表時 連續兩個表格內容視為同一筆資料 , 迴 圈跑一次 , 要查兩次表 , 一次 輸出至 P0, 另一次輸出至 P2, 然後才延時一次 . TAB_START: DB 11100000B ;P0 DB 11111111B ;P2 DB 00011111B ;P0 DB 1 2 3
  • 99.
    範例程式 4: 自行設計 8顆 LED 之廣告燈 (DELAY 時間不 同 )提示 : 建表時第一筆資料為延時時間 , 第 二筆資料為 LED 狀態 ( 兩筆資料為一組 ), 同一迴圈要查兩次表 TAB_START: DB 5 ;0.5 秒 DB 11110000B ;LED DB 10 ;1 秒 DB 00001111B ;LED DB 2 ;0.2 秒 DB 11000011B ;LED . . 1 2 3 範例程式 5: 同上題 , 改為 10 顆 LED 範例程式 6: 設計紅綠燈程式 ( 綠燈不閃爍型及綠燈閃爍 型 )
  • 100.
  • 101.
  • 102.
  • 103.
    七段顯示器介紹 : 共陽極 : 01 0 0 1 0 0 1 5 a b c d e f g dp 顯示 0 0 0 0 0 0 1 1 0 1 0 0 1 1 1 1 1 1 0 0 1 0 0 1 0 1 2 0 0 0 0 1 1 0 1 3 1 0 0 1 1 0 0 1 4 1 1 0 0 0 0 0 1 6 0 0 0 1 1 1 1 1 7 0 0 0 0 0 0 0 1 8 0 0 0 1 1 0 0 1 9 1 1 1 1 1 1 1 1 全熄
  • 104.
    七段顯示器介紹 : 共陰極 : 10 1 1 0 1 1 0 5 a b c d e f g dp 顯示 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 0 1 1 1 0 1 1 0 1 0 2 1 1 1 1 0 0 1 0 3 0 1 1 0 0 1 1 0 4 0 0 1 1 1 1 1 0 6 1 1 1 0 0 0 0 0 7 1 1 1 1 1 1 1 0 8 1 1 1 0 0 1 1 0 9 0 0 0 0 0 0 0 0 全熄
  • 105.
    七段顯示器介紹 : 共陽極 : 以8051 控制 7-SEG 可用如下指令 : MOV P0,#10011111B ; 顯示 1 MOV P0,#10011001B ; 顯示 4 … 如此太過繁瑣 , 程式 大時龐 , 更顯麻煩 若能將 0~9 的顯示碼建立表格 , 用 表查 方式尋得後再予以輸出顯示 , 較為方便
  • 106.
    TABLE:TABLE: ; abcde;abcde ff ggdpdp DBDB 0000001000000111BB ;; 共陽極之共陽極之 00 DBDB 1001111100111111BB ;; 共陽極之共陽極之 11 DBDB 0010010001001011BB ;; 共陽極之共陽極之 22 DBDB 0000110000011011BB ;; 共陽極之共陽極之 33 DBDB 1001100100110011BB ;; 共陽極之共陽極之 44 DBDB 0100100010010011BB ;; 共陽極之共陽極之 55 DBDB 1100000110000011BB ;; 共陽極之共陽極之 66 DBDB 0001111000111111BB ;; 共陽極之共陽極之 77 DBDB 0000000000000011BB ;; 共陽極之共陽極之 88 DBDB 0001100000110011BB ;; 共陽極之共陽極之 99 1. 若偏移量為 0 則可查 到 0 的顯示碼 , 依此類推 2. 顯示碼的排序須依據 0~9 的順序排列 3. 偏移量的範圍為 0~9 不可超過 七段顯示器介紹 : 共陽極 :
  • 107.
    建立表格方式: TABLE:TABLE: DBDB 00000011B00000011B DBDB 10011111B10011111B DBDB00100101B00100101B DBDB 00001101B00001101B DBDB 10011001B10011001B DBDB 01001001B01001001B DBDB 11000001B11000001B DBDB 00011111B00011111B DBDB 00000001B00000001B DBDB 00011001B00011001B 二進制 ( 一列一資料 ) TABLE:TABLE: DBDB 03H03H DBDB 9FH9FH DBDB 25H25H DBDB 0DH0DH DBDB 99H99H DBDB 49H49H DBDB C1HC1H DBDB 1FH1FH DBDB 01H01H DBDB 19H19H 十六進制 ( 一列一資料 ) = TABLE:TABLE: DBDB 33 DBDB 159159 DBDB 3737 DBDB 1313 DBDB 153153 DBDB 7373 DBDB 193193 DBDB 3131 DBDB 11 DBDB 2525 十進制 ( 一 列一資料 ) = TABLE:TABLE: DB 3,159,37,13,153,73,193,31,1,25DB 3,159,37,13,153,73,193,31,1,25 = 十進制 ( 一列多資料 ) TABLE:TABLE: DB 03H,9FH,25H,0DH,99H,49HDB 03H,9FH,25H,0DH,99H,49H DB C1H,1FH,01H,19HDB C1H,1FH,01H,19H 十六進制 ( 一列多資料 ) =
  • 108.
    範例程式 1: 以一顆 7-SEG顯示自己的手機號碼 0→ 熄→ 9→ 熄→ 3→ 熄→ 3→ 熄→ 9→ 熄→ 4→ 熄→ 9→ 熄→ 0→ 熄→ 0→ 熄→ 6→ 熄 數字亮 0.5 秒 , 熄 0.3 秒 , 最後一次熄 2 秒 # 電話號碼排序沒有規則
  • 109.
    範例程式 1: A=0 查表 ,輸 出 , 延時 開始 全熄 延時 A=9 查表 , 輸 出 , 延時 全熄 延時 A=6 查表 , 輸 出 , 延時 全熄 延時 ORGORG 0H0H INITIAL:INITIAL: MOVMOV DPTR,#TABLEDPTR,#TABLE LOOP:LOOP: MOVMOV A,#0A,#0 ;; 偏移量即顯示數字偏移量即顯示數字 MOVCMOVC A,@A+DPTRA,@A+DPTR MOVMOV P0,AP0,A MOVMOV R5,#5R5,#5 CALLCALL DELAYDELAY MOVMOV P0,#11111111BP0,#11111111B    ;; 全熄全熄 MOVMOV R5,#3R5,#3 CALLCALL DELAYDELAY .. .. .. MOVMOV P0,#11111111BP0,#11111111B MOVMOV R5,#20R5,#20 CALLCALL DELAYDELAY JMPJMP LOOPLOOP TABLE:TABLE: DBDB 0000001000000111BB ;; 共陽極之共陽極之 00 DBDB 1001111100111111BB ;; 共陽極之共陽極之 11 DBDB 0010010001001011BB ;; 共陽極之共陽極之 22 DBDB 0000110000011011BB ;; 共陽極之共陽極之 33 DBDB 1001100100110011BB ;; 共陽極之共陽極之 44 DBDB 0100100010010011BB ;; 共陽極之共陽極之 55 DBDB 1100000110000011BB ;; 共陽極之共陽極之 66 DBDB 0001111000111111BB ;; 共陽極之共陽極之 77 DBDB 0000000000000011BB ;; 共陽極之共陽極之 88 DBDB 0001100000110011BB ;; 共陽極之共陽極之 99 DELAY:DELAY: 略略 記錄表格頭 INITIAL : LOO P: 缺點 :數字多則程式變長 , 可用其它方式改進
  • 110.
    範例程式 2: 0~9 秒上數計時器 9顯示完後先全熄 再從 0 開始上數 查表並 輸出 , 延時 R0=10? R0=0 NO YES 將 R0( 偏 移量 ) 加 1 全熄輸出 並延時 開始 延遲時間為 1 秒 INITIAL : 記錄表格頭 R0=0( 偏移量 ) LOO P:
  • 111.
    ORGORG 0H0H INITIAL:INITIAL: MOVMOV DPTR,#TABLEDPTR,#TABLE MOVMOVR0,#0R0,#0 LOOP:LOOP: MOVMOV A,R0A,R0 MOVCMOVC A,@A+DPTRA,@A+DPTR MOVMOV P0,AP0,A CALLCALL DELAYDELAY INCINC R0R0 CJNECJNE R0,#10,LOOPR0,#10,LOOP MOVMOV R0,#0R0,#0 MOVMOV P0,#11111111bP0,#11111111b CALLCALL DELAYDELAY JMPJMP LOOPLOOP TABLE:TABLE: DBDB 0000001000000111BB ;; 共陽極之共陽極之 00 DBDB 1001111100111111BB ;; 共陽極之共陽極之 11 DBDB 0010010001001011BB ;; 共陽極之共陽極之 22 DBDB 0000110000011011BB ;; 共陽極之共陽極之 33 DBDB 1001100100110011BB ;; 共陽極之共陽極之 44 DBDB 0100100010010011BB ;; 共陽極之共陽極之 55 DBDB 1100000110000011BB ;; 共陽極之共陽極之 66 DBDB 0001111000111111BB ;; 共陽極之共陽極之 77 DBDB 0000000000000011BB ;; 共陽極之共陽極之 88 DBDB 0001100000110011BB ;; 共陽極之共陽極之 99 DELAY:DELAY: 略略 查表並 輸出 , 延時 R0=10? R0=0 NO YES 將 R0( 偏 移量 ) 加 1 全熄輸出 並延時 開始 INITIAL : 記錄表格頭 R0=0( 偏移量 ) LOO P: 範例程式 2:
  • 112.
    範例程式 2: CJNE R0,#10,ABC . . CJNER0,#10,ABC . (R0=10 則執行此段程式 ) . . ABC: . . ( 不相等則執行此段程式 ) . . 記法 : 不同則跳 , 相同往 下 第二種處置 R0=10? 第一種處置 ABC: NO YES C: 比較 J: 跳躍 N: 非 E: 相同
  • 113.
    記錄表格一標籤 查表得要顯示的數字 R1-1=0? 令 R0=0( 第一次偏移量) 令 R1=10(10 個數字 ) R0=0 R1=10 NO YES 開始程式3 : 功能同範例程式1 將要顯示的數字也建立成表格 ( 表格 一 )NUM_TABLE:DB 0,9,3,3,9,4,9,0,0,6NUM_TABLE:DB 0,9,3,3,9,4,9,0,0,6 ;; 要顯示的數字要顯示的數字 (( 表格一表格一 )) TABLE:TABLE: ;; 共陽極共陽極 7SEG7SEG 顯示碼顯示碼 (( 表格二表格二 )) DBDB 00000011B00000011B DBDB 10011111B10011111B DBDB 00100101B00100101B DBDB 00001101B00001101B DBDB 10011001B10011001B DBDB 01001001B01001001B DBDB 11000001B11000001B DBDB 00011111B00011111B DBDB 00000001B00000001B DBDB 00011001B00011001B 第一次 表查 ( 表格一 ) 得”要顯示 的數字” , 當成第二次 表查 ( 表格 二 ) 的偏移量去 出其查 顯示碼 , 並 輸出 記錄表格二標籤 查表得該數字顯示碼 輸出並延時 全熄輸出 並延時 R0+1 ( 偏移量加 1) INITIAL : LOO P: AAA: 全熄輸出 並延時
  • 114.
    程式 4: 功能同範例程式 2(但改為下數 ) 加 1 指令 :INC R0 減 1 指令 :DEC RO 程式 5: 修改範例程式 2 或程式 4, 但加入二 個按鈕開關 PB1 及 PB2 PB1: 開始計數或繼續計數 PB2: 暫停計數
  • 115.
    範例程式6 : 設計 00~99上數計時 器設定 30H 記憶體為個位 數 => 命名為 ONE 設定 31H 記憶體為拾位 數 => 命名為 TEN 1 . 2 . 3 . 可以任意設定起始值 ( 改常 數 ) 4 . 個位數放 P0, 拾位數放 P25 . 99 之後直接跳 00, 不須全 熄6 間隔時間可任意設定 ( 改常 查個位數 , 輸出 查拾位數 , 輸出 並延時 ONE=10? ONE=0 TEN=TEN+1 NO YES ONE=ONE+1 開始 INITIAL : 記錄表格頭 設定初始值 LOO P: 為變數命名 設定初始值 A TEN=10? TEN=0 NO YES A
  • 116.
    TENTEN EQUEQU 31H31H ONEONEEQUEQU 30H30H TEN_VTEN_V EQUEQU 88 ONE_VONE_V EQUEQU 33 TIMEBASETIMEBASE EQUEQU 22 ;======================;====================== ORGORG 0H0H INITIAL:INITIAL: MOVMOV DPTR,#TABLEDPTR,#TABLE MOVMOV TEN,#TEN_VTEN,#TEN_V MOVMOV ONE,#ONE_VONE,#ONE_V LOOP:LOOP: MOVMOV A,ONEA,ONE MOVCMOVC A,@A+DPTRA,@A+DPTR MOVMOV P0,AP0,A MOVMOV A,TENA,TEN MOVCMOVC A,@A+DPTRA,@A+DPTR MOVMOV P2,AP2,A CALLCALL DELAYDELAY 範例程式6 : INCINC ONEONE MOVMOV A,ONEA,ONE CJNECJNE A,#10,LOOPA,#10,LOOP MOVMOV ONE,#0ONE,#0 INCINC TENTEN MOVMOV A,TENA,TEN CJNECJNE A,#10,LOOPA,#10,LOOP MOVMOV TEN,#0TEN,#0 JMPJMP LOOPLOOP ;=====================;===================== TABLE:TABLE: 略略 ;=====================;===================== DELAY:DELAY: MOVMOV R5,#TIMEBASER5,#TIMEBASE 略略 ;=====================;===================== ENDEND 查個位數 , 輸出 查拾位數 , 輸出 並延時 ONE=10? ONE=0 TEN=TEN+1 NO YES ONE=ONE+1 開始 INITIAL : 記錄表格頭 設定初始值 LOO P: 為變數命名 設定初始值 A TEN=10? TEN=0 NO YES A
  • 117.
    程式 7: 將範例程式 6改成下 數 程式 8: 將範例程式 6 或程式 7 加入一個切換開關 SW SW ON=> 上 數SW OFF=> 下 程式 9: 修改程式 6,7 或 8, 當拾位數為 0 時 , 拾位數 7SEG 須不 亮 , 只亮個位數 SW 接至 P3.0, 程式 中以 SW 代替 (SW EQU P3.0)
  • 118.
  • 119.
    8051 有兩個計時計數器 : Timer0及 Timer1 8052 則多一個計時計數器: Timer2 與 Timer0 有關之暫存器 :TMOD TCON TL0 TH0與 Timer1 有關之暫存器 :TMOD TCON TL1 TH1與 Timer2 有關之暫存器 :T2CON TL2 TH2 計時計數器使用 驟步 (Timer0 及 1): 1. 設定計時計數器操作模式 (TMOD) 2. 設定計時或計數值 (THx 及 TLx)3. 動計時或計數器啟 (TCON) 4. 檢 計時計數器是否溢位查 (TCON) Timer0:TH0 及 TL0Timer1:TH1 及 TL1
  • 120.
    1.1. 計時計數器模式暫存器計時計數器模式暫存器 TMODTMOD MOV TMOD,#00000000B表示兩個都設定為計時 器, 都是 部 動內 啟 , 且 均為模式 0 MOV TMOD,#01000001BTimer0 為 部 動的內 啟 計時器 , 採用模式 1 Timer1 為 部 動的內 啟 計數器 , 採用模式 0 TMOD 共有八位元 , 位於 SFR 內
  • 121.
    (1)(1) 以以 THxTHx及及 TLxTLx 計量暫存器設定計量暫存器設定 ,, 且使用且使用 mode1 16mode1 16 位元模位元模 式式 2.2. 設定計時器計時時間設定計時器計時時間 此此 1616 位元可設定之數 為值位元可設定之數 為值 0~655350~65535 (2)(2) 設定 與時間的關係與值設定 與時間的關係與值 80518051 外接的石英振盪器頻率有關外接的石英振盪器頻率有關 若若 OSC=12MHzOSC=12MHz 指令週期指令週期 =1uS=1uS 計時時間計時時間 == 設定值設定值 XX 指令週期指令週期 則則 mode1mode1 之計時範圍為之計時範圍為 0S~65535uS(65mS0S~65535uS(65mS 左右左右 )) (3)(3) 一般取整數較為恰當一般取整數較為恰當 計時計時 50mS=>50mS=> 設定設定 5000050000計時計時 10mS=>10mS=> 設定設定 1000010000 計時計時 2mS=>2mS=> 設定設定 20002000 高高 88 位位 元元 低低 88 位位 元元
  • 122.
    2.2. 設定計時器計時時間設定計時器計時時間 MOVMOV TL0,#<(65536-TL0, #<(65536-5000050000)) ;; 取用低取用低 88 位元位元 MOVMOV TH0, #>(65536-TH0, #>(65536-5000050000)) ;; 取用高取用高 88 位元位元 或或 MOVMOV TL0, #(65536-TL0, #(65536-5000050000).MOD.32).MOD.32 ;; 取取 88 位元的餘數位元的餘數 MOVMOV TH0, #(65536-TH0, #(65536-5000050000)/32)/32 ;; 取取 88 位元的商數位元的商數 或或 MOVMOV TL0, #<TL0, #<-50000-50000 ;; 取用低取用低 88 位元位元 MOVMOV TH0, #>TH0, #>-50000-50000 ;; 取用高取用高 88 位元位元 (4)(4) 設定方式設定方式 (50mS(50mS 為例須設定為例須設定 50000)50000)
  • 123.
    3.3. 動計時器啟動計時器啟 4.4. 檢計時器是否溢位查檢 計時器是否溢位查 (( 計時計時 到到 ))TCON 共有八位元 , 位於 SFR 內 SETB TR0 ;SETB TR0 ; 動啟動啟 TIMER0TIMER0CLR TR0 ;CLR TR0 ; 暫停暫停 TIMER0TIMER0 SETB TR1 ;SETB TR1 ; 動啟動啟 TIMER1TIMER1CLR TR1 ;CLR TR1 ; 暫停暫停 TIMER1TIMER1 TIMER0TIMER0 溢位時溢位時 (( 計時計時 到到 )) TF0TF0 會由會由 00 變變 11 可由可由 JBJB 指令檢 之查指令檢 之查 TIMER1TIMER1 溢位時溢位時 (( 計時計時 到到 )) TF0TF0 會由會由 00 變變 11
  • 124.
    開關的彈跳現象開關的彈跳現象 P2.3 KS ON P2.3為 0 KS OFF P2.3 為 1 1 0 KS ON 一次 P2.3 理想上應只收到一次 0 電 位 但實際上 , 開關在按下及放開後 10m~20m 秒 ,P2.3 均可能會因彈跳收到好幾次 0 電位 KS 按下 KS 放 開 若應用至計數電路 , 就有可能會發生開關按 一次 , 而數字卻加了好幾下的情形 因此 , 電路須加上防彈跳電路
  • 125.
  • 126.
    軟體防彈跳程式軟體防彈跳程式 1 0 KS 按下 KS放 開 1. 持續偵測開關電位 態狀 , 若為 1 則繼續偵 測 2. 若偵測到 0, 則 DELAY 20mS 以避開彈跳 階段 3.DELAY 完成後 , 再次偵測是否為 0, 若是 , 則代表為有效的訊 號 若否 , 則代表為雜訊 4. 開關放開的防彈跳亦同
  • 127.
    範例程式範例程式 1:1: 功能功能 ::以一個按以一個按 鈕開關控制一個鈕開關控制一個 七段顯示器的數七段顯示器的數 字字 ,, 按一下加一按一下加一 (0~9(0~9 循環循環 ,, 須具須具 防彈跳功能防彈跳功能 )) 仍然為 0? 顯示值加一 不可超過 10 延時 20mS CALL DEBOUNCE 開始 SETTIN G: 設定計時器模式 7SEG 顯示 0 LOO P: 為變數命名 設定初始值 A 接腳收到 0? NO(0) YES(1 ) A NO(1 ) YES(0) 接腳收到 1? NO(1 )YES(0) 1 0 KS 按下 KS 放 開 仍然為 1? NO(0) YES(1 ) DEBOUNC E 延時 20mS CALL DEBOUNCE 設定計時時間 啟動計時器 計時到 ? TFx=1? RET I
  • 128.
    範例程式範例程式 1:1: COUNTEQU 20000 SW EQU P2.0 SEG7 EQU P0 ; ================================ ORG 0H SETTING: MOV TMOD,#00010001B MOV DPTR,#NUM_TABLE MOV R0,#0 MOV A,R0 MOVC A,@A+DPTR MOV SEG7,A ; ================================ LOOP: SETB SW KEYCHK: JB SW,KEYCHK CALL DEBOUNCE JB SW,KEYCHK INC R0 CJNE R0,#10,ABC MOV R0,#0 ABC: MOV A,R0 MOVC A,@A+DPTR MOV SEG7,A KEYCHK2: JNB SW,KEYCHK2 CALL DEBOUNCE JNB SW,KEYCHK2 JMP LOOP NUM_TABLE: DB 03H,9FH,25H,0DH,99H DB 49H,C1H,1FH,01H,19H ; ================================ === DEBOUNCE: MOV TH0,#>(65536-COUNT) MOV TL0,#<(65536-COUNT) SETB TR0 WAIT: JNB TF0,WAIT CLR TF0 RET ; ================================ == END 仍然為 0? 顯示值加一 不可超過 10 延時 20mS CALL DEBOUNCE 開始 SETTIN G: 設定計時器模式 7SEG 顯示 0 LOO P: 為變數命名 設定初始值 A 接腳收到 0? NO(0) YES(1 ) A NO(1 ) YES(0) 接腳收到 1? NO(1 )YES(0) 仍然為 1? NO(0) YES(1 ) DEBOUNCE 延時 20mS CALL DEBOUNCE 設定計時時間 啟動計時器 計時到 ? TFx=1? RET I
  • 129.
    程式程式 2:2: 功能功能 ::在範例程式在範例程式 11 中加上另一按中加上另一按 鈕鈕 開關開關 ,, 使其能將顯示數字減一使其能將顯示數字減一
  • 130.
  • 131.
    中斷:即打斷 8051 目前執行的程 序, 而先行前往特定的中斷副程 式執行 , 待中斷副程式執行完 畢後 , 再返回原程式繼續執行 定時中斷: 隔一段固定時間即每 產 生一次中斷事件
  • 132.
    8051 的 5種中斷 (8052 多一種 ): 外部中斷 INT0 及 INT1 外部中斷 T0 及 T1(8052 多 T2 中斷 ) 串列埠中斷
  • 133.
    與 T0 中斷有關之暫存 器: 與 T1 中斷有關之暫存 器 : 定時中斷使用 驟步 (T0 及 T1): 1. 設定中斷相關暫存器 (IE 及 IP) 2. 設定堆疊暫存器 始位址啟 (SP) 4. 動計時器啟 (TCON)=> 等待中 斷5. 中斷副程式執行完畢後 , 回 驟步 3 IE IP SP TMOD TCON TL0 TH0 IE IP SP TMOD TCON TL1 TH1 3. 設定計量暫存器數值 (THx 及 TLx) 同計時 器設定
  • 134.
    1.1. 設定中斷致能暫存器設定中斷致能暫存器 IEIE 動啟T1 中斷開 關 : SETB ET1 若只用一種中斷功能則 IP 暫存器可不用設定 IE 及 IP 均有八位元 , 位於 SFR 內 中斷優先等級暫存器中斷優先等級暫存器 IPIP 動中斷總開關啟 :SETB EA
  • 135.
    2.2. 設定堆疊暫存器設定堆疊暫存器 SPSP MOVSP,#70H ;30H~7FH 均可設定方式 : 作用: MOV A,#5CH MOV R0,A 主程式 PUSH A MOV A,#0 MOV P3,A POP A RETI 中斷副程式 RA M SP=70 H 71 H 72 H A
  • 136.
    中 斷 源中斷 源 中 斷 向 量中 斷 向 量 INT0INT0 03H03H TF0TF0 0BH0BH INT1INT1 13H13H TF1TF1 1BH1BH RI/TIRI/TI 23H23H TF2/EXF2TF2/EXF2 2BH2BH 中斷向量中斷向量 :: 寫法寫法 :: ORG 0H JMP SETTING ORG 1BH JMP TIMER1_INT SETTING: TIMER1_INT:
  • 137.
    範例程式1:範例程式1: 功能:以定時中斷法功能:以定時中斷法 重寫走馬燈重寫走馬燈 重新設定 R0 值 R1左移並輸出顯示 開始 SETTIN G:設定中斷開關及堆疊 設定計時器模式及計時量 設定中斷次數 (R0) LED 亮一顆燈 (R1) 啟動計時器 MAIN : 為變數命名 設定初始值 R0=0? NO YES(0) TIMER1_INT A 及 PSW 內容 送入堆疊 R0 值減一 RET I 重新設定及計時量 及啟動計時器 將堆疊內容取出 送回 A 及 PSW
  • 138.
    範例程式1:範例程式1: 重新設定 R0 值 R1左移並輸出顯示 開始 SETTIN G:設定中斷開關及堆疊 設定計時器模式及計時量 設定中斷次數 (R0) LED 亮一顆燈 (R1) 啟動計時器 MAIN : 為變數命名 設定初始值 R0=0? NO YES(0) TIMER1_INT A 及 PSW 內容 送入堆疊 R0 值減一 RET I 重新設定及計時量 及啟動計時器 將堆疊內容取出 送回 A 及 PSW COUNT EQU 50000 LED EQU P0 TIMEBASE EQU 10 ; ========================== = ORG 0H JMP SETTING ORG 1BH JMP TIMER1_INT ; ========================== == SETTING: SETB EA SETB ET1 MOV SP,#70H MOV TMOD,#00010001B MOV TH1,#>(65536- COUNT) MOV TL1,#<(65536- COUNT) MOV R0,#TIMEBASE MOV R1,#11111110B MOV LED,R1 SETB TR1 ; ========================== == MAIN: CJNE R0,#0,MAIN MOV R0,#TIMEBASE MOV A,R1 RL A MOV R1,A MOV LED,R1 JMP MAIN ; ========================== == TIMER1_INT: PUSH A PUSH PSW DEC R0 MOV TH1,#>(65536- COUNT) MOV TL1,#<(65536- COUNT) SETB TR1 POP PSW POP A RETI ; ========================== == END ; ==========================
  • 139.
    程式程式 22 :: 功能功能 ::以定時中斷法重寫霹靂燈以定時中斷法重寫霹靂燈
  • 140.
  • 141.
    多工:利用電腦邊打 8051 程式, 邊 聽 mp3 音樂 , 同時還可從網路 下載 案……檔 , 一部電腦可以 同時做三件事情 ( 甚至更多 ), 即所謂的多工系統 . 8051 多工:利用定時中斷 , 可輕易 寫 出多工功能的程式
  • 142.
    範例程式1:範例程式1: 功能:走馬燈及單顆功能:走馬燈及單顆 七段顯示器倒數同時七段顯示器倒數同時 執行之程式執行之程式 (( 兩個功兩個功 能能)) 重新設定 R0 值 R1 左移並輸出顯示 開始 SETTIN G: 設定中斷開關及堆疊 設定計時器模式及計時量 設定中斷次數 (R0)( 走馬燈 ) LED 亮一顆燈 (R1) 記錄數字顯示碼之表格頭 設定中斷次數 (R2)( 倒數 ) 7SEG 顯示” 9”(R3) 啟動計時器 MAIN : 為變數命名 設定初始值 R0=0? NO YES(0) TIMER1_INT A 及 PSW 內容 送入堆疊 R0 值減一 RET I 重新設定計時量 及啟動計時器 將堆疊內容取出 送回 A 及 PSW 重新設定 R2 值 R1 減 1 並輸出顯示 ( 小於 0 須重設為 9) R2=0? NO YES(0) CASE2 : R2 值減一 每 50mS 執 行此副程式一 次 走馬燈相關程式碼 一位數倒數相關程式碼 若要加上第三個或更多功 能 , 則在設定區 , 主程式區 及中斷副程式區均須加入 相關程式 其餘為定時中斷相關程 式碼
  • 143.
    範例程式1:範例程式1: 重新設定 R0 值 R1左移並輸出顯示 開始 SETTIN G: 設定中斷開關及堆疊 設定計時器模式及計時量 設定中斷次數 (R0)( 走馬燈 ) LED 亮一顆燈 (R1) 記錄數字顯示碼之表格頭 設定中斷次數 (R2)( 倒數 ) 7SEG 顯示” 9”(R3) 啟動計時器 MAIN : 為變數命名 設定初始值 R0=0? NO YES(0) TIMER1_INT A 及 PSW 內容 送入堆疊 R0 值減一 RET I 重新設定計時量 及啟動計時器 將堆疊內容取出 送回 A 及 PSW COUNT EQU 50000 LED EQU P0 TIMEBASE EQU 15 SEG7 EQU P2 TIMEBASE2 EQU 20 ;========================= ORG 0H JMP SETTING ORG 1BH JMP TIMER1_INT ;========================= SETTING: SETB EA SETB ET1 MOV SP,#70H MOV TMOD,#00010001B MOV TH1,#>(65536- COUNT) MOV TL1,#<(65536- COUNT) MOV R0,#TIMEBASE MOV R1,#11111110B MOV LED,R1 MOV DPTR,#NUM_TABLE MOV R2,#TIMEBASE2 MOV R3,#9 MOV A,R3 MOVC A,@A+DPTR MOV SEG7,A SETB TR1 ;========================= MAIN: CJNE R0,#0,CASE2 MOV R0,#TIMEBASE MOV A,R1 RL   A MOV R1,A MOV LED,R1 CASE2: CJNE R2,#0,MAIN MOV R2,#TIMEBASE2 DEC R3 CJNE R3,#255,ABC MOV R3,#9 ABC: MOV A,R3 MOVC A,@A+DPTR MOV SEG7,A JMP MAIN ;======================== TIMER1_INT: PUSH A PUSH PSW DEC R0 DEC R2 MOV TH1,#>(65536- COUNT) MOV TL1,#<(65536- COUNT) SETB TR1 POP PSW POP A RETI ;===================== NUM_TABLE: DB 03H,9FH,25H,0DH,99H DB 49H,C1H,1FH,01H,19H ;==================== 重新設定 R2 值 R1 減 1 並輸出顯示 ( 小於 0 須重設為 9) R2=0? NO YES(0) CASE2 : R2 值減一
  • 144.
    程式程式 22 :: 功能功能 :: 1.1.霹歷燈霹歷燈 (( 間隔間隔 50mS X50mS X 1111)) 2.2. 右邊右邊 7SEG7SEG 由由 00 數至數至 9(9( 間隔間隔 50mS X50mS X 1515)) 3.3. 左邊左邊 7SEG7SEG 由由 99 數至數至 0(0( 間隔間隔 50mS X50mS X 1919)) 先完成先完成 再加入再加入 再加上再加上
  • 145.
  • 146.
    若要將 8051 接上4 顆七段顯示器 , 用之 前的方式 , 須接上 32 支 才能完成控制腳 , 在 8051 的 I/O 資源有限情形下 , 此舉 是非常浪費的 . 若有借助外部 7447 解碼 IC 的輔助 , 仍須 16 支腳 ( 但成本更高 ). 上述二法之優點為 7SEG 是全時恆亮 , 不 是輪流亮 . 8051 P0 P1 P2 P3 7447744774477447 8051 P0 P1
  • 147.
    8051 多工顯示:利用掃描方式讓 4顆七段 顯示器輪流亮 ( 一次只亮一顆 ), 只要輪流的 速度 快且控制得宜夠 , 就可讓人的眼睛看到 4 顆同時亮的假像 . 優點 : 只用八條線及一 顆 7447, 缺點 : 亮度較暗 7447 8051 掃描線 數 字 碼 P2P0 P1 P3 其 它 用 途 (24 支 腳 )
  • 148.
    錯誤資料 : 0111 1100 10100111 手提箱顯示模組接線定義 : 資料 :11101001 資 料 :01110000資料 :10110011 資料 :11010001 千百拾個 8 4 2 1 若上述四筆資料不斷循環 ( 速度須夠 快 ), 則可以看到以下情形 : 至於循環速度 , 大約設定為 5mS 即可太快 LED 都不會亮 , 太慢則會 看見 4 顆顯示器輪流亮 8 支均為接地端 ( 接一支即 可 ) 千 百 拾 個 1248個拾百千 高態動作低態動作 掃描碼 : 數字碼 : 資 料
  • 149.
    範例程式範例程式 1:1: 功能功能 ::以以 44 顆七段顯示器顯示一組四位數顆七段顯示器顯示一組四位數 (1357)(1357) 提示提示 :: 1.1. 先設定掃描碼先設定掃描碼 1110111011101110 並讓掃描碼每並讓掃描碼每 5mS5mS 左旋一次左旋一次 11101111110111 0011011101101110 1110111011011101 1101110110111011 1111101111110111 0011011101101110 1110111011011101 1101110110111011 11 2.2. 再檢 掃描碼那個位元為查再檢 掃描碼那個位元為查 0,0, 例如最左邊為例如最左邊為 0(0( 即顯示千位數即顯示千位數 THOTHO)) 則必須將掃描碼與千位數則必須將掃描碼與千位數合併合併成為輸出資料送至顯示模組成為輸出資料送至顯示模組 若只看高四位元即可發現若只看高四位元即可發現 :: 只要只要 四次就會重複四次就會重複 ,, 亦即亦即個拾百千個個拾百千個 拾百千拾百千………… ,, 因此每次左旋完成因此每次左旋完成 後取其高四位元即為掃描碼後取其高四位元即為掃描碼 ,, 而而 低四位元必須低四位元必須清為清為 00 THO=THO=0000000000010001 HUN=HUN=0000000000110011 TEN=TEN=0000000001010101 ONE=ONE=0000000001110111 (1)(1) 掃描碼掃描碼 0111011101110111 與與 常數常數 1111000011110000 做做 ANDAND 運算運算 ,, 以清除掃描碼低四以清除掃描碼低四 位元位元 011101011101 1111111100111100 0000 ANAN DD 011101110000 0000 (2)(2) 前一步驟之結果與千前一步驟之結果與千 位數位數 THO=00000001THO=00000001 做做 OROR 運算運算 ,, 以產生輸出資以產生輸出資 料料 011101110000 0000000000000000 0101 OROR 011101110000 0101 顯示資料顯示資料 ,, 送至模組送至模組
  • 150.
    COUNT EQU 5000 ONEEQU 30H TEN EQU 31H HUN EQU 32H THO EQU 33H TMP EQU 34H SEG7_4 EQU P2 ;==================== ORG 0H JMP SETTING ORG 1BH JMP TIMER1_INT ;==================== SETTING: SETB EA SETB ET1 MOV SP,#70H MOV TMOD,#00010001B MOV TH1,#>(65536-COUNT) MOV TL1,#<(65536-COUNT) MOV R0,#11101110B MOV ONE,#7 MOV TEN,#5 MOV HUN,#3 MOV THO,#1 SETB TR1 MAIN: NOP JMP MAIN ;===================== TIMER1_INT: PUSH A PUSH PSW MOV A,R0 RL A MOV R0,A THOCHK: JB ACC.7,HUNCHK MOV TMP,THO ANL A,#11110000B ORL TMP,A JMP SHOW HUNCHK: JB ACC.6,TENCHK MOV TMP,HUN ANL A,#11110000B ORL TMP,A JMP SHOW TENCHK: JB ACC.5,ONECHK MOV TMP,TEN ANL A,#11110000B ORL TMP,A JMP SHOW ONECHK: MOV TMP,ONE ANL A,#11110000B ORL TMP,A SHOW: MOV SEG7_4,TMP MOV TH1,#>(65536-COUNT) MOV TL1,#<(65536-COUNT) SETB TR1 POP PSW POP A RETI ;====================== END ;====================== 範例程式範例程式 1:1: 不做任何事 開始 SETTIN G:設定中斷開關及堆疊 設定計時器模式及計時量 設定掃描碼 設定要顯示的四位數 啟動計時器 MAIN : 為變數命名 設定初始值 NO TIMER1_INT A 及 PSW 內容 送入堆疊 掃描值左旋 NO YES 掃描碼千 位為 0? 千位數暫存至 TMP 掃描碼低四位元清除 掃描碼與千位數組合 成輸出資料 YES 掃描碼百 位為 0? 百位數暫存至 TMP 掃描碼低四位元清除 掃描碼與百位數組合 成輸出資料 YES 掃描碼拾 位為 0? 拾位數暫存至 TMP 掃描碼低四位元清除 掃描碼與拾位數組合 成輸出資料 個位數暫存至 TMP 掃描碼低四位元清除 掃描碼與個位數組合 成輸出資料 NO THOCHK : HUNCH K: TENCHK : ONECH K: 將輸出資料 輸出顯示 SHOW: 將 PSW 及 A 內 容自堆疊取出 RET I 重新設定計時量 及啟動計時器
  • 151.
    範例程式範例程式 2:2: 功能功能 ::十進制十進制 44 位數上數計數器位數上數計數器 (( 每每 0.10.1 秒加秒加 1)1) 提示提示 :: 在範例程式在範例程式 11 主程式主程式中加入計數功能中加入計數功能NO YES 0.1 秒時間到 ? R1=TIMEBASE ONE=ONE+1 ( 個位數加 1) MAIN : 因為範例程式因為範例程式 11 之定時中斷時間為之定時中斷時間為 5mS,5mS, 所以須所以須中斷中斷 2020 次才等於次才等於 0.10.1 秒秒 ONE=10? YES NO ONE=0 TEN=TEN+1 ( 拾位數加 1) TEN=10? YES NO TEN=0 HUN=HUN+1 ( 百位數加 1) HUN=10? YES NO HUN=0 THO=THO+1 ( 千位數加 1) THO=10? YES NO THO=0
  • 152.
    TIMEBASE EQU 20 ;==================== ORG0H ;==================== SETTING: MOV R1,#TIMEBASE ;==================== MAIN: CJNE R1,#0,MAIN MOV R1,#TIMEBASE INC ONE MOV A,ONE CJNE A,#10,MAIN MOV ONE,#0 INC TEN MOV A,TEN CJNE A,#10,MAIN MOV TEN,#0 INC HUN MOV A,HUN CJNE A,#10,MAIN MOV HUN,#0 INC THO MOV A,THO CJNE A,#10,MAIN MOV THO,#0 JMP MAIN ;==================== TIMER1_INT: DEC R1 範例程式範例程式 2:2:
  • 153.
    程式程式 3:3:功能功能 :: 簡易時簡易時 鐘鐘 說明說明:: 四顆七段顯示四顆七段顯示 ,, 左邊兩顆為”時”左邊兩顆為”時” (( 顯示顯示 00~23)00~23)右邊兩顆為”分”右邊兩顆為”分” (( 顯示顯示 00~59)00~59) 另使用兩顆另使用兩顆 LED,LED, 以以 0.50.5 秒亮秒亮 0.50.5 秒熄方式顯示”秒熄方式顯示” 秒”秒” 說明說明 :: 四顆七段顯示四顆七段顯示 ,, 左邊兩顆為”分”左邊兩顆為”分” (( 顯示顯示 00~59)00~59)右邊兩顆為”秒”右邊兩顆為”秒” (( 顯示顯示 00~59)00~59)另使用兩顆另使用兩顆 LED,LED, 以以 0.50.5 秒亮秒亮 0.50.5 秒熄方式顯示”秒熄方式顯示” 秒”秒” 說明說明 :: 四顆七段顯示四顆七段顯示 ,, 左邊兩顆為”時”左邊兩顆為”時” (( 顯示顯示 00~23)00~23)右邊兩顆為”分”右邊兩顆為”分” (( 顯示顯示 00~59)00~59) 另使用兩顆另使用兩顆 LED,LED, 以以 0.50.5 秒亮秒亮 0.50.5 秒熄方式顯示”秒熄方式顯示” 秒”秒” 有興趣同學可再修改成以下功能有興趣同學可再修改成以下功能
  • 154.
  • 155.
    揚聲器發聲: 蜂鳴器發聲: 送 0 或1 至揚聲器都不會發出聲 音 0: 靜音 0: 靜音 1: 發聲 1: 發聲 0 1 只有在 0 變 1 及 1 變 0 的瞬間才 會發出聲音 , 因此準位變化的愈 頻繁 , 發出的聲音頻率愈高 , 反 之利用 8051 控制 1 與 0 的時間 即可控制揚聲器發出聲音的頻率 發音
  • 156.
  • 157.
  • 158.
    音調 (Tone): 即聲音的頻率 ,以中音 Do 為例 , 其頻率 為 523Hz, 週期 =1912uS, 半週期 =956uS 0 956uS 1912u S 1 1 0 亦即每 956uS 就要將輸出至揚聲器的 接 準位反相腳 (0 變 1,1 變 0), 若用定時 中斷須設定 THx=#>(65536-956) 相當於 THx=#252TLx=#<(65536-956) 相當於 TLx=#68 因為 65536-956=64580, 而 64580/256=252 餘 68
  • 159.
    低低 音音 頻頻 率率 T/2T/2 THxTHx TLxTLx中中 音音 頻率頻率 T/2T/2 THxTHx TLxTLx 高高 音音 頻率頻率 T/2T/2 THxTHx TLxTLx DoDo 262262 19081908 248248 140140 DoDo 523523 956956 252252 6868 DoDo 10461046 478478 254254 3434 Do*Do* 277277 18051805 248248 243243 Do*Do* 554554 903903 252252 122122 Do*Do* 11091109 451451 254254 6262 ReRe 294294 17011701 249249 9292 ReRe 587587 852852 252252 173173 ReRe 11751175 426426 254254 8787 Re*Re* 311311 16081608 249249 185185 Re*Re* 622622 804804 252252 221221 Re*Re* 12451245 402402 254254 111111 MiMi 330330 15151515 250250 2121 MiMi 659659 759759 253253 1010 MiMi 13181318 379379 254254 133133 FaFa 349349 14331433 250250 104104 FaFa 698698 716716 253253 5252 FaFa 13971397 358358 254254 155155 Fa*Fa* 370370 13511351 250250 185185 Fa*Fa* 740740 676676 253253 9393 Fa*Fa* 14801480 338338 254254 175175 SoSo 392392 12761276 251251 55 SoSo 784784 638638 253253 131131 SoSo 15681568 319319 254254 194194 So*So* 415415 12051205 251251 7676 So*So* 831831 602602 253253 167167 So*So* 16611661 301301 254254 211211 LaLa 440440 11361136 251251 144144 LaLa 880880 568568 253253 200200 LaLa 17601760 284284 254254 228228 La*La* 464464 10781078 251251 208208 La*La* 932932 536536 253253 232232 La*La* 18651865 268268 254254 244244 SiSi 494494 10121012 252252 1212 SiSi 988988 506506 254254 66 SiSi 19761976 253253 255255 33 頻率單位為 Hz, 週期單位為 uS 各音階頻率 , 半週期及 THx TLx 對照 表 : OSC=12M Hz
  • 160.
    範例程式範例程式 1:1: 功能功能 ::以一開關控制揚聲器發聲以一開關控制揚聲器發聲 開關開關 OFF:OFF: 靜音 開關靜音 開關 ON:ON: 發聲發聲 提示提示 :: 開關開關 OFFOFF 時時 ,, 關掉關掉 T1T1 的定時中斷的定時中斷 =>=> CLRCLR TR1TR1開關開關 ONON 時時 ,, 動啟動啟 T1T1 的定時中斷的定時中斷 =>=> SETBSETB TR1TR1 而定時中斷時間則由聲音頻率所對應的而定時中斷時間則由聲音頻率所對應的 THxTHx 及及 TLxTLx 取得值取得值
  • 161.
    範例程式範例程式 1:1: 先將開關接腳準位 設為高態 開始 SETTIN G: 設定中斷開關及堆疊 設定計時器模式 MAIN : 為變數命名 TIMER1_INT A及 PSW 內容 送入堆疊 揚聲器準位反相 將 PSW 及 A 內 容自堆疊取出 RET I 重新設定計時量 及啟動計時器 SPK EQU P2.0 KEY1 EQU P0.0 H_TMP EQU 31H L_TMP EQU 32H ;========================== ORG 0H JMP SETTING ORG 1BH JMP TIMER1_INT ;=========================== SETTING: SETB EA SETB ET1 MOV SP,#70H MOV TMOD,#00010001B ;============================ MAIN: SETB KEY1 JB KEY1,NOKEY MOV H_TMP,#255 ; 高音 Si MOV L_TMP,#3 ; 高音 Si SETB TR1 JMP MAIN NOKEY: CLR TR1 JMP MAIN ;============================ ;========================== TIMER1_INT: PUSH A PUSH PSW CPL SPK MOV TH1,H_TMP MOV TL1,L_TMP SETB TR1 POP PSW POP A RETI ;========================== END NO(1 ) YES( 0) 開關是否 按下 ? 關閉 T1 的定時中斷 將聲頻的對應值 填入自訂暫存器 及 T1 的計量暫存器 NOKEY : 啟動 T1 的定時中斷
  • 162.
    程式程式 2:2: 功能功能 ::設計簡易電子琴設計簡易電子琴 說明說明 :: 擴充範例程式一擴充範例程式一 ,, 將開關數量增加將開關數量增加 為為 88 個即可個即可 ,, 分別發出中音分別發出中音 Do~Do~ 高音高音 DoDo 等等 88 個音個音
  • 163.
  • 164.
    低低 音音 頻頻 率率 T/2T/2 THxTHx TLxTLx中中 音音 頻率頻率 T/2T/2 THxTHx TLxTLx 高高 音音 頻率頻率 T/2T/2 THxTHx TLxTLx DoDo 262262 19081908 248248 140140 DoDo 523523 956956 252252 6868 DoDo 10461046 478478 254254 3434 Do*Do* 277277 18051805 248248 243243 Do*Do* 554554 903903 252252 122122 Do*Do* 11091109 451451 254254 6262 ReRe 294294 17011701 249249 9292 ReRe 587587 852852 252252 173173 ReRe 11751175 426426 254254 8787 Re*Re* 311311 16081608 249249 185185 Re*Re* 622622 804804 252252 221221 Re*Re* 12451245 402402 254254 111111 MiMi 330330 15151515 250250 2121 MiMi 659659 759759 253253 1010 MiMi 13181318 379379 254254 133133 FaFa 349349 14331433 250250 104104 FaFa 698698 716716 253253 5252 FaFa 13971397 358358 254254 155155 Fa*Fa* 370370 13511351 250250 185185 Fa*Fa* 740740 676676 253253 9393 Fa*Fa* 14801480 338338 254254 175175 SoSo 392392 12761276 251251 55 SoSo 784784 638638 253253 131131 SoSo 15681568 319319 254254 194194 So*So* 415415 12051205 251251 7676 So*So* 831831 602602 253253 167167 So*So* 16611661 301301 254254 211211 LaLa 440440 11361136 251251 144144 LaLa 880880 568568 253253 200200 LaLa 17601760 284284 254254 228228 La*La* 464464 10781078 251251 208208 La*La* 932932 536536 253253 232232 La*La* 18651865 268268 254254 244244 SiSi 494494 10121012 252252 1212 SiSi 988988 506506 254254 66 SiSi 19761976 253253 255255 33 頻率單位為 Hz, 週期單位為 uS 各音階頻率 , 半週期及 THx TLx 對照 表 : OSC=12M Hz
  • 165.
    範例程式範例程式 1:1: 電話忙線音電話忙線音 392H392H zz 0.50.5 秒秒 392H392H zz 0.50.5 秒秒 靜音靜音 0.50.5 秒秒 靜音靜音 0.50.5 秒秒 T0T0負責負責 0.50.5 秒的計時秒的計時 (50mS(50mS 定時中斷定時中斷 1010 次次 ))T1T1 負責負責 392Hz392Hz 的計時的計時 (( 定時中斷定時中斷 TH1=TH1=251251,TL1=,TL1=55)) 以建立表格方式以建立表格方式 ,, 將上述資訊結構化將上述資訊結構化 :: DB 10,251,5DB 10,251,5 靜音部份靜音部份 T0T0 定時中斷仍持續計時定時中斷仍持續計時 0.50.5 秒秒 ,, 而而 靜音沒有頻率問題靜音沒有頻率問題 ,, 以以 0,00,0 代替代替 ,, 表格資料如表格資料如 下下 :: DB 10,0,0DB 10,0,0 若 表得到查若 表得到查 0,0, 則關閉則關閉 T1T1 的定時中斷功能的定時中斷功能 (CLR(CLR TR1)TR1)
  • 166.
    範例程式範例程式 1:1:T0_COUNT EQU50000 SPK EQU P2.0 TIMES EQU 30H H_TMP EQU 31H L_TMP EQU 32H ;================================ ORG 0H JMP SETTING ORG 0BH JMP TIMER0_INT ORG 1BH JMP TIMER1_INT ;================================ SETTING: SETB EA SETB ET0 SETB ET1 MOV SP,#70H MOV TMOD,#00010001B MOV TH0,#>(65536-T0_COUNT) MOV TH0,#<(65536-T0_COUNT) MOV DPTR,#TABLE MOV R0,#0 SETB TR0 ;================================ MAIN: MOV A,R0 MOVC A,@A+DPTR MOV TIMES,A CJNE A,#255,SOUND MOV R0,#0 JMP MAIN SOUND: CALL READ_TONE SOUND1: MOV A,TIMES CJNE A,#0,SOUND1 CLR TR1 INC R0 JMP MAIN ;========================= READ_TONE: INC R0 MOV A,R0 MOVC A,@A+DPTR MOV H_TMP,A MOV TH1,H_TMP INC R0 MOV A,R0 MOVC A,@A+DPTR MOV L_TMP,A MOV TL1,L_TMP MOV A,H_TMP CJNE A,#0,SPK_WORK CLR TR1 RET SPK_WORK: SETB TR1 RET ;========================= TIMER0_INT: PUSH A PUSH PSW DEC TIMES MOV TH0,#>(65536-T0_COUNT) MOV TL0,#<(65536-T0_COUNT) SETB TR0 POP PSW POP A RETI ;================================= TIMER1_INT: PUSH A PUSH PSW CPL SPK MOV TH1,H_TMP MOV TL1,L_TMP SETB TR1 POP PSW POP A RETI ;================================= TABLE: DB 10,251,5 ;0.5S 發音 (392Hz) DB 10,0,0 ;0.5S 靜音 DB 255 ; 結束碼 ;============================ END
  • 167.
    程式程式 2:2: 警車笛聲警車笛聲 262Hz262Hz 0.720.72秒秒 349Hz349Hz 0.720.72 秒秒 262Hz262Hz 0.720.72 秒秒 349Hz349Hz 0.720.72 秒秒 程式程式 3:3: 電話鈴聲電話鈴聲 311311 HzHz 25m25m SS 480480 HzHz 25m25m SS 311311 HzHz 25m25m SS 480480 HzHz 25m25m SS 311311 HzHz 25m25m SS 480480 HzHz 25m25m SS 311311 HzHz 25m25m SS 480480 HzHz 25m25m SS 311311 HzHz 25m25m SS 480480 HzHz 25m25m SS 311311 HzHz 25m25m SS 480480 HzHz 25m25m SS 第一次第一次 第二次第二次 第三次第三次 第四次第四次 第十九次第十九次 第二十次第二十次 靜音二秒靜音二秒 程式程式 4:4: 消防車笛聲消防車笛聲 請自行設計請自行設計
  • 168.
    程式程式 5:5: 音樂播放音樂播放 1拍為 0.5 秒 (500mS) 1/2 拍為 0.25 秒 (250mS) 1/4 拍為 0.125 秒 (125mS) 1/8 拍為 0.0625(62.5mS) 8051 定時中斷時間最長為 65mS 左右 , 因此設定每 62.5mS(62500) 中斷一次 : 節拍節拍 1/81/8 1/41/4 1/21/2 11 22 中斷次數中斷次數 11 22 44 88 1616 TL0=#<(65536- 62500) TH0=#>(65536-62500)
  • 169.
    程式程式 5:5: 音樂播放音樂播放 DB3,252,68DB 3,252,68 DB 1,0,0DB 1,0,0 DB 4,252,68DB 4,252,68 DBDB 8,252,1738,252,173DB 8,252,68DB 8,252,68 DB 8,253,52DB 8,253,52 DB 16,253,10DB 16,253,10