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
11 trang |
Chia sẻ: ttlbattu | Lượt xem: 2956 | Lượt tải: 5
Bạn đang xem nội dung tài liệu Tập lệnh cơ bản 8051, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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 GHI
TÁC DỤNG
ĐỊA CHỈ
ĐỊA CHỈ HÓA 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Ộ TIMER
TÁC DỤNG
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 CHỈ
TÁC DỤNG
TCON.7
TF1
8Fh
Bit tràn của timer 1. Khi xảy ra tràn, TF1 tự động bật lên.
TCON.6
TR1
8Eh
Bit điều khiển bật tắt bộ timer 1
TCON.5
TF0
8Dh
Bit tràn của timer 0. Khi xảy ra tràn, TF0 tự động bật lên.
TCON.4
TR0
8Ch
Bit điều khiển bật tắt bộ timer 0
TCON.3
IE1
8Bh
Cờ cạnh ngắt ngoài 1. Được bật khi có cạnh xuống ở chân 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.2
IT1
8Ah
Cờ kiểu ngắt 1 ngoài. Nếu cờ này bật, ngắt ngoài sẽ được 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.1
IE0
89h
Cờ cạnh ngắt ngoài 0 Được bật khi có cạnh xuống ở chân 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.0
IT0
88h
Cờ kiểu ngắt 0 ngoài. Nếu cờ này bật, ngắt ngoài sẽ được 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=50usCứ sau 50us thì đảo chân P2.2. Vậy thì thanh ghi TL phải đếm từ giá trị = 256 – 50 = 206Ta 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