You are on page 1of 11

3.

Lập trình với ngôn ngữ ASSEMBLY


Ngôn ngữ Assembly là hợp ngữ rất gần với ngôn ngữ máy. Mỗi lệnh của Assembly có sự
tiêu tốn dữ liệu (byte) và chu kì máy xác định. Do đó, chúng ta có thể dễ dàng nhận ra sự
bố trí dữ liệu của chương trình. Lập trình bằng Assembly không có sự tiêu tốn do mã thừa
như lập trình bằng ngôn ngữ C, một chương trình viết bằng Assembly chạy nhanh và hiệu
quả hơn nhiều so với chương trình viết bằng C.
Tuy nhiên do Assembly rất gần với ngôn ngữ máy nên đòi hỏi người lập trình phải có
một trí nhớ tốt, nếu không, chúng ta phải chuẩn bị một chồng sách để có thể mở ra bất cứ
lúc nào. Và chúng ta rất khó có thể viết một chương trình lớn bằng Assembly.
a. Cấu trúc một chương trình Assembly:
Chúng ta hãy tham khảo đoạn code viết bằng Assembly để tìm hiểu cấu trúc của nó.
Chương trình nhấp nháy LED theo mã nhị phân tăng dần:
org 0000h ;Chương trình bắt đầu từ địa chỉ 0000h
main: ;Khai báo nhãn để sau này dùng câu lệnh nhảy để nhảy tới đây
;Thụt vào 1 kí tự tab cho dễ nhìn
inc a ;Tăng giá trị thanh ghi a lên một đơn vị
mov P0,a ;Chép nội dung thanh ghi a vào cổng P0
call delay ;Gọi hàm delay
jmp main ;Nhảy đến nhãn main
delay: ;Khai báo nhãn delay để lệnh call gọi tới1
mov R7,#255 ;Chép giá trị 255 vào thanh ghi R7
loop: ;Khai báo nhãn loop để nhảy về đây
mov R6,#255 ; Chép giá trị 255 vào thanh ghi R7
loop1: ;Khai báo nhãn loop1 để nhảy về đây
djnz R6,loop1 ;Giảm thanh ghi R6 đi 1 và nhảy nếu R6>0
djnz R7,loop ; Giảm thanh ghi R7đi 1 và nhảy nếu R7>0
ret ;Trở về từ hàm delay
end ;Kết thúc đoạn code
Rút ra cấu trúc của chương trình như sau:
org 0000h;Bắt đầu đoạn code
...;Đoạn lệnh
end;Kết thúc đoạn code
Bắt đầu bằng câu lệnh ORG 0000H
Tiếp đến là đoạn lệnh. Trong đoạn lệnh có các nhãn để rẽ nhánh chương trình.
Mỗi lệnh bắt đều bắt đầu bằng tên lệnh, tiếp theo là kí tự trắng hay kí tự tab, rồi đến các
tham số lệnh.
Mỗi lệnh chỉ được viết trên 1 dòng.
Kết thúc bằng câu lệnh END
Chú ý: Trong Asembly không phân biệt chữ hoa hay chữ thường. Dòng chú thích được
đặt sau dấu chấm phẩy ‘;’.
b. Các lệnh cơ bản trong Assembly:
Kí hiệu được dùng dưới đây:
o Rn: Kí hiệu cho các thanh ghi R0 đến R7 (của băng thanh ghi được chọn).
o Data: Dữ liệu trực tiếp, là 1 byte dữ liệu bên trong RAM hoặc thanh ghi chức năng đặc
biệt.
o @Ri: 1 byte dữ liệu vùng RAM được đánh địa chỉ bởi thanh ghi R0 hoặc R1.
o #data: 1 byte dữ liệu tức thời (là những con số do người lập trình đặt sẵn).
o #data16: 2 byte dữ liệu tức thời (là những con số của người lập trình).
o Addr16: 16 bit địa chỉ của các lệnh nhảy xa và gọi xa.
o Addr11: 11 bit địa chỉ của các lệnh nhảy tuyệt đối và gọi tuyệt đối.
o Rel: 8 bit địa chỉ có dấu của các lệnh nhảy gần và gọi gần.
Các lệnh cơ bản
v Các lệnh sao chép dữ liệu:
- Tên lệnh: MOV
MOV A,Rn (1 byte 1 chu kì máy) Chép nội dung thanh ghi Rn vào thanh ghi A
MOV A,data (2 byte 1 chu kì máy) Chép nội dung của data vào thanh ghi A
MOV A,@Ri (1 byte 1 chu kì máy) Chép nội dung của ô nhớ do Ri trỏ tới vào thanh ghi
A
MOV A,#Data (2 byte 1 chu kì máy) Ghi dữ liệu tức thời vào thanh ghi A
MOV A,@A+DPTR (1 byte 2 chu kì máy) Chép nội dung của ô nhớ chương trình có địa
chỉ A+DPTR vào thanh ghi A
MOV Rn,A (1 byte 1 chu kì máy) Chép nội dung thanh ghi A vào thanh ghi Rn
MOV Rn,data (2 byte 2 chu kì máy) Chép nội dung của data vào thanh ghi Rn
MOV Rn,#data (2 byte 1 chu kì máy) Ghi dữ liệu tức thời vào thanh ghi Rn
MOV data,A (2 byte 1 chu kì máy) Chép nội dung thanh ghi A vào data
MOV data,Rn (2 byte 2 chu kì máy) Chép nội dung thanh ghi Rn vào data
MOV data,data (3 byte 2 chu kì máy) Chép nội dung hai dữ liệu trực tiếp data với nhau
MOV data,@Ri (2 byte 2 chu kì máy) Chép nộii dung ô nhớ do Ri trỏ tới vào data
MOV data,#data (3 byte 2 chu kì máy) Ghi dữ liệu tức thời vào data
MOV @Ri,A (1 byte 1 chu kì máy) Chép nội dung của thanh ghi A vào ô nhớ do Ri trỏ
tới
MOV @Ri,data (2 byte 1 chu kì máy) Chép nội dung data vào ô nhớ do Ri trỏ tới
MOV @Ri,#data (2 byte 1 chu kì máy) Ghi dữ liệu trực tiếp vào ô nhớ do Ri trỏ tới
MOV DPTR,#data (3 byte 2 chu kì máy) Ghi một hằng 16 bit vào thanh ghi DPTR
MOV C,bit (2 byte 1 chu kì máy) Chép một bit trực tiếp vào cờ nhớ C
MOV bit,C (2 byte 2 chu kì máy) Chép trạng thái cờ nhớ C vào một bit trực tiếp
- Tên lệnh MOVC
MOVC A,@A+PC (1 byte 2 chu kì máy) Chép nội dung ô nhớ chương trình có địa chỉ
A+PC vào thanh ghi A
- Tên lệnh MOVX
MOVX A,@Ri (1 byte 2 chu kì máy) Chép nội dung của ô nhớ bộ nhớ ngoài do Ri trỏ tới
vào thanh ghi A (8 bit địa chỉ)
MOVX A,@DPTR (1 byte 2 chu kì máy) Chép nội dung của ô nhớ bộ nhớ ngoài do
DPTR trỏ tới vào thanh ghi A (16 bit địa chỉ)
MOVX @Ri,A (1 byte 2 chu kì máy) Chép nội dung thanh ghi A ra ngoài
MOVX @DPTR,A (1 byte 2 chu kì máy) Chép nội dung thanh ghi A ra ngoài
- Tên lệnh PUSH
PUSH data (2 byte 2 chu kì máy) Chép data lên ngăn xếp và tăng SP
- Tên lệnh POP
POP data (2 byte 2 chu kì máy) Chép dữ liệu từ ngăn xếp vào data và giảm SP
- Tên lệnh XCH
XCH A,Rn (1 byte 1 chu kì máy) Trao đổi dữ liệu giữa thanh ghi A và thanh ghi Rn
XCH A,data (2 byte 1 chu kì máy) Trao đổi dữ liệu giữa thanh ghi A và data
XCH A,@Ri (1 byte 1 chu kì máy) Trao đổi dữ liệu giữa thanh ghi A và ô nhớ do Ri trỏ
tới
- Tên lệnh XCHD
XCHD A,@Ri (1 byte 1 chu kì máy) Trao đổi hai nibble thấp của thanh ghi A và ô nhớ
do Ri trỏ tới
v Các lệnh số học
- Tên lệnh ADD
ADD A,data (2 byte 1 chu kì máy) A=A+data
ADD A,@Ri (1 byte 1 chu kì máy) A=A+@Ri
ADD A,#data (2 byte 1 chu kì máy) A=A+#data
ADD A,Rn (1 byte 1 chu kì máy) A=A+Rn
- Tên lệnh ADDC
ADDC A,Rn (1 byte 1 chu kì máy) A=A+Rn+C
ADDC A,@Ri (1 byte 1 chu kì máy) A=A+@Ri+C
ADDC A,data (2 byte 1 chu kì máy) A=A+data+C
ADDC A,#data (2 byte 1 chu kì máy) A=A+#data+C
- Tên lệnh SUBB
SUBB A,Rn (1 byte 1 chu kì máy) A=A-Rn-C
SUBB A,data (2 byte 1 chu kì máy) A=A-data-C
SUBB A,@Ri (1 byte 1 chu kì máy) A=A-@Ri-C
SUBB A,#data (2 byte 1 chu kì máy) A=A-#data-C
- Tên lệnh INC
INC A (1 byte 1 chu kì máy) Tăng nội dung thanh ghi A lên 1
INC Rn (1 byte 1 chu kì máy) Tăng nội dung thanh ghi Rn lên 1
INC data (2 byte 1 chu kì máy) Tăng data lên 1
INC @Ri (1 byte 1 chu kì máy) Tăng nội dung ô nhớ do Ri trỏ tới lên 1
INC DPTR (1 byte 2 chu kì máy) Tăng nội dung thanh ghi DPTR lên 1
- Tên lệnh DEC
DEC A (1 byte 1 chu kì máy) Giảm nội dung thanh ghi A xuống 1
DEC Rn (1 byte 1 chu kì máy) Giảm nội dung thanh ghi Rn xuống 1
DEC data (2 byte 1 chu kì máy) Giảm data xuống 1
DEC @Ri (1 byte 1 chu kì máy) Giảm nội dung ô nhớ do Ri trỏ tới 1
- Tên lệnh MUL
MUL AB (1 byte 4 chu kì máy) Nhân nội dung thanh ghi A với thanh ghi B. Byte cao lưu
trong thanh ghi B, byte thấp lưu trong A. Nếu kết qủa lớn hơn 255 thì cờ OV bật, nếu
không thì bị xoá. Cờ C luôn bị xoá.
- Tên lệnh DIV
DIV AB (1 byte 4 chu kì máy) Chia nội dung thanh ghi A cho thanh ghi B. Phần nguyên
lưu trong thanh ghi A, phần dư lưu trong thanh ghi B. Cờ C và cờ OV đều bị xoá.
- Tên lệnh DA
DA A (1 byte 1 chu kì máy) Hiệu chỉnh thập phân cho thanh ghi A.
v Các lệnh luận lý
- Tên lệnh ANL
ANL A,Rn (1 byte 1 chu kì máy) AND nội dung thanh ghi A với Rn, llưu vào thanh ghi
A
ANL A,data (2 byte 1 chu kì máy) AND nội dung thanh ghi A với data, lưu vào thanh ghi
A
ANL A, @Ri (1 byte 1 chu kì máy) AND nội dung thanh ghi A với @Ri, lưu vào thanh
ghi A
ANL A,#data (2 byte 1 chu kì máy) AND nội dung thanh ghi A với #data, lưu vào thanh
ghi A
ANL data,A (2 byte 1 chu kì máy) AND nội dung thanh ghi A với data, lưu vào data
ANL data,#data (3 byte 2 chu kì máy) AND data với #data, lưu vào data
ANL C,bit (2 byte 2 chu kì máy) AND C với bit, lưu vào C
ANL C,/bit (2 byte 2 chu kì máy) AND C với đảo của bit, lưu vào C
- Tên lệnh ORL
ORL A,Rn (1 byte 1 chu kì máy) OR nội dung thanh ghi A với Rn, llưu vào thanh ghi A
ORL A,data (2 byte 1 chu kì máy) OR nội dung thanh ghi A với data, lưu vào thanh ghi
A
ORL A,@Ri (1 byte 1 chu kì máy) OR nội dung thanh ghi A với @Ri, lưu vào thanh ghi
A
ORL A,#data (2 byte 1 chu kì máy) OR nội dung thanh ghi A với #data, lưu vào thanh
ghi A
ORL data, A (2 byte 1 chu kì máy) Ornội dung thanh ghi A với data, lưu vào data
ORL data,#data (3 byte 1 chu kì máy) OR data với #data, lưu vào data
ORL C,bit (2 byte 2 chu kì máy) OR C với bit, lưu vào C
ORL C,\bit (2 byte 2 chu kì máy) OR C với đảo của bit, lưu vào C
- Tên lệnh XRL
XRL A,Rn (1 byte 1 chu kì máy) XOR nội dung thanh ghi A với Rn, llưu vào thanh ghi
A
XRL A,data (2 byte 1 chu kì máy) XOR nội dung thanh ghi A với data, lưu vào thanh ghi
A
XRL A,@Ri (1 byte 1 chu kì máy) XOR nội dung thanh ghi A với @Ri, lưu vào thanh
ghi A
XRL A,#data (2 byte 1 chu kì máy) XOR nội dung thanh ghi A với #data, lưu vào thanh
ghi A
XRL data,A (2 byte 1 chu kì máy) XORnội dung thanh ghi A với data, lưu vào data
XRL data,#data (3 byte 1 chu kì máy) XOR data với #data, lưu vào data
- Tên lệnh SETB
SETB C (1 byte 1 chu kì máy) Bật cờ nhớ C
SETB bit (2 byte 1 chu kì máy) Bật bit trực tiếp
- Tên lệnh CLR
CLR A (1 byte 1 chu kì máy) Xoá thanh ghi A
CLR C (1 byte 1 chu kì máy) Xoá cờ nhớ C
CLR bit (2 byte 1 chu kì máy) Xoá bit trực tiếp
- Tên lệnh CPL
CPL A (1 byte 1 chu kì máy) Lấy bù thanh ghi A
CPL C (1 byte 1 chu kì máy) Lấy bù cờ nhớ C
CPL bit (2 byte 1 chu kì máy) Lấy bù bit trực tiếp
- Tên lệnh RL
RL A (1 byte 1 chu kì máy) Dịch trái thanh ghi A. Giá trị của bit 7 lưu vào bit 0.
- Tên lệnh RLC
RLC A (1 byte 1 chu kì máy) Dịch trái thanh ghi A. Giá trị cũ của C được lưu vào bit 0
của A. Bit 7 của A được lưu vào C
- Tên lệnh RR
RR A (1 byte 1 chu kì máy) Dịch phải thanh ghi A. Giá trị của bit 0 được lưu vào bit 7.
- Tên lệnh RRC
RRC A (1 byte 1 chu kì máy) Dịch phải thanh ghi A. Giá trị của C lưu vào bit 7 của A,
bit 0 của A lưu vào C
- Tên lệnh SWAP
SWAP A (1 byte 1 chu kì máy) Hoán chuyển hai nibble của thanh ghi A.
v Các lệnh chuyển điều khiển
- Tên lệnh ACALL
ACALL addr11 (2 byte 2 chu kì máy) Gọi chương trình con dùng địa chỉ tuyệt đối
- Tên lệnh LCALL
LCALL addr16 (3 byte 2 chu kì máy) Gọi chương trình con dùng địa chỉ dài
- Tên lệnh RET
RET (1 byte 2 chu kì máy) Trở về từ lệnh gọi chương trình con
- Tên lệnh RETI
RETI (1 byte 2 chu kì máy) Trở về từ lệnh gọi ngắt
- Tên lệnh AJMP
AJMP addr11 (2 byte 2 chu kì máy) Nhảy dùng địa chỉ tuyệt đối
- Tên lệnh LJMP
LJMP addr16 (3 byte 2 chu kì máy) Nhảy dùng địa chỉ dài
- Tên lệnh SJMP
SJMP rel (2 byte 2 chu kì máy) Nhảy dùng địa chỉ ngắn
- Tên lệnh JMP
JMP @A+DPTR (1 byte 2 chu kì máy) Nhảy gián tiếptừ con trỏ dữ liệu
- Tên lệnh JZ
JZ rel (2 byte 2 chu kì máy) Nhảy nếu thanh ghi A bằng 0
- Tên lệnh JNZ
JNZ rel (2 byte 2 chu kì máy) Nhảy nếu thanh ghi A khác 0
- Tên lệnh JC
JC rel (2 byte 2 chu kì máy) Nhảy nếu cờ nhớ C được bật
- Tên lệnh JNC
JNC rel (2 byte 2 chu kì máy) Nhảy nếu cờ nhớ C không được bật
- Tên lệnh JB
JB bit,rel (3 byte 2 chu kì máy) Nhảy nếu bit được bật
- Tên lệnh JNB
JNB bit,rel (3 byte 2 chu kì máy) Nhảy nếu bit không được bật
- Tên lệnh JBC
JBC bit,rel (3 byte 2 chu kì máy) Nhảy nếu bit được bật rồi xoá bit
- Tên lệnh CJNE
CJNE A,data,rel (3 byte 2 chu kì máy) Nhảy nếu A khác data
CJNE A,#data,rel (3 byte 2 chu kì máy) Nhảy nếu A khác #data
CJNE Rn,#data,rel (3 byte 2 chu kì máy) Nhảy nếu Rn khác #data
CJNE @Ri,#data,rel (3 byte 2 chu kì máy) Nhảy nếu ô nhớ do Ri trỏ tới khác data
- Tên lệnh DJNZ
DJNZ Rn,rel (2 byte 2 chu kì máy) Giảm Rn và nhảy khi Rn khác 0
DJNZ data,rel (3 byte 2 chu kì máy) Giảm data và nhảy nếu data khác 0
4. Lập trình nâng cao
Các bạn đã làm quen với những câu lệnh sao chép dữ liệu, các lệnh số học, lệnh logic,
lệnh chuyển điều khiển. Bây giờ dựa trên các câu lệnh trên, chúng ta sẽ làm quen với các
công việc lập trình về bộ đếm – địinh thời, lập trình truyền thông nối tiếp, lập trình ngắt.
Do ngôn ngữ C chạy không hiệu quả bằng Assembly, ngôn ngữ C không phát huy hết
được khả năng của vi điều khiển. Do đó tất cả các chương trình từ nay về sau đều viết
bằng ngôn ngữ Assembly.
a. Lập trình bộ đếm và định thời (timer):
· Khảo sát các thanh ghi chức năng đặc biệt của bộ đếm – định thời (timer):

TÊN THANH ĐỊA CHỈ HÓA


TÁC DỤNG ĐỊA CHỈ
GHI BIT

TCON Điều khiển các bộ đếm – định thời 88h Có

TMOD Chọn kiểu cho các bộ đếm – định thời 89h Không

TL0 Byte thấp của timer 0 8Ah Không

TL1 Byte thấp của timer 1 8Bh Không


TH0 Byte cao của timer 0 8Ch Không

TH1 Byte cao của timer 1 8Dh Không

Bảng 1: Các thanh ghi đặc biệt của bộ timer


· Khảo sát thanh ghi TMOD:
Là thanh ghi dùng để chọn chế độ cho các bộ timer. Thanh ghi này không được địa chỉ
hoá các bit và điều này cũng không cần thiết.

BIT TÊN BỘ TÁC DỤNG


TIMER

7 GATE 1 GATE=0 :Timer 1 bật khi TR1=1. GATE=1 :Timer 1 bật khi
TR1=1 và chân INT1=1

6 C/T 1 C/T=1 : Chọn đếm sự kiện. C/T=0 : Chọn ghi giờ cho timer 1

5 M1 1 Bit 1 chọn kiểu của timer 1

4 M0 1 Bit 0 chọn kiểu của timer 1

3 GATE 0 GATE=0 :Timer 0 bật khi TR0=1. GATE=1 :Timer 0 bật khi
TR0=1 và chân INT0=1

2 C/T 0 C/T=1 : Chọn đếm sự kiện. C/T=0 : Chọn ghi giờ cho timer 0

1 M1 0 Bit 1 chọn kiểu của timer 0

0 M0 0 Bit 0 chọn kiểu của timer 0

Bảng 2: Các bit trên thanh ghi TMOD


· Các chế độ của timer

M1 M0 CHẾ MÔ TẢ
ĐỘ

0 0 0 Chế độ timer 13 bit. Nghĩa là timer sử dụng 5 bit TH và 8 bit


TL

0 1 1 Chế độ timer 16 bit. Nghĩa là timer sử dụng 8 bit TH và 8 bit


TL

1 0 2 Chế độ timer 8 bit, còn TH dùng để nạp lại giá trị khởi đầu
cho TL khi TL tràn

1 1 3 TL0 và TH0 được sử dụng như hai timer độc lập. TL0 được
điều khiển bằng các bit của timer 0, còn TH0 được điều khiển
bằng các bit của timer 1.

Bảng 3: Các chế độ của timer


· Khảo sát thanh ghi TCON:
Là thanh ghi dùng để khởi động và điều khiển các bộ timer. Thanh ghi này được địa chỉ
hoá các bit.

BIT KÍ HIỆU ĐỊA TÁC DỤNG


CHỈ

TCON. TF1 8Fh Bit tràn của timer 1. Khi xảy ra tràn, TF1 tự động bật lên.
7

TCON. TR1 8Eh Bit điều khiển bật tắt bộ timer 1


6

TCON. TF0 8Dh Bit tràn của timer 0. Khi xảy ra tràn, TF0 tự động bật lên.
5

TCON. TR0 8Ch Bit điều khiển bật tắt bộ timer 0


4

TCON. IE1 8Bh Cờ cạnh ngắt ngoài 1. Được bật khi có cạnh xuống ở chân
3 INT1. Được xoá khi thoát khỏi ngắt cứng định hướng đến thủ
tục phục vụ ngắt ngoài 1.

TCON. IT1 8Ah Cờ kiểu ngắt 1 ngoài. Nếu cờ này bật, ngắt ngoài sẽ được
2 kích hoạt khi có cạnh xuống ở chân INT1. Nếu không thì ngắt
ngoài sẽ được bật khi có mức thấp ở chân INT1.

TCON. IE0 89h Cờ cạnh ngắt ngoài 0 Được bật khi có cạnh xuống ở chân
1 INT0. Được xoá khi thoát khỏi ngắt cứng định hướng đến thủ
tục phục vụ ngắt ngoài 0.

TCON. IT0 88h Cờ kiểu ngắt 0 ngoài. Nếu cờ này bật, ngắt ngoài sẽ được
0 kích hoạt khi có cạnh xuống ở chân INT0. Nếu không thì ngắt
ngoài sẽ được bật khi có mức thấp ở chân INT0.

Bảng 4: Các bit trong thanh ghi TCON


· Nguồn xung nhịp cho các timer
Hình 31: Nguyên tắc cung cấp xung nhịp cho các timer
· Các chế độ của timer
Chế độ 0:
Là chế độ định thời 13 bit. Nguyên tắc hoạt động như sau.
Hình 32: Nguyên tắc hoạt động của chế độ 1
Giá trị bộ đếm trong khoảng từ 0000h đến 1FFFh. Khi giá trị tăng đến 1FFF FFFFh thì cờ
tràn TF bật và giá trị được của bộ timer set về 0000h
Thời gian tối đa có thể định thời là 1FFFh x 1 (us) = 1FFFh (us) = 8191 (us) (thạch anh
12MHz).
Chế độ 1:
Là chế độ định thòi 16 bit với nguyên tắc hoạt động sau:
Hình 33: Nguyên tắc hoạt động chế độ 1
Khi giá trị đếm tăng đến FFFFh thì được set về 0000h và cờ tràn TF được bật.
Giá trị tối đa có thể định thời là FFFFh x 1 (us) = FFFFh (us) = 65535 (us) (thạch anh
12MHz).
Chế độ 2:
Là chế độ tự nạp lại. Byte thấp TL hoạt động định thời 8 bit còn byte cao TH dùng để sử
dụng lưu trữ giá trị nạp lại.
Hình 34: Nguyên tắc hoạt động chế độ 2
Khi giá trị đếm tăng đến FFh thì được set trở lại giá trị của TH (chứ không phải là giá trị
00h) và cờ tràn được bật. Và bộ đếm bắt đầu từ giá trị TH trở lên.
Chế độ 3:
Là chế độ timer chia sẻ. Trong đó thanh ghi TL0 và TH0 hoạt động như hai bộ đếm độc
lập với thanh ghi TL0, TH0 có các cờ tràn tương ứng là TF0 và TF1. Trong đó hai thanh
ghi TL1 và TH1 tạm thời không sử dụng. Chúng ta có thể khởi động nó nhưng cờ tràn
TF1 không bị bật khi có sự tràn xảy ra.
Hình 35: Mô tả hoạt động chế độ 3
· Phương pháp lập trình timer:
> Đặt vào thanh ghi TMOD để chọn đếm hoặc định thời, chọn bộ 0 hoặc 1, chọn chế độ
0,1,2,3.
> Đặt vào các thanh gh TL giá trị cần thiết. Trong chế độ 2 ta nạp giá trị khởi đầu cho
thanh ghi TH
> Bật bit TR để khởi động timer
> Kiểm tra cờ tràn đã bật chưa (bằng lệnh JB TF1,nhãn. Lệnh JB TF0,nhãn. Lệnh JNB
TF0,nhãn. Lệnh JNB TF1,nhãn)
> Nếu cờ tràn đã bật thì xoá cờ, có thể dừng bộ định thời bằng cách xoá bit TR.
· Ví dụ:
Chương trình sau tạo sóng 10 KHz ở chân P2.2
> Nếu thạch anh 12MHz => chu kì xung nhịp = 1us
> Ta có: f=10KHz => T=100us =>T/2=50us
Cứ sau 50us thì đảo chân P2.2. Vậy thì thanh ghi TL phải đếm từ giá trị = 256 – 50 = 206
Ta có chương trình sau:
org 0000h
mov TMOD,#00000010b;Chọn timer 0, chế độ 2
mov TH0,#206
setb TR0;Bật bộ timer 0
main:
jnb TF0,main;Đợi khi có tràn
clr TF0;Xoá cờ tràn
cpl P2.2;Đảo ngõ ra
ajmp main;Tiếp tục vòng mới
end

You might also like