Tải bản đầy đủ (.pdf) (33 trang)

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

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 (976.02 KB, 33 trang )

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 ñầu


Bạ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


Khánh Hưng.

Trước hết chúng ta hãy tìm hiểu nguyên lý làm việc của ic vi ñiều khiển
AT89C51 (Bạn xem hình).


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



IC AT89C51 có 40 chân. Công dụng của các chân như sau:


* Chân 40 nối vào ñường nguồn 5V, chân 20 cho nối masse.


* Chân 9 nối vào mạch reset với ñiện trở 10K và tụ 10uF. Khi mạch vừa
ñược cấp ñiện, tụ nạp và kéo chân 9 lên mức áp cao tạo tác ñộng reset.
Sau một lúc chân 9 trở lại mức áp thấp. IC AT89C51 bắt ñầu hoạt ñộng
từ trạng thái khởi ñầu.


* Chân 18, 19 mắc thạch anh ñịnh tần. Như vậy tần số xung nhịp sẽ là
1Mhz (hay 1us). Ngang thạch anh mắc 2 tụ nhỏ dùng ñể bù nhiệt ổn
tần (Bạn xem hình).


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




* 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.


LCALL DELAY ; Cho gọi trình làm trễ (có tên nhãn là delay).

SETB P1.0 ; ðặt chân p1.0 lên mức áp cao, Led sẽ tắt

LCALL DELAY ; Lại cho gọi trình làm trễ (có tên nhãn là delay).

LJMP START ; Cho nhẩy về dòng lệnh với tên nhãn là start,
công việc sẽ lập lại.

DELAY: MOV R5,#20 ; Nạp trị 50 vào thanh nhớ r5.
D1: MOV R6,#20 ; Nạp trị 20 vào thanh nhớ r6.

D2: MOV R7,#248 ; Nạp trị 248 vào thanh nhớ r7.

DJNZ R7,$ ; Cho giảm r7 theo bước -1 cho ñến 0.

DJNZ R6,D2 ; Cho giảm r6 theo bước -1, chưa bằng 0 thì nhẩy
www. Beenvn.com - Tủ Sách Online

về D2.

DJNZ R5,D1 ; Cho giảm r5 theo bước -1, chưa bằng 0 thì
nhẩy về D1.

RET ; Quay lại dòng lệnh sau lệnh lcall.

END ; dừng biên dịch.


Phân tích cách viết các câu lệnh

:


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

org 0000h


Nghĩ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: end


Cá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.

Từ ñó cách tính như sau:

MOV R6,#20 2lần 2

D1: MOV R7,#248 2 lần 2
2+2×248=498 20×

DJNZ R7,$ 2 lần 2×248
(498
DJNZ R6,D1 2 lần 2×20=40
10002


Qua các nhân thời gian trễ của ñoạn chương trình delay này là
10.002ms.

Nếu Bạn mov vào r6=10 thì thời gian trễ sẽ là 5ms.

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

Nếu Bạn mov vào r6=20 thì thời gian trễ sẽ là 10ms.


Và ñể có thời gian trễ là 200ms. Bạn dùng thêm thanh nhớ r5. Mov vào
r5=20. Và như vậy ñoạn chương trình trễ delay 200ms như sau:


DELAY: MOV R5,#20 ; chuyển vào thanh ghi r5 số thập phân 20.

D1: MOV R6,#20 ; chuyển vào thanh ghi r6 số thập phân

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.


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


ORG 0000H ; Khởi ñầu từ thanh ghi 0000h

START: JB P3.0, LIG ; Lệnh nhẩy. Nếu chân p3.0 ở bit 1 thì nhẩy ñến tên nhãn
LIG, Led tắt

CLR P1.0 ; ðặt p1.0 về bit 0, chân p1.0 ở mức áp thấp. Led sẽ sáng

SJMP START ; Nhảy về tên nhãn START.

LIG: SETB P1.0 ; ðặt p1.0 về bit 1, chân p1.0 ở mức áp cao, Led tắt.

SJMP START ; Nhảy về tên nhãn START.


END ; Dừng biên dịch ở ñây.


Phân tích cách viết các câu lệnh
:


Ở ñây, Bạn dùng lệnh nhẩy theo ñiều kiện bit, tức lệnh jb (jump bit)
hay jnb (jump no bit).


JB P3.0, LIG



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




ORG 0000H ; Bắt ñầu từ thanh ghi 0000h

START: MOV A,P1 ; Lấy trang thái trên cảng port 1 nạp vào thanh ghi
tích lũy a.

ANL A,#0F0H ; dùng logic AND ñể che 4 bit thấp, giữ nguyên
trạng thái 4 bit cao.

RR A ; cho nội dung trong thanh ghi a quay qua phải 1
bit.

RR A ; cho nội dung trong thanh ghi a quay qua phải 2
bit.


RR A ; cho nội dung trong thanh ghi a quay qua phải 3
bit.


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

RR A ; cho nội dung trong thanh ghi a quay qua phải 4
bit.


XOR A,#0F0H ; dùng logic Ex-OR ñể phát hiện sự khác bit trên 4
bit thấp.


; 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 1


Bạ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

làm này là ñể bảo toàn trạng thái của 4 bit cao, còn 4 bit thấp ñều hóa
ra bit 0. Người ta quen gọi là cho che 4 bit thấp.




c- Dùng lệnh quay phải 4 lần ñể dời 4 bit cao xuống 4 bit thấp.


Dùng lệnh rr a cho quay bit qua phải, nếu cho quay 4 lần thì 4 bit thấp
sẽ lên nằm ở vùng 4 bit cao và 4 bit cao sẽ xuống nằm ở vùng 4 bit
thấp. Chúng ta nói cho chuyển trạng thái của 4 bit cao xuống vùng 4 bit
thấp. Cũng có thể dùng lệnh swap.




d- Dùng logic Ex-Or ñể phát hiện các bit khác nhau.

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


Lấy logic Dị-OR ñể phát hiện các bit giống nhau hay khác nhau:


Nếu các bit giống nhau, kết quả sẽ là bit 0.

Nếu các bit khác nhau, kết quả sẽ là bit 1.



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.


DJNZ R2,LOOP1 ; ðếm lùi trị trong thanh ghi r2. Nếu chưa bằng 0 thì làm tiếp
lệnh ở LOOP1.

LJMP START ; Nhẩy không ñiều kiện về tên nhãn start ñể lại tiếp tục.
DELAY: MOV R5,#20 ; Chương trình dùng làm trễ (xem lại phần thí dụ 1)
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END ; Dừng biên dịch.


Phân tích cách viết các câu lệnh
:


Bài này dùng lệnh quay bit qua phải và rồi cho quay bit qua trái ñể dời
bit 0 lần lượt ñi qua 8 chân của port 1, chúng ta biết bit 0 sẽ làm sáng
Led. Như vậy Bạn sẽ thấy các Led trên port 1 sẽ lần lượt sáng và nhẩy
qua phải rồi ñổi chiều nhẩy qua trái. ðể bit 0 có thể ñi ñủ trên 8 chân
của port 1, chúng ta dùng lệnh quay có quay qua bit cờ C (rrl và rlc), dĩ
nhiên trước ñó phài nhờ set bit cờ C lên mức 1.


Trình bày lệnh quay rrc và rlc bằng hình minh họa (Bạn xem hình):


a- 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 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
.



Bài 5: Viết chương trình ñể mạch phát ra tiếng cảnh
báo.
Tín hiệu 1KHz và 500Hz phát ra trên chân 1 (p1.0), thời gian phát tín
hiệu 1KHz là 100ms và thời gian phát tín hiệu 500Hz là 200ms.

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


Khóa ñiện trên chân 8 (p1.7)

dùng tắt mở tín hiệu cảnh báo.



FLAG BIT 00h ; ðịnh nghĩ Flag dùng làm bit cờ, hiện có trị là 0.
ORG 0000H
START: JB P1.7,START ; Chờ ñặt nút K1 ñặt xuống mức 0.
JNB FLAG,NEXT ; Nếu bit cờ Flag là 0 thì nhẩy ñến tên nhãn
NEXT.
MOV R2,#200 ; Nạp số thập phân 200 vào thanh ghi r2.
DV: CPL P1.0 ; Lấy bù chân p1.0, lệnh bù bit có chức năng tự
ñảo.
LCALL DELY500 ; Cho gọi chương trình làm trễ 500us.
LCALL DELY500 ; gọi lần nữa chương trình dely500.
DJNZ R2,DV ; Cho ñếm lùi và thực hiện lệnh bù cpl p1.0 ñến
200 lần.
CPL FLAG ; ðảo bit trong cờ Flag.
NEXT: MOV R2,#200 ; Nạp lại số thập phân 200 vào thanh ghi r2.

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ịch


Phâ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ư:



flag BIT 0 ; Chữ flag do Bạn tự ñặt là một BIT, hiện có giá trị là bit 0.


Bạn dùng lệnh nhẩy theo bit ñể kiểm tra khóa ñiện K1.


start: jb p1.7, start

; Lệnh này sẽ chờ chân p1.7 xuống bit 0, nếu
không nó sẽ luôn dừng lại ở ñây.


cpl p1.0 ; Lệnh lấy bù trên chân p1.0, nghĩa là nó ñang ở mức 0 thì
cho chuyển lên 1 và ngước lại.


Phân tích các câu lệnh trên Bạn thấy:


Loa sẽ hú với tín hiệu 1000us (do 2 lần gọi dely500) và kéo dài 200 lần
rồi chuyển qua hú với tín hiệu 500us (do chỉ gọi dely500 có 1 lần) cũng
thức hiện 200 lần. Với cách tạo ra tín hiệu hú 2 nhịp này, Bạn sẽ nghe
tiếng hú từ Loa phát ra, tín hiệu nghe như tiếng còi hụ cảnh báo




Bài 6: Viết chương trình dùng cách lấy dữ liệu khai
báo trong bảng, ñể tắt mở 8 Led trên port 1.


* 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.

DELAY: MOV R4,#20 ; Viết chương trình con dùng làm trễ, tên nhãn là
delay
D1: MOV R5,#248 ; Nạp trị thập phân 248 vào r5.
DJNZ R5,$ ; Cho giảm theo bước -1, chờ r5 bằng 0.
DJNZ R4,D1 ; Cho r4 giảm theo bước -1, chưa bằng 0, nhẩy về
D1.
DJNZ R3,DELAY ; Cho r3 giảm theo bước -1, chưa bằng 0, nhẩy về
DELAY.
RET ; Quay lại chạy câu lệnh nằm sau lệnh call.


TABLE: DB 0FEH,0FDH,0FBH,0F7H ; Khai báo các dữ liệu ñặt trong bảng, tên bảng là
TABLE.
DB 0EFH,0DFH,0BFH,07FH ; các dữ liệu lần lượt sắp trong bảng.
DB 0FEH,0FDH,0FBH,0F7H ; các dữ liệu lần lượt sắp trong bảng.

DB 0EFH,0DFH,0BFH,07FH ; các dữ liệu lần lượt sắp trong bảng.
DB 07FH,0BFH,0DFH,0EFH ; các dữ liệu lần lượt sắp trong bảng.

DB 0F7H,0FBH,0FDH,0FEH ; các dữ liệu lần lượt sắp trong bảng.

DB 07FH,0BFH,0DFH,0EFH ; các dữ liệu lần lượt sắp trong bảng.

DB 0F7H,0FBH,0FDH,0FEH ; các dữ liệu lần lượt sắp trong bảng.

DB 00H, 0FFH,00H, 0FFH ; các dữ liệu lần lượt sắp trong bảng.

DB 01H ; Dữ liệu dùng soa sánh ñể nhẩy (Xem câu
lệnh trên).
END ; Dừng biên dịch tại ñây.




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.



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

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

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

01111111b ñổi ra dạng mã hệ 16 sẽ là 07FH.


Bạn cứ liệt kê ra trong bảng. Sau này sẽ dùng lệnh: movc a, @a +
dptr. ðể lấy các mã này cất vào a. Ý nghĩa của câu lệnh này như sau:


Nếu khởi ñầu a=0 thì nó sẽ lấy mã dữ liệu ñầu trong bảng và rồi cất
vào thanh ghia.

Bạn dùng lệnh inc dptr dể cho trị trong a tăng lên +1.

Vậy khi dùng câu lệnh: movc a, @a +dptr, Bạn sẽ cho lấy mã dữ liệu
tiếp theo


Sau mỗi lần lấy dữ liệu từ bảng ra, Bạn dùng câu lệnh nhẩy theo phép
so sánh: cjne a, #01h, loop1 ñể xem ñã lấy ñến mã dữ liệu cuối cùng
chưa, vì Bạn ñặt mả 01H ở cuối bảng.


Ghi nhận: Dùng cách viết này, Bạn rất dễ chọn các kiểu nhấp nháy cho
các Led trên port 1. Bạn chỉ cần khai báo các mã ñiều khiển trong bảng
là ñược. bạn có thể khai báo theo dạng mã nhị phân cho dễ nhìn thấy

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


“3” hay 4FH

“4” hay 66H

“5” hay 6DH

“6” hay 7DH

“7” hay 07H

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

“8” hay 7FH

“9” hay 6FH
“A” hay 77H
“b” hay 7CH
“C” hay 39H
“d” hay 5EH
“E” hay 79H
“F” hay 71H

Do vậy ñể tạo ra bảng hiển thị các số thập phân, chúng ta sẽ viết như
sau:

TABLE DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH


ORG 0000h

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):



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

Khi chân trên port 2 ở mức áp cao, thì Led tương ứng sẽ phát sáng. Vậy
chúng ta có thể ñặt mã ñể trên ñèn Led 7 ñoạn lần lượt hiện ra các con
số thập phân.




Hình cho thấy các mã tương ứng với các con số thập phân hiện trên
bảng ñèn số dùng Led 7 ñoạn.

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




Bài 8: Viết mạch ñếm số hiển thi theo hệ cơ 2 với 4
Led trên các chân 1 (p1.0), 2 (p1.1), 3 (p1.2), 4
(p1.3). Mỗi lần nhấn khóa ñiện SP1 trên chân 17
(p3.7) thì sẽ tăng lên +1.

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


ORG 0000h
START: MOV R1,#00H ; Cho khởi ñầu với trị 0 trong thanh ghi r1.

MOV A,R1 ; 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.

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

×