PAGE1
PAGE1
PIC18F系列的定时器与计数器
定时器概述
定时器在嵌入式系统中是非常重要的组件,它们用于各种时间相关的任务,如延时、定时中断、脉宽调制(PWM)等。PIC18F系列单片机提供了多个定时器模块,每个模块都有不同的功能和特点。本节将详细介绍PIC18F系列单片机中的定时器与计数器模块,包括定时器的基本配置、中断处理、和实际应用。
PIC18F系列单片机中的定时器模块主要有:
Timer0
Timer1
Timer2
Timer3
Timer4/5
每个定时器模块都有不同的寄存器和配置选项,可以实现不同的功能。下面我们将分别详细介绍这些定时器模块。
Timer0
基本配置
Timer0是一个8位定时器/计数器模块,可以通过软件配置为定时器或外部计数器。Timer0的主要寄存器包括:
TMR0:8位定时器/计数器寄存器
T0CON:定时器0控制寄存器
INTCON:中断控制寄存器
T0CON寄存器的配置如下:
T0CS:选择定时器/计数器的时钟源(0=内部时钟,1=外部时钟)
T0SE:选择定时器/计数器的计数方式(0=低电平到高电平,1=高电平到低电平)
PSA:预分频器分配(0=预分频器分配给T0,1=预分频器分配给WDT)
T0PS:预分频器设置(000=1:2,001=1:4,…,111=1:256)
T08BIT:选择8位或16位模式(0=16位模式,1=8位模式)
T0GO/DONE:定时器开始/停止(1=开始,0=停止)
中断处理
Timer0可以通过配置INTCON寄存器中的TMR0IE和TMR0IF位来启用和处理中断。下面是一个简单的中断配置示例:
//配置Timer0为定时器模式,内部时钟源,预分频1:256
T0CON=0//T0CS=0,T0PS=111,T08BIT=1,T0GO/DONE=1
//使能全局中断和TMR0中断
INTCON=0//GIE=1,TMR0IE=1,TMR0IF=0
//设置TMR0中断服务例程
voidinterrupthigh_priorityISR(){
if(INTCONbits.TMR0IF){//检查TMR0中断标志
TMR0=0;//重置TMR0寄存器
INTCONbits.TMR0IF=0;//清除中断标志
//在这里添加中断处理代码
}
}
//主程序
voidmain(){
//初始化定时器
TMR0=0;//初始化TMR0寄存器
PIE1=0;//关闭其他外设中断
PIR1=0;//清除其他外设中断标志
T0CON=0//配置Timer0
INTCON=0//使能全局中断和TMR0中断
while(1){
//主程序循环
}
}
实际应用
Timer0可以用于生成精确的延时。下面是一个使用Timer0生成1秒延时的示例:
#includepic18f4520.h
voiddelay_1s(){
TMR0=0;//重置TMR0寄存器
T0CON=0//配置Timer0为内部时钟源,预分频1:256
INTCONbits.TMR0IF=0;//清除中断标志
//计算延时时间
unsignedintcount=0;
while(count256){
while(!INTCONbits.TMR0IF);//等待TMR0中断
TMR0=0;//重置TMR0寄存器
INTCONbits.TMR0IF=0;//清除中断标志
count++;
}
}
voidmain(){
//初始化定时器
T0CON=0//配置Timer0
INTCON=0//使能全局中断和TMR0中断
while(1){
delay_1s();//生成1秒延时
//在这里添加1秒延时后的处理代码
}
}
Timer1
基本配置