Port 0: là port 8 bit có 2 chức năng
– Là I/O port đối với các thiết kế cỡ nhỏ ( khôngsử dụng bộ nhớ mở rộng)
– Là byte thấp của address/data bus khi thiết kế có sử dụng bộ nhớ mở rộng
• Port 1: là I/O port 8 bit
• Port 2: là port 8 bit có 2 chức năng
– Là I/O port đối với các thiết kế cỡ nhỏ ( khôngsử dụng bộ nhớ mở rộng)
– Là byte cao của address/data bus khi thiết kế có sử dụng bộ nhớ mở rộng
142 trang |
Chia sẻ: haohao89 | Lượt xem: 3163 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Bài giảng môn Kỹ thuật điện tử chương 6: Điều khiển 89C51, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
VI ĐIỀU KHIỂN 89C51
GV: LÊ THỊ KIM LOAN
KHOA : ĐIỆN
GIỚI THIỆU PHẦN CỨNG
Chương 1
• 89C51 thuộc họ MCS51
• 4Kbyte EPROM (1000 chu kỳ ghi/xóa)
• 128 byte RAM
• 32 I/O
• 2 timer/counter 16bit
• 6 nguồn ngắt
SƠ ĐỒ CHÂN
MÔ TẢ CÁC CHÂN
• Port 0: là port 8 bit có 2 chức năng
– Là I/O port đối với các thiết kế cỡ nhỏ ( không
sử dụng bộ nhớ mở rộng)
– Là byte thấp của address/data bus khi thiết kế
có sử dụng bộ nhớ mở rộng
• Port 1: là I/O port 8 bit
• Port 2: là port 8 bit có 2 chức năng
– Là I/O port đối với các thiết kế cỡ nhỏ ( không
sử dụng bộ nhớ mở rộng)
– Là byte cao của address/data bus khi thiết kế
có sử dụng bộ nhớ mở rộng
• Port 3: là port 8 bit có nhiều chức năng
– Là I/O port
– Có công dụng chuyển đổi có liên hệ với các
tính năng đặc biệt của 89C51 được mô tả
bởi bảng sau:
CÁC TÍN HIỆU ĐIỀU KHIỂN
• PSEN ( Program Store Enable)
– Là tín hiệu để cho phép đọc bộ nhớ chương
trình mở rộng ( bộ nhớ ngoài)
– Khi 89C51 đọc mã lệnh từ bộ nhớ chương
trình mở rộng thì PSEN được tích cực (mức
thấp) 2 lần trong mỗi chu kỳ máy
– Khi 89C51 thi hành chương trình trong ROM
nội thì PSEN sẽ ở mức cao.
• ALE/PROG ( Program Store Enable)
– ALE ( Address Latch Enable) là tín hiệu chốt
byte thấp của địa chỉ trong suốt quá trình truy
xuất bộ nhớ ngoài
– Chân này cũng được làm ngõ vào xung lập
trình (PROG) cho EPROM
– Ở chế độ họat động bình thường thì xung
ALE có tốc độ bằng 1/6 tần số dao động trên
chip và có thể được dùng làm nguồn xung
nhịp cho các phần khác của hệ thống
• EA ( External Access)
– Khi truy xuất ROM nội thì chân EA phải được nối
với nguồn +5V
– Khi truy xuất ROM ngoài thì chân EA phải được
nối với GND ( 0V)
• RST ( Reset)
– Khi tín hiệu này được đưa lên mức cao trong ít
nhất 2 chu kỳ máy thì sẽ khởi động lại hệ thống
• XTAL1, XTAL2 :
– Đây là ngõ vào và ngõ ra của bộ dao động tạo
xung nhịp
• Nguồn nuôi:
– Sử dụng nguồn +5V ở chân 40 và GND ở chân
20
TỔ CHỨC BỘ NHỚ
• 89C51 có cả ROM nội và RAM nội, tuy
nhiên có thể mở rộng thêm bằng các thiết
bị nhớ bên ngoài
• RAM nội bao gồm nhiều phần:
– RAM lưu trữ đa dụng
– RAM được địa chỉ hóa từng bit
– Các bank thanh ghi
– Các thanh ghi chức năng đặc biệt
• RAM đa dụng có địa chỉ từ 30H đến 7FH
có thể được truy xuất tự do dùng cách
đánh địa chỉ trực tiếp hoặc gián tiếp.
• RAM được địa chỉ hóa từng bit có địa chỉ
từ 20H đến 2FH và một phần trong các
thanh ghi chức năng đặc biệt. Các bit có
thể được đặt, xóa, and, or…với một lệnh
đơn.
• Có 4 bank thanh ghi, mỗi bank có 8 thanh
ghi từ R0 đến R7.
–Các bit RS1 và RS0 trong thanh ghi
PSW sẽ được dùng để chọn bank thanh
ghi tích cực
–Trạng thái mặc định thì các thanh ghi
này sẽ ở bank 0
–Lệnh sử dụng các thanh ghi này sẽ ngắn
và nhanh hơn các lệnh tương ứng sử
dụng địa chỉ trực tiếp
• Thanh ghi PSW (từ trạng thái chương
trình)
– Cờ carry (CY) được xác lập khi phép cộng có
nhớ ở bit 7 và phép trừ có mượn ở bit 7
• Ví dụ : thanh ghi A đang chứa giá trị FFH, sau khi
thực hiện lệnh ADD A,#1 thì kết quả của phép
tóan là 00H được chứa trong thanh ghi A đồng thời
bit CY của thanh ghi PSW sẽ được xác lập (đặt lên
mức 1)
– Cờ AC được xác lập khi phép cộng trên số
BCD có nhớ
– Cờ F0 là cờ có công dụng tổng quát dành cho
các ứng dụng của người lập trình
– Cờ báo tràn OV được xác lập khi có sự tràn
số học trong các phép toán cộng, trừ. Khi
thực hiện các phép toán với số không dấu thì
không cần quan tâm đến cờ này.
– Bit parity chẵn P: tổng số các bit 1 trong thanh
ghi A và bit P phải là một số chẵn
• Thanh ghi B:
– Được sử dụng cùng với thanh ghi A cho các
phép tóan nhân và chia
• Con trỏ dữ liệu DPTR :
– Được dùng khi truy xuất bộ nhớ ngoài. DPTR
dùng để xác định địa chỉ của bộ nhớ ngoài
cần truy xuất
• Các thanh ghi port
– P0, P1, P2, P3
– Tất cả các port này đều được địa chỉ hóa
từng bit
• Thanh ghi định thời gian
– 89C51 có 2 timer/counter 16 bit có chức năng
định thời gian và đếm sự kiện
– Timer 0 có 2 thanh ghi TH0 (byte cao) và TL0
(byte thấp)
– Timer 1 có 2 thanh ghi TH1 (byte cao) và TL1
(byte thấp)
– Hoạt động của timer được thiết lập bởi thanh
ghi chế độ TMOD và thanh ghi điều khiển
TCON
TẬP LỆNH
Chương 2
Các cách định địa chỉ
Định địa chỉ thanh ghi
Định địa chỉ trực tiếp
Định địa chỉ gián tiếp thanh ghi
Định địa chỉ tức thời
Tập lệnh
Nhóm lệnh di chuyển dữ liệu
Nhóm lệnh số học và luận lý
Nhóm lệnh điều khiển
Nhóm lệnh thực hiện trên bit
CÁC CÁCH ĐỊNH ĐỊA CHỈ
• Định địa chỉ thanh ghi (Rn):
– 89C51 có 8 thanh ghi làm việc được kí hiệu
từ R0 đến R7.
– Trong định địa chỉ thanh ghi, mã lệnh luôn
luôn có 3 bit để chỉ thị một thanh ghi
– Ví dụ: MOV A, R0
• Định địa chỉ trực tiếp (direct):
– Lệnh hiện hành sẽ cung cấp địa chỉ tuyệt đối
của ô nhớ sử dụng
– Lệnh có ít nhất 2 byte, trong đó địa chỉ ô nhớ
chiếm 1byte
– Ví dụ : MOV A, 40H
• Định địa chỉ gián tiếp thanh ghi (@Ri):
– i = 0,1
– Ri hoạt động như một con trỏ thanh ghi, nội
dung của Ri chỉ ra một ô nhớ trong Ram nội
– Mã lệnh có bit thấp nhất được dùng để xác
định con trỏ thanh ghi nào được sử dụng
– Ví dụ : MOV A, @R0
• Định địa chỉ tức thời (#data):
– Với lệnh này thì data không phải là địa chỉ mà
là dữ liệu thật, dữ liệu 8bit (hằng số)
– Ví dụ: MOV A, #12
– Khi sử dụng con trỏ dữ liệu DPTR thì cần
phải có dữ liệu 16bit (#data16)
– Ví dụ : MOV DPTR, #8000H
NHÓM LỆNH CHUYỂN DỮ LiỆU
• MOV đích, nguồn
– Chuyển dữ liệu trong không gian bộ nhớ nội
– Hướng chuyển dữ liệu là từ Nguồn đến Đích
MOV A, Rn: chuyển nội dung thanh ghi Rn vào
A
MOVA, @Ri: chuyển dữ liệu gián tiếp vào A
MOV A, direct: chuyển dữ liệu trực tiếp từ ô
nhớ vào A
MOV A, #data: chuyển giá trị dữ liệu tức thời
vào A
MOV Rn, A: chuyển nội dung thanh ghi A vào
thanh ghi Rn
MOV Rn, direct: chuyển dữ liệu trực tiếp từ ô
nhớ vào thanh ghi Rn
MOV Rn, #data: chuyển giá trị dữ liệu tức thời
vào thanh ghi Rn
MOV direct, A
MOV direct, Rn
MOV direct, direct
MOV direct, @Ri
MOV direct, #data
MOV @Ri, A
MOV @Ri, direct
MOV @Ri, #data
MOV DPTR, #data16
XCH A, Rn: hóan đổi dữ liệu giữa A và thanh
ghi Rn
XCH A, direct: hoán đổi dữ liệu giữa A và ô
nhớ trực tiếp
XCH A, @Ri: hoán đổi dữ liệu giữa A và ô
nhớ gián tiếp
• MOVX đích, nguồn
– Chuyển dữ liệu giữa RAM nội và RAM bên
ngoài
– Hướng chuyển dữ liệu là từ Nguồn đến Đích
– Địa chỉ của ngọai vi (ô nhớ ngoài) sẽ là nội
dung của thanh ghi DPTR
– Khi làm việc với bộ nhớ ngoài có dung lượng
thấp ( <256byte) thì chỉ cần 8bit địa chỉ thấp và
ta sẽ sử dụng cách định địa chỉ gián tiếp thanh
ghi @Ri để chứa địa chỉ 8bit này
MOVX @Ri, A: ghi dữ liệu từ A ra ô nhớ ngòai
MOVX A, @Ri: đọc dữ liệu từ ô nhớ ngòai về
A
MOVX @DPTR, A : ghi dữ liệu từ A ra ô nhớ
ngòai
MOVX A, @DPTR : đọc dữ liệu từ ô nhớ
ngòai về A
Ví dụ áp dụng:
• Ở trạng thái ban đầu thanh ghi R1 chứa giá trị
40H, ô nhớ Ram nội ở địa chỉ 40H chứa giá trị
FFH, sau khi thực thi lệnh các thanh ghi và ô nhớ
sẽ có giá trị như thế nào?
– MOV A, R1
• Nội dung của A là 40H; Nội dung của R1 là 40H; Nội dung của
ô nhớ 40H là FFH
– MOV A, @R1
• Nội dung của A là FFH; Nội dung của R1 là 40H; Nội dung của
ô nhớ 40H là FFH
– MOV A, 40H
• Nội dung của A là FFH; Nội dung của R1 là 40H; Nội dung của
ô nhớ 40H là FFH
– MOV A, #40H
NHÓM LỆNH SỐ HỌC VÀ LUẬN
LÝ
• ADD, ADDC : lệnh cộng dữ liệu
– Lệnh cộng sẽ lưu kết quả tính tóan vào thanh
ghi A
– Lệnh cộng sẽ tác động đến cờ CY trong thanh
ghi PSW
– Lệnh ADDC sẽ cộng cả nội dung của cờ nhớ
CY
– Ví dụ : A chứa giá trị là 12H, sau khi thực hiện
lệnh ADD A, #36H thì giá trị của A sẽ là 48H và
bit cờ CY=0
• SUBB: lệnh trừ dữ liệu
– Lệnh trừ sẽ lưu kết quả tính tóan vào thanh ghi
A
– Lệnh trừ sẽ tác động đến cờ CY trong thanh
ghi PSW
– Để cho kết quả của phép toán được chính xác
thì trước khi dùng lệnh trừ ta nên xóa cờ CY
– Ví dụ lệnh SUBB A, R1 sẽ thực hiện phép
tóan: nội dung của thanh ghi A - nội dung của
thanh ghi R1 - nội dung bit cờ CY . Kết quả
cất trở lại vào thanh ghi A
• INC: lệnh tăng lên 1 đơn vị
– Lệnh này không tác động đến cờ CY
• DEC: lệnh giảm đi 1 đơn vị
– Lệnh này không tác động đến cờ CY
• MULA,B : lệnh nhân
– Lệnh này lấy nội dung của thanh ghi A nhân
với nội dung của thanh ghi B. Byte thấp của
kết quả được cất vào A, byte cao của kết quả
được cất vào B
• DIV A,B: lệnh chia
– Lệnh này lấy nội dung của thanh ghi A chia cho
nội dung của thanh ghi B. Phần nguyên của
kết quả được cất vào A, phần dư của kết quả
được cất vào B
• Nhóm lệnh luận lý
– ANL : lệnh AND
– ORL : lệnh OR
– XRL : lệnh XOR
– RL A: lệnh quay trái thanh ghi A đi 1 bit
– RR A: lệnh quay phải thanh ghi A đi 1 bit
– RLC A: quay trái thanh ghi A có cờ CY
– RRC A: quay phải thanh ghi A có cờ CY
– SWAP A: hóan đổi nội dung 4 bit cao và 4 bit
thấp của thanh ghi A ( tương đương với quay 4
lần)
NHÓM LỆNH THỰC HIỆN TRÊN
BIT
• CLR C : xóa cờ carry (CY) về 0
• CLR bit : xóa bit về 0
• SETB C : đặt bit cờ carry lên 1
• SETB bit : đặt bit lên 1
• CPL C : lấy bù 1 của cờ carry
• CPL bit : lấy bù 1 của bit
• MOV C, bit : chuyển bit vào cờ carry
• MOV bit, C : chuyển cờ carry vào bit
• ANL C,bit : AND cờ carry với bit, kết quả
cất vào C
• ANL C,/bit : AND cờ carry với bù 1 của bit,
kết quả cất vào C
• ORL C,bit : OR cờ carry với bit, kết quả cất
vào C
• ORL C,/bit : OR cờ carry với bù 1 của bit,
kết quả cất vào C
NHÓM LỆNH ĐIỀU KHIỂN
• Lệnh gọi chương trình con
– ACALL : gọi chương trình con dùng địa chỉ
tuyệt đối
– LCALL : gọi chương trình con dùng địa chỉ dài
• Lệnh thoát
– RET : trở về chương trình chính từ lệnh gọi
chương trình con
– RETI : trở về chương trình chính từ lệnh gọi
chương trình con phục vụ ngắt
• Lệnh nhảy không điều kiện
– AJMP : lệnh nhảy tuyệt đối
– LJMP : lệnh nhảy dài
– SJMP : lệnh nhảy ngắn
• Lệnh nhảy có điều kiện
– JZ: nhảy nếu A =0
– JNZ: nhảy nếu A ≠ 0
– JC : nhảy nếu C=1
– JNC: nhảy nếu C=0
– JB bit: nhảy nếu bit=1
– JNB bit: nhảy nếu bit=0
– CJNE A, direct, rel : so sánh dữ liệu trong ô
nhớ trực tiếp với nội dung của A và nhảy đến
nhãn rel nếu kết quả không bằng nhau
– CJNE A, #data, rel : so sánh dữ liệu tức thời
với nội dung của A và nhảy đến nhãn rel nếu
kết quả không bằng nhau
– CJNE Rn, #data, rel : so sánh dữ liệu tức thời
với nội dung của thanh ghi Rn và nhảy đến
nhãn rel nếu kết quả không bằng nhau
– CJNE @Ri, #data, rel : so sánh dữ liệu tức
thời với gián tiếp thanh ghi và nhảy đến nhãn
rel nếu kết quả không bằng nhau
– DJNZ Rn, rel: giảm nội dung thanh ghi Rn đi 1
đơn vị sau đó so sánh với 0 và nhảy đến nhãn
rel nếu kết quả khác 0
– DJNZ direct, rel: giảm nội dung ô nhớ trực tiếp
đi 1 đơn vị sau đó so sánh với 0 và nhảy đến
nhãn rel nếu kết quả khác 0
– NOP: lệnh này không làm gì cả nhưng PC vẫn
tăng lên 1
BÀI TẬP ÁP DỤNG
Chương 2: TẬP LỆNH
• Bài 1:
Hãy cho biết các lệnh dưới đây thực hiện công
việc gì? Các địa chỉ bit nào được đặt lên 1 sau
khi thực hiện xong lệnh.
MOV R0, # 26H
MOV @R0, # 7AH
– Nạp giá trị 26H vào R0
– Ghi giá trị 7AH vào ô nhớ Ram nội tại địa chỉ
26H
– Do 7AH = 01111010 nên các bit có địa chỉ
36H,35H,34H,33H,31H của ô nhớ 26H sẽ
được đặt lên mức 1
• Bài 2:
Hãy cho biết các lệnh dưới đây thực hiện công
việc gì? Giá trị của thanh ghi và ô nhớ sau khi
thực hiện xong lệnh?
MOV R1, # 25H
MOVA, # 50H
MOV @R1, A
– Nạp giá trị 25H vào R1
– Nạp giá trị 50H vào A
– Chuyển giá trị 50H vào ô nhớ Ram nội tại địa
chỉ 25H
– R1= 25H; A=50H; (ô nhớ 25H) = 50H
• Bài 3:
Hãy cho viết chương trình thực hiện cổng logic
sau:
MOV C, P1.4
ORL C, P1.5
CPL C
MOV P1.7, C
Bài 4:
a. Viết chương trình cho 8 led sáng
b. Viết chương trình cho 4 led D1-D4 sáng
c. Viết chương trình cho 2 led D3-D4
Bài 5:
a. Viết chương trình cho 8 led sáng
b. Viết chương trình cho 4 led D1-D4 sáng
c. Viết chương trình cho 2 led D3-D4
TIMER- BỘ ĐỊNH THÌ
Chương 3
GIỚI THIỆU
• 89C51 có 2 timer 16bit, mỗi timer có 4 chế
độ làm việc
• Timer được sử dụng để:
– Định khoảng thời gian
– Đếm sự kiện
– Phát tốc độ baud cho port nối tiếp
• Timer được truy cập khi sử dụng các
thanh ghi chức năng đặc biệt: TCON,
TMOD, TH0, TL0, TH1, TL1
THANH GHI TMOD
(Timer Mode Register)
• Thanh ghi TMOD dùng để xác định chế độ làm
việc cho Timer 0 và Timer 1
• TMOD không được địa chỉ hóa từng bit.
• Nạp bằng phần mềm khi bắt đầu chương trình
• Gate: bit mở cổng cho timer
– Khi Gate=1: Timer/Counterx chỉ hoạt động khi
chân INTx ở mức 1(phần cứng) và bit TRx =1
(trong thanh ghi TCON)
– Khi Gate=0: Timerx họat động khi bit TRx=1
• Ghi chú: X = 0,1
– TRx : TR0 hoặc TR1
– Timerx: Timer 0 hoặc Timer 1
• C/T : bit chọn Timer hay Counter
– C/T=1 : chọn Counter (đếm sự kiện)
– C/T=0 : chọn Timer (định khoảng thời gian)
• M1,M0 : các bit chọn chế độ
THANH GHI TCON
(Timer Control Register)
• Thanh ghi TCON chứa các bit trạng thái và điều
khiển cho Timer 0 và Timer 1.
• Được địa chỉ hóa từng bit
• TFx: cờ báo tràn timer. Cờ này được đặt bởi
phần cứng khi tràn timer, được xóa bằng phần
mềm.
Ví dụ: timer 16bit sẽ đếm lên từ 0000H đến
FFFFH, do đó tràn timer xảy ra khi số đếm tràn
từ FFFFH sang 0000H.
•TRx: bit điều khiển timer chạy, được đặt/xóa bằng
phần mềm để điều khiển timer chạy/dừng
– TRx=1: cho phép timer chạy
– TRx=0: dừng timer
• IE1: cờ ngắt ngoài 1, được đặt bởi phần
cứng khi phát hiện một cạnh xuống hay
một mức thấp ở ngõ INT1, xóa bằng phần
cứng khi xử lý ngắt
• IT1: bit điều khiển ngắt ngoài 1, được đặt
hay xóa bằng phần mềm để xác định ngắt
ngoài 1 tích cực khi có một cạnh xuống
hay khi có một mức thấp ở chân INT1
• IE0: cờ ngắt ngoài 0, được đặt bởi phần
cứng khi phát hiện một cạnh xuống hay
một mức thấp ở ngõ INT0, xóa bằng phần
cứng khi xử lý ngắt
• IT0: bit điều khiển ngắt ngoài 0, được đặt
hay xóa bằng phần mềm để xác định ngắt
ngoài 1 tích cực khi có một cạnh xuống
hay khi có một mức thấp ở chân INT0
CÁC CHẾ ĐỘ HOẠT ĐỘNG CỦA
TIMER
• Chế độ 0:
– Chế độ timer 13bit, tương thích với 8048
– Trong chế độ này không sử dụng 3bit cao của
thanh ghi TLx, chỉ sử dụng THx và 5bit thấp
của TLx
– Giá trị đếm được là từ 0 đến ( 213 -1)Ttimer
nghiã là từ 0 đến 8191Ttimer
• Chế độ 1:
– Chế độ timer 16bit
– Trong chế độ này sử dụng cả 2 thanh ghi THx
và TLx
– Cờ báo tràn là bit TFx trong thanh ghi TCON,
được đọc hoặc ghi bằng phần mềm
– Bit có trọng số cao (MSB) trong các thanh ghi
timer là bit 7 của THx; bit có trọng số thấp
(LSB) là bit 0 của TLx
– Các thanh ghi timer có thể được đọc/ghi bất
cứ lúc nào bằng phần mềm
– Giá trị đếm được là từ 0 đến ( 216 -1)Ttimer
nghiã là từ 0 đến 65535Ttimer
• Chế độ 2:
– Chế độ timer 8bit tự động nạp lại giá trị ban
đầu
– Trong chế độ thanh ghi TLx hoạt động như
một timer 8bit, trong khi đó thanh ghi THx vẫn
giữ nguyên giá trị được nạp
– Khi số đếm tràn từ FFH sang 00H thì cờ tràn
timer được đặt lên 1 đồng thời giá trị trong
THx được nạp lại vào TLx và chu trình đếm
mới được bắt đầu
– Chế độ này rất thông dụng vì sự tràn timer
xảy ra trong những khoảng thời gian nhất
định và tuần hòan một khi đã khởi động bộ
đếm
– Giá trị đếm được là từ 0 đến ( 28 -1)Ttimer
nghiã là từ 0 đến 255Ttimer
• Chế độ 3:
– Chế độ tách timer. Timer 0 được tách thành 2
timer 8bit: TH0 và TL0.Timer 1 dừng
– TL0 có cờ báo tràn là TF0; TH0 có cờ báo
tràn là TF1
NGUỒN TẠO XUNG NHỊP CHO
TIMER
Có 2 nguồn xung nhịp có thể được sử dụng
và nó được chọn bằng bit C/T trong thanh
ghi TMOD khi khởi động timer.
• Xung nhịp định khoảng thời gian:
– Khi C/T =0 thì timer được dùng để định
khoảng thời gian.
– Nguồn xung nhịp được lấy từ bộ dao động
trên chip đưa qua một bộ chia 12 để giảm đến
tần số thích hợp cho phần lớn các ứng dụng.
– ftimer = fosc/12
• Xung nhịp đếm sự kiện:
– Khi C/T =1 thì timer được dùng cho việc đếm
sự kiện
– Xung nhịp được lấy từ nguồn bên ngoài thông
qua ngõ T0 hoặc T1, nguồn bên ngoài sẽ
cung cấp một xung khi xảy ra một sự kiện
– Giá trị trong các thanh ghi timer (THx và TLx)
sẽ tăng lên 1 khi có một sự kiện xảy ra.
– Số sự kiện được xác định bằng phần mềm
bằng cách đọc các thanh ghi timer.
CÁC BƯỚC CƠ BẢN ĐỂ KHỞI
ĐỘNG TIMER
• Nạp giá trị bắt đầu cho thanh ghi TMOD:
lựa chọn chế độ cho timer, cho bit Gate=0,
C/T=0
• Nạp các giá trị thích hợp cho các thanh
ghi THx và TLx
• Cho timer chạy : SETB TRx
• Chờ cờ báo tràn: có 2 cách:
– JNB TFx, $
– Wait: JNB TFx, Wait
• Xóa cờ báo tràn:
– CLR TFx
• Dừng timer:
– CLR TRx
Ví dụ 1:
Viết chương trình tạo trễ (delay)100µs dùng
Timer 0, biết rằng bộ dao động trên chip sử dụng
thạch anh 12MHz.
• Bước 1: Tìm tần số dao động và chu kỳ
xung nhịp timer:
– Ta có fosc =12MHz
– Suy ra: ftimer = fosc/12 =12MHz/12 =1MHz
– Ttimer = 1/ ftimer = 1/106 = 1µs
• Bước 2: Xác định giá trị cần nạp cho các
thanh ghi timer
– Ta có tdelay =100µs
– Mà Ttimer = 1µs
– Suy ra : tdelay =100Ttimer
– Do timer họat động như là một bộ đếm lên và
khi bộ đếm bị tràn thì nó sẽ quay lại về giá trị
0 nên giá trị phải nạp cho các thanh ghi timer
là -100
• Bước 3: Xác định giá trị cần nạp cho
thanh ghi chế độ timer TMOD
– Do tdelay =100Ttimer , giá trị này <255 nên
chúng ta có thể chọn timer ở chế độ 1(16bit)
hay chế độ 2 (8bit tự động nạp lại)
• Bước 4: Cho timer chạy
• Bước 5: Chờ cờ báo tràn
• Bước 6: Xóa cờ báo tràn
• Bước 7: Dừng timer
• Chương trình hoàn chỉnh khi sử dụng
Timer 0 ở chế độ 2:
MOV TMOD,# 0000 0010 B
MOV TH0,# -100
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
END
• Chương trình hoàn chỉnh khi sử dụng Timer
0 ở chế độ 1:
MOV TMOD,# 0000 0001 B
MOV TH0,# high(-100) ; lệnh này sẽ chuyển giá trị -100
sang mã nhị phân và sau đó lấy
8bit cao của giá trị này gán vào
thanh ghi TH0
MOV TL0,# low(-100) ; lệnh này sẽ chuyển giá trị -100
sang mã nhị phân và sau đó lấy
8bit thấp của giá trị này gán vào
thanh ghi TL0
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
END
Ví dụ 2: Viết chương trình tạo trễ 10ms,
sử dụng timer 1, tần số dao động trên
chip là 12MHz
• Bước 1: Tìm tần số dao động và chu kỳ
xung nhịp timer:
– Ta có fosc =12MHz
– Suy ra: ftimer = fosc/12 =12MHz/12 =1MHz
– Ttimer = 1/ ftimer = 1/106 = 1µs
• Bước 2: Xác định giá trị cần nạp cho các
thanh ghi timer
– Ta có tdelay =10ms
– Mà Ttimer = 1µs
– Suy ra : tdelay =10000Ttimer
• Bước 3: Xác định giá trị cần nạp cho
thanh ghi chế độ timer TMOD
– Do tdelay =10000Ttimer , nên ta chọn timer ở
chế độ 1(16bit)
• Chương trình hoàn chỉnh khi sử dụng
Timer 1 ở chế độ 1:
MOV TMOD,#0001 0000 B
MOV TH1,#high(-10000)
MOV TL1,#low(-10000)
SETB TR1
JNB TF1, $
CLR TF1
CLR TR1
END
Ví dụ 3: Viết chương trình tạo sóng
vuông 50% có tần số 10KHz ở ngõ ra
P1.0, biết tần số dao động trên chip là
12MHz
• Bước 1: Tìm tần số dao động và chu kỳ
xung nhịp timer:
– Ta có fosc =12MHz
– Suy ra: ftimer = fosc/12 =12MHz/12 =1MHz
– Ttimer = 1/ ftimer = 1/106 = 1µs
• Bước 2: Xác định giá trị cần nạp cho các
thanh ghi timer
– Ta có tần số xung vuông là 10KHz nên chu kỳ
của xung vuông là T=1/(10.103)=10-4s=100µs
– Do xung vuông 50% nên thời gian xung ở
mức cao bằng thời gian xung ở mức thấp :
tH = tL = T/2 = 50µs
– Ở đây ta có thể sử dụng 1 timer để tạo thời
gian trể là 50µs
• Cách 1:
MOV TMOD, # 0000 0010B
MOV TH0,# -50
SETB TR0
LOOP: JNB TF0,$
CLR TF0
CPL P1.0
SJMP LOOP
END
• Cách 2:
LOOP: SETB P1.0
ACALL Delay_50us
CLR P1.0
ACALL Delay_50us
SJMP LOOP
Delay_50us:
MOV TMOD, # 0000 0010B
MOV TH0,# -50
SETB TR0
JNB TF0,$
CLR TF0
RET
END
Ví dụ 4: Hãy cho biết đoạn chương trình
sau làm công việc gì? biết tần số dao
động trên chip là 12MHz
LOOP: SETB P1.0
CLR P1.0
SJMP LOOP
END
Ví dụ 5: Hãy cho biết đoạn chương trình
con SUB làm công việc gì? biết tần số
dao động trên chip là 12MHz
SUB: MOV R0,#250
DJNZ R0,$
RET
END
Ví dụ 6: Hãy cho biết đoạn chương trình
con SUB làm công việc gì? biết tần số
dao động trên chip là 12MHz
SUB: MOV R0,#250
LOOP: NOP
NOP