定时器计数器常用编程方法
定时器计数器常用编程方法
定时器和计数器是嵌入式系统中常用的功能模块,用于实现时间测量、任务调度、PWM生成等功能。
在嵌入式系统的开发中,了解和掌
握常用的定时器计数器编程方法至关重要。
本文将介绍几种常用的定
时器计数器编程方法,以帮助开发者更好地运用定时器计数器。
一、基本概念
在进行定时器计数器编程之前,我们首先需要了解一些基本概念。
1. 定时器:定时器是一种能够按照一定时间周期自动计数,并产生
相应中断或触发事件的硬件模块。
2. 计数器:计数器是一种能够按照外部信号或者内部时钟信号进行
计数,并提供计数结果的硬件模块。
3. 溢出中断:当定时器或计数器的计数值达到最大值后,会发生溢出,并触发溢出中断,用于实现周期性的定时或计数功能。
4. 输入捕获:定时器计数器可以通过输入捕获功能,实时记录外部
事件信号的时间戳,用于时间测量等应用。
二、定时器计数器编程方法
在嵌入式系统中,常用的定时器编程方法包括常规模式、CTC模式、PWM模式等。
下面分别介绍这些方法的基本原理及编程实现。
1. 常规模式
常规模式是定时器最简单的工作模式,通过设置计数器的初值和溢出中断来实现定时功能。
其编程步骤如下:
(1)设置定时器计数器的初值,决定计数器的起点。
(2)使能定时器的溢出中断,当计数器溢出时触发中断。
(3)启动定时器计数。
下面是一个使用常规模式实现定时功能的示例代码:
```C
#include <avr/io.h>
#include <avr/interrupt.h>
void Timer_Init()
{
// 设置计数器初值
TCNT1 = 0;
// 使能溢出中断
TIMSK |= (1 << TOIE1);
// 启动定时器计数,使用外部时钟源
TCCR1B |= (1 << CS12) | (0 << CS11) | (0 << CS10);
}
// 定时器溢出中断处理函数
ISR(TIMER1_OVF_vect)
{
// 处理定时事件
}
int main()
{
Timer_Init();
// 主循环
while (1)
{
// 其他任务处理
}
return 0;
}
```
2. CTC模式
CTC模式(Clear Timer on Compare Match)是一种定时器工作模式,可以实现在指定时间后产生中断或触发事件。
其编程步骤如下:
(1)设置OCRn的值,决定定时器计数器的终点。
(2)使能定时器的输出比较中断。
(3)设置定时器的工作模式,选择CTC模式。
下面是一个使用CTC模式实现定时功能的示例代码:```C
#include <avr/io.h>
#include <avr/interrupt.h>
void Timer_Init()
{
// 设置输出比较匹配值,实现指定时间后的中断
OCR1A = 1000;
// 使能输出比较A中断
TIMSK |= (1 << OCIE1A);
// 启动定时器计数,使用外部时钟源
TCCR1B |= (1 << CS12) | (0 << CS11) | (0 << CS10); // 选择CTC模式
TCCR1A |= (0 << WGM11) | (1 << WGM10);
TCCR1B |= (0 << WGM13) | (1 << WGM12);
}
// 输出比较A中断处理函数ISR(TIMER1_COMPA_vect) {
// 处理定时事件
}
int main()
{
Timer_Init();
// 主循环
while (1)
{
// 其他任务处理
}
return 0;
}
```
3. PWM模式
PWM模式(Pulse Width Modulation)是一种通过调节占空比来产生脉冲信号的定时器工作模式,常用于驱动电机、LED调光等应用。
其编程步骤如下:
(1)设置输出比较匹配值,决定占空比。
(2)设置定时器的工作模式,选择PWM模式。
下面是一个使用PWM模式实现脉冲信号的示例代码:
```C
#include <avr/io.h>
#include <avr/interrupt.h>
void Timer_Init()
{
// 设置输出比较匹配值,决定占空比
OCR2 = 128;
// 启动定时器计数,使用内部时钟源
TCCR2 |= (1 << CS22) | (0 << CS21) | (0 << CS20);
// 选择PWM模式
TCCR2 |= (1 << WGM20) | (1 << WGM21);
TCCR2 |= (0 << COM21) | (1 << COM20);
}
int main()
{
Timer_Init();
// 主循环
while (1)
{
// 其他任务处理
}
return 0;
}
```
三、小结
本文介绍了定时器计数器常用的编程方法,包括常规模式、CTC模
式和PWM模式。
开发者可以根据自己的应用需求选择合适的编程方法。
在编程过程中,需要注意设置计数器初值、输出比较匹配值和选择适
当的工作模式。
熟练掌握这些编程方法,将能够更好地实现定时、计
数和PWM等功能,提升嵌入式系统的性能和稳定性。
单片机原理及接口技术(C51编程)第7章 定时器计数器
图7-14 由外部计数输入信号控制LED的闪烁
(3)设置IE寄存器 本例由于采用T1中断,因此需将IE寄存器的EA、ET1位置1。
(4)启动和停止定时器T1 将寄存器TCON中TR1=1,则启动T1计数;TR1=0,则停止T1计数。
参考程序如下:
#include <reg51.h> void Delay(unsigned int i)
7.4 定时器/计数器的编程和应用 4种工作方式中,方式0与方式1基本相同,只是计数位数不同。方
式0为13位,方式1为16位。由于方式0是为兼容MCS-48而设,计数初 值计算复杂,所以在实际应用中,一般不用方式0,常采用方式1。
7.4.1 P1口控制8只LED每0.5s闪亮一次 【例7-1】在AT89S51的P1口上接有8只LED,原理电路见图7-
当TMOD的低2位为11时,T0被选为方式3,各引脚与T0的逻辑关系 见图7-8。
T0分为两个独立的8位计数器TL0和TH0,TL0使用T0的状态控制位 C/T* 、GATE、TR0 ,而TH0被固定为一个8位定时器(不能作为外部 计数模式),并使用定时器T1的状态控制位TR1,同时占用定时器T1的 中断请求源TF1。
13。采用T0方式1的定时中断方式,使P1口外接的8只LED每0.5s闪亮 一次。
23
图7-13 方式1定时中断控制LED闪亮
24
(1)设置TMOD寄存器 T0工作在方式1,应使TMOD寄存器的M1、M0=01;应设置C/T*=0,为定
时器模式;对T0的运行控制仅由TR0来控制,应使相应的GATE位为0。定时 器T1不使用,各相关位均设为0。所以,TMOD寄存器应初始化为0x01。 (2)计算定时器T0的计数初值
PLC定时、计数器指令(LG)
P020 T000 T000 C000 C000 P060
P021
[ TMR T000 36000 ] [ RST T000 ]
U CTU C000 R < s > 00100
( P060 )
1 小时定时器 计数器 (1小时×100 = 100小时)
·
31
定时器指令
Company Logo
4、 TMON 单稳态定时器
一个闪烁的灯 (TON指令举例 )
[梯级图程序]
利用2个定时器和 P020控制灯周期性闪烁。
P020 T001 T000
[ TON T000 00005 ] [ TON T001 00006 ]
( P065 ) [ END ]
设置Off 时间(0.5s)
设置On 时间 (0.6s)
T000, T001是 100 ms 定时器
U CTU C010 R <S> 00010
( P060 )
P031 P030
C010 P060
设定值
设定值
P030从off变成 on, C010 的当前值加1。 P031是复位条件。
2
计数器指令
Company Logo
2、 CTD Down 计数器
❖ 当在计数脉冲输入检测到一个上升沿的时候,当前值减 1。
P020 T000 P023
[TMON T000 00100 ] ( P061 )
P023 P020
T000
[ RST T000 ]
P061
设定时间 ( t )
设定值
31
振动防止电路 (TMON指定举例)
1.系统图
定时器指令
Company Logo
STN32--定时器计数器(向上计数模式基本配置)
实验一:TIMER-1:定时器上溢,查询溢出后取反LED.故频率计算:f=(72M/(TIM_Prescaler+1)*(1+TIM_Period)) ;定时器的基本设置:1、设置预分频数,得到CK_CNT,TIM_TimeBaseStructure.TIM_Prescaler = 7199;CK_CNT 的计数频率=72M/(7199+1)=10K ;2、设置自动重装载寄存器,当计数值达到这个寄存器锁存数值时,溢出产生事件TIM_TimeBaseStructure.TIM_Period = 9999;10K/(9999+1)=1HZ ,也就是1S 溢出一次;3、设置计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;从0计数到ARR 产生溢出事件;4、 设置时间分割值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;5、 初始化定时器2TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);6、清楚标志TIM_ClearFlag(TIM2, TIM_FLAG_Update);7、打开定时器TIM_Cmd(TIM2, ENABLE);8、在主函数中查询TIM_FLAG_Update 标志置位了就清除标志:if(TIM_GetFlagStatus (TIM2,TIM_FLAG_Update )!=RESET){TIM_ClearFlag (TIM2,TIM_FLAG_Update);if( GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_8)==0)GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_SET);elseGPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_RESET);}时钟预分频 CK_PSC 加减计数器 CK_CNT 达到ARR 的值产生事件实验二、TIMER-1:定时器上溢,中断溢出后取反LED.利用中断的方法:步骤一:定时器的配置1、设置预分频数,得到CK_CNT,TIM_TimeBaseStructure.TIM_Prescaler = 7199;CK_CNT的计数频率=72M/(7199+1)=10K;2、设置自动重装载寄存器,当计数值达到这个寄存器锁存数值时,溢出产生事件TIM_TimeBaseStructure.TIM_Period = 9999;10K/(9999+1)=1HZ ,也就是1S溢出一次;3、设置计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;从0计数到ARR产生溢出事件;4、设置时间分割值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;5、初始化定时器2TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);6、打开中断溢出中断TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);7、打开定时器TIM_Cmd(TIM2, ENABLE);步骤二:编写中断配置void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAM/* Set the Vector Table base location at 0x20000000 */NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);#else /* VECT_TAB_FLASH *//* Set the Vector Table base location at 0x08000000 */NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);#endifNVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) ;NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}注意:加黑的部分,如果你在RAM中编程就要定义VECT_TAB_RAM ,如果在FLASH 编程,则需要NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);如果没有这条预编译语句的话,则很可能会存在进不去中断的错误。
定时计数器
T1端 TR1 GATE l
≥l
TF1
中断
C/T=1 &
控制
INT1端
2.工作方式1 ( M1M0=01 ,16位定时器/计数器) 由TH1和TL1构成16位加1计数器,其他特性与工作 方式0相同。
振荡器 ÷12 C/T=0 TL1 (8位) T1端 TR1 GATE INT1端 l ≥l TH1 (8位)
第6章
定时/计数器
P132
定时/计数器的结构及工作原理 定时/计数器的工作方式 定时/计数器方式和控制寄存器 定时/计数器的编程举例
6.1 概述
在测量控制系统中,常需要有实时时钟和计数器,以实现 定时(或延时)控制以及对外界事件进行计数。 一、常用的定时(或延时)方法: 软件延时:利用执行一个循环程序进行时间延迟。其特点是 定时时间精确,不需外加硬件电路,但占用CPU时间。因此软 件定时的时间不宜过长。 硬件定时:利用硬件电路实现定时。其特点是不占用CPU时 间,通过改变电路元器件参数来调节定时,但使用不够灵活方 便。对于时间较长的定时,常用硬件电路来实现。 可编程定时器/计数器(硬件+软件):通过专用的定时器/ 计数器芯片实现。其特点是通过对系统时钟脉冲进行计数实 现定时,定时时间可通过程序设定的方法改变,使用灵活方 便。也可实现对外部脉冲的计数功能。
TL0,#83H P1.0 TH0,#06H P1.1
;送方式字 ;送时间常数 ;送时间常数 ;送控制宇 ;送中断控制字
;等待中断
;重装时间常数 ;控制方波倒相 ;重装时间常数 ;控制方波倒相
RETI DONE2: MOV CPL RETI
【*例3】试用T1方式2编制程序,在P1.0引脚输出周 期为400S的脉冲方波,已知fosc=12MHZ。
定时器 计数器简单电路编程及梯形图的经验设计法
设计小车自动往返运动的梯形图
正次品分拣机编程实训
控制要求
(1)用启动和停止按钮控制电动机M运行和停止。在电动机运行时,
被检测的产品(包括正次品)在皮带上运行。
(2)产品(包括正、次品)在皮带上运行时,S1(检测器)检测到
SB1 I0.0 M启动按钮 SB2 I0.1 M 停止按钮(常闭) S1 I0.2 检测站1 S2 I0.3 检测站2
输出 M Q0.0 电动机(传送带驱动) Y Q0.1 次品剔除
4 .2根据继电器电路图设计梯形图
将继电器电路图转换为功能相同的PLC的外部接线图和梯形 图的步骤如下: 1)了解和熟悉被控设备的工艺过程和机械的动作情况,根据 继电器电路图分析和掌握控制系统的工作原理,这样才能做 到在设计和调试控制系统时心中有数。 2)确定PLC的输入信号和输出负载,以及与他们对应的梯形 图中的输入位和输出位的地址,画出PLC的外部接线图。 3)确定与继电器电路图的中间继电器、时间继电器对应的梯 形图中的为存储器(M)和定时器(T)的地址。这两步建立 了继电器电路图中的原件和梯形图中编程原件的地址之间的 关系。 4)根据上述对应关系画出梯形图。
T37-T63,T101-T255
2)1ms、10ms、100ms定时器的刷新方式不同。
1ms定时器每隔1ms刷新一次与扫描周期和程序处理无关即采用 中断刷新方式。因此当扫描周期较长时,在一个周期内可能被 多次刷新,其当前值在一个扫描周期内不一定保持一致。
10ms 定时器则由系统在每个扫描周期开始自动刷新。由于每个 扫描周期内只刷新一次,故而每次程序处理期间,其当前值为 常数。
定时器 计数器编程举例
1 定时器
● 定时器的组成框图如图8-1所示。它有3个存储器映象寄存器:TIM、PRD和TCR。这3个寄存器 在数据存储器中的地址及其说明如表8-1所示。定时器控制寄存器(TCR)位结构如图8-2所示, 各控制位和状态位的功能如表8-2所示。
返回首页
图8-1 定时器组成框图
3.中断初始化 (1)中断屏蔽寄存器IMR中的定时屏蔽位TINT0置1,开放定时器0中断。 (2)状态控制寄存器ST1中的中断标志位INTM位清零,开放全部中断。
4.汇编源程序如下:
.mmregs
.def _c_int00
STACK
.usect "STACK",100h
t0_cout
.usect "vars",1 ;计数器
●所 谓 硬 件 配 置 PLL, 就 是 通 过 C54x 的 3 个 引 脚 CLKMD1、CLKMD2 和 CLKMD3的状态,选定时钟方式,如表8-3所示。由表8-3可见,不用PLL 时,CPU的时钟频率等于晶体振荡器频率或外部时钟频率的一半;若用 PLL,CPU 的 时 钟 频 率 等 于 晶 体 振 荡 器 频 率 或 外 部 时 钟 频 率 乘 以 系 数 N (PLLN),使用PLL可以使用比CPU时钟低的外部时钟信号,以减少高 速开关时钟所造成的高频噪声。
INT1
INT2
.space 4*16 .space 4*16 .space 4*16 .space 4*16 .space 4*16 .space 4*16 .space 4*16 .space 4*16 .spac;定时器0寄存器地址
PRD0
.set 0025H
TCR0
.set 0026H
单片机定时器计数器使用方法
单片机定时器计数器使用方法单片机作为嵌入式系统开发的核心部件之一,其定时器计数器具有重要的作用。
定时器计数器可以帮助我们实现时间控制、精确计时等功能。
本文将介绍单片机定时器计数器的使用方法,包括计数模式的设置、时钟选择和定时器中断的应用。
一、计数模式设置单片机定时器计数器可以分为定时计数和事件计数两种模式。
定时计数模式是根据设定的时间间隔进行计数,而事件计数模式是在外部事件触发下进行计数。
下面是单片机定时器计数器初始化的基本步骤:1. 确定计数模式:根据实际需求确定是使用定时计数模式还是事件计数模式。
2. 设置计数器初始值:根据所需的计数时间或计数事件的频率,设置计数器的初始值。
3. 配置计数器控制寄存器:设置计数器的计数模式、时钟源以及其他需要的参数。
4. 启动计数器:使能定时器计数器工作。
二、时钟选择单片机定时器计数器的时钟源可以选择内部时钟或外部时钟。
一般来说,内部时钟具有较高的精度和稳定性,使用起来更为方便。
以下是两种常见的时钟选择方式:1. 使用内部时钟:选择单片机内部提供的时钟源作为定时器计数器的时钟,通过设置寄存器来配置时钟源的频率。
2. 使用外部时钟:当需要更高的计数精度时,可以选择外部时钟源,将外部时钟接入到单片机的引脚,并在寄存器中配置外部时钟源。
三、定时器中断的应用定时器中断是单片机定时器计数器的重要应用之一,可以帮助我们实现精确的时间控制和任务调度。
下面是使用定时器中断的基本步骤:1. 配置中断向量表:为定时器中断向量分配一个唯一的中断向量地址,并将中断处理函数与之关联。
2. 配置中断优先级:如果系统中存在多个中断,需要根据实际情况为定时器中断配置适当的优先级。
3. 设置定时器计数器的中断触发条件:根据需求设置定时器计数器中断触发的条件,可以是定时完成或者达到指定的计数值。
4. 编写中断处理函数:编写定时器中断处理函数,完成需要执行的任务。
5. 启用定时器中断:使能定时器中断,将定时器计数器中的中断触发条件与中断处理函数关联起来。
学习资料 PLC 1-4定时器计数器指令
END 谢谢大家!
延时关机程序
按下启动按钮 电机启动同时 散热风扇也一 起启动,停机 时电机先停, 风扇延时10S停 机
定时器
• TONR属于断电记忆型定时器,使能端通电 开始计时,使能端断电当前值被记忆,使 能端再通电,会继续计时,当前值大于或 等于设定值时,常开触点导通,常闭触点 断开。
有一台空
压机运行 4000H提醒 更换油水分 离器
计数器
S7-200计数器
• 号数) • 计数器的编号:C0---C255 • 当前值可读可写,断电保持型
计数器
每产生一个上升 沿,当前值加1
当值清零
设定值
当前值>=设定值时 常开触点导通,常闭断开
计数完成 自动停机
程序
定时器类型及型号
定时器
定时器的工作原理
• TON属于通电延时型 定时器,使能端通电 开始计时,使能端断电当前值复位,当前 值大于等于设定值时,常开触点导通,常 闭触点断开。
星三角降压启动
设定值
时基
定时器的工作原理
• TOF属于断电延时定时器,使能端通电当 前值复位,常开触点导通,常闭触点断开, 不计时,使能端断电后开值始计时,当前 值等于设定值时,常开触点断开,常闭触 点导通,停止计时
计 时 程 序
计数器
I0.0每接通一次, 当前值减1
把设定值装 载至当前值
当前值=0时 常开导通
计数器
当前值加1 当前值减1
当前值>=设定值 常开导通
S7-200定时器
• 定时器的配件: • 线圈 常开 常闭(位类型) • 设定值 当前值(16位有符号数) • 定时器的编号:T0---T255 • 定时器根据时基自动计数进行计时 • 当前已计时间=当前值*时基 • 设定时间=设定值*时基 • 时基:1MS 10MS 100MS
单片机 定时器
单片机定时器近年来,随着科技的发展,单片机作为一种重要的电子元器件,在各个领域得到了广泛的应用。
其中,定时器作为单片机的重要功能之一,在各种电子设备中发挥着重要的作用。
本文将对单片机定时器进行介绍和探讨。
一、什么是定时器定时器是单片机中常见的一个重要功能模块,用于产生或计数精确的时间间隔。
通过定时器,我们可以实现各种实时控制和时间测量功能。
在单片机的内部结构中,定时器通常由一个或多个计数器、比较器和控制逻辑电路组成。
二、单片机定时器的工作原理单片机定时器的工作原理主要可以分为计数模式和比较模式两种。
1. 计数模式在计数模式下,定时器会根据系统时钟的信号来进行计数操作。
当计数器达到设定的值后,会产生一个中断信号,从而触发系统执行相应的操作。
计数模式可以通过设置定时器的计数值和时钟频率来实现不同的时间间隔。
2. 比较模式在比较模式下,定时器会将计数器的值与设定的比较器进行比较。
当计数器的值等于比较器的值时,会产生一个中断信号。
比较模式常用于周期性的定时任务,如PWM信号的生成等。
三、单片机定时器的应用领域单片机定时器广泛应用于各个领域,如工业控制、通信设备、汽车电子、家电等。
以下是定时器在几个常见应用领域的具体应用。
1. 工业控制在工业控制领域,单片机定时器常用于实现定时开关、定时测量以及触发控制等功能。
通过设置不同的定时器参数,可以实现对生产过程的精确控制。
2. 通信设备在通信设备中,单片机定时器被广泛应用于协议的处理和时序控制。
通过定时器的精确计时功能,可以实现数据传输的同步和时序的控制。
3. 汽车电子在汽车电子领域,单片机定时器主要用于发动机的点火控制和喷油控制。
通过定时器的精确计时功能,可以实现对发动机点火和喷油的精确控制,提高汽车的燃油利用率和性能。
4. 家电在家电领域,单片机定时器主要用于电器的定时开关和节能控制。
通过设置定时器的参数,可以实现电器的定时开关,从而提高家电的智能化程度和能源利用效率。
定时器计数器常用编程方法
定时器计数器常用编程方法定时器计数器是编程中常用的工具,它们可以用于控制程序的执行时间、测量时间间隔、产生脉冲信号等。
以下是一些常用的编程方法来使用定时器计数器:1. 硬件定时器/计数器:许多微控制器和处理器都内置了硬件定时器/计数器。
这些定时器/计数器可以用于产生精确的时间延迟或测量时间间隔。
在编程时,通常需要配置定时器/计数器的参数,如计数频率、计数值等,然后启动定时器/计数器,让它自动计数或计时。
2. 软件定时器/计数器:如果硬件没有提供定时器/计数器,或者需要更灵活的控制,可以使用软件定时器/计数器。
软件定时器/计数器是通过程序代码实现的,通常使用循环和延时函数来模拟定时或计数。
这种方法不如硬件定时器/计数器精确,但可以实现简单的定时和计数功能。
3. 操作系统提供的定时器/计数器:许多操作系统都提供了定时器和计数器的API或功能。
例如,在Windows系统中,可以使用CreateTimerQueueTimer函数创建一个定时器,用于在指定的时间间隔后触发回调函数。
在Linux系统中,可以使用alarm或setitimer函数设置定时器。
这些方法通常需要结合操作系统提供的API进行编程。
4. 第三方库或框架:许多编程语言和框架提供了对定时器和计数器的支持。
例如,Python中的time模块提供了sleep函数用于暂停程序执行一段时间,而Tkinter库提供了Timer类用于在GUI应用程序中创建定时器。
这些库或框架通常提供更高级的功能和更灵活的控制,但需要学习和使用特定的API或语法。
总之,使用定时器计数器的编程方法有很多种,具体选择哪种方法取决于应用程序的需求和使用的编程语言或框架。
