Là loại máy tính được thiết kế để giải các bài toán lớn với tốc độ rất nhanh -Nó làm việc với số liệu có độ dài từ 64 bit hoặc hơn và được trang bị bộ nhớ rất lớn, vì vậy kích thước lớn. -Chúng thường được dùng để điều khiển các hệ thống thiết bị dùng trong quân sự hoặc các hệ thống máy móc của chương trình nghiên cứu vũ trụ, để xử lý thông tin trong ngành ngân hàng, vv… Ví dụ : IBM 4381, Honeywell DSP8 Loại mạnh nhất trong các máy tính lớn gọi là siêu máy tính (supercomputer). Ví dụ : Y-MP/832 của Gray.
Trang 1CHƯƠNG 5: GIAO TIẾP
I 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
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
* Quy tắc chung về thiết kế mạch giao tiếp bộ nhớ với MCS-51
1 Lập bảng bộ nhớ
- Lập bảng bộ nhớ cho hệ thống và các ứng dụng phụ thuộc
- Đối với MCS-51, nên tách riêng 64K bộ nhớ chương trình và 64K bộ nhớ dữ liệu
- Để sử dụng những địa chỉ trên 64K thì sử dụng thêm các bit từ những cổng I/O không sử dụng để làm các đường địa chỉ cao
2 Chọn linh kiện bộ nhớ thích hợp
3 Sử dụng mạch giải mã địa chỉ (nếu cần) để tạo các tín hiệu chọn chip cho bộ nhớ
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
A11 A9
D3
A8
A6 A9
A1
D0
A1 A3 D6
2 5 6 9 12 15 16 19
D0 D1 D2 D3 D4 D5 D6 D7 OC G
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
A2 A15
D3
D1
A8
A6 C2 30p
A9 A8 8031
31 19 18 9 12 13 14 15 1 2 3 4 5 6 7 8
39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 17 16 29 30 11 10
EA/VP X1 X2 RESET
INT0 INT1 T0 T1 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 RD WR PSEN ALE/P TXD RXD
D6
A10 A4
A3
C1 30p
A5 D0
2764
10 9 8 7 6 5 4 3 25 24 21 23 2 20 22 27 1
11 12 13 15 16 17 18 19
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 CE OE PGM VPP
O0 O1 O2 O3 O4 O5 O6 O7
D5 A1
D7
/RD /RD
Data bus[D0 D7]
A10
Vcc
/WR A14
A11
D7 D5
Vcc D2
PSEN D3
6264
10 9 8 7 6 5 4 3 25 24 21 23 2
11 12 13 15 16 17 18 19
22 27 20 26
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12
D0 D1 D2 D3 D4 D5 D6 D7
OE WE CS1 CS2
D7
Hình 5.1
Trang 2Ví dụ 5.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)
Giả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 hình 5.1
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
62256 (32K)
10 9 7 6 4 3 25 24 21 2 26 1
20
22 27
11 12 15 16 18 19
A0 A2 A3 A5 A6 A7 A9 A10 A12 A13 (CS2) A14 (NC)
CS
OE WE
D0 D2 D3 D5 D6 D7
6264 (8K)
A2 A1
A7
R2
100
D5 D0
A12
A0
A11
R4 10K
R5 10K
2 6 9 12 15 16 19
D0 D2 D3 D5 D6
OC G
Q0 Q2 Q3 Q5 Q6
PSEN
A8
NA
R3 10K
None
A10
/WR
D6 D7
20
27 1
11 13 15 17 18 19
A0 A2 A3 A5 A6 A8 A9 A10 A11 A12 A13 (NC)
CE OE/VPP
A14 (PGM) A15 (Vpp)
O0 O2 O3 O5 O6
18
9
12 13 14
1 2 4 5 7 8
39 37 36 34 33 32 21 22 24 25 27 28 17 16 29 11 10
EA/VP X1
X2
RESET
INT0 INT1 T0
P1.0 P1.2 P1.3 P1.5 P1.6
P0.0 P0.2 P0.3 P0.5 P0.6
P2.0 P2.2 P2.3 P2.4 P2.6 P2.7 RD WR PSEN ALE/P TXD RXD
D7
A14
2764 (8K)
NA 64K
* Giải mã địa chỉ
- Trong trường hợp cần phải giao tiếp nhiều ROM và/hoặc nhiều RAM, do các chip cùng nối vào bus dữ liệu của vi điều khiển nên cần có mạch giải mã để đảm bảo tại mỗi thời điểm chỉ có một chip được chọn nối với bus dữ liệu, các chip 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 5.3
Trang 3Hình 5.3
Ví dụ 5.2: Thiết kế kit 8031 với 2 ROM 2764
Giải:
Cách 1: dùng bộ giải mã 3 → 8
- ROM 2764 có dung lượng 8KB, tương ứng với 13 đường địa chỉ
- Chọn phân vùng 8KB = 213 byte → đưa 13 đường địa chỉ thấp A0 ÷ A12 đến các đường địa chỉ tương ứng của 2 ROM 2764 3 đường địa chỉ còn lại là A13, A14, A15 được đưa đến bộ giải mã 3 → 8
A10 A2
8031
31 19 18 9 12 13 14 15 1 2 3 4 5 6 7 8
39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 17 16 29 30 11 10
EA/VP X1 X2 RESET
INT0 INT1 T0 T1 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 RD WR PSEN ALE/P TXD RXD
A14
74HC138
15 14 13 12 11 10 9 7
1 2 3
5 4 6
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
A B C
G2B G2A G1
D4 D6
11 12 13 15 16 17 18 19
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 CE OE PGM VPP
O0 O1 O2 O3 O4 O5 O6 O7
A9
D7 D7
A12
A3 A0
Addr bus[A0 A15]
D2
A6
A8 D7
D6
A0
D0
D0 D2
11 12 13 15 16 17 18 19
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 CE OE PGM VPP
O0 O1 O2 O3 O4 O5 O6 O7
3 4 7 8 13 14 17 18 1 11
2 5 6 9 12 15 16 19
D0 D1 D2 D3 D4 D5 D6 D7 OC G
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
A11
D0 Data bus[D0 D7]
A3 A4
D4 D5
A7
A5 D5
A9
A7 Vcc
A8
Hình 5.4
Mạch giải mã địa chỉ
Bus dữ liệu Bus địa chỉ
A0-A12
D0-D7 A0-A12
2764 EPROM (8KB) CS
A0-A12
6264 RAM (8KB) WR
CS OE
A14
74LS138
A B C
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
G1 G2A G2B
CS
A15 VCC
/WR /RD /PSEN
Chọn các EPROM/RAM khác
Trang 4- 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 (CS) của 2 ROM Ở đây, có thể chọn Y0 (0000H ÷ 1FFFH) và Y1 (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 động
- Sơ đồ mạch kết nối (giả sử các ROM dùng chứa chương trình) như ở hình 5.4
- Nếu dùng ROM chứa dữ liệu thì chân /OE của ROM được nối với tín hiệu /RD 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:
Hình 5.5
A15 = 0: chọn ROM1 (CSROM1: 0000H ÷ 7FFFH) A15 = 1: chọn ROM2 (CSROM2: 8000H ÷ FFFFH) 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:
Chip Vùng ROM 1 (A15 = 0) ROM 2 (A15 = 1)
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
Ví dụ 5.3: Thiết kế kit 8051 với 2 RAM 6264 (chứa dữ liệu)
Giả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ụ 5.2
- Sơ đồ mạch kết nối như hình 5.6
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 CSRAM1 → A15 = 0 thì chọn RAM1, A14 nối với CSRAM2→ 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
- Bảng địa chỉ bộ nhớ:
Trang 5Nhậ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
A4
A9
A1 Vcc
A5 A6
/WR
/RD A15
A14
A9 D2
Vcc
D3
6264
10 9 8 7 6 5 4 3 25 24 21 23 2
11 12 13 15 16 17 18 19
22 27 20 26
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12
D0 D1 D2 D3 D4 D5 D6 D7
OE WE CS1 CS2
A13 D4
/RD
A8 C2 30p
A6 A11
A2
D3 D5
A10
/CS1
D6
D0 D0
D5
A7 A3
D4
74HC138
15 14 13 12 11 10 9 7
1 2 3
5 4 6
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
A B C
G2B G2A G1
D0 6264
10 9 8 7 6 5 4 3 25 24 21 23 2
11 12 13 15 16 17 18 19
22 27 20 26
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12
D0 D1 D2 D3 D4 D5 D6 D7
OE WE CS1 CS2
D1 D4 A4
D7
A7
8051
31 19 18 9 12 13 14 15 1 2 3 4 5 6 7 8
39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 17 16 29 30 11 10
EA/VP X1 X2 RESET INT0 INT1 T0 T1 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 RD WR PSEN ALE/P TXD RXD
74LS373
3 4 7 8 13 14 17 18 1 11
2 5 6 9 12 15 16 19
D0 D1 D2 D3 D4 D5 D6 D7 OC G
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
ROM 2732 có dung lượng 4KB = 212 byte → có 12 đường địa chỉ vào từ A0 ÷ A11
Cách 1: Chọn phân vùng 8KB
- Đưa các đường địa chỉ A0 ÷ A12 đến ROM 2764 và các đường địa chỉ A0 ÷ A11 đến mỗi ROM 2732 3 đường địa chỉ cao A13, A14, 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:
VCC
/CS2
74HC138
15 14 13 12 11 10 9 7
1 2 3
5 4 6
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
A B C
G2B G2A G1
- Như vậy mỗi chip ROM 2732 sẽ có 2 vùng địa chỉ 4KB tương ứng
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
Trang 6- 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ư sau:
23 22 21 20 18 19
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 Y10 Y11 Y12 Y13 Y14 Y15
A B C D G1 G2
7408 1
A15
Hình 5.8
- Các chân Y4 ÷ Y15 được dự trữ
- Bảng phân vùng địa chỉ:
Chip Vùng địa chỉ Chân chọn chip
A9
A12
A13 D3
6264
10 9 8 7 6 5 4 3 25 24 21 23 2
11 12 13 15 16 17 18 19
22 27 20 26
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12
D0 D1 D2 D3 D4 D5 D6 D7
OE WE CS1 CS2 74HC138
15 14 13 12 11 10 9 7
+
C3
10u
D1 Addr bus[A0 A15]
A1
D0 A13
A7 A3
D6
/WR A5
Vcc
2764
10 9 8 7 6 5 4 3 25 24 21 23 2 20 22 27 1
11 12 13 15 16 17 18 19
A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 CE OE PGM VPP
O0 O1 O2 O3 O4 O5 O6 O7
2 5 6 9 12 15 16 19
D0 D1 D2 D3 D4 D5 D6 D7 OC G
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
/CS0
A10
A10 VCC
A0 A3
31 19 18 9 12 13 14 15 1 2 3 4 5 6 7 8
39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 17 16 29 30 11 10
EA/VP X1 X2 RESET
INT0 INT1 T0 T1 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7
P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7 RD WR PSEN ALE/P TXD RXD
A8 A14
C1 30p
D6
/CS1
D7 D2
/RD D5
D1
74LS373
3 4 7 8 13 14 17 18 1 11
2 5 6 9 12 15 16 19
D0 D1 D2 D3 D4 D5 D6 D7 OC G
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
/WR
A5
Hình 5.9
Trang 7Giả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à RD và WR 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 5.9
- Bảng phân vùng địa chỉ:
Chip Vùng địa chỉ
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)
- Mỗi chip được chọn tương ứng với 1 tổ hợp của A11 và A10
→ mạch giải mã địa chỉ có thể thực hiện như sau:
A10
/CS3 /CS3 A12
A13
74HC138
15 14 13 12 11 10 9 7
1 2 3
5 4 6
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
A B C
G2B G2A G1
/CS0
A14 A15
Hình 5.10
Trang 8Ví dụ 5.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
/CS6 A11
/CS4 /CS3
A15
A8
/CS5 A13
/CS2
74LS138
1 2 3
15 14 13 12 11 10 9 7
6 4 5
A B C
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
G1 G2A G2B
Hình 5.11
Giả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ỉ:
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
Hình 5.12
Trang 9Hình 5.12 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
II 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 đó
1 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
1: nhả 0: nhấn
VCC +5V
SW
port pin 10K
SW
1: mở 0: đóng
VCC +5V
port pin 10K
1: mở 0: đóng
SW
Có điện trở kéo lên bên trong
port pin
port pin VCC +5V
1: đóng 0: mở
+ Chống dội phím bằng phần cứng:
SW
74HC14
470K R2 VCC +5V
4.7KR1
C1 0.1uF
Hình 5.14
Trang 10+ 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
Ví dụ 5.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
Lưu đồ:
Chương trình:
ORG 0 MOV A,#0FEH
N Y
BEGIN
Phím nhấn?
Nạp giá trị đầu cho thanh ghi A Xuất (A) ra Port 2
Xoay trái (A)
DELAY10 ms Phím nhả?
DELAY10 ms
Trang 112 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
Ví dụ 5.9: Kết nối DIP switch với port 1
+ 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
+ Xác định mã phím nhấn bằng phần mềm:
C1 C2 C3 C4
H1 H2 H3 H4
4 5 6 7
C
D
E
F P1.4
P1.5 P1.6 P1.7
P1.0 P1.1 P1.2 P1.3
Trang 12 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 hàng
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
Nạp (đếm hàng) = 4
Xuất (mã quét hàng)
ra port 1
Đọc giá trị hàng và cột ở port 1 vào A
Xoá các bit hàng [4 bit thấp]
Giữ lại các bit cột [4 bit cao]
Quay trái (mã quét hàng)
[quét hàng kế]
Giảm (đếm hàng)
Giảm (đếm cột)
Trang 13Mã 8051: (Chương trình sử dụng cờ đặt trạng thái có phím được nhấn là cờ F0)
RET
III GIAO TIẾP BỘ HIỂN THỊ
1 Giao tiếp với LED đơn
VCC +5V
port pin
470
VCC +5V
port pin
port pin
a) Tốt b) Kém c) Kém
Hình 5.17
Trang 14- 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
2 Giao tiếp LED 7 đoạn
a Giới thiệu về 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 dp
Hình 5.18 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)
(common cathode) ck
f g
a
c
f
b d
(common anode) ca
a
g
d c
b
dp
e
dp e
Hình 5.19 Led 7 đoạn loại anode chung và cathode chung
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ã
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ừ dip-switch nối với port 2 và hiển thị số tương ứng lên led 7 đoạn
f g a
Trang 15SJMP LOOP END
Hình 5.20 8051 giao tiếp với IC 74247
* 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ã
Ví dụ 5.12: Cho giao tiếp giữa 8051 với led 7 đoạn như hình 4 (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
Hình 5.21: 8051 giao tiếp với led 7 đoạn qua IC đệm 74373
Giải:
Hướng dẫn:
Để LED 7 đoạn hiển thị đúng giá trị mong muốn, cần phải đưa dữ liệu đến led theo mã LED 7 đoạn (tương ứng với các đoạn cần sáng) Do đó, ta phải chuyển đổi dữ liệu cần xuất (thường là số HEX hay BCD) sang mã LED 7 đoạn, thông thường dùng phương pháp tra bảng
Tóm tắt phương pháp tra bảng:
Thà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)
P1.0 P1.3 P1.4 P1.5 P1.6
P1.1 P1.2
P1.7
8051
P2.0 P2.3 P2.4 P2.5 P2.6
P2.1 P2.2
4 5
3
13 12 11 10 9 15 14
D0 D1 D2 D3
BI/RBO RBI
LT
A B C D E F G
a b
e f d c
11
2 5 6 9 12 15 16 19
3 4 7 8 13 14 17 18
OE LE
Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
D1 D2 D3 D4 D5 D6 D7 D8
b d
+5V
c e a
g 330x7
P1.0 P1.3 P1.4 P1.5 P1.6
P1.1 P1.2
P1.7
8051
P2.0 P2.3 P2.4 P2.5 P2.6
P2.1 P2.2
Trang 16Hình 5.22 Bảng mã led 7 đoạn của các số hex từ 0 đến F
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
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
Ví dụ 5.13: Để lấy phần tử thứ 2 trong bảng ta thực hiện như sau:
MOV DPTR,#TABLE MOV A,#2
MOVC A,@A+DPTR Chương trình:
ORG 0 LOOP:
Trang 17c Giao tiếp với nhiều led 7 đoạn
Có 2 phương pháp được dùng khi giao tiếp vi điều khiển 8051 với nhiều led 7 đoạn: phương pháp chốt và phương pháp quét
* Hiển thị led bằng phương pháp chốt
- Dùng các IC chốt để chốt dữ liệu đưa ra led, mỗi led có một IC chốt riêng
- Dữ liệu từ 8051 sẽ được đưa đồng thời đến ngõ vào của tất cả các IC chốt Muốn dữ liệu đưa qua IC chốt nào ta đưa chân cho phép chốt (LE) của IC tương ứng lên mức cao, các IC còn lại có ngõ vào LE là mức logic thấp sẽ chốt dữ liệu (giữ nguyên giá trị trước đó ở ngõ ra)
Ví dụ 5.14: Cho mạch giao tiếp giữa 8051 và 4 led 7 đoạn theo phương pháp chốt như hình
5.23 Viết chương trình con hiển thị 4 số BCD không nén (unpacked BCD) có mã lưu trong 4
ô nhớ 33H, 32H, 31H và 30H lên 4 led tương ứng (led1, led2, led3 và led4)
Hình 5.23 Giao tiếp giữa 8051 và 4 led 7 đoạn theo phương pháp chốt
Giải:
Chương trình:
OUTLED:
CLR P3.0 CLR P3.1
Trang 18CLR P3.2 CLR P3.3 MOV A,30H MOV DPTR,#TABLE_LED7 MOVC A,@A+DPTR
MOV P1,A SETB P3.0 MOV A,31H MOV DPTR,#TABLE_LED7 MOVC A,@A+DPTR
CLR P3.0 MOV P1,A SETB P3.1 MOV A,32H MOV DPTR,#TABLE_LED7 MOVC A,@A+DPTR
CLR P3.1 MOV P1,A SETB P3.2 MOV A,33H MOV DPTR,#TABLE_LED7 MOVC A,@A+DPTR
CLR P3.2 MOV P1,A SETB P3.3 RET
… TABLE_LED7:
DB 92H,82H,0F8H,80H,90H
* Hiển thị led bằng phương pháp quét
- Mắt người sẽ không phân biệt được sự hiện hữu và mất đi của một ảnh nếu tần suất xuất hiện của ảnh là 24 lần/s hay thời gian lặp lại của ảnh là 1/24 ≈ 40 ms, hiển thị led theo phương pháp quét sử dụng nguyên lý này
- Hiển thị led bằng phương pháp quét là phương pháp hiển thị mà tạo mỗi thời điểm dữ liệu được truyền đến tất cả các led nhưng chỉ có một led được cho phép hiển thị dữ liệu đó (đóng chuyển mạch tương ứng với led được chọn, hở chuyển mạch của các led khác)
- Vì tại mỗi thời điểm chỉ có một led hoạt động nên thời gian lặp lại dữ liệu trên led đó phải được tính toán cho phù hợp để đảm bảo hình ảnh của led hiển thị là liên tục đối với mắt người, không quá mờ hay nhấp nháy
Ví dụ 5.15: Cho mạch giao tiếp giữa 8051 và 4 led 7 đoạn theo phương pháp quét như hình
5.24 Viết chương trình con hiển thị 4 số BCD không nén (unpacked BCD) có mã lưu trong 4
ô nhớ 33H, 32H, 31H và 30H lên 4 led tương ứng (led1, led2, led3 và led4)
Giải:
Hướng dẫn: Để đóng chuyển mạch cho led, cấp mức logic 0 ở phía cực B của
transistor tương ứng (đóng vai trò như một chuyển mạch điện tử) Sau đó phải tạo trễ một khoảng thời gian để led đáp ứng sáng
Trang 19
Hình 5.24 Giao tiếp giữa 8051 và 4 led 7 đoạn theo phương pháp quét