Hướng Dẫn viết 10 chương trình ứng dụng cơ bản cho AT89C51 - Pdf 12

www. Beenvn.com - Tủ Sách Online Hướng dẫn Bạn viết 10 chương trình ứng dụng cơ bản cho ic vi ñiều khiển
AT89C51

Lời nói ñầuBạn biết, kiến thức là luôn luôn cải biến và phát triển, do ñó các bài viết của
tôi ở ñây cũng luôn theo tôn chỉ của RIXIN, nghĩa là Nhật Tân  
  
  (Ngày
mới, ngày mới, ngày ngày mới

 日新
日新日新
日新,
,,
,日新
日新日新
日新,
,,
,日日新
日日新日日新
日日新). Các bài viết luôn ñược
người soạn ñọc ñi ñọc lại và sửa lỗi, viết thêm vào các ý tưởng mới và các bài
viết luôn ñược làm tươi. Nó giống như một vườn cây ñược người trồng vườn
chăm coi cẩn thận và khu vườn thì ñang ngày ngày sinh trưởng, các bài viết
sẽ luôn mới, luôn khác và mỗi ngày ñều ñược bổ xung tu chỉnh, và thêm mới.
Mong Bạn thường xuyên quay lại ñể xem và góp ý. Người soạn: Vương


* Chân 31 Bạn phải cho treo lên mức áp cao, ñể xác ñịnh là mạch chỉ
làm việc với bộ nhớ nội (Vì mạch không dùng thêm bộ nhớ ngoài).* Bạn chú ý, ic có 4 cảng, ñó là port 0 (p0), port 1 (p1), port 2 (p2) và
port 3 (p3). Mỗi cảng có 8 chân. Mọi hoạt ñộng của ic vi ñiều khiển ñều
ñược thực hiện trên các cảng này.Ghi nhận: Bạn thấy ic AT89C51 chỉ cần một ít linh kiện bên ngoài là ñã
có thể chấp hành các câu lệnh ñã có trong bộ nhớ EEP-ROM
,
Bạn dùng
các câu lệnh này ñể xác ñịnh trạng thái ñiện áp cao thấp trên các cảng
và dùng các mức áp cao thấp này cho việc ñiều khiển các dạng mạch
ñiện, hay các thiết bị.Bài 1: Viết chương trình ñể Led trên chân số 1 (p1.0)
luôn nhấp nháy.

www. Beenvn.com - Tủ Sách Online
ORG 0000h ; Khởi ñầu từ thanh ghi có ñịa chỉ là 0000h

START: CLR P1.0 ; ðặt chân p1.0 xuống mức áp thấp, Led sẽ sáng.


:Bạn thấy khởi ñầu luôn dùng câu khai báo giả lệnh:

org 0000hNghĩa là mọi việc sẽ bắt ñầu từ thanh nhớ có ñịa chỉ là 0000h. ðây
cũng là thanh mà chương trình sẽ nhấy ñến mỗi khi Bạn nhấn nút
Reset.và kết thúc với khai báo giả lệnh: endCác câu lệnh sau khai báo bởi giả lệnh "end"

sẽ không ñược biên dịch.Nói rõ hơn về cách tính thời gian trễ của ñoạn chương trình con delay
:

Trong hình trên do dùng thạch anh 12MHz nên một chu kỳ máy sẽ là
1us.
Vậy câu lệnh: mov r6,#20 sẽ thực hiện 2 lần. Bạn phải cho nhân 2.

20.D2: MOV R7,#248 ; chuyển vào thanh ghi r7 số thập phân
248. DJNZ R7,$ ; cho số trong r7 giảm theo bước -1, ở tại
chổ và chờ ñến khi bằng 0.

DJNZ R6,D2 ; cho số trong r6 giảm theo bước -1, và
nhẩy về D2 nếu chưa bằng 0. DJNZ R5,D1 ; cho số trong r5 giảm theo bước -1, và
nhẩy về D1 nếu chưa bằng 0. RET ; quay trở lại thực hiện dóng lệnh sau
lệnh call.

Bài 2: Viết chương trình dùng Led trên chân 1 (p1.0)
theo dõi khóa ñiện K1 trên chân 10 (p3.0).

* K1 ñóng lại Led sáng
.
* K1 bỏ ra Led tắt.
Lệnh này có nghĩa là sẽ nhẩy theo trạng thái bit trên chân p3.0
.

www. Beenvn.com - Tủ Sách Online

Nếu xét chân p3.0 ở mức áp cao (nút nhấn K1 hở) thì nhẩy ñến tên
nhãn LIG, và

Nếu xét chân p3.0 ở mức áp thấp (nút nhấn K1 kín) thì thực hiện câu
lệnh kế tiếp bên dưới.Bạn nhớ, khi chân p3.0 ở mức áp cao thì Led tắt và khi chân p3.0 ở
mức áp thấp thì Led sẽ sáng.

Bài 3: Viết chương trình dùng 4 led trên các chân 1
(p0.0), 2 (p0.1), 3 (p0.2), 4 (p0.3) ñể cho biết trạng
thái của 4 khóa ñiện trên các chân 5 (p0.4), 6 (p0.5),
7(p0.6), 8 (p0.7).

* Khi khóa ñiện ñóng lại Led tương ứng sáng.

* Khi khóa ñiện nhã ra, Led tương tứng tắt.

www. Beenvn.com - Tủ Sách Online


; như vậy Led ứng với vị trí có bit 0 sẽ phát sáng.

MOV P1,A ; Chuyển trạng thái của thanh ghi a ra trên port 1
ñể làm sáng Led.

SJMP START ; nhẩy về tên nhãn start ñể tiếp tục làm như trên.

END ; ngừng biên dịch ở dòng lệnh này.Phân tích cách viết các câu lệnh
:a- Dùng 4 phím ñể tắt mở 4 Led trên port 1Bạn cho chuyển trạng thái của port 1 vào thanh ghi tích lũy a, chú ý
trạng thái của 4 bit cao. Nó phản ảnh nút nhấn K1, K2, K3, K4.

b- Dùng logic And với hằng 11110000b ñể cho che 4 bit thấp.

www. Beenvn.com - Tủ Sách Online Bạn lấy logic AND giữa thanh a và hằng 0f0h (hay là 11110000b), cách

Từ ngả ra, Bạn sẽ thấy Led nằm trên bit 0 sẽ phát sáng. Các Led nằm
trên bit 1 sẽ tắt.

Bài 4: Viết chương trình cho 8 Led trên port 1 lần
lượt nhấp nháy, nhẩy qua trái rồi nhẩy qua phải.
www. Beenvn.com - Tủ Sách Online
ORG 0000h
START: MOV R2,#8 ; ðặt trị 8 (số lần ñếm) vào thanh ghi r2
MOV A,#0FEH ; ðặt trị 0feh tức 11111110b và thanh ghi a.
SETB C ; ðặt bit Cary lên mức 1.
LOOP: MOV P1,A ; Chuyển nội dung trong thanh ghi a vào cảng port 1.
LCALL DELAY ; Cho gọi chương trình làm trễ
RLC A ; Cho nội dung trong thanh ghi a quay qua trái có cho quay
qua bit cờ C.
DJNZ R2,LOOP ; ðếm lùi trị trong thanh ghi r2. Nếu chưa bằng 0 thì làm tiếp
lệnh ở LOOP.
MOV R2,#8 ; Nạp lại trị 8 vào thanh ghi r2.
LOOP1: MOV P1,A ; Chuyển nội dung trong thanh ghi a vào cảng port 1.
LCALL DELAY ; Cho gọi chương trình làm trễ
RRC A ; Cho nội dung trong thanh ghi a quay qua phải có cho quay
www. Beenvn.com - Tủ Sách Online

qua bit cờ C.


trong cờ C, lúc này 8 bit ở port 1 ñều ở mức 1 và như vậy 8 Led trên
port 1 ñều sẽ tắt. Với lệnh rlc a (rotate left Carry). Bạn sẽ thấy từng Led
sáng lên và nhẩy qua bên trái. b- Bạn dùng lệnh quay có qua cờ C, vậy qua 8 nhịp bit 0 sẽ vào nằm
trong cờ C, lúc này 8 bit ở port 1 ñều ở mức 1 và như vậy 8 Led trên
port 1 ñều sẽ tắt. Với lệnh rrc a (rotate right Carry). Bạn sẽ thấy từng
Led sáng lên và nhẩy qua bên phải.

www. Beenvn.com - Tủ Sách Online

c- Lệnh quay (rotate) chỉ có tác dụng với thanh ghi a, do ñó Bạn muốn
thể

hiện kết quả ra 8 Led trên port 1, Bạn phải chuyển nội dung có
trong a ra port 1. Bạn dùng lệnh mov p1, a.
Tóm lại, trong bài này Bạn ñã làm quen với cách dùng lệnh quay có cho
qua cờ C. Với cách viết này, Bạn thấy chúng ta dùng rất ít câu lệnh mà
vẫn khiến cho các Led sáng nhẩy (nhẩy qua nhẩy lại) trên port 1
.

DV1: CPL P1.0 ; Lấy bù chân p1.0, có chức năng tự ñảo.

www. Beenvn.com - Tủ Sách Online

LCALL DELY500 ; Cho gọi chương trình làm trễ 500us.

DJNZ R2,DV1 ; Cho ñếm lùi và thực hiện bù cpl p1.0 ñến 200
lần.

CPL FLAG ; Lại cho ñảo bit trong cờ Flag.

SJMP START ; Lập lại lệnh từ tên nhãn START.
DELY500: MOV R7,#250 ; Viết chương trình con làm trễ 500us. Nạp số 250
và thanh ghi r7.
LOOP: NOP ; Lệnh trống, dùng nó làm tăng thời gian trễ lên
gấp ñôi.
DJNZ R7,LOOP ; ðếm lùi r7 ñể làm trễ.
RET ; Cho quay lại thực hiện dòng lệnh sau lệnh
call.

END ; Dừng biên dịchPhân tích cách viết các câu lệnh
:Trong bài nầy, Bạn thấy dùng khai báo bit ñể ñịnh nghĩa tên tự ñặt của
Bạn, như:



* Nháy nhẩy qua trái 2 lần.

* Nháy nhẩy qua phải 2 lần.

www. Beenvn.com - Tủ Sách Online

* Toàn phần nhấp nháy 2 lần.

(Thời gian trễ 0.2 giấy)
. ORG 0000h
START: MOV DPTR,#TABLE ; Lệnh cho ñặt ñịa chỉ bảng vào thanh ghi con trỏ.

LOOP: CLR A ; cho xóa nội dung trong thanh ghi a, lúc này a =
00000000b
MOVC A,@A+DPTR ; Cho lấy nội dung trong bảng theo trị trong a, và cho
cất kết quả vào a.
CJNE A,#01H,LOOP1 ; Nếu a chưa bằng 01h thì nhẩy qua tên nhãn LOOP1.
JMP START ; Nếu trong a ñã bằng 01h thì nhẩy về tên nhãn
START.
LOOP1: MOV P1,A ; Chuyển nội dung trong a ra trên cảng port 1.
MOV R3,#20 ; Nạp số thập phân 20 vào thanh ghi r3.
www. Beenvn.com - Tủ Sách Online

LCALL DELAY ; Gọi chương trình làm trễ, tên nhãn là delay.
INC DPTR ; cho tăng ñịa chỉ bảng lên +1.
JMP LOOP ; Nhẩy về tên nhãn LOOP.

Phân tích cách viết các câu lệnh
:Trong bài này, chúng ta cho lấy dữ liệu liệt kê trong bảng ñể làm sáng
các Led trên port 1.

Trình tự làm như sau:Trước hết Bạn chọn cách làm sáng tắt cho 8 Led trên port 1 với mã 0/1.
Chúng ta nhớ bit 0 làm Led sáng và bit 1 sẽ làm Led tắt. Thí dụ: Muốn
Led sáng nhẩy qua trái, chúng ta sẽ chọn mã ñiều khiển như sau:11111110b ñổi ra dạng mã hệ 16 sẽ là 0FEH.11111101b ñổi ra dạng mã hệ 16 sẽ là 0FDH.

11111011b ñổi ra dạng mã hệ 16 sẽ là 0FBH.

11110111b ñổi ra dạng mã hệ 16 sẽ là 0F7H.

11101111b ñổi ra dạng mã hệ 16 sẽ là 0EFH.
sự sáng tắt của các Led.

Bài 7: Viết chương trình ñể trên ñèn số dùng Led 7
ñoạn lần lượt xuất hiện các con số 0, 1, 2, 3 Thời
gian thay ñổi số là 0.2s.

Chú ý: Dùng loại ñèn số Led 7 ñoạn có Cathode chung, vậy Led sáng
với mức 1.

www. Beenvn.com - Tủ Sách Online
Phân tích cách viết các câu lệnh
:ðể hiện các số thập lúc phân trên ñèn số 7 ñoạn với chân cathode (K)
mã các số sẽ như sau:“0” hay 3 FH

“1” hay 06H

“2” hay 5BH


START: MOV R1,#00H ; ðặt trị khởi ñầu 0 cho thanh ghi r1
NEXT: MOV A,R1 ; Cho chuyển nội dung trong r1 vào a.
MOV DPTR,#TABLE ; ðặt ñịa chỉ của bảng vào thanh ghi con trỏ dptr.
MOVC A,@A+DPTR ; Lấy các mã dữ liệu trong bảng theo trị của a và dữ
liệu cất vào a.
MOV P2,A ; Xuất dữ liệu trong a ra port 2 ñể cho hiện số.
LCALL DELAY ; Cho gọi chương trình làm trễ, tên nhãn là delay.
INC R1 ; Cho tăng trị trong r1 theo kiểu +1.
CJNE R1,#10,NEXT ; So sánh trị trong r1, xem bằng 10 chưa? chưa, nhẩy
về NEXT.
LJMP START ; Lệnh nhảy không ñiều kiện về câu lệnh có tên nhãn
là START.
DELAY: MOV R5,#20 ; Viết chương trình làm trễ. Bạn xem lại các phần thí
dụ trên.
D2: MOV R6,#20
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,D2
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ; Bảng mã cho hiện các số
thập phân.

END ; Dừng biên dịch.
Nói rõ hơn về loại ñèn hiện số dùng Led 7 ñoạn (Bạn xem hình):

MOV P1,A ; Xuất nội dung trong a ra cảng port 1.

REL: JNB P3.7,REL ; Chờ buôn phím nhấn ở chân p3.7.
LCALL DELAY10MS ; Gọi chương trình con làm trễ 10ms.
JNB P3.7,REL ; Tránh ảnh hưởng của rung phím.
INC R1 ; Cho tăng trị trong thanh ghi r1
MOV A,R1 ; Cho chuyển nội dung trong r1 vào
a.
CPL A ; Lấy bù 8 bit trong thanh ghi a
MOV P1,A ; Xuất nội dung trong a ra cảng port
1.
JNB P3.7,$ ; Chở buông phím SP1
SJMP REL ; Nhẩy không ñiều kiện về dòng lênh ở tên
nhãn là REL
DELAY10MS: MOV R6,#20 ; Viết chương trình làm trễ 10ms


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status