N76E003使用定时器进行1ms定时操作

发布时间 2023-08-14 14:45:24作者: lazy12138

新唐单片机N76E003具有定时器中断,下面开始进行定时

#define TH0_INIT        32768      //初始化1ms延时
#define TL0_INIT        32768       //  预定时间(s) * (系统时钟/预分频)

    //*********定时器0初始化*********//
    TMOD = 0XFF;
    TIMER0_MODE1_ENABLE;                    //定时器0模式1使能
    clr_T0M;
    set_T0M;                            //定时器0的时钟选择为系统时钟
    u8TH0_Tmp = (65536-TH0_INIT)/256;        //计算高低八位初值
    u8TL0_Tmp = (65536-TL0_INIT)%256;   

    TH0 = u8TH0_Tmp;                         //定时器初始化初值
    TL0 = u8TL0_Tmp;

    set_ET0;                                 //定时器0使能
    set_EA;                                  //总中断使能
    set_TR0;                                 //开启定时器0中断

是这样进行配置的,系统时钟设置为内部16MHz,  所以周期等于1/16us,0000H—FFFFH=65536  溢出一次*1/16us约等于4.096ms。设定时器初始值为一半,也就是大约2ms。

但是要注意,如果不设定时器时钟为系统时钟:set_T0M;  ,那么系统时钟默认为1/12系统时钟,也就是进行时钟分频。

系统时钟默认为1/12系统时钟时,配置为

    //*********定时器0初始化*********//
    TMOD = 0XFF;
    TIMER0_MODE1_ENABLE;                    //定时器0模式1使能
    clr_T0M;
    u8TH0_Tmp = TIMER_DIV12_VALUE_1ms/256;        //计算高低八位初值
    u8TL0_Tmp = TIMER_DIV12_VALUE_1ms%256;   

    TH0 = u8TH0_Tmp;                         //定时器初始化初值
    TL0 = u8TL0_Tmp;

    set_ET0;                                 //定时器0使能
    set_EA;                                  //总中断使能
    set_TR0;                                 //开启定时器0中断

而 TIMER_DIV12_VALUE_1ms 来自于新唐自带的工程里。相关宏定义在  Function_define.h 里。

#ifdef FOSC_110592        // if Fsys = 11.0592MHz 
    #define TIMER_DIV12_VALUE_10us            65536-9            //9*12/11.0592 = 10 uS,                  // Timer divider = 12 for TM0/TM1
    #define TIMER_DIV12_VALUE_1ms                65536-923        //923*12/11.0592 = 1 mS                    // Timer divider = 12
    #define TIMER_DIV12_VALUE_10ms            65536-9216    //18432*12/22118400 = 10 ms            // Timer divider = 12
    #define TIMER_DIV4_VALUE_10us                65536-28        //28*4/11.0592 = 10 uS                    // Timer divider = 4    for TM2/TM3
    #define TIMER_DIV4_VALUE_1ms                65536-2765    //2765*4/11.0592 = 1 mS                    // Timer divider = 4
    #define TIMER_DIV4_VALUE_100us            65536-277        //553*4/22118400 = 100 us                // Timer divider = 4
    #define TIMER_DIV4_VALUE_200us            65536-553        //1106*4/22118400 = 200 us            // Timer divider = 4
    #define TIMER_DIV4_VALUE_500us            65536-1383    //2765*4/22118400 = 500 us            // Timer divider = 4        
    #define TIMER_DIV16_VALUE_10ms            65536-6912    //1500*16/22118400 = 10 ms            // Timer divider = 16
    #define TIMER_DIV64_VALUE_30ms            65536-5184    //10368*64/22118400 = 30 ms            // Timer divider = 64
    #define TIMER_DIV128_VALUE_100ms        65536-8640    //17280*128/22118400 = 100 ms        // Timer divider = 128
    #define TIMER_DIV128_VALUE_200ms        65536-17280    //34560*128/22118400 = 200 ms        // Timer divider = 128
    #define TIMER_DIV256_VALUE_500ms        65536-21600    //43200*256/22118400 = 500 ms     // Timer divider = 256
    #define TIMER_DIV512_VALUE_1s                65536-21600    //43200*512/22118400 = 1 s            // Timer divider = 512
#endif