Bài tập dài Kỹ thuật vi xử lý
Họ và tên : Nguyễn Văn Hùng
Lớp : TBĐ1-K52
MSSV : 20071415
Email :
No
Yes
cjne
Bài 1 : Viết CT đảo dấu 100 byte dữ liệu từ ô nhớ 100H tại Ram ngoài :
chương trình :
Org 0000h
ljmp start
org 0003h ; int ex0
nop
reti
org 000bh
nop
reti ; int timer0
org 0013h ; int ex1
nop
reti
org 001bh
nop
reti ; int timer1
org 0023h ; ngat truyen tin khong dung
nop
reti
org 0100h
Start:
Crl EA
mov dptr , #0100H
mov Ro ,#00H
lap :
Start
dptr #0100H
Ro #00H
A @dptr
A A
A A + #01H
@dptr A
dptr + 1
Ro + 1
Ro =
64H
Ro =
64H
En
d
No
Yes
Yes
movx A , @dptr
cpl A
add A , #01H
movx @dptr , A
inc dptr
inc Ro
cjne R0 , #64H , lap
End
===================================
Bài 2 : Viết chương trình chuyển 2 mảng dữ liệu
50 byte. Biết mảng 1 có địa chỉ 50H trong Ram
trong và mảng 2 có địa chỉ 1234H trong Ram
ngoài .
Chương trình :
Org 0000h
ljmp start
org 0003h ; int ex0
nop
reti
org 000bh
nop
reti ; int timer0
org 0013h ; int ex1
nop
reti
Start
R0 #50H
dptr #1234H
R1 #00H
A @R0
R2 A
A @dptr
@R0 A
A R2
dptr + 1
Ro + 1
R1 + 1
Ro =
32H
En
d
org 001bh
nop
reti ; int timer1
org 0023h ; ngat truyen tin khong dung
nop
reti
org 0100h
Start:
Crl EA
mov A , #50H
mov dptr , #1234H
mov R1 , #00H
lap :
mov A , @R0
mov R2 , A
movx A , @dptr
mov @R0 , A
mov A , R2
movx @dptr , A
inc dptr
inc R0
inc R1
cjne R1 , #32H , lap
End
No
Yes
Cjne
Bài 3 : Viết chương trình cộng hai số BCD 4 chữ số trong Ram trong , kết quả cất vào số
thứ 1 . Biết số thứ nhất đặt tại ô nhớ 40H , và số thứ 2 đặt tại ô nhớ 50H
Chương trình :
Org 0000h
ljmp start
org 0003h ; int ex0
nop
reti
org 000bh
nop
reti ; int timer0
org 0013h ; int ex1
nop
reti
org 001bh
nop
reti ; int timer1
org 0023h ; ngat truyen tin khong dung
nop
reti
org 0100h
Start
C #00H
R0 #40H
R1 #50H
R2 #00H
A @R0
A A + @R1 + (C)
DAA
@R0 A
R0 + 1
R1 + 1
R2 + 1
R2 = #
04H
End
Start:
Clr EA
Clr C
mov R0 , #40H
mov R1 , #50H
mov R2 , #00H
lap :
mov A , @R0
addc A , @R1
da a
mov @R0 , A
inc R0
int R1
inc R2
cjne R3 , #04H , lap
End
========================
Bài 4 : Viết chương trình trừ hai số 8 byte kết quả cất vào ô thứ 2 . Biết số thứ nhất đặt tại ô nhớ
60H tại Ram trong , số thứ 2 đặt tại Ram ngoài 1000H.
No
cjne
Yes
Chương trình :
Org 0000h
Ljmp start
org 0003h ; int ex0
nop
reti
org 000bh
nop
reti ; int timer0
org 0013h ; int ex1
nop
reti
org 001bh
nop
reti ; int timer1
org 0023h ; ngat truyen tin khong dung
nop
reti
Org 0100h
Start :
Clr EA
Clr C
mov R0 , #60H
mov R1 , #00H
mov dptr , #1000H
Start
C # 00H
R0 #60H
R1 #00H
dptr #1000H
A @dptr
A A - @R0 – (C)
@dptr A
dptr + 1
R0 + 1
R1 + 1
R1 = #08H
End
lap:
movx A , @dptr
subb A , @R0
movx @dptr , A
inc dptr
inc R0
inc R1
cjne R1 , #08H , lap
end
Bài 5 : viết chương trình sử dụng timer tạo xung tần 100HZ tại chân P1.0 . Biết xung nhịp thạch
anh 12 MHZ ( Ton = 50% , Toff = 50% ).
Ta có :
Xung tại chân P1.0 có :
f
xung
= 100 Hz => T
xung
= 0,01 => thời gian cao và thấp là : 0,5 T = 0,005 = 5000 µs
Bộ định thời có :
f
đt
=
1
12
.f
thạch anh
=
1
12
.12 ( MHZ ) = 1 MHZ từ đó tần số
T
đt
=
1
6
10
= 1µs
Số nhịp đồng hồ : n =
5000
1
= 5000 nhịp
Xác định giá trị nạp vào timer :
65536 – 5000 = 60536D = EC67H
Giá trị nạp vào là : TL0 = 78H ; TH0 = ECH.
Yes
No
JNB
SJMP
Chương trình :
ORG 0000H
LJMP START
ORG 0003H ; INT EX0
NOP
RETI
ORG 000BH
NOP
RETI ; INT TIMER0
ORG 0013H ; INT EX1
NOP
RETI
ORG 001BH
NOP
RETI ; INT TIMER1
ORG 0023H ; NGAT TRUYEN TIN KHONG DUNG
OP
RETI
ORG 0100H
START :
CLR EA
CLR P1.0
MOV TMOD , #10H
MOV TL1 , #1AH
MOV TH0 , #0ECH
SETB TR0
BACK : JNB TFO , BACK
MOV TL1 , #1AH
Start
CLR P1.0
TMOD #10H
TL0 #78H
TH0 #0ECH
TR0 = 1
TF0 = 0
TL0 #78H
TH0 #0ECH
P1.5 P1.5
MOV TH0 , #0ECH
CPL P1.0
SJMP BACK
END
Bài 6 : Viết chương trình tạo xung 1HZ tại chân P1.7 . Biết xung nhịp thạch anh 12 MHZ
( T
on
= 70 % , T
off
= 30% )
Ta có :
Với f
thạch anh
= 12 MHZ thì theo trên ta có T
định thời
= 1µs
Xung tại chân P1.7 có :
f
xung
= 1 Hz => T
xung
= 1s => T
on
= 700 ms , T
off
= 300 ms
chọn giá trị ban đầu là : TL0 = B0H , TH0 = 3CH
từ đó ta có sau mỗi chu kỳ bộ timer đếm được
FFFFH - 3CBOH = 16
4
– 15536 = 50 000 lần tức là : 50 000 . 1µs = 0.05s = 50 ms
Vậy ta cần thiết kế sao cho bộ timer đếm được : 700 / 50 = 14 lần . rồi chân P1.7 đổi trạng thái
và đếm được : 300/50 = 6 lần . cứ như thế ta sẽ đáp ứng được yêu cầu của bài.
NO
NO
NO
YES
YES
YES
JNB
JNB
CJNE
SJMP
SJMP
Chương trình :
Start
TMOD #01H
TH0 #3CH
TL0 #0B0H
P1.7 = 1
R3 # 00H
TR0 = 1
TF0 = 0
TH0 #3CH
TL0 #0B0H
R3 + 1
R3 =
#0EH
P1.7 P1.7
P1.7 = 0
R3 #06H
R3 #0EH
ORG 0000H
LJMP START
ORG 0003H ; INT EX0
NOP
RETI
ORG 000BH
NOP
RETI ; INT TIMER0
ORG 0013H ; INT EX1
NOP
RETI
ORG 001BH
NOP
RETI ; INT TIMER1
ORG 0023H ; NGAT TRUYEN TIN KHONG DUNG
OP
RETI
ORG 0100H
START:
MOV TMOD , #01H
MOV TH0 , #3CH
MOV TL0 , #0B0H
SETB P1.7
MOV R0 , #00H
SETB TR0
LAP: JNB TF0 , LAP
MOV TH0 , #3CH
MOV TL0,#B0H
INC R3
CJNE R3 , LAP
CPL P1.7
JNB P1.7 , TOFF
MOV R0,#0EH
SJMP LAP
TON: MOV R0,#06H
SJMP LAP
END
Bài 7 : Viết chương trình con đọc 500 byte dữ liệu từ cổng nối tiếp và cất vào vùng nhớ có địa
chỉ đầu 456H . Biết cổng nối tiếp đã được khởi tạo sẵn , cổng cho phép đọc khi cờ RI = 1 , và cờ
RI sẽ tự xóa khi đọc xong 1 byte.
No
No
No
Yes
Yes
Yes
cjne
cjne
jnb
Giải thuật và chương trình :
Read:
mov R0 , #00H
mov R1 , #00H
mov dptr , #0456H
lap : jnb RI , lap
mov A , sbuf
movx @dptr , A
inc dptr
int R0
cjne R0 , #FAH , lap
mov R0 , #FAH
inc R1
cjne R1 , #02H , lap
ret
read
R0 #00H
R1 #00H
dptr #0456h
RI = 1
A sbuf
@dptr A
dptr + 1
R0 + 1
R0 =
#FAH
R0 #FAH
R1 + 1
R1 =
#02H
ret
R2 = 0
No
No
djnz
djnz
sjmp
Yes
Yes
djnz
No
Bài 8 : viết chương trình điều khiển đèn giao
thông tại 1 ngã tư theo yêu cầu :
Điều khiển 0 là đèn sáng , 1 là đèn tắt.
ta có sơ đồ điều khiển trạng thái như sau :
1 2 3 4 1
X1 P1.0 0 1 1 1 0
V1 P1.1 1 0 1 1 1
Đ1 P1.2 1 1 0 0 1
X2 P1.4 1 1 0 1 1
V2 P1.4 1 1 1 0 1
Đ2 P1.5 0 0 1 1 0
Chương trình :
Org 0000h
.
.
.
reti
org 0100h
Start : ; back 1
mov TMOD,#01H
mov TH0,#3CH
mov TL0,#0B0H
mov R1 , #14H
mov R2 , #19H
start
TMOD #01H
TH0 # 03CH
TLO #0B0H
R1 #14H
R2 #19H
P1.0 = 0
P1.1 = 1
P1.2 = 1
P1.3 = 1
P1.4 = 1
P1.5 = 0
TR0 = 1
R2 = 0
delay
R2 - 1
P1.0 = 1
P1.1 = 0
R2 #03H
delay
R2 -1
R2 = 0
P1.1 = 1
P1.2 = 0
P1.3 = 0
P1.5 = 1
R2 # 21H
delay
R2 - 1
P1 3 = 1
P1.4 = 0
R2 #03H
delay
R2 - 1
R2 = 0
djnz
Yes
setb P1.0
setb P1.1
setb P1.2
setb P1.3
setb P1.4
clr P1.5
setb TR0
back2 : lcall delay
djnz R2 , back2
setb P1.0
clr P1.1
mov R2 ,#03H
back2 : lcall delay
djnz R2 , back2
setb P1.1
clr P1.2
clr P1.3
setb P1.5
mov R2,#21H
back3 : lcall delay
djnz R2 , back3
setb P1.3
clr P1.4
mov R2,#03H
back4: lcall delay1s
delay
No
No
Yes
Yes
jnb
djnz
djnz R2 , back4
ljmp back1
delay : jnb TF0 , delay
mov TH0,#3CH
mov TL0,#0B0H
mov R1 ,#14H
djnz R1 , delay
ret
TF0 =
1
TH0 #3CH
TL0 #0B0H
R1 #14H
R1 - 1
R1 =
0
ret
Bài 9 : viết chương trình hiển thị 2 LED 7 thanh đếm lùi từ 20s với sơ đồ phần cứng SV tự đề
xuất
sjmp
Chương trình :
Org 0000h
.
.
.
reti
org 0100h
start :
clr EA
mov TMOD , #01H
mov TH0 , #3CH
mov TL0 , #0B0H
mov R0, #14H
mov P0, #20H
setb TR0
mov R1 , #10H
lcall lap
mov R1 , #00H
lcall lap
lap:
back: jnb TF0 back
mov TH0, #3CH
start
TMOD #01H
TH0 #3CH
TL0 #0B0H
R0 #14H
P0 #20H
TR0 = 1
R1 #10H
lap
R1 #00H
lap
djnz
No
Yes
cjne
No
Yes
No
Yes
mov TL0 , #0B0H
mov R2 , #0AH
mov A , R1
djnz R0 , back
back1: dec R2
add A ,@ R2
mov P0 , A
cjne R2 , #00H , back1
ret
sjmp start
lap
TF0
=1
TH0 #3CH
TL0 #0B0H
R2 #0AH
A R1
R0 - 1
R0 =
#00H
R 2 – 1
A A + @R2
P0 A
R2 =
#00H
ret