1. Nháy LED đơn nối với cổng P1.0 với 1 nhịp/1s
2. Sáng lần lượt các LED đơn nối với cổng P1
theo thứ tự P1.0 đến P1.7 rồi lặp lại, thời
gian sáng /tắt là 1s
3. Sáng và lưu sáng các LED đơn nối với cổng P1
theo thứ tự từ P1.0 đến P1.7, thời gian
sáng /tắt là 1s
133 trang |
Chia sẻ: phanlang | Lượt xem: 1898 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Chương 3: Cấu trúc phần cứng hệ vi điều khiển, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 3: Cấu trúc phần cứng
hệ vi điều khiển
TS. Trần Văn Hưng
Bộ môn: Kỹ thuật điện tử
Nội dung
3.1 Các kiến trúc vi điều khiển
3.2 Khái quát họ vi điều khiển MCS51
3.3 Cấu trúc AT89C52
3.3.1 Các cổng vào ra (I/O port)
3.3.2 Các tín hiệu điều khiển
3.3.3 Tổ chức bộ nhớ
3.3.4 Giới thiệu tập lệnh
3.3.5 Timer – Mạch định thời
3.3.6 Serial Port – cổng nối tiếp
3.3.7 Interupt – Hoạt động ngắt
3.4 Phần cứng tối thiểu của họ MCS51
Nội dung
3.1 Các kiến trúc vi điều khiển
3.2 Khái quát họ vi điều khiển MCS51
3.3 Cấu trúc AT89C52
3.3.1 Các cổng vào ra (I/O port)
3.3.2 Các tín hiệu điều khiển
3.3.3 Tổ chức bộ nhớ
3.3.4 Giới thiệu tập lệnh
3.3.5 Timer – Mạch định thời
3.3.6 Serial Port – cổng nối tiếp
3.3.7 Interupt – Hoạt động ngắt
3.4 Phần cứng tối thiểu của họ MCS51
3.1 Các kiến trúc vi điều khiển
Nội dung
3.1 Các kiến trúc vi điều khiển
3.2 Khái quát họ vi điều khiển MCS51
3.3 Cấu trúc AT89C52
3.3.1 Các cổng vào ra (I/O port)
3.3.2 Các tín hiệu điều khiển
3.3.3 Tổ chức bộ nhớ
3.3.4 Giới thiệu tập lệnh
3.3.5 Timer – Mạch định thời
3.3.6 Serial Port – cổng nối tiếp
3.3.7 Interupt – Hoạt động ngắt
3.4 Phần cứng tối thiểu của họ MCS51
3.2 Họ vi điều khiển MCS51
• 8051 là vi điều khiển đầu tiên của họ VĐK MCS51 được Intel
sản xuất vào năm 1980. Một số tính năng cơ bản của họ
MCS51 kinh điển:
– CPU 8 bit được thiết kế tối ưu cho các ứng dụng điều khiển
– Có khả năng xử l{ các bit logic
– Không gian bộ nhớ chương trình 64KB
– Không gian bộ nhớ dữ liệu 64KB
– Tích hợp 4KB bộ nhớ chương trình, 128 byte RAM trên chip
– có 32 đường vào ra 2 chiều có thể định địa chỉ đến từng bit
– Tích hợp 2 timer 16 bit
– Tích hợp UART song công (Universal Asynchronous Receiver
Transmitter)
– Cấu trúc ngắt với 6 nguồn/5 vector ở 2 mức khác nhau
– Tích hợp mạch dao động trên chip.
8051
89C51
• 89C51 thuộc họ MCS51
• 4Kbyte EPROM (1000 chu kz ghi/xóa)
• 128 byte RAM
• 32 bit (4 cổng) I/O
• 2 Timer/Counter 16bit
• 6 nguồn ngắt
So sánh bộ nhớ một số chip trong họ MCS51:
Nội dung
3.1 Các kiến trúc vi điều khiển
3.2 Khái quát họ vi điều khiển MCS51
3.3 Cấu trúc AT89C52
3.3.1 Các cổng vào ra (I/O port)
3.3.2 Các tín hiệu điều khiển
3.3.3 Tổ chức bộ nhớ
3.3.4 Giới thiệu tập lệnh
3.3.5 Timer – Mạch định thời
3.3.6 Serial Port – cổng nối tiếp
3.3.7 Interupt – Hoạt động ngắt
3.4 Phần cứng tối thiểu của họ MCS51
3.3 AT89C52
Nội dung
3.1 Các kiến trúc vi điều khiển
3.2 Khái quát họ vi điều khiển MCS51
3.3 Cấu trúc AT89C52
3.3.1 Các cổng vào ra (I/O port)
3.3.2 Các tín hiệu điều khiển
3.3.3 Tổ chức bộ nhớ
3.3.4 Giới thiệu tập lệnh
3.3.5 Timer – Mạch định thời
3.3.6 Serial Port – cổng nối tiếp
3.3.7 Interupt – Hoạt động ngắt
3.4 Phần cứng tối thiểu của họ MCS51
3.3.1 Các cổng vào/ra (I/O port) (1/3)
• Port 0: là port 8bit có 2 chức năng:
– Là I/O đối với các thiết kế cỡ nhỏ (không dùng bộ nhớ mở rộng)
– Là byte thấp của Add/Data bus khi thiết kế có sử dụng bộ nhớ
mở rộng
• Port 1: là I/O port 8bit
• Port 2: là port 8bit có 2 chức năng:
– Là I/O port đối với các thiết kế cỡ nhỏ (không dùng bộ nhớ mở
rộng)
– Là byte cao của add/data bus khi thiết kế có sử dụng bộ nhớ
mở rộng
• Port 3 (cổng 3): là port 8bit 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 89c52
3.3.1 Các cổng vào/ra (I/O port) (2/3)
3.3.1 Các cổng vào/ra (I/O port) (3/3)
• Các chân của P0 không có điện trở treo (internal pull-up), ngoại
trừ lúc làm việc như bus dữ liệu/địa chỉ bên ngoài; điện trở treo
có thể được dùng với P0 tùy theo đặc tính của thiết bị phối ghép
với cổng;
• Port 0 with Pull-Up Resistors Port 3 Alternate Functions
Nội dung
3.1 Các kiến trúc vi điều khiển
3.2 Khái quát họ vi điều khiển MCS51
3.3 Cấu trúc AT89C52
3.3.1 Các cổng vào ra (I/O port)
3.3.2 Các tín hiệu điều khiển
3.3.3 Tổ chức bộ nhớ
3.3.4 Giới thiệu tập lệnh
3.3.5 Timer – Mạch định thời
3.3.6 Serial Port – cổng nối tiếp
3.3.7 Interupt – Hoạt động ngắt
3.4 Phần cứng tối thiểu của họ MCS51
3.3.2 Các tín hiệu điều khiển (1/2)
• 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 kz 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ế độ hoạt độ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;
3.3.2 Các tín hiệu điều khiển (2/2)
• EA (External Access):
– Khi truy xuất ROM nội thì chân /EA phải nối nguồn 5V
– Khi truy xuất ROM ngoài thì /EA nối với GND
• RST (Reset): khi tín hiệu này được đưa lên cao trong ít nhất
2 chu kz máy thì sẽ khởi động lại hệ thống
• XTAL1, XTAL2: là ngõ vào và ngõ ra của bộ dao động tạo xung
nhịp
• Nguồn nuôi: dùng nguồn +5V ở chân 40 và GND ở chân 20
Nội dung
3.1 Các kiến trúc vi điều khiển
3.2 Khái quát họ vi điều khiển MCS51
3.3 Cấu trúc AT89C52
3.3.1 Các cổng vào ra (I/O port)
3.3.2 Các tín hiệu điều khiển
3.3.3 Tổ chức bộ nhớ
3.3.4 Giới thiệu tập lệnh
3.3.5 Timer – Mạch định thời
3.3.6 Serial Port – cổng nối tiếp
3.3.7 Interupt – Hoạt động ngắt
3.4 Phần cứng tối thiểu của họ MCS51
3.3.3 Tổ chức bộ nhớ (1/5)
• 89C51 có cả ROM nội và RAM nội, tuy nhiên co
thể mở rộng thêm bằng các thiết bị nhớ bên
ngoài
• RAM nội gồm:
– 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
3.3.3 Tổ chức bộ nhớ (2/5)
• RAM đa dụng có
địa chỉ 30-7FH
• RAM được địa chỉ
hóa từng bit có
địa chỉ từ 20H-
2FH
• Có 4 bank thanh
ghi, mỗi bank có
8 thanh ghi từ R0
đến R7
3.3.3 Tổ chức bộ nhớ (3/5)
3.3.3 Tổ chức bộ nhớ (4/5)
Thanh ghi PSW
• Các bit RS0 và RS1 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
ở bank 0
3.3.3 Tổ chức bộ nhớ (5/5)
• Thanh ghi B: dùng cùng với thanh ghi A trong các
phép toán nhân và chia
• Con trỏ dữ liệu DPTR:
– 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;
– Các thanh ghi này được địa chỉ hóa đến từng bit
• Thanh ghi định thời gian: là các thanh ghi điều
khiển hoạt động của timer
Nội dung
3.1 Các kiến trúc vi điều khiển
3.2 Khái quát họ vi điều khiển MCS51
3.3 Cấu trúc AT89C52
3.3.1 Các cổng vào ra (I/O port)
3.3.2 Các tín hiệu điều khiển
3.3.3 Tổ chức bộ nhớ
3.3.4 Giới thiệu tập lệnh
3.3.5 Timer – Mạch định thời
3.3.6 Serial Port – cổng nối tiếp
3.3.7 Interupt – Hoạt động ngắt
3.4 Phần cứng tối thiểu của họ MCS51
3.3.4 Giới thiệu tập lệnh
• 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ỉ (1/2)
• Đánh địa chỉ thanh ghi (Rn):
– 98C51 có 8 thanh ghi làm việc được k{ hiệu từ R0-R7
– Trong định địa chỉ thanh ghi, mã lệnh 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 2byte, trong đó địa chỉ ô nhớ chiếm 1byte
– Ví dụ: MOV A,40H
Các cách đánh địa chỉ (2/2)
• Định địa chỉ gián tiếp thanh ghi (@Ri):
– Với 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
• Đinh đị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 (1/3)
• Cú pháp: MOV đích,nguồn
• Chuyển dữ liệu trong không gian bộ nhớ nội, hướng
chuyển dữ liệu từ nguồn đến đích
• Ví dụ:
– MOV A,Rn: chuyển nội dung thanh ghi Rn vào A
– MOV A,@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,#data: chuyển giá trị dữ liệu tức thời vào thanh
ghi Rn
– …
Nhóm lệnh chuyển dữ liệu (2/3)
• XCH A,Rn: hoán đổi dữ liệu giữa A và 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 là từ nguồn đến đích
– Địa chỉ của ngoại 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
Nhóm lệnh chuyển dữ liệu (3/3)
• MOVX @Ri,A: ghi dữ liệu từ A ra ô nhớ ngoài
• MOVX A,@Ri: đọc dữ liệu từ ô nhớ ngoài vào A
• MOVX @DPTR,A: ghi dữ liệu từ A ra ô nhớ ngoài
• MOVX A,@DPTR: đọc dữ liệu từ ô nhớ ngoài 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
– MOV A,@R1
– MOV A,40H
– MOV A,#40
Nội dung A là 40H, R1 là 40H, ô nhớ 40H là FFH
Nội dung A là FFH, R1 là 40H, ô nhớ 40H là FFH
Nội dung A là FFH, R1 là 40H, ô nhớ 40H là FFH
Nội dung A là 40H, R1 là 40H, ô nhớ 40H là FFH
Nhóm lệnh số học và luận l{ (1/2)
• ADD, ADDC: lệnh cộng dữ liệu
– Lệnh cộng dữ liệu sẽ lưu kết quả tính toán 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ị 12H, sau khi thực hiện lệnh
ADD A,#36H thì giá trị của A 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 toán vào thanh ghi A
– Lệnh tác động đến cờ trong thanh ghi PSW
– Để kết quả tính chính xác, trước khi dùng lệnh trừ ta nên
xóa cờ CY
– Ví dụ: lệnh SUBB A,R1: nội dung A – nội dung R1 – nội
dung bit cờ CY, kết quả cất trở lại thanh ghi A
Nhóm lệnh số học và luận l{ (2/2)
• INC: lệnh tăng 1 đơn vị (không tác động đến CY)
• DEC: giảm đi 1 đơn vị
• MUL A,B: nhân nội dung A với nội dung B, byte thấp
của kết quả cất vào A, byte cao của kết quả cất vào B
• DIV A,B: chia nội dung của A cho nội dung B, phần
nguyên kết quả cất vào A, phần dư cất vào B
• Các lệnh luận l{:
– ANL: lệnh AND
– ORL: lệnh OR
– XRL: lệnh XOR
– RL A: quay trái thanh ghi A đi 1bit (RR A: quay phải 1 bit)
– SWAP A: hoán đổi nội dung 4bit cao và 4 bit thấp của
thanh ghi A (tương đương 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, SETB bit: đặt bit cờ/bit lên 1
• CPL C, CPL bit: lấy bù bit cờ/ bit
• …
Nhóm các lệnh điều khiển
• Lệnh gọi chương trình con:
– ACALL: gọi ctc dùng địa chỉ tuyệt đối
– LCALL: gọi ctc dùng địa chỉ dài
• Lênh thoát:
– RET: trở về CTC từ ctc
– RETI: trở về CTC từ ctc phục vụ ngắt
• Lệnh nhảy không điều kiện:
– AJMP/LJMP/SJMP (lệnh nhảy tuyệt đối/dài/ngắn)
• Lệnh nhảy có điều kiện
– JZ/JNZ (nhảy nếu A=0/khác 0)
– JC/JNC (nhảy nếu C=1/C=0)
– JB bit/JNB bit: nhảy nếu bit =1/nếu bit=0
• NOP: lệnh k làm gì cả nhưng PC vẫn tăng lên 1
• ….
Một số ví dụ áp dụng tập lệnh
• VD1: Hãy cho biết các lệnh dưới đây thực hiện công
việc gì ? Giá trị các thanh ghi và ô nhớ sau khi thực
hiện xong lệnh:
MOV R1,#25H
MOV A,#50H
MOV @R1,A
• VD2: Viết chương trình thực hiện cổng logic sau:
R1=25H; A=50H; (ô nhớ 25H)=50H
MOV C,P1.4
ORL C,P1.5
CPL C
MOV P1.7,C
Một số ví dụ áp dụng tập lệnh
a) Viết chương trình cho 8 Led sáng
b) Viết chương trình cho 4 led sáng: D1-D4
c) Viết chương trình cho 4 led sáng: D5-D8
Một số ví dụ áp dụng tập lệnh
a) Viết chương trình cho 8 Led sáng
b) Viết chương trình cho 4 led sáng: D1-D4
c) Viết chương trình cho 4 led sáng: D5-D8
Nội dung
3.1 Các kiến trúc vi điều khiển
3.2 Khái quát họ vi điều khiển MCS51
3.3 Cấu trúc AT89C52
3.3.1 Các cổng vào ra (I/O port)
3.3.2 Các tín hiệu điều khiển
3.3.3 Tổ chức bộ nhớ
3.3.4 Giới thiệu tập lệnh
3.3.5 Timer – Mạch định thời
3.3.6 Serial Port – cổng nối tiếp
3.3.7 Interupt – Hoạt động ngắt
3.4 Phần cứng tối thiểu của họ MCS51
Giới thiệu Timer:
• Timer là một chuỗi các Flip-Flop chia đôi tần số mắc nối
tiếp với nhau, chúng nhận tín hiệu vào làm nguồn xung
nhịp. Xung nhịp được đưa vào Flip-Flop thứ nhất để chia
đôi tần số xung nhịp. Ngõ ra của Flip-Flop thứ nhất làm
xung nhịp cho Flip-Flop thứ hai (cũng làm việc chia đôi tần
số), và v.v. …
• Vì mỗi tầng kế tiếp chia đôi cho nên timer có n tầng sẽ cho
xung ra có tần số là tần số xung nhịp chia cho 2n. Ngõ ra của
tầng cuối làm xung nhịp cho Flip-Flop báo tràn của timer
(còn gọi là cờ timer TF – Timer Flag);
• Giá trị nhị phân trong các Flip-Flop của timer có thể xem
như số đếm xung nhịp (hoặc các sự kiện) từ khi timer bắt
đầu chạy. Thí dụ timer 16bit sẽ đếm từ 0000H đến FFFFH,
cờ báo tràn sẽ lên 1 khi số đếm tràn từ FFFFH đến 0000H.
Vi dụ Timer 3 bit:
Ứng dụng của Timer:
• Sử dụng timer để: Định khoảng thời gian; Đếm sự kiện;Tạo tốc độ
baud cho cổng nối tiếp có sẵn trong VĐK
• Trong các ứng dụng định khoảng thời gian, thường lập trình
cho timer tràn ở một khoảng đều đặn và đặt cờ tràn timer lên
1. cờ được dùng để đồng bộ hóa hoặc đo thời gian trôi qua
giữa hai sự kiện (ví dụ đo độ rộng xung);
• Đếm sự kiện được dùng để xác định số lần xảy ra của một sự
kiện hơn là đo khoảng thời gian trôi qua giữa các sự kiện. Một
“sự kiện” là bất cứ tác động bên ngoài nào có thể cung cấp
một chuyển tiếp 1 sang 0 từ chân T0,T1,T2 (ở P3, P2) của
89c52
• Các timer cũng có thể cung cấp xung nhịp tốc độ baud cho
cổng nối tiếp có sẵn trong VĐK
Các thanh ghi chức năng đặc biệt (SFR)
của timer
Timer được truy cập khi sử dụng các thanh ghi chức
năng đặc biệt: TMOD, TCON, TH0, TL0, TH1, TL1
Thanh ghi TMOD (Timer Mode Register) (1/2)
• 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)
Thanh ghi TMOD (Timer Mode Register) (2/2)
• Khi GATE=0: Timerx hoạt động khi bit TRx=1
(ghi chú: x=0,1; TRx: TR0 hoặc TR1; Timerx: Timer0 hoặc
Timer1)
– 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)
– M0,M1: các bit chọn chế độ
Thanh ghi TMOD (Timer Mode Register)
Ví dụ:
TMOD = 0000 0001 (01H)
chế độ 1 của bộ định thời Timer 0 được chọn
TMOD = 0010 0000 (20H)
chế độ 2 của bộ định thời Timer 1 được chọn
TMOD = 0001 0010 (12H)
chế độ 1 của bộ định thời Timer 1 và chế độ 2 của
Timer 0 được chọn
Thanh ghi TMOD (Timer Mode Register)
Ví dụ:
TMOD = 0000 0010
Bộ định thời là Timer0, chế độ 2,
C/T = 0 dùng nguồn XTAL,
GATE = 0 dùng phần mềm để khởi động và dừng bộ định
thời.
Thanh ghi điều khiển Timer (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 đến 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
VD: timer 16bit sẽ đếm lên từ 0000H đến FFFFH, 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)
Thanh ghi điều khiển Timer (TCON- Timer
Control Register)
Các chế độ làm việc của timer
• AT89C52 có 3 timer, mỗi timer có 4 chế độ làm
việc, bao gồm:
– Chế độ 0 (mode 0): chế độ định thời 13bit
– Chế độ 1 (mode 1): chế độ định thời 16bit
– Chế độ 2 (mode 2): timer 8bit tự động nạp lại giá
trị ban đầu
– Chế độ 3 (mode 3): chế độ tách timer
Chế độ 0 (mode 0): chế độ định thời 13bit
• Chế độ Timer 13bit, tương thích 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: 0 đến (213-1)Ttimer (từ 0 đến 8191Ttimer)
Chế độ 1 (mode 1): chế độ định thời 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 nhất (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, nghĩa là từ 0
đến 65535Ttimer
Lập trình trong chế độ 1
Để tạo ra một độ trễ thời gian dùng chế độ 1 của Timer:
1. Nạp giá trị TMOD cho thanh ghi báo độ định thời nào (Timer0 hay
Timer1) được sử dụng và chế độ nào được chọn;
2. Nạp các thanh ghi TL và TH với các giá trị đếm ban đầu;
3. Khởi động bộ định thời
4. Duy trì kiểm tra cờ bộ định thời TF bằng một vòng lặp để xem nó
được bật lên 1 không. Thoát vòng lặp khi TF được lên cao;
5. Dừng bộ định thời;
6. Xoá cờ TF cho vòng kế tiếp;
7. Quay trở lại bước 2 để nạp lại TL và TH.
Lập trình trong chế độ 1
Công thức tính toán độ trễ sử dụng chế
độ 1 (16 bit) của bộ định thời đối với tần số
thạch anh XTAL = f (MHz):
Tính theo số Hex Tính theo số thập phân
(FFFF - YYXX + 1)*12/f (ms)
trong đó YYXX là các giá trị
khởi tạo của TH, TL tương
ứng. Lưu ý rằng các giá trị
YYXX là theo số Hex.
Chuyển đổi các giá trị YYXX
của TH, TL về số thập phân
để nhận một số thập phân
NNNNN sau đó lấy (65536 –
NNNNN)*12/f (ms).
Chế độ 2 (mode 2): 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 hoàn một
khi đã khởi động bộ đếm
• Giá trị đếm được là từ 0 đến (28-1)Ttimer, nghĩa là từ 0
đến 255Ttimer
Chế độ 3 (mode 3): chế độ tách timer
• 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: timer 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 1 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: dùng timer đế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ó 1 sự
kiện xảy ra.
– Số sự kiện được xác định bằng phần mềm thông qua đọc các thanh
ghi timer
Nguồn tạo xung nhịp cho Timer:
Tần số thạch
anh
Tần số bộ định thời Chu kỳ bộ định thời
20MHz 20MHz/12=1,6666MHz 1/1,6666MHz=0,6us
12MHz 12MHz/12=1MHz 1/1MHz=1us
11,0592MHz 11,0592MHz/12=0,9216MHz 1/0,9216MHz=1,085us
Mặc dù các hệ thống 8051 có thể sử dụng tần số thạch
anh từ 10 đến 40MHz, song ta chỉ tập trung vào tần số
thạch anh 11,0592MHz. Lý do đằng sau một số lẻ như
vậy là tốc độ baud đối với truyền thông nối tiếp của 8051.
Tần số XTAL = 11,0592MHz cho phép hệ thống 8051
truyền thông với PC mà không có lỗi.
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ế độ 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 (trong C: TRx=1)
• Chờ cờ báo tràn: có 2 cách:
– JNB TFx,$
– Wait: JNB TFx,Wait lenh JNB
• Xóa cờ báo tràn: CLR TFx (trong C: TFx=0)
• Dừng Timer: CLR TRx (trong C: TRx=0)
Một số VD:
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
• B1: tìm tần số dao động và chu kz xung nhịp của timer
fOSC=12MHz
Ftimer=fOSC/12=1MHz
Ttimer=1/ftimer=1/10
6=1μs
• B2: xác định các giá trị cần nạp cho các thanh ghi timer
Có tdelay=100μs
Mà Ttimer=1μs nên: tdelay=100Ttimer
Do timer hoạt động như là một bộ đếm lên và khi bộ đếm 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
• B3: 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 có thể chọn timer ở chế độ
1(16bit) hay chế độ 2(8bit tự động nạp lại)
Một số VD:
• B4: Cho timer chạy
• B5: chờ cờ báo tràn
• B6: Xóa cờ báo tràn
• B7: Dừng timer
Chương trình hoàn chỉnh khi dùng timer 0 ở chế độ 2:
MOV TMOD,#0000 0010B
MOV TH0,#-100
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
END
Một số VD:
Chương trình dùng timer 0 chế độ 1:
MOV TMOD,#0000 0001B
MOV TH0,# high(-100); chuyển -100 sang mã nhị phân sau
đó lấy 8bit cao của giá trị gán vàoTH0
MOV TL0,# low(-100); chuyển -100 sang mã nhị phân sau
đó lấy 8bit thấp của giá trị gán vàoTL0
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
END
Một số VD:
VD2: viết chương trình tạo trễ 10ms dùng timer 1, tần số dao động trên chip
là 12MHZ
• B1: Ttimer=1 μs
• B2: Các giá trị cần nạp cho các thanh ghi timer
Tdelay=10ms vậy Tdelay=10000Ttimer
• B3: các giá trị cần nạp cho thanh ghi TMOD
Do Tdelay=10000Ttimer nên chọn timer ở chế độ 1 (16bit)
Chương trình:
MOV TMOD,#0001 0000B
MOV TH1,#high(-10000)
MOV TL1,#low(-10000)
SETB TR1
JNB TF1,$
CLR TF1
CLR TR1
END
Một số VD:
VD3: 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
• Tần số xung 10KHz nên chu kz xung vuông là T=1/(10.103)=10-4s = 100μs
• Xung vuông 50% nên: tH=tL=T/2=50μs
Dùng Timer 1:
MOV TMOD,#0000 0010B
MOV TH0,# -50
SETB TR0
LOOP: JNB TF0,$
CLR TF0
CPL P1.0
SJMP LOOP
END
Một số VD:
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
Một số VD:
• Tạo ra một sóng vuông với độ đầy xung 50% (cùng tỷ lệ giữa phần
cao và phần thấp) trên chân P1.5. Bộ định thời Timer0 được dùng
để tạo độ trễ thời gian: XTAL=11,0592MHz
#include //khai báo thư viện cho VĐK 89x51
void delay(void); //khi báo nguyên mẫu hàm con tạo trễ
main()
{
P1_5=1; //khởi tạo chân P1_5 ở mức cao
while(1) //vòng lặp vô hạn
{
delay(); //chương trình con tạo trễ
P1_5=~P1_5; //đảo tín hiệu chân P1_5
}
}
Một số VD:
void delay(void) //định nghĩa hàm delay
{
TMOD=0x01; //chọn timer0, chế độ 1, 16Bit
TL0=0xF2; //nạp giá trị cho TL0
TH0=0xFF; //nạp giá trị cho TH0
TR0=1; //khởi động timer0
while(!TF0){} //vòng lặp kiểm tra cờ TF0
TR0=0; //ngừng timer0
TF0=0; //xóa cờ TF0
}
Một số VD:
• Tính toán độ trễ tạo ra bởi bộ định thời ở chương trình trên
với tần số XTAL=11,0592MHz:
• Bộ định thời làm việc với tần số đồng hồ bằng 1/12 tần số
XTAL, do vậy ta có 11,0592MHz/12=0,9216MHz là tần số của
bộ định thời. Kết quả là mỗi nhịp xung đồng hồ có chu kỳ
T=1/0,9216MHz=1,085us. Hay nói cách khác, bộ Timer0 tăng
01 đơn vị sau 1,085ms để tạo ra bộ trễ bằng
số_đếm´1,085ms.
• Số đếm bằng FFFFH - FFF2H = ODH (13 theo số thập phân).
Tuy nhiên, ta phải cộng 1 vào 13 vì cần thêm một nhịp đồng
hồ để nó quay từ FFFFH về 0000H và bật cờ TF. Do vậy, ta
có 14 x1,085us = 15,19us cho nửa chu kỳ và cả chu kỳ là T =
2 x15,19us = 30,38us là thời gian trễ được tạo ra bởi bộ định
thời.
Phân tích ví dụ
Các bước để tìm các giá trị của các thanh
ghi TH và TL, XTAL = 11. 0592MHz
1. Chia thời gian trễ cần thiết cho 1.085ms
2. Thực hiện 65536 - n với n là giá trị thập
phân nhận được từ bước 1.
3. Chuyển đổi kết quả ở bước 2 sang số Hex:
ta có YYXX là giá trị Hexa ban đầu cần phải
nạp vào các thanh ghi bộ định thời.
4. Đặt TL = XX và TH = YY.
Một số VD:
Ví dụ: Giả sử tần số XTAL = 11.0592MHz. Hãy tìm các giá trị cần được nạp vào
các thanh ghi vào các thanh ghi TH và TL nếu ta muốn độ thời gian trễ là 5ms.
• Để có được ta chia 5ms cho 1.085ms và nhận được số n = 4608 nhịp. Để
nhận được giá trị cần được nạp vào TL và TH thì ta tiến hành lấy 65536 trừ
đi 4608 bằng 60928. Ta đổi số này ra số hex thành EE00H. Do vậy, giá trị
nạp vào TH là EE Và TL là 00.
void delay(void) //định nghĩa hàm delay
{
TMOD=0x01; //chọn timer0 chế độ 1 16Bit
TL0=0x00; //nạp giá trị cho TL0
TH0=0xEE; //nạp giá trị cho TH0
TR0=1; //khởi động timer0
while(!TF0){} //vòng lặp kiểm tra cờ TF0
TR0=0; //ngừng timer0
TF0=0; //xóa cờ TF0
}
Chú {:
• Lập trình chế độ 0: Chế độ 0 hoàn toàn giống chế
độ 1 chỉ khác là bộ định thời 16 bit được thay bằng13 bit.
Bộ đếm 13 bit có thể giữ các giá trị
giữa 0000 đến 1FFFH
• trong TH - TL. Do vậy khi bộ định thời đạt được giá trị
cực đại của nó là 1FFFH thì nó sẽ quay trở về 0000và
cờ TF được bật lên.
• Lập trình ở chế độ 2: chế độ 2 là bộ định thời 8 bit.
Tuy nhiên, nó lại có khả năng tự nạp, khi tự nạp lại
thì giá trị ban đầu của TH được giữ nguyên, còn TL
được nạp lại giá trị sao chép từ TH.
Bài tập
1. Thiết kế cột đèn giao thông ở ngã tư dùng
LED đơn và LED 7 thanh
2. Hiển thị số đếm từ 0 đến 9999 trên sơ đồ đã
copy
3. Chuẩn bị:
– Lập trình cho LCD
– Lập trình cho LED ma trận
– Lập trình cho ADC, RTC, …
Nội dung
3.1 Các kiến trúc vi điều khiển
3.2 Khái quát họ vi điều khiển MCS51
3.3 Cấu trúc AT89C52
3.3.1 Các cổng vào ra (I/O port)
3.3.2 Các tín hiệu điều khiển
3.3.3 Tổ chức bộ nhớ
3.3.4 Giới thiệu tập lệnh
3.3.5 Timer – Mạch định thời
3.3.6 Serial Port – cổng nối tiếp
3.3.7 Interupt – Hoạt động ngắt
3.4 Phần cứng tối thiểu của họ MCS51
Truyền dữ liệu nối tiếp
• Truyền dữ liệu khoảng cách xa
• Tốc độ truyền dữ liệu thấp
• Truyền dữ liệu nối tiếp đồng bộ
– Dùng tìn hiệu clock riêng để đồng bộ hóa mạch thu và
phát;
– Thường dùng khung dữ liệu lớn hơn và nhanh hơn.
• Truyền dữ liệu nối tiếp bất đồng bộ
– Không cần tín hiệu clock riêng để đồng bộ hóa
chuyển dữ liệu;
– Dựa trên ký tự, mỗi ký tự được đóng khung bằng
‘start bit’ và ‘stop bit’
– Bên thu cần nhận dạng ‘start bit’ và ‘stop bit’ để nhận
đúng ký tự dữ liệu
Truyền dữ liệu đồng bộ và bất
đồng bộ
Đường truyền dữ liệu cơ bản
Đường truyền điểm-điểm và
điêm-đa điểm
Cơ bản về đường truyền
RS232
Giới thiệu cổng nối tiếp của MCS81
• 80c52 có 1 port nối tiếp hoạt động ở nhiều chế độ trên một
dải tần số rộng;
• Chức năng: chuyển dữ liệu từ song song sang nối tiếp đối
với dữ liệu xuất và từ nối tiếp sang song song đối với dữ
liệu nhập;
• Port nối tiếp được truy xuất qua các chân TXD và RXD. Dữ
liệu được thu (nhập) qua chân RXD (P3.0) và dữ liệu được
phát (xuất) qua chân TXD (P3.1)
• Tại mỗi thời điểm chỉ có 1 bit được thu hay phát. Để đồng
bộ giữa thu và phát nối tiếp người ta sử dụng tốc độ baud
• Port nối tiếp hoạt động song công và có đệm lúc thu cho
phép 1 k{ tự được thu và được giữ trong khi k{ tự thứ 2
được nhận. Nếu CPU đọc k{ tự thứ nhất trước khi k{ tự thứ
2 được thu đầy đủ thì dữ liệu sẽ không bị mất;
Giới thiệu cổng nối tiếp
Hai thanh ghi DBUF và SCON dùng để truy xuất Port nối tiếp
Các đặc tính của cổng nối tiếp MCS51
Thanh ghi đệm nối tiếp SBUF:
• Thanh ghi SBUF đóng vai trò vừa là bộ đệm phát vừa là bộ
đệm thu:
– Dữ liệu phát đi sẽ được ghi vào SBUF và được phát qua
ngõ TXD, trong trường hợp này nó là bộ đệm phát
– Dữ liệu thu sẽ được nạp vào SBUF thông qua ngõ RXD và
đọc thanh ghi này để truy xuất dữ liệu thu được, trong
trường hợp này nó là bộ đệm thu
– Port nối tiếp được dùng để cất các dữ liệu phát hoặc thu,
khi dịch hết 8bit thì một dữ liệu được phát hoặc được
nhận
– Tốc độ baud của port nối tiếp có thể lấy từ bộ dao động
trên chip hoặc sử dụng timer
Thanh ghi điều khiển port nối tiếp SCON
Các chế độ làm việc của cổng nối tiếp
Mode 0: chế độ thanh ghi dịch
• Dữ liệu nối tiếp được vào (thu) và ra (phát) qua ngõ RXD
• Ngõ TXD là ngõ ra xung nhịp dịch, với 1 chu kz xung nhịp dịch thì 1
bit sẽ được phát hoặc thu
• Dữ liệu được phát hoặc thu với bit đầu tiên là bit LSB
• Xung nhip tốc độ baud cố định ở 1/12 tần số dao động trên chip
• Việc phát k{ tự được khởi động bằng bất cứ lệnh nào ghi dữ liệu
vào thanh ghi SBUF, trước khi phát phải kiểm tra bộ đệm phát đã
rỗng
• Chương trình con để phát 1 byte dữ liệu:
Mode 0: chế độ thanh ghi dịch
Mode 0: chế độ thanh ghi dịch
Mode 1: UART 8bit tốc độ baud thay
đổi được
Mode 1: UART 8bit tốc độ baud thay
đổi được
Mode 1: UART 8bit tốc độ baud thay
đổi được
Mode 2: UART 9 bit có tốc độ baud cố định
Mode 3: UART 9 bit có tốc độ baud
thay đổi
Khởi tạo và truy nhập các thanh
ghi cổng nối tiếp
Cho phép bộ thu – truyền dữ liệu
nối tiếp
Tốc độ baud cho cổng nối tiếp
Sử dụng Timer1 làm xung nhịp tốc
độ baud
Tốc độ baud port nối tiếp
• Tốc độ baud là số bit dữ liệu được truyền trong 1 sec, đơn vị tính là
bit/giây (bps)
• Để tạo tốc độ baud thì khởi động cho timer 1 tràn sau một khoảng
thời gian tương ứng với tốc độ baud
Ví dụ: tạo tốc độ baud 1200bps biết chip sử dụng thạch anh 12MHz
Thạch anh 12MHz: Ttimer =1us
Tốc độ tràn timer 1 là (giả sử bit SMOD trong thanh ghi PCON có giá trị
=0)
Ta có: fbaud=ftràn T1/32
Suy ra ftràn T1 = fbaudx32=1200x32=38400Hz
Suy ra Ttràn T1=1/ftrànT1=1/38400Hz=26us
TtrànT1=26Ttimer
Như vậy giá trị cần nạp cho thanh ghi timer là -26
Tóm tắt tốc độ baud
Ví dụ 1: Khởi tạo giá trị cho cổng nối tiếp
Ví dụ 2
Ví dụ 3:
Ví dụ 4
Ví dụ 5
Nội dung
3.1 Các kiến trúc vi điều khiển
3.2 Khái quát họ vi điều khiển MCS51
3.3 Cấu trúc AT89C52
3.3.1 Các cổng vào ra (I/O port)
3.3.2 Các tín hiệu điều khiển
3.3.3 Tổ chức bộ nhớ
3.3.4 Giới thiệu tập lệnh
3.3.5 Timer – Mạch định thời
3.3.6 Serial Port – cổng nối tiếp
3.3.7 Interupt – Hoạt động ngắt
3.4 Phần cứng tối thiểu của họ MCS51
Hoạt động ngắt
Thực thi chương trình
Cấu trúc ngắt trong 8051
Các nguồn ngắt
Thanh ghi cho phép ngắt IE
Thứ tự ưu tiên ngắt
Xử lý ngắt
Các vector ngắt
Tổ chức bộ nhớ khi ngắt
Khung chương trình dùng ngắt
Chương trình phục vụ ngắt có kích
thước nhỏ
Chương trình phục vụ ngắt có kích
thước lớn
a.Ngắt timer
Ví dụ tạo sóng vuông bằng ngắt timer
Phân tích chương trình tạo sóng
dùng timer
Ví dụ: tạo 2 sóng vuông dùng ngắt
Ví dụ: tạo 2 sóng vuông dùng ngắt
Ví dụ về ngắt timer
Ví dụ về ngắt timer
b. Ngắt cổng nối tiếp
c. Ngắt ngoài
Nội dung
3.1 Các kiến trúc vi điều khiển
3.2 Khái quát họ vi điều khiển MCS51
3.3 Cấu trúc AT89C52
3.3.1 Các cổng vào ra (I/O port)
3.3.2 Các tín hiệu điều khiển
3.3.3 Tổ chức bộ nhớ
3.3.4 Giới thiệu tập lệnh
3.3.5 Timer – Mạch định thời
3.3.6 Serial Port – cổng nối tiếp
3.3.7 Interupt – Hoạt động ngắt
3.4 Phần cứng tối thiểu của họ MCS51
Phần cứng tối thiểu của họ MCS51
Bài tập
1. Sơ đồ đã cho:
– Lập trình & mô phỏng: 8 led sáng lần lượt từ
phải qua trái, sau đó lần lượt từ trái qua phải.
2. Thiết kế 1 ngã tư 4 cột đèn đk giao thông,
lập trình và mô phỏng hoạt động của nút
giao thông: xanh 10s, vàng 2s, đỏ 5s.
return
Bài tập
1. Nháy LED đơn nối với cổng P1.0 với 1 nhịp/1s
2. Sáng lần lượt các LED đơn nối với cổng P1
theo thứ tự P1.0 đến P1.7 rồi lặp lại, thời
gian sáng/tắt là 1s
3. Sáng và lưu sáng các LED đơn nối với cổng P1
theo thứ tự từ P1.0 đến P1.7, thời gian
sáng/tắt là 1s
Tai lieu
1. Timer
2. Cong noi tiep
3. Ngat
Bài tập lớn
• 1 nhóm 3 người
• Yêu cầu:
– Làm mô phỏng (vẽ protus+lập trình chạy mô
phỏng)
– Làm mạch thực tế: chạy được
– Viết Báo cáo: phần thiết kế mạch, phần mô phỏng,
mạch thật
Các file đính kèm theo tài liệu này:
- chuong3_2611.pdf