一、简介


        九齐单片机NY8B062F 有四组定时器,可用系统时钟当作一般的计时应用或者从外部讯号触发来计数。另外 NY8B062F 提供 4 组 10 位的 PWM 输出,3 组蜂鸣器输出,可用来驱动马达、LED、或蜂鸣器等等。PWM与定时器功能是复用的,如果选择某一个为定时器,那么就不可以再配置为PWM输出了,同理,如果选择为PWM输出,就不可以用作定时器了。值得注意的是,NY8B062F定时器0为上数定时器,定时器1,2,3,为下数定时器。

二、定时器0


        定时器 0 是 8 位上数定时器,由寄存器T0EN(PCON1[0])开启/关闭。写入定时器 0 将会设定其初始值,读取定时器 0 时则会显示目前的计数数值。与定时器0配置有关的寄存器有PCON1,TMR0,T0MD,此外如果要用定时器中断的话还有中断使能寄存器INTE和中断标志位寄存器INTF

2.1  PCON1寄存器

        PCON1中的最低位 Bit0 :T0EN 控制定时器0的开关,可以直接单独对这一位操作,所以用定时器0的话这个寄存器只需要直接操作T0EN就行了。

T0EN = 0;    // 关闭定时器0

T0EN = 1;    // 开启定时器0

图2.1  T0EN

2.2  TMR0(定时器 0 寄存器)

         TMR0寄存器用于读写定时器0的初值,当计算好每数一个数值的时间后,就可以给一个初值,来得到你想要的计数值,如果不赋初值的话,一个定时器周期就会直接溢出。定时器0是8位上数,即最大赋值256,从0数到初值就会溢出然后从0重新上数,我们先赋初值125,后面会用到。

TMR0 = 0x7C;    // 赋初值124,从0开始数0-124即为125个计数

图2.2  TMR0

2.3  T0MD(定时器0控制寄存器)

        T0MD的八位控制定时器0的功能,定时器具体的计数周期也是由这个寄存器控制,具体的作用如图2.3所示。

        预分频比是对定时器时钟源频率进行分频来作为定时器的频率,比如我们选择系统指令时钟作为定时器0的时钟源,那么T0MDBit7Bit5都选择为0。

        系统的指令时钟在配置字节表中选择,比如说我们选择4MHZ,4T,那么指令时钟就等于4MHZ/4T = 1MHZ

        Bit4是选择外部时钟源时才有作用,这里我们没有选择外部时钟源就不用管,默认值即可。

        Bit3是选择将分频器分配给看门狗WDT还是定时器0,这里我们分配给定时器0,WDT我们后面会在低功耗中去讲解。

        Bit2到Bit0控制分频比,具体分频多少取决于你要的计时周期,比如我选择1:32即32分频,那么定时器0的时钟频率就是1MHZ / 32 = 31250HZ,时钟周期就为32us。这里结合刚才2.2中的初值,我们赋初值125,那么定时器每溢出一次的时间就为32us * 125 = 4000us = 4ms,我们就得到了定时器0每溢出一次的周期。我们以4ms为基准时基,那么就可以计时1s,1min,1hour等,定时器0就可以当做计时器用在我们的系统当中了。当然如果需要更小的计时周期,比如100us,1ms,那么就自己计算合适的分频比与初值即可,有时不一定能得到正好的整数,就会有误差,这个要注意。

T0MD = 0x04;    // 0000 0100 选择指令周期为时钟源,预分频器分到定时器0,32分频

图2.3  T0MD

2.4  定时器0完整代码

        一般定时器都会作为定时器中断去使用,这样每一次中断时间就是4ms,中断250次就是1s。

DISI();          // 关中断

T0EN = 0;        // 关闭定时器0

TMR0 = 0x7C;     // 赋初值124,从0开始数0-124即为125个计数
T0MD = 0x04;     // 0000 0100 选择指令周期为时钟源,预分频器分到定时器0,32分频

T0EN = 1;        // 开启定时器0

T0IE = 1;        // 定时器0中断使能
T0IF = 0;        // 定时器0中断标志初始清零

ENI();           // 开总中断

三、定时器1   2   3


        定时器 1,2 ,3是具有预分频器 1,2,3 的 10 位下数定时器,其预分频比是可编程的。定时器 1,2,3  的输出可以被用于产生PWM1,2,3 输出与蜂鸣器 1,2,3 输出。这三个定时器可以说是复制粘贴的定时器,略有不同的就是一些数据,控制寄存器的地址不一样。因为他们都是十位寄存器,所以最大初值可以是11 1111 1111,即0x3FF

3.1  定时器1 2 3 高字节寄存器

        定时器 1,2的高字节存储在一个寄存器TMRH中,如图3.1.1,TMRH Bit7 Bit6 是定时器2的两个高字节,Bit5 Bit4是定时器1的两个高字节,如果用到的话要记得配置这四个高字节。TMRH低四位是PWM占空比寄存器,这个后面讲PWM时会讲,目前暂时用不到,默认为0000。

TMRH = 0x00;     // 00 00 0000,定时器2跟定时器1高字节都设置为00,用到哪个设置哪个

图3.1.1  TMRH

        定时器 3的高字节存储在TM3RH中,同理定时器1,2,不再赘述,如图3.1.2所示。

TM3RH = 0x00;    // 0000 0000

图3.1.2  TM3RH

3.2  定时器1 2 3低八位字节寄存器与控制寄存器

        定时器 1,2,3 都是三个功能相同的寄存器,TMR1,2,3 寄存器,T1 / 2 / 3 CR1寄存器,T1 / 2 / 3 CR2寄存器,不再重复赘述,只以定时器1为例,其他两个同理 。忽略PWM有关,默认为0,选择连续计数模式重载值下数 ,指令时钟为时钟源,开启分频器,分频比为1:32,开启定时器 。配置代码如下,寄存器如图 3.2 所示,以定时器1为例,其他两个完全一样。

TMR1  = 0x7C;     // 定时器1 初值125
T1CR1 = 0x03;     // 0000 0011 开启定时器1,连续下数重载值模式
T1CR2 = 0x04;    // 0000 0100 指令时钟源,开启分频器,分频比1:32

TMR2  = 0x7C;     // 定时器2 初值125
T2CR1 = 0x03;     // 0000 0011 开启定时器2,连续下数重载值模式
T2CR2 = 0x04;    // 0000 0100 指令时钟源,开启分频器,分频比1:32

TMR3  = 0x7C;     // 定时器3 初值125
T3CR1 = 0x03;     // 0000 0011 开启定时器3,连续下数重载值模式
T3CR2 = 0x04;    // 0000 0100 指令时钟源,开启分频器,分频比1:32

图3.2   三个寄存器合集

       

四、总结

        定时器0,1,2,3完整代码(开启定时器中断功能)如下:

DISI();           // 关中断

// 定时器0 配置
T0EN = 0;         // 关闭定时器0

TMR0 = 0x7C;      // 赋初值124,从0开始数0-124即为125个计数
T0MD = 0x04;      // 0000 0100 选择指令周期为时钟源,预分频器分到定时器0,32分频

T0EN = 1;         // 开启定时器0

T0IE = 1;         // 定时器0中断使能
T0IF = 0;         // 定时器0中断标志初始清零



// 定时器1 配置
TMRH  = 0x00;     // 定时器1 高字节设置
TMR1  = 0x7C;     // 定时器1 初值125
T1CR1 = 0x03;     // 0000 0011 开启定时器1,连续下数重载值模式
T1CR2 = 0x04;    // 0000 0100 指令时钟源,开启分频器,分频比1:32

T1IE  = 1;        // 定时器1中断使能
T1IF  = 0;        // 定时器1中断标志初始清零



// 定时器2 配置
TMRH  = 0x00;     // 定时器2 高字节设置
TMR2  = 0x7C;     // 定时器2 初值125
T2CR1 = 0x03;     // 0000 0011 开启定时器2,连续下数重载值模式
T2CR2 = 0x04;    // 0000 0100 指令时钟源,开启分频器,分频比1:32

T2IE  = 1;        // 定时器1中断使能
T2IF  = 0;        // 定时器1中断标志初始清零



// 定时器3 配置
TM3RH = 0x00;     // 定时器3 高字节设置
TMR3  = 0x7C;     // 定时器3 初值125
T3CR1 = 0x03;     // 0000 0011 开启定时器3,连续下数重载值模式
T3CR2 = 0x04;    // 0000 0100 指令时钟源,开启分频器,分频比1:32

INTE2 = 0x01;     // 定时器3 中断使能,中断标志初始清零 T3IE = 1; T3IF = 0;


ENI();            // 开总中断
// 定时器0,1,2的中断使能位在INTE寄存器中,标志位在INTF寄存器中,而定时器3的中断使能与标志都在IMTE2寄存器中,故配置中断时略有差异,因为此单片机有的支持位操作,有的不支持,如果定时器3也支持位操作的话,就没什么区别了





Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐