Hoàn tất các lệnh hợp ngữ có nhiệm vụ sau.. Cho lệnh gọi chương trình con AJMP LAP chứa trong bộ nhớ chương trình bắt đầu từ địa chỉ B7FFH... Viết chương trình hợp ngữ hoặc C không dùng
Trang 1ĐÁP ÁN ĐỀ THI VI XỬ LÝ HK 2 (2014-2015)
Ngày thi: 12/06/2015 Thời gian làm bài: 110 phút
Đề thi có 6 trang + 2 trang phụ lục
Sinh viên làm bài trên đề và KHÔNG được sử dụng tài liệu
HỌ TÊN: ……… MSSV: ……… ……
CÁC CÂU HỎI ÁP DỤNG TRÊN VI ĐIỀU KHIỂN 8051
Câu 1: (2 điểm) Cho mạch giải mã địa chỉ bộ nhớ sử dụng IC 74138 như hình vẽ
a Xác định địa chỉ của các ngõ ra decoder và tín hiệu chọn chip CS0 cho bộ nhớ ROM: (1đ)
Địa chỉ của CS0: 9800H - A7FFH
b Vẽ thêm trên mạch 2 tín hiệu chọn chip CS1 và CS2 với yêu cầu:
- CS1: chọn chip RAM có dung lượng 8KB bắt đầu từ địa chỉ đầu của Y0
- CS2: chọn I/O có 256 địa chỉ và có địa chỉ tiếp theo CS1
Xác định địa chỉ của 2 tín hiệu chọn chip đó (giải thích) (1đ)
Mạch giải mã 74138 phân vùng 2KB
CS1 là vùng 8KB nên ghép 4 vùng: Y0, Y1, Y2, Y3 (hình vẽ): 8000H – 9FFFH
CS2 là vùng 256B, lấy vùng tiếp theo là Y4 với A 10 = A 9 = A 8 = 0: A000H – A0FFH (hình vẽ)
A 15 A 14 A 13 A 12 A 11 A 10 A 9 A 8 A 7 A 6 A 5 A 4 A 3 A 2 A 1 A 0 Vuøng ñòa chæ (HEX)
1 0 0 0 0 X X X X X X X X X X X /Y0: 8000H – 87FFH
1 0 0 0 1 X X X X X X X X X X X /Y1: 8800H – 8FFFH
1 0 0 1 0 X X X X X X X X X X X /Y2: 9000H – 97FFH
1 0 0 1 1 X X X X X X X X X X X /Y3: 9800H – 9FFFH
1 0 1 0 0 X X X X X X X X X X X /Y4: A000H – A7FFH
1 0 1 0 1 X X X X X X X X X X X /Y5: A800H – AFFFH
1 0 1 1 0 X X X X X X X X X X X /Y6: B000H – B7FFH
1 0 1 1 1 X X X X X X X X X X X /Y7: B800H – BFFFH
Duyệt của BM Điện tử GV ra đề: NGUYỄN TRỌNG LUẬT
C
A (LSB) Y0
Y1 Y2 Y3 Y4 Y5 Y6 Y7 G2B
G2A G1
B
A15 A14
A13 A12 A11
G2B
0
CS0
CS1
CS2
A10 A9 A8
Trang 2Câu 2: (2 điểm)
a Viết các lệnh hợp ngữ để chọn bank thanh ghi 2 và cất nội dung thanh ghi A và R6 vào vùng
stack:
SETB RS1 (PSW.4) PUSH ACC
CLR RS0 (PSW.3) PUSH 16H (R6 của Bank 2)
b Hoàn tất các lệnh hợp ngữ có nhiệm vụ sau Thanh ghi A có giá trị nhị phân là gì sau khi thực
hiện? *Làm cho cờ OV=1: *Làm cho cờ P=1:
MOV A, # 01001100B MOV A, # 01110001B ADD A, # 01000000B ANL A, # 11111110B
Thanh ghi A: A = 10001100B A = 01110000B (0.5đ)
(số dương cộng số dương thành số âm) (xóa hoặc thêm 1 bit 1)
c Cho lệnh gọi chương trình con AJMP LAP chứa trong bộ nhớ chương trình bắt đầu từ địa chỉ
B7FFH Xác định địa chỉ trang và phạm vi địa chỉ hợp lệ của nhãn LAP (Giải thích)
PC lệnh kế = B7FFH + 2 (lệnh 2 byte) = B801H = 1011 1000 0000 0001 B
Địa chỉ trang là 5 bit cao của PC: 10111 : trang 23 (0.5đ)
Phạm vi hợp lệ là trang 2KB này: 1011 1XXX XXXX XXXX : B800H BFFFH
d Lệnh JZ XOA có mã máy là 60H và 9EH và chứa trong bộ nhớ chương trình từ địa chỉ 6D20H Xác định địa chỉ của nhãn XOA (Giải thích)
PC lệnh kế = 6D20H + 2 (lệnh 2 byte) = 6D22H
Lệnh nhảy có độ dời 9EH (số âm)
Câu 3: (1 điểm) Viết đoạn chương trình hợp ngữ theo lưu đồ sau:
lap
N
R7 = 0
Quay trái A
Tăng R7 lên 1
MSB(A) = 1 Y
thoat
MOV R7, #0 ; 1MC LAP: JB ACC.7, THOAT ; 2MC
(0.5đ)
Trang 3Với A = 26, hãy tính số chu kỳ máy (MC) để đoạn chương trình trên nhảy đến nhãn thoat
A = 26 = 0001 1010 B, chương trình quay trái thanh ghi A cho đến khi MSB(A) = 1 thì nhảy đến nhãn THOAT Như vậy, vòng lặp thực hiện 3 lần và lần thứ 4 chỉ thực hiện lệnh JB rồi nhảy Vậy số chu kỳ máy: 1 + 3 (2 + 1 + 1 + 2) + 2 = 21MC (0.5đ)
Câu 4: (1 điểm)
Viết chương trình hợp ngữ tìm giá trị y (kết quả cất vào thanh ghi B) bằng 2 cách: có dùng lệnh MUL và không dùng MUL (dùng bảng tham chiếu) Giá trị y cần tính là y = x 2
-2x + 3, với giá trị x chứa trong thanh ghi A có giá trị từ 0 đến 9
*Dùng lệnh MUL: (0.5đ) * Dùng bảng tham chiếu: (0.5đ)
MOV R7, A y(0) = 3, y(1) = 2, y(2) = 3, y(3) = 6
MOV R6, A ; R6 = 2x y(7) = 38, y(8) = 51, y(9) = 66
MOV A, R7
ADD A, #3 ; A = x 2 + 3 MOV B, A
SUBB A, R6 ; A = x 2 - 2x + 3 BANG: DB 3, 2, 3, 6, 11
Câu 5: (1 điểm)
Mạch 8051 có 2 công tắc SW ở P1.1 và P1.0 Viết chương trình hợp ngữ hoặc C (không dùng ngắt) kiểm tra các SW cứ sau mỗi 1 phút để làm thay đổi các ngõ ra của Port 2 theo quy luật như bảng sau (cho sẵn chương trình con tạo trễ 1 giây DELAY_1s)
0 0 Quay phải 1 bit
0 1 Quay trái 1 bit
1 0 Lấy đảo các bit
1 1 Hoán đổi 4 bit cao và 4 bit thấp
Trang 41 phút = 60 giây (1đ)
MOV A, P2
CJNE R6, #0, SS_1 Cách khác: kiểm tra từng bit P1.1 và P1.0
Câu 6: (1 điểm)
Viết chương trình hợp ngữ hoặc C mô phỏng hoạt động chế độ thanh ghi dịch (phát dữ liệu)
của Port nối tiếp Với chân P1.7 là ngõ ra Data, và chân P1.6 là xung Clock Chương trình có nhiệm vụ lấy nội dung ô nhớ RAM nội có địa chỉ 20H phát nối tiếp ra ngõ Data, với tốc độ baud là
1000bps và tần số thạch anh XTAL = 6MHz
Để mô phỏng chế độ thanh ghi dịch (phát), thực hiện vòng lặp 8 lần gồm các bước:
- Cho từng bit (trọng số thấp trước) phát ra ngõ Data (P1.7)
- Tạo xung cạnh lên cho ngõ ra clock (P1.6)
- Tạo trễ với thời gian = 1/ fbaud = 1/1000bps = 1ms = 1000us = 2 250 2us
MOV P1.7, C ; rồi xuất data SJMP $
CLR P1.6 ; tạo xung clock (thay lệnh RRC A bằng MOV C, ACC.0
SETB P1.6 ; cạnh lên RR A )
Data
Clock
1 Tốc độ baud
Trang 5Câu 7: (1,5 điểm)
a Viết chương trình con SOSANH, có nhiệm vụ so sánh 2 số nhị phân (mỗi số 16 bit) Số thứ nhất
là nội dung của cặp thanh ghi R7_R6 và số thứ 2 là nội dung của cặp thanh ghi R5_R4 Chương trình tìm giá trị lớn nhất của 2 số trên và cất vào cặp thanh ghi R3_R2; nếu 2 số bằng nhau thì xóa cặp thanh ghi R3_R2 (Các thanh ghi R7, R5, R3 là byte cao của các số 16 bit) (0,75 điểm)
CJNE A, 04H, KHAC MOV R3, #0
MOV R2, #0 SJMP KTHUC
MOV R3, 07H MOV R2, 06H SJMP KTHUC
b Cho port nối tiếp hoạt động ở chế độ UART 8 bit, tốc độ baud 19200, tần số thạch anh 11.059MHz Viết chương trình hợp ngữ nhận từ port nối tiếp 2 byte liên tiếp là số nhị phân 16 bit (byte đầu là 8 bit thấp) Sử dụng chương trình con SOSANH để so sánh số vừa nhận được với số nhị phân 16 bit nhập từ Port 1 và Port 0 (Port 1 là 8 bit cao) Kết quả được phát trở lại ra port nối
tiếp (byte trọng số thấp phát trước) (0,75 điểm)
JNB RI, $
CLR RI
MOV R7, SBUF ; byte cao
Trang 6Câu 8: (1,5 điểm)
Viết chương trình hợp ngữ sử dụng ngắt timer để tạo sóng vuông ở ngõ ra P1.0 có tần số thay đổi luân phiên là 200Hz và 1KHz cứ sau mỗi 0,5 giây Biết rằng tần số thạch anh XTAL = 12MHz Sử dụng 2 ngắt Timer:
- Ngắt timer0: cứ mỗi 0,5 giây sẽ làm thay đổi biến trạng thái: cờ F0
- Ngắt timer1: tạo sóng vuông cho P1.0, với giá trị nạp phụ thuộc vào F0
F0 = 0: tạo xung f1= 200Hz => chu kỳ= 1/200Hz = 5ms => giá trị nạp là -2500
F0 = 1: tạo xung f2= 1KHz => chu kỳ = 1/1KHz = 1ms => giá trị nạp là -500
ORG 0000H ISRT0: CLR TR0
ORG 001BH THOAT: MOV TH0, #HIGH(-50000)
MOV R7, # 10 ; 0.5s = 10 50000us RETI
MOV TH0, #HIGH(-50000) ISRT1: CLR TR1
CLR F0 ; tạo xung 200Hz MOV TH1, #HIGH(-2500)
SETB TR1 NAP: MOV TH1, #HIGH(-500)
RETI END
Các cách viết khác:
- Chương trình chính liên tục tạo trễ 0.5s để làm bù bit trạng thái F0 Dùng 1 ngắt timer
để tạo xung theo F0
- Dùng ngắt timer 0.5s để bù bit F0 Chương trình chính tạo xung theo F0
- Dùng 2 ngắt timer để tạo 2 xung khác nhau Chương trình chính tạo trễ 0.5s để cho phép 1 ngắt và cấm ngắt còn lại; sau đó tạo trễ 0.5s để làm ngược lại (cách này không cần biến trạng thái F0) HẾT