Bộ định thời Timer dùng như 1 bộ tạo trễ – Nguồn xung clock chính là dao động thạch anh bên trong 2.. Bộ đếm sự kiện Event Counter – Đầu vào từ chân bên ngoài để đếm số sự kiện – Có thể
Trang 11 Giới thiệu
2 Sơ đồ khối và chân
3 Tổ chức bộ nhớ
4 Các thanh ghi chức năng đặc biệt (SFR)
5 Dao động và hoạt động reset
Trang 2• 8051 có 2 timers/counters: timer/counter 0 & timer/counter 1
Chúng có thể được dùng như:
1 Bộ định thời (Timer) dùng như 1 bộ tạo trễ
– Nguồn xung clock chính là dao động thạch anh bên trong
2 Bộ đếm sự kiện (Event Counter)
– Đầu vào từ chân bên ngoài để đếm số sự kiện
– Có thể dùng đếm số người đi qua cổng, số vòng quay của
bánh xe, hay bất kể các sự kiện mà chuyển được sang dạngxung
3 Tạo tốc độ baud (baud rate) cho port nối tiếp của 8051
10-1 Giới thiệu
Trang 3• Khởi tạo giá trị ban đầu cho các thanh ghi
• Kích hoạt Timer, sau đó 8051 tính lên
• Ngõ vào là từ clock nội (machine cycle)
• Khi các thanh ghi bằng 0 thì 8051 sẽ set cờ tràn
toLCDP1
8051
TH0
P2Set
Timer 0
Trang 4• Đếm số sự kiện:
– Chỉ ra số sự kiện trên các thanh ghi
– Counter 0: Ngõ vào từ chân bên ngoài T0 (P3.4)
– Counter 1: Ngõ vào từ chân bên ngoài T1 (P3.5)
T0
toLCDP3.4
P1
a switch
TL0 TH0
Trang 5Các thanh ghi dùng truy xuất Timer/Counter
• TH0, TL0, TH1, TL1
• 8052 với 3 timers/counters sẽ có thêm các thanh ghi T2CON (Timer 2 control register), TH2 and TL2
8Bh Timer 1 Low Byte
TL1
8Dh Timer 1 High Byte
TH1
8Ah Timer 0 Low Byte
TL0
8Ch Timer 0 High Byte
TH0
SFR Address Description
SFR Name
Trang 6TH0, TL0, TH1, TL1 (not bit addressable)
• Cả timer 0 & timer 1 đều có độ rộng 16 bits
– Các thanh ghi này lưu trữ
• Giá trị tạo thời gian trễ (time delay) (nếu là timer)
• Số sự kiện (number of events) (nếu là counter)– Timer 0: TH0 & TL0
• Timer 0 high byte, timer 0 low byte– Timer 1: TH1 & TL1
• Timer 1 high byte, timer 1 low byte– Mỗi bộ định thời 16-bit có thể được truy cập như 2 thanh ghi 8-bit tách biệt
Trang 810-2 Thanh ghi chế độ định thời TMOD
• Timer mode register: TMOD (not bit addressable)
– Thanh ghi 8-bit
– Thiết lập chế độ hoạt động cho các bộ định thời:
• 4 bits thấp dành cho Timer 0 (Set to 0000 if not used)
• 4 bits cao dành cho Timer 1 (Set to 0000 if not used)
Trang 9Bit điều khiển cổng Khi set lên 1, timer chỉ hoạt động khi
chân /INTx ở mức cao và TRx = 1 Khi xóa, timer hoạt độngkhi TRx = 1
Trang 10• Điều khiển bên ngoài (External control)
• Bật hay tắt timer bằng phần mềm & một nguồn bênngoài (external source)
• Timer được cho phép khi chân /INT ở mức cao & TR được set
Trang 12M1, M0
3 2
1 0
Mode
Chế độ định thời chia sẻ
(Split timer mode)
1 1
Chế độ tự động nạp lại 8-bit
(auto reload mode)
8-bit auto reload timer/counter;
THx lưu trữ giá trị nạp lại cho TLx mỗikhi tràn (overflow)
0 1
Chế độ định thời 16-bit
8-bit THx + 8-bit TLx1
0
Chế độ định thời 13-bit
8-bit THx + 5-bit TLx (x= 0 or 1)0
0
Hoạt động M0
M1
Trang 13Giải đáp:
VD: Tìm giá trị TMOD nếu muốn lập trình Timer 0 làm việc ở
mode 2 ? Dùng 8051 XTAL cho xung clock, & dùng lệnh để
Trang 1410-3 Thanh ghi điều khiển định thời TCON
• Timer control register: TCON
– ½ byte cao cho timer/counter, ½ byte thấp cho interrupts
• TR (run control bit)
– TR0 for Timer/counter 0; TR1 for Timer/counter 1
– TR được set hay xóa bởi phần mềm để bật/tắt timer/counter
• TR=0: off (stop)
• TR=1: on (start)
Timer 1 Timer0 for Interrupt
Trang 15• TF (timer flag, control flag)
– Cờ tràn của bộ định thời
– TF0 cho timer/counter 0; TF1 cho timer/counter 1
– Khởi đầu, TF=0 & được set bởi phần cứng khi có tràn – tứcTH-TL chuyển đếm về 0000 từ FFFFH
• Nếu cho phép ngắt, thì TF=1 sẽ kích khởi ISR– Được xóa bởi phần mềm (hoặc bởi phần cứng khi bộ xi xử
Timer 1 Timer0 for Interrupt
Trang 1610-4 Các chế độ định thời
TLx
THx
TFx overflow flagreload
Trang 173 2
1 0
Mode
Chế độ định thời chia sẻ1
1
Chế độ tự động nạp lại 8-bit
(auto reload mode)
8-bit auto reload timer/counter;
THx lưu trữ giá trị nạp lại cho TLx mỗikhi tràn (overflow)
0 1
Chế độ định thời 16-bit
8-bit THx + 8-bit TLx1
0
Chế độ định thời 13-bit
8-bit THx + 5-bit TLx (x= 0 or 1)0
0
Hoạt động M0
M1
Trang 181 Chọn timer 0 làm việc ở mode 1 (định thời 16-bit)
Trang 195 Khi có xung clock đến, 8051 bắt đầu đếm lên bằng cách tăng
giá trị trong các thanh ghi TH0-TL0
Stop timer
TF Theo dõi TF đến khi TF = 1
Trang 21C/T=0: up C/T=0: down
Nguồn xung clock cung cấp cho bộ định thời
Trang 22EViết chương trình tạo sóng vuông có thời gian mức cao vàthấp bằng nhau trên chân P1.5 Dùng Timer 0 tạo trễ mode 1
; each loop is a half clock
MOV TMOD, #01 ;Timer 0,mode 1(16-bit) HERE: MOV TL0, #0F2H ;Giá trị Timer0 = FFF2H
MOV TH0, #0FFH CPL P1.5
ACALL DELAY SJMP HERE
Trang 23TF0 = 0 TF0 = 0 TF0 = 0 TF0 = 0 TF0 = 1
Trang 24Vài điểm cần chú ý trong VD trên:
1 TMOD = 0000 0001 được thực thi
2 FFF2H chuyển vào TH0 – TL0
3 Set và xóa P1.5 trong thời gian mức cao và thấp của xung
4 CTC DELAY dùng Timer được gọi
5 Trong CTC DELAY, bật timer 0 dùng lệnh “SETB TR0”
6 Timer 0 đếm lên mỗi khi có xung clock (cung cấp bởi dao
Chú ý, làm việc với mode 1, nên để lặp lại tiến trình, ta phải nhập lại giá trị cho các thanh ghi TH-TL & bật lại Timer.
Trang 2510-4-2 Chế độ định thời 13-bit (mode 0)
• Mode 0 tương tự mode 1, ngoại trừ nó là 13-bit timer thay vì16-bit
Trang 2610-4-3 Chế độ tự nạp lại 8-bit (mode 2)
• Bộ định thời 8-bit
– Cho phép các giá trị từ 00 đến FFH lưu trong TH0
• Tự động nạp lại (Auto-reloading)
• TL0 được tăng lên khi TR0=1
TLx THx
TFx overflow flagreload TF goes high when FF à 0
Timer clock
Trang 286 8051 đếm lên TL0
– TL0= 38H, 39H, 3AH,
7 Khi TL0 từ FFH à 00 thì 8051 set TF0=1 Bên cạnh đó,
TL0 được tự động nạp lại giá trị lưu giữ trong TH0
Trang 29TH1
TF1 overflow flagreload
TF goes high when FF à 0
XTAL
oscillator ÷ 12
C/T=0: up C/T=0: down
Trang 3010-5 Tính toán trễ dùng Timer
(a) Dạng hexa
(FFFF – YYXX + 1) * 1.085 ms
Trong đó YYXX là các giá
trị ban đầu của TH, TL
tương ứng
(b) Dạng thập phân
Chuyển các giá trị YYXX của TH, TL sang dạng thậpphân NNNNN, à ta có
(65536 – NNNNN) * 1.085 ms
XTAL = 11.0592 MHz
Áp dụng đ/v chế độ định thời 16-bit (mode 1)
Trang 31EChương trình sau tạo sóng vuông trên chân P1.5 liên tục dùng
timer 1 tạo trễ mode 1 Tìm tần số?
(Không bao gồm overhead gây bởi các lệnh trong vòng lặp)
MOV TMOD,#10H ;timer 1, mode 1 AGAIN:MOV TL1,#34H ;timer value=7634H
MOV TH1,#76H SETB TR1 ;start BACK: JNB TF1,BACK
Trang 33• ETìm KQ các bài toán trên trong trường hợp có tính đến
Trang 3410-6 Tìm giá trị các thanh ghi định thời
• Giả định biết trước thời gian trễ, XTAL = 11.0592 MHz
• Làm sao tính toán các giá trị cần gán cho TH, TL?
1 Chia thời gian trễ cho 1.085 ms.
2 Thực hiện 65536 –n, với n (decimal) từ bước 1
3 Chuyển KQ trong bước 2 sang hex yyxx
4 Set TH = yy và TL = xx.
Trang 35EXTAL = 11.0592 MHz, viết chương trình tạo sóng vuông 50
Trang 36MOV TMOD,#10H ;timer 1, mode 1 AGAIN: MOV TL1,#00 ;Timer value = DC00H
MOV TH1,#0DCH SETB TR1 ;start BACK: JNB TF1,BACK
CLR TR1 ;stop CPL P2.3
CLR TF1 ;clear timer flag 1 SJMP AGAIN ;reload timer since
;mode 1 is not
;auto-reload
Trang 37Tạo thời gian trễ lớn
• Độ lớn tdelay phụ thuộc 2 thông số:
Trang 38EKhảo sát BT sau và tìm thời gian trễ? (Không tính overhead)
MOV TMOD,#10H
MOV R3,#200
AGAIN: MOV TL1,#08H
MOV TH1,#01H SETB TR1 BACK: JNB TF1,BACK
CLR TR1 CLR TF1 DJNZ R3,AGAIN
Giải đáp:
TH – TL = 0108H = 264 (decimal)
65536 – 264 = 65272
Trễ do timer = 65272 × 1.085 ms = 70.820 ms
Tổng thời gian trễ = 200 × 70.820 ms = 14.164024 seconds
Bài toán 10.5 Tính delay
Trang 39ETìm tần số xung vuông trên chân P1.0 ?
MOV TMOD, #2H ;Timer 0,mode 2 MOV TH0, #0
AGAIN: MOV R5, #250 ;count 250 times
ACALL DELAY CPL P1.0
SJMP AGAIN
DELAY: SETB TR0 ;start
BACK: JNB TF0,BACK
CLR TR0 ;stop CLR TF0 ;clear TF
DJNZ R5,DELAY ;timer 2: auto-reload RET
Bài toán 10.6 Tính tần số xung vuông
Trang 40Bài toán 10.7 Tìm giá trị gán cho TH
EGiả sử đang lập trình
cho Timer ở mode 2, tìm
giá trị hex gán cho thanh
ghi TH trong các trường
Trang 41(a) Tìm tần số sóng vuông với đoạn code sau
(b) Thời gian mức cao và thấp
MOV TH0, #-150 ;Count=150 AGAIN:SETB P1.3
ACALL DELAY ACALL DELAY
CLR P1.3 ACALL DEALY
Bài toán 10.8 Tìm f
Trang 43• Các bộ định thời (timers) cũng có thể dùng như những bộ đếm
(counters) để đếm sự kiện xảy ra bên ngoài 8051
• Khi đó, xung từ ngoài sẽ làm tăng giá trị các thanh ghi TH, TL
• Khi C/T=1, bộ đếm sẽ đếm lên khi có xung xuất hiện từ:
– T0: timer 0 input (Pin 14, P3.4)
– T1: timer 1 input (Pin 15, P3.5)
Timer/Counter 1 external input T1
P3.5 15
Timer/Counter 0 external input T0
P3.4 14
Description Function
Port Pin Pin
10-7 Bộ đếm
Trang 4410-7-1 Chế độ đếm 16-bit (mode 1)
• Giá trị trong các thanh ghi TH0-TL0 tăng khi: TR0 được set lên 1 và một xung bên ngoài (T0) xuất hiện
• Khi bộ đếm (TH0-TL0) đạt tới giá trị lớn nhất là FFFFH, nóđược chuyển trạng thái về 0000, và TF0 được set lên 1
• Bằng cách nạp giá trị ban đẩu cho TH0-TL0, theo dõi TF0=1
để nhận biết 1 tình huống nào đó (vd: 100 người đã đến)
TF0 goes high when FFFF à 0
overflow flag C/T = 1
Timer 0 ngõ vào
từ bên ngoài
chân 3.4 (T0)
Trang 46Bài toán 10.9 Đếm xung & xuất port
Giả định 1 xung clock được đưa vào chân T1, viết chương
trình bộ đếm 1 làm việc ở mode 2 để đếm xung & hiển thị giátrị của TL1 ra P2, khi Counter tràn thì kết thúc?
T1
toLEDsP3.5
P2
8051
Trang 47BACK: MOV A,TL1
MOV P2,A ;display in P2JNB TF1,BACK ;overflow
Trang 48• Giả sử 1 xung tần số 1Hz được cấp vào chân P3.4 Viết
chương trình hiển thị counter 0 trên LCD Khởi tạo giá trị ban đầu cho thanh ghi TH0 là -60
T0
toLCDP3.4
P1
8051
1 Hz clockBài toán 10.10 Đếm xung & Hiển thị LCD
Trang 49ACALL LCD_SET_UP ;initialize the LCD MOV TMOD,#00000110B ;Counter 0,mode2 MOV TH0,#-60
SETB P3.4 ;make T0 as input AGAIN:
SETB TR0 ;starts the counter
BACK:
MOV A,TL0 ;every 60 events
ACALL CONV ;convert in R2,R3,R4 JNB TF0,BACK ;loop if TF0=0
CLR TR0 ;stop CLR TF0
SJMP AGAIN
Trang 50;converting 8-bit binary to ASCII
CONV : MOV B,#10 ;divide by 10
DIV AB MOV R2,B ;save low digit MOV B,#10 ;divide by 10 once more DIV AB
ORL A,#30H ;make it ASCII MOV R4,A
MOV A,B
ORL A,#30H
MOV R3,A MOV A,R2
ORL A,#30H
MOV R2,A ;ACALL LCD_DISPLAY here RET
Trang 51• Cải tiến ví dụ trên thực hiện 1 đồng hồ số đơn giản, chưa cầncác nút hiệu chỉnh giở, phút ?
• Việc sử dụng lệnh “JNB TF0,target” để giám sát cờ TF0
là sự hoang phí thời gian vô cùng lớn
– Giải pháp là dùng ngắt, đề cập trong phần 12 của bài giảng– Với ngắt, ta có thể thực thi nhiều việc
– Khi cờ TF được set, nó sẽ thông báo cho chúng ta
Bài toán 10.11 Đồng hồ số