Như vậy, cần có một IC chốt bên ngoài được nối với port 0 để giữ byte địa chỉ thấp khi giao tiếp với bộ nhớ ngoài.. Trong sơ đồ này, người sử dụng có thể chọn dung lượng bộ nhớ cần thiết
Trang 1Đại Học Giao Thông Vận Tải Tp.HCM
Giảng viên: TS NGUYỄN HỮU CHÂN THÀNH
Chương 5: Giao tiếp
Khoa Điện – Điện Tử Viễn Thông
Học phần: Vi Xử Lý
Trang 2Chương 5 bao gồm 5 nội dung:
1 Giao tiếp bộ nhớ ngoài.
2 Giao tiếp phím đơn và bàn phím.
3 Giao tiếp bộ hiển thị.
4 Mở rộng port I/O.
5 Giao tiếp A/D - D/A.
Trang 3I Giao tiếp bộ nhớ ngoài
Trang 4I Giao tiếp bộ nhớ ngoài
Họ VĐK 8051 có một lượng ROM nội on-chip Đối với
những thiết kế hệ thống tương đối nhỏ, lượng ROM on-chip của nó là đủ để chứa chương trình thực thi Tuy nhiên, đối với những thiết kế hệ thống lớn, mã chương trình thực thi có thể vượt quá dung lượng ROM on-chip hoặc dữ liệu cần lưu trữ tương đối nhiều, do đó cần phải mở rộng bộ nhớ cho hệ thống bằng cách sử dụng thêm ROM ngoài hoặc RAM
ngoài.
Trang 5I Giao tiếp bộ nhớ ngoài
Như đã biết ở chương 2, khi giao tiếp bộ nhớ ngoài, port 0 là dồn kênh của bus dữ liệu và byte thấp của bus địa chỉ, còn port 2 là byte cao của bus địa chỉ Như vậy, cần có một IC chốt bên ngoài được nối với port 0 để giữ byte địa chỉ thấp khi giao tiếp với bộ nhớ ngoài Byte địa chỉ thấp được chốt vào IC ngoài bằng xung ALE từ vi điều khiển 8051 Sau đó, port 0 trở thành bus dữ liệu hai chiều trong suốt giai đoạn
đọc hay ghi của chu kì máy.
Trang 6I Giao tiếp bộ nhớ ngoài
* Quy tắc chung về thiết kế mạch giao tiếp bộ nhớ với MCS-51
4 Sử dụng đường /PSEN cho bộ nhớ chương trình hoặc các đường /RD,
/WR cho bộ nhớ dữ liệu để truy xuất đến các chân đọc/ghi bộ nhớ.
5 Chân /EA = VCC nếu sử dụng ROM nội hoặc /EA = 1 nếu sử dụng ROM ngoài.
Trang 7I Giao tiếp bộ nhớ ngoài
Trang 8I Giao tiếp bộ nhớ ngoài
Ví dụ 1: Thiết kế kit 8031 với 1 ROM 2764 (chứa
chương trình), 1 RAM 6264 (chứa dữ liệu).
Trang 9I Giao tiếp bộ nhớ ngoài
ROM 2764 và RAM 6264 đều có dung lượng 8KB.
Ta có: 8KB = 213 byte mỗi chip có 13 đường địa chỉ vào A0 ÷ A12.
Sơ đồ mạch kết nối như hình trang sau.
Có thể thiết kế mạch giao tiếp với 1 EPROM và 1 RAM tổng
quát bằng cách dùng các cầu nối (jumper) và điện trở kéo lên
phù hợp như trên hình 5.2 Trong sơ đồ này, người sử dụng có thể chọn dung lượng bộ nhớ cần thiết bằng cách thiết lập các
jumper để nối các chân địa chỉ thích hợp từ bus địa chỉù vào chip nhớ Bảng thiết lập jumper tương ứng cho các dung lượng
EPROM và RAM khác nhau cũng được cho trên hình.
Trang 10I Giao tiếp bộ nhớ ngoài
Trang 11chip khác xem như hở mạch (trở kháng cao)
- Một ví dụ về giải mã địa chỉ được cho ở hình slide kế.
Trang 12I Giao tiếp bộ nhớ ngoài
Trang 13I Giao tiếp bộ nhớ ngoài
Ví dụ 2: Thiết kế kit 8031 với 2 ROM 2764
Trang 14I Giao tiếp bộ nhớ ngoài
Trang 15I Giao tiếp bộ nhớ ngoài
-Giả sử dùng bộ giải mã 3 8 là IC 74138 8 ngõ ra của IC cho phép chọn 8
vùng nhớ tương ứng, mỗi vùng 8KB Chọn 2 ngõ ra của 74138 nối đến ngõ vào chọn chip () của 2 ROM Ở đây, có thể chọn (0000H ÷ 1FFFH) và
(2000H ÷ 3FFFH)
Lưu ý: Nếu là ROM chứa chương trình thì địa chỉ bắt đầu phải là 0000H vì
trong 8031/8051, thanh ghi PC sẽ chứa giá trị 0000H ngay sau khi khởi
Trang 16I Giao tiếp bộ nhớ ngoài
Trang 17I Giao tiếp bộ nhớ ngoài
Cách 2: Nếu dùng ROM chứa dữ liệu thì có thể thiết kế như sau:
Do chỉ có 2 chip nhớ ngoài nên có thể chỉ thực hiện mạch giải mã 1
2 Mạch này có thể đơn giản như sau:
A15 = 0: chọn ROM1 (/CSROM1: 0000H ÷ 7FFFH)
A15 = 1: chọn ROM2 (/CSROM2: 8000H ÷ FFFFH)
Trang 18I Giao tiếp bộ nhớ ngoài
Vùng địa chỉ ứng với mỗi chân chọn chip sẽ là 32KB mỗi ROM sẽ
có 4 vùng địa chỉ 8KB:
Lưu ý: Khi viết chương trình nên chọn sử dụng duy nhất 1 trong 4
vùng địa chỉ trên cho mỗi ROM để tiện cho việc kiểm soát chương trình
Trang 19I Giao tiếp bộ nhớ ngoài
Ví dụ 3: Thiết kế kit 8051 với 2 RAM 6264 (chứa dữ liệu)
Trang 20I Giao tiếp bộ nhớ ngoài
Cách 1: Giải mã địa chỉ dùng bộ giải mã 3 8
- Thực hiện mạch giải mã địa chỉ tương tự ví dụ 2.
- Sơ đồ mạch kết nối như hình dưới.
Trang 21I Giao tiếp bộ nhớ ngoài
Trang 22I Giao tiếp bộ nhớ ngoài
Cách 2: Nếu kit chỉ có 2 chip nhớ ngoài, có thể thực hiện
giải mã đơn giản như sau:
- A0 ÷ A12 đưa đến các chân địa chỉ tương ứng trên 2 RAM.
- A15 nối với A15 = 0 thì chọn RAM1, A14 nối với A14 = 0 thì chọn RAM2.
Với cách này ta không cần thêm IC cho mạch giải mã địa
chỉ, tuy nhiên khi viết chương trình, phải đảm bảo chỉ có 1 chip RAM được chọn tại mỗi thời điểm, tức là A15 = 0 thì A14 = 1 và ngược lại.
Trang 23I Giao tiếp bộ nhớ ngoài
-Bảng địa chỉ bộ nhớ:
Nhận xét: Do đường địa chỉ A13 không được kết nối nên có thể chọn
giá trị là 0 hay 1 Vì thế mỗi chip RAM sẽ có 2 vùng địa chỉ 8KB
tương ứng với giá trị 0 và 1 của A13
Trang 24I Giao tiếp bộ nhớ ngoài
Ví dụ 4: Thiết kế mạch giải mã địa chỉ cho kit 8031 với 1
ROM 2764 và 2 ROM 2732
Trang 25I Giao tiếp bộ nhớ ngoài
Vì không yêu cầu địa chỉ cụ thể nên vùng địa chỉ của các chip nhớ là tùy người thiết kế
ROM 2764 có dung lượng 8KB = 213 byte có 13 đường địa chỉ vào
A15 được đưa đến bộ giải mã 3 8 (ở đây dùng IC 74138)
- Mạch giải mã địa chỉ và bảng địa chỉ tương ứng như hình dưới
- Như vậy mỗi chip ROM 2732 sẽ có 2 vùng địa chỉ 4KB tương ứng
Trang 26I Giao tiếp bộ nhớ ngoài
Trang 27I Giao tiếp bộ nhớ ngoài
Cách 2: Chọn phân vùng 4KB
-Các đường địa chỉ A0 ÷ A11 đưa đến các chân địa chỉ tương ứng trên
các chip ROM 2732 và A0 ÷ A12 đưa đến chip ROM 2764 Các
đường địa chỉ A12 ÷ A15 đưa đến bộ giải mã 4 16 (giả sử dùng
74154) Như vậy, sẽ có 16 vùng, mỗi vùng 4KB
-Tín hiệu chọn chip ROM 2764 có thể tạo ra bằng cách AND hai ngõ
ra của 74154
- Mạch giải mã địa chỉ có thể thực hiện như hình dưới
Trang 28I Giao tiếp bộ nhớ ngoài
Trang 29I Giao tiếp bộ nhớ ngoài
- Các chân Y4 ÷ Y15 được dự trữ
- Bảng phân vùng địa chỉ:
Trang 30I Giao tiếp bộ nhớ ngoài
Ví dụ 5: Thiết kế kit 8051 với 1 ROM 2764 (dữ liệu), 1
RAM 6264 và một thiết bị xuất (ví dụ là IC 74373)
Trang 31I Giao tiếp bộ nhớ ngoài
- Do 8031/8051 chỉ cung cấp 2 đường điều khiển đọc và ghi chung cho cả bộ nhớ và I/O là và nên ở đây sẽ giải mã địa chỉ cho I/O theo phương pháp ánh xạ bộ nhớ (xem I/O như là bộ nhớ ngoài)
- Sơ đồ mạch kết nối như hình slide dưới
- Bảng phân vùng địa chỉ:
Trang 32I Giao tiếp bộ nhớ ngoài
Trang 33I Giao tiếp bộ nhớ ngoài
Ví dụ 6:
a/ Hãy vẽ bảng địa chỉ (bảng phân vùng địa chỉ) bộ nhớ cho
4 chip RAM, mỗi chip 1K, biết địa chỉ bắt đầu là 2000H.
b/ Hãy thiết kế mạch giải mã địa chỉ cho 4 chip RAM trên theo bảng địa chỉ ở câu a (chỉ dùng 1 IC 74138).
Trang 34I Giao tiếp bộ nhớ ngoài
a/ Vì địa chỉ bắt đầu theo yêu cầu là 2000H nên bảng phân vùng địa chỉ cho 4 chip RAM trên là:
Trang 35I Giao tiếp bộ nhớ ngoài
b/ Các chip nhớ đều là 1KB = 210 byte chọn phân vùng 1KB
- Các đường địa chỉ A0 ÷ A9 nối đến các chân địa chỉ tương ứng trên mỗi chip nhớ Các đường địa chỉ A10 ÷ A15 đưa đến mạch giải mã địa chỉ (IC 74138)
- Bảng địa chỉ:
Trang 36I Giao tiếp bộ nhớ ngoài
Trang 37I Giao tiếp bộ nhớ ngoài
Ví dụ 7: Hãy xác định khoảng địa chỉ của các ngõ ra 74138
cho mạch giải mã địa chỉ sau
Trang 38I Giao tiếp bộ nhớ ngoài
- Để 74138 hoạt động thì các chân cho phép phải ở mức tích cực, tức là:
G1 = 1 A11 = 1
/G2A = /G2B = 0 A12 = A13 = A14 = A15 = 1
- Các đường A8, A9, A10 nối vào các chân điều khiển A, B,
C nên các phân vùng bộ nhớ được quy định bởi 8 đường địa chỉ (A0 A7) có dung lượng 28 = 256 byte (0000H
00FFH) Suy ra bảng địa chỉ:
Trang 39I Giao tiếp bộ nhớ ngoài
Trang 40I Giao tiếp bộ nhớ ngoài
Vi điều khiển 8031/8051 có khả năng truy xuất trực tiếp 64Kbyte bộ nhớ chương trình ngoài (0000H – FFFFH với /PSEN) và 64Kbyte bộ nhớ dữ liệu ngoài (0000H – FFFFH với /RD và /WR)
Trong hầu hết các ứng dụng, lượng bộ nhớ này là thích hợp Tuy
nhiên, trong một vài ứng dụng có thể cần không gian bộ nhớ lớn hơn Một phương pháp hiệu quả có thể dùng để tăng thêm không gian bộ
nhớ dữ liệu cho hệ thống được gọi là “chọn bank” (bank selection)
Phương pháp này tương tự như cách định địa chỉ không gian 64Kbyte
bộ nhớ ngoài nhưng thêm vào mạch logic bổ sung để mở rộng số thiết
bị nhớ có thể được chọn
Trang 41I Giao tiếp bộ nhớ ngoài
Trang 42I Giao tiếp bộ nhớ ngoài
Hình tren trình bày một sơ đồ mạch mở rộng không gian bộ nhớ
dữ liệu ngoài cho hệ thống Trong sơ đồ này, vùng địa chỉ 8000H – FFFFH được thiết kế dùng cách chọn bank để mở rộng vùng này từ 32Kbyte thành 160Kbyte với 5 SRAM 32Kbyte Để thực hiện chọn bank cho 5 thiết bị này, 5 ngõ ra port (P1.0 – P1.4) được dùng để chọn từng khối 32Kbyte Đường địa chỉ A15 kết hợp với từng chân chọn khối bằng các cổng NAND riêng biệt Bằng cách thiết lập một trong những chân chọn khối này ở mức logic cao và các chân còn lại ở mức logic thấp, một trong các thiết bị nhớ sẽ được kích hoạt khi 8051/8031 truy xuất bộ nhớ ngoài trong khoảng địa chỉ 8000H – FFFFH
Trang 43II Giao tiếp phím đơn và bàn phím
Trang 44II Giao tiếp phím đơn và bàn phím
Trang 45II Giao tiếp phím đơn và bàn phím
Hầu hết các thiết kế với VĐK đều có sử dụng các công tắc hoặc các nút nhấn để cho phép người sử dụng điều khiển các mạch bên trong Việc điều khiển có thể là bật công tắc để
khởi động một hoạt động nào đó, hay nhấn một nút nhấn để chọn một tùy chọn, hoặc nhập một số hay ký tự nào đó cho chương trình sử dụng Đối với các tác vụ đơn giản ta có thể
sử dụng các công tắc bật, trượt hoặc nút nhấn/nhả Với các tác vụ yêu cầu dữ liệu phức tạp hơn, ta có thể sử dụng một dãy các phím nhấn được kết nối theo dạng ma trận, với mỗi phím biểu diễn cho một số hay một ký tự nào đó.
Trang 461 Phím đơn (switch)
- Có thể có nhiều dạng và thường được kết nối với các cổng vào
- Việc đọc một phím đơn là tương đối đơn giản vì chỉ có một trong hai giá trị là 0 hay 1 Tuy nhiên, trong quá trình đọc trạng thái của phím cần phải lưu ý đến hiện tượng dội phím hay nảy phím (do kết cấu cơ khí của phím nhấn) và phải có biện pháp chống dội bằng phần cứng hoặc phần mềm
Trang 471 Phím đơn (switch)
+ Chống dội phím bằng phần cứng:
Trang 481 Phím đơn (switch)
+ Chống dội phím bằng phần mềm: do kết cấu cơ khí của
phím nhấn, nên khi nhấn phím hay bật công tắc thường xảy
ra hiện tượng dội phím hay rung phím với thời gian ở tầm
ms Để chống dội khi đọc trạng thái của phím nhấn, ta có thể tạo trễ một khoảng thời gian khoảng 10ms, sau đó ta lại đọc trạng thái của phím
Trang 491 Phím đơn (switch)
Trang 501 Phím đơn (switch)
Ví dụ 8: Viết chương trình nhận giá trị từ phím nhấn B1
(được nối với P1.0, mức 0 là phím nhấn, mức 1 là phím
không nhấn) Mỗi lần nhấn phím thì dịch trái LED đơn (dãy
8 LED đơn được nối với P2, mức 0 thì LED sáng, mức 1 thì LED tắt) Chương trình có chống rung phím bằng phần
mềm.
Trang 511 Phím đơn (switch)
Lưu đồ:
Trang 532 Bàn phím keypad
- Có nhiều loại bàn phím, tuy nhiên có thể phân làm hai loại chính Thứ nhất là loại bàn phím có các chân nối riêng cho mỗi phím nhấn và một chân chung cho tất cả các phím, đối với loại bàn phím này ta có thể kết nối như một dãy các
phím đơn riêng với mỗi phím có một điện trở kéo lên riêng (DIP switch) Loại thứ hai là bàn phím ma trận, với các
phím nhấn được bố trí theo các hàng và cột Khi một phím được nhấn thì chân hàng và cột tương ứng tại vị trí của phím được nối với nhau Khi phím không được nhấn thì chân
hàng và cột tương ứng với phím đó là hở mạch.
Trang 542 Bàn phím keypad
Ví dụ 9: Kết nối DIP switch với port 1
Trang 552 Bàn phím keypad
Ví dụ 10: Kết nối bàn phím ma trận 4x4 (bàn phím Hex) với port 1:
Trang 562 Bàn phím keypad
Trang 572 Bàn phím keypad
+ Để xác định phím nào được nhấn thì ta phải xác định phím được nhấn thuộc hàng và cột nào, hay ta xác định mã tương ứng của phím được nhấn Việc xác định mã phím nhấn có thể thực hiện bằng phần cứng hoặc phần mềm.
+ Xác định mã phím nhấn bằng phần cứng: ta sử dụng các loại IC mã hóa phím nhấn, chẳng hạn như 74C922.
Trang 582 Bàn phím keypad
+ Xác định mã phím nhấn bằng phần mềm:
• Các phím nhấn trên ma trận bàn phím được bố trí tại giao điểm giữa
hàng và cột, khi nhấn phím thì hàng và cột tương ứng sẽ được nối với nhau.
• Muốn xác định phím nhấn ta tiến hành quét bàn phím Ở đây ta thực
hiện quét từng hàng Trước tiên ta cho hàng 1 ở mức logic 0, các hàng và cột khác ở mức logic 1, sau đó ta đọc giá trị hàng và cột vào thông qua port 1.
• Nếu có 1 cột ở mức logic 0 tức là phím nhấn tương ứng với cột đó và
hàng đang quét đã được nhấn Từ vị trí của hàng và cột ta sẽ đổi ra mã phím quy ước.
• Nếu không có cột nào ở mức logic 0, ta tiến hành quét hàng kế tiếp và
thực hiện tương tự trên Việc quét hàng được thực hiện tối đa 4 lần tương ứng với 4 row.
• Chương trình con quét phím SCAN_KEY xác định phím nào được nhấn,
cờ F0 = 1 báo hiệu phím được nhấn, mã phím nhấn cất trong thanh ghi A
Trang 592 Bàn
phím
keypad
Trang 602 Bàn phím keypad
Mã 8051: (Chương trình sử dụng cờ đặt trạng thái có phím được nhấn là cờ F0) SCAN_KEY:
MOV R1,#0FEH MOV R6,#4
LOOP1:
MOV P1,R1 MOV A,P1 ANL A,#0F0H CJNE A,#0F0H,GET_CODE XCH A,R1
RL A XCH A,R1 DJNZ R6,LOOP1 CLR F0
Trang 61MOV R4,#4 LOOP2:
JNC SET_FLAG XCH A,R5
ADD A,#4 XCH A,R5 DJNZ R4,LOOP2 SET_FLAG:
MOV A,R5 EXIT:
RET
Trang 62III Giao tiếp bộ hiển thị
Trang 631 Giao tiếp với LED đơn
- Thông thường người ta lái LED theo kiểu hút dòng, nghĩa là dòng LED sáng có chiều đi từ ngoài vào cổng I/O
- Có thể tăng dòng bằng cách sử dụng thêm các bộ đệm nối với các chân port
Trang 642 Giao tiếp với LED 7 đoạn
-Led 7 đoạn là một khối hiển thị thường bao gồm 8 led đơn với 7 led
tương ứng với 7 đoạn từ a đến g và 1 led tương ứng với dấu chấm.
Trang 652 Giao tiếp với LED 7 đoạn
-Các led có một chân được nối chung với nhau, tùy theo chân nối
chung là anode hay cathode mà người ta phân ra làm 2 loại: anod chung (common anode) và cathode chung (common cathode).
Trang 662 Giao tiếp với LED 7 đoạn
Trang 672 Giao tiếp với LED 7 đoạn
b Giao tiếp với một led 7 đoạn
* Dùng IC giải mã
- Phương pháp này sử dụng một IC làm nhiệm vụ giải mã từ BCD
sang mã led 7 đoạn Một số loại IC giải mã thường dùng là: 7447 hay
74247 (đối với loại anode chung) hay 4511 (đối với loại cathode
chung).
- Để hiển thị một số lên led 7 đoạn, vi điều khiển phải cung cấp mã BCD đến ngõ vào của IC giải mã.
Trang 682 Giao tiếp với LED 7 đoạn
Ví dụ 5.11: Cho giao tiếp giữa 8051 và IC giải mã 27247
như hình 3 Viết chương trình đọc mã BCD nhập từ switch nối với port 2 và hiển thị số tương ứng lên led 7 đoạn.
Trang 692 Giao tiếp với LED 7 đoạn
Ví dụ 5.11: Cho giao tiếp giữa 8051 và IC giải mã 27247 như hình
Viết chương trình đọc mã BCD nhập từ dip-switch nối với port 2 và hiển thị số tương ứng lên led 7 đoạn.
Trang 702 Giao tiếp với LED 7 đoạn
ORG 0
LOOP:MOV A,P2
ANL A,#0FH MOV P1,A SJMP LOOP END
Trang 712 Giao tiếp với LED 7 đoạn
b Giao tiếp với một led 7 đoạn
•Giải mã bằng phần mềm
- Phương pháp này dùng lập trình bằng phần mềm để giải mã từ BCD sang mã led 7 đoạn thay thế cho IC giải mã.
Trang 722 Giao tiếp với LED 7 đoạn
Ví dụ 12: Cho giao tiếp giữa 8051 với led 7 đoạn như hình (qua IC
đệm 74373 để tăng khả năng cấp dòng cho led) Viết chương trình đọc
mã BCD nhập từ dip-switch nối với port 2 và hiển thị số tương ứng lên led 7 đoạn.
Trang 73Thành lập một bảng giá trị chứa các mã theo thứ tự mong muốn
Ví dụ: Lập bảng mã 7 đoạn của các số HEX từ 0 đến F (với LED Anode chung, để một đoạn LED nào sáng phải cung cấp mức logic thấp đến vị trí đoạn tương ứng).
Trang 742 Giao tiếp với LED 7 đoạn
Trang 752 Giao tiếp với LED 7 đoạn
Dùng dẫn hướng (directive) DB (Define Byte) của trình dịch hợp ngữ để khai báo bảng Bảng thường được đặt ở cuối chương
trình.
Dạng khai báo: Label: DB Codes
Ví dụ: TABLE: DB 0C0H,0F9H,0A4H,99H,…
Chú ý: Khi xuống một dòng mới phải thêm một định nghĩa DB.
Khi muốn lấy một giá trị trong bảng ta đưa con trỏ dữ liệu giữ giá trị đầu bảng và đưa số thứ tự của phần tử cần truy xuất trong bảng vào thanh ghi A, sau đó dùng lệnh tra bảng:
MOVC A,@A+DPTR ; lấy mã trong bảng vào thanh ghi A.