52单片机定时器/计数器编程汇总

2019-04-15 18:04发布

/*----------------------------------------------------------------------
                            TMOD (89H)
                    T1                                      T0      
GATE    C/T`    M1    M0    GATE    C/T`    M1    M0
------------------------------------------------------------------------
GATE=0时,TR0=1,T0就开始定时/计数
GATE=1时,TR0=1,INT0`=1,T0才开始定时/计数
C/T`=0,计数;C/T`=1,定时
M1    M0    工作方式        功能说明
0     0     方式0      13位定时/计数器(0~8192)
0     1     方式1      16位定时/计数器(0~65536)
1     0     方式2      可自动重载的8位定时/计数器(0~256)
1     1     方式3      定时/计数器0分为两个8位的计数器,关闭T1
------------------------------------------------------------------------
                                   TCON (88H)
TF1     TR1      TF0     TR0      IE1      IT1      IE0     IT0
8FH     8EH     8DH     8CH     8BH    8AH    89H    88H
------------------------------------------------------------------------
TF0/TF1=1,定时/计数器T0/T1溢出
TR0/TR1=0,定时/计数器T0/T1停止计数
TR0/TR1=1,GATE=0,定时/计数器T0/T1开始计数
TR0/TR1=1,GATE=1,INT0`=1/INT1`=1,定时/计数器T0/T1开始计数
IT0/IT1=1,外部中断INT0`/INT1`为边沿触发
IT0/IT1=0,外部中断INT0`/INT1`为低电平触发
IE0/IE1,外部中断INT0`/INT1`有中断请求信号时,置1
------------------------------------------------------------------------
                                 IE (A8H)
EA       -         -         ES       ET1      EX1     ET0     EX0
AFH    AEH   ADH   ACH    ABH     AAH     A9H     A8H
EA=1:允许所有中断      EA=0:禁止所有中断
ES=1:允许串行口中断    ES=0:禁止串行口中断
ET1=1:允许T1中断       ET1=0:禁止T1中断
EX1=1:允许INT1`中断    EX1=0:禁止INT1`中断
ET0=1:允许T0中断       ET0=0:禁止T0中断
EX0=1:允许INT0`中断    EX0=0:禁止INT0`中断
----------------------------------------------------------------------*/
/*---------------------------------------------------------


                  定时器初始化程序


-----------------------------------------------------------*/
void Init_Timer()
{
TMOD |= 0x01;
/* ---------------------------------------------------------------------------------
                        工作方式0    工作方式1   工作方式2    工作方式3
定时器0选用     0x00            0x01           0x02             0x03
定时器1选用     0x00            0x10           0x20             0x30
计数器0选用     0x04            0x05           0x06             0x07
计数器1选用     0x40            0x50           0x60             0x70
---------------------------------------------------------------------------------*/     
TH0=0x00;    //16位:(65536-X)/256 13位:(8192-X)/256 
TL0=0x00;    //16位:(65536-X)%256 13位:(8192-X)%256
EA=1;          //总中断打开
ET0=1;         //定时器0中断打开
TR0=1;         //定时器0开关打开
}
/*---------------------------------------------------------
                 定时器中断子程序
  
interrupt 0  指明是外部中断0 using 0 是第0组寄存器
interrupt 1  指明是定时器中断0 using 1 是第1组寄存器
interrupt 2  指明是外部中断1 using 2 是第2组寄存器
interrupt 3  指明是定时器中断1 using 3 是第3组寄存器
interrupt 4  指明是串行口中断
---------------------------------------------------------*/
void Timer_isr() interrupt 1 using 1
{
 TH0=0x00;   //需重新赋值,除工作方式2外
 TL0=0x00;
}