การใช้งานไทเมอร์ 0
     ไทเมอร์ 0 เป็นไทเมอร์ที่มีขนาด 16 บิต สามารถใช้งานเป็นตัวกำหนดเวลาหรือไทเมอร์ได้ เช่น การนำไปสร้างเวลาหน่วง, สร้างเป็นตัวนับหรือเคาน์เตอร์ (Counter) เช่น การนับเวลาที่เกิดขึ้นภายในเวลาหนึ่งๆ

     ไทเมอร์ 0 มีโหมดการทำงานทั้งหมด 4 โหมด ในการเลือกใช้งานโหมดใดนั้น จะต้องเลือกผ่านรีจิสเตอร์ TMOD (Timer Mode) และการควบคุมการทำงานต่าง ๆ ของไทเมอร์จะควบคุมผ่านทางรีจิสเตอร์ TCON (Timer Control)

รีจิสเตอร์ TMOD (Timer Mode)
     TMOD เป็นรีจิสเตอร์ฟังก์ชั่นพิเศษ (SFR) แอดเดรส 89H เป็นรีจิสเตอร์ขนาด 8 บิต ไม่สามารถเข้าถึงได้ในระดับบิต ใช้สำหรับเลือกโหมดการทำงานทั้งไทเมอร์ 0 และไทเมอร์ 1 การใช้งานหลักๆ ประกอบด้วย
         
          การตั้งเวลา (Timer mode)
          การนับจำนวนเหตุการณ์ที่เกิดขึ้น (Counter mode)
          สร้าง Baud rate สำหรับการสื่อสารแบบอนุกรม
GATE เป็นบิตที่ใช้ควบคุมการทำงานของไทเมอร์ 0 และไทเมอร์ 1 โดยมีการกำหนดบิตดังนี้
     GATE = 0 กำหนดให้ไทเมอร์ 0 และไทเมอร์ 1 ทำงาน โดยจะถูกควบคุมจากบิต TR0 (หรือ TR1) ใน                       รีจิสเตอร์ TCON อีกที
     GATE = 1 กำหนดให้ไทเมอร์ 0 และไทเมอร์ 1 ทำงาน โดยจะถูกควบคุมจากภายนอกที่ขาอิเทอร์รัปต์
                      INT0 (หรือ INT1) ของ MCS-51 พร้อมกับการควบคุมจากบิต TR0 (หรือ TR1) ในรีจิสเตอร์
                      TCON ด้วย

C/T เป็นบิตที่ใช้กำหนดโหมดการทำงานของไทเมอร์ว่า จะให้เป็นเคาน์เตอร์ (Counter) หรือไทเมอร์
     C/T = 0 กำหนดให้เป็นไทเมอร์ ซึ่งเป็นลักษณะของการตั้งเวลา โดยใช้สัญญาณนาฬิกาจากภายใน
                  MCS-51 เอง
     C/T = 1 กำหนดให้เป็นเคาน์เตอร์ โดยการรับสํญญาณอินพุตจากภายนอกที่ขา T0 และ T1

M1 , M0 ใช้กำหนดโหมดการทำงานของเคาน์เตอร์และไทเมอร์ ซึ่งสามารถแบ่งออกได้เป็น 4 โหมด ด้วยกันคือ โหมด 0, โหมด 1, โหมด 2, โหมด 3 โดยมีรายละเอียดดังนี้

     M1        M0               Mode           อธิบาย
      0            0                โหมด 0          เป็นไทเมอร์ขนาด 13 บิต
      0            1                โหมด 1          เป็นไทเมอร์ขนาด 16 บิต
      1            0                โหมด 2          เป็นไทเมอร์ขนาด 8 บิต และโหลดค่าไบต์สูงไปยังไบต์ต่ำ
                                                            โดยอัตโนมัติเมื่อนับถึงค่า 00
      1            1                โหมด 3          แยกไทเมอร์ 1 และไทเมอร์ 0
รีจิสเตอร์ TCON (Timer/Counter Control)
     TCON เป็นรีจิสเตอร์ฟังก์ชั่นพิเศษ (SFR) แอดเดรส 88H มีขนาด 8 บิต ใช้สำหรับควบคุมการใช้งาน ไทเมอร์และการเกิดอินเทอร์รัปต์ สามารถเข้าถึงในระดับบิตได้ ในสภาวะเริ่มต้นของ MCS-51 เมื่อมีการรี
เซตจะกำหนดให้รีจิสเตอร์ TCON มีค่าเป็น 00H
TF1 เป็นบิตแสดงสถานะการเกิดโอเวอร์โฟลว์ของไทเมอร์ 1 จะถูกเซตเป็น 1 เมื่อไทเมอร์ 1 เกิดโอเวอร์โฟลว์
        และจะเคลียร์เป็น 0 เมื่อไมโครคอนโทรเลอร์กระโดดไปทำโปรแกรมให้บริการอินเทอร์รัปต์

TR1 เป็นบิตใช้กำหนดให้ไทเมอร์ 1 ทำงาน
        TR1 = 1 ให้ไทเมอร์ 1 ทำงาน
        TR1 = 0 ให้ไทเมอร์ 1 หยุดทำงาน

TF0 มีหน้าที่เหมือนกับ TF1 แต่ใช้กับไทเมอร์ 0

TR0 เป็นบิตใช้กำหนดให้ไทเมอร์ 0 ทำงาน
        TR0 = 1 ให้ไทเมอร์ 0 ทำงาน
        TR0 = 0 ให้ไทเมอร์ 0 หยุดทำงาน

IE1 เป็นบิตแสดงสถานะการเกิดอินเทอร์รัปต์ที่ขา INT 1 จะถูกเซตเป็น 1 เมื่อเกิดอินเทอร์รัปต์ที่ขา INT 1        และจะเคลียร์เป็น 0 เมื่อประมวลผลอินเทอร์รัปต์เสร็จเรียบร้อยแล้ว

IT1 เป็นบิตที่ใช้้กำหนดให้อินเทอร์รัปต์ INT 1 ตรวจจับสัญญาณที่ขอบขาลง หรือขอบขาขึ้น
       IT1 = 1 ตรวจจับที่ขอบขาลง
       IT1 = 0 ตรวจจับที่ขอบขาขึ้น

IE0 มีหน้าที่เหมือนกับ IE1 แต่ใช้กับ INT 0

IT0 มีหน้าที่เหมือนกับ IT1 แต่ใช้กับ INT 0
กำหนดค่าเริ่มต้นการนับให้กับรีจิสเตอร์ TLx และ THx
     ในการใช้งานไทเมอร์ ค่าเริ่มต้นจากการนับจะต้องไปเก็บไว้ในรีจิสเตอร์ THx และ TLx (เมื่อ x เป็น 0 หรือ 1
สำหรับไทเมอร์ 0 และไทเมอร์ 1) เมื่อไทเมอร์ทำงานค่าข้อมูลที่อยู่ในรีจิสเตอร์ THx และ TLx จะเพิ่มขึ้นทีละค่า
จนเป็น 1 ทุกบิต (THx = FFH และ TLx = FFH) และเมื่อนับอีกครั้ง ค่าข้อมูลจะวนกลับไปเป็น 0 ทุกบิต เรียกว่า
การนับเกินหรือโอเวอร์โฟลว์ (Overflow)
กลับสู่หน้าหลัก
ตัวอย่างการใช้งาน
     เป็นโปรแกรมกำเนิดความถี่ 50 Hz โดยการใช้ไทเมอร์ 0 เป็นตัวสร้างเวลาหน่วงทุกๆ 10 ms ที่ความถี่ 12 MHz
กำหนดให้ PORT2 บิตที่ 0 เป็นขาเอาต์พุต

#include <reg51.h>

sbit Ouput = P2^0;

void delay_10ms(void);

/*********** Main Program **********/
void main (void)
{
     TMOD = 0x01;

     while(1)
          {
          Ouput = 1;
          delay_10ms();
          Ouput = 0;
          delay_10ms();
          }
}
/********************************/

void delay_10ms(void)
{
     // 12Mhz/12 = 100Khz
     // 1/100Khz = 1us
     // Over_Time/1us
     // 10ms/1us = 10000
     // 65536 - 10000 = 55536 = D8F0
          TH0 = 0xD8;
          TL0 = 0xF0;
          TR0 = 1;           // ไทเมอร์ 0 ทำงาน
     while(!TF0);
          TR0 = 0;           // ไทเมอร์ 0 หยุดทำงาน
          TF0 = 0;           
}

CODE