精华内容
下载资源
问答
  • 51定时器总结,初值装载计算方法

    千次阅读 2019-09-16 22:40:15
    定时器是常用的 电平冲突与兼容 这是个常见的问题,比如为了减少系统的改动,在产品升级过程中,会保留上一版本的器件,而新更换的控制器或数字器件的电平与原版不同,为了兼容两种电平,需要电平之间的转换,这是...

    定时器是单片机中常用的功能,计数、定时、捕获等功能都离不开它。如何计算定时器的初值呢?
    #define FOSC (11059200L) 中的L是什么?
    这篇文章中我们来简单看一下这些问题。本文以51单片机为例阐述。

    51单片机定时器的寄存器

    (1)工作模式的设定
    51定时器的工作模式可以通过寄存器TMOD设置:
    在这里插入图片描述
    TMOD寄存器的低四位用于T0,高四位用于T1。
    GATE:门控位,用于设置计数器是否受P3.2或P3.3电压的影响。
    C/T:定时/计数模式选择。0:定时模式;1:计数模式。
    M1,M0:工作方式设置位。(51定时器共有四种工作方式)

    (2)初值的装载
    定时器的基本原理是:通过计数来计算时间,一旦超出了最大的数值就产生中断。51单片机的最大值是固定的(65535)。因此,为了设置预期的定时时间,需要对51定时器装载初始值。基础款的51有两个定时器,定时器0的初值寄存器为TH0和TL0寄存器(定时器1的为TH1和TL1)。

    20ms定时的初值装载计算

    假设使用的晶振频率为11.0592MHz
    因此在许多很好的代码中我们会看到这样的宏定义:

    #define FOSC (11059200L)
    #define FCLK (FOSC/12)  //用于计算指令周期
    //设20ms定时共需要P个指令周期,现在求P的数值:
    //P/FCLK*1000=20
    //因此可以在C语言中做如下运算:
    unsigned long int P;
    P=20*FCLK/1000//注意:不要这么写,建议P=20*(FCLK/1000) 原因见下一小节
    //求得20ms共需的P个定时周期后,就可以计算TH0,TL0的数值了:
         TH_0=(65536-P)/256;
         TL_0=(65536-P)%256; 
    //然后开启定时器,开启中断之后就可以在中断函数中写自己需要的代码即可了。
    void T0_ISR() interrupt 1
    {
    //略
    }
    

    #define FOSC (11059200L) 中的L是什么?

    L代表长整型数据。
    另外,我们注意到在上面所定义的周期数P,也采用了无符号长整型数据,这是为了防止计算时的中间值溢出。例如在这一句:

    P=20*FCLK/1000//20*FCLK就是个很大的数值,
    //为此我们不仅将P定义成无符号长整型,还做如下改进:
    P=20*(FCLK/1000)

    STC89C52定时器的数量

    最基础的51有2个定时器,STC89C52是升级版,有3个定时器。推荐使用T2作为串口波特率的定时器,T0,T1可以用在其他的计数和定时功能上。

    水平有限,请多指教,欢迎大家有项目一起交流 😃

    作者:伏熊 (专业:射频芯片设计、雷达系统。 爱好:嵌入式。)

    展开全文
  • 51单片机定时器初值计算详解

    千次阅读 多人点赞 2019-10-24 23:42:44
    学习完毕,又顺手利用刚学到定时器的相关知识写了一个“定时器初值计算”控制台程序,能够实现:51定时器三种不同工作方式下的初值计算输出,既实用,又能加深对所学知识的理解。 软件使用VS2012编写,实现效果...

     

    前言:

           本文详细介绍了51单片机学习过程中定时器的初值计算问题以及相关概念,力求把每一个学习过程中的可能会遇到的难点说清楚,并举相关的例子加以说明。学习完毕,又顺手利用刚学到定时器的相关知识写了一个“定时器初值计算”控制台程序,能够实现:51定时器三种不同工作方式下的初值计算输出,既实用,又能加深对所学知识的理解。


         

       软件使用VS2012编写,实现效果如下,仅仅是控制台程序,没有界面,有兴趣的话可以自己用C#或者QT写个界面,或者做一些功能上拓展,跟我们平常学习51资料中附带的定时器初值计算小工具一样哦!

          

     

       附51系列单片机控制台程序定时器初值核心计算函数源码(完整VS2012工程源码下载

    /*
     * 函数名:Timer_Initial_calculation
     * 描述  :定时器初值计算函数
     * 输入  :无
     * 输出  :无
     */
    void Timer_Initial_calculation()
    {
    	int N;	//计数值 
    	int n;  //定时器位数 
    	int TimeDigit;	//计数总值 
    
    	N = (t*fosc*1000) / 12;     //计算计数值N 
    	//定时器位数选择
    	switch(y)
    	{
    		case 0: 
    			n=13;
    			TimeDigit = pow(2.0,n);      //定时器位数选择 
    			TimingMax = TimeDigit*12/fosc/1000;		//计算定时最长时间 
    			THX = (TimeDigit - N)/32;	//初值高八位 
    			TLX = (TimeDigit - N)%32;	//初值低八位 
    			break;
    		case 1: 
    			n=16;
    			TimeDigit = pow(2.0,n);      //定时器位数选择 
    			TimingMax = TimeDigit*12/fosc/1000;		//计算定时最长时间 
    			THX = (TimeDigit - N)/256;	//初值高八位 
    			TLX = (TimeDigit - N)%256;	//初值低八位 
    			break;
    		case 2: 
    			n=8;
    			TimeDigit = pow(2.0,n);      //定时器位数选择 
    			TimingMax = TimeDigit*12/fosc/1000;		//计算定时最长时间  
    			THX = TimeDigit - N;		//初值高八位 
    			TLX = TimeDigit - N;		//初值低八位 
    			break;
    		default:
    			break;
    	}
    	
    }

       

    下面开始正式介绍定时器初值计算相关内容:

     

    一、系统周期:

    时钟周期

    时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率,则时钟周期为250ns。由于时钟脉冲是计算机的基本工作脉冲,它控制着计算机的工作节奏(使计算机的每一步都统一到它的步调上来)。显然,对同一种机型的计算机,时钟频率越高,计算机的工作速度就越快。但是,由于不同的计算机硬件电路和器件的不完全相同,所以其所需要的时钟周频率范围也不一定相同。我们学习的8051单片机的时钟范围是1.2MHz-12MHz。 在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。

    机器周期

     在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。8051系列单片机的一个机器周期同6个S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。

    指令周期

    指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。

    通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令

     

    二、定时器初值的计算:

    例:对12MHz  1个机器周期 1us  12/fosc = 1us

    方式0  13位定时器最大时间间隔  = 2^13 = 8.192ms

    方式1  16位定时器最大时间间隔  = 2^16 = 65.536ms

    方式2  8位定时器最大时间间隔  = 2^8 = 0.256ms =256 us 

    方式3 仅适用于T0,此时T0分成两个8位计数器,T1停止计数

    当选用定时器的方式1时,设机器周期为Tcy,定时器产生一次中断的时间为t,那么需要计数的个数N=t/Tcy,装入THX和TLX中的数分别为:

    THX = (2^16 - N)/256     TLX = (2^16 -N )%256(此处的X为定时器0或定时器1

    公式为:(2^y - X)*Tcy = t

            Tosc= 1/ fosc

    一个机器周期 = 12个时钟周期 = 12/fosc

    溢出速率 = 1 / 溢出时间        故:初值X = 2^y – t/Tcy

               THX = 高八位   TLX = 低八位

          注:

             X:定时器初值

             N:计数值

             y:定时器工作方式

             fosc:晶振频率

               Tcy:机器周期,Tosc:时钟周期  Tcy = 1/Tosc

     

    例:50ms定时器初值计算:

    1. 晶振12M

    12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。  

                 65536-50000=15536(3cb0)

                 TH0=0x3c,TL0=0xb0

    2.晶振11.0592M

    11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期。

                65536-46080=19456(4c00)

                    TH0=0x4c,TL0=0x00

     

    以12M晶振为例:每秒钟可以执行1000000次机器周期个机器周期。而T 每次溢出 最多65536 个机器周期。我们尽量应该让溢出中断的次数最少(50ms),这样对主程序的干扰也就最小。

     

    三、定时器不同工作方式下赋初值问题:

    1)定时器方式013为计数器,由TL05位(高3位未用)和TH08为组成,因此定时器方式0最多能装载的数为2^19=8192个。当使用定时器方式0时,计数初值

    THX=8192-N/32,TLX=(8192-N)%32.   N 为计数个数=t/Tcy.

    2)定时器方式116为计数器,由TLX8位和THX8位组成的加1计数器。因此最多能装载2^16=65536个数。计数初值为:

    THX=65536-N/256,TLX =(65536-N)%256

         在定时器的方式0和方式1中,当计数溢出后,计数器变为0,因此在循环定时或循环计数时,必须使用软件反复设置计数初值,这样会影响到定时精度,也会使程序设计比较麻烦,使用定时器方式2可解决反复装初值所带来的问题。

    3)定时器方式28位初值自动重装的定时/计数器,THX被作为常数缓冲器,当TLX计数溢出时,在使溢出标志TFX1的同时,还会自动地将THX中的常数重新装入TLX中。方式2适合用作较精确的脉冲信号发生器。计数初值为:

        THX=256-NTLX=256-N

    4)方式3只适用于定时/计数器T0。此时,T0被分成两个独立的计数器。需要注意:当T0工作在方式3时,T1一定不要有中断的场合,因为工作方式3时,T0会占用T1的中断标志位。

     

    取模与取余问题:

    高八位和低八位就像我们十进制的十位和个位,就比如整数89=8*10+9*1;十位上算的“8”当然就是要8910求模,而个位上的9则是8910求余了!至于为什么TH0TL0赋初值要对256求模或求余,那是因为高八位和低八位都是8byte的,也就是它最大只能是“11111111”,化成十进制就是255,再加最前面的“00000000”也就是256个位矢量,所以就要对256求模或求余。

    因为高TH0和低TH0都是八位的 最多能装的数据是255,如果不对255取模取余的话 是装不下的。

           定时器方式013为计数器,由TL05位(高3位未用),所以应对2^5也就是32进行取余、取模。

     

           定时器模式2是自动重装模式, TH0TL0都要用到,TL0是真正的定时/计数器,肯定要有一个初值,在此基础上向上计数,溢出时就将TH0的值装入TL0,不用再次人工写程序干预

     

    四、计数器初值的计算:

    计数器的初值计算要比定时器的相对简单,例如:定时器T1工作在方式2的计数器状态,计算T1的初值:

                     初值X = 2^8 – 计数值

     

    展开全文
  • 51定时器初值计算

    2021-01-18 15:01:32
    因为定时器计数65536后,就会清零,想实现特定时间定时,就要自己计算起点,也叫做初值 因为1个机器周期等于12个时钟周期,因此FOSC/12,得到的是一个机器周期的频率,也是1秒内定时器计数的个..

    #define FOSC 11059200L

    #define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode

     

    在51单片机的技术手册上看到这样一段代码,

    它的意思是,定时器实现1毫秒定时,求定时器的初值。

    因为定时器计数65536后,就会清零,想实现特定时间定时,就要自己计算起点,也叫做初值

    因为1个机器周期等于12个时钟周期,因此FOSC/12,得到的是一个机器周期的频率,也是1秒内定时器计数的个数,再除以1000,就是1毫秒内定时器计数的个数。

    想让定时器在这些个数之后清零,就要设置起点为65536-该个数。

     

    这样就得到了65536-FOSC/12/1000

     

    同理,想设置5毫秒定时器,65536-5*FOSC/12/1000

     

    这样得到,想设置t毫秒定时器,65536-t*FOSC/12/1000

    注意,定时器有上限,最大为65536*FOSC/12毫秒,因为一个机器周期为FOSC/12毫秒,定时器计数最多65536次,就会溢出,从0开始计数。

    展开全文
  • 51单片机定时器初值计算问题

    千次阅读 2020-03-08 16:16:35
    最近在看51单片机的定时器与中断,作为51单片机比较重点的内容,很多人也花费了很长时间在这上面,有些问题网上的资料方法各不相同,也看得云里雾里,比如定时器初值计算问题,在此我想以此篇作为学习笔记,希望...

    最近在看51单片机的定时器与中断,作为51单片机比较重点的内容,很多人也花费了很长时间在这上面,有些问题网上的资料方法各不相同,也看得云里雾里,比如定时器的初值计算问题,在此我想以此篇作为学习笔记,希望可以对大家有所帮助。

    方法一

    定时器内部一寄存器,每隔一个机器周期就会自动加1,直到加到65535就会溢出。比如假设51单片机的晶振频率为11.05926MHz,那么时钟周期为1/11059260,51单片机的机器周期为12个时钟周期,(周期单位为s)计算一下这个机器周期长度为12*(1/11059260),即每隔12*(1/11059260)(s)加1,我们可以发现从0开始加到65535所需的时间一共是12*(1/11059260)*65535 = 0.07110964s = 71.10964ms.
    如果我们定义10ms,那么需要计算从哪一个初值加到65535所需时间正好为10ms,我们设初值为x,(65535-x)*机器周期 = 0.01s.可以计算出x = 56319,假设定时器工作在模式1,此时TH0 和 TL0 组成一个 16 位的定时器,TH0是定时器 1 高八字节,TL0是定时器 1 低八字节,如何计算高八字节与低八字节呢?
    我们给出一个数42,怎么计算十位数和各位数呢?其实在C语言中,十位数 = 42/10,个位数为42%10.同理,我们可以类似得出高八字节、低八字节的计算方法,2的8次方为256,那么高八字节TH0 = 56319/256,低八字节TL0 = 56319%256。然后设置好定时器控制寄存器便可以写出C51程序。

    代码如下所示:

    #include<reg52.h>
    
    sbit LED = P2^0;
    
    unsigned char cnt = 0;
    
    void main()
    {
    	LED = 0;
    	TMOD = 0x01;
    	TH0 = 56319/256;
    	TL0 = 56319%256;
    	TR0 = 1;
    	while(1)
    	{
    		if(TF0 == 1)
    		{
    			TF0 = 0;
    			cnt++;
    			TH0 = 56319/256;
    	        TL0 = 56319%256;
    			if(cnt == 100)
    			{
    				cnt = 0;
    				LED = ~LED;
    			}
    		}
    	}
    }
    

    此程序为时隔1sLED闪烁程序

    方法二

    大家是否注意到STC官方手册上定时器的使用方法呢,下图为STC89C52RC官方手册定时器部分截图:
    在这里插入图片描述
    这是STC官网文档上给出的计算定时器初值的方法。
    第一行是定义晶振频率,后面的L表示长整型数据,重点来看第二行,
    我们已经知道:51单片机中,机器周期等于12个时钟周期(所有单片机不一定都是12),机器周期 = 12*(1/FOSC);机器周期还等于计数次数,因为经过一个机器周期加1;
    机器周期 = 计数次数= 12*(1/FOSC);
    1s中有多少机器周期 = 1s中有多少计数次数 = FOSC /12;
    1ms中有多少机器周期 = 1ms中有多少计数次数 = FOSC /12/1000;
    那么如果我们定义1ms,此时定时器初值 = 65535 - FOSC /12/1000;

    根据TH0、TL0分别为高八位与低八位,
    TH0 = (65535 - FOSC /12/1000)/256;
    TL0 = (65535 - FOSC /12/1000)%256;
    或者
    令T1MS = 65535 - FOSC /12/1000;
    TL0 = T1MS;
    TH0 = T1MS>>8;

    代码如下图(下图定义的为10ms):

    #include<reg52.h>
    
    sbit LED = P2^0;
    
    #define FOSC 11059200L
    #define T1MS (65535-FOSC/12/100)
    
    unsigned char cnt = 0;
    
    void main()
    {
    	LED = 0;
    	TMOD = 0x01;
    	TL0 = T1MS;
    	TH0 = T1MS>>8;
    	TR0 = 1;
    	while(1)
    	{
    		if(TF0 == 1)
    		{
    			TF0 = 0;
    			cnt++;
    			TL0 = T1MS;
    			TH0 = T1MS>>8;
    			if(cnt == 100)
    			{
    				cnt = 0;
    				LED = ~LED;
    			}
    		}
    	}
    }
    

    此程序为时隔1sLED闪烁程序

    此篇只作为学习笔记,如有错误,敬请批评指正!

    展开全文
  •  方式2 8位定时器最大时间间隔 = 2^8 = 0.256ms =256 us 定时5ms,计算计时器初值 M = 2^K-X*Fosc/12 12MHz 方式0: K=13,X=5ms,Fosc=12MHz 则 M = 2^13 - 5*10^(-3)*12*10^6/12= 3192 = 0x0C78 THx = 0CH,TLx = 78H...
  • 定时器初值计算

    2012-04-16 22:18:23
    C51用11.0592MHZ的晶振。采用定时器T1,方式2怎么定时0.5S和1S。 这个初值是怎么计算的。TH1,TL1都要怎么计算。 求详细过程。(汇编)
  • 一共有5个16位定时器定时器0,定时器1, 定时器2, 定时器3和定时器4。 以下程序使用ISP软件自动分配的时钟函数: void Timer0Init(void) //1毫秒@22.1184MHz { AUXR |= 0x80; //定时器时钟1T模式 TMOD &= 0xF...
  • 定时器T1

    2010-09-16 16:25:00
    分频:  按照我的理解,单片机经PLL锁相后,会有一个主频供CPU内核操作。这个主频一般比较高,如果直接作为定...自动重装:当定时器的计数器从初值开始计数直到溢出产生中断后会自动将其重新初始化为初值.源码:
  • 1、通过波特率计算定时器T1时间常数初值。 2、编写甲机发送程序,工作于查询或者中断方式,传送30H——3FH中的十六个字节。 3、编写乙机接收程序,接受十六字节数据放在40H——4FH中。 发送机(甲机) /************...
  • 51单片机定时器初值计算

    千次阅读 2018-04-12 15:51:33
    51单片机定时器初值计算: 二、50MS定时器初值计算: 1.晶振12M 12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。 65536-50000=15536(3cb0) TH0=0x3c,TL0=0xb0 2.晶振...
  • 由于之前比较懒,不太愿意套公式来计算单片机的初值,于是写了一段代码来自动计算初值。值得注意的是,因为定时器有最大定时时间,所以输入定时时间请介于最大和最小的定时时间。有的时候我们需要定时1S钟,但是通过...
  • STC15F60S2计算定时器初值 #define FOSC 11059200L 1ms定时 #define T1MS (65536-FOSC/1000) //1T模式 0XD4CC #define T1MS (65536-FOSC/12/1000) //12T模式 0XFC66 TL0 = T1MS; //初始化计时值 TH0 = T1MS >>...
  • 1us 12/fosc = 1us 方式0 13位定时器最大时间间隔 = 2^13 = 8.192ms 方式1 16位定时器最大时间间隔 = 2^16 = 65.536ms 方式2 8位定时器最大时间间隔 = 2^8 = 0.256ms =256 us 定时5ms,计算计时器初值 M = 2^K-X*...
  • CC2530定时器T1产生PWM

    千次阅读 2015-06-27 16:58:35
    最近搞PWM波输出,参考了一下网上的代码自己总结出CC2530 PWM的配置过程:(此处以T1为例) 配置PWM模式需参考CC2530用户手册中"表7-1 外部设备I/O引脚映射"来进行配置  1、首先选择定时器1-4  2、选择好定时器后...
  • #include #define uint unsigned int #define uchar unsigned char uint i,j; main(){ i=0; j=0; EA=1; //中断总开关开 ET0=1;//定时器T0中断允许 ...//定时器T1中断允许 ...// 启动定时器T1
  • 软件编程2.1 框架式编程结构搭建2.2 初始化函数2.2.1 初始化函数框架2.2.2 定时器参数设置2.3 定时器1中断服务函数2.3.1 测试1:产生中断,P30翻转2.4 超声波服务函数 1. 测量原理 中断计数即检测距离 检测高电平...
  • //定时器T1的高8位赋初值 TL1=(65536-921)%256; //定时器T1的高8位赋初值 TR1=1; //启动定时器T1 TF1=0; while(1)//无限循环等待查询 { while(TF1==0) ; TF1=0; sound=~sound; //将P3.7引脚输出电平取反 TH1=(65536...
  • 2.定时器的溢出率定义:定时器记满溢出的频率;单位:HZ 例:定时器每溢出一次的时间为T,则溢出率就是1/T;每50s溢出一次,则溢出率 = 1/50 = 20HZ; 3.PCON:电源管理寄存器 不可位寻址 D7 D6 D5 ...
  • 利用定时器T1工作方式1控制两个LED以不同周期闪烁,使得LED1每秒闪烁4次(即周期为250ms),LED2每秒闪烁1次(即周期为1s)。 2.控制分析 2.1 LED侧分析 若要使LED1每秒闪烁4次(即周期为250ms),LED2每秒闪烁1次...
  • //使用定时器T1的模式2 定时器T0的模式2 并且引入外部事件计数器 //对T1和T0的引脚负脉冲进行计数 TH0=TL0=256-1; //计数器T0高8位赋初值 255 只需要一个数就产生中断 TH1=TL1=256-1; //...
  • T1由TH1和TL1 构成。其访问地址依次为8AH-8DH。每个寄存器均可单独访问。这些寄存器是用于存放定时或计数初值的。此外,其内部还有一个8位的定时器方式寄存器 TMOD和一个8位的定时控制寄存器TCON。这些寄存器之间是...
  • /********************************************** 方法1:延时法 ...描述:T1用于定时,方式1,定时时间50ms,中断方式,定时时间到,TF1=1,利用模拟串口发送字符0x69 ******************************
  • 定时器/计数器的结构定时器/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD是定时器/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。...
  • 所以以高四位为例介绍一下它们的功能:TF1和TF0:定时器/计数器T1和T0的溢出标志位。当定时器/计数器工作产生溢出时,会将TF1或TF0位置1,表示定时器/计数器有中断请求。TR1或TR0:定时器/计数器T1和T...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,542
精华内容 1,016
关键字:

定时器t1计算初值