Cho lệnh gọi chương trình con ACALL MAX chứa trong bộ nhớ chương trình bắt đầu từ địa chỉ 97FFH.. Cho đoạn chương trình 8051 sau: * Xác định nội dung thanh ghi A va B khi thực hiện xong
Trang 1ĐỀ THI HỌC KỲ 2 (2009-2010)
Môn thi: VI XỬ LÝ Thời gian làm bài: 110 phút
(SINH VIÊN ĐƯỢC SỬ DỤNG TÀI LIỆU)
HỌ TÊN: ……… MSSV: ……… NHÓM: ………
Câu 1: (2 điểm) Cho mạch phân vùng bộ nhớ của hệ thống vi xử lý 8051 sử dụng IC 74138 như hình vẽ Thiết kế mạch giải mã địa chỉ cho các tín hiệu chọn chip theo vùng địa chỉ: CS0 (ROM1): 8000H BFFFH CS1 (ROM2): D000H EFFFH
CS2 (RAM): B000H EFFFH CS3 (I/0): 8A00H 8BFFH
(Giải thích ngắn gọn và vẽ hình trực tiếp lên sơ đồ trên) ………
………
………
………
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 X X X X X X X X X X X X /Y0: 8000H 8FFFH
1 0 0 1 X X X X X X X X X X X X /Y1: 9000H 9FFFH
1 0 1 0 X X X X X X X X X X X X /Y2: A000H AFFFH
1 0 1 1 X X X X X X X X X X X X /Y3: B000H BFFFH
1 1 0 0 X X X X X X X X X X X X /Y4: C000H CFFFH
1 1 0 1 X X X X X X X X X X X X /Y5: D000H DFFFH
1 1 1 0 X X X X X X X X X X X X /Y6: E000H EFFFH
1 1 1 1 X X X X X X X X X X X X /Y7: F000H FFFFH
SINH VIÊN LÀM BÀI THI NGAY TRÊN ĐỀ - ĐỀ THI CÓ 6 TRANG
C
A (LSB) Y0
Y1 Y2 Y3 Y4 Y5 Y6 Y7 G2B
G2A G1
B
0 A15
A14 A13 A12
G2B
0
/CS0
/CS1
/CS2
A11 A10 A9 /CS3
Trang 2Trang 2 / 6
………
………
Câu 2: (3 điểm)
a Cho lệnh gọi chương trình con ACALL MAX chứa trong bộ nhớ chương trình bắt đầu từ
địa chỉ 97FFH
* Xác định phạm vi địa chỉ hợp lệ của chương trình con MAX? (Giải thích) (0,5đ)
PC = 97FFh + 2 = 9801h = 1001 1000 0000 0001b
Địa chỉ trang 2KB: 10011
Phạm vi địa chỉ ctcon MAX là 1001 1XXX XXXX XXXX = 9800h 9FFFh
* Nếu lệnh ACALL MAX có mã máy là B1H và 9EH thì chương trình con MAX có địa
B1h = 1 0 1 1 0 0 0 1 9Eh = 1 0 0 1 1 1 1 0
Địa chỉ ctcon MAX = địa chỉ trang _ địa chỉ 11 bit
= 1 0 0 1 1 1 0 1 1 0 0 1 1 1 1 0
= 9D9Eh
b Cho đoạn chương trình 8051 sau:
* Xác định nội dung thanh ghi A va B khi thực hiện xong đoạn chương trình này (0,5đ)
A = 88 = 0 1 0 1 1 0 0 0 B = 0 : ACC.0 = 0 : lặp vòng
A = 0 0 1 0 1 1 0 0 B = 1 : ACC.0 = 0 : lặp vòng
A = 0 0 0 1 0 1 1 0 B = 2 : ACC.0 = 0 : lặp vòng
A = 0 0 0 0 1 0 1 1 B = 3 : ACC.0 = 1 : kết thúc
MOV A, # 88 ; 1MC
MOV B, #0 ; 2MC
LP: JB ACC.0, KT (1) ; 2MC
INC B ; 1MC
SJMP LP (2) ; 2MC
KT: SJMP KT ; 2MC
Trang 3* Xác định mã máy của 2 lệnh: (1) và (2) (Giải thích) (0,5đ)
MOV A, # 88 ; 1MC
MOV B, #0 ; 2MC
LP: JB ACC.0, KT (1) ; 2MC - 3Byte : 20h, E0h, 05h(+5)
RR A ; 1MC - 1B
INC B ; 1MC - 2B
SJMP LP (2) ; 2MC - 2B : 80h, F8h (-8)
KT: SJMP KT ; 2MC - 2B
* Với tần số thạch anh là 4MHz, xác định thời gian thực hiện đoạn chương trình này (1,0đ)
(Giải thích)
Các lệnh trong vòng lặp LP thực hiện 3 lần, ngoài trừ lệnh (1) là 4 lần
Lệnh SJMP KT thực hiện ít nhất 1 lần
Thời gian thực hiện 1 + 2 + 2x4 + (1 + 1 + 2) x 3 + 2 = 25 MC
Với 1MC = 12/ 4MHz = 3 s => Tgian 75s
Câu 3: (1 điểm)
Cho chuỗi dữ liệu chứa các số hạng 16 bit (số nhị phân có dấu bù 2) chứa trong vùng RAM
ngoài có địa chỉ đầu là 4000H Nôi dung ô nhớ 3FFFH chứa số lượng các số hạng 16 bit Trong
chuỗi dữ liệu, mỗi số hạng 16 bit được chứa trong 2 ô nhớ có địa chỉ liên tiếp nhau (với ô nhớ có địa chỉ thấp chứa byte thấp) Viết chương trình tính số lượng các số hạng 16 bit là số dương và có
giá trị lẻ, kết quả cất vào ô nhớ 3FFEH
MOV DPTR, #3FFFH
MOVX A, @DPTR
MOV R7, A
MOV R6, # 0
MOV B, A
JB ACC.7, TT ; số âm
JNB B.0, TT ; số chẳn
INC R6 ; số dương và lẻ
TT: DJNZ R7, LAP
MOV DPTR, #3FFEH
(Cách khác:)
JNB ACC.0, CH ; số chẳn
JB ACC.7, TT ; số âm
INC R6 ; số dương và lẻ
SJMP TT
Trang 4Trang 4 / 6
Câu 4: (2 điểm)
Viết chương trình 8051 sử dụng ngắt ngoài INT1 và ngắt Port nối tiếp như sau:
- Ngắt ngoài INT1: cho phép ngắt theo cạnh xuống Mỗi lần có ngắt ngoài thì dịch 1 bit của thanh
ghi R7 ra chân port P1.7 Bit được dịch đầu tiên là bit trọng số nhỏ nhất (LSB) và sau khi dịch bit trọng số lớn nhất (MSB) thì chấm dứt ngắt ngoài
- Ngắt Port nối tiếp: khi thu được 1 byte thì xuất giá trị đó ra ngoại vi được ánh xạ như bộ nhớ dữ
liệu ngoài có địa chỉ là 8000H nếu giá trị thu được có giá trị từ 100 đến 200 Port nối tiếp sử dụng
UART 8 bit có tốc độ baud là 9600bps, tần số thạch anh là 11.059MHz
ORG 0000H
ORG 0013H
LJMP ISR_X1
ORG 0023H
LJMP ISR_SER
MAIN:
MOV TMOD, #20H
MOV TH1, # -3
SETB TR1
MOV SCON, #01010000B
MOV DPTR, #8000H
MOV A, R7
SETB IT1
MOV R6, #8
MOV IE, #10010100B
SJMP $
ISR_ X1:
MOV P1.7, C DJNZ R6, KT1
KT1: RETI
ISR_ SER:
CLR RI MOV A, SBUF CJNE A, #100, DK1
CJNE A, #201, DK2 DK2: JNC KT2
KT2: POP ACC
RETI
Trang 5Câu 5: (2 điểm) Sử dụng CCS điều khiển PIC
a Cho sơ đồ kết nối giữa PIC 16F84 với các LED như hình vẽ và chương trình điều khiển:
#include <16F84.h>
#fuses HS, NOWDT, NOPROTECT, PUT
#use delay(clock=8000000)
byte const LED[8]={0x0f,0x0e,0x0c,0x08,0x00,0x01,0x03,0x07}; main()
{
int8 count;
while(true) {
for(count=0;count<8;count++) {
output_A(LED[count]);
delay_ms(500);
} }
}
Khi thực hiện chương trình này, thì các đèn LED hoạt động ra sao? (Giải thích) (1,0 đ)
Count = 0: Xuất ra port A: LED[0] = 0Fh = 00001111b: cả 4 LED đều tắt
Count = 1: Xuất ra port A: LED[1] = 0Eh = 00001110b: LED0 sáng
Count = 2: Xuất ra port A: LED[2] = 0Ch = 00001100b: LED0, LED1 sáng
Count = 3: Xuất ra port A: LED[3] = 08h = 00001000b: LED0, LED1, LED2 sáng Count = 4: Xuất ra port A: LED[4] = 00h = 00000000b: cả 4 LED đều sáng
Count = 5: Xuất ra port A: LED[5] = 01h = 00000001b: LED0 tắt
Count = 6: Xuất ra port A: LED[6] = 03h = 00000011b: LED0, LED1 tắt
Count = 7: Xuất ra port A: LED[7] = 07h = 00000111b: LED0, LED1, LED2 tắt
Lặp vòng lại với Count = 0
V cc
16F84
RA0
RA1
RA2
RA3
LED0
LED1
LED2
LED3
Trang 6Trang 6 / 6
Đèn LED sáng dần và tắt dần theo thứ tự LED0, LED1, LED2, LED3 Giữa mỗi lần là delay 0,5 giây
b Viết chương trình điều khiển PIC 16F84 có nhiệm vụ liên tục kiểm tra chân port RB0:
- Nếu RB0 = 0 thì tạo sóng vuông tần số 4KHz ở chân port RB6
- Nếu RB0 = 1 thì tạo sóng vuông tần số 50Hz ở chân port RB7
Chú ý khi tạo sóng vuông ở chân port này thì chân port kia ở mức 0 (1,0 đ)
#include <16F84.h>
#fuses HS, NOWDT, NOPROTECT, PUT
#use delay(clock=8000000)
#use fast_io(B)
main()
{
Set_tris_B(0b00000001);
For (;;)
{ If (input(pin_B0))
{
Output_low(pin_B6);
Output_togle(pin_B7);
Delay_ms(10);
} Else
{
Output_low(pin_B7);
Output_togle(pin_B6);
Delay_s(125);
} }
}
Ngày 23 tháng 06 năm 2010 Sóng vuông tần số 4KHz có chu kỳ là 250s Sóng vuông tần số 50Hz có chu kỳ là 20ms
Trang 7Bộ môn Điện tử
HỒ TRUNG MỸ