Giáo trình Vi điều khiển 8051 Assembly - Chương 4: Lập trình cho cổng vào - ra I/O

Mặc dù các thành viên của họ 8051 (ví dụ 8751, 89C51, DS5000) đều có các

kiểu đóng vỏ khác nhau, chẳng hạn như hai hàng chân DIP (Dual In-Line Pakage)

dạng vỏ dẹt vuông QFP (Quad Flat Pakage) và dạng chíp không có chân đỡ LLC

(Leadless Chip Carrier) thì chúng đều có 40 chân cho các chức năng khác nhau như

vào ra I/0, đọc RD , ghi WR , địa chỉ, dữ liệu và ngắt. Cần phải lưu ý rằng một số

hãng cung cấp một phiên bản 8051 có 20 chân với số cổng vào-ra ít hơn cho các ứng

dụng yêu cầu thấp hơn. Tuy nhiên, vì hầu hết các nhà phát triển chính sử dụng chíp

đóng vỏ 40 chân với hai hàng chân DIP nên ta chỉ tập chung mô tả phiên bản này.

 

pdf9 trang | Chuyên mục: Kiến Trúc Máy Tính | Chia sẻ: dkS00TYs | Lượt xem: 3688 | Lượt tải: 2download
Tóm tắt nội dung Giáo trình Vi điều khiển 8051 Assembly - Chương 4: Lập trình cho cổng vào - ra I/O, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
g các chân của cổng 0 vừa làm đầu ra, vừa làm đầu vào thì 
mỗi chân phải được nối tới một điện trở kéo bên ngoài 10kW. Điều này là do một 
thực tế là cổng P0 là một màng mở khác với các cổng P1, P2 và P3. Khái niệm máng 
mở được sử dụng trong các chíp MOS về chừng mực nào đó nó giống như Cô-lec-tơ 
hở đối với các chíp TTL. Trong bất kỳ hệ thống nào sử dụng 8751, 89C51 hoặc 
DS5000 ta thường nối cổng P0 tới các điện trở kéo, Xem hình 4.4 bằng cách này ta 
có được các ưu điểm của cổng P0 cho cả đầu ra và đầu vào. Với những điện trở kéo 
ngoài được nối khi tái lập cổng P0 được cấu hình như một cổng đầu ra. Ví dụ, đoạn 
mã sau đây sẽ liên tục gửi ra cổng P0 các giá trị 554 và AAH. 
 MOV A, #554 
 BACK: MOV P0, A 
 ACALL DELAY 
 CPL A 
 SJMP BACK 
Hình 4.4: Cổng P0 với các điện trở kéo. 
a) Cổng P0 đầu vào: Với các điện trở được nối tới cổng P0 nhằm để tạo nó thành 
cổng đầu vào thì nó phải được lập trình bằng cách ghi 1 tới tất cả các bit. 
Đoạn mã dưới đây sẽ cấu hình P0 lúc đầu là đầu vào bằng cách ghi 1 đến nó 
và sau đó dữ liệu nhận được từ nó được gửi đến P1. 
b) 
 MOV A,#FFH ; Gán A = FF dạng Hex 
 MOV P0, A ; Tạo cổng P0 làm cổng đầu vào bằng cách 
 ; Ghi tất cả các bit của nó. 
 BACK: MOV A, P0 ; Nhận dữ liệu từ P0 
 MOV P1, A ; Gửi nó đến cổng 1 
 SJMP BACK ; Lặp lại 
b) Vai trò kép của cổng P0: Như trình bày trên hình 4.1, cổng P0 được gán AD0 - 
AD7 cho phép nó được sử dụng vừa cho địa chỉ, vừa cho dữ liệu. Khi nối 8051/31 tới 
bộ nhớ ngoài thì cổng 0 cung cấp cả địa chỉ và dữ liệu 8051 dồn dữ liệu và địa chỉ 
qua cổng P0 để tiết kiệm số chân. ALE báo nếu P0 có địa chỉ hay dữ liệu khi ALE - 
0 nó cấp dữ liệu D0 - D7. Do vậy, ALE được sử dụng để tách địa chỉ và dữ liệu với 
sự trợ giúp của chốt 74LS373 mà ta sẽ biết cụ thể ở chương 14. 
10. Cổng P1. 
Cổng P1 cũng chiếm tất cả 8 chân (từ chân 1 đến chân 8) nó có thể được sử 
dụng như đầu vào hoặc đầu ra. So với cổng P0 thì cổng này không cần đến điện trở 
kéo vì nó đã có các điện trở kéo bên trong. Trong quá trình tái lạp thì cổng P1 được 
cấu hình như một cổng đầu ra. Ví dụ, đoạn mã sau sẽ gửi liên tục các giá trị 55 và 
AAH ra cổng P1. 
 MOV A, #55H 
 BACK: MOV P1, A 
Vcc 
10K 
P0.0 
P0.1 
P0.2 
P0.3 
P0.4 
P0.5 
P0.6 
P0.7 
DS5000 
8751 
8951 
Port 0 
 ACALL DELAY 
 SJMP BACK 
 Cổng P1 như đầu vào: Để biến cổng P1 thành đầu vào thì nó phải được lập 
trình bằng cách ghi một đến tất cả các bit của nó. Lý do về điều này được bàn ở mục 
lục Appendix C.2. Trong đoạn mã sau, cổng P1 lúc đầu đươc cấu hình như cổng đầu 
vào bằng cách ghi 1 vào các bit của nó và sau đó dữ liệu nhận được từ cổng này được 
cất vào R7, R6 và R5. 
 MOV A, #0FFH ; Nạp A = FF ở dạng hex 
 MOV P1, A ; Tạo cổng P1 thành cổng đầu vào bằng 
 ; cách ghi 1 vào các bit của nó. 
 MOV A, P1 ; Nhận dữ liệu từ P1 
 MOV R7, A ; Cất nó vào thanh ghi R7 
 ACALL DELAY ; Chờ 
 MOV A, P1 ; Nhận dữ liệu khác từ P1 
 MOV R6, A ; Cất nó vào thanh ghi R6 
 ACALL DELAY ; Chờ 
 MOV A, P1 ; Nhận dữ liệu khác từ cổng P1 
 MOV R5, A ; Cất nó vào thanh ghi R5 
11. Cổng P2: 
Cổng P2 cũng chiếm 8 chân (các chân từ 21 đến 28). Nó có thể được sử dụng 
như đầu vào hoặc đầu ra giống như cổng P1, cổng P2 cũng không cần điện trở kéo vì 
nó đã có các điện trở kéo bên trong. Khi tái lập, thì cổng P2 được cấu hình như một 
cổng đầu ra. Ví dụ, đoạn mã sau sẽ gửi liên tục ra cổng P2 các giá trị 55H và AAH. 
Đó là tất cả các bit của P2 lên xuống liên tục. 
 MOV A, #55H 
 BACK: MOV P2,A 
 ACALL DELAY 
 CPL A 
 SJMP BACK 
a) Cổng P2 như đầu vào. 
Để tạo cổng P2 như đầu vào thì nó phải được lập trình bằng cách ghi các số 1 
tới tất cả các chân của nó. Đoạn mã sau đây đầu tiên cấu hinh P2 là cổng vào bằng 
cách ghi một đến tất cả các chân của nó và sau đó dữ liệu nhận được từ P2 được gửi 
liên tục đến P1. 
 MOV A, 0FFH ; Gán A giá trị FF dạng Hex 
 MOV P2, A ; Tạo P2 là cổng đầu vào bằng cách 
 ; ghi một đến các chân của nó 
 BACK: MOV A, 2 ; Nhận dữ liệu từ P2 
 MOV P1, A ; Gửi nó đến P1 
 SJMP BACK ; Lặp lại 
b) Vai trò kép của P2. 
Trong các hệ thống dựa trên 8751, 89C51 và DS5000 thì P2 được dùng như 
đầu ra đơn giản. Tuy nhiên trong hệ thống dựa trên 80312 thì cổng P2 phải được 
dùng cùng với P0 để tạo ra địa chỉ 16 brt đối với bộ nhớ ngoài. Như chỉ ra trên hình 
4.1 cổng P2 cũng được chỉ định như là A8 - A15 báo chức năng kép của nó. Vì một 
bộ 8031 có khả năng trung cập 64k byte bộ nhớ ngoài, nó cần một đường địa chỉ 16 
bít. Trong khi P.0 cung cấp 8 bit thấp qua A0 - A7. Công việc của P2 là cung cấp 
các bít địa chỉ A8 - A15. Hay nói cách khác khi 8031được nối tới bộ nhớ ngoài thì 
P2 được dùng cho 8 bít của địa chỉ 16 bit và nó không thể dùng cho vào ra. Điều này 
sẽ được trình bày chi tiết ở chương 14. 
 Từ những trình bày trên đây ta có thể kết luận rằng trong các hệ thống dựa 
trên các bộ vi điều khiển 8751, 89C51 hoặc DS5000 thì ta có 3 cống P0, P1và P2 cho 
các thao tác vào ra và như thế là có thể đủ cho các ứng dụng với hầu hết các bộ vi 
điều khiển. Còn cấp P3 làđể dành cho ngắt và ta sẽ cùng bàn dưới đây. 
11 - Cổng P3: 
 Cổng P3 chiếm tổng cộng là 8 chân từ chân 10 đến chân 17. Nó có thể được 
sử dụng như đầu vào hoặc đầu ra. Cống P3 không cần các điện trở kéo cũng như P1 
và P2. Mặc dù cống P3 được cấu hình như một cống đầu ra khi tái lập, nhưng đây 
không phải là cách nó được ứng dụng phổ biến nhất. Cống P3 có chức năng bổ xung 
là cung cấp một số tín hiệu quan trọng đặc biệt chẳng hạn như các ngắt. Bảng 4.2 
cung cấp các chức năng khác của cống P3. Thông tin này áp dụng cho cả 8051 và 
8031. 
 Bảng 4.2: Các chức năng khác của cống P3 
Bít của cống P3 Chức năng chân số 
P3.0 
P3.1 
P3.2 
P3.3 
P3.4 
P3.5 
P3.6 
P3.7 
Nhận dữ liệu (RXD) 
Phát dữ liệu (TXD) 
Ngắt 0(INT0) 
Ngắt 1(INT1) 
Bộ định thời 0 (TO) 
1 Bộ định thời 1(T1) 
Ghi (WR) 
 Đọc (RD) 
10 
11 
12 
13 
14 
15 
16 
17 
Các bit P3.0 và P3.1 được dùng cho các tín hiệu nhận và phát dữ liệu trong 
truyền thông dữ liệu nối tiếp. Xem chương 10 đết biết các chúng được nối ghép như 
thế nào. Các bit P3.2 và P3.3 được dành cho các ngắt ngoài và chúng được trình bày 
chi tiết ở chương 11. Bit P3.4 và P3.5 được dùng cho các bộ định thêm 0 và 1và chi 
tiết được trình bày ở chương 9. Cuối cùng các bit P3.6 và P3.7 được cấp cho các tín 
hiệu ghi và đọc các bộ nhớ ngoài được nối tới các hệ thống dựa trên 8031. Chương 
14 sẽ trình bày cách chúng được sử dụng như thế nào trong các hệ thống dựa trên 
8031. Trong các hệ thống dựa trên 8751, 89C51 hoặc D35000 thì các chân P3.6 và 
P3.7 được dùng cho vào - ra còn các chân khác của P3 được sử dụng bình thường 
trong vai trò chức năng thay đổi. 
4.2 Lập trình vào - ra: thao tác bit. 
4.2.1 các cách khác nhau để truy cập toàn bộ 8 bit. 
Trong đoạn mà dưới đây cũng như trong nhiều ví dụ vào ra trước đây toàn bộ 
8 bit của cổng P1 được cập. 
BACK: MOV A, # 55H 
 MOV P1,A 
 ACALL DELAY 
 MOV A, #0AAH 
 MOV P1, A 
 ACALL DELAY 
 SJMP BACK 
Đoạn mà trên chốt mỗi bit của P1 một cách liên tục. Chúng ta đã thắng một 
biến thế của chương trình trên trước đó. Bây giờ ta có thể viết lại đoạn mã trên theo 
cách hiệu quả hơn bằng cách truy cập trực tiếp cổng mà không qua thanh ghi tổng 
như sau: 
 BACK: MOV P1, # 55H 
 ACALL DELAY 
 MOV P1, #00H 
 CALL DELAY 
 SJMP BACK 
Ta có thể viết một dạng khác của đoạn mà trên bằng kỹ thuật đọc - sửa đổi 
ghi như ở mục 4.2.2 dưới đây. 
4.2.2 Đặc điểm Đọc- sửa đổi - ghi (Read - Modify – Write). 
Các cống trong 8051 có thể được truy cập bằngkỹ thuật được gọi là Đọc-sửa 
đổi-ghi. Đặc điểm này tiết kiệm rất nhiều dòng lệnh bằng cách kết hợp tất cả 3 thao 
tác: 1đọc cống, 2 sửa đổi nóvà 3 ghi nó ra cống vào một lệnh đơn. Đoạn mà dưới đây 
trước hết đặt 01010101(nhị phân) vào cống 1. Sau đólệnh “XLR P1, #0FFH” thực 
hiện phép lô-gích OR loại trừ là XOR trên cống p1 với 1111 1111 ( nhị phân ) và sau 
đó ghi kết quả trở lại cống P1. 
 MOV P1, #55H ; P1 = 01010101 
AGAIN: XLR P1,# 0FFH ; EX - 0R P1 với 1111 1111 
 ACALL DELAY 
 SJMP AGAIN 
 Lưu ý rằng lệnh X0R của 55H và FFH sẽ cho kết quả là AAH. Tương tự như 
vậy lệnh X0R của AAH với FFH lại cho giá trị kết quả là 55H. Các lệnh lô-gích 
được trình bày ở chương 7. 
4.2.3. Khả năng đánh địa chỉ theo bít của các cống 
 Có nhiều lúc chúng ta cần truy cập chỉ 1 hoặc2 bít của cống thay vì truy cập 
cả 8 bit của cổng. Một điểm mạnh của các cổng 8051 là chúng có khả năng truy cập 
từng bít riêng rẽ mà không làm thay đổi các bít còn lại trong cổng đó ví dụ, đoạn mà 
dưới đây chốt bit P1.2 liên tục: 
BACK: CPL P1.2 ; Lấy bù 2 chỉ riêng bit P1.2 
 ACALL DELAY 
 SJMP BACK 
Một biến thể khác của đoạn mã trên là: 
AGACN: SETB P1.2 ; Chỉ thay đổi bít P1.2 lên cao 
 ACALL DELAY 
 CLR P1.2 ; Xoá bít P1.2 xuống thấp 
 ACALL DELAY 
 SJMP AGAIN 
 Lưu ý rằng bít P1.2 là bít thứ 3 của cổng P1, vì bít thứ nhất là P1.0 và bit thứ 
hai là P1.1 v.v... 
 Bảng 4.3 trình bày các bít của các cổng vào ra của 8051. Xem ví dụ 4.2 về 
thao tác bít của các bít vào - ra. Lưu ý rằng trong ví dụ 4.2 các bit không dùng đến 
là không bị ảnh hưởng. Đây là khả năng đánh địa chỉ theo bit của các cổng vào - ra 
và là một trong những điểm mạnh nhất của bộ vi điều khiển 8051. 
Ví dụ 4.2: hãy viết chương trình thực hiện các công việc sau: 
a) Duy trì hiển thị bit P1.2 cho đến khi nó lên cáp 
b) Khi P1.2 lên cao, hãy ghi giá trị 45H vào cổng P0 
c) Gửi một xung cao xuống thấp (H-to-L) tới P2.3 
Lời giải: 
 SET P1.2 ; Tạo bit P1.2 là đầu vào 
 MOV A, #45H ; Gán A = 45H 
 AGAIN: JNB P1.2, AGAIN ; Thoát khi P1.2 = 1 
 MOV P0, A ; Xuất A tới cổng P0 
 SETB P2.3 ; Đưa P2.3 lên cao 
 CLR P2.3 ; Tạo P2.3 xuống thấp để có xung H-T0-L 
Trong chương trình này lệnh “JNB P1.2, AGCN” (JNB có nghĩa là nhảy nếu 
không bit) ở lại vòng lặp cho đến khi P1.2 chưa lên cao. Khi P1.2 lên cao nó thoát ra 
khỏi vòng lặp ghi giá trị 45H tới cổng P0 và tạo ra xung H-to-L bằng chuỗi các lệnh 
SETB và CLR. 

File đính kèm:

  • pdfVi_dieu_khien_8051_ Assembly_04_LaptrinhCongVaoRa.pdf