PAGE1
PAGE1
定时器和计数器
定时器和计数器是PIC18系列单片机中非常重要的外设,它们在许多应用中扮演着关键角色。定时器和计数器可以用来生成精确的时间延迟、测量输入信号的时间间隔、实现脉宽调制(PWM)、计数外部事件等。PIC18系列单片机通常配备多个定时器和计数器模块,包括Timer0、Timer1、Timer2、Timer3和CCP(Capture,Compare,PWM)模块。本节将详细介绍这些定时器和计数器的原理和使用方法,并提供具体的代码示例。
Timer0模块
原理
Timer0是一个8位定时器/计数器模块,可以通过外部时钟或内部时钟进行计数。它具有以下特点:
8位计数器/定时器
可选择内部或外部时钟源
可选择预分频器
可配置为定时器或计数器模式
溢出中断功能
配置
Timer0的配置主要通过三个寄存器:T0CON、TMR0和INTCON来完成。
T0CON寄存器:控制Timer0的工作模式和时钟源。
T0PS[2:0]:预分频器设置
T0CS:时钟源选择
T0SE:计数器模式选择
PSA:预分频器分配选择
T08BIT:8位/16位模式选择
TMR0ON:定时器开启/关闭
TMR0寄存器:存储计数器值。
INTCON寄存器:控制中断使能和中断标志。
TMR0IF:定时器溢出中断标志位
TMR0IE:定时器溢出中断使能位
代码示例
以下是一个使用Timer0生成1秒时间延迟的示例代码。假设主频为20MHz,内部时钟源,预分频器为256。
#includexc.h
#includepic18f4520.h
#define_XTAL_FREQ//定义主频
voidTimer0_Init(){
//设置Timer0为内部时钟源,预分频器为256
T0CON=0
//使能TMR0溢出中断
INTCONbits.TMR0IE=1;
//清除TMR0溢出中断标志
INTCONbits.TMR0IF=0;
//启动Timer0
T0CONbits.TMR0ON=1;
}
void__interrupt()Timer0_ISR(){
//清除TMR0溢出中断标志
INTCONbits.TMR0IF=0;
//重新加载TMR0初始值
TMR0=116;//256-116=140,140*256*4us=140us*256*4us=1s
}
voidmain(){
//配置Timer0
Timer0_Init();
//使能全局中断
INTCONbits.GIE=1;
//主循环
while(1){
//等待中断
}
}
说明
T0CON设置:
T0CON寄存器的T0CS位设置为0,表示使用内部时钟源。
T0PS[2:0]位设置为100,表示预分频器为256。
TMR0ON位设置为1,启动Timer0。
中断配置:
INTCONbits.TMR0IE设置为1,使能TMR0溢出中断。
INTCONbits.TMR0IF设置为0,清除TMR0溢出中断标志。
中断服务例程(ISR):
在ISR中,清除TMR0溢出中断标志TMR0IF。
重新加载TMR0初始值116,以生成1秒的时间延迟。
Timer1模块
原理
Timer1是一个16位定时器/计数器模块,通常用于需要更长计数时间的应用。它具有以下特点:
16位计数器/定时器
可选择内部或外部时钟源
可选择预分频器
可配置为定时器或计数器模式
溢出中断功能
配置
Timer1的配置主要通过四个寄存器:T1CON、TMR1H、TMR1L和PIR1来完成。
T1CON寄存器:控制Timer1的工作模式和时钟源。
T1CKPS[1:0]:预分频器设置
T1OSCEN:振荡器使能
T1SYNC:同步控制
T1SS:时钟源选择
T1RUN:运行模式选择
TMR1ON:定时器开启/关闭
TMR1H和TMR1L寄存器:存储计数器值的高8位和低8位。
PIR1寄存器:控制中断使能和中断标志。
TMR1IF:定时器溢出中断标志位
TMR1IE:定时器溢出中断使能位
代码示例
以下是一个使用Timer1生