//******************************************************************** // Ver 1.0 // 2021.08.12 1、新建文件。 //******************************************************************** #ifndef __TIMER__H #define __TIMER__H //定时器0/1工作模式 #define T0_MODE_BIT 0 #define T0_MODE_REG TMOD #define T1_MODE_BIT 4 #define T1_MODE_REG TMOD #define T3_MODE_BIT 0 #define T3_MODE_REG T34MOD #define T4_MODE_BIT 4 #define T4_MODE_REG T34MOD //定时器0/1门控 #define T0_GATE_BIT 3 #define T0_GATE_REG TMOD #define T1_GATE_BIT 7 #define T1_GATE_REG TMOD //定时器0/1定时、计数功能选择 #define T0_CT_BIT 2 #define T0_CT_REG TMOD #define T1_CT_BIT 6 #define T1_CT_REG TMOD //定时器0/1/3/4/5计数寄存器 #define T0_TH_REG TH0 #define T0_TL_REG TL0 #define T1_TH_REG TH1 #define T1_TL_REG TL1 #define T3_TH_REG TH3 #define T3_TL_REG TL3 #define T4_TH_REG TH4 #define T4_TL_REG TL4 //定时器0/1/3/4时钟选择,1=Fsys/4,0=Fsys/12 #define T0_CLK_DIV_BIT 3 #define T0_CLK_DIV_REG CKCON #define T1_CLK_DIV_BIT 4 #define T1_CLK_DIV_REG CKCON #define T3_CLK_DIV_BIT 2 #define T3_CLK_DIV_REG T34MOD #define T4_CLK_DIV_BIT 6 #define T4_CLK_DIV_REG T34MOD //定时器使能位 #define T0_ON_BIT 4 #define T0_ON_REG TCON #define T1_ON_BIT 6 #define T1_ON_REG TCON #define T3_ON_BIT 3 #define T3_ON_REG T34MOD #define T4_ON_BIT 7 #define T4_ON_REG T34MOD //定时器比较输出 #define T0_OUT_BIT 1 #define T0_OUT_REG TCON1 #define T1_OUT_BIT 5 #define T1_OUT_REG TCON1 //定义虚寄存器,防止编译报错 #define T3_GATE_BIT 3 #define T3_GATE_REG NULL_REG #define T4_GATE_BIT 3 #define T4_GATE_REG NULL_REG #define T5_GATE_BIT 3 #define T5_GATE_REG NULL_REG #define T3_CT_BIT 2 #define T3_CT_REG NULL_REG #define T4_CT_BIT 2 #define T4_CT_REG NULL_REG #define T5_CT_BIT 2 #define T5_CT_REG NULL_REG //******************************************************************** //定时器0/1使用系统时钟2分频作为时钟源, enum { TMR_M0 = 0, //方式0:13 位重装载定时器/计数器 TMR_M1 = 1, //方式1:16 位定时器/计数器 TMR_M2 = 2, //方式2:8 位自动重装初值定时器/计数器 TMR_M3 = 3, //方式3:T0 分成两个(TL0/TH0)独立的8 位定时器/计数器;T1停止计数 }; //设定定时器0/1工作模式 #define TMR_Mode(Tn, Value) Tn##_MODE_REG=(Tn##_MODE_REG&(~(0x03 << Tn##_MODE_BIT)))|(Value << Tn##_MODE_BIT) //******************************************************************** //定时器0/1门控制 #define TMR_Gate(Tn, GATE) do{ \ if(GATE == DISABLE) Tn##_GATE_REG &= ~(1 << Tn##_GATE_BIT); \ else Tn##_GATE_REG |= (1 << Tn##_GATE_BIT); \ }while(0) //******************************************************************** //定时器0/1 CT设置 enum { TMR_TIMER_MODE = 0, //定时器模式 TMR_CNT_MODE = 1, //计数器模式 }; #define TMR_CT(Tn, CT) do{ \ if(CT == TMR_TIMER_MODE) Tn##_CT_REG &= ~(1 << Tn##_CT_BIT); \ else Tn##_CT_REG |= (1 << Tn##_CT_BIT); \ }while(0) //******************************************************************** //时钟源选择,定时器0/1定时器1可用 #define TMR_SYSCLK_DIV12 0 #define TMR_SYSCLK_DIV4 1 #define TMR_ClkSrc(Tn, CLK_SRC) do{ \ if(CLK_SRC == TMR_SYSCLK_DIV12) Tn##_CLK_DIV_REG &= ~(1 << Tn##_CLK_DIV_BIT); \ else Tn##_CLK_DIV_REG |= (1 << Tn##_CLK_DIV_BIT); \ }while(0) //******************************************************************** //设定定时器0/1/3/4/5初值 #define TMR_Reload(Tn, Value) do{ \ Tn##_TH_REG=(INT8U)(Value>>8); \ Tn##_TL_REG=(INT8U)Value; \ }while(0) //******************************************************************** //定时器0/1初始化,默认设置使用系统时钟,4分频, 16位定时器 enum { T0_BIT = 0, //定时器0 T1_BIT = 0, //定时器1 T3_BIT = 1, //定时器3 T4_BIT = 1, //定时器4 }; #define TMR_Init(Tn, TICK) do{ \ TMR_ClkSrc(Tn, TMR_SYSCLK_DIV4); \ TMR_Gate(Tn, DISABLE); \ TMR_CT(Tn, TMR_TIMER_MODE); \ TMR_Mode(Tn, TMR_M1); \ TMR_Reload(Tn, 0xffff - (OSC_SYS_FREQ / 4) / (TICK)); \ }while(0) //定时器1、4作为波特率发生器,工作在模式2,8位自动重载 #define TMR_BaudInit(Tn, Baud) do{ \ TMR_Mode(Tn, TMR_M2); \ TMR_ClkSrc(Tn, TMR_SYSCLK_DIV4); \ Tn##_TH_REG = 0xff - (OSC_SYS_FREQ / (4 * 4)) / Baud; \ TMR_On(Tn, ENABLE); \ }while(0) //******************************************************************** //定时器0/1/2/3启动、停止控制 #define TMR_On(Tn, NewState) do{ \ if(NewState == DISABLE) Tn##_ON_REG &= ~(1 << Tn##_ON_BIT); \ else Tn##_ON_REG |= (1 << Tn##_ON_BIT); \ }while(0) //******************************************************************** //定时器0/1比较输出控制 #define TMR_Out(Tn, NewState) do{ \ if(NewState == DISABLE) Tn##_OUT_REG &= ~(1 << Tn##_OUT_BIT); \ else Tn##_OUT_REG |= (1 << Tn##_OUT_BIT); \ }while(0) #endif