MỤC LỤC
Bài mở đầu – NỘI QUY – MỘT SỐ KIẾN THỨC CƠ BẢN 1
Bài 1 – MÔ PHỎNG HỌ VI XỬ LÝ 89C51 TRÊN MÁY TÍNH 12
Bài 2 – GIAO TIẾP NGOẠI VI VỚI LED 7 ĐOẠN 21
Bài 3 – GIAO TIẾP NGOẠI VI VỚI MA TRẬN PHÍM 28
Bài 4 – GIAO TIẾP NGOẠI VI VỚI MA TRẬN LED 32
Bài 5 – ĐIỀU KHIỂN QUÁ TRÌNH TUẦN TỰ 41
Bài 6 – PHÂN LOẠI VÀ ĐẾM SẢN PHẨM 45
Bài 7 – ĐIỀU KHIỂN ĐÈN GIAO THÔNG 50
Bài 8 – ĐIỀU KHIỂN THANG MÁY 54
59 trang |
Chia sẻ: trungkhoi17 | Lượt xem: 448 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Giáo trình Hướng dẫn thí nghiệm vi xử lý và PLC - Nguyễn Ngọc Tùng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
hiển
- Trước khi sử dụng 8255 thì phải xác lập chế độ hoạt động cho nó thông qua việc xác lập giá trị của thanh ghi điều khiển. Thanh ghi điều khiển gồm 8 bit:
D7
D6
D5
D4
D3
D2
D1
D0
1
Mode nhóm A:
- 00: mode 0
- 01: mode 1
- 1X: mode 2
0: PA out
1: PA in
0: PCH out
1: PCH in
Mode nhóm B:
- 0: mode 0
- 1: mode 1
0: PB out
1: PB in
0: PCL out
1: PCL in
Trong đó: Nhóm A gồm PA và PCH (PC4÷PC7)
Nhóm B gồm PB và PCL (PC0÷PC3)
Đối với mục đích mở rộng port xuất nhập thông thường thì mode 0 (mode xuất/nhập cơ bản) thường được sử dụng.
2. Phần thí nghiệm PLC (sẽ được trình bày trên lớp học)
Bài 1
MÔ PHỎNG HỌ VI XỬ LÝ 8051
TRÊN MÁY VI TÍNH
I. Kiến thức cơ bản
1. Phần mềm Simulator 2003
Thông thường, sau khi viết xong một chương trình bằng Assembler cho vi xử lý, trước khi nạp chương trình vào ROM/RAM để thực thi trên thực tế thì chương trình đó cần phải được kiểm tra, đánh giá tính đúng đắn, độ tin cậy thông qua hình thức mô phỏng trên máy vi tính. Một trong những phần mềm mô phỏng vi xử lý thông dụng phải kể đến Simulator 2003.
Simulator 2003 là phần mềm chuyên dùng để mô phỏng cho các họ vi xử lý 8031/8032/87C51/87C52/89C51/89C52/8051/8052. Simulator 2003 có cách sử dụng rất dễ dàng và thân thiện. Một số đặc tính nổi bật của Simulator 2003 như sau:
Cho phép giám sát động và thiết lập động nội dung bất kỳ một vùng nhớ nào ở RAM trong, RAM ngoài và các thanh ghi chức năng đặc biệt dưới dạng số hex, nhị phân và thập phân.
Cho phép giả lập đầy đủ các ngắt.
Dễ dàng dò lỗi chương trình thông qua các chức năng như mô phỏng theo từng bước, theo từng khối, theo thời gian
Tốc độ mô phỏng có thể điều chỉnh được.
Cho phép biên dịch ngược từ mã hex hoặc bin (mã máy) sang mã Assembler.
Giao diện chương trình Simulator 2003
2. Phần mềm Crimson Editor
Trước khi mô phỏng, chương trình vi xử lý phải được lập trình thông qua phần mềm Crimson Editor. Đây là phần mềm tạo các file văn bản hỗ trợ rất nhiều các ngôn ngữ lập trình khác nhau như Assembler, Pascal, C, C++, Visual Basic, MatLAB, Khi viết chương trình Assembler với Crimson Editor, tập tin chương trình phải được lưu dưới dạng ‘*.a51’. Đây là một tập tin văn bản thuần túy, để có thể sử dụng chương trình này với Simulator 2003, tập tin này phải được biên dịch sang tập tin ngôn ngữ máy ‘*.bin’ thông qua chức năng biên dịch kèm theo của Crimson Editor.
Giao diện chương trình Crimson Editor
II. Thí nghiệm
1. Mô phỏng với các lệnh chuyển dữ liệu
a. Sử dụng Crimson Editor
Vào File ® New để tạo tập tin mới.
Vào File ® Save As để lưu tập tin mới dưới tên Bai11ab.a51 ở Desktop.
Nhập nội dung sau vào cửa sổ soạn thảo của Bai11ab.a51:
ORG 0000H
MOV 20H, P0 ; (1)
MOV R1, #21H ; (2)
DEC 01H ; (3)
MOV A, @R1 ; (4)
CPL A ; (5)
ANL A, #0FH ; (6)
MOV 21H, @R1 ; (7)
ADD A, 21H ; (8)
MOV B, #2 ; (9)
DIV AB ; (10)
MOV P1, A ; (11)
SJMP $ ; (12)
END
Vào Tools ® Translate A51 to BIN để biên dịch chương trình trên sang dạng tập tin ngôn ngữ máy Bai11ab.bin (ở Desktop). Quan sát kết quả biên dịch ở cửa sổ Output (bên dưới cửa sổ soạn thảo), nếu nhìn thấy dòng “ASSEMBLY COMPLETE, NO ERRORS FOUND” chứng tỏ việc biên dịch đã thành công.
b. Sử dụng Simulator 2003
(Nếu đang tồn tại một tập tin đang mở thì vào File ® Close File để đóng tập tin).
Vào File ® Open File và chọn mở tập tin Bai11ab.bin ở Desktop.
Vào Micsellaneous ® General Write, trong danh sách Type chọn SFR Registers, trong danh sách Name/Address chọn P0 (hoặc cũng có thể double click vào giá trị P0 trên cửa sổ SFRs window), nhập giá trị 99 vào ô Decimal để thiết lập giá trị 99 thập phân cho P0.
Vào Execution ® Start/Stop Execution (hoặc nhấn nút lệnh lệnh Start Execution ) để bắt đầu mô phỏng chương trình.
[1] Vào Miscellaneous ® General Read (hoặc double click vào giá trị P1 trên cửa số SFRs window), cho biết giá trị xuất ra ở P1 (dưới dạng thập phân) là bao nhiêu?
Vào Execution ® Start/Stop Execution để dừng mô phỏng. Vào Execution ® Reset Execution (hoặc nhấn nút lệnh ) để reset vi xử lý.
Thiết lập lại giá trị 99 thập phân cho P0.
Vào Debugging ® Single Step (hoặc nhấn F2) để thực thi chương trình theo từng dòng lệnh một. Quan sát cửa sổ Execution Status để biết dòng lệnh kế tiếp sẽ được thực thi.
Trên cửa sổ Active Watch, click nút lệnh Add items để mở cửa sổ Add to Active Watch, chọn và click nút Add để bổ sung các vùng nhớ sau vào cửa sổ Active Watch: P0, P1, ACC, B (SFR Registers) - 20H, 21H, R1(Internal RAM)
[2] Điền giá trị (thập phân) các vùng nhớ sau khi từng dòng lệnh một được thực hiện xong vào bảng sau:
Lệnh
PC (Hex)
P0
P1
20H
21H
ACC
B
R1
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
[3] Nếu không có dòng lệnh (12) thì kết quả chương trình trên có khác đi không?
[4] Dòng lệnh (9) gán giá trị 2 thập phân cho thanh ghi B. Cuối chương trình (dòng lệnh (12)), giá trị thanh ghi B có thay đổi không? Tại sao?
c. Ứng dụng
[5] Sử dụng Crimson Editor soạn thảo chương trình Bai11c.a51 ở Desktop với nội dung sau: nhập liên tục giá trị từ P1, kiểm tra xem nếu giá trị này lớn hơn 127 thì chia đôi và xuất kết quả (phần nguyên) ra P2. Trong trường hợp ngược lại thì nhân đôi giá trị này và cũng xuất kết quả ra P2.
Biên dịch chương trình trên sang mã máy và mô phỏng với Simulator 2003.
2. Mô phỏng với Timer
a. Thí nghiệm
Sử dụng Crimson Editor soạn thảo chương trình sau với tên Bai12a.a51 ở Desktop:
ORG 0000H
MOV TMOD , #01H ; (1)
MOV A, #10000000B ; (2)
LOOP: RL A ; (3)
MOV P1, A ; (4)
MOV R1, P0 ; (5)
ACALL DELAY ; (6)
SJMP LOOP ; (7)
DELAY: MOV TH0, #HIGH(-1000) ; (8)
MOV TL0, #LOW(-1000) ; (9)
SETB TR0 ; (10)
JNB TF0, $ ; (11)
CLR TR0 ; (12)
CLR TF0 ; (13)
DJNZ R1, DELAY ; (14)
RET ; (15)
END
Biên dịch chương trình trên sang mã máy. Mở file bai12a.bin với Simulator 2003.
Vào Options ® Simulation Settings. Trong cửa sổ Simulator2003 Settings, chọn Tab Simulation. Thay đổi giá trị Batch Instructions Count thành 100, trong danh sách Refresh Type chọn Refresh after each tick để tăng tốc độ mô phỏng và hiển thị.
Chạy mô phỏng chương trình.
[1] Thay đổi giá trị đặt cho P0 (chẳng hạn như 10, 50, 100, 200) và quan sát kết quả ở P1, từ đó giải thích ngắn gọn mục đích của chương trình trên.
[2] Giải thích dòng lệnh (1).
[3] Với thạch anh 12Mhz, dòng lệnh (11) sẽ được thực thi trong khoảng thời gian bao nhiêu? Từ đó, một cách gần chính xác, suy ra dòng lệnh (6) sẽ được thực thi trong bao nhiêu lâu nếu P0 nhận giá trị là 20.
Dừng mô phỏng và reset chương trình. Thiết lập giá trị 20 cho P0.
Vào Disassembly ® Disassemble Code. Trong cửa sổ Disassembly Window, click vào cột Brk (cột đầu tiên) 2 hàng lệnh ACALL 0000EH (lệnh (6)) và SJMP 00005H (lệnh (7)) để thiết lập vị trí Break Point cho 2 hàng lệnh này. Khi mô phỏng với lệnh Start Execution , chương trình mô phỏng sẽ tạm dừng ở đầu dòng lệnh (6) cho đến khi nhận được lệnh Start Execution một lần nữa. Sau khi thực hiện xong lệnh (6), chương trình tiếp tục tạm dừng ở đầu dòng lệnh (7).
[4] Quan sát cửa sổ Execution Status để biết được thời điểm tạm dừng ở 2 đầu dòng lệnh này, từ đó cho biết chính xác dòng lệnh (6) đã được thực thi trong khoảng thời gian bao nhiêu lâu.
[5] Giá trị thực tế này và giá trị ước lượng ở [2] có khác nhau không? Độ chênh lệch đó là bao nhiêu và tại sao lại có sự chênh lệch đó.
b. Ứng dụng
[6] Viết chương trình Bai12b.a51 ở Desktop thực hiện nhiệm vụ sau: liên tục kiểm tra chân P1.7, nếu P1.7 = 1 thì xuất ra ở P1.0 xung vuông có tần số 2Hz; nếu P1.7 = 0 thì thiết lập mức 0 cho P1.0
Biên dịch chương trình trên sang mã máy và mô phỏng với Simulator 2003.
3. Mô phỏng với ngắt
a. Thí nghiệm
Sử dụng Crimson Editor soạn thảo chương trình sau với tên Bai13a.a51 ở Desktop:
ORG 0000H
LJMP MAIN ; (1)
ORG 0003H
LJMP ISR_EX0 ; (2)
ORG 000BH
LJMP ISR_T0 ; (3)
ORG 0030H
MAIN: MOV TMOD, #01H ; (4)
MOV IE, #81H ; (5)
SETB IT0 ; (6)
MOV A, #01H ; (7)
MOV P1, #0 ; (8)
SJMP $ ; (9)
ISR_EX0: CPL C ; (10)
CPL ET0 ; (11)
JNC EXIT_EX0 ; (12)
MOV R7, #5 ; (13)
SETB TF0 ; (14)
EXIT_EX0: RETI ; (15)
ISR_T0: CLR TR0 ; (16)
MOV TH0, #HIGH(-50000) ; (17)
MOV TL0, #LOW(-50000) ; (18)
SETB TR0 ; (19)
DJNZ R7, EXIT_T0 ; (20)
MOV R7, #5 ; (21)
MOV P1, A ; (22)
RL A ; (23)
EXIT_T0: RETI ; (24)
END
Biên dịch chương trình trên sang mã máy. Mở file bai13a.bin với Simulator 2003.
Vào Options à Simulation Settings. Trong cửa sổ Simulator2003 Settings, chọn Tab Simulation. Thay đổi giá trị Batch Instructions Count thành 1000, trong danh sách Refresh Type chọn Refresh after each tick để tăng tốc độ mô phỏng và hiển thị.
Chạy mô phỏng chương trình.
[1] Click nút lệnh External interrupt 0 để giả lập ngắt ngoài 0 cạnh xuống cho vi xử lý. Quan sát kết quả ở P1. Một lần nữa click nút lệnh External interrupt 0 và quan sát P1. Từ đó giải thích ngắn gọn mục đích của chương trình.
[2] Giải thích dòng lệnh (5) và (6) của chương trình.
[3] Giải thích mục đích của dòng lệnh (11). Từ đó cho biết chương trình con ISR_T0 được thực thi trong trường hợp nào.
[4] Nếu bỏ đi dòng lệnh (14) thì chương trình có còn chạy đúng không? Tại sao? Dòng lệnh (14) có thể được thay bằng một dòng lệnh nào để kết quả mô phỏng gần như không đổi?
b. Ứng dụng
[5] Viết chương trình Bai13b.a51 dùng ngắt ngoài 1 và ngắt timer 1 thực hiện nhiệm vụ của một mạch delay_on như sau: nếu có cạnh xuống ở P3.3 thì delay 10ms và đặt giá trị P1.0 lên 1; nếu gặp cạnh xuống ở P3.3 một lần nữa thì ngay lập tức đưa P1.0 về 0.
Biên dịch chương trình trên sang mã máy và mô phỏng với Simulator 2003.
Bài 2
GIAO TIẾP NGOẠI VI VỚI LED 7 ĐOẠN
I. Kiến thức cơ bản
Sơ đồ nguyên lý mạch giao tiếp giữa 89C51 với LED 7 đoạn trên kit thí nghiệm MPE-300:
Trong đó:
74LS573 (U2): IC chốt địa chỉ. Do Port 0 hoạt động ở chế độ địa chỉ / dữ liệu (nửa chu kỳ đầu là 8 bit địa chỉ thấp và nửa chu kỳ sau là dữ liệu) nên U2 được dùng để chốt và giữ lại byte địa chỉ thấp này trên address bus.
74LS138 (U6): IC giải mã địa chỉ. Chẳng hạn, để /Y2 = 0 thì CBA = 010, để /Y3 = 0 thì CBA = 011,
74LS259 (U10): IC giải mã địa chỉ và chốt. Khi tín hiệu kích hoạt /G = 0, Q0 = D khi S2S1S0 = 000, Q1 = D khi S2S1S0 = 001, , Q7 = D khi S2S1S0 = 111 (các ngõ ra còn lại giữ nguyên trạng thái trước đó).
74LS374 (U9): chốt dữ liệu theo cạnh lên của CLK. Với tín hiệu cho phép /OE = 0, khi có cạnh lên ở CLK thì Qi = Di (i = 0÷7). Sau đó, các ngõ ra Qi sẽ được chốt lại bất chấp sự thay đổi của các ngõ vào Di.
Các LED 7 đoạn: thuộc loại cathode chung. Để một đoạn LED phát sáng thì phải thỏa mãn 2 điều kiện: chân CK ở mức thấp và chân điều khiển đoạn LED tương ứng phải ở mức cao.
Với sơ đồ nguyên lý trên, có thể nhận thấy rằng tại mỗi thời điểm chỉ có thể hiển thị duy nhất 1 LED 7 đoạn. Do đó, để hiển thị một LED 7 đoạn, chẳng hạn như LED7_CK3, phát sáng thì phải thực hiện tuần tự 3 bước sau:
Nếu có một LED 7 đoạn nào đang được phát sáng trước đó, chẳng hạn như LED7_CK2, thì tắt đi bằng cách đưa Q1 về 0 để chân CK của LED7_CK2 cách ly với mức điện áp thấp.
Chốt tín hiệu thích hợp ở ngõ ra của U9 (74LS374), tín hiệu này là các mã LED 7 đoạn ứng với một con số, một chữ cái... cần hiển thị. Lúc này cả 4 LED 7 đoạn đều nhận được tín hiệu này tuy nhiên chưa LED nào được phát sáng do chân CK của chúng được cách ly với mức điện áp thấp.
Để LED7_CK3 phát sáng thì thiết lập Q2 = 1.
Căn cứ vào sơ đồ nguyên lý trên, các sinh viên có thể xác định được các vùng địa chỉ phù hợp để thực thi các bước trên. Lưu ý là do mỗi lần chỉ có thể hiển thị được 1 LED 7 đoạn nên để có thể hiển thị gần như đồng thời 4 LED 7 đoạn này, cần thực hiện việc hiển thị theo cách “quét”: lần lượt hiển thị từng LED một với tần số cao để mắt người vẫn có cảm giác là việc hiển thị được thực hiện đồng thời:
II. Thí nghiệm
1. Giao tiếp với 1 LED 7 đoạn
a. Thí nghiệm
Sử dụng Crimson Editor soạn thảo chương trình sau với tên Bai21a.a51 ở Desktop:
ORG 0000H
LOOP: MOV A, #3FH ; (1)
MOV DPTR, #4000H ; (2)
MOVX @DPTR, A ; (3)
MOV A, #01H ; (4)
MOV DPTR, #6001H ; (5)
MOVX @DPTR, A ; (6)
SJMP LOOP ; (7)
END
Biên dịch chương trình trên sang mã máy bằng lệnh Tools ® Translate A51 to BIN.
Trên MPE-300, trong khi nhấn giữ nút RESET, gạt nút MSL sang vị trí ROM, gạt nút MODE sang vị trí INT, sau đó buông nút RESET. Chương trình ở ROM trong của 89C51 sẽ được thực thi để chuẩn bị nạp RAM ngoài 6264.
Mở chương trình “MPE-300 External RAM download” trên máy tính. Click nút lệnh để mở và nạp file bai21a.bin (ở desktop). Sau đó click nút lệnh download để nạp chương trình trên tới RAM ngoài 6264 của 89C51 (chương trình sẽ được chuyển tới 89C51 và 89C51 sẽ điều khiển để nạp cho RAM ngoài).
Sau khi nạp xong, trên MPE-300, trong khi nhấn giữ nút RESET, gạt nút MSL sang vị trí RAM, gạt nút MODE sang vị trí EXT, sau đó buông nút RESET. Chương trình nạp ở RAM ngoài của 89C51 sẽ được thực thi.
[1] Điền nội dung hiển thị trên các LED 7 đoạn vào bảng sau:
LED7_CK1
LED7_CK2
LED7_CK3
LED7_CK4
Nội dung hiển thị
[2] Dòng lệnh nào trên chương trình quyết định nội dung hiển thị trên?
[3] Khi vừa thực hiện xong dòng lệnh (3), dựa trên sơ đồ nguyên lý và cho biết giá trị của các đường tín hiệu sau:
/Y2 =
/WR = 0 → 1
A15 = ...
A14 = ... è è WR2 = → ... è Q7→0 (U9) =
A13 = ...
WR3 =
D0 =
A2 =
A1 =
A0 =
[4] Khi đang thực hiện dòng lệnh (6), dựa trên sơ đồ nguyên lý và cho biết giá trị của các đường tín hiệu sau:
/Y3 =
/WR = 0
A15 = ...
A14 = ... è è è Q3→0 (U10) =
A13 = ...
[5] Nếu thay dòng lệnh (2) bằng dòng lệnh MOV DPTR, #4002H thì kết quả chương trình trên có thay đổi không? Tại sao?
[6] Nếu thay dòng lệnh (4) bằng dòng lệnh MOV A, #00H thì LED 7 đoạn có sáng không? Tại sao? Từ đó cho biết có thể thay dòng lệnh này bằng dòng lệnh SETB ACC.0 được không?
b. Ứng dụng
[7] Viết chương trình Bai21b_1.a51 xuất ra LED7_CK4 ký tự h và dấu “.” như sau:
[8] Viết chương trình Bai21b_2.a51 tuần hoàn xuất ra LED7_CK1 các ký tự hex như sau:
0 à 9 à F
với khoảng thời gian hiển thị mỗi ký tự là 0.5s (lưu ý thạch anh sử dụng cho 89C51 có
tần số 7.3728Mhz)
Hướng dẫn: Chương trình sau xuất 1 ký tự tùy chọn trong khoảng từ 0à5 ra LED7_CK2. Sinh viên dựa vào chương trình này, xem lại lệnh MOVC và lệnh giả DB để thực hiện câu [8]
KY_TU EQU 3 ; Chọn ký tự từ 0à5 để xuất (ở đây xuất 3)
ORG 0000H
LOOP: MOV DPTR, #LED7_CODE
MOV A, #KY_TU
MOVC A, @A+DPTR ; Đổi ký tự sang mã LED 7 đoạn
MOV DPTR, #4000H
MOVX @DPTR, A ; Xuất mã ký tự đến ngõ ra U9
MOV A, #01H
MOV DPTR, #6001H
MOVX @DPTR, A ; Xuất tín hiệu chọn LED 7 đoạn ra U10
SJMP LOOP
LED7_CODE: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH ; Mã các ký tự từ 0à5
END
2. Giao tiếp với cả 4 LED 7 đoạn
a. Thí nghiệm
Sử dụng Crimson Editor soạn thảo chương trình sau với tên Bai22a.a51 ở Desktop:
ORG 0000H
MOV DPL, #03H ; (1)
LOOP: MOV 120, #7DH ; (2)
ACALL DISPLAY ; (3)
MOV 120, #07H ; (4)
ACALL DISPLAY ; (5)
MOV 120, #7FH ; (6)
ACALL DISPLAY ; (7)
MOV 120, #6FH ; (8)
ACALL DISPLAY ; (9)
SJMP LOOP ; (10)
DISPLAY: CLR ACC.0 ; (11)
MOV DPH, #60H ; (12)
MOVX @DPTR, A ; (13)
MOV A, 120 ; (14)
MOV DPH, #40H ; (15)
MOVX @DPTR, A ; (16)
SETB ACC.0 ; (17)
MOV DPH, #60H ; (18)
INC DPL ; (19)
ANL DPL, #03H ; (20)
MOVX @DPTR, A ; (21)
MOV R7, #250 ; (22)
DJNZ R7, $ ; (23)
RET ; (24)
END
Biên dịch chương trình trên sang mã máy bằng lệnh Tools ® Translate A51 to BIN.
Trên MPE-300, trong khi nhấn giữ nút RESET, gạt nút MSL sang vị trí ROM, gạt nút MODE sang vị trí INT, sau đó buông nút RESET.
Mở chương trình “MPE-300 External RAM download” trên máy tính. Click nút lệnh để mở và nạp file bai22a.bin (ở desktop). Sau đó click nút lệnh download để nạp chương trình trên tới RAM ngoài 6264 của 89C51.
Sau khi nạp xong, trên MPE-300, trong khi nhấn giữ nút RESET, gạt nút MSL sang vị trí RAM, gạt nút MODE sang vị trí EXT, sau đó buông nút RESET. Chương trình nạp ở RAM ngoài của 89C51 sẽ được thực thi.
[1] Điền nội dung hiển thị trên các LED 7 đoạn vào bảng sau:
LED7_CK1
LED7_CK2
LED7_CK3
LED7_CK4
Nội dung hiển thị
[2] Các dòng lệnh nào trên chương trình quyết định các nội dung hiển thị trên?
[3] Các dòng lệnh (11), (12) và (13) dùng để làm gì?
[4] Các dòng lệnh (14), (15) và (16) dùng để làm gì?
[5] Các dòng lệnh từ (17) đến (21) dùng để làm gì? Tại sao phải có dòng lệnh (20)? Nếu bỏ đi dòng lệnh này chương trình có còn chạy đúng không?
[6] Dòng lệnh (22) và (23) dùng để delay thời gian hiển thị cho 1 LED 7 đoạn. MPE-300 sử dụng thạch anh có tần số 7.3728MHz cho 89C51 thì thời gian delay này là bao lâu?
b. Ứng dụng
[7] Viết chương trình Bai22b.a51 xuất ra các LED 7 đoạn dòng chữ “HELP.” nhấp nháy với chu kỳ 1s (0.5s bật và 0.5s tắt) như sau (lưu ý thạch anh sử dụng có tần số 7.3728Mhz):
Hướng dẫn: Có thể sử dụng ngắt timer để tạo hiệu ứng nhấp nháy.
Bài 3
GIAO TIẾP NGOẠI VI VỚI MA TRẬN PHÍM
I. Kiến thức cơ bản
Sơ đồ nguyên lý khối bàn phím trên MPE-300:
Khối bàn phím là một ma trận phím gồm 4 hàng và 4 cột, mỗi hàng (cũng như mỗi cột) được kết nối trực tiếp với 1 chân của P1. Khi một phím, chẳng hạn như phím số 5, được nhấn thì sẽ tạo ra sự kết nối về điện giữa chân P1.5 và P1.1. Do đó, 89C51 có thể giao tiếp với khối bàn phím trên theo nguyên lý quét phím: lần lượt xuất các mức logic 0 ra mỗi cột và kiểm tra hàng, hàng nào nhận được mức logic 0 chứng tỏ phím ứng với hàng và cột đó đã được nhấn.
Để không bỏ sót một phím nhấn, quá trình quét phím theo cột phải được thực hiện liên tục với tần số cao. Về mặt nguyên tắc có thể xảy ra trường hợp: khi chương trình đang quét phím ở một cột thì một phím ở cột khác được nhấn và tất nhiên chương trình không nhận ra sự nhấn phím này. Tuy nhiên, trên thực tế thì thời gian một phím được nhấn dài hơn rất nhiều thời gian quét phím và xử lý của 89C51 nên khả năng bỏ sót phím là điều không thể.
Trong chương trình, khi một phím được nhấn cần phải nhận biết được mã phím (là giá trị của phím nhấn, chẳng hạn phím 0 có mã phím là 0, phím 1 có mã phím là 1,). Mã phím và vị trí của phím trong ma trận phím có quan hệ với nhau theo công thức:
Mã phím = (STT hàng) × 4 + (STT cột)
Vd: Phím 3: Mã phím = 0x4 + 3 = 3
Phím C: Mã phím = 3x4 + 0 = 12
II. Thí nghiệm
1. Thí nghiệm
Sử dụng Crimson Editor soạn thảo chương trình sau với tên Bai31.a51 ở desktop:
SCAN EQU R7
COL EQU R6
ROW EQU R5
ORG 0000H
BEGIN: MOV SCAN, #01111111B ; (1)
MOV COL, #3 ; (2)
SCAN_KEY: MOV P1, SCAN ; (3)
MOV A, P1 ; (4)
CPL A ; (5)
ANL A, #0FH ; (6)
JZ NEXT_COL ; (7)
MOV ROW, #-1 ; (8)
ROW_COUNT: RRC A ; (9)
INC ROW ; (10)
JNC ROW_COUNT ; (11)
MOV A, ROW ; (12)
RL A ; (13)
RL A ; (14)
ADD A, COL ; (15)
ACALL DISPLAY ; (16)
NEXT_COL: MOV A, SCAN ; (17)
JNB ACC.4, BEGIN ; (18)
RR A ; (19)
MOV SCAN, A ; (20)
DEC COL ; (21)
SJMP SCAN_KEY ; (22)
DISPLAY: MOV DPTR, #LED7_TABLE ; (23)
MOVC A, @A+DPTR ; (24)
MOV DPTR, #4000H ; (25)
MOVX @DPTR, A ; (26)
SETB ACC.0 ; (27)
MOV DPTR, #6003H ; (28)
MOVX @DPTR, A ; (29)
RET ; (30)
LED7_TABLE: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H
DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
END
Biên dịch chương trình trên sang mã máy bằng lệnh Tools ® Translate A51 to BIN.
Trên MPE-300, trong khi nhấn giữ nút RESET, gạt nút MSL sang vị trí ROM, gạt nút MODE sang vị trí INT, sau đó buông nút RESET.
Mở chương trình “MPE-300 External RAM download” trên máy tính. Click nút lệnh để mở và nạp file bai31.bin (ở desktop). Sau đó click nút lệnh download để nạp chương trình trên tới RAM ngoài 6264 của 89C51.
Sau khi nạp xong, trên MPE-300, trong khi nhấn giữ nút RESET, gạt nút MSL sang vị trí RAM, gạt nút MODE sang vị trí EXT, sau đó buông nút RESET. Chương trình nạp ở RAM ngoài của 89C51 sẽ được thực thi.
[1] Lần lượt nhấn các phím trên khối bàn phím, quan sát kết quả hiển thị trên LED 7 đoạn và điền vào bảng sau:
Phím nhấn
Hiển thị
Phím nhấn
Hiển thị
Phím nhấn
Hiển thị
Phím nhấn
Hiển thị
0
4
8
C
1
5
9
D
2
6
A
E
3
7
B
F
[2] Giả sử chương trình đang quét cột 1 của khối bàn phím (SCAN = 11011111B, COL = 1) và có phím số 9 đang được nhấn thì giá trị nhị phân của A là bao nhiêu sau khi thực hiện xong dòng lệnh (6). Từ đó cho biết nếu như không có phím nào được nhấn thì giá trị của A là bao nhiêu?
[3] Đoạn chương trình từ (8) đến (16) chỉ được thực hiện khi có một phím đang được nhấn. Cũng với giả sử là có phím số 9 đang được nhấn thì khi thực hiện xong dòng lệnh (12) giá trị thập phân của A là bao nhiêu? Từ đó cho biết các dòng lệnh (9), (10) và (11) dùng để làm gì?
[4] Cũng với giả sử trên, cho biết các giá trị thập phân của A sau khi thực hiện xong từng dòng lệnh (13), (14) và (15). Từ đó cho biết ý nghĩa của 3 dòng lệnh này?
[5] Đoạn chương trình từ (17) đến (21) thực hiện các bước chuẩn bị cho lần quét cột kế tiếp. Cho biết ý nghĩa của dòng lệnh (18).
2. Ứng dụng
[1] Viết chương trình Bai32_1.a51 nhận biết có phím nhấn. Khi có một phím bất kỳ đang được nhấn thì hiển thị ký tự sau ra LED7_CK1:
[2] Viết chương trình Bai32_2.a51 nhận biết số chẵn, lẻ: nếu đang nhấn phím số lẻ thì hiển thị ký tự ‘L’ và đang nhấn phím số chẵn thì hiển thị ký tự ‘C’ ra LED7_CK1.
Bài 4
GIAO TIẾP NGOẠI VI VỚI MA TRẬN LED
I. Kiến thức cơ bản
Sơ đồ nguyên lý mở rộng port cho 89C51 dùng PPI 8255 trên MPE-300 như sau (có thể xem thêm chi tiết về PPI 8255 ở bài mở đầu):
Sơ đồ nguyên lý khối ma trận LED:
Ma trận LED gồm các LED phát quang bố trí thành 5 cột và 7 hàng trong một vi mạch. Các tín hiệu điều khiển hàng PA0 - PA6 (PORT A) nối vào anod của tất cả các LED cùng hàng. Các tín hiệu điều khiển cột PB0 - PB4 (PORT B) nối vào cathode của tất cả các LED cùng cột.
Khi có một cặp tín hiệu điều khiển hàng và cột, ví dụ PA0 = 1 và PB0 = 1, các anod của hàng LED thứ nhất (hàng 0) được cấp thế cao, đồng thời các cathode của cột LED thứ nhất (cột 0) được cấp thế thấp. Tuy nhiên chỉ có LED1 là sáng vì có đồng thời thế cao trên anod và thế thấp ở cathode. Như vậy, khi có 1 cặp tín hiệu điều khiển hàng và cột, chỉ có LED tại điểm hàng và cột gặp nhau là sáng. Với cấu trúc này có thể xây dựng ma trận LED với số LED lớn.
Trong trường hợp cần hiển thị đồng thời nhiều LED trong ma trận, ví dụ chỉ thị chữ L trên ma trận LED, thì phải thực hiện việc hiển thị động (quét LED theo cột): lần lượt cho các cột Pbi = 1 (i = 0÷4), ứng với mỗi Pbi, thiết lập các LED hàng cần phát sáng. Tần số cho một chu trình quét phải đủ cao nhằm đảm bảo cho mắt nhìn thấy sáng đều, không nhấp nháy.
Như vậy để chỉ thị chữ L, có thể điều khiển tuần tự và lặp lại theo 5 bước:
Bước 1
Bước 2
Bước 3
Bước 4
Bước 5
PB0
PB1
PB2
PB3
PB4
PA0
1
PA1
1
PA2
1
PA3
1
PA4
1
PA5
1
PA6
1
1
1
1
1
II. Thí nghiệm
1. Mở rộng port với PPI 8255
a. Thí nghiệm
Sử dụng Crimson Editor soạn thảo chương trình sau với tên Bai41a.a51 ở Desktop:
ORG 0000H
MOV A, #10001001B ; (1)
MOV DPTR, #8003H ; (2)
MOVX @DPTR, A ; (3)
LOOP: MOV A, #01111111B ; (4)
MOV DPTR, #8000H ; (5)
MOVX @DPTR, A ; (6)
MOV A, #00000100B ; (7)
MOV DPTR, #8001H ; (8)
MOVX @DPTR, A ; (9)
SJMP LOOP ; (10)
END
Biên dịch chương trình trên sang mã máy bằng lệnh Tools ® Translate A51 to BIN.
Sử dụng chương trình “MPE-300 External RAM download” trên máy tính để mở và nạp file bai41a.bin (ở desktop) tới RAM ngoài 6264 của 89C51. Sau khi nạp xong, trong khi nhấn giữ nút RESET, gạt nút MSL sang vị trí RAM, gạt nút MODE sang vị trí EXT, sau đó buông nút RESET để thực thi chương trình trên.
[1] Quan sát kết quả hiển thị trên ma trận LED và đánh dấu X vào những vị trí LED sáng tương ứng trên bảng ma trận LED sau:
Cột 0
Cột 1
Cột 2
Cột 3
Cột 4
Hàng 0
Hàng 1
Hàng 2
Hàng 3
Hàng 4
Hàng 5
Hàng 6
/WR = 0
/Y4 =
A1 =
A0 =
[2] Khi đang thực hiện dòng lệnh (3), dựa trên sơ đồ nguyên lý mở rộng port và cho biết giá trị của các đường tín hiệu sau:
A15 = ...
A14 = ... è
A13 = ...
[3] Từ đó cho biết dòng lệnh (3) dùng để làm gì? Sau khi thực hiện xong dòng lệnh (3), cho biết chế độ (xuất hoặc nhập) của các port 8255:
Port A:
Port B:
Port C:
/WR = 0
/Y4 =
A1 =
A0 =
[4] Khi đang thực hiện dòng lệnh (6), dựa trên sơ đồ nguyên lý mở rộng port và cho biết giá trị của các đường tín hiệu sau:
A15 = ...
A14 = ... è
A13 = ...
[5] Từ đó cho biết dòng lệnh (6) dùng để làm gì? Sau khi thực hiện xong dòng lệnh (6), cho biết giá trị nhị phân của port A:
PA7÷0 = .
/WR = 0
/Y4 =
A1 =
A0 =
[6] Khi đang thực hiện dòng lệnh (9), dựa trên sơ đồ nguyên lý mở rộng port và cho biết giá trị của các đường tín hiệu sau:
A15 = ...
A14 = ... è
A13 = ...
[7] Từ đó cho biết dòng lệnh (9) dùng để làm gì? Sau khi thực hiện xong dòng lệnh (9), cho biết giá trị nhị phân của port B:
PB7÷0 =
b. Ứng dụng
[8] Viết chương trình Bai41b.a51 tạo chuyển động sau trên ma trận LED với thời gian delay cho mỗi chuyển động là 100ms (lưu ý thạch anh sử dụng có tần số 7.3728Mhz):
Hướng dẫn: Sử dụng lệnh RR A để tạo hiệu ứng chuyển động đi lên.
2. Giao tiếp ngoại vi với ma trận LED
a. Thí nghiệm
Sử dụng Crimson Editor soạn thảo chương trình sau với tên Bai42a.a51 ở Desktop:
COL EQU R0
ROW EQU R1
ORG 0000H
MOV A, #80H ; (1)
MOV DPTR, #8003H ; (2)
MOVX @DPTR, A ; (3)
LOOP: MO
Các file đính kèm theo tài liệu này:
- giao_trinh_huong_dan_thi_nghiem_vi_xu_ly_va_plc_nguyen_ngoc.doc