BỘ CÔNG THƯƠNG
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA ĐIỆN
BỘ MÔN ĐO LƯỜNG & ĐIỀU KHIỂN
Giáo viên hướng dẫn :
BÙI THỊ KHÁNH HÒA
Sinh viên thực hiện
:
TRỊNH TRẦN ĐỨC
Lớp
:
LTCĐ-ĐH ĐIỆN 3 – K2
Hà Nội tháng 3 - 2010
1
LỜI NÓI ĐẦU
Trong những thập niên gần đây công nghiệp hoá hiện đại hoá ngày càng phát
triển mạnh mẽ. Kỹ thuật điện tử đã có những bước phát triển đặc biệt là trong kỹ
thuật điều khiển tự động. Sự ra đời và phát triển nhanh chóng của kỹ thuật thuật vi
điều khiển
Nước ta hiện nay, kỹ thuật vi điều khiển tuy mới phát triển song đã và đang là
công cụ được ứng dụng rộng dãi trong lĩnh vực tự động hoá. Nó đang phát triển
nhanh chóng, đã mang lại những thay đổi to lớn trong công nghệ cũng như trong
đời sống hàng ngày. Việc các máy móc thiết bị trở nên linh hoạt hơn, thông minh
hơn và làm việc với năng suất cao là nhờ có sự hoạt động thông minh của bộ vi
điều khiển.
Với điều kiện học tập tại trường em đã được tìm hiểu cơ bản về vi điều khiển
8051 và ứng dụng phần mềm PROTEUS để vẽ mạch nguyên lý và phần mềm
RCHPSIM để lập trình và chạy mô phỏng.
Mặc dù đã cố gắng tìm hiểu nhưng báo cáo của em không tránh khỏi những
thiếu sót, em rất mong nhận được ý kiến đóng góp của các thầy cô giáo và các bạn
để báo cáo của em hoàn thiện hơn và có thể đưa vào làm tài liệu thí nghiêm thực tế.
Em xin chân thành cảm ơn!
2
NỘI DUNG BÁO CÁO THÍ NGHIỆM
NỘI DUNG:
Ghép nối vi điều khiển AT 89C52 (8051) với 4 đèn Led 7 thanh như hình dưới:
Với yêu cầu thí nghiệm như sau:
1. Vẽ sơ đồ nguyên lý như trên sử dụng phần mềm PROTEUS.
2. Lập trình chương trình và chạy mô phỏng trên sơ đồ vẽ ở trên sử dụng
phần mềm RCHPSIM với yêu cầu như sau:
- Ấn nút ấn FCNT → Đèn Led (Nx) tăng.
- Ấn nút ấn RCNT → Nx giảm.
- Ấn nút ấn RESET → Nx = 0
Nếu Nx tăng đến một giá trị đặt (SV) → Cảnh báo chuông kêu (ALARM).
3
1. VẼ SƠ ĐỒ NGUYÊN LÝ SỬ DỤNG PHẦN MỀM PROTEUS
Để vào phần mềm PROTEUS, từ màn hình Desktop vào biểu tượng
hình sẽ hiển thị như sau:
Tiếp đó vào giao diện để chuẩn bị vẽ như hình dưới:
4
màn
a. Xác định số linh kiện cần dùng:
Trước khi vẽ ta nên xem sơ đồ của mình cần vẽ dùng bao nhiêu linh kiện. Với
sơ đồ nguyên lý như trên ta cần lấy các linh kiện sau:
STT
1
2
3
4
5
6
7
8
9
10
Linh kiện
Số lượng
AT 89C52
01
Điện trở R = 1K
Điện trở R = 10K
Đèn
Bốn đèn Led 7 thanh
Loa cảnh báo
Nguồn 1 chiều
Nút ân
Transistor
Rơ le
09
04
01
01
01
01
03
01
01
Bước tiếp theo để vẽ ta vào biểu tượng chữ “P” để vào thư viện lấy linh kiện,
ta xem cần phải vẽ linh kiện nào thì ta lấy tất cả các linh kiện cần vẽ ra màn hình.
b. Cách lấy các linh kiện trong thư viện:
1. Muốn lấy linh kiện AT 89C52 từ thư viện vào Microprocessor ICs → AT
89C52 → OK như hình dưới:
5
Lấy các linh kiện khác vào tương tự như trên, cụ thể như sau:
2. Muốn lấy điện trở R = 1K & 10K từ thư viện vào Resistors → Chọn loại 1K
& 10K → OK
3. Muốn lấy đèn từ thư viện tại Keywords nhập Lamp → OK→ chọn Lamp →
OK
4. Muốn lấy 4 đèn Led 7 thanh từ thư viện vào Optoelectrnics →chọn đèn xanh
hoặc đỏ → OK.
5. Muốn lấy loa cảnh báo, từ thư viện vào Speakers & Sounders → Buzzer →
OK.
6. Muốn lấy nguồn 1 chiều, từ thư viện tại Keywords nhập Battery → chọn
Battery → OK.
6
7. Muốn lấy nút ấn, từ thư viện tại Keyword nhập Button → chọn Button →
OK.
8. Muốn lấy Transistor thuận NPN, từ thư viện vào Transistors → tại Keywords
nhập NPN → chọn Transistor loại NPN → OK.
9. Muốn lấy Rơle, từ thư viện vào Switch & Relays → chọn Rơle loại 12V →
OK.
Sau khi lấy hết các linh kiện ra ngoài màn hình ta có giao diện chuẩn bị vẽ
gồm có tất cả các linh kiện ta vừa lấy gồm 10 linh kiện như hình dưới:
Sau đó ta đưa tất cả các linh kiện sắp xếp ra màn hình như hình dưới:
7
Bước tiếp theo sử dụng chuột để nối thành mạch nguyên lý như yêu cầu,
sau khi nối xong ta có được sơ đồ nguyên lý yêu cầu như hình dưới:
Sơ đồ nguyên lý
8
2. LẬP TRÌNH CHƯƠNG TRÌNH SỬ DỤNG PHẦN MỀM RCHPSIM
Chương trình Đếm & Cảnh báo:
;========================================================
;Chuong trinh viet cho mo hinh dem nguoi vao ra cua
;
Update 05/12/2005
;========================================================
org
0000H
ljmp init
org
;Vector reset
;Nhay toi chuong trinh khoi tao
0003H
;Vector ngat ngoai INT0
ljmp COUNTER ;Nhay toi ctc dem so nguoi vao/ra
org
reti
org
reti
org
000BH
;Vector ngat tran T0
;Khong dung thi ket thuc luon
0013H
;Vector ngat ngoai INT1
;Khong dung thi ket thuc luon
001BH
;Vector ngat tran T1
9
reti
org
;Khong dung thi ket thuc luon
0023H
reti
org
;Vector ngat cong truyen thong noi tiep
;Khong dung thi ket thuc luon
002BH
ljmp INT_T2
;Vector ngat tran T2
;Nhay toi ctcpvn tran T2
;========================================================
;Phan khai bao cac bien so, hang so
;========================================================
D0equ
50H
D1equ
51H
D2equ
52H
D3equ
53H
D4equ
54H
NumL
equ
55H ;ben chua so nguoi dem duoc
NumH
equ
56H
;======================================================
;cac bien dung cho cac chuong trinh con cong, tru, nhan
;chia cac so hai byte
;======================================================
ZOV
equ
00H
AlarmL
equ
68H
AlarmH
equ
69H
FCNT
equ
70H
RCNT
equ
71H
X0
equ
72H
X1
equ
73H
10
X2
equ
74H
X3
equ
75H
Y0
equ
76H
Y1
equ
77H
Y2
equ
78H
Y3
equ
79H
Z0
equ
7AH
Z1
equ
7BH
Z2
equ
7CH
Z3
equ
7DH
Z4
equ
7EH
Z5
equ
7FH
XL
equ
X0
XH
equ
X1
YL
equ
Y0
YH
equ
Y1
ZL
equ
ZH
X
Z0
equ
equ
Z1
XL
;========================================================
;Phan chuong trinh khoi tao
;========================================================
11
org
100
init:
clr
;bat dau chuong trinh khoi tao
EA
;cam tat ca cac ngat
mov SP,#2FH
;khoi tao ngan xep bat dau tu dia chi 30H
mov T2CON,#00H
;T2 lam viec o che do Auto_reaload
mov RCAP2H,#0DBH ;voi chu ky ngat 10ms
mov RCAP2L,#0FFH
mov TH2,RCAP2H
mov TL2,RCAP2L
setb IT0
;Dat ngat ngoai INT0 theo suon xuong
;==================================================
;khoi tao bien so, hang so
;==================================================
mov r7,#4
mov r6,#01h
;xac dinh LED bay thanh can hien thi
mov r5,#01H
;D0 sang dau tien
mov r0,#D0
;(r0)=dia chi cua D0
;==================================================
clr
P3.0
mov AlarmL,#0AH
mov AlarmH,#00H
mov NumH,#0H
mov NumL,#0H
setb TR2
;cho phep T2 chay
setb IE.5
;cho phep ngat tran T2
setb EX0
;cho phep ngat ngoai INT0
setb EA
;cho phep tat ca cac ngat
here:
12
sjmp here
;doi ngat
;========================================================
;Interrupt INT_T2
;co chuc nang dieu khien cac LED va cac LED bay thanh
;Input
: None
;Output
: None
;Destroys:
;========================================================
INT_T2:
clr
;bat dau ctcpvn tran T2
TF2
;xoa co tran bao ngat
mov XH,NumH
mov Xl,NumL
lcall hextodec
lcall xlat
lcall display
lcall COUNTER
lcall Reset1
lcall Alarm
reti
;========================================================
COUNTER:
clr
IE0
mov a,FCNT
cjne a,#0,KT1
jb
P1.0,KT2
mov FCNT,#1
mov a,NumL
add
a,#1
13
mov NumL,a
mov a,NumH
addc a,#0
mov NumH,a
sjmp KT2
KT1:
jnb
P1.0,KT2
mov FCNT,#0
KT2:
mov a,RCNT
cjne a,#0,KT3
jb
P1.1,Thoat
mov RCNT,#1
mov a,NumL
subb a,#1
mov NumL,a
mov a,NumH
subb a,#0
mov NumH,a
sjmp Thoat
KT3:
jnb
P1.1,Thoat
mov RCNT,#0
Thoat:
ret
;========================================================
Reset1:
jb
P1.2,thoat1
14
mov NumL,#0
mov NumH,#0
thoat1:
ret
;========================================================
Alarm:
mov XL,AlarmL
mov XH,AlarmH
mov a,NumL
add
a,#1
mov YL,a
mov YH,NumH
lcall sub16
jnC
th
setb P3.0
sjmp kth1
th:
clr
P3.0
kth1
ret
;========================================================
;Subroutine display
;co chuc nang hien thi led
;Input
: Ma bay thanh (D3,D2,D1,D0)
;Output
: none
;Destroys:
;========================================================
display:
15
djnz r7,H_THI
mov r0,#D0
mov r6,#01h
mov r7,#4
H_THI:
mov p2,r6
mov a,@R0
mov p0,a
inc r0
mov a,r6
rl a
mov r6,a
ret
;=======================================================
;Subroutine xlat
;co chuc nang chuyen tu soBCD sang ma 7 thanh
;Input
: Ma BCD
;Output
: BCD(D3,D2,D1,D0) chu so BCD so can hien thi
;Destroys:
;========================================================
xlat:
mov dptr,#SEG_COD ;
mov
a,D0 ;
movc a,@a+dptr ;
mov D0,a
;
mov dptr,#SEG_COD ;
mov
a,D1 ;
16
movc a,@a+dptr ;
mov D1,a
;
mov dptr,#SEG_COD ;
mov
a,D2 ;
movc a,@a+dptr ;
mov D2,a
;
mov dptr,#SEG_COD ;
mov
a,D3 ;
movc a,@a+dptr ;
mov D3,a
;
Ret
;========================================================
;Subroutine hextodec
;co chuc nang chuyen tu so HEX sang so BCD
;Input
: X(XH,XL)
;Output
: BCD(D4,D3,D2,D1,D0) chu so BCD so can hien thi
;Destroys:
;========================================================
hextodec:
mov YH,#00h
mov YL,#0ah
lcall DIV16
mov D0,Z0
mov XH,Z3
mov XL,Z2
lcall DIV16
17
mov D1,Z0
mov XH,Z3
mov XL,Z2
lcall DIV16
mov D2,Z0
mov XH,Z3
mov XL,Z2
lcall DIV16
mov D3,Z0
mov XH,Z3
mov XL,Z2
lcall DIV16
mov D4,Z0
ret
;========================================================
;subroutine div16
;
Z=X/Y
; input :
X:(XH,XL); Y:(YH,YL)
; output :
Z3,Z2 hold high and low bytes of the quotient
;
Z1,Z0 hold high and low bytes of the remainder
;
ZOV is set if Y=0, i.e., the result is out of range.
; calls :
; destroys:
sub16
a, r0, r1, r2, r3, r7, flags
;========================================================
div16:
push 7
push 3
push 2
18
push 1
push 0
mov
a,YH
; get divisor high byte
orl
a,YL
; OR with low byte
jnz
div_OK
; divisor OK if not 0
setb
ZOV
; else, overflow
pop
0
pop
1
pop
2
pop
3
pop
7
ret
div_OK:
mov
r1,XH
mov
r0,XL
mov
XH,#0
mov
XL,#0
mov
r3,#0
mov
r2,#0
mov
r7,#16
; store dividend in r1, r0
; clear partial remainder
; clear partial quotient
; set loop count
div_loop:
clr
C
mov
rlc
; clear carry flag
a,r0
a
; ... into...
mov
r0,a
mov
a,r1
rlc
; shift the highest bit of the dividend...
a
19
mov
r1,a
mov
a,XL
rlc
a
; ... remainder
mov
XL,a
mov
a,XH
rlc
; ... the lowest bit of the partial ...
a
mov
XH,a
lcall sub16
; attempt to subtract to see if the...
; ... partial remainder is as large or...
; ... larger than the divisor.;
mov
c,ZOV
cpl
c
jnc
div_1
; get subtraction external borrow
; complement external borrow;
mov XH,ZH
mov XL,ZL
div_1:
mov
rlc
a,r2
a
mov
r2,a
mov
a,r3
rlc
; add result bit to partial quotient
a
mov
r3,a
djnz
r7,div_loop
mov
Z3,r3
mov
Z2,r2
mov
Z1,XH
; put quotient in Z3, and Z2
; get remainder, saved before the...
20
mov
Z0,XL
clr
ZOV
pop
0
pop
1
pop
2
pop
3
pop
7
; last subtraction
; divisor is not 0
ret
;========================================================
;subroutine sub16
;
Z(ZH,ZL) = X(XH,XL) - Y(YH,YL)
;
if (Y > X)
;
ZOV = 1
;========================================================
sub16:
push acc
mov a,XL
clr
c
; load X low byte into accumulator
; clear carry flag
subb
a,YL
; subract Y low byte
mov
ZL,a
; put result in Z low byte
mov
a,XH
; load X high byte into accumulator
subb
a,YH
; subtract Y high byte with the borrow ...
; ... from low byte operation
mov
ZH,a
mov
ZOV,c
pop
; save result in Z high byte
; set ZOV id an external borrow is produced
acc
ret
;========================================================
21
;Bang ma bay thanh (Segment code)
;========================================================
SEG_COD:
db
;0
1
2
3
4
5
6
7
8 9
0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H
22