PAGE1
PAGE1
7.定时器与计数器
7.1定时器的基本概念
定时器是单片机中的一个重要功能模块,用于产生延时、测量时间间隔或生成周期性事件。在PIC16系列单片机中,定时器通常由一个或多个寄存器组成,这些寄存器可以被配置为计数器或定时器。定时器的基本工作原理是通过一个时钟源(如内部振荡器或外部时钟源)来增加计数器的值,当计数器达到预设的最大值时,会产生一个中断或触发其他事件。
PIC16系列单片机提供了多个定时器模块,包括定时器0、定时器1和定时器2。每个定时器都有不同的功能和配置选项,可以根据具体的应用需求选择合适的定时器。
7.1.1定时器0(Timer0)
定时器0是一个8位定时器/计数器,可以配置为定时器或计数器模式。在定时器模式下,它使用内部时钟源(通常为Fosc/4)。在计数器模式下,它可以使用外部时钟源(通过T0CKI引脚输入)。
7.1.1.1定时器0的寄存器
定时器0的主要寄存器包括:
TMR0:8位定时器/计数器寄存器,用于存储当前计数值。
T0CON:定时器0控制寄存器,用于配置定时器0的各种工作模式和选项。
INTCON:中断控制寄存器,用于控制定时器0的中断。
7.1.1.2定时器0的配置
定时器0的配置主要通过T0CON寄存器进行。以下是T0CON寄存器的各位定义:
位|名称|描述|
|—-|——|——|
7|T0CS|时钟源选择位(0=内部时钟,1=外部时钟)|
6|T0SE|计数器源选择位(仅在外部时钟模式下有效)|
5|PSA|预分频器选择位(0=预分频器分配给定时器0,1=预分频器分配给其他外设)|
4|T0PS|预分频器比率选择位(000=1:2,001=1:4,…,111=1:256)|
3|T08B|8位或16位定时器选择位(0=8位,1=16位)|
2|T0GO|定时器0运行控制位(0=停止,1=运行)|
1|T0IF|定时器0中断标志位(由硬件置位,通过软件清零)|
0|T0IE|定时器0中断使能位(0=禁用,1=使能)|
7.1.1.3定时器0的使用示例
以下是一个使用定时器0产生1秒延时的示例代码:
#includexc.h
#includehtc.h
//配置定时器0
voidconfigTimer0(){
//选择内部时钟源
T0CONbits.T0CS=0;
//分配预分频器给定时器0
T0CONbits.PSA=0;
//预分频器比率选择1:256
T0CONbits.T0PS=0b111;
//使能定时器0中断
INTCONbits.T0IE=1;
//清除定时器0中断标志位
INTCONbits.T0IF=0;
//启动定时器0
T0CONbits.T0GO=1;
}
//定时器0中断服务程序
void__interrupt()ISR_Timer0(){
//清除定时器0中断标志位
INTCONbits.T0IF=0;
//重新加载定时器0值
TMR0=0;
//执行1秒延时后的操作
//例如:点亮LED
PORTAbits.RA0=1;
}
intmain(){
//配置端口
TRISAbits.TRISA0=0;//设置RA0为输出
PORTAbits.RA0=0;//初始化RA0为低电平
//配置定时器0
configTimer0();
//配置全局中断
INTCONbits.GIE=1;
while(1){
//主循环
}
return0;
}
7.1.1.4计数器模式
在计数器模式下,定时器0可以通过T0CKI引脚接收外部时钟信号。外部时钟信号的频率可以灵活配置,适用于脉冲计数等应用。
7.1.1.4.1计数器模式配置
voidconfigTimer0Counter(){
//选择外部时钟源
T0CONbits.T0CS=1;