一文读懂单片机的定时器
创作时间:
作者:
@小白创作中心
一文读懂单片机的定时器
引用
CSDN
1.
https://m.blog.csdn.net/RL2698853114/article/details/144980485
单片机(Microcontroller Unit,MCU)是一种集成了处理器、存储器、输入输出接口等组件的微型计算机系统。在嵌入式系统设计中,单片机被广泛应用于各种控制和处理任务中。定时器是单片机中一个非常重要的组件,它能够提供精确的时间控制和事件触发功能,广泛应用于计时、频率测量、PWM(脉宽调制)生成等场合。本文将详细介绍单片机定时器的工作原理、配置方法以及应用实例,帮助读者快速掌握单片机定时器的使用技巧。
定时器的组成
单片机的定时器通常由以下几个部分组成:
- 计数器(Counter) :用于记录时钟脉冲的个数。计数器可以是8位、16位或32位的寄存器,其大小决定了定时器的计数范围。
- 预分频器(Prescaler) :用于对输入时钟进行分频,以降低计数器的计数频率。预分频器的分频比可以是固定的,也可以是可编程的。
- 时钟源(Clock Source) :为定时器提供时钟信号。常见的时钟源包括内部时钟、外部时钟和外部事件触发等。
- 控制寄存器(Control Registers) :用于配置定时器的工作模式、中断使能、预分频器设置等。
- 中断服务程序(Interrupt Service Routine, ISR) :当定时器溢出或达到设定值时,会触发中断,中断服务程序用于处理定时器事件。
定时器的工作原理
定时器的工作过程可以简单概括为以下步骤:
- 初始化配置 :通过控制寄存器设置定时器的工作模式、时钟源、预分频器等参数。
- 启动定时器 :使能定时器开始计数。计数器开始接收时钟信号,并根据预分频器的设置对时钟信号进行分频。
- 计数过程 :计数器在每个时钟周期内增加1,直到达到其最大值(例如,8位计数器的最大值为255)。
- 溢出处理 :当计数器溢出时,会触发中断,中断服务程序会被调用。中断服务程序可以执行一些特定的任务,如更新计数器值、发送信号等。
- 循环计数 :计数器溢出后,通常会自动重置为初始值,继续计数。
单片机定时器的配置方法
选择时钟源
定时器的时钟源决定了计数器的计数频率。常见的时钟源包括:
- 内部时钟 :来自单片机内部振荡器的时钟信号。通常用于简单的定时任务。
- 外部时钟 :来自外部振荡器或时钟源的信号。适用于需要精确时钟的应用。
- 外部事件触发 :由外部事件(如按钮按下、传感器信号等)触发定时器计数。
预分频器用于降低计数器的计数频率,以延长定时器的计时范围。例如,如果时钟源频率为1MHz,预分频器设置为128,则计数器的计数频率为1MHz / 128 = 7.8125kHz。预分频器的设置通常通过控制寄存器中的相应位来实现。
选择工作模式
定时器的工作模式决定了其计数方式和应用场合。常见的工作模式包括:
- 模式0(13位定时/计数器) :适用于8051单片机等。将8位计数器和5位预分频器组合成13位计数器。
- 模式1(16位定时/计数器) :适用于需要较长计时范围的应用。
- 模式2(8位自动重载定时/计数器) :适用于需要周期性定时任务的场合。
- 模式3(两个独立的8位定时/计数器) :适用于需要同时进行两个独立定时任务的应用。
配置中断
定时器溢出或达到设定值时,可以触发中断。中断的配置包括:
- 中断使能 :通过控制寄存器中的中断使能位来启用定时器中断。
- 中断优先级 :设置中断的优先级,以确定中断的响应顺序。
- 中断服务程序 :编写中断服务程序来处理定时器事件。
单片机定时器的应用实例
实例1:简单的延时程序
下面是一个使用定时器实现简单延时的示例代码(以8051单片机为例):
void delay_ms(unsigned int ms) {
TMOD = 0x01; // 设置定时器0为模式1(16位定时/计数器)
TH0 = 0xFC; // 设置定时器初值,定时1ms
for (i = 0; i < ms; i++) {
delay_ms(DELAY_TIME); // 延时1秒
delay_ms(DELAY_TIME); // 延时1秒
}
}
实例2:频率测量
定时器可以用于测量外部信号的频率。下面是一个使用定时器测量频率的示例代码(以STM32为例):
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能TIM2时钟
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // 自动重载寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler = TIM_PRESCALER; // 预分频器值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; // TIM2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能TIM2中断通道
NVIC_Init(&NVIC_InitStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); // 使能TIM2更新中断
TIM_Cmd(TIM2, ENABLE); // 启动定时器
void TIM2_IRQHandler(void) {
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
static unsigned int count = 0;
static unsigned int freq = 0;
static unsigned int last_count = 0;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除TIM2更新中断待处理位
freq = (count - last_count) * 10000; // 计算频率
}
}
实例3:PWM信号生成
定时器可以用于生成PWM信号。下面是一个使用定时器生成PWM信号的示例代码(以AVR单片机为例):
TCCR1A = (1 << WGM11) | (1 << COM1A1);
TCCR1B = (1 << WGM13) | (1 << CS11); // 预分频器设置为8
// 计算定时器的自动重载值,以达到所需的PWM频率
// 例如,假设系统时钟为16MHz,预分频为8,则定时器时钟为2MHz
// 8位定时器的最大值为255,因此频率为2MHz / 256 = 7.8125kHz
ICR1 = (F_CPU / (PWM_FREQ * 8 * 256)) - 1;
OCR1A = (ICR1 * PWM_DUTY_CYCLE) / 100;
代码解释
定时器配置 :
TCCR1A
和TCCR1B
寄存器用于配置定时器1的工作模式和时钟源。WGM11
和WGM13
位设置定时器为快速PWM模式,8位分辨率。COM1A1
位设置为非反转模式,即当计数器值小于OCR1A
时,输出为高电平.CS11
位设置预分频器为8,假设系统时钟为16MHz,则定时器时钟为2MHz.
自动重载值计算 :
ICR1
寄存器用于设置定时器的最大计数值,以达到所需的PWM频率.- 计算公式为
ICR1 = (F_CPU / (PWM_FREQ * 预分频 * 256)) - 1
,其中F_CPU
是系统时钟频率.
占空比设置 :
OCR1A
寄存器用于设置PWM的占空比,计算公式为OCR1A = (ICR1 * PWM_DUTY_CYCLE) / 100
.
端口配置 :
DDRB |= (1 << PB1);
将PB1设置为输出模式,以便将PWM信号输出到该引脚.
通过以上配置,定时器1将生成一个频率为1kHz、占空比为75%的PWM信号,并将其输出到PB1引脚.
热门推荐
婚后买房没写女方名字是共同财产吗
探索川北甘南自然风光:详细自驾游路线与攻略
2加仑花盆有多大?家居植物选择指南
植物风水与家居有何讲究
中药颗粒用多少度水冲最好
【以案释法】楼顶“长”出11米长的天线,为哪般?
如何打好篮球:从基本技能到心理素质的全方位指南
打网球怎么样训练协调性
电动车充电桩安全管理与火灾预防全攻略
电动车消防安全指南:这些错误行为不要有!
最常用的 10 种设计字体及特征
电脑开机显示BIOS has been的解决方法
集成显卡、核显、独显和双显有什么区别?如何选对显卡?入门级别
如何计算贷款提前还款的成本并做出合理决策?
豇豆:一种古老的农作物
集成灶和油烟机的区别和优劣势有哪些
考研专业课:如何应对不同题型的答题策略?
如何获取图片的URL地址
小孩可以喝藏红花泡水吗?
cos函数性质
公司更名后要做什么?一文详解更名流程及注意事项
视觉设计工作室:创意与技术的完美融合
高产玉米种植指南:品种选择与管理技巧详解
UV打印成本详解:从油墨到人工,全面解析UV打印费用构成
哪些情况适合服用安宫牛黄丸?
近亲结婚三代的含义
怎样炖猪脚好吃 汤又好喝
导电材料:类型、特性及应用
腌鹅蛋怎么腌能好吃还出油?腌鹅蛋秘籍大揭秘
嵌甲的日常护理和预防