Uploaded on

Tap lenh co_ban

Tap lenh co_ban

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • hay
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
1,841
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
157
Comments
1
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 3. Lập trình với ngôn ngữ ASSEMBLYNgô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ậnra 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ốndo mã thừa như lập trình bằng ngôn ngữ C, một chương trình viết bằng Assemblychạ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ở rabấ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ỉ 0000hmain: ;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ìninc 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 P0call delay ;Gọi hàm delayjmp main ;Nhảy đến nhãn maindelay: ;Khai báo nhãn delay để lệnh call gọi tới1mov R7,#255 ;Chép giá trị 255 vào thanh ghi R7loop: ;Khai báo nhãn loop để nhảy về đâymov R6,#255 ; Chép giá trị 255 vào thanh ghi R7loop1: ;Khai báo nhãn loop1 để nhảy về đâydjnz R6,loop1 ;Giảm thanh ghi R6 đi 1 và nhảy nếu R6>0djnz R7,loop ; Giảm thanh ghi R7đi 1 và nhảy nếu R7>0ret ;Trở về từ hàm delayend ;Kết thúc đoạn codeRú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ệnhend;Kết thúc đoạn codeBắt đầu bằng câu lệnh ORG 0000HTiế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 đếncác tham số lệnh.
  • 2. 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ảnv Các lệnh sao chép dữ liệu:- Tên lệnh: MOVMOV A,Rn (1 byte 1 chu kì máy) Chép nội dung thanh ghi Rn vào thanh ghi AMOV A,data (2 byte 1 chu kì máy) Chép nội dung của data vào thanh ghi AMOV 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 ghiAMOV A,#Data (2 byte 1 chu kì máy) Ghi dữ liệu tức thời vào thanh ghi AMOV 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 AMOV Rn,A (1 byte 1 chu kì máy) Chép nội dung thanh ghi A vào thanh ghi RnMOV Rn,data (2 byte 2 chu kì máy) Chép nội dung của data vào thanh ghi RnMOV Rn,#data (2 byte 1 chu kì máy) Ghi dữ liệu tức thời vào thanh ghi RnMOV data,A (2 byte 1 chu kì máy) Chép nội dung thanh ghi A vào dataMOV data,Rn (2 byte 2 chu kì máy) Chép nội dung thanh ghi Rn vào dataMOV 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 nhauMOV data,@Ri (2 byte 2 chu kì máy) Chép nộii dung ô nhớ do Ri trỏ tới vào dataMOV data,#data (3 byte 2 chu kì máy) Ghi dữ liệu tức thời vào dataMOV @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ớiMOV @Ri,data (2 byte 1 chu kì máy) Chép nội dung data vào ô nhớ do Ri trỏ tới
  • 3. 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ớiMOV DPTR,#data (3 byte 2 chu kì máy) Ghi một hằng 16 bit vào thanh ghi DPTRMOV C,bit (2 byte 1 chu kì máy) Chép một bit trực tiếp vào cờ nhớ CMOV 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 MOVCMOVC 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 MOVXMOVX 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 doDPTR 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àiMOVX @DPTR,A (1 byte 2 chu kì máy) Chép nội dung thanh ghi A ra ngoài- Tên lệnh PUSHPUSH 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 POPPOP 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 XCHXCH A,Rn (1 byte 1 chu kì máy) Trao đổi dữ liệu giữa thanh ghi A và thanh ghi RnXCH A,data (2 byte 1 chu kì máy) Trao đổi dữ liệu giữa thanh ghi A và dataXCH 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 XCHDXCHD 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ớiv Các lệnh số học- Tên lệnh ADDADD A,data (2 byte 1 chu kì máy) A=A+dataADD A,@Ri (1 byte 1 chu kì máy) A=A+@RiADD A,#data (2 byte 1 chu kì máy) A=A+#dataADD A,Rn (1 byte 1 chu kì máy) A=A+Rn- Tên lệnh ADDCADDC A,Rn (1 byte 1 chu kì máy) A=A+Rn+CADDC A,@Ri (1 byte 1 chu kì máy) A=A+@Ri+CADDC A,data (2 byte 1 chu kì máy) A=A+data+C
  • 4. ADDC A,#data (2 byte 1 chu kì máy) A=A+#data+C- Tên lệnh SUBBSUBB A,Rn (1 byte 1 chu kì máy) A=A-Rn-CSUBB A,data (2 byte 1 chu kì máy) A=A-data-CSUBB A,@Ri (1 byte 1 chu kì máy) A=A-@Ri-CSUBB A,#data (2 byte 1 chu kì máy) A=A-#data-C- Tên lệnh INCINC A (1 byte 1 chu kì máy) Tăng nội dung thanh ghi A lên 1INC Rn (1 byte 1 chu kì máy) Tăng nội dung thanh ghi Rn lên 1INC data (2 byte 1 chu kì máy) Tăng data lên 1INC @Ri (1 byte 1 chu kì máy) Tăng nội dung ô nhớ do Ri trỏ tới lên 1INC DPTR (1 byte 2 chu kì máy) Tăng nội dung thanh ghi DPTR lên 1- Tên lệnh DECDEC A (1 byte 1 chu kì máy) Giảm nội dung thanh ghi A xuống 1DEC Rn (1 byte 1 chu kì máy) Giảm nội dung thanh ghi Rn xuống 1DEC data (2 byte 1 chu kì máy) Giảm data xuống 1DEC @Ri (1 byte 1 chu kì máy) Giảm nội dung ô nhớ do Ri trỏ tới 1- Tên lệnh MULMUL AB (1 byte 4 chu kì máy) Nhân nội dung thanh ghi A với thanh ghi B. Byte caolư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 DIVDIV AB (1 byte 4 chu kì máy) Chia nội dung thanh ghi A cho thanh ghi B. Phần nguyênlư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 DADA 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 ANLANL A,Rn (1 byte 1 chu kì máy) AND nội dung thanh ghi A với Rn, llưu vào thanh ghiAANL A,data (2 byte 1 chu kì máy) AND nội dung thanh ghi A với data, lưu vào thanhghi AANL A, @Ri (1 byte 1 chu kì máy) AND nội dung thanh ghi A với @Ri, lưu vào thanhghi AANL A,#data (2 byte 1 chu kì máy) AND nội dung thanh ghi A với #data, lưu vào thanhghi A
  • 5. ANL data,A (2 byte 1 chu kì máy) AND nội dung thanh ghi A với data, lưu vào dataANL data,#data (3 byte 2 chu kì máy) AND data với #data, lưu vào dataANL C,bit (2 byte 2 chu kì máy) AND C với bit, lưu vào CANL 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 ORLORL 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 AORL A,data (2 byte 1 chu kì máy) OR nội dung thanh ghi A với data, lưu vào thanh ghiAORL A,@Ri (1 byte 1 chu kì máy) OR nội dung thanh ghi A với @Ri, lưu vào thanh ghiAORL A,#data (2 byte 1 chu kì máy) OR nội dung thanh ghi A với #data, lưu vào thanhghi AORL data, A (2 byte 1 chu kì máy) Ornội dung thanh ghi A với data, lưu vào dataORL data,#data (3 byte 1 chu kì máy) OR data với #data, lưu vào dataORL C,bit (2 byte 2 chu kì máy) OR C với bit, lưu vào CORL 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 XRLXRL A,Rn (1 byte 1 chu kì máy) XOR nội dung thanh ghi A với Rn, llưu vào thanh ghiAXRL A,data (2 byte 1 chu kì máy) XOR nội dung thanh ghi A với data, lưu vào thanhghi AXRL A,@Ri (1 byte 1 chu kì máy) XOR nội dung thanh ghi A với @Ri, lưu vào thanhghi AXRL A,#data (2 byte 1 chu kì máy) XOR nội dung thanh ghi A với #data, lưu vào thanhghi AXRL data,A (2 byte 1 chu kì máy) XORnội dung thanh ghi A với data, lưu vào dataXRL data,#data (3 byte 1 chu kì máy) XOR data với #data, lưu vào data- Tên lệnh SETBSETB C (1 byte 1 chu kì máy) Bật cờ nhớ CSETB bit (2 byte 1 chu kì máy) Bật bit trực tiếp- Tên lệnh CLRCLR A (1 byte 1 chu kì máy) Xoá thanh ghi ACLR C (1 byte 1 chu kì máy) Xoá cờ nhớ CCLR bit (2 byte 1 chu kì máy) Xoá bit trực tiếp- Tên lệnh CPLCPL A (1 byte 1 chu kì máy) Lấy bù thanh ghi A
  • 6. CPL C (1 byte 1 chu kì máy) Lấy bù cờ nhớ CCPL bit (2 byte 1 chu kì máy) Lấy bù bit trực tiếp- Tên lệnh RLRL 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 RLCRLC 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 0của A. Bit 7 của A được lưu vào C- Tên lệnh RRRR 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 RRCRRC 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 SWAPSWAP 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 ACALLACALL 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 LCALLLCALL 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 RETRET (1 byte 2 chu kì máy) Trở về từ lệnh gọi chương trình con- Tên lệnh RETIRETI (1 byte 2 chu kì máy) Trở về từ lệnh gọi ngắt- Tên lệnh AJMPAJMP addr11 (2 byte 2 chu kì máy) Nhảy dùng địa chỉ tuyệt đối- Tên lệnh LJMPLJMP addr16 (3 byte 2 chu kì máy) Nhảy dùng địa chỉ dài- Tên lệnh SJMPSJMP rel (2 byte 2 chu kì máy) Nhảy dùng địa chỉ ngắn- Tên lệnh JMPJMP @A+DPTR (1 byte 2 chu kì máy) Nhảy gián tiếptừ con trỏ dữ liệu- Tên lệnh JZJZ rel (2 byte 2 chu kì máy) Nhảy nếu thanh ghi A bằng 0- Tên lệnh JNZJNZ rel (2 byte 2 chu kì máy) Nhảy nếu thanh ghi A khác 0
  • 7. - Tên lệnh JCJC rel (2 byte 2 chu kì máy) Nhảy nếu cờ nhớ C được bật- Tên lệnh JNCJNC rel (2 byte 2 chu kì máy) Nhảy nếu cờ nhớ C không được bật- Tên lệnh JBJB bit,rel (3 byte 2 chu kì máy) Nhảy nếu bit được bật- Tên lệnh JNBJNB bit,rel (3 byte 2 chu kì máy) Nhảy nếu bit không được bật- Tên lệnh JBCJBC 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 CJNECJNE A,data,rel (3 byte 2 chu kì máy) Nhảy nếu A khác dataCJNE A,#data,rel (3 byte 2 chu kì máy) Nhảy nếu A khác #dataCJNE Rn,#data,rel (3 byte 2 chu kì máy) Nhảy nếu Rn khác #dataCJNE @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 DJNZDJNZ Rn,rel (2 byte 2 chu kì máy) Giảm Rn và nhảy khi Rn khác 0DJNZ data,rel (3 byte 2 chu kì máy) Giảm data và nhảy nếu data khác 04. Lập trình nâng caoCá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ớicá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ậptrì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 đềuviế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ó Chọn kiểu cho các bộ đếm – định TMOD 89h Không thời TL0 Byte thấp của timer 0 8Ah Không
  • 8. 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 TIMER7 GATE 1 GATE=0 :Timer 1 bật khi TR1=1. GATE=1 :Timer 1 bật khi TR1=1 và chân INT1=16 C/T 1 C/T=1 : Chọn đếm sự kiện. C/T=0 : Chọn ghi giờ cho timer 15 M1 1 Bit 1 chọn kiểu của timer 14 M0 1 Bit 0 chọn kiểu của timer 13 GATE 0 GATE=0 :Timer 0 bật khi TR0=1. GATE=1 :Timer 0 bật khi TR0=1 và chân INT0=12 C/T 0 C/T=1 : Chọn đếm sự kiện. C/T=0 : Chọn ghi giờ cho timer 01 M1 0 Bit 1 chọn kiểu của timer 00 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 timerM1 M0 CHẾ MÔ TẢ ĐỘ0 0 0 Chế độ timer 13 bit. Nghĩa là timer sử dụng 5 bit TH và 8 bit TL0 1 1 Chế độ timer 16 bit. Nghĩa là timer sử dụng 8 bit TH và 8 bit TL1 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àn1 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
  • 9. 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 địachỉ 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.7TCON. TR1 8Eh Bit điều khiển bật tắt bộ timer 16TCON. TF0 8Dh Bit tràn của timer 0. Khi xảy ra tràn, TF0 tự động bật lên.5TCON. TR0 8Ch Bit điều khiển bật tắt bộ timer 04TCON. IE1 8Bh Cờ cạnh ngắt ngoài 1. Được bật khi có cạnh xuống ở chân3 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ẽ được2 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ân1 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ẽ được0 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 timerChế độ 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
  • 10. 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ề 0000hThời gian tối đa có thể định thời là 1FFFh x 1 (us) = 1FFFh (us) = 8191 (us) (thạch anh12MHz).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ế độ 1Khi 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 anh12MHz).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ế độ 2Khi 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 đó haithanh ghi TL1 và TH1 tạm thời không sử dụng. Chúng ta có thể khởi động nó nhưngcờ 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 chothanh 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 JNBTF0,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 0000hmov TMOD,#00000010b;Chọn timer 0, chế độ 2
  • 11. mov TH0,#206setb TR0;Bật bộ timer 0main:jnb TF0,main;Đợi khi có trànclr TF0;Xoá cờ tràncpl P2.2;Đảo ngõ raajmp main;Tiếp tục vòng mớiend