Tải bản đầy đủ (.doc) (13 trang)

Mạch điện cơ bản chạy ic AT89C51 - Lập trình Asembly (ASM)

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 (278.39 KB, 13 trang )

Mạch điện cơ bản chạy ic AT89C51.



Muốn dùng ic lập trình AT89C51 để điều khiển các dãy đèn, Bạn hãy ráp
các phần mạch cơ bản như hình trên:

* Dùng đường nguồn 5V có độ ổn định tốt cấp cho ic. Chân 20 cho nối
masse, chân 40 cho nối với nguồn 5V.

* Trên chân số 9 gắn tụ 10µF và điện trở 8.2K tạo chức năng reset mỗi
khi bo được cấp điện.

* Trên chân 18, 19 gắn thạch anh định tần, ở đây dùng thạch anh
12MHz, vậy chu kỳ lệnh là 1µs, gắn 2 tụ nhỏ 33pF bù nhiệt ổn tần.

* Trên chân 31 cho lên mức áp 5V để khai báo là chỉ dùng bộ nhớ
trong.

* Trên cảng p0 dùng thanh 8 điện trở 10Kx8 cho treo áp để ổn định
mức bit 1 đối với cảng này.

Với các mạch điện như trên, ic lập trình AT89C51 sẽ sẳn sàng chạy các
câu lệnh mà Bạn đã cho nạp vào bộ nhớ EEPROM của nó. Các bit cho
xuất nhập trên 4 cảng, loại cảng 8 bit, đó là cảng p0, p1, p2, p3.

Bây giờ công việc còn lại của chúng ta là viết các chương trình nguồn
dùng để điều khiển các dãy đèn màu làm việc thẳng với đường nguồn
nhà đèn 220V.



Viết các chương trình nguồn.

Chúng ta biết để làm sáng một dãy đèn thì dùng bit 0 và để tắt một dãy
đèn thì dùng bit 1. Do vậy chúng ta có thể chọn bit trên các đường ra
bằng câu lệnh set bit (setb) hay clear bit (clr). Cũng có thể dùng lệnh
move (mov) để mỗi câu lệnh cùng lúc tác động vào 8 bit.


Phần 1: hãy viết chương trình nguồn ở cấp độ đơn giản trực quan.

org 0000h
start:
call kieu_1
call kieu_2
mov r7, #10
tiep_tuc:
call kieu_3
djnz r7, tiep_tuc
call kieu_4
call kieu_2
jmp start
;
kieu_1:
mov p1, #00000000b
call delay
mov p1, #00011000b
call delay
mov p1, #00111100b
call delay
mov p1, #01111110b

call delay
mov p1, #11111111b
call delay
ret
;
kieu_2:
mov p1, #11111111b
call delay
mov p1, #01111111b
call delay
mov p1, #10111111b
call delay
mov p1, #11011111b
call delay
mov p1, #11101111b
call delay
mov p1, #11110111b
call delay
mov p1, #11111011b
call delay
mov p1, #11111101b
call delay
mov p1, #11111110b
call delay
mov p1, #11111111b
ret
;
kieu_3:
mov p1, #11111111b
call delay

mov p1, #11111110b
call delay
mov p1, #11111101b
call delay
mov p1, #11111011b
call delay
mov p1, #11110111b
call delay
mov p1, #11101111b
call delay
mov p1, #11011111b
call delay
mov p1, #10111111b
call delay
mov p1, #01111111b
call delay
mov p1, #11111111b
call delay
ret
;
kieu_4:
mov p1, #01111111b
call delay
mov p1, #00111111b
call delay
mov p1, #00011111b
call delay
mov p1, #00001111b
call delay
mov p1, #00000111b

call delay
mov p1, #00000011b
call delay
mov p1, #00000001b
call delay
mov p1, #00000000b
call delay
mov p1, #00000001b
call delay
mov p1, #00000011b
call delay
mov p1, #00000111b
call delay
mov p1, #00001111b
call delay
mov p1, #00011111b
call delay
mov p1, #00111111b
call delay
mov p1, #01111111b
call delay
mov p1, #11111111b
call delay
mov p1, #00000000b
call delay
call delay
mov p1, #11111111b
call delay
mov p1, #00000000b
call delay

call delay
mov p1, #11111111b
call delay
mov p1, #00000000b
call delay
call delay
mov p1, #11111111b
call delay
mov p1, #00000000b
call delay
call delay
mov p1, #11111111b
call delay
mov p1, #00100010b
call delay
mov p1, #01001000b
call delay
mov p1, #00001001b
call delay
mov p1, #00100101b
call delay
mov p1, #01001010b
call delay
mov p1, #10010100b
call delay
mov p1, #01101001b
call delay
call delay
ret
;

delay:
mov r7, #10
v_r6: mov r6, #200
v_r5: mov r5, #250
djnz r5, $
djnz r6, v_r5
djnz r7, v_r6
ret
end


Ghi nhận:

Trong chương trình nguồn này, chúng ta chủ yếu dùng câu lệnh mov để
đặt 8 bit cho xuất ra trên cảng p1. Ứng với bit 0 là dãy đèn sáng và bit
1 là dãy đèn sẽ tắt. Dùng đoạn chương trình làm trể để có nhịp nhấp
nháy rõ nét. Các kiểu nhấp nháy viết thành các chương trình con cho
đặt tên nhãn là kiểu 1, kiểu 2, kiểu 3, kiểu 4 , và khi muốn dùng kiểu
nhấp nháy nào thì dùng câu lệnh call để gọi ra. Qua các câu lệnh trên
Bạn thấy dùng ic lập trình để định kiểu nhấp nháy của các dãy đèn cực
kỳ đơn giản. Phải không?

Đoạn chương trình này Bạn có thể viết trong trang văn bản của trình
MIDE-51, viết xong, Bạn đặt cho nó một cái tên với họ là .asm, rồi gõ
phím F9 để cho dịch các câu lệnh ra dạng mã viết ở dạng hệ thập lục
phân, các mã lệnh này đặt trong file có họ là .hex. Bây giờ Bạn dùng
hộp nạp ROM, cho nạp các câu mã lệnh này vào nằm trong bộ nhớ
EEPROM của ic AT89C51, thế là xong chuyện, bây giờ cho gắn ic
AT89C51 vào bo thực hành, Bạn sẽ thấy các Led chỉ thị trên bo nhấp
nháy theo đúng các câu lệnh mà Bạn đã soạn. Và nếu gắn các dãy đèn

vào bo Bạn sẽ thấy cả một trời sao nhấp nháy đúng theo ý muốn của
Bạn. Thích không?


Hình này cho thấy chương trình nguồn đã được viết trong trang văn
bản của M-IDE for MSC51 và sau đó cho dịch ra file .hex để cho nạp các
câu mã lệnh vào bộ nhớ trong của ic AT89C51.




File .hex có nội dung như sau:

:100000001200151200347F0A12006EDFFB1200ABE3
:1000100012003480EB759000120175759018120172
:100020007575903C12017575907E1201757590FF83
:10003000120175227590FF12017575907F1201757E
:100040007590BF1201757590DF1201757590EF12F2
:1000500001757590F71201757590FB120175759019
:10006000FD1201757590FE1201757590FF22759055
:10007000FF1201757590FE1201757590FD120175E4
:100080007590FB1201757590F71201757590EF125E
:1000900001757590DF1201757590BF12017575902D
:1000A0007F1201757590FF1201752275907F120104
:1000B0007575903F12017575901F12017575900F3F
:1000C000120175759007120175759003120175750F
:1000D0009001120175759000120175759001120161
:1000E0007575900312017575900712017575900F63
:1000F00012017575901F12017575903F120175758B
:10010000907F1201757590FF1201757590001201B4

:10011000751201757590FF120175759000120175C9
:100120001201757590FF120175759000120175121C
:1001300001757590FF12017575900012017512011D
:10014000757590FF120175759022120175759048B2
:10015000120175759009120175759025120175755A
:10016000904A12017575909412017575906912018B
:1001700075120175227F0A7EC87DFADDFEDEFADF88
:02018000F62265
:00000001FF




Phần 2: Dùng bảng để tạo ra các dạng nhấp nháy cho các dãy đèn.

Trong đoạn chương trình nguồn này chúng ta tạo dạng nhấp nháy của
các dãy đèn bằng cách đặt các bit 0 vào các đoạn mã tạo ra trong
bảng, và dùng câu lệnh movc a, @a+dptr để lấy các đoạn mã này xuất
ra trên các cảng tùy chọn để tắt mở đèn theo thiết kế của Bạn.

org 0000h
start:
clr a ; xóa trị trong thanh ghi a
mov dptr, #kieu_1 ; đặt bảng kiểu 1 vào thanh ghi con trỏ dptr
mov r6, #20 ; chọn số lần nhấp nháy là 20
llai1: mov r7, #10 ; trong kiểu chớp này có 10 mẫu
ttuc1: call outp1 ; cho xuất mã lấy trong bảng ra cảng p1
djnz r7, ttuc1 ; dò trị r7, làm lại 10 lần
clr a ; cho xóa trị trong thanh ghi a
djnz r6, llai1 ; dò trị trong r6, lập lại 20 lần

jmp start ; quay lại từ đầu
outp1: ; chương trình cho xuất mã trên cảng p1
movc a, @a+dptr ; lấy mã trong bảng theo trị của a, mã cho
cất vào a
mov p1, a ; xuất mã lấy được ra cảng p1 để tắt mở
đèn theo bit
call delay ; gọi trình làm chậm
inc a ; tăng trị trong a lên +1 để lấy mã tiếp theo
ret ; quay lại sau câu lệnh call outp1
kieu_1: ; đặt tên bảng là kiểu 1, kiểu này có 10
mẫu
db 11111111b
db 11111110b
db 11111101b
db 11111011b
db 11110111b
db 11101111b
db 11011111b
db 10111111b
db 01111111b
db 11111111b
delay: ; chương trình làm chậm
mov r5, #10
v_r4: mov r4, #50
v_r3: mov r3, #200
djnz r3, $
djnz r4, v_r3
djnz r5, v_r4
ret
end ; dừng biên dịch tại dòng này





Phát triển thành một chương trình nguồn dài hơn.

org 0000h
start: ; đặt tên nhãn cho lệnh nhẩy
clr a ; xóa sạch thanh ghi a
mov dptr, #kieu_1 ; đặt bảng nháy kiểu 1 vào thanh ghi địa chỉ
mov r6, #20 ; định số lần lập lại là 20
llai1: mov r7, #10 ; số mã trong bảng kiểu 1 là 10
ttuc1: call outp1 ; cho xuất mã tắt mở đèn trên cảng p1
djnz r7, ttuc1 ; dò trị trong r7, lập lại 10 lần
clr a ; trả trị thanh ghi a về 0
djnz r6, llai1 ; dò trị trong r6, cho nháy kiểu 1 20 lần
; viết tương tự như trên, cho xuất mã trên p2
clr a
mov dptr, #kieu_2
mov r6, #20
llai2: mov r7, #9
ttuc2: call outp2
djnz r7, ttuc2
clr a
djnz r6, llai2
; viết tương tự như trên, cho xuất mã trên p0, p1, p2, p3
clr a
mov dptr, #kieu_4
mov r6, #10
llai3: mov r7, #11

ttuc3: call outp0p1p2p3
djnz r7, ttuc3
clr a
djnz r6, llai3
; viết tương tự như trên, cho xuất mã trên p0
clr a
mov dptr, #kieu_3
mov r6, #5
llai4: mov r7, #10
ttuc4: call outp0
djnz r7, ttuc4
clr a
djnz r6, llai4
jmp start
; trình cho xuất mã trên p0
outp0:
movc a, @a+dptr
mov p0, a
call delay
inc a
ret
; trình cho xuất mã trên p1
outp1:
movc a, @a+dptr
mov p1, a
call delay
inc a
ret
; trình cho xuất mã trên p2
outp2:

movc a, @a+dptr
mov p2, a
call delay
inc a
ret
; trình cho xuất mã trên p3
outp3:
movc a, @a+dptr
mov p3, a
call delay
inc a
ret
; trình cho xuất mã trên 4 cảng p0, p1, p2, p3
outp0p1p2p3:
movc a, @a+dptr
mov p0, a
mov p1, a
mov p2, a
mov p3, a
call delay
inc a
ret
; tạo các bảng mã, định hình các kiểu nhấp nháy
kieu_1: ; 10 mau
db 11111111b
db 11111110b
db 11111101b
db 11111011b
db 11110111b
db 11101111b

db 11011111b
db 10111111b
db 01111111b
db 11111111b
kieu_2: ; 9 mau
db 11111111b
db 01111110b
db 10111101b
db 11011011b
db 11100111b
db 11011011b
db 10111101b
db 01111110b
db 11111111b
kieu_3: ; 10 mau
db 11111111b
db 11111110b
db 11111100b
db 11111000b
db 11110000b
db 11100000b
db 11000000b
db 10000000b
db 00000000b
db 11111111b
kieu_4: ; 11 mau
db 11111111b
db 00000000b
db 00011000b
db 00111100b

db 01111110b
db 11111111b
db 00000000b
db 10000001b
db 11000011b
db 11100111b
db 11111111b
delay:
mov r5, #10
v_r4: mov r4, #50
v_r3: mov r3, #200
djnz r3, $
djnz r4, v_r3
djnz r5, v_r4
ret
end


Trong cách viết này, Bạn dễ dàng định hình cho các kiểu nhấp nháy của
các dãy đèn, trước hết hãy tạo bảng mã, mỗi mã 8 bit, sau đó định kiểu
nhấp nháy, muốn dãy đèn nào sáng thì đặt bit 0, muốn tắt thì đặt bit 1.
Sau cùng đếm xem trong bảng có bao nhiêu mẫu mã để khai báo số lần
lấy mã cho xuất ra trên các cảng.

Sau khi đã có chương trình nguồn, cho dịch ra các dòng mã hệ thập lục
phân, nạp các dòng mã này vào nằm trong bộ nhớ ROM của các ic lập
trình là xong chuyện. Đơn giản quá phải không?




Tạm kết

Qua bài viết trên, Bạn thấy chỉ với một kiểu mạch điện không quá phức
tạp, chúng ta đã biết cách dùng các ic lập trình để điều khiển nhiều dãy
đèn nhấp nháy treo trong các công viên lớn, hay trang trí cho các nhà
hàng ngoài trời. Tôi nghĩ công việc này cũng mang đến nhiều thu nhập
cho các Bạn trẻ thích nghiên cứu ứng dụng của môn điện tử. Khi có dịp
chúng ta sẽ tiếp tục mở rộng đề tài này. Chào ! Bây giờ chúng ta sẽ
chuyển qua một bài mới. Mong Bạn luôn thích vào trang web nhà
phuclanshop.com để cùng nhau trao đổi, học tập và cầu tiến bộ.

×