Tải bản đầy đủ (.docx) (27 trang)

bài tập vi sử lý vi điều khiển

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (429.79 KB, 27 trang )

Chương 1. Chương 1
(N.T.Linh-32)
1.1. Hãy chuyển đổi các số nguyên dương thập phân sau đây ra nhị phân 1 byte:
112, 21, 32, 45, 92 , 156, 231, 143, 69.
1.2. Hãy chuyển đổi các số nguyên dương thập phân sau đây ra hệ thập lục phân :
41,39,58,91,146, 246, 99,88, 140,177.
1.3. Hãy chuyển đổi các số nhị phân 1 byte sau đây ra số thập phân:
0101 01100 , 0101 1110 , 0101 1100 , 0111 0111 , 0101 1110 , 0101 1001.
1.4. Hãy chuyển đổi các số nhị phân 1 byte sau đây ra số thập lục phân:
0101 01100 , 0101 1110 , 0101 1100 , 0111 0111 , 0101 1110 , 0101 1001.
1.5. Hãy chuyển đổi các số thập lục phân sau đây ra thập phân : AF , 20 , A5 , CF , B8 , D9 ,
E5 .
1.6. Hãy chuyển đổi các số thập lục phân sau đây ra nhị phân : AF , 20 , A5 , CF , B8 , D9 ,
E5 .
1.7. Hãy chuyển đổi các số thực biểu diễn dạng thập phân sau đây ra nhị phân :
112.18 , 21.25 , 32.04, 45.625, 92.40 , 156.2, 231.5 , 143.60 , 69.32
1.8. Hãy chuyển đổi các số thực biểu diễn dạng nhị phân sau đây ra số thập phân:
0101 01100.011 , 0101 1110.0011 , 0101 1100.011 , 0111 0111.1101 , 0101 1110.0111 , 0101
1001.0011
1.9. Hãy chuyển đổi các số thập lục phân lẻ sau đây ra thập phân :
AF.22 , 20.E , A5.2F , CF.04 , B8.9 , D9.E , E5.A
1.10. Đổi các số sau từ hệ thập phân sang hệ nhị phân:
a) 28; b) 89; c) 294
d) 34,5; e) 55,25; f) 46,3125
1.11. Đổi các số sau từ hệ nhị phân sang hệ thập phân:
a) 11001; b) 111001
c) 10111011; d) 10001001
1.12. Biểu diễn các số sau dùng dấu và độ lớn (8 bit):
a) +69; b) +105; c) -28; d) -121
1.13. Biểu diễn các số sau dùng dấu và độ lớn (16 bit):
a) +109; b) +105; c) -98; d) -101


1.14. Biểu diễn các số sau dùng mã bù 2 (8 bit - không dấu):
a) 57; b) 48; c) 98; d) 111
1.15. Biểu diễn các số sau dùng mã bù 2 (8 bit - có dấu):
a) +57; b) +48; c) -98; d) -31
1.16. Biểu diễn các số sau dùng mã bù 2 (16 bit - không dấu):
a) 157; b) 108; c) 128; d) 35
1.17. Biểu diễn các số sau dùng mã bù 2 (16 bit - có dấu):
a) 137; b) 119; c) -113; d) -53
1.18. Có các biểu diễn sau (dùng dấu và độ lớn), hãy xác định giá trị của chúng:
a) 0100 1011 b) 1001 1100
c) 0000 0000 1001 0010; d) 1000 0000 0110 1100
1.19. Có các biểu diễn sau (dùng mã bù 2 - không dấu), hãy xác định giá trị:
a) 0100 001 b) 1010 0100
c) 0000 0000 1001 0010; d) 1000 0000 0010 0100
1.20. Có các biểu diễn sau (dùng mã bù 2 - có dấu), hãy xác định giá trị của chúng:
a) 0100 1011 b) 1101 1100
c) 0000 0000 0101 0011; d) 1111 1111 1110 1110
1.21. Cho biết kết quả khi thực hiện trên máy tính các phép cộng sau (8 bit) và giải thích:
a) 56 + 78 (không dấu); b) 121 + 40 (không dấu)
c) 68 + 40 (có dấu) ; d) 67 + (-100) (có dấu)
e) 102 + 88 (có dấu); f) (-80) + (-62) (có dấu)
1.22. Sử dụng thuật toán dời bít của Booth thực hiện các phép nhân sau đây
a) 11*13 ; b) 12*13 ; c) 9*11 ; d) 10*11
1.23. Hãy chuyển các số thập phân sau đây ra số nhị phân BCD :
a) 235 ; b) 647 ; e) 568 f) 729
1.24. Hãy chuyển các số nhị phân BCD ra số thập phân sau đây :
a) 1001 0011 0111 ; 0111 1000 0101 0110 ; 0101 1001 0011 0110
1.25. Hãy chuyển các số thập phân sau đây ra số nhị phân BCD rồi cộng theo nhị phân. Kết
quả chuyển sang số thập phân.
a) 123 + 456 ; 348 +241 ; 532 + 461 ; 255 + 433.

1.26. Tính tổng sau: 4A9Bh + 97A2h
1.27. Đổi các giá trị sau thành byte
a. 2KB
b. 4MB
c. 128MB
d. 1GB
1.28. Đổi các giá trị sau thành bit
a. 2KB
b. 4MB
c. 128MB
d. 1GB
1.29. Cho các s ố nhị phân sau, hãy xác đị nh giá trị c ủ a chúng n ếu chúng là (i) s ố nhị
phân không dấu; (ii) s ố nhị phân có dấu
a. 0000B
b. 0001B
c. 0111B
d. 1000B
e. 1001B
f. 1110B
g. 1111B
1.30. Thực hiện các phép toán sau trên số nhị phân có dấu 8 bit và cho biết kết quả có bị
tràn hay không
a. 15+109
b. 127-64
c. 64+64
d. -32-96
1.31. Xác định độ lớn các vùng không gian bộ nhớ có tầm địa chỉ:
a. 0000H – FFFFH
b. 000000H – FFFFFFH
c. 14000000H – 17FFFFFFH

d. 00000000H – FFFFFFFFH
1.32. Cho kích thước vùng nhớ là 862kB. Địa chỉ bắt đầu là 0, tính địa chỉ kết thúc viết
dạng hexa.
Chương 2. Chương 2
(T.Anh,Nhung)
2.1. Giải thích các lệnh sau:
MOV AL,5Bh
MOV BL,0ADh
ADD AL,BL
Hãy chỉ ra trạng thái của các cờ trong thanh ghi cờ sau khi thực hiện các lệnh trên.
2.2. Giải thích các lệnh sau:
MOV AX,170Fh
MOV BX,80EBh
ADD AX,BX
Hãy chỉ ra trạng thái của các cờ trong thanh ghi cờ sau khi thực hiện các lệnh trên.
2.3. Giải thích các lệnh sau:
MOV AL,41h
MOV BL,50h
CMP AL,BL
Hãy chỉ ra trạng thái của các cờ trong thanh ghi cờ sau khi thực hiện các lệnh trên.
2.4. Giải thích các lệnh sau:
MOV AX,3D85h
MOV BX,2CFEh
CMP AX,BX
Hãy chỉ ra trạng thái của các cờ trong thanh ghi cờ sau khi thực hiện các lệnh trên.
2.5. Giải thích cách xác định địa chỉ vật lý của một ô nhớ trong bộ nhớ.
- Giả sử địa chỉ một ô nhớ được xác định qua thanh ghi đoạn DS và thanh ghi lệch BX với DS=0F35h,
BX=150Dh. Hãy xác định địa chỉ vật lý và địa chỉ logic của ô nhớ trên. Ô nhớ trên thuộc đoạn nào
trong bộ nhớ.
2.6. Giải thích cách xác định địa chỉ vật lý của một ô nhớ trong bộ nhớ.

- Giả sử địa chỉ một ô nhớ được xác định qua thanh ghi đoạn CS và thanh ghi lệch IP với CS=4530h,
IP=49A6h. Hãy xác định địa chỉ vật lý và địa chỉ logic của ô nhớ trên. Ô nhớ trên thuộc đoạn nào
trong bộ nhớ.
2.7. Giải thích cách xác định địa chỉ vật lý của một ô nhớ trong bộ nhớ.
- Giả sử địa chỉ một ô nhớ được xác định qua thanh ghi đoạn ES và thanh ghi lệch DI với ES=1793h,
DI=2004h. Hãy xác định địa chỉ vật lý và địa chỉ logic của ô nhớ trên. Ô nhớ trên thuộc đoạn nào
trong bộ nhớ.
2.8. Giải thích cách xác định địa chỉ vật lý của một ô nhớ trong bộ nhớ.
- Giả sử địa chỉ một ô nhớ được xác định qua thanh ghi đoạn SS và thanh ghi lệch SP với SS=11080,
SP=2004. Hãy xác định địa chỉ vật lý và địa chỉ logic của ô nhớ trên. Ô nhớ trên thuộc đoạn nào trong
bộ nhớ.
2.9. Giả sử có một ngăn xếp có địa chỉ đáy là FFFEh.
- Hãy giải thích và xác định địa chỉ đỉnh của ngăn xếp sau khi thực hiện đẩy vào các giá trị sau:
05F3h, 4D3Ch,796Ah,418Bh
- Giải thích và xác định địa chỉ đỉnh của ngăn xếp và giá trị của các thanh ghi AX, BX, CX, DX sau
khi thực hiện các lệnh:
POP DX
POP AX
POP BX
POP CX
2.10. Giải thích các lệnh trong đoạn chương trình sau:
MOV AX,5729h
MOV BX,922Dh
MOV CX,723Fh
PUSH AX
PUSH BX
PUSH CX
POP AX
POP CX
POP BX

ADD AX,BX
ADD BX,CX
Hãy cho biết giá trị của các thanh ghi AX, BX, CX sau khi thực hiện các lệnh này.
2.11. Giải thích các lệnh trong đoạn chương trình sau:
MOV AX,02B5h
MOV CX,5
SHL AX,CX
Hãy cho biết giá trị của thanh ghi AX sau mỗi lần dịch
2.12. Giải thích các lệnh trong đoạn chương trình sau:
MOV AX,0446h
MOV CX,4
SHR AX,CX
Hãy cho biết giá trị của thanh ghi AX sau mỗi lần dịch
2.13. Giải thích các lệnh trong đoạn chương trình sau:
MOV AX,2534
MOV BX,5000
MUL BX
Sau khi thực hiện các lệnh trên, kết quả sẽ được đưa vào các thanh ghi nào? Giá trị của các thanh ghi
đó là bao nhiêu?
2.14. Giải thích các lệnh trong đoạn chương trình sau:
MOV AL,7Fh
MOV BL,13h
MUL BL
Sau khi thực hiện các lệnh trên, kết quả sẽ được đưa vào các thanh ghi nào? Giá trị của các thanh ghi
đó là bao nhiêu?
2.15. Giải thích các lệnh trong đoạn chương trình sau:
MOV AX,2500
MOV BL,50
DIV BL
Sau khi thực hiện các lệnh trên, kết quả sẽ được đưa vào các thanh ghi nào? Giá trị của các thanh ghi

đó là bao nhiêu?
2.16. Giải thích các lệnh trong đoạn chương trình sau:
MOV DX,6400
MOV AX,2000
MOV BX,10000
DIV BX
Sau khi thực hiện các lệnh trên, kết quả sẽ được đưa vào các thanh ghi nào? Giá trị của các thanh ghi
đó là bao nhiêu?
2.17. Hãy giải thích và chỉ ra chế độ địa chỉ của các lệnh sau:
a/ MOV AX,058Dh b/ MOV AL,[BX] c/ MOV AX,[BP]+[SI]+0100h d/ MOV BL,
[0653h] e/ MOV AX,[SI]+50 f/ ADD DX,53h[BX][SI]
g/ ADD AL,3Bh[SI] h/ MOV BX,7Ch[BP] i/ SUB AL,BL
j/ AND AX,[BX+10] k/ OR CX,[DI+30h]
2.18. Giải thích các lệnh trong đoạn chương trình sau:
Nhap:
MOV AH,1
INT 21h
CMP AL,41h
JL nhap
CMP AL,5Ah
JG nhap
SUB AL,20h
MOV DL,AL
MOV AH,2
INT 21h
2.19. Thanh ghi AX bằng bao nhiêu sau khi thực hiện những câu lệnh sau.
MOV AX, Array1
INC AX
ADD AH, 1
SUB AX, Array1




Array1 DW 10h, 20h
Array2 DW 30h, 40h
2.20. Khi thực hiện câu lệnh sau, hãy điền giá trị HEX thích hợp vào chỗ trống
MOV BX, Array2 ; BX= ….
XCHG AX, BX ; AX= ….
INC AX ; AX=….
ADD Array2, Array1 ; Array2=
SUB AX, Array1 ; AX=….
SUB BH, BL ; BX= ….
….
….
Array1 DW AAh, BBh
Array2 DW 01h, 02h
2.21. Khi thực hiện câu lệnh sau, hãy điền giá trị HEX thích hợp vào chỗ trống
MOV AX, Array1 ; AX= ….
XCHG Array2, AX ; AX= ….
DEC AX ; AX=….
SUB Array2, 2 ; Array2=
MOV BX, Array2 ; AX=….
ADD AH, BL ; AX= ….
….
….
Array1 DW 20h, 10h
Array2 DW 30h, 40h
2.22. Khi thực hiện câu lệnh sau, hãy điền giá trị HEX thích hợp vào chỗ trống
ADD AX, 0123H ; AX= ….
PUSH AX ;

POP BX
AX= ….
BX
SUB AX, BX ; AX=….
SUB Array2, 2 ; Array2=
MOV BX, Array2 ; AX=….
ADD AH, BL ; AX= ….
….
….
Array1 DB 1Fh, 62h
Array2 DB 2Fh, 49h
2.23. Khi thực hiện câu lệnh sau, hãy điền giá trị HEX thích hợp vào chỗ trống
ADD AX, 0123H ; AX= ….
PUSH AX ;
POP BX
AX= ….
BX
SUB AX, BX ; AX=….
SUB Array2, 2 ; Array2=
MOV BX, Array2 ; AX=….
ADD AH, BL ; AX= ….
….
….
Array1 DB 1Fh, 62h
Array2 DB 2Fh, 49h
2.24. Xác định giá trị trong thanh ghi AL và BL sau khi thực hiện xong đoạn chương
trình sau
org 100h
MOV AL, -52
MOV BL, -42

SAR AL, 4
IMUL BL
SAL AL, 2
RCR AL, 1
SAR BL, 5
RET
2.25. Xác định giá trị trong thanh ghi AX và BX sau khi thực hiện xong đoạn
chương trình sau
org 100h
MOV AL, -55
MOV BL, 23
SHR AL, 2
IMUL BL
SAL AL, 2
RCR AL, 1
SHR BL, 4
RCR BL, 2
RET
2.26. Xác định giá trị trong thanh ghi AX và BX sau khi thực hiện xong đoạn
chương trình sau
org 100h
MOV AL, -5
MOV BL, -12
SHR AL, 2
IMUL BL
SAL AL, 2
ADD BL, AL
RCR AL, 1
SHR BL, 4
RCR BL, 2

RET
2.27. Xác định giá trị trong các thanh ghi AX, BX, CX, DX sau khi thực hiện xong
đoạn chương trình sau:
org 100h
mov AX, 1122h ;
mov BX, 0A3Dh ;
mov CX, 80A1h ;
mov DX, 1357h ;
start:
ADD AL, BL
SUB BL, AL
CMP AL, BL
JA TA1
XOR DX, CX
JMP OK
TA1:OR DX, CX
JMP OK
OK:
ret
2.28. Xác định giá trị trong các thanh ghi AX, BX, CX, DX sau khi thực hiện xong
đoạn chương trình sau:
org 100h
mov AX, 1234h;
mov BX, 5678h;
mov CX, 2468h;
mov DX, 1357h;
start:
PUSH AX
PUSH BX
PUSH CX

PUSH DX
ADD AX, BX
DEC CX
POP BX
DIV BL
POP BX
ADD AX, BX
POP CX
INC CX
POP DX
SUB DX, AX
MUL DL
RET
2.29. Sau khi thực hiện đoạn chương trình, thanh ghi BX có giá trị bằng bao nhiêu
org 100h
mov AX,0
Mov BX,0
mov al, 5
mov bl, 10h
add bl, al
xor bl, 55h
2.30. Sau khi thực hiện đoạn chương trình, thanh ghi AX có giá trị bằng bao
nhiêu ?
org 100h
mov AX,0
Mov BX,0
mov al, 5
mov bl, 10h
add al, bl
xor bl, 55h

2.31. Sau khi thực hiện đoạn chương trình :
mov al, 5
mov bl, 10
add bl, al
sub bl, 1
Giá trị trong thanh ghi BL bằng bao nhiêu ?
2.32. Sau khi thực hiện đoạn chương trình :
mov al, 5
mov bl, 10
add bl, al
sub bl, 1
Giá trị trong thanh ghi AL bằng bao nhiêu ?
2.33. Giả sử cho: AX=1000H; BX=2000H; CX=3000H. Sau khi thực hiện các lệnh:
PUSH AX
PUSH BX
PUSH CX
POP AX
POP BX
POP CX
Cho biết giá trị trong các thanh ghi AX, BX, CX
2.34. Giả sử cho: AX=FF00H; BX=0001H; CX=1000H. Sau khi thực hiện các lệnh:
PUSH CX
PUSH BX
PUSH AX
POP AX
POP BX
POP CX
Cho biết giá trị trong các thanh ghi AX, BX, CX
2.35. Giả sử cho: AX=1234H; BX=3456H; DX=1111H. Sau khi thực hiện các lệnh:
MOV AX, CX

PUSH BX
PUSH AX
POP AX
POP BX
POP DX
Cho biết giá trị trong các thanh ghi AX, BX, CX
2.36. Xác định nội dung của các thanh ghi AX, BX và các ô nhớ1000h, 1001h,
1002h, 1003h sau khi thực thi các đoạn chương trình sau:
a. MOV AX,1000h
MOV BL,7
MOV BH,0F0h
AND BH,AH
MOV WORD PTR DS:[1000h],0F0h
MOV BYTE PTR DS:[1002h],0Fh
MOV AX,DS:[1001h]
MOV AL,DS:[1002h]
b. MOV AX,1234h
MOV BX,0AAAAh
MOV CH,AL
MOV CL,AH
MOV DS:[1000h],AX
MOV DS:[1002h],BX
c. MOV AX,12h
MOV DS:[1001h],AX
MOV BX,AX
ADD BH,10h
MOV DS:[1002h],BH
HD: xác định các chế độ địa chỉ được sử dụng trong mỗi ý
2.37. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
if ( (AL>=0x41) && (AL<=0x5A) )

AL=AL+0x20;
Hãy chuyển đoạn chương trình trên thành mã lệnh gợi nhớ của bộ vi xử lý 8086.
2.38. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
if ( (AL=0x43) | (AL=0x63) )
printf(chr(AL));
Hãy chuyển đoạn chương trình trên thành mã lệnh gợi nhớ của bộ vi xử lý 8086.
2.39. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
for (AL=100; AL> 0;AL )
AL=AL+50;
Hãy chuyển đoạn chương trình trên thành mã lệnh gợi nhớ của bộ vi xử lý 8086.
2.40. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
AX=1000;
WHILE (AX > 0) {AX=AX-100;}
Hãy chuyển đoạn chương trình trên thành mã lệnh gợi nhớ của bộ vi xử lý 8086.
2.41. Giả sử có một đoạn chương trình C++ được thực hiện như sau:
AL=0x61;
CX=0x1A;
do{
AL=AL-0x20;
printf(chr(AL));
CX=CX-1;
while ( CX>0);
Hãy chuyển đoạn chương trình trên thành mã lệnh gợi nhớ của bộ vi xử lý 8086.
2.42. Viết chương trình nhập vào từ bàn phím 1 kí tự. Kiểm tra xem, nếu kí tự đó
là chữ cái hoa hoặc thường thì in ra màn hình.
2.43. Viết chương trình nhập vào từ bàn phím 1 kí tự. In kí tự đó ra toàn màn
hình.
2.44. Viết chương trình in ra màn hình các kí tự trong bảng mã ASCII.
2.45. Viết chương trình nhập vào hai số nguyên. In ra màn hình tổng, hiệu, tích,
thương của hai số đó.

2.46. Viết chương trình nhập vào từ bàn phím một mảng. Sắp xếp mảng theo thứ
tự tăng dần, giảm dần.
2.47. Viết chương trình nhập vào một mảng. Tìm min, max của mảng và in ra màn
hình.
2.48. Viết chương trình nhập vào một xâu kí tự. In xâu kí tự theo chiều ngược lại.
2.49. Viết chương trình nhập vào một xâu họ và tên. Tách tên và in ra màn hình.
2.50. Viết chương trình nhập vào 3 số thực a,b,c.
Giải và biện luận phương trình bậc 2: ax
2
+ bx +c =0.
2.51. Viết chương trình trong C/C++ thực hiện xóa màn hình, tính tổng, hiệu, tích
thương của hai số nhập vào từ bàn phím (Các thao tác này thực hiện bằng mã lệnh
của ASSEMBLY)
2.52. Viết chương trình liên kết giữa ASSEMBLY và C/C++ thực hiện tìm min, max
của một mảng; sắp xếp mảng.
2.53. Viết các chương trình con thực hiện các thao tác cơ bản (tùy giáo viên ra cụ
thể).
2.54. Viết các MACRO thực hiện các thao tác cơ bản (tùy giáo viên ra cụ thể).
2.55. Điền giá trị vào (…) để chương trình thực hiện việc in một chuỗi ký tự màn
hình?
MODEL SMALL
.STACK 100h
.DATA
msg ….
.CODE
main PROC
MOV AX,@DATA ;
MOV DS,AX
MOV AX,… ;
INT …

MOV …,02h ;
MOV …,0C15h ;
INT …
LEA DX,… ;
MOV AH,… ;
INT …
MOV AH,4Ch ;
INT 21h
main ENDP
END main
HD: quan tâm đến các ngắt sử dụng trong chương trình
2.56. *Viết chương trình in giá trị trong thanh ghi đa năng ra màn hình dưới
dạng số nhị phân.
HD: dựa vào thuật toán đổi một số từ hệ mười sang hệ 2 và sử dụng hàm 01h
của ngắt 21h
2.57. *Viết chương trình in giá trị trong thanh ghi đa năng ra màn hình dưới dạng
số thập phân.
HD: dựa vào thuật toán đổi một số từ hệ 2 sang hệ 10 và sử dụng hàm 01h của
ngắt 21h
2.58. *Viết chương trình in giá trị trong thanh ghi đa năng ra màn hình dưới dạng
số hệ 16.
HD: dựa vào thuật toán: lấy số cần đổi chia cho 10, nếu số dư nhỏ hơn hoặc 9
thì in ra màn hình, còn số dư lớn hơn 9 và nhỏ hoặc bằng 15 thì lấy số dư cộng
với 37H. Sử dụng hàm 01h của ngắt 21h
2.59. *Viết chương trình nhập một số hệ thập phân có 3 chữ số vào thanh ghi đa
năng
HD: dựa vào thuật toán: chia số cần chuyển cho 10, lấy số dư chuyển vào thanh
ghi và sử dụng hàm 02h của ngắt 21h để nạp vào thanh ghi
2.60. *Viết chương trình nhập một số hệ nhị phân có 8 chữ số vào thanh ghi AL
HD: sử dụng các lệnh dịch quay

2.61. *Viết chương trình nhập một số hệ hexa có 4 chữ số vào thanh ghi AX
2.62. *Khai báo ba mảng A, B, C kích thước 10 phần tử, mỗi phần tử có kích thước
1 byte, giá trị khởi tạo tùy ý. Hãy viết chương trình thực hiện C=A+B
2.63. *Viết chương trình nhập một xâu, độ dài 5 ký tự, in ra màn hình xâu đó dưới
dạng chữ hoa.
2.64. Thực hiện nhập vào từ bàn phím một kí tự, nếu không phải là ký tự số thì
nhập lại. Sau đó hiển thị ký tự vừa nhập trên dòng tiếp theo.
2.65. Thực hiện nhập vào từ bàn phím 2 ký tự trong đó phải có 1 ký tự là số, 1 ký
tự là chữ in thường.
2.66. Thực hiện nhập vào 2 số tự nhiên nhỏ hơn 10. Tìm số lớn nhất trong 2 số và
in kết quả ra màn hình trên dòng tiếp theo.
2.67. Thực hiện nhập vào 2 số tự nhiên nhỏ hơn 10. Tìm số nhỏ nhất trong 2 số và
in kết quả ra màn hình trên dòng tiếp theo.
2.68. Thục hiện nhập vào từ bàn phím một chữ cái in thường 'ch' và in ra các chữ
in thường từ 'a' đến 'ch'.
2.69. Thục hiện nhập vào từ bàn phím một chữ cái in thường 'ch' và in ra các chữ
in thường từ 'ch' đến 'z'.
2.70. Thực hiện nhập vào từ bàn phím 1 số tự nhiên N (N<10), tính tổng các số
nguyên tử N đến 10 và lưu kết quả vào thanh ghi BX.
2.71. Thực hiện nhập vào từ bàn phím 1 ký tự là chữ cái in hoa, sau đó đếm số
lượng bit 1 trong biểu diễn nhị phân mã ASCII của ký tự vừa nhập.
2.72. Cho trước 2 chữ cái in hoa ch1 và ch2 (ch1<ch2), thực hiện đếm số chữ cái
trong đoạn từ ch1 đến ch2 và lưu kết quả vào thanh ghi BX.
2.73. Cho trước 2 chữ thường ch1 và ch2 (ch1<ch2), thực hiện đếm số chữ cái
trong đoạn từ ch1 đến ch2 và lưu kết quả vào thanh ghi BX.
2.74. Nhập vào một chuỗi ký tự bất kỳ từ bàn phím, và nhập vào một ký tự ch bất
kỳ. Đếm số lượng ký ch trong chuỗi và lưu kết quả vào AX
2.75. Nhập vào một chuỗi ký tự bất kỳ từ bàn phím, đếm số lượng ký tự là chữ cái
và nhập vào AX, số lượng ký tự là số nhập vào thanh ghi BX
2.76. Thực hiện nhập vào một số tự nhiên N<8, tính N! và lưu kết quả vào BX.

2.77. Thực hiên in dạng biểu diễn nhị phân của thanh ghi BX.
2.78. Cho trước 2 số tự nhiên trong 2 thanh ghi AX và BX. kiểm tra số nhỏ nhất
nằm trong thanh ghi nào?
2.79. Cho trước 2 số tự nhiên trong 2 thanh ghi AX và BX, kiểm tra số lớn nhất
nằm trong thanh ghi nào?
2.80. Cho trước 2 số tự nhiên trong 2 thanh ghi AX và BX, kiểm tra hiệu của 2 số,
nếu có trị tuyệt đối nhỏ hơn 10 thì in trị tuyệt đối ra màn hình, ngược lại in kết quả
vào thanh ghi DX.
2.81. Thực hiện nhập một số tự nhiên N (N<65536)vào từ bàn phím và lưu kết quả
vào thanh ghi BX.
2.82. Cho trước một số tự nhiên trong thanh ghi BX, in biểu diễn thập phân của số
tự nhiên đó.
2.83. Cho trước một số tự nhiên trong thanh ghi BX, in biểu diễn thập lục phân của
số tự nhiên đó.
2.84. Cho trước một số tự nhiên trong thanh ghi BX, in biểu diễn bát phân của số
tự nhiên đó.
2.85. Cho một xâu S gồm các chữ cái in thường, tạo ra sâu S1 là xâu chứa các chữ
cái in hoa của xâu S và in xâu S1 ra màn hình.
2.86. Cho một xâu ký tự S, tạo ra xâu S1 là xâu đảo ngược của xâu S và in xâu S1
ra màn hình.
2.87. Cho 2 xâu ký tự S1 và S2, kiểm tra xem S1 và S2 có bằng nhau hay không?
2.88. Cho xâu ký tự S, kiểm tra xem S có phải là xâu đối xứng hay không?
2.89. Cho xâu ký tự S, đếm số ký tự là chữ số có trong S.
2.90. Nhập vào từ bàn phím một xâu ký tự và lưu độ dài của xâu vào thanh ghi
BX.
2.91. Cho xâu ký tự S độ dài l, tạo ra xâu S1 từ xâu S bằng cách lấy trong S từ vị trí
thứ i(0<i<l) n ký tự (0<n<l-i).
2.92. Thực hiện nhập một ký tự ch vào từ bàn phím và in ra màn hình 10 dòng,
mỗi dòng chưa 10 kí tự ch.
2.93. Cho xâu ký tự S, thực hiện tạo xâu S1 từ xâu S bằng cách loại bỏ trong xâu S

các ký tự là dấu cách.
2.94. Cho xâu ký tự S, nhập từ bàn phím một ký tự ch và kiểm tra xem ch có trong
xâu S hay không?
2.95. Cho xâu ký tự S, đếm số lượng ký tự 'A' có trong xâu S.
2.96. Cho xâu ký tự S, tính tổng của các ký tự số có trong xâu S và lưu kết quả vào
thanh ghi BX.
Chương 3. Chương 3:
(T.Anh, Nhung)
3.1. Nếu thanh ghi A được sử dụng để chứa kết quả của các phép toán, hãy cho biết giá
trị của thanh ghi A sau khi thực hiện các phép toán sau:
a. 6Ah+0Fh
b. A8h+CDh
c. 9Ch-5Fh
d. AFh-7Dh
e. 1Fh*EDh
f. 10h*1Fh
3.2. Câu 2. Nếu thanh ghi B được sử dụng để chứa kết quả của các phép toán, hãy cho
biết giá trị của thanh ghi B sau khi thực hiện các phép toán sau:
a. 0110 1010b+1111b
b. 1010 1000b+1100 1101b
c. 1001 1100b-0101 111b
d. 1010 1111b-0111 1101b
e. 0001 1111b*1110 1101b
f. 0001 0000b*0001 1111b
3.3. Câu 3. Nếu thanh ghi Avà B được sử dụng để chứa kết quả của các phép toán, hãy
cho biết giá trị của 2 thanh ghi sau khi thực hiện các phép toán sau:
a. ABh*Fh
b. 10h*1Ah
c. CFh*2Ch
d. 10h*Abh

e. CDE0h/10h
f. 1F2Dh/8Ah
3.4. Câu 4.Cho biết giá trị (ở dạng hexa) của thanh ghi PSW nếu muốn sử dụng
a. Bank 0
b. Bank 1
c. Bank 2
d. Bank 3
Các Bit khác mặc định bằng 0
3.5. Câu 5.Cho biết giá trị (ở dạng hexa) của thanh ghi PSWsau khi thực hiện các phép
toán sau
a. FFh+FFh
b. 80h+80h
c. 80h-01h
d. FFh+01h
e. ABh-80H
f. F0H-10h
3.6. Câu 6. Nếu chuyển các giá trị sau đây vào thanh ghi A, thanh ghi PSW có giá trị
bằng bao nhiêu
a. A=F0h
b. A=ABh
c. A=00h
d. A=FFh
Các bit không chịu ảnh hưởng có giá trị mặc định
3.7. Câu 7. Nếu chuyển các giá trị sau đây vào thanh ghi A, thanh ghi PSW có giá trị
bằng bao nhiêu nếu thanh ghi A chưa kết quả của phép toán
a. A=A9h+1h
b. A=9Ah+1h
c. A=AAh+1
d. A=99H+1
3.8. Câu 8: Cho biết giá trị (ở dạng hexa) của thanh ghi PSWsau khi thực hiện các phép

toán sau
a. 7Fh+7Fh
b. 80h-01h
c. 6Ah+80h
d. ABh+CDh
3.9. Câu 8: Nếu gán cho PSW giá trị sau, những bank thanh ghi nào được chọn:
a. PSW=C8H
b. PSW=50H
c. PSW=10H
1. Các chế độ địa chỉ:
3.10. Câu 9. Cho trước bảng sau:
Lệnh 8051 Cách định địa chỉ của toán hạng
Thứ nhất Thứ hai
ORG 0
MOV R0,#30H
MOV R1,#10
CLR A
MOV R2,A
MOV R3,A
Loop: MOV A,@R0
JB ACC.7,Neg
INC R3
SJMP Cont
Neg: INC R2
Cont:INC R0
DJNZ R1,Loop
SJMP $
END
Điền vào các chỗ trống trong cột các cách địa chỉ cho toán hạng thứ nhất và thứ 2.
3.11. Câu 10. Cho trước bảng sau:

Lệnh 8051 Cách định địa chỉ của toán hạng
Thứ nhất Thứ hai
ORG 0
LJMP Start
ORG 0A80H
Start: MOV SP,#70H
MOV R2,#1CH
MOV A,#28H
MOV R0,#0C7H
PUSH 2
PUSH 0
ADD A, R2
POP 1
ADD A, R1
POP 0
MOV A, R3
ADD A, R0
SJMP $
END
Điền vào các chỗ trống trong cột các cách địa chỉ cho toán hạng thứ nhất và thứ 2.
3.12. Câu 11.Viết chương trình để sao chép giá trị 55H vào ngăn nhớ RAM tại địa
chỉ 40H đến 44H sử dụng:
a. Chế độ đánh địa chỉ trực tiếp
b. Chế độ đánh địa chỉ gián tiếp thanh ghi không dùng vòng lặp
3.13. Câu 12. Xác định chế độ địa chỉ để cộng nội dung của 2 ô nhớ 30h và 31h, kết
quả lưu vào ô nhớ 32h trong RAM nội
3.14. Câu 13. Xác định chế độ địa chỉ để cộng nội dung của 2 ô nhớ 30h và 31h, kết
quả lưu vào thanh ghi A trong RAM nội
3.15. Câu 14. Xác định chế độ địa chỉ để cộng nội dung của 2 thanh ghi R1 với R2,
kết quả ghi vào ô nhớ 30h

3.16. Câu 15. Xác định chế độ địa chỉ để cộng nội dung của 2 thanh ghi R1 với R2,
kết quả ghi vào ô nhớ 30h
3.17. Câu 16. Nạp giá trị 0FFh vào thanh ghi R1,lấy nội dung trong ô nhớ 35h cộng
với nội dung trong thanh ghi R1, kết quả lưu vào thanh ghi R2. Hãy xác định các
chế độ địa chỉ để thực hiện các thao tác trên
3.18. Câu 17. Nạp giá trị 0ABh vào ô nhớ 34h, nạp giá trị 1Dh thanh ghi R1, cộng
nội dung trong ô nhớ 34h với nội dung trong thanh ghi R1, kết quả lưu vào ô nhớ
30h. Hãy xác định các chế độ địa chỉ để thực hiện các thao tác trên.
3.19. Câu 18. Địa chỉ của ô nhớ 40h được chứa trong thanh ghi R5, hãy cho biết
các chế độ địa chỉ được sử dụng để cộng nội dung của ô nhớ được lưu trong R5 với
nội dung của ô nhớ 41H. Kết quả byte cao được đưa vào thanh ghi A, byte thấp
được chứa trong ô nhớ 42h.
3.20. Câu 19. Cộng nội dung của 5 ô nhớ liên tiếp, biết rằng địa chỉ của ô nhớ đầu tiên
được lưu trong thanh ghi R1 và R1 bằng 42h. Kết quả byte cao được lưu trong ô
nhớ 30h, byte thấp lưu trong 31h. Hãy xác định các chế độ địa chỉ của các thao tác
trên
3.21. Câu 20. Hãy cho biết giá trị của các thanh ghi R0, R1, R2 sau khi thực hiện xong
đoạn chương trình dưới đây.
ORG 0000H
MOV DPTR, #200H
CLR A
MOVC A, @A + DPTR
MOV R0, A
INC DPTR
CLR A
MOVC A, @A + DPTR
MOV R1, A
INC DPTR
CLR A
MOVC A, @A + DPTR

MOV R2, A
HERE: SJMP HERE
ORG 200H
MYDATA: DB ‘VXL’
END ;
3.22. Câu 21. Hãy điền giá trị tương ứng vào các ô sau khi hoàn thành mỗi lệnh
MOV A,#12 ; A
MOV A,#0C4H ; A
MOV R1,#1110B ; R1
ADD A,#11110001B ; A
MOV DPTR,#2000H
DPH DPL
3.23. Câu 22. Hãy điền giá trị tương ứng vào các ô sau khi hoàn thành mỗi lệnh
MOV R1,#36H ; R1
MOV A,R1 ; A
MOV R7,#0FH ; R7
ANL A,R7 ; A
INC A ; A
DEC A ; A
MOV DPTR,#2000
INC DPTR
DPH DPL
3.24. Câu 23. Hãy điền giá trị tương ứng vào các ô sau khi hoàn thành đoạn chương trình
sau:
MOV 30H, #0FEh
MOV R0,#30H
MOV A,@R0
3.25. Câu 23. Write a program to move (write) 40H to location 30H in internal RAM using
2 methods of addressing: direct addressing and indirect addressing.
3.26. Câu 24.Write a program to clear location 31H in internal RAM using 2 methods of

addressing: direct addressing and indirect addressing.
Hint: to clear means to reset the data to zero.
3.27. Câu 25. Write a program to move (read) the content of location 33H in internal RAM
to register A using 2 methods of addressing: direct addressing and indirect
addressing.
3.28. Câu 26. Write a program to move the content of registerA to location 0033H in
external RAM.
ORG 0000H
MOV DPTR,#0033H
MOVX @DPTTR,A
END
Câu 27. Write a program to write 40H to location 0030H in external RAM.
ORG 0000H
MOV A,#40H
MOV DPTR,#0030H
MOVX @DPTR,A
END
3.29. Câu 28. Viết các câu lệnh để xóa ô nhớ31H của RAM nội theo 2 cách
a. Định địa chỉ ô nhớ trực tiếp
b. Định địa chỉ ô nhớ gián tiếp.
3.30. Câu 29. Viết các câu lệnh để ghi nội dung thanh ghi A vào ô nhớ 32H của RAM nội
theo 2 cách:
a. Định địa chỉ ô nhớ trực tiếp
b. Định địa chỉ ô nhớ gián tiếp.
3.31. Câu 30. Viết các câu lệnh để đọc ô nhớ33H của RAM nội vào thanh ghi A của RAM
nội theo 2 cách:
a. Định địa chỉ ô nhớ trực tiếp
b. Định địa chỉ ô nhớ gián tiếp.
3.32. Câu 30. Viết các câu lệnh để chuyển dữ liệu ô nhớ 34H của RAM nội vào ô nhớ 35H
của RAM nội theo 2 cách:

a. Định địa chỉ ô nhớ trực tiếp
b. Định địa chỉ ô nhớ gián tiếp.
2. Tập lệnh:
MOV
3.33. Viết chương trình nạp 16 byte trong vùng dữ liệu nội từ địa chỉ 30H voi giá trị là
16h
MOV A,#CONST1
MOV R0,#30H
MOV R1,#16
L1: MOV @R0, A
INC R0
DJNZ R1, L1
3.34. Viết chương trình nạp 32 byte trong vùng dữ liệu ngoại từ địa chỉ 20H với giá trị là
32h
MOV A,#CONST2
MOVDPTR,#20H
MOV R1,#32
L2: MOVX @DPTR, A
INC DPTR
DJNZ R1, L2
3.35. Viết chương trình hoán đổi nội dung 2 ô nhớ trong RAM nội cho nhau
MOV R1,#CONST1 ; R1 = 15H
MOV R7,#CONST2 ; R7 = 27H
PUSH 07
PUSH 01
POP 07 ; R7 = 15h
POP 01 ; R1 = 27H
ADD
3.36. Viết đoạn chương trình cộng nội dung thanh ghi A với 19H, cho biết nội dung của
thanh ghi PSW sau khi thực hiện xong đoạn chương trình trên

3.37. Viết đoạn chương trình cộng nội dung thanh ghi A với thanh ghi B (giả sử A=19h,
B=FEh). Cho biết nội dung của thanh ghi PSW sau khi thực hiện xong đoạn chương
trình trên
3.38. Giả sử ô nhớ 20h trong RAM nội có giá trị bằng 25, viết đoạn chương trình để cộng
nội dung trong thanh ghi A với ô nhớ 20H
3.39. Giả sử thanh ghi R0 chứa giá trị là 20h, hãy viết đoạn chương trình để cộng nội
dung của thanh ghi A với ô nhớ có địa chỉ được lưu trong R0
3.40. Cho một chuỗi số8 bit không dấu trong RAM nội gồm 10 số bắt đầu từ ô nhớ30H.
Hãy viết CT con cộng chuỗi sốnày và ghi kết quảvào ô nhớ2FH (giả sử kết quả nhỏ
hơn hoặc bằng 255)
3.41. Giả sử các ngăn nhớ 40 - 44 của RAM có giá trị sau: 40 = (7D); 41 = (EB); 42 = (C5);
43 = (5B) và 44 = (30). Hãy viết một chương trình tính tổng của các giá trị trên. Cuối
chương trình giá trị thanh ghi A chứa byte thấp và R7 chứa byte cao (các giá trị
trên được cho ở dạng Hex).
3.42. Cho một chuỗi số8 bit không dấu trong RAM nội gồm 10 sốbắt đầu từô nhớ 30H.
Hãy viết CT con cộng chuỗi số này và ghi kết quảvào ô nhớ 2EH:2FH (ô nhớ 2EH
chứa byte cao của kết quả và ô nhớ 2FH chứa byte thấp của kết quả).
3.43. Hãy viết chương trình cộng hai số 16 bit. Các số đó là 3CE7H và 3B8DH. Cất
tổng số vào R7và R6 trong đó R6 chứa byte thấp.
INC/ DEC
3.44. Hãy viết giải thích cho các lệnh sau :
INC A ; A <-A + 1
INC B ; B<-B + 1
MOV R0,#30H
INC @R0 ; Tăng byte với contrỏ R0 lên 1 (30H) = (30H) + 1
INC R0
INC @R0 ; (31H) = (31H) + 1
INC 0 ; 1 cach khac de co R0 <-R0 + 1
INC @R0 ; (32H) = (32H) + 1
INC DPTR

3.45. Hãy viết giải thích cho các lệnh sau :
DEC A ; A <-A -1
DEC B; B <-B -1
MOV R0,#30H
DEC @R0 ; Giam o nho duoc chi boi R0 di 1 (30H) = (30H) -1
INC R0
DEC @R0 ; (31H) = (31H) -1
DEC 0; 1 cach khac de co R0 <-R0 -1
DEC @R0 ; (30H) = (30H) -1
rinh sau de giam noi dung DPTR di 1
DEC DPL ; Giam byte thap cua DPTR di 1
MOV R7, DPL ; chép vào R7
CJNE R7, #0FFH, SKIP ; Neu tran duoi thành FF thì phai muon
DEC DPH
MUL/DIV
3.46. Viết đoạn chương trình để thực hiện nhân 2 giá trị 8bit là 2 số của ngày sinh và 2 số
cuối của năm sinh . Cho biết kết quả của các thanh ghi liên quan sau khi thực hiện
xong đoạn chương trình trên
3.47. Viết đoạn chương trình để thực hiện chia 2 giá trị 8bit là 2 số của tháng inh và 2 số
cuối của năm sinh . Cho biết kết quả của các thanh ghi liên quan sau khi thực hiện
xong đoạn chương trình trên
DA
3.48. Cho biết kết quả của các thanh ghi trong đoạn chương trình dưới đây sau khi thực
hiện xong :
a. MOV A,#25h
ADD A,#17h
DA A
b. MOV A,#25h
ADD A,#17h
ADD A,B

DA A
c. MOV A,#25h
ADD R0,#17h
ADD A,R0
DA A
d. MOV 20h,#17h
MOV A,#25h
ADD A,20h
DA A
e. MOV R0,#17h
MOV A,#25h
ADD A,@R0
DA A
Câu 1. Giả sử 5 dữ liệu BCD được lưu trong RAM tại địa chỉ bắt đầu từ 40H như
sau:
40 = (71), 41 = (11), 42 = (65), 43 = (59) và 44 = (37). Hãy viết chương trình tính
tổng của tất cả 5 số trên và kết quả phải là dạng BCD.
ANL, ORL, XRL
3.49. Cho biết kết quả của các thanh ghi trong đoạn chương trình dưới đây sau khi thực
hiện xong các câu lệnh:
a. MOV A,#15h
ANL A,#3Ah
b. MOV 20H,#24
ANL A,20H
c. MOV A,#3Ah
ANL A,#0FH
3.50. Cho biết kết quả của các thanh ghi trong đoạn chương trình dưới đây sau khi thực
hiện xong các câu lệnh:
a. MOV A,#15h
ORL A,#3Fh

b. MOV A,#15
ORL A,#0F0H
3.51. Cho biết kết quả của các thanh ghi trong đoạn chương trình dưới đây sau khi thực
hiện xong các câu lệnh:
c. MOV A,#15h
XRL A,#3Ah
d. MOV A,#15h
XRL A,#0F0H
MOV A,#3Ah
XRL A,#0FFH
INC A
ROTATE/SWAP
3.52. Cho biết kết quả của các thanh ghi trong đoạn chương trình dưới đây sau khi thực
hiện xong các câu lệnh:
a. MOV A,#0FH
RR A
RR A
b. MOV A,#0FH
RL
RL A
c. MOV A,0FH
SETB C ;
RRC A
d. MOV A0FH
SETB C
RLC A
3.53. Sử dụng lệnh dịch phải để thực hiện chia số nguyên không dấu cho 2
MOV A,#NUM1 ; A = 0000_1111B = 0FH = 15
RR A ; A = 1000_0111B = 87H
CLR ACC.7 ; A = 0000_0111B = 07H = 7= 15/2

3.54. Sử dụng lệnh dịch phải có nhớ để thực hiện chia số nguyên không dấu cho 2
MOV A,#NUM2 ; A = -12 = F4H = 1111_0100B
MOV C,ACC.7 ; C = bit dau cua A
RRC A
3.55. Viết chương trình để thực hiện chia một số không dấu trong A cho 2n (n=1->8)( n
được lưu trước trong thanh ghi R7)
MOV R7,#2
MOV A,#00011111B ; A = 31
CALL DIV2EXPN ; A = 0000_0111B = 7 = 31 div 4
DIV2EXPN: ; Chương trình con chia nguyên không dấu cho 2^n
RR A
CLR ACC.7
DJNZ R7, DIV2EXPn
RET
END
SO SÁNH
3.56. Cho hai số 8 bit, số thứ 1 chứa trong (30H), số thứ 2 chứa trong (31H). Viết CT con
so sánh hai số này. Nếu sốthứ 1 lớn hơn hoặc bằng số thứ 2 thì set cờ F0, nếu ngược
lại thì xóa cờ F0
LẶP (MicroProcessor(HoangChi Thong)\Dap an bai tap VXL 8051 (LCT).pdf)
3.57. Viết CT xóa 20 ô nhớRAM nội có địa chỉbắt đầu là 30H
3.58. Viết CT xóa 250 ô nhớRAM ngoài có địa chỉbắt đầu là 4000H.
3.59. Viết CT xóa các ô nhớRAM nội từ địa chỉ20H đến 7FH
3.60. Viết CT xóa 2500 ô nhớRAM ngoài có địa chỉbắt đầu là 4000H
3.61. Viết CT chuyển một chuỗi dữliệu gồm 10 byte trong RAM nội có địa chỉ đầu là 30H
đến vùng
3.62. RAM nội có địa chỉ đầu là 40H
LỆNH NHẢY CÓ ĐIỀU KIỆN
3.63. Write a program to write 40H to internal RAM from location 30H to location 36H.
3.64. Write a program to clear ACC, then add 3 to the accumulator ten times.

3.65. Write a program to copy a block of 10 bytes from RAM location starting at 37h to
RAM location starting at 59h.
3.66. Cho sơ đồ kết nối, hãy viết chương trình theo yêu cầu theo sơ đồ giải thuật
3.67. Examine the content of A, if 5 ≤ A ≤ 10 then outputA to Port 1; if not, output A to Port
2.
3.68. Given a 20-byte string in internal RAM, starting ataddress 40H. Write a program
that output even numbers to Port 2.
TRỄ
3.69. Viết CT con delay 100µs, biết rằng thạch anh (xtal) dùng trong hệthống là:
12 MHz
11.0592 MHz
3.70. Viết CT con delay 100ms, biết rằng thạch anh (xtal) dùng trong hệ thống là:
12 MHz
6MHz
3.71. Viết CT con delay 1s, biết rằng thạch anh (xtal) dùng trong hệ thống là:
a. 12 MHz
b. 24 MHz
3.72. Viết CT tạo một xung dương ( ) tại chân P1.0 với độ rộng xung 1ms, biết rằng xtal
là 12 MHz.
3.73. Viết CT tạo chuỗi xung vuông có f = 100 KHz tại chân P1.1 (Xtal 12 MHz).
3.74. Viết CT tạo chuỗi xung vuông có f = 100 KHz và có chu kỳlàm việc D = 40% tại chân
P1.2 (Xtal 12 MHz).
3.75. Viết CT tạo chuỗi xung vuông có f = 10 KHz tại chân P1.3 (Xtal 24 MHz)
3.76. Viết CT tạo chuỗi xung vuông có f = 10 KHz và có chu kỳlàm việc D = 30% tại chân
P1.3 (Xtal 24 MHz)
3.77. Viết CT tạo chuỗi xung vuông có f = 10 Hz tại chân P1.4 (Xtal 12 MHz).
3.78. Viết CT tạo chuỗi xung vuông có f = 10 Hz và có chu kỳlàm việc D = 25% tại chân
P1.5 (Xtal 12 MHz)
3.79. Sử dụng Timer 0 hoặc/ và Timer 1 viết chương trình tạo 2 xung trên 2 chân P1.0 và
P1.1 với tần số lần lượt là 2KHz và 500Hz (Sử dụng osillocope để quan sát).

3.80. Sử dụng Timer 0 hoặc/ và Timer 1 viết chương trình tạo 2 xung trên 2 chân P1.0 và
P1.1 với tần số lần lượt là 10KHz và 1KHz (Sử dụng osillocope để quan sát).
3.81. Sử dụng timer 0 và timer 1 để tạo 2 xung đồng thời có chu kỳ 500 µs và 2000 µs trên
P1.0 và P1.2, dùng oscillocope để quan sát. Tần số thạch anh là 12 Mhz
3.82. Viết CT con có tên DELAY500 có nhiệm vụtạo trễ 0,5ms dùng Timer. (với Xtal 6MHz).
3.83. Viết CT con có tên DELAY10 có nhiệm vụtạo trễ 10ms dùng Timer. (với Xtal 12MHz).
3.84. Dùng CT con DELAY500 (bài 14) đểviết CT tạo sóng vuông f=1KHz tại P1.0.
3.85. Dùng CT con DELAY10 (bài 15) đểviết CT tạo sóng vuông f=50Hz tại P1.1.
3.86. Dùng CT con DELAY500 (bài 14) đểviết CT tạo sóng vuông f=500Hz (D=25%) tại
P1.2.
3.87. Dùng CT con DELAY10 (bài 15) đểviết CT tạo sóng vuông f=20Hz (D=20%) tại P1.3.
3.88. Viết CT dùng Timer tạo sóng vuông f=500Hz tại P1.4. (Xtal 12MHz).
3.89. Viết CT dùng Timer tạo sóng vuông f=20KHz tại P1.5. (Xtal 24MHz).
3.90. Viết CT dùng Timer tạo 2 sóng vuông có cùng f= 1KHz tại P1.6 và P1.7. Biết rằng
sóng vuông tại P1.7 chậm pha hơn sóng vuông tại P1.6 100(s. (Xtal 12MHz).
Phần bài tập về UART
3.91. Viết CT liên tục đọc ký tự từ cổng nối tiếp, nếu nhận được ký tự là ‘A’ thì xuất ra
cổng P1 số 1, nếu là ‘B’ xuất ra P1 số 2.
3.92. Viết CT liên tục đọc ký tự từ cổng nối tiếp, nếu dãy ký tự liên tiếp nhận được có dạng
“:abcd;” thì xuất P1.0=1, trái lại, P1.0=0. Với a,b,c,d là các ký tự bất kỳ từ 0 9,a z.
3.93. Viết CT liên tục xuất lên PC số 8 bit đọc được từ P1
3.94. Viết CT liên tục đọc P1.0, nếu P1.0=0 thì đọc P2 gửi về PC qua UART, trái lại, đọc P3
gửi về PC.
3.95. Hãy lập trình cho 8051 để nhận các byte dữ liệu nối tiếp tốc độ 9600 baud và bật các
Led trên Port 2 tương ứng: Máy tính gửi xuống số 1: 1 Led sáng, số 2: 2 Led sáng,…
số 8: 8 Led sáng, nếu các ký tự khác thì tắt tất cả các Led.
Phần bài tập về Ngắt
3.96. Viết CT dùng ngắt Timer để tạo sóng vuông f=2KHz tại P1.7. (Xtal 12MHz).
3.97. Viết CT dùng ngắt Timer để tạo sóng vuông f=200Hz tại P1.6. (Xtal 12MHz).
3.98. Viết CT dùng ngắt Timer để tạo đồng thời 2 sóng vuông 1KHz và 50Hz tại P1.0 và

P1.1. (Xtal 6MHz)
3.99. Viết CT lấy 1 chuỗi data chứa trong Ram ngoài bắt đầu từ địa chỉ 6200H đến địa chỉ
62FFH và xuất ra Port1, mỗi lần xuất cách nhau 50ms. Sử dụng ngắt Timer. Xtal
12MHz.
3.100. Viết CT nhập data từ thiết bị ngoài kết nối với 8051 qua Port1, mỗi lần nhập cách
nhau 5s, data nhập về được ghi vào vùng Ram nội bắt đầu từ địa chỉ 50H đến địa chỉ
5FH. Biết rằng sau khi ghi vào ô nhớ cuối cùng thì trở lại ghi vào ô nhớ đầu. Sử dụng
ngắt Timer. Xtal 12MHz.
3.101. Viết CT phát liên tục chuỗi số từ 0 đến 9 ra port nối tiếp theo chế độ UART 8 bit,
2400 baud. Sử dụng ngắt serial. Xtal 12MHz.
3.102. Viết CT chờ nhận data từ 1 thiết bị ngoài gửi đến 8051 qua port nối tiếp (chế độ
UART 8 bit, 19200 baud). Nếu nhận được ký tự STX (02H) thì bật sáng LED, nếu
nhận được ký tự ETX (03H) thì tắt LED, biết rằng LED được điều khiển bằng ngõ
P1.3 (LED sáng khi bit điều khiển bằng 1). Sử dụng ngắt serial. Xtal 11,059MHz.
3.103. Viết CT chờ nhận 1 xung cạnh xuống đưa vào chân /INT0 (P3.2), khi có xung thì
nhập data từ Port1 và phát ra port nối tiếp ở chế độ UART 9 bit 4800 baud, bit thứ 9
là bit parity lẻ. Xtal 6MHz.
3.104. Viết CT đếm số xung đưa vào chân /INT1 (P3.3) và điều khiển relay thông qua chân
P3.0 (relay đóng khi P3.0 bằng 1), cất số đếm vào ô nhớ 40H của Ram nội, nếu số
đếm chưa đến 100 thì đóng relay, nếu số đếm đạt 100 thì ngắt relay.
Phần bài tập tổng hợp
3.105. Thiết kế mạch và viết chương trình bằng ngôn ngữ ASM cho AT89S52 thực hiện
công việc sau: Mỗi khi có sườn ngắt ngoài EX0, đảo trạng thái của bóng đèn sợi đốt
220vAC/60W ghép nối vào chân P2.0
3.106. Thiết kế mạch và viết chương trình bằng ngôn ngữ ASM cho AT89S52 thực hiện
công việc sau: Nếu có ngắt ngoài tại chân P3.2 thì đảo trạng thái xuất tín hiệu ra tại
cổng P1. Nếu trạng thái là ON, cổng P1 sẽ xuất xung vuông (duty=50%) ra ngoài với
tần số là 2Hz (tạo trễ bằng Timer). Nếu trạng thái là OFF, cổng P1 giữ nguyên trạng
thái trước đó.
3.107. Thiết kế mạch và viết chương trình bằng ngôn ngữ ASM cho AT89S52 thực hiện

công việc sau: Đếm số xung tại chân ngắt ngoài 0 hiển thị lên 3 LED 7 thanh
3.108. Thiết kế mạch và viết chương trình bằng ngôn ngữ ASM cho AT89S52 thực hiện
công việc sau: Đếm số xung từ Encorder của động cơ DC, hiển thị lên 4 LED 7 thanh.
3.109. Thiết kế mạch và viết chương trình bằng ngôn ngữ ASM cho AT89S52 thực hiện
công việc sau: Có 3 chương trình con hiển thị 8 LED đơn theo 3 kiểu khác nhau.
Luân phiên hiển thị mỗi chương trình khi bấm nút (nút bấm được ghép vào ngắt
ngoài 1).
3.110. Thiết kế mạch và viết chương trình bằng ngôn ngữ ASM cho AT89S52 thực hiện
công việc sau: Đếm tăng 3 số: hh, mm, ss theo quy luật của thời gian thực, dùng ngắt
timer để tăng biến hh,mm,ss.

×