Tập lệnh cơ bản 8051

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

doc11 trang | Chia sẻ: ttlbattu | Lượt xem: 2679 | Lượt tải: 5download
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=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
Tài liệu liên quan