Bài tập Vi xử lý - Chương 3 - Hồ Trung Mỹ

1.1 Kể tên các nhà sản xuất khác (ngoài Intel) có chế tạo MCU 8051?

1.2 Ta sử dụng lệnh gì để đặt LSB của byte ở địa chỉ 25H lên 1?

1.3 Hãy viết các lệnh dùng để OR các bit có địa chỉ là 00H và 01H, kết quả cất vào bit có địa chỉ 02H?

1.4 Sau khi thực thi các lệnh sau thì những bit nào có giá trị 1?

MOV R0, #26H

MOV @R0, #7AH

1.5 Hãy tìm lệnh 1 byte có cùng hiệu ứng như lệnh 2 byte sau:

MOV 0E0H, #55H

1.6 Hãy viết các lệnh để cất giá trị 0ABH vào RAM ngoài ở địa chỉ 9A00H.

1.7 Có bao nhiêu thanh ghi chức năng đặc biệt được định nghĩa trong 8051, 8052?

1.8 Sau khi reset hệ thống, giá trị của SP của 8051 là bao nhiêu?

1.9 Ta có thể sử dụng lệnh gì để khởi tạo trị cho SP của 8031 để tạo stack 64 byte ở đỉnh của RAM nội?

1.10 Một chương trình con sử dụng các thanh ghi R0-R7 mở rộng. Hãy minh họa làm cách nào chương

trình con này chuyển sang sử dụng các thanh ghi R ở bank 3 khi vào chương trình con này và trả lại

bank thanh ghi cũ khi kết thúc chương trình con đó?

pdf17 trang | Chuyên mục: Vi Xử Lý – Vi Điều Khiển | Chia sẻ: tuando | Lượt xem: 580 | Lượt tải: 0download
Tóm tắt nội dung Bài tập Vi xử lý - Chương 3 - Hồ Trung Mỹ, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
u rất chính xác 60 Hz (với điều kiện áp AC này có tần số ổn 
định) vào T0 bằng cách lấy từ thứ cấp của một biến áp. Khởi động Timer 0 sao cho nó lấy xung nhịp 
từ T0 và tràn 1 lần/giây. Ở mỗi lần tràn, cập nhật giá trị thời gian trong ngày được chứa trong bộ nhớ 
nội của 8051 ở các vị trí 50H (giờ), 51H (phút), và 52H (giây). 
Hình E.3.15 
Phần 4 – Cổng nối tiếp (Serial Port) 
4.1 Hãy tìm giá trị của TH1 (dạng thập phân và hex) để đặt tốc độ baud cho các trường hợp sau nếu 
SMOD=1: a) 9600 baud; b) 4800 baud. Giả sử rằng XTAL=11.0592 MHz 
4.2 Tìm tốc độ baud nếu TH1=–2, SMOD = 1 và XTAL =11.0592MHz. 
4.3 Giả sử rằng cổng nối tiếp 8051 được nối vào cổng COM của máy vi tính, và ở PC ta sử dụng chương 
trình terminal.exe để gửi và nhận dữ liệu nối tiếp. P1 và P2 của 8051 được nối vào các LED và các 
công tắc tương ứng. Viết chương trình 8051 để: a) gửi đến máy vi tính thông điệp “We Are Ready!”; 
b) nhận bất cứ dữ liệu nào được gửi từ máy vi tính và xuất nó ra các LED đang gắn ở P1; và c) lấy dữ 
BT-VXL-Ch 3 – trang 14 
liệu trên các công tắc nối vào P2 và gửi nối tiếp dữ liệu đó đến máy vi tính. Chương trình thực a) một 
lần, nhưng các phần b) và c) liên tục. Sử dụng tốc độ baud là 4800. 
4.4 Giả sử XTAL=11.0592 MHz với chương trình sau, hãy cho biết: a) chương trình này làm gì, b) tính 
tần số được sử dụng bởi timer1 để đặ tốc độ baud, và c) tìm tốc độ baud của việc chuyển dữ liệu. 
MOV A, PCON 
SETB ACC.7 
MOV PCON, A 
MOV TMOD, #20H 
MOV TH1, -3 
MOV SCON, #50H 
SETB TR1 
MOV A, # “B” 
LOOP: CLR TI 
MOV SBUF, A 
JNB TI, $ 
 SJMP LOOP 
4.5 Sử dụng cổng nối tiếp làm cổng hiển thị: Cho mạch ở hình E.4.5 
Hình E.4.5 Mạch nối bên ngoài với cổng nối tiếp 8051. 
Với lệnh: MOV SBUF, A 
 Dữ liệu nhị phân từ ACC sẽ được truyền ra bên ngoài bắt đầu từ bit thấp nhất qua chân 
RXD của cổng nối tiếp sau khi thực thi lệnh trên. Khi kết thúc truyền bit SCON.1 sẽ tự động 
được đặt lên 1. IC 74LS164 trong hình là thanh ghi dịch 8 bit vào nối tiếp ra song song (SIPO). 
Dữ liệu nhị phân 8 bit vào nối tiếp sẽ được xuất ra song song. Các IC 74LS164 mắc kế tiếp nhau 
để giá trị ban đầu được hiện trên hiển thị sẽ dịch từ phải sang trái khi có thêm giá trị mới. 
LED 7 đoạn là loại anode chung, do đó khi đưa mức thấp vào có thể làm sáng các đoạn 
này (thí dụ: đoạn a sẽ sáng khi Q1 của 74LS164 là 0). Theo nguyên tắc này ta có thể cho hiện 1 
ký tự trên hiển thị nếu các ngõ ra tương ứng của 74LS164 ở mức thấp. Thí dụ để hiện được ký tự 
“2” thì cần làm sáng các đoạn a, b, g, e và d, vì vậy các ngõ ra tương ứng Q7, Q6, Q3, Q1 và Q0 
phải được đặt ở mức thấp và các ngõ ra Q5, Q4 và Q2 giữ ở mức cao. Do đó ta cần gửi byte 34H 
ra bộ đệm dữ liệu nối tiếp. Dữ liệu 34H được gọi là mã ký tự của ký tự “2”. Bảng mã ký tự cho 
các ký tự từ “0” đến “F” như sau: 
Ký tự D7 D6 D5 D4 D3 D2 D1 D0 Mã ký tự 
BT-VXL-Ch 3 – trang 15 
 b g c dp e f a d 
 0 0 1 0 1 0 0 0 0 50H 
 1 0 1 0 1 1 1 1 1 5FH 
 2 0 0 1 1 0 1 0 0 34H 
 3 0 0 0 1 1 1 0 0 1CH 
 4 0 0 0 1 1 0 1 1 1BH 
 5 1 0 0 1 1 0 0 0 98H 
 6 1 0 0 1 0 0 0 0 90H 
 7 0 1 0 1 1 1 0 1 5DH 
 8 0 0 0 1 0 0 0 0 10H 
 9 0 0 0 1 1 0 0 1 19H 
 A 0 0 0 1 0 0 0 1 11H 
 B 1 0 0 1 0 0 1 0 92H 
 C 1 1 1 1 0 0 0 0 F0H 
 D 0 0 0 1 0 1 1 0 16H 
 E 1 0 1 1 0 0 0 0 B0H 
 F 1 0 1 1 0 0 0 1 B1H 
 Chú ý: 
o để làm cho tất cả các đoạn sáng ta ấn nút SW 
o để làm cho tất cả các đoạn tắt ta dùng lệnh MOV SBUF, #FF 
Hãy viết các lệnh để: 
a) Hiển thị các ký tự “0”, “1”, “2”, “3”, và “4” từ phải sang trái. Có nhận xét gì về kết quả 
hiển thị? 
b) Hiển thị ký tự “A” trên bảng hiển thị? 
Các vấn đề sau (4.6 đến 4.14) là các chương trình tiêu biểu để giao tiếp với các thiết bị đầu 
cuối (terminal) hoặc các thiết bị nối tiếp khác với máy vi tính. Giả sử cổng nối tiếp được khởi 
động ở mode UART 8 bit và tốc độ baud được cung cấp bởi Timer 1. 
4.6 Viết chương trình con OUTSTR gửi 1 chuỗi ký tự ASCII kết thúc bởi ký tự NULL đến thiết 
bị nối tiếp nối với cổng nối tiếp của 8051 . Giả sữ chuỗi mã ASCII ở trong bộ nhớ mã bên 
ngoài và chương trình gọi đặt địa chỉ của chuỗi trong DPTR trước khi gọi OUTSTR. Chuỗi 
ký tự kết thúc bằng NULL là chuỗi byte ASCII kết thúc với byte 00H. 
4.7 Viết chương trình con INLINE nhập 1 dòng các mã ASCII từ thiết bị nối với cổng nối toếp 
của 8051 và đặt nó vào bộ nhớ dữ liệu nội bắt đầu ở 50H. Giả sử dòng kết thúc bằng CR 
(carriage return). Đặt mã CR vào trong bộ đệm dòng cùng với các mã khác và rồi kết thúc bộ 
đệm bằng byte NULL (00H). 
4.8 Viết chương trình gửi liên tục bộ mẫu tự từ a tới z đến thiết bị gắn vào cổng nối tiếp, dùng 
chương trình con OUTCHR (có sẵn ) . 
4.9 Giả sử cho trước chương trình con OUTCHR, hãy viết chương trình gửi liên tục bộ ASCII 
hiển thị được (các mã từ 20H đến 7EH) đến thiết bị đang gắn vào cổng nối tiếp của 8051. 
4.10 Sửa đổi lại lời giải của bài tập trên để treo và cho xuất tiếp lại ra màn hình dùng các mã 
XOFF và XON nhận được từ bàn phím. Tất cả các mã khác bị bỏ qua (chú ý: XOFF = 
CONTROL-S = 13H và XON=CONTROL-Q=11H). 
4.11 Giả sử cho trước các chương trình con INCHAR và OUTCHR, hãy viết chương trình nhập 
các ký tự từ bàn phím và và hiển thị chúng lại trên màn hình, đổi những ký tự chữ in thường 
sang chữ in hoa. 
4.12 Giả sử cho trước các chương trình con INCHAR và OUTCHR, hãy viết chương trình nhập 
các ký tự từ thiết bị đang gắn ở cổng nối tiếp 8051 và hiển thị chúng lại với dấu chấm (“.”) sẽ 
thay thế cho các ký tự điều khiển (có các mã ASCII 00H đến 1FH, và 7FH). 
4.13 Giả sử cho trước chương trình con OUTCHR, hãy viết chương trình xóa màn hình VDT 
đang gắn ở cổng nối tiếp 8051 và rồi gửi tên của bạn đến VDT 10 lần trên 10 dòng. Chức 
BT-VXL-Ch 3 – trang 16 
năng xóa VDT được thực hiện bằng cách truyền CONTROL-Z với nhiều terminal hoặc 
chuỗi ký tự thoát [2J trên terminal có hỗ trợ ANSI (American National Standards 
Institute). Sử dụng cả 2 phương pháp trong bài giải. 
4.14 Hình 3.32 trong sách minh họa kỹ thuật mở rộng khả năng xuất của 8051. Giả sử với cấu 
hình như vậy, hãy viết chương trình khởi động cổng nối tiếp với chế độ thanh ghi dịch và rồi 
ánh xạ nội dung của ô nhớ nội 20H ra 8 ngõ ra phụ, mỗi giây thực hiện 10 lần. 
Phần 5 – Ngắt (Interrupt) 
5.1 Cho biết nhiệm vụ của bit SMOD trong 8051? Hãy nêu các bước để thiết lập Timer dùng 
ngắt để trì hoãn (làm trễ) một khoảng thời gian nhất định? 
5.2 Hãy viết các lệnh để: a) cho phép ngắt nối tiếp, ngắt timer 0 và ngắt phần cứng bên ngoài 1; 
và b) cấm ngắt timer 0; và c) cấm tất cả các ngắt chỉ bằng 1 lệnh. 
5.3 Sau khi thực thi đoạn chương trình sau: 
MOV IE, #99H 
MOV IP, #10H 
a) Các ngắt nào được cho phép? 
 b) Ngắt nào có ưu tiên cao nhất? 
5.4 Thứ tự phục vụ các ngắt nhứ thế nào nếu tất cả các ngắt được cho phép xảy ra đồng thời? 
5.5 Trong 1 hệ dùng 8051 cho phép các ngắt /INT0, /INT1 và Timer 1 và cấm tất cả các ngắt 
khác. Nếu ngắt /INT1 tích cực thì sẽ tạo ra sóng vuông 500 Hz ở chân P1.0 (dùng ngắt Timer 
1). Sóng vuông này sẽ chấm dứt khi /INT0 tích cực. Viết đoạn chương trình khởi tạo trị cho 
các ngắt và đợi ngắt trong chương trình chính và các chương trình ISR. 
5.6 Viết chương trình lấy liên tục dữ liệu 8 bit từ P0 và gửi nó đến P1 trong khi đó đồng thời tạo 
ra sóng vuông có chu kỳ 200 µs ở chân P2.1 (sử dụng Timer 0 để tạo sóng vuông) 
5.7 Giả sử chân /INT1 được nối vào công tắc bình thường ở mức cao, khi chân này xuống mức 
thấp thì nó sẽ làm sáng đèn LED. Đèn LED này được nối vào chân P1.3 và bình thường thì 
tắt, khi có mức thấp ở /INT1 thì nó sẽ sáng trong khi /INT1 vẫn ở mức thấp. 
5.8 Giả sử chân /INT1 được nối vào bộ tạo xung, viết chương trình nhận biết khi có cạnh xuống 
của xung thì sẽ đặt bit P1.3 lên 1 và làm cho đèn LED gắn ở P1.3 sáng (vẽ mạch cứng). 
Nghĩa là LED sẽ sáng (ON) và tắt (OFF) cùng với tốc độ của xung đưa vào chân /INT1. 
5.9 Viết chương trình 8051 lấy dữ liệu từ P1 và gửi nó đến P2 liên tục, trong khi đó dữ liệu đến 
từ cổng nối tiếp được gửi đến P0. Giả sử tốc độ baud là 9600. 
5.10 Tạo sóng vuông 1 kHz ở chân P1.7 dùng ngắt. 
5.11 Tạo xung vuông 7 kHz với chu kỳ nhiệm vụ 30% chân P1.6 dùng ngắt. 
5.12 a) Viết chương trình phục vụ ngắt cho timer 0 để tạo xung vuông 500Hz có chu kỳ nhiệm vụ 
là 70% ở chân P1.0 
b) Tương tự a) nhưng chu kỳ nhiệm vụ là 40% và xung này chỉ tồn tại trong 10s. 
5.13 Hãy ghép chương trình “tạo sóng vuông bằng ngắt của timer” (trang 218) với chương trình 
“Xuất ký tự bằng ngắt” (trang 221) thành 1 chương trình. 
5.14 Hãy viết lại chương trình “Xuất ký tự bằng ngắt” (trang 221) sao cho gửi 1 ký tự/1 giây 
(hướng dẫn: sử dụng timer và xuất ký tự trong ISR của timer). 
Phần 6 – Assembler 
6.1 Hãy viết lại các lệnh sau với dạng dữ liệu tức thời là nhị phân: 
a) MOV A, #255 c) MOV A, #1AH 
b) MOV A, #11Q d) MOV A, #’A’ 
6.2 Có gì sai trong lệnh sau: ORL 80H, #F0H 
6.3 Hãy tìm các ký hiệu nào bị đặt tên sai: 
?byte.bit @GOOD_bye 1ST_FLAG MY_PROGRAM 
6.4 Hãy viết các lệnh tương đương các lệnh sau với dữ liệu tức thời là trị số hex: 
a) MOV DPTR, # ‘0’ EQ 48 c) MOV DPTR, #HIGH ‘AB’ 
b) MOV DPTR, # –1 d) MOV DPTR, #NOT (275 MOD 256) 
BT-VXL-Ch 3 – trang 17 
6.5 Sự khác biệt giữa DB và DW? 
6.6 Hãy ghi các giá trị ô nhớ của đoạn sau: 
ORG 0FH 
DW 5 SHL 4 
DB 65535 
DW ‘0’ 
6.7 Viết định nghĩa 1 macro dùng để điền 1 hằng số dữ liệu vào 1khối trong bộ nhớ dữ liệu 
ngoài. Truyền địa chỉ bắt đầu, chiều dài, và hằng số dữ liệu cho các tham số macro. 
6.8 Viết định nghĩa cho các macro sau: 
JGE – nhảy đến LABEL nếu thanh ghi tích lũy có trị >= VALUE 
JLT – nhảy đến LABEL nếu thanh ghi tích lũy có trị < VALUE 
JLE – nhảy đến LABEL nếu thanh ghi tích lũy có trị <= VALUE 
JOR – nhảy đến LABEL nếu thanh ghi tích lũy có trị ngoài tầm của đoạn từ LOWER đến 
UPPER. 
6.9 Viết định nghĩa 1 macro có tên là CJNE_DPTR mà sẽ nhảy đến nhãn LABEL nếu con trỏ dữ 
liệu không chứa giá trị VALUE. Định nghĩa macro sao cho nội dung của tất cả các thanh ghi 
và các ô nhớ không bị ảnh hưởng. 

File đính kèm:

  • pdfbai_tap_vi_xu_ly_chuong_3_ho_trung_my.pdf