精华内容
下载资源
问答
  • 单片机定时器工作模式TMOD设置 TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER) 定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。
  • T1为定时模式,定时65.536ms,P2.0对应的LED等闪烁一次,T0计数模式,计数脉冲从P3.4脚用按键输入,按一次,记一次,所以计数初值为0FFFFh,没按一次,产生一个溢出,P2.5对应的LED闪烁,同时数码管加1显示。
  • 一般来说,我们都是采用定时器1的模式2(自动重装模式)来作为波特率发生器的,同理,定时器1的中断也就被我们遗弃了,因为为了波特率产生的时候不会受到干扰(如果定时器1有中断函数,那么处理中断函数会关闭定时器...
  • 定时器编码模式的配置 基本配置

    定时器编码模式的配置

    基本原理

    首先简单讲一下什么是定时器的编码器模式:
    STM32单片机的通用定时器有如下的基本功能:
    在这里插入图片描述

    这里我们主要就是讲一下其中的一个功能:定时器支持针对定位的增量(正交)编码器和霍尔传感器电路。
    选择编码器接口模式的方法是:如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的SMS=001;如果只在TI1边沿计数,则置SMS=010;如果计数器同时在TI1和TI2边沿计数,则置SMS=011。 通过设置TIMx_CCER寄存器中的CC1P和CC2P位,可以选择TI1和TI2极性;如果需要,还可以对输入滤波器编程。 两个输入TI1和TI2被用来作为增量编码器的接口。参看表77,假定计数器已经启动(TIMx_CR1寄存器中的CEN=’1’),计数器由每次在TI1FP1或TI2FP2上的有效跳变驱动。TI1FP1和TI2FP2是TI1和TI2在通过输入滤波器和极性控制后的信号;如果没有滤波和变相,则TI1FP1=TI1,TI2FP2=TI2。根据两个输入信号的跳变顺序,产生了计数脉冲和方向信号。依据两个输入信号的跳变顺序,计数器向上或向下计数࿰

    展开全文
  • 在单片机的学习过程中,单片机定时器的合理设置和应用是非常关键的一步,也是刚开始接触单片机知识的新人工程师们比较容易出错误的一个环节之一。在今天的文章中,我们为大家总结了单片机定时器应用过程中的两大常见...

    在单片机的学习过程中,单片机定时器的合理设置和应用是非常关键的一步,也是刚开始接触单片机知识的新人工程师们比较容易出错误的一个环节之一。在今天的文章中,我们为大家总结了单片机定时器应用过程中的两大常见问题进行实时解析,希望能够对各位新人工程师的学习提供一定帮助。

    01bfa723cd036c3a1bbf2d50112a5c2c.png

    问题一:51单片机的T0、T1定时器四种工作方式各有什么特点?

    在单片机定时器的应用过程中,定时器在进行设置时会有四种不同的工作方式,合理选择相应的工作方式可以帮助工程师快速完成及时设置。下面我们就来逐一讲解一下这四种不同的计时方式。方式0是单片机计时器的第一种计时方式,这一方式13位计数模式。方式1则采用16位计数模式,方式2采用8位自动重装入计数模式,这两种技术模式也是目前在单片机应用过程中最常使用的及时方式。最后一种单片机定时器的计时方式是方式3,这一模式下只有T0有的双8位计数模式。

    ae03b44dca5593c7dbf0c42353ac13af.png

    问题二:在设置单片机定时器的过程中出现了错误,应该怎么进行误差纠正?

    在使用单片机定时器进行计时设置的过程中,出现设置错误的情况是在所难免的,这就需要我们采取一些方法对已经造成的错误进行纠正了。由于单片机的机器周期通常为1μs~2μs,因此定时误差一般应在0μs~20μs之内,对于一般应用,此误差可以忽略,但是对于精确度要求比较高的应用场合,此误差必须进行校正。定时误差是定时溢出后转入执行定时处理语句段之间所耗费的时间,此时间主要由定时溢出转入定时处理语句段所必须执行的指令或硬件过程产生。

    93aeb5433553c8404410af0336209899.png

    定时误差校准的一个比较简单的方法式,在定时溢出响应后,立刻停止定时器的计数工作,同时快速读出当时计数值,然后将完成这一任务的程序段执行时间考虑进去,作为修正因子校正定时初值,以下程序段以中断处理方式为例来进行说明。需要注意的是,由于执行从指令clrTR0(停止计数)到指令setbTR0(重新开启计数)之间的指令需8个机器周期,应将此消耗考虑进去,因此该程序将定时误差缩小在1个机器周期内

    展开全文
  • 本文主要讲了单片机定时器初值计算公式,下面一起来学习一下
  • 定时器中断是单片机最重要的一个功能,一开始学的时候遇到了不少的问题,通过不断地学习解决了不少问题,其实学会之后也没有什么。在这里我整理了一下定时器的使用,分享给大家希望能帮助大家。

    ☺定时器中断是单片机最重要的一个功能,一开始学的时候遇到了不少的问题,通过不断地学习解决了不少问题,其实学会之后也没有什么。在这里我整理了一下定时器的使用,就用51单片机来举例。像别的STC15等系列的单片机其实原理上差不多的,分享给大家希望能帮助大家。
    定时器小练习: 《51单片机定时器小练习》—利用定时器实现方波发生器
    .

    定时器相关寄存器

    • 中断允许寄存器IE在这里插入图片描述

    1.EA:cpu总中断允许控制位。EA=1,cpu开放中断。
    2.ET0/ET1:定时器T0和定时器T1溢出中断允许位。ET0/ET1=1;允许中断。
    3.EX0/EX1:外部中断0和外部中断1中断允许位。EX0/ET1=1;允许中断。

    • 控制寄存器TCON
      在这里插入图片描述

    TF1:定时器/计数器T1溢出标志。T1被允许计数以后,从初值开始加1计数。当最高位产生溢出时由硬件置‘1’,此时向CPU请求中断,一直保持到CPU响应中断时,才由硬件清‘0’。(TF1也可以由程序查询清“0”)

    TR1:定时器T1的运行控制位,该位是由软件置位和清零。当GATE=0,TR1=1时就允许T1开始计数,TR1=0时禁止T1计数。当GATE=1,TR1=1且外部中断1输入位高电平时,才允许T1计数。

    TF0:定时器/计数器T0溢出标志。T0被允许计数以后,从初值开始加1计数。当最高位产生溢出时由硬件置‘1’,此时向CPU请求中断,一直保持到CPU响应中断时,才由硬件清‘0’。(TF0也可以由程序查询清“0”)

    TR0:定时器T0的运行控制位,该位是由软件置位和清零。当GATE=0,TR0=0时就允许T0开始计数,TR0=0时禁止T0计数。当GATE=1,TR0=1且外部中断0输入位高电平时,才允许T0计数。

    • TMOD寄存器
      在这里插入图片描述

    其中低四位定义定时器/计数器T0,高四位定义定时器/计数器T1。

    GATE——门控制。 GATE=1时,由外部中断引脚INT0、INT1和控制寄存器的TR0,TR1来启动定时器。

    GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。 Ⅱ,C/T——功能选择位

    M0、M1——方式选择功能

    由于有2位,因此有4种工作方式

    M1M0 工作方式 计数器模式 TMOD(设置定时器模式)

    0 0 方式0 13位计数器 TMOD=0x00

    0 1 方式1 16位计数器 TMOD=0x01

    1 0 方式2 自动重装8位计数器 TMOD=0x02

    1 1 方式3 T0分为2个8位计数器,T1为波特率发生器 TMOD=0x03

    定时器工作方式介绍

    方式0:M1=0,M0=0 ,13位定时器/计数器

    方式1:M1=0,M0=1 ,16位定时器/计数器

    方式2:M1=1,M0=0 ,8位自动重载定时器

    方式3:M1=0,M0=0 ,双8位定时器/计数器

    定时器的初始值的计算

    首先要明白单片机的机器周期,关于机器周期的介绍如下。
    在这里插入图片描述
    我们以单片机的晶振是12MHz为例,假设你要定时1ms,采用定时器0,方式1时,此时为16位定时,16位最大值为2的16次方,也就是65536。
    由于12MHz的单片机其机器周期为1us。由于1ms=1000us。所以初始值的大小x=65536-1000=64536.然后把64536转换成16进制.
    在这里插入图片描述
    该定时器的初始化代码则为:

    void Time0Init()
    {
    	TMOD=0X01;//设置定时器0方式为1.
    	TL0 = 0x18;	//设置定时初值低四位
    	TH0 = 0xFC;	//设置定时初值高四位
    	TF0 = 0;
    	TR0 = 1;
    }
    

    在这里给大家分享一款定时器计算的的小工具。
    链接: 百度网盘.
    提取码:gtgm
    在这里插入图片描述

    定时器中断的使用。

    功能:使用定时器0计数,使led灯每隔一秒反转一次。
    原理图:
    在这里插入图片描述
    程序:

    #include"reg51.h"
    sbit led=P1^0;
    void Time0Init();
    unsigned int tt;
    int main()
    {
    	Time0Init();
    	while(1);
    }
    
    void Time0Init()
    {
    	TMOD=0X01;
    	TL0 = 0x18;	//设置定时初值
    	TH0 = 0xFC;
    	TF0 = 0;	
    	TR0 = 1;
    	ET0=1;//打开定时器中断
    	EA=1;//打开总中断
    }
    void Time0() interrupt 1
    {
    	TL0 = 0x18;	//由于定时器工作方式选择的时16位。没有自动重载功能,所以每次溢出之后要手动进行一次初始化。
    	TH0 = 0xFC;
    	tt++;
    	if(tt==1000)
    	{
    		tt=0;
    		led=~led;
    	}
    }
    
    展开全文
  • STM32单片机定时器1设置成为AB项编码器模式 大家好·,我是DXZ,这篇博客是使用STM32单片机定时器1设置成为AB项编码器模式,下面贴出代码。 void TIM1_Init() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; ...

    STM32单片机定时器1设置成为AB项编码器模式

    大家好·,我是DXZ,这篇博客是使用STM32单片机定时器1设置成为AB项编码器模式,下面贴出代码。

    void TIM1_Init()
    {
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_ICInitTypeDef TIM_ICInitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//
    
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
        TIM_TimeBaseStructure.TIM_Prescaler = 0x0; //
        TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//TIM1高级定时器特有
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
        TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
        TIM_ICStructInit(&TIM_ICInitStructure);
        TIM_ICInitStructure.TIM_ICFilter = 10;
        TIM_ICInit(TIM1, &TIM_ICInitStructure);
     
        TIM_ClearFlag(TIM1, TIM_FLAG_Update);
        TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
    
        TIM_SetCounter(TIM1,0);
        TIM_Cmd(TIM1, ENABLE);
    }
    

    使用TIM8进行编码器值采集

    void TIM8_Init(u16 arr,u16 psc)
    {
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
    
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); //时钟使能
    
        TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载寄存器周期值
        TIM_TimeBaseStructure.TIM_Prescaler =psc;//设置预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//重复计数设置
        TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //参数初始化
        TIM_ClearFlag(TIM8, TIM_FLAG_Update);//清中断标志位
    
        TIM_ITConfig(      //使能或者失能指定的TIM中断
            TIM8,            //TIM1
            TIM_IT_Update  | //TIM 更新中断源
            TIM_IT_Trigger,  //TIM 触发中断源
            ENABLE  	     //使能
        );
    
        //设置优先级
        NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//先占优先级0级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  	   //从优先级0级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        TIM_Cmd(TIM8, ENABLE);  //使能TIMx外设
    
    }
    

    TIM8中断服务函数进行编码器值累计求和

    void TIM8_UP_IRQHandler(void)
    {
        if (TIM_GetITStatus(TIM8, TIM_IT_Update) != RESET)//检查指定的TIM中断发生与否:TIM 中断源
        {
            TIM_ClearITPendingBit(TIM8, TIM_IT_Update);//清除TIMx的中断待处理位:TIM 中断源
            
    			  Encoder1=(short)TIM1->CNT;
    			  Encoder2=(short)TIM2->CNT;
    			  Encoder3=(short)TIM3->CNT;
    			  Encoder4=(short)TIM4->CNT;
    			
    			  //加上'0'转换成为字符型
    			
    			  //四路电机编码值
    			  MasterToSlvaeData[0]=Encoder1+'0';
    			  MasterToSlvaeData[1]=Encoder2+'0';
    			  MasterToSlvaeData[2]=Encoder3+'0';
    			  MasterToSlvaeData[3]=Encoder4+'0';
    			
            //小车偏航角
    			  MasterToSlvaeData[4]=YawToSlvae+'0';
    			
    			
    		    SendDataToSlave(USART3,MasterToSlvaeData,0,5);
    			
    			  TIM1->CNT=0;
    			  TIM2->CNT=0;
    			  TIM3->CNT=0;
    			  TIM4->CNT=0;
    			
    			  
    			
        }
    }
    
    展开全文
  • 在信号半周期小于250us(大于的话就最好用方式1了)时可以方式2,即自动重装功能,而其你的中断需要设定为高优先级的,在中断入口是就控制你信号输出的管脚状态(如: CPL P1.0),如果你定时时间比较长如50ms,...
  • 单片机定时器总结

    千次阅读 2020-05-23 20:05:27
    最近在学习郭天祥老师的单片机教程,遇到很多问题,期间看了很多博客,终于对单片机定时器有些了解,在此像CSDN优秀的博主表示感谢,由于这是我第一次写博客(研究内容很浅)为了以后复习方便以及希望各位优秀的...
  • 单片机定时器的使用可以说非常简单,只要掌握原理,有一点的C语言基础就行了。要点有以下几个: 1. 一定要知道英文缩写的原形,这样寄存器的名字就不用记了。 理解是最好的记忆方法。好的教材一定会给出所有英文...
  • #including <reg52.h> #define uint unsigned int void main() { EA = 1;...//选择模式1,16位定时器 TH0 = 0XB3; TL0 = 0X84;//50毫秒 TR0 = 1;//定时器开始计时 while(1);//让程序停在这里 }...
  • 51单片机定时器学习

    2021-02-11 18:14:04
    51单片机定时器前言:作者的话什么是定时器单片机的周期定时器的初始化 前言:作者的话 这是我第一次在CSDN上做文章,我可能写的不是很好,但是我会加油的。 什么是定时器 定时器Timer人类最早使用的定时工具是沙漏...
  • 本文主要讲了C51单片机定时器/计数器控制字设置问题,下面一起来学习一下
  • C51单片机定时器

    2020-10-02 14:50:32
    此件利用 T0定时器,可在四种模式下工作 实质是加1计数器(16位计数器),由高8位TH0和低8位TL0两个寄存器组成,TMOD是工作方式寄存器,TCON是控制寄存器 2、定时器溢出 任何一个计数范围有限的系统,都存在...
  • 51单片机 定时器学习

    2021-04-11 15:30:04
    定时器:51单片机定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可实现软件计时,或使程序每隔一固定时间完成一项操作 2.替代长时间的Delay,提高CPU的运行...
  • STC单片机可以设置12T,1T等不同的工作方式,12T和标准51单片机是一样的,一个机器周期为12/Fosc,如果选1T的话一个机器周期应该是1/Fosc.
  • 51单片机定时器的使用

    千次阅读 2016-03-10 10:43:08
    51单片机定时器的应用,简单易懂
  • 51单片机定时器

    2014-10-02 15:00:45
    51单片机共有两个定时器,T0与T1,
  • 1-简介简介MSP430单片机定时器A结构及其应用范例。2-定时器模块在MSP430系列单片机中带有功能强大的定时器资源,这定时器在单片机应用系统中起到重要的作用。利用MSP430(以下称为430)单片机的定时器可以用来实现计时...
  • 由于之前比较懒,不太愿意套公式来计算单片机的初值,于是写了一段代码来自动计算初值。值得注意的是,因为定时器有最大定时时间,所以输入定时时间请介于最大和最小的定时时间。有的时候我们需要定时1S钟,但是通过...
  •  二 CTC模式 [比较匹配时清零定时器模式] WGM1=4,12跟51的自动重载模式差不多  1 用于输出50%占空比的方波信号  2 用于产生准确的连续定时信号WGM1=4时, 最大值由OCR1A...
  • 51单片机定时器中断

    万次阅读 多人点赞 2019-06-08 23:58:02
    51单片机有2个16位定时器/计数器:定时器0(T0为P3.4) 和定时器1(T1为P3.5) 这里所说的16位是指定时/计数器内部分别有16位的计数寄 存器。当工作在定时模式时,每经过一个机器周期内部的16位计数 寄存器的值就会...
  • 自己整理的STC12C5A60S2单片机定时器实验程序,定时器0的3种模式,定时器1的三种模式,封装,适合初学51单片机的朋友
  • 常规方法测量脉冲的频率,利用51单片机的两个定时器来测量,一个定时器来定时,一个定时器作为计数方式;能不能有一个更好的方法,不使用这么多硬件,只使用一个定时器就可以满足需求? 当然可以的,定时器2有输入...
  • 单片机定时器使用

    千次阅读 2017-08-16 20:50:01
    单片机定时器的使用可以说非常简单,只要掌握原理,有一点的C语言基础就行了。要点有以下几个:   1. 一定要知道英文缩写的原形,这样寄存器的名字就不用记了。 理解是最好的记忆方法。好的教材一定会给出所有英文...
  • 51单片机定时器的原理与使用

    万次阅读 多人点赞 2017-06-18 15:51:07
    文章分析了定时器原理与定时器中断,通过实验详细阐述了定时器的使用,尤其是深入分析了各个细节问题。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,973
精华内容 5,589
关键字:

单片机定时器比较模式