CHƯƠNG 5 BỘ ĐỊNH THÌ TIMERS Giáo trình Vi Xử Lý Lưu Phú 1... TCON88H : truy xuất bit được, điều khiển Timer chạy/dừng và chứa cờ báo tràn 4 bit cao quản lý Timer,4 bit thấp quản
Trang 1CHƯƠNG 5
BỘ ĐỊNH THÌ (TIMERS)
Giáo trình Vi Xử Lý Lưu Phú 1
Trang 25.1 Giới thiệu
5.2 Thanh chi TMOD
5.3 Thanh ghi TCON
5.4 Các mode timer và cờ báo tràn
5.5 Nguồn tạo xung Timer CK
5.6 Chạy,dừng và điều khiển timer
5.7 Khởi động và truy xuất các thanh ghi timer
5.8 Định thì thời đoạn ngắn,trung bình,dài
5.9 Các ví dụ ứng dụng timer
5.10 Tính chính xac thời gian định thì
5.11 Timer2 của MCU8052
5.12 Tạo baurate Giáo trình Vi Xử Lý Lưu Phú
2
Trang 3Bộ định thì 3 bit gồm 3 TFF ghép
nối tiếp≡ bộ đếm/chia 23=8
Khi có xung CK các ngõ ra lần lượt
Trang 4 MCU8051 có 2 bộ định thì 16 bit,MCU8052 có 3 bộ định thì 16 bit
Bộ định thì 16 bit đếm tối đa 216=65536 xung CK,giá trị đếm từ 0000H đến FFFFH
(c)tạo baudrate cho cổng nối tiếp onchip(xem chương cổng nối tiếp)
6 SFR quản lý hoạt động 2 bộ định thì 8051 và thêm 5 SFR quản lý bộ định thì thứ 3 của 8052
Giáo trình Vi Xử Lý Lưu Phú 4
Trang 5TMOD Đặt mode 89H Không
T2CON* Điều khiển Timer2 C8H Có
RCAP2L* Bắt byte thấp Timer2 CAH Không
RCAP2H* Bắt byte cao Timer2 CBH Không
TL2* Byte thấp Timer2 CCH Không
TH2* Byte cao Timer2 CDH Không
Trang 6 TMOD(địa chỉ byte 89H):
không truy xuất bit được,đặt mode
làm việc cho Timer1 và Timer0
4 bit cao quản lý Timer1,4 bit thấp
quản lý Timer0(Bảng B4.2 và B4.3)
Thường TMOD được nạp data bằng
phần mềm ở đầu chương trình khởi
động mode làm việc cho Timer
Giáo trình Vi Xử Lý Lưu Phú 6
Bit Tên Timer Mô tả
7 GATE 1 Bit Gate.Khi Gate=1,Timer chỉ
chạy khi ngõ vào 𝐼𝑁𝑇1 = 1
6 𝐶/𝑇 1 Bit chọn Đếm/Định thì
1= đếm sự kiện 0=định thì thời đoạn
5 M1 1 Mode bit 1(xem Bảng B4.3)
4 M0 1 Mode bit 0(xem Bảng B4.3)
3 GATE 0 Bit Gate.Khi Gate=1,Timer chỉ
chạy khi ngõ vào 𝐼𝑁𝑇0 = 1
2 𝐶/𝑇 0 Bit chọn Đếm/Định thì
1= đếm sự kiện 0=định thì thời đoạn
1 M1 0 Mode bit 1(xem Bảng B4.3)
0 M0 0 Mode bit 0(xem Bảng B4.3)
Trang 7Bảng B4.3: Các mode Timer
Ví dụ 5.1: Khởi động các Timer làm việc như sau:
a) Timer0 định thì 8 bit,Timer1 định thì 16 bit
b) Timer0 định thì 16 bit,Timer1 đếm sự kiện 16 bit
Giáo trình Vi Xử Lý Lưu Phú 7
Timer0: TL0 là Timer 8 bit điều khiển bằng các bit mode Timer0;TH0 là Timer 8 bit điều khiển bằng các bit mode Timer1
a) Viết lệnh nạp data vào TMOD như sau:
MOV MOD,#01010001B Hay MOV TMOD,#51H
Trang 8 TCON(88H) : truy xuất bit được,
điều khiển Timer chạy/dừng và chứa
cờ báo tràn
4 bit cao quản lý Timer,4 bit thấp
quản lý ngắt(xem chương ngắt)
TCON.7 TF1 8FH Cờ báo tràn Timer1.Đặt bằng cứng khi tràn; xóa bằng
mềm hoặc bằng cứng khi bộ xử lý chuyển đến trình phục vụ ngắt (ISR)Timer1
TCON.6 TR1 8EH Bit điều khiển chạy Timer1.Đặt/xóa bằng mềm để
chạy/dừng Timer1
TCON.5 TF0 8DH Cờ báo tràn Timer0.Đặt bằng cứng khi tràn; xóa bằng
mềm hoặc bằng cứng khi CPU chuyển đến trình phục
vụ ngắt (ISR)Timer0
TCON.4 TR0 8CH Bit điều khiển chạy Timer0.Đặt/xóa bằng mềm để
chạy/dừng Timer0
TCON.3 IE1 8BH Cờ báo ngắt ngoài 𝐼𝑁𝑇1.Đặt bằng cứng khi nhận dạng
có cạnh xuống trên ngõ 𝐼𝑁𝑇1;xóa bằng cứng hoặc bằng mềm khi CPU chuyển đến trình phục vụ ngắt ngoài 𝐼𝑁𝑇1
TCON.2 IT1 8AH Cờ báo loại ngắt ngoài 𝐼𝑁𝑇1.Đặt/xóa bằng mềm
khai báo ngắt ngoài 𝐼𝑁𝑇1 tác động cạnh xuống /mức thấp
TCON.1 IE0 89H Cờ báo ngắt ngoài 𝐼𝑁𝑇0.Đặt bằng cứng khi nhận dạng
có cạnh xuống trên ngõ 𝐼𝑁𝑇0;xóa bằng cứng hoặc bằng mềm khi CPU chuyển đến trình phục vụ ngắt ngoài 𝐼𝑁𝑇0
TCON.0 IT0 88H Cờ báo loại ngắt ngoài 𝐼𝑁𝑇0.Đặt/xóa bằng mềm
khai báo ngắt ngoài 𝐼𝑁𝑇0 tác động cạnh xuống /mức thấp
Trang 9 Ký hiệu x thay cho ký hiệu 0/1 của Timer0/Timer1
Tmerx có 4 mode làm việc: mode 0,mode 1,mode 2,mode 3
5.4.1 Mode 0- Mode Timer 13 bit
Hình 5.2a: Timerx mode 0
Mode 0 là mode timer 13 bit tương hợp với họ MCU8048 version
trước,rất ít sử dụng hiện nay
8 bit THx nối cascade với 5 bit thấp TLx tạo thành timer 13 bit(3 bit cao TLx không sử dụng)
Giáo trình Vi Xử Lý Lưu Phú 9
Trang 105.4.2 Mode 1- Mode Timer 16 bit
Hình 5.2b: Timer mode 1
=216=65536
→Timer tràn→phần cứng sẽ đặt cờ báo tràn TFx=1,timer vẫn tiếp tục đếm
Giáo trình Vi Xử Lý Lưu Phú 10
Trang 115.4.2 Mode 1- Mode Timer 16 bit
Ví dụ 5.3: Phân tích các dòng lệnh sau đây:
MOV TMOD,#01H MOV TH0,#0FCH MOV TL0,#18H SETB TR0
JNB TF0,$
CLR TR0
…
Giải:
Dòng 1 khởi động Timer0 mode 1 chức năng Timer 16 bit
Dòng 2 và 3 đặt giá trị đếm cho timer =FC18H,timer đếm từ giá trị này cho đến
FFFFH.Suy ra số xung đếm được cho đến khi timer tràn=0000-FC18=03E8H#1000 xung
Dòng 4 cho Timer0 chạy
Dòng 5 chờ cờ TF0=1 Timer0 báo tràn
Dòng 6 Ngừng chạy Timer0
Giáo trình Vi Xử Lý Lưu Phú 11
Trang 125.4.3 Mode 2- Mode Timer 8 bit tự động nạp lại(auto-reload)
Hình 5.2c: Timer mode 2
Mode 2 là mode timer 8 bit tự động nạp lại giá trị đặt trước
TLx là bộ timer 8 bit,THx chứa giá trị đặt trước
Khi timer tràn TLx=FFH→00H,cờ báo tràn TFx=1,đồng thời phần cứng nạp giá trị đặt trước từ THx sang TLx,TLx sẽ đếm từ giá trị này lên FFH và cứ thế tiếp tục…
Mode 2 tiện lợi hơn mode 1 ở chỗ Timer tự động nạp giá trị đặt trước khi tràn mà vẫn tiếp tục đếm nên đáp ứng thời gian chính xác hơn!
Giáo trình Vi Xử Lý Lưu Phú 12
Trang 135.4.3 Mode 2- Mode Timer 8 bit tự động nạp lại(auto-reload)
Ví dụ 5.4: Phân tích các dòng lệnh sau:
MOV TMOD,#20H MOV TH1,#9CH MOV TL1,TH1 SETB TR1
JNB TR1,$
CPL P1.0
…
Giải:
Dòng 1 khởi động Timer1 mode 1 chức năng Timer 8 bit tự động nạp lại
Dòng 2 nạp giá trị đặt trước=9CH cho TH1
Dòng 3 nạp giá trị đặt trước vào TL0 để Timer đếm từ giá trị đặt trước ngay vòng đầu tiên!
Cho chạy Timer1
Trong ví dụ 5.4 Timer mode 2,sau khi tràn Timer tự động nạp giá trị đặt trước chứa trong THx vào
TLx,trong lúc Timer vẫn đếm nên không mất thời gian ngừng Timer để nạp lại giá trị đặt trước,do đó thời gian định thì của Timer sẽ chính xác hơn!
Trang 145.4.4 Mode 3- Mode Timer tách biệt(Split Timer)
Mode 3 là mode Timer tách biệt xem như có
3 bộ Timer làm việc cùng một lúc
Timer0 trong mode 3 được tách thành 2 bộ
timer 8 bit độc lập TL0 và TH0 với lưu ý:
- Bộ timer 8 bit TL0 có cờ báo tràn là TF0,xung
Timer CK chọn từ bit 𝐶/𝑇 cho Timer0 trong TMOD,
chạy/dừng điều khiển bằng bit TR0,điều khiển ngoài
bằng bit GATE Timer0
- Bộ timer 8 bit TH0 có cờ báo tràn là TF1,xung
Timer CK cố định từ FOSC/12(FOSC=tần số dao động
CK của MCU),chạy/dừng điều khiển bằng bit TR1
Timer1 dừng khi khai báo mode 3,hoặc chạy khi
khai báo một trong 3 mode 0,1,2;không có cờ báo tràn(vì TF1 đã sử dụng cho bộ timer TH0),vẫn
sử dụng bit GATE và 𝐶/𝑇 cho Timer1
Có thể sử dụng Timer1 ở mode 3 như là bộ timer thứ 3 không cần tín hiệu báo tràn như tạo
baudrate cho cổng nối tiếp,bộ đếm/định thì không bị tràn quá 255(8 bit) hay 15635(16 bit) xung đếm!
Giáo trình Vi Xử Lý Lưu Phú 14
Hình 5.2d: Timer mode 3
Trang 155.4.4 Mode 3- Mode Timer tách biệt(Split Timer)
Dòng 2 nạp TH1 giá trị đặt trước(chuẩn bị cho Timer1 chạy mode 2)
Dòng 3 nạp giá trị đặt trước vào TL1 để đếm
Trang 16 Nguồn tạo xung Timer CK được khai
báo qua bit 𝐶/𝑇 trong thanh ghi TMOD
Xung Timer CK lấy từ nguồn tạo xung bên ngoài
Chân T0=P3.4 là ngõ vào xung đếm cho Timer0
Chân T1=P3.5 là ngõ vào xung đếm cho Timer1
Giá trị tối đa bộ đếm =65536(khai báo Timer mode 1 16 bit)
Timer tăng 1 giá trị khi phát hiện có cạnh xuống ở ngõ vào tương ứng
Thời gian đếm 1 xung mất tổng cộng 2MC→tần số xung đếm ngoài max=500Khz(Fosc=12Mhz)
Giáo trình Vi Xử Lý Lưu Phú 16
Hình 5.3: Sơ đồ minh họa nguồn tạo xung Timer CK
Trang 17 Cách đơn giản nhất điều khiển
chạy/dừng timer là đặt/xóa bit TRx
bằng mềm:
Điều khiển bằng bit GATE(bit 7 và bit 3 trong thanh ghi TMOD)
Đặt GATE=1→Timerx chỉ chạy khi TRx=1 và 𝐼𝑁𝑇𝑥 = 1
Trang 18Giáo trình Vi Xử Lý Lưu Phú 18
Hình 5.5: Mô hình điều khiển tổng quát cho Timer1 mode 1
Trang 19 Tóm tắt mô hình điều khiển chạy/dừng và nguồn xung timer CK cho Timer1 như hình 5.5(tương tự cho Timer0 với các bit điều khiển tương ứng)
𝐶/𝑇 = 0: định thì,timer CK=Fosc/12(Fosc=12Mhz,TtimerCK=1µs) 𝐶/𝑇 = 1: đếm sự kiện,timer CK= xung ngõ vào T1=P3.5(fmax=500Khz,
GATE=0: TR1=1: chạy; TR1=0 : dừng(đặt/xóa TR1 bằng mềm) GATE=1: TR1=1,𝐼𝑁𝑇1 = 𝑃3.3 = 1: chạy; TR1=0 hoặc 𝐼𝑁𝑇1 = 0 :
(Timer0 TR0 và 𝐼𝑁𝑇0 = 𝑃3.2)
Giáo trình Vi Xử Lý Lưu Phú 19
Trang 20Ví dụ 5.6: Thiết kế mạch đo độ rộng xung,cho độ rộng xung max=10ms
Giải:
Ta sử dụng Timer0 làm bộ timer đo độ rộng xung.(Hình vd5.6)
Cho Fosc=12Mhz→1 xung Timer CK=1µs→Độ rộng xung đo max
=10ms=10000µs
Cho xung cần đo vào ngõ 𝐼𝑁𝑇0 = 𝑃3.2 làm tín hiệu điều khiển
chạy /dừng Timer0 bên ngoài
Khai báo Timer0 có điều khiển ngoài GATE=1 và mode 1 16 bit
để đếm >10000 xung
Đoạn chương trình như sau:
… MOV TMOD,#09H ;Time0 mode 1 điều khiển ngoài qua P3.2 SETB TR0 ; Timer0 sẵn sàng chạy(chờ P3.2=1)
JNB P3.2,$ ;chờ mức 1 chạy Timer0
JB P3.2,$ ;chờ mức 0 dừng Timer0 MOV B,TH0 ;cất byte cao giá trị đo MOV A,TL0 ;cất byte thấp giá trị đo MOV TH0,#0 ;xóa byte cao bộ đếm MOV TL0,#0 ;xóa byte thấp bộ đếm
Giáo trình Vi Xử Lý Lưu Phú 20
Hình vd5.6
Trang 215.7.1 Khởi động các thanh ghi Timer
Khởi động Timer: nạp giá trị data thích hợp vào thanh ghi TMOD để khai báo:
Điều khiển chạy /dừng : ngoài (ngõ 𝐼𝑁𝑇𝑥 )GATE=1 hay trong GATE=0
Chức năng : đếmsự kiện(Timer CK ngoài ngõ Tx) 𝐶/𝑇 = 1
định thì(Timer CK trong=Fosc/12): 𝐶/𝑇 = 0
Mode 0,1,2,3 tùy theo yêu cầu sử dụng M1M0=00→11
Ví dụ 5.7: Khởi động các Timer làm việc theo các yêu cầu sau,cho Fosc=12Mhz
1 Đếm sản phẩm: cảm biến đếm sản phẩm phát xung đếm đưa vào ngõ P3.4,số lượng sản phẩm max=200
2 Đo độ rộng xung từ 10µs đến 50ms,tín hiệu đo đưa vào ngõ P3.3
Giải:
Theo yêu cầu 1,xung đếm đưa vào ngõ P3.4=T0→khai báo Timer0 điều khiển trong(GATE=0), đếm sự kiện(𝐶/𝑇 = 1), mode 2(M1M0=10) do số lần đếm max=FFH#256>200
Theo yêu cầu 2,xung đo đưa vào ngõ P3.3=𝐼𝑁𝑇1→khai báo Timer1 điều khiển ngoài
(GATE=1),định thì(𝐶/𝑇 = 0),mode 1(M1M0=01) do số xung đếm
max=65535>50000#50000µs
Lệnh khai báo: MOV TMOD,#10010110B
Hay MOV TMOD,#96H
Giáo trình Vi Xử Lý Lưu Phú 21
Trang 225.7.2 Truy xuất các thanh ghi Timer
và TLx
- Mode 2 Timer 8 bit tự động nạp lại ,nạp byte giá trị đặt trước vào THx
Khi các thanh ghi timer từ FFH→00H(8 bit) hoặc FFFFH→0000H,cờ báo tràn TFx=1(phần cứng đặt)
Giả sử muốn timer đếm N=1000 xung sẽ tràn,cách tính giá trị đặt trước như sau:
Chuyển N sang số HEX: 1000=03E8H
Giá trị đặt trước=0000H-03E8H=FC18H
Hay nói cách khác timer phải đếm lên từ giá trị -1000 đến 0
→Giá trị đặt trước bằng bù-2 số nhị phân N
Giáo trình Vi Xử Lý Lưu Phú 22
Trang 235.7.2 Truy xuất các thanh ghi Timer
Phân tích đoạn chương trình sau:
-Dòng thứ 4 chờ Timer0 tràn bằng cách kiểm tra cờ TF0=1 là báo tràn
-Dòng 5 dừng Timer0 lại để nạp lại giá trị đặt trước nếu cần,vì khi đó (TH0TL0)=0000H và Timer0 sẽ đếm từ giá trị này(trường hợp 8 bit không cần dừng vì Timer tự động nạp lại!)
-Dòng 6 phải xóa cờ TF0 bằng mềm để nhận dạng lần báo tràn kế tiếp,vì phần cứng chỉ đặt cờ TF0 chứ không xóa
Giáo trình Vi Xử Lý Lưu Phú 23
Trang 245.7.2 Truy xuất các thanh ghi Timer
Thay vì tính số bù-2 cho giá trị đặt trước để đếm tràn,assembler cho phép khai báo giá
trị thập phân âm biểu diễn 2 byte bằng toán tử HIGH(byte cao) và LOW(byte thấp),
ví dụ như sau:
Khi biên dịch assembler sẽ gán (TH0)=FCH và (TL0)=18H
Trường hợp cần đọc timer đang hoạt động,cần lưu ý có khả năng sẽ bị sai khi nội
dung TLx tràn làm tăng THx một xung đếm,do tần số Timer CK bằng 1MC và lệnh đọc tối thiểu 1MC
Thực hiện các lệnh đọc timer như sau để đảm bảo chính xác:
Giáo trình Vi Xử Lý Lưu Phú 24
Trang 25 Một xung Timer CK=1MC=1µs(Fosc=12Mhz)
Thời gian thực hiện 1 lệnh min=1MC
Định thì ngắn vài µs→tính chu kỳ máy các lệnh
Định thì trung bình từ 10µs đến vài chục ms→Timer
Định thì dài hơn 65.5ms→kết hợp Timer và vòng lặp bằng mềm
Ưu điểm định thì dùng timer là phần cứng làm việc định thì,CPU không phải thực hiện lệnh nên có thể làm việc khác(sẽ thấy rõ trong chương ngắt)
Bảng B5.5: Tóm tắt phương pháp định thì
Giáo trình Vi Xử Lý Lưu Phú 25
Thời đoạn max(µs) Phương pháp ≈10 Các lệnh tính MC
65536 Timer mode 1 16 bit
Không giới hạn Timer mode 1 và vòng lặp
Trang 26Trong các ví dụ ứng dụng sau ,cho Fosc=12Mhz,SV có thể mô phỏng trên Proteus
Ví dụ 5.8: Viết một chương trình tạo xung xuất ra P1.0 với tần số càng cao càng tốt.
Trang 27Ví dụ 5.9: Viết một chương trình tạo chuỗi xung vuông đối xứng f=10Khz trên P1.0 Giải:
Hình vd5.9: Dạng sóng trên P1.0 f=10Khz
Xung vuông đối xứng f=10Khz,thời gian mức 1=thời gian mức 0=50µs
Sử dụng Timer0 mode 2 giá trị đặt trước là -50→timer báo tràn sau 50 xung đếm=50µs
ORG 8100 MOV TMOD,#02H ; Timer0 mode 2 tự động nạp lại MOV TH0,#-50 ;giá trị đặt trước
MOV TL0,TH0 ;đếm đúng từ vòng đầu SETB TR0 ;chạy Timer0
LOOP: JNB TF0,LOOP ;chờ báo tràn
CLR TF0 ;xóa cờ báo tràn CPL P1.0 ;đảo bit sau 50µs SJMP LOOP ;lập vòng lại
END
Giáo trình Vi Xử Lý Lưu Phú 27
Trang 28 Sử dụng Timer0 mode 2 tự động nạp lại nên không cần dừng timer để nạp lại giá trị đặt trước
Nhưng ở chương ngắt ta sẽ thấy không cần phải chờ như vậy,CPU có thể làm
công việc khác!
xung ra rất chính xác!
Giáo trình Vi Xử Lý Lưu Phú 28
Trang 29Ví dụ 5.10: Viết một chương trình tạo chuỗi xung vuông đối xứng f=1Khz trên P1.0 Giải:
Xung vuông đối xứng f=1Khz,thời gian mức 1=thới gian mức 0=500µs
Sử dụng Timer0 mode 1 giá trị đặt trước là -500→timer báo tràn sau 500
xung đếm=500µs
Trang 30 Dòng 3 và 4 nạp giá trị đặt trước cho các thanh ghi Timer0 bằng toán tử
HIGH,LOW khỏi phải tính giá trị bù-2 của (-500)
trị đặt trước
trước và chạy timer lại
số(sẽ bàn ở phần sau)
Giáo trình Vi Xử Lý Lưu Phú 30
Trang 31Ví dụ 5.12: Viết một chương trình tạo chuỗi xung vuông đối xứng trên P1.0 f1=10Khz và trên P2.0 f2=1Khz Giải:
Chọn Timer0 chạy mode 2 giá trị nạp lại=-50,Timer1 mode 1 giá trị nạp lại=-500
MOV TMOD,#12H ; Timer0 mode 2,Timer 1 mode 1MOV TH0,#-50 ;giá trị nạp lại Timer0
MOV TL0,TH0 ;nạp ban đầu cho TL0
LOOP: MOV TH1,#HIGH(-500) ;giá trị nạp lại Timer1 byte cao
MOV TL1,#LOW(-500) ;giá trị nạp lại Timer1 byte thấp
CLR TF0 ;Timer0 tràn,xóa cờ báo tràn
Trang 32Ví dụ 5.13: Hình vd5.13 gồm một mạch còi nối với P1.7 và mạch nút nhấn có chống rung nối với P1.6.
Viết một chương trình đọc trạng thái nút nhấn và kích còi kêu trong 1s khi phát hiện có chuyển trạng thái
từ 1 xuống 0 trên P1.6.Đặt P1.7 =1 kích còi kêu
Trang 33; -
;DELAY tạo thời gian trễ 1s bằng cách cho Timer0
;đếm COUNT xung và lặp vòng HUNDRED lần
; -
RET END
Giáo trình Vi Xử Lý Lưu Phú 33
Trang 34nhị phân nhập từ P2(data in)
Liên tục xuất giá trị mạch đếm từ 0 đến giá trị sau 60s
với mode đếm tự do,hoặc từ 0 đến giá trị đặt trước với
mode đếm có đặt trước ra P1(data out)
Kết thúc mode đếm xuất mức 1 ra ngõ Alarm và quay về làm lại từ đầu
Giải:
Xung đếm từ cảm biến đưa vào ngõ T0=P3.4 →sử dụng Timer0 mode đếm sự kiện(Timer CK ngoài)
Mode đếm tự do số sản phẩm max=60s/0.3s=200,mode đếm đặt trước data in=8 bit→số đếm
max=255→Chọn Timer0 mode 2
Tạo thời gian delay 60s trong mode đếm tự do→kết hợp Timer1 mode 1 và các vòng lặp:
Cho Timer1 đếm 60000 xung(Fosc=12Mhz),phải lặp số vòng=60s/60ms=1000 lần
Giáo trình Vi Xử Lý Lưu Phú 34
Hình vd5.14