Bài giảng Kỹ thuật vi điều khiển - Lập trình Timer/Counter

Tóm tắt Bài giảng Kỹ thuật vi điều khiển - Lập trình Timer/Counter: ...ock TLx THxTimer clock TFx overflow flag TLx THxTimer clock TFx overflow flag 0 1 2 3 mode TLx THxTimer clock TL0 TF0Timer clock TH0 TF1Fosc/12 Xung & Hoi 17 3 2 1 0 Mode Chế độ định thời chia sẻ (Split timer mode) 11 Chế độ tự động nạp lại 8-bit (auto reload mode) 8-bit auto ...• 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 • VD, tạo thời gian trễ với 200 chu kỳ máy (MC) trên timer 0. TLx THx TFx overflow flag reload TF goes high when FF à 0 Timer clock Xung & Hoi 27 1. Ch... – Tần số dao động thạch anh – Giá trị chứa trong các thanh ghi định thời TH & TL • Thời gian trễ là lớn nhất khi TH=TL=0. Nếu vẫn chưa đủ? Xung & Hoi 38 EKhả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 ...

pdf51 trang | Chia sẻ: havih72 | Lượt xem: 274 | Lượt tải: 0download
Nội dung tài liệu Bài giảng Kỹ thuật vi điều khiển - Lập trình Timer/Counter, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Xung & Hoi 1
1. 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
6. Tập lệnh
7. Các mode định địa chỉ
8. Lập trình IO
9. Tạo trễ
10.Lập trình Timer/Counter
11.Lập trình giao tiếp nối tiếp
12.Lập trình ngắt
13.Lập trình hợp ngữ
Xung & Hoi 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ạng
xung
3. Tạo tốc độ baud (baud rate) cho port nối tiếp của 8051
10-1. Giới thiệu
Xung & Hoi 3
Timer
• 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
to
LCD
P1
8051
TL0
TH0
P2Set
Timer 0
Xung & Hoi 4
Counter
• Đế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
to
LCD
P3.4
P1
a switch
TL0
TH0
Xung & Hoi 5
Các thanh ghi dùng truy xuất Timer/Counter
• TH0, TL0, TH1, TL1 
• TMOD thanh ghi chế độ định thời (Timer mode register)
• TCON thanh ghi điều khiển định thời (Timer control register)
• 8052 với 3 timers/counters sẽ có thêm các thanh ghi T2CON 
(Timer 2 control register), TH2 and TL2
89hTimer ModeTMOD
88hTimer ControlTCON
8BhTimer 1 Low ByteTL1
8DhTimer 1 High ByteTH1
8AhTimer 0 Low ByteTL0
8ChTimer 0 High ByteTH0
SFR AddressDescriptionSFR Name
Xung & Hoi 6
TH0, 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
Xung & Hoi 7
D15 D8D9D10D11D12D13D14 D7 D0D1D2D3D4D5D6
TH0 TL0
D15 D8D9D10D11D12D13D14 D7 D0D1D2D3D4D5D6
TH1 TL1
Timer 0
Timer 1
Xung & Hoi 8
10-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)
GATE C/T M1 M0 GATE C/T M1 M0
Timer 1 Timer 0
(MSB) (LSB)
Xung & Hoi 9
GATE
Bit đ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 động
khi TRx = 1
C/T
Bit chọn chức năng đếm hoặc định thời: 1: đếm; 0: định thời
M1
Chọn mode - bit 1
M0
Chọn mode - bit 0
GATE C/T M1 M0 GATE C/T M1 M0
Timer 1 Timer 0
(MSB) (LSB)
Xung & Hoi 10
GATE
– GATE=0
• Điều khiển bên trong (Internal control)
• Bật hay tắt timer bằng phần mềm
• Timer được cho phép khi TR được set
– GATE=1
• Đ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ên
ngoài (external source)
• Timer được cho phép khi chân /INT ở mức cao & TR 
được set
Xung & Hoi 11
XTAL
oscillator ÷ 12
TR0
INT0 Pin 
Pin 3.2
C/T = 0
Gate
T0 Pin 
Pin 3.4
C/T = 1
Xung & Hoi 12
M1, M0
3
2
1
0
Mode
Chế độ định thời chia sẻ
(Split timer mode)
11
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ỗi
khi tràn (overflow)
01
Chế độ định thời 16-bit 
8-bit THx + 8-bit TLx10
Chế độ định thời 13-bit 
8-bit THx + 5-bit TLx (x= 0 or 1)00
Hoạt độngM0M1
Xung & Hoi 13
Giả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 để
bật hay tắt timer
timer 1 timer 0
TMOD= 0000 0010 Timer 1 không dùng
Timer 0, mode 2
C/T = 0 à dùng nguồn xung clock (Timer)
GATE = 0 à điều khiển bằng phần mềm
Xung & Hoi 14
10-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)
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
Timer 1 Timer0 for Interrupt
(MSB) (LSB)
Xung & Hoi 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ức
TH-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ử
lý trỏ đến trình phục vụ ngắt)
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
Timer 1 Timer0 for Interrupt
(MSB) (LSB)
Xung & Hoi 16
10-4. Các chế độ định thời
TLx
THx
TFx overflow flag
reload
Timer clock
TLx THxTimer clock TFx
overflow flag
TLx THxTimer clock TFx
overflow flag 0
1
2
3
mode
TLx THxTimer clock
TL0 TF0Timer clock
TH0 TF1Fosc/12
Xung & Hoi 17
3
2
1
0
Mode
Chế độ định thời chia sẻ
(Split timer mode)
11
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ỗi
khi tràn (overflow)
01
Chế độ định thời 16-bit 
8-bit THx + 8-bit TLx10
Chế độ định thời 13-bit 
8-bit THx + 5-bit TLx (x= 0 or 1)00
Hoạt độngM0M1
Xung & Hoi 18
1. Chọn timer 0 làm việc ở mode 1 (định thời 16-bit)
– MOV TMOD,#01H
2. Khởi tạo giá trị ban đầu nạp cho TH0 & TL0.
– MOV TH0,#FFH
– MOV TL0,#FCH
3. Thoạt đầu nên xóa cờ TF0 về 0
– CLR TF0
4. Bật Timer 0
– SETB TR0
10-4-1. Chế độ định thời 16-bit (mode 1)
Xung & Hoi 19
5. 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
TH0-TL0= FFFCH,FFFDH,FFFEH,FFFFH,0000H
TLx THxTimer clock TFx
overflow flag
FFFC FFFD FFFE FFFF 0000
TF = 0 TF = 0 TF = 0 TF = 0 TF = 1
TH0 TL0Start timer Stop timer
TR0=1 TR0=0
TF Theo dõi TF đến khi TF = 1
Xung & Hoi 20
6. Khi TH0-TL0 có sự chuyển số đếm từ FFFFH à 0000 thì
8051 set TF0=1
– TH0-TL0 = FFFEH, FFFFH, 0000H (khi này TF0=1)
7. Theo dõi cờ tràn (TF) 
– AGAIN: JNB TF0, AGAIN 
8. Xóa TR0 để tắt timer 0
– CLR TR0
9. Xóa cớ tràn cho vòng tiếp theo
– CLR TF0
Xung & Hoi 21
XTAL
oscillator ÷ 12
TRx
THx TLx TFx
overflow flagTF goes high when FFFF à 0 
C/T=0: up
C/T=0: down
Nguồn xung clock cung cấp cho bộ định thời
Timer clockT0 hay 
T1 pin
Mode 1
C/T
Xung & Hoi 22
EViế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 
50% 50%
whole clock
P1.5
Bài toán 10.1. Sóng vuông
Xung & Hoi 23
;tạo trễ dùng timer 0
DELAY:
SETB TR0 ;start the timer 0
JNB TF0, $
CLR TR0 ;stop timer 0
CLR TF0 ;clear timer 0 flag
RET
FFF2 FFF3 FFF4 FFFF 0000
TF0 = 0 TF0 = 0 TF0 = 0 TF0 = 0 TF0 = 1
Xung & Hoi 24
Và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
động thạch anh)
Timer 0 đếm qua các giá trị: FFF3, FFF4, FFF5, FFF6, FFF7, 
FFF8, FFF9, FFFA, FFFB, FFFC, FFFFD, FFFE, FFFFH, 
0000H à TF0 = 1 và khi này lệnh JNB bị bỏ qua
7. Tắt Timer 0 dùng lệnh “CLR TR0”. CTC DELAY kết thúc, 
tiến trình được lặp lại.
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.
Xung & Hoi 25
10-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.
– 8-bit TH0 + 5-bit TL0
• Bộ đếm vì thế có giá trị từ 0000 đến 1FFF trong các thanh ghi
định thời TH0-TL0
– 213-1= 2000H-1=1FFFH
• Ta cũng gán các giá trị ban đầu vào TH0-TL0 để thực hiện
đếm lên
• Khi Timer đạt đến 1FFFH thì nó chuyển về 0000, và TF0 được
set
TLx THxTimer clock TFx
overflow flag
Xung & Hoi 26
10-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
• VD, tạo thời gian trễ với 200 chu kỳ máy (MC) trên timer 0.
TLx
THx
TFx overflow flag
reload TF goes high when FF à 0
Timer clock
Xung & Hoi 27
1. Chọn mode 2 timer 0
– MOV TMOD,#02H
2. Khởi tạo giá trị đầu trong TH0
– MOV TH0,#38H
3. Xóa cờ TF0=0.
– CLR TF0
4. Sau khi TH0 được gán, 8051 copy giá trị này vào TL0
– TL0=TH0=38H
5. Bật Timer
– SETB TR0
Xung & Hoi 28
6. 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
– TL0= FEH, FFH, 00H (lúc này TF0=1)
– 8051 tự động nạp lại TL0=TH0=38H. 
– Quay lại bước 6
8. CLR TF0
9. CLR TR0 
Xung & Hoi 29
TL1
TH1
TF1 overflow flag
reload
TF goes high 
when FF à 0
XTAL
oscillator ÷ 12
C/T=0: up
C/T=0: down
Timer clockT0 hay 
T1 pin
C/T
TRx
Mode 2
Xung & Hoi 30
10-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ập
phâ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)
Xung & Hoi 31
EChươ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 
CLR TR1 ;stop 
CPL P1.5 ;next half clock
CLR TF1 ;clear timer flag 1
SJMP AGAIN ;reload timer1
Bài toán 10.2. Sóng vuông, tìm f
Xung & Hoi 32
Giải đáp:
Với mode 1, các thanh ghi định thời TH, TL phải được khởi động
lại sau mỗi lần tràn.
FFFFH – 7634H + 1 = 89CCH = 35276 clock count 
½ chu kỳ = 35276 × 1.085 ms = 38.274 ms 
Chu kỳ = 2 × 38.274 ms = 76.548 ms
Tần số = 1/ 76.548 ms = 13.064 Hz.
Trong các tính toán trên, không bao gồm overhead gây bởi
các lệnh trong vòng lặp
Xung & Hoi 33
• ETìm KQ các bài toán trên trong trường hợp có tính đến
overhead?
• EGiải các bài toán trên với chế độ định thời tự nạp lại 8-bit 
(mode 2)?
• EVới phạm vi tần số nào thì không thể dùng chế độ tự nạp lại
8-bit (mode 2), giải thích?
Bài toán 10.3.
Xung & Hoi 34
10-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.
Xung & Hoi 35
EXTAL = 11.0592 MHz, viết chương trình tạo sóng vuông 50 
Hz trên chân P2.3
Giải đáp:
(a) T = 1 / 50 Hz = 20 ms.
(b) Thời gian mức cao = Thời gian mức thấp = 10 ms.
(c) 10 ms / 1.085 ms = 9216 
65536 – 9216 = 56320 in decimal = DC00H in hex.
(d) TL1 = 00H and TH1 = DCH.
Bài toán 10.4. Tạo sóng vuông theo f cho
sẵn
Xung & Hoi 36
MOV 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
Xung & Hoi 37
Tạo thời gian trễ lớn
• Độ lớn tdelay phụ thuộc 2 thông số:
– Tần số dao động thạch anh
– Giá trị chứa trong các thanh ghi định thời TH & 
TL
• Thời gian trễ là lớn nhất khi TH=TL=0. 
Nếu vẫn chưa đủ?
Xung & Hoi 38
EKhả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
Xung & Hoi 39
ETì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
Giải đáp:T = 2 (250 × 256 × 1.085 ms) = 138.88 ms à f = 72 Hz.
Bài toán 10.6. Tính tần số xung vuông
Xung & Hoi 40
Bà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
hợp sau:
(a) MOV TH1,#-200
(b) MOV TH0,#-60 
(c) MOV TH1,#-3
(d) MOV TH1,#-12 
(e) MOV TH0,#-48
• Giải đáp: Vài 8051 assemblers cho 
phép cách thức sau: 
• -200 = -C8H à 2’s complement 
of –200 = 100H – C8H = 38H
Decimal 2’s complement (TH 
value)
-200 = - C8H 38H
- 60 = - 3CH C4H
- 3 FDH
- 12 F4H
- 48 D0H
Xung & Hoi 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 TMOD,#2H ;Timer 0,mode 2
MOV TH0,#-150 ;Count=150
AGAIN:SETB P1.3 
ACALL DELAY 
ACALL DELAY
CLR P1.3 
ACALL DEALY 
SJMP AGAIN
DELAY:SETB TR0 ;start
BACK: JNB TF0,BACK 
CLR TR0 ;stop
CLR TF0 ;clear TF 
RET
high period
low period
Bài toán 10.8. Tìm f
Xung & Hoi 42
Giải đáp:
“MOV TH0,#-150” dùng 150 clocks. 
CTC DELAY = 150 × 1.085 ms = 162 ms. 
Thời gian mức cao gấp 2 lần thời gian mức thấp (66% duty cycle). 
Chu kỳ = Thời gian mức cao + thời gian mức thấp
= 325.5 ms + 162.25 ms = 488.25 ms 
Tần số = 2.048 kHz.
Xung & Hoi 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 inputT1P3.515
Timer/Counter 0 external inputT0P3.414
DescriptionFunctionPort PinPin
GATE C/T=1 M1 M0 GATE C/T=1 M1 M0
Timer 1 Timer 0
(MSB) (LSB)
10-7. Bộ đếm
Xung & Hoi 44
10-7-1. Chế độ đếm 16-bit (mode 1)
• 16-bit counter (TH0 and TL0)
• 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).
TR0
TH0 TL0 TF0
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)
Xung & Hoi 45
• 8-bit counter. 
– Chỉ cho phép các giá trị từ 00 đến FFH nạp vào TH0
• Tự động nạp lại (Auto-reloading)
• Giá trị trong TL0 sẽ tăng nếu TR0=1 và 1 xung bên ngoài xuất
hiện
10-7-2. Chế độ đếm tự nạp lại 8-bit (mode 2)
Xung & Hoi 46
Bà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
to
LEDs
P3.5
P2
8051
Xung & Hoi 47
Ans:
MOV TMOD, #01100000B ;mode 2, counter 1
MOV TH1, #0 
SETB P3.5
SETB TR1 ;start
BACK: MOV A,TL1 
MOV P2,A ;display in P2
JNB TF1,BACK ;overflow
CLR TR1 ;stop
CLR TF1 ;make TF=0
Xung & Hoi 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
to
LCD
P3.4
P1
8051
1 Hz clock
Bài toán 10.10. Đếm xung & Hiển thị LCD
Xung & Hoi 49
ACALL 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
Xung & Hoi 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
R4 R3 R2
Xung & Hoi 51
• Cải tiến ví dụ trên thực hiện 1 đồng hồ số đơn giản, chưa cần
cá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ố

File đính kèm:

  • pdfbai_giang_ky_thuat_vi_dieu_khien_lap_trinh_timercounter.pdf