定时计数器2是一个16位定时/计数器,通过T2CON寄存器的C/T2位可以选择定时还是计数功能。定时器2 有3种操作模式:捕获、自动重新装载(递增或递减计数)和波特率发生器,这3种模式由T2CON 中的位进行选择,具体的选择方式见表1。定时器2有两个8为寄存器:TH2和TL2。在定时模式状态下,TL2寄存器每一个机器周期加1,。由于52单片机的每一个机器周期等于12的振荡周期,所以他的计数频率是振荡频率的1/12。
表1
RCLK+TCLK | CP/RL2 | TR2 | MODE |
0 | 0 | 1 | 16位自重载 |
0 | 1 | 1 | 16位捕获 |
1 | X | 1 | 波特率发生器 |
X | X | 0 | 关 |
在计数状态下,外部引脚由1-0的负跳变是,寄存器就加1。并且在这种情况下,每当一个机器周期的S5P2的时科,单片机就对外部引脚进行采样,如果在下一个周期里信号变为低电平,则计数器加1。在下一个周期的S3P1时刻,若检测到有跳变,则计数器计数加1。识别1-0的跳变需要两个机器周期(24个振荡周期),所以计数信号的最大的频率只能是振荡频率的1/24。为了确保采样频率能够被采样,被采用的电平必须保持一个机器周期不变。
1、捕获模式
在捕获模式,寄存器T2CON的位EXEN2有两方式可供选择:
若EXEN2=0,定时器2为16位定时/计数器,当计数溢出是,T2CON中的TF2置1,并向CPU申请中断;
若EXEN2=1,定时器2出来拥有和上述一样的功能外,还有捕获功能:即在引脚T2EX有1-0跳变的时候,RCAP2H和RCAP2L分别捕获并保存TH2和TL2的当前值(即RCAP2H=TH2,RCAP2L=TL2),另外T2EX脚的跳变也会使T2CON寄存器里的位EXF2值1,和TF2一样向CPU申请中断。
2、自重载模式(递增/递减计数器)
定时器2可以设置为递增/递减自动重载计数器,并通过DCEN(Down Counter Enable)位来控制其模式。见表2,一旦CPU复位,DCEN被清0,意味着定时器2默认是递增计数器,当DCEN置为1时,允许定时器2递增或递减计数,由T2EX的电平来控制器计数方向。
表1
T2MOD Address = 0C9H Reset Value = XXXX XX00B |
Not Bit Address |
Bit | - | - | - | - | - | - | T2OE | DCEN |
|
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Symbol | Function |
- | 保留 |
T2OE | 定时器2输出使能 |
DCEN | DCEN=1,允许定时器2递增或递减计数 |
图1T2捕获原理图
图2所示为定时器2自动递增模式(DCEN=0)原理图。在这种模式下由T2CON中的EXEN位选择。
当EXEN=0;当计数器向上计数到0FFFFH是就会置位溢出标志位TF2,此时,寄存器RCAP2H和RCAP2L的值会自动装载到寄存器TH2和TL2中。寄存器RCAP2H和RCAP2L的值有软件预设。
当EXEN=1;16位重载可由两个方式触发:计数溢出或T2EX引脚的负跳变。同时置位EXF2为1。在中断允许的条件下,TF2和EXTF2都可以触发中断。
图2T2自重载模式(DCEN=0)原理图
当DCEN为1时,允许定时器2递增计数或者递减计数,就如图2所示。在这种模式下,T2EX引脚控制计数的方向。
T2EX若为逻辑“1”,定时器2递增计数,直到0FFFFH是计数器溢出,置位TF2为1,同时溢出之后,寄存器RCAP2H和RCAP2L的值会自动装载到寄存器TH2和TL2中。
T2EX若为逻辑“0”,定时器2递减计数,当寄存器TH2和TL2的值分别和寄存器RCAP2H和RCAP2L的值相等时,计数器向下溢出,同时立即置位TF2,并把定时计数器赋值为0FFFFH。
//The EXF2 bit toggles wheneverTimer 2 overflows or underflows and can be used as a 17th bit of resolution. Inthis operating mode, EXF2 does not flag an interrupt.
// (这段话不好翻译)
图3
未完待续。。。
关键字:AT89S52 定时器
引用地址:
AT89S52之(定时器2)Timer2
推荐阅读最新更新时间:2024-03-16 15:28
STM32高级定时器-PWM简单使用
高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。共有4个通道有死区有互补。 先是配置IO脚: GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
[单片机]
重返STM32之---STM32定时器的误解
说是接触STM32都快3年了,说来也惭愧,很多东西都还没搞明白;应该也是因为英文水平有待提到的原因,不能正确的理解英文的含义,毕竟我们的语言思维是不一样的(找个借口吧哈哈)。 最近在用STM32的定时器,以前都是匆匆走过,由于自己想标准化自己的编程代码,所以这次很用心的用通用定时器写通用的延时函数,网上很多都是用的系统滴答时钟(SysTlck)来做的,但是想着自己要向操作系统方向发展,就不能用这个定时器了。 平时因为用的是滴答时钟来做的延时函数,就没怎么去深究;这次用通用定时来做的时候,发现问题一大把。首先就是定时器的时钟分频,第二个就是如何不用中断来实现定时。因为自己觉得对STM32很了解,所以就范范的写了代码,觉得自己肯定没问
[单片机]
用定时器加中断实现间隔1S的流水灯C程序
#include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int uchar aa,count,flag; void main() //主函数 { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; aa=0xfe; //赋初值11111110 while(1) //大循环 { P1=aa; if(flag==1)
[单片机]
STM32F10x利用定时器测量脉冲宽度
硬件:STM32F103C8T6 平台: ARM-MDk V5.11 前面一篇文章讲过如何利用定时器测量信号的频率(见 利用定时器测量频率),使用的是定时器的捕获/比较单元(Capture/compare),它也可以测量输入信号的脉冲宽度。 利用定时器测量脉冲宽度有两种方法。 方法1: 在捕获中断函数里改变捕获信号的触发沿(上升沿触发改为下降沿触发,或者下降沿触发改为上升沿触发),通过两次触发得到的计数器的差值,来计算出脉冲宽度。这种 方法需要定时器的配置和 利用定时器测量频率方法是一样的,不同的地方在中断函数里修改触发沿,以TIM2, 捕获通道2为例: if(
[单片机]
STM32单片机的通用定时器
STM32中的定时器有多种,按功能分成2个高级控制器定时器,4个普通定时器,2个基本定时器,2个看门狗定时器,1个系统滴答定时器SysTick。 定时器的关键是定时时间的计算。比如用定时器控制继电器的开关的时候,需要延时一段时间才关闭或者开启,这时候离不开定时器定时。 通用定时器定时时间计算。1秒中断的基本实现: 通用定时器模块的入口时钟经过分频得到计数器的时钟,用CK_CNT表示,预分频器的系数为:TIMx_PSC,当TIMx_PSC=0时,表示不分频,=1时,2分频。以此类推。 公式为:CK_CNT=fclk_PSC/(PSC +1),其中PSC最大为65535. 其次是TIM5计数器的计数值的设置,TIM5计数器以
[单片机]
[单片机框架] [app_led] [WS2812x] 利用软定时器实现WS2812x闪烁和呼吸等灯光模式
数据时序图 0,1码的高低电平时间: 利用单线协议来点亮WS2812X 模拟IO 兼容带OS /******************************************************************************** * @file led_ws2812x.c * @author jianqiang.xue * @version V1.0.0 * @date 2021-11-23 * @brief LED灯光,OneWire控制 * @example #include business_function.h #include app_led
[单片机]
STM32F407的定时器时钟频率
//实验的思路为对TIM3进行初始化后,进入死循环等到TIM3的溢出中断,当TIM3_CNT的值等于TIM3_ARR时, 就会产生TIM3的中断,进入中断处理函数;TIM3_CNT从0开始计数。 // 看一下时钟频率 根据时钟树得到TIM3挂载在APB1时钟上,APB1来自SYSCLK时钟,是来自PLLCLK,有HSE时钟经过分频-倍频-分频得到的; stm32F407中时钟HSE的频率为8M,在systemInit()中,先分频M=8;再倍频N=336;再分频P=2;得到SYSCLK的频率为168Hz,在使用定时器TIM时,需要进行分频,APB1的时钟频率为42Mhz,这里进行了4分频。
[单片机]
Microchip低档单片机新增闪存数据存储
Microchip宣布推出两款首次配备非易失性闪存数据存储器(FDM)的8引脚和14引脚封装低档 8位闪存PIC单片机。新器件利用64 字节数据存储器,结合了8 MHz的内置振荡器、器件复位定时器、多达3个8位模数转换通道及2个比较器等多种功能。 设计工程师在不断寻求性价比高的方法,力求在不增加设计复杂度的同时增加功能。通过在低档 8引脚和14引脚单片机中集成闪存数据存储器及模拟功能,PIC12F519(8引脚)及PIC16F526(14引脚)器件在无需外接非易失性存储器的条件下,实现配置及校准数据、计数器或小型查找表的存储。此外,设计人员还可利用单片机的数字智能及再编程能力来取代分立模拟元件。 PIC12F519
[单片机]