精华内容
下载资源
问答
  • 使用51单片机定时器T1在工作方式2下生成占空比40%的方波,并且在仿真软件里调试出来
  • 51单片机定时器总结

    2020-08-28 19:34:35
    意思就是当GATE=1时,定时器的启动有二个位控制,即TR0和int0(这是对定时器0来说的,T1的话上二位就是1)。定时器只有在上二位都是一的情况下才会启动。我们就可以利用这个功能来测量脉冲的宽度。
  • 定时器中断系统小白极客的51单片机笔记(自用)定时器介绍STC89C52定时器资源定时器框图定时器工作模式定时器时钟中断系统中断程序流程STC89C52中断资源定时器中断系统创建一个自定义列表如何创建一个注脚注释也...

    小白极客的51单片机笔记(自用)

    做定时器时钟时顺手写的笔记,如有错漏,欢迎斧正。

    定时器介绍

    51单片机的定时器属于大农家的内部资源,其电路的连接和运转均在单片机内部完成:

    1. 用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作;
    2. 替代长时间的Delay,提高CPU的运行效率和处理速度;
    3. 操作系统的任务切换(高级单片机)

    STC89C52定时器资源

    • 定时器个数:3个(T0、T1、T2)T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源
    • 注意:定时器的资源和单片机的型号是关联在一起的,不同型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的

    定时器框图

    • 定时器在单片机内部就像是一个小闹钟一样,跟据时钟的输出信号,每隔“一秒”,技术单元的数值就增加一,当计数单元数值增加到“设定的闹钟提醒时间”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行
      在这里插入图片描述

    定时器工作模式

    • STC89C52的T0和T1均有四种工作模式:
    1. 模式0:13位定时器/计数器
    2. 模式1:16位定时器/计数器(常用)
    3. 模式2:8位自动重装模式
    4. 模式3:两个8位计数器
    • 工作模式1框图:
      在这里插入图片描述
      TL0/TH0是一个十六位的计数器,TL存储低字节,TH存储高字节,左边的时钟提供脉冲,每来一个脉冲,这十六位的计数器里面的值就会加一,当加到最大值65535时再加的话就会溢出,溢出的时候计数器就会回到0.所以在溢出的时候会置一个标志位(TF0),有了这个标志位它就会向中断系统申请中断。

    定时器时钟

    我们之前讲到了,计数器每来一个脉冲加一,那么这个脉冲的时间是怎么确定的呢?这就需要用到时钟系统了。

    • SYSclk:系统时钟,即晶振周期,本开发板上的晶振为12MHz
    • 12M很快,一般来说我们会对12MHz进行分频,12Tmode会对12M的系统时钟进行12分频,分频之后这个开关如果连到12分频,那么它输出的就是1MHz,1MHz的一个周期就是一微秒,那就说明我们如果连这条线路的话,那么计数单元每隔一微秒就要记一次数,当它记到最大值,就会产生中断
    • C/T是一个选择开关,是寄存器中的一位,如果这一位配置为1的话,就是C(Counter计数器)这个功能,如果给0,那么就是T(Timer定时器)这个功能

    时钟最初的来源有两个,一个是SYSclk,另一个是T0 Pin(单片机外部的接口)

    中断系统

    在这里插入图片描述

    中断程序流程

    在这里插入图片描述

    STC89C52中断资源

    • 中断源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、外部中断2、外部中断3)

    • 中断优先级个数:4个

    • 中断号:在这里插入图片描述

    • 注意:中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同、优先级个数不同等等

    定时器和中断系统

    在这里插入图片描述
    整个流程:时钟—>12分频—>定时器模式—>计数器增加溢出中断—>中断入口
    下面控制启动和暂停时钟是否过来—>

    定时器相关寄存器

    在这里插入图片描述
    在这里插入图片描述

    • 寄存器是连接软硬件的媒介
    • 在单片机中寄存器就是一段特殊的RAM存储器,一方面,寄存器可以存储和读取数据,另一方面,每一个寄存器背后都连接了一根导线,控制着电路的连接方式
    • 存储器相当于一个复杂机器的“操作按钮”
    展开全文
  • 大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。...
  • 51单片机定时器中断实验

    千次阅读 2020-08-04 10:52:08
    附:中断基本概念 定时器相关内容 CPU时序的有关知识 ①振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡...外接晶振为 12MHz 时,51 单片机相关周期的具体值为: 振荡周期=1/12us; 状态周期=1/6

    附:中断基本概念

    定时器相关内容
    • CPU时序的有关知识
      ①振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)。
      ②状态周期:2 个振荡周期为 1 个状态周期,用 S 表示。振荡周期又称 S 周期或时钟周期。
      ③机器周期:1 个机器周期含 6 个状态周期,12 个振荡周期。
      即机器周期=6个状态周期=12个震荡周期。
      ④指令周期:完成 1 条指令所占用的全部时间,它以机器周期为单位。
    • 外接晶振为 12MHz 时,51 单片机相关周期的具体值为:
      振荡周期=1/12us;
      状态周期=1/6us;
      机器周期=1us;
      指令周期=1~4us;
    定时器/计数器

    ①51 单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。
    ②定时器/计数器和单片机的 CPU 是相互独立的。定时器/计数器工作的过程是自动完成的,不需要 CPU 的参与。
    ③51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加 1。
    有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加 1 的工作可以交给定时器/计数器处理。CPU 转而处理一些复杂的事情。同时可以实现精确定时作用

    51单片机定时原理

    定时/计数器的实质是加 1 计数器(16 位),由高 8 位和低 8 位两个寄存器 THx 和 TLx 组成。它随着计数器的输入脉冲进行自加 1,也就是每来一个脉冲,计数器就自动加 1,当加到计数器为全 1 时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置 1,向 CPU 发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。可见,由溢出时计数器的值减去计数初值才是加 1 计数器的计数值。

    51内部结构及实现原理
    • 51定时器/计数器内部结构
      在这里插入图片描述
      上图中的 T0 和 T1 引脚对应的是单片机 P3.4 和 P3.5 管脚。51 单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD 是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON 是控制寄存器,控制 T0、 T1 的启动和停止及设置溢出标志。
      定时器/计数器通过两个寄存器进行工作。
    • 控制寄存器 TCON
      1.作用:TCON 的低 4 位用于控制外部中断。TCON 的高 4 位用于控制定时/计数器的启动和中断申请。
    1. 格式如图所示:
      在这里插入图片描述
      低四位各功能:
      TF1(TCON.7):T1 溢出中断请求标志位。T1 计数溢出时由硬件自动置 TF1为 1。CPU 响应中断后 TF1 由硬件自动清 0。T1 工作时,CPU 可随时查询 TF1 的状态。所以,TF1 可用作查询测试的标志。TF1 也可以用软件置 1 或清 0,同硬件置 1 或清 0 的效果一样。
      TR1(TCON.6):T1 运行控制位。TR1 置 1 时,T1 开始工作;TR1 置 0 时,T1 停止工作。TR1 由软件置 1 或清 0。所以,用软件可控制定时/计数器的启动与停止。
      TF0(TCON.5):T0 溢出中断请求标志位,其功能与 TF1 类同。
      TR0(TCON.4):T0 运行控制位,其功能与 TR1 类同
      低4位(TCON.3~TCON.0):外部中断相关为,用于控制外部中断。
    • 工作方式寄存器TMOD
      1.作用:于设置定时/计数器的工作方式,低四位用于 T0,高四位用于 T1。
      2.格式如图所示:
      在这里插入图片描述

    GATE:GATE 是门控位, GATE=0 时,用于控制定时器的启动是否受外部中断源信号的影响。只要用软件使 TCON 中的 TR0 或 TR1 为 1,就可以启动定时/计数器工作;GATA=1 时,要用软件使 TR0 或 TR1 为 1,同时外部中断引脚 INT0/1 也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了 INT0/1 引脚为高电平这一条件。
    C/T :定时/计数模式选择位。C/T =0 为定时模式;C/T =1 为计数模式。
    M1M0:工作方式设置位。定时/计数器有四种工作方式。
    在这里插入图片描述
    3.定时/计数器的工作方式
    前面我们知道,TMOD中m1m0为工作方式设置位,共有4中方式
    (1)方式0:
    在这里插入图片描述
    方式 0 为 13 位计数,由 TL0 的低 5 位(高 3 位未用)和 TH0 的 8 位组成。TL0 的低 5 位溢出时向 TH0 进位,TH0 溢出时,置位 TCON 中的 TF0 标志,向 CPU发出中断请求。
    门控位 GATE 具有特殊的作用:
    当 GATE=0 时,由图可以看出,先经过一个非门变为高电平1,然后经过或门,因为是或门,仍为高电平1,在经过与门,此时与TR0相与,所以由TR0控制技术的开始。当TR0为1时,相与后仍为高电平,计数开始,待计数溢出时,申请中断。
    当GATE=1时,经过非门变为低电平0,此时因为是或门,所以要受到外部中断引脚控制,然后经与门与TR0相与。所以计时的开始是由TR0和外部中断同时控制的。
    计数初值与计数个数的关系为:X=2(13)-N。其中 2(13)表示 2 的 13 次方。
    (2)方式1:
    在这里插入图片描述
    方式 1 的计数位数是 16 位,由 TL0 作为低 8 位,TH0 作为高 8 位,组成了16 位加 1 计数器。
    计数初值与计数个数的关系为:X=2(16)-N。
    计数控制方式同方式0.
    (3)方式2:
    在这里插入图片描述
    方式 2 为自动重装初值的 8 位计数方式。工作方式 2 特别适合于用作较精确的脉冲信号发生器。计数初值与计数个数的关系为:X=2(8)-N。
    计数控制方式同方式1原理。
    (4)方式3:
    在这里插入图片描述
    这几种工作方式中应用较多的是方式 1 和方式 2。定时器中通常使用定时器方式 1,串口通信中通常使用方式 2。

    定时器配置
    • 定时器配置过程:
      ①对 TMOD 赋值,以确定 T0 和 T1 的工作方式,如果使用定时器 0 即对 T0 配置,如果使用定时器 1 即对 T1 配置。
      ②根据所要定时的时间计算初值,并将其写入 TH0、TL0 或 TH1、TL1。
      ③如果使用中断,则对 EA 赋值,开放定时器中断。
      ④使 TR0 或 TR1 置位,启动定时/计数器定时或计数。
    • 计算定时/计数器初值。
      机器周期=1/单片机的时钟频率。51 单片机内部时钟频率是外部时钟的 12 分频,也就是说当外部晶振的频率输入到单片机里面的时候要进行 12分频。比如说你用的是 12MHZ 晶振,那么单片机内部的时钟频率就是 12/12MHZ,当你使用 12MHZ 的外部晶振的时候,机器周期=1/1M=1us。
      假设我们定义1ms的初值:
      1ms/1us=1000。也就是要计数 1000 个,初值=65535-1000+1(因为实际上计数器计数到 66636(2 的 16 次方)才溢出,所以后面要加 1)=64536=FC18H(十六进制),所以初值即为 THx=0XFC,TLx=0X18。
      知道了如何计算定时/计数器初值,那么想定时多长时间都可以计算出,当然由于定时计数器位数有限,我们不可能直接通过初值定时很长时间,如果要实现很长时间的定时,比如定时 1 秒钟。可以通过初值设置定时 1ms,每当定时 1ms结束后又重新赋初值,并且设定一个全局变量累计定时 1ms 的次数,当累计到
      1000 次,表示已经定时 1 秒了。
    中断实现过程伪代码
    
    void Timer0Init()
    {
    TMOD|=0X01;//选择为定时器 0 模式,工作方式 1,仅用 TR0 打开启动。
    TH0=0XFC; //给定时器赋初值,定时 1ms
    TL0=0X18;
    ET0=1;//打开定时器 0 中断允许(定时中断0允许位)
    EA=1;//打开总中断
    TR0=1;//打开定时器
    }
    
    
    定时中断实验
    • 实现功能:通过定时器0中断控制D1指示灯间隔1秒闪烁
      在这里插入图片描述

    默认阳极为高电平,只要利用定时器中断控制P20口即可

    • 代码实现
    #include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    sbit led=P2^0;	 //定义P20口是led
    
    /*
    * 函 数 名         : Timer0Init
    * 函数功能		   : 定时器0初始化
    */
    
    void Timer0Init()
    {
    	TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
    	TH0=0XFC;	//给定时器赋初值,定时1ms高4位为FC  FC18=64536
    	TL0=0X18;	//低4位为18
    	ET0=1;//打开定时器0中断允许
    	EA=1;//打开总中断
    	TR0=1;//打开定时器			
    }
    
    /*
    * 函 数 名       : main
    * 函数功能		 : 主函数
    */
    void main()
    {	
    	Timer0Init();  //定时器0初始化
    	while(1);	//一直循环执行定时器0	
    }
    
    /*
    * 函 数 名         : void Timer0() interrupt 1
    * 函数功能		   : 定时器0中断函数
    */
    void Timer0() interrupt 1
    {
    	static u16 i;
    	TH0=0XFC;	//给定时器赋初值,定时1ms
    	TL0=0X18;
    	i++;
    	if(i==1000)//如果i==1000,即执行1000次后,重新置0,led发生变化
    	{
    		i=0;
    		led=~led;	
    	}	
    }
    
    展开全文
  • 51单片机定时器中断

    万次阅读 多人点赞 2019-06-08 23:58:02
    51单片机有2个16位定时器/计数器:定时器0(T0为P3.4) 和定时器1(T1为P3.5) 这里所说的16位是指定时/计数器内部分别有16位的计数寄 存器。当工作在定时模式时,每经过一个机器周期内部的16位计数 寄存器的值就会...

    51定时器中断

    1.定时器/计数器

    51单片机有2个16位定时器/计数器:定时器0(T0为P3.4) 和定时器1(T1为P3.5)
    这里所说的16位是指定时/计数器内部分别有16位的计数寄 存器。当工作在定时模式时,每经过一个机器周期内部的16位计数 寄存器的值就会加1,当这个寄存器装满时溢出。 我们可以算出工作在定时模式时最高单次定时时间为 65535*1.085us=时间(单位us)
    当工作在计数器模式时,T0(P3.4引脚),T1(P3.5引脚)每 来一个脉冲计数寄存器加1
    在这里插入图片描述
    定时器作用:定时计数器可以用于精确事件定时,PWM脉宽调 制,波形发生,信号时序测量的方面。

    使用51定时/计数器步骤:

    (1)启动定时/计数器(通过TCON控制器)
    (2)设置定时/计数器工作模式(通过TMOD控制器)
    (3)查询定时/计数器是否溢出(读TCON内TF位
    在这里插入图片描述
    在这里插入图片描述

    3.代码片:

    (1)定时器定时:

    #include <reg52.h>
    #include <intrins.h>
    #define uint unsigned int
    #define uchar unsigned char
    sbit DU = P2^6;
    sbit WE = P2^7;
    uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
    void delay(uint z)
    {
     uint x,y;
     for(x = z; x > 0; x--)
      for(y = 114; y > 0 ; y--);   
    } 
    void display(uchar i)
    {
     uchar bai, shi, ge;
     bai = i / 100; //236 / 100  = 2
     shi = i % 100 / 10; //236 % 100 / 10 = 3
     ge  = i % 10;//236 % 10 =6   
     P0 = 0XFF;
     WE = 1;
     P0 = 0XFE; //1111 1110
     WE = 0; 
     DU = 1;
     P0 = tabel[bai];//
     DU = 0;
     delay(5);
     P0 = 0XFF;
     WE = 1;
     P0 = 0XFD; //1111 1101
     WE = 0; 
     DU = 1;
     P0 = tabel[shi];//
     DU = 0;
     delay(5);
     P0 = 0XFF;
     WE = 1;
     P0 = 0XFB; //1111 1011
     WE = 0; 
     DU = 1;
     P0 = tabel[ge];//
     DU = 0;
     delay(5);
    }
    void timer0Init()
    {
     TR0 = 1; 
     TMOD = 0X01; 
     TH0 = 0x4b;
     TL0 = 0xfd; 
    }
    void main()
    { 
     uchar mSec, Sec;
     timer0Init();
     while(1)
     {
      if(TF0 == 1)
      {
       TF0 = 0;
       TH0 = 0x4b;
       TL0 = 0xfd; 
       mSec++;
       if(mSec == 20)
       {
        mSec = 0;
        Sec++;
       }     
      }
      display(Sec); 
      if(Sec > 10)
       Sec = 0;
     } 
    } 
    

    (2)定时器计数:

    #include <reg52.h>
    #include <intrins.h>
    #define uint unsigned int
    #define uchar unsigned char
    sbit DU = P2^6;
    sbit WE = P2^7;
    sbit LED1 = P1^0;
    uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
    void delay(uint z)
    {
     uint x,y;
     for(x = z; x > 0; x--)
      for(y = 114; y > 0 ; y--);   
    } 
    void display(uchar i)
    {
     uchar bai, shi, ge;
     bai = i / 100;
     shi = i % 100 / 10;
     ge  = i % 10;   
     P0 = 0XFF;
     WE = 1;
     P0 = 0XFE; //1111 1110
     WE = 0;
     DU = 1;
     P0 = tabel[bai];//
     DU = 0;
     delay(5);
     P0 = 0XFF;
     WE = 1;
     P0 = 0XFD; 
     WE = 0;
     DU = 1;
     P0 = tabel[shi];
     DU = 0;
     delay(5);
     P0 = 0XFF;
     WE = 1;
     P0 = 0XFB; //1111 1011
     WE = 0;
     DU = 1;
     P0 = tabel[ge];//
     DU = 0;
     delay(5);
    }
    void timer0Init()
    {
     TR0 = 1;  
     TMOD |= 0X05; 
     TH0 = 0;
     TL0 = 0; 
    }
    void timer1Init()
    {
     TR1 = 1;  
     TMOD |= 0X10; 
     TH1 = 0x4b;
     TL1 = 0xfd; 
    }
    void main()
    { 
     uchar mSec, Sec;
     timer0Init();
     timer1Init();
     while(1)
     {
      if(TF1 == 1)
      {
       TF1 = 0;
       TH1 = 0x4b;
       TL1 = 0xfd; 
       mSec++;
       if(mSec == 10) 
       {
        mSec = 0;
        LED1 = ~LED1;
       }     
      }
      display(TL0); 
     } 
    } 
    

    (3)定时器中断:

    #include <reg52.h>
    #include <intrins.h>
    #define uint unsigned int
    #define uchar unsigned char
    sbit DU = P2^6;
    sbit WE = P2^7;
    sbit key_s2 = P3^0;
    sbit key_s3 = P3^1;
    uchar num;
    uchar mSec, Sec;
    uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
    uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};
    void delay(uint z)
    {
     uint x,y;
     for(x = z; x > 0; x--)
      for(y = 114; y > 0 ; y--);   
    } 
    void display(uchar i)
    {
     static uchar wei;   
     P0 = 0XFF;
     WE = 1;
     P0 = SMGwei[wei];
     WE = 0;
     switch(wei)
     {
      case 0: DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;
      case 1: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0; break; 
      case 2: DU = 1; P0 = SMGduan[i % 10]; DU = 0; break;  
     }
     wei++;
     if(wei == 3)
      wei = 0;
    }
    void timer0Init()
    {
     EA = 1; 
     ET0 = 1;
     TR0 = 1; 
     TMOD = 0X01; 
     TH0 = 0xED;
     TL0 = 0xFF; 
    }
    void main()
    { 
     timer0Init();
     while(1)
     {
      if(key_s2 == 0)
      {
       delay(20);
       if(key_s2 == 0)
       {
        if(num != 120)
        num++;
        while(!key_s2);
       } 
      }
      if(key_s3 == 0)
      {
       delay(20);
       if(key_s3 == 0)
       {
        if(num > 0)
         num--;
        while(!key_s3);
       } 
      }
     } 
    } 
    void timer0() interrupt 1
    {
     TH0 = 0xED;
     TL0 = 0xFF; 
     display(num);  
    }
    
    展开全文
  • 51单片机系列--定时器中断

    千次阅读 2021-07-17 23:28:16
    前言 前几天一直在忙挑战杯的决赛,好几天没能睡上安稳觉,今天下午答辩结束,终于有空能够继续总结笔记写博客了。...51单片机定时器0内部的具有两个一字节的寄存器TH0(高位寄存器)和TL0(低位寄存器

    前言

    前几天一直在忙挑战杯的决赛,好几天没能睡上安稳觉,今天下午答辩结束,终于有空能够继续总结笔记写博客了。(在此先感谢下带队的张总与带队老师)。

    正文

    定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成,可以取代掉占用cpu资源的delay函数。
    在这里插入图片描述
    如上图示,我的51单片机外接了一个11.0592MHZ的外部晶振,我们算一下:
    按照时钟周期的计算公式

    1个时钟周期  =1/晶振周期 = 1/Fosc
    本机时钟周期=1/(11.05926M) (s)= 1/11.05926/1000000 (s) = 1/1105926 s
    

    所以我的单片机每隔12*(1/1105926)s就加1一次。所以从0到65535所需时间一共

    12*(1/1105926)*65535=0.07110964s=71.10964ms
    

    如果需要定义1个10ms,则设初值为x

    (65535-x)*机器周期=0.01s
    

    则x=56319。

    分类

    51单片机定时器0内部的具有两个一字节的寄存器TH0(高位寄存器)和TL0(低位寄存器),最大能存65535。
    当单片机每一个机器周期产生一个脉冲时,计数器就加一。当计数达到溢出值65535后,就会产生一个中断信号,系统捕捉到信号,这个时间段就是周期。
    定时器由两个寄存器控制,分别是工作模式寄存器TMOD和控制寄存器TCON。

    工作模式寄存器TMOD

    工作模式寄存器TMOD是用于控制定时器0/1的工作模式(模式1:TH0和TL0两个寄存器都使用)。而设置初始值只需要对TMOD的M0、M1进行设置就行了,其他均设0即可。定时器1的不用配置,定时器0配置如下
    GATE=0
    C/T=0:0代表用作定时器,1代表用作计数器
    TMOD=0x01
    在这里插入图片描述

    M1M0工作模式说明
    00模式1当TMOD的D5位置0,D4位置1时,即为定时器T1的模式一,该模式对应的是一个16位的定时器,寄存器TH1和TL1即为T1初值的高8位和低8位,定时时间为:(65536-T1的初值)振荡周期12
    01模式2当TMOD的D5位置1,D4位置0时,即为定时器T1的模式二,该模式对应的是一个可以自动装载的8位定时器,当定时器计数满了(计数溢出时),会自动把TH1中的内容重新装载到TL1中,那么模式二计数的最长时间即为(257-T1的初值)振荡周期12

    TH0和TL0
    由于TH0是高八位,TL0是低八位(2^8=256),所以计算得出

    TH0=56319/256;
    TL0=56319%256

    利用isp计算定时器
    在这里插入图片描述
    需要注意的是:本版本单片机并没有AUXR这个寄存器,所以需要删去这行,而且要加上ET0与EA的赋值。整体代码如下:

    void Timer0Init(void)		//1毫秒@12.000MHz
    {
    	TMOD &= 0xF0;		//设置定时器模式
    	TMOD |= 0x01;		//设置定时器模式
    	TL0 = 0x18;		//设置定时初值
    	TH0 = 0xFC;		//设置定时初值
    	TF0 = 0;		//清除TF0标志
    	TR0 = 1;		//定时器0开始计时
    	ET0=1;//打开定时器0中断允许
    	EA=1;//打开总中断
    }
    

    控制寄存器TCON

    TF0 = 0; //清除TF0溢出中断标志,加到65536后TF0会被置为1
    TR0 = 1; //允许定时器0计时

    示例代码(定时器点灯)

    #include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    sbit led=P2^0;	 //定义P20口是led
    
    
    /*******************************************************************************
    * 函 数 名         : Timer0Init
    * 函数功能		   : 定时器0初始化
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
     
    void Timer0Init(void)		//1毫秒@12.000MHz
    {
    	TMOD &= 0xF0;		//设置定时器模式
    	TMOD |= 0x01;		//设置定时器模式
    	TL0 = 0x18;		//设置定时初值
    	TH0 = 0xFC;		//设置定时初值
    	TF0 = 0;		//清除TF0标志
    	TR0 = 1;		//定时器0开始计时
    	ET0=1;//打开定时器0中断允许
    	EA=1;//打开总中断
    }
    
      
    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能		 : 主函数
    * 输    入       : 无
    * 输    出    	 : 无
    *******************************************************************************/
    void main()
    {	
    	Timer0Init();  //定时器0初始化
    	while(1);		
    }
    
    /*******************************************************************************
    * 函 数 名         : void Timer0() interrupt 1
    * 函数功能		   : 定时器0中断函数
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void Timer0() interrupt 1
    {
    	static u16 i;
    	TH0=0XFC;	//给定时器赋初值,定时1ms
    	TL0=0X18;
    	i++;
    	if(i==1000)
    	{
    		i=0;
    		led=~led;	
    	}	
    }
    
    
    展开全文
  • 定时器/计数器T0、T1是80C51中断源之一,当数据寄存器溢出,则向CPU申请中断。数据寄存器的复位状态为0。为使计数值或定时值满足自己的要求,需预先将数据寄存器赋值,称为初值设定,中断中也要重新设定初值。 ...
  • 单片机定时器的使用可以说非常简单,只要掌握原理,有一点的C语言基础就行了。要点有以下几个: 1. 一定要知道英文缩写的原形,这样寄存器的名字就不用记了。 理解是最好的记忆方法。好的教材一定会给出所有英文...
  • 运用定时器0工作在方式1(16位计数器)实现LED灯的闪烁。先来看看定时器0工作在方式1的逻辑结构图。 从上图可以看到,GATE先经过非门,再和INT0引脚作为或门的输入。这里简单提一下数字电路中的与门、或门和非门。...
  • 本文主要讲述了51定时器的3种工作方式
  • 1. 首先附上代码例子 #include <AT89X52.H> #define uint unsigned int ...//定时器T1中断允许 TR0=1;// 启动定时器T0 TR1=1;// 启动定时器T1 TMOD=0x11;//使用定时器T0的模式1 定时器T1的模式1
  • (二)定时器,计数器中断 TL0低八位先进行存储,达到0XF,向上进一,直到高低八位都满时就可以产生中断或者控制TF0口。 (1). TMOD低四位控制T0,高四位控制T1。 GATE:(门控位) (2)控制寄存器TCON:...
  • (1)利用单片机定时器/计数器设计一个秒表,由 P0 口连接 LED 灯,采用 BCD 码 显示,发光二极管亮表示 1,暗则表示 0,计满 100s 后从头开始,依次循环。利用一只 按键控制秒表的启、停。请在 Proteus 中画出电路...
  • 51单片机两种不同的定时器中断程序实例 关于51单片机定时器系统: 1:51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。 2:定时器/计数器和单片机的CPU是相互独立的。定时器/...
  • 1、根据定时器/计数器0方式1逻辑结构图,分析门控位GATE取不同值时,启动定时器的工作过程。 答:当GATE=0:软件启动定时器,即用指令使TCON中的TR0置1即可启动定时器0。
  • 51单片机定时器(T0/T1)的使用与配置流程

    万次阅读 多人点赞 2020-03-10 12:27:07
    第一步:配置工作方式寄存器—TMOD TMOD寄存器的字节地址为89H,不能位寻址。... GATE=1,定时器TCON寄存器中TRx(x=0,1)和外部中断引(INT0或INT1)上的电平状态来共同控制。  C/T=1,为计数器模式;  ...
  • 51单片机定时器中断写数码管0-99

    千次阅读 2020-11-23 12:47:55
    定时器0实现数码管的0-99变化 #include "reg52.h" #define uchar unsigned char #define uint unsigned int sbit dula = P2^6;//段选 sbit wela = P2^7;/位选 uint n=0;//个位 uint b=0;//十位 uint m=0;//控制...
  • 实现定时器中断中断嵌套 一、背景知识 1.定时器结构和原理: (1)组成:两个16位的定时器T0和T1,以及他们的工作方式寄存器TMOD和控制寄存器TCON等组成。内部由总线与CPU连接。 (2)工作模式 每个定时器内部...
  • 51单片机定时器中断

    千次阅读 2017-02-09 17:08:16
    一、中断定时器工作原理 1、中断概念: 1>CPU处理事件A发生事件B进行处理(中断产生) 2>CPU暂时中断当前工作,转去处理事件B(中断响应与中断服务) 3>待CPU处理完B,再回来处理事件A(中断返回) 4>51不...
  • 51单片机第二讲(定时器中断

    万次阅读 多人点赞 2018-01-28 19:03:34
    1.中断的概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断产生);...51单片机里一共有5个中断源,分别是外部中断0,定时器0,外部中断1,定时器1,串口中断中断优先级从大到
  • 51单片机利用定时器中断制作秒表

    万次阅读 2019-04-13 21:47:06
    单片机利用定时器中断制作秒表 #include #define LED P0 sbit LA=P2^4; //对应着138译码器C,B,A端口 sbit LB=P2^3; sbit LC=P2^2; sbit start=P3^1;//三个键控制开关和暂停 sbit pulse=P3^0; sbit end=P3^2; char...
  • STC51单片机中断定时器配置参考

    千次阅读 2018-11-22 11:59:13
    *外中断INT0--------void intsvr0(void) interrupt 0 using 1 *定时/计数器T0-----void timer0(void) interrupt 1 using 1 *外中断INT1--------void intsvr0(void) ...*定时/计数器T1-----void timer0(void) i...
  • 51单片机定时器/计数器T0|T1的四种工作方式

    万次阅读 多人点赞 2020-06-23 15:27:14
    • 选择方式0、方式1、方式2时,T0|T1的工作情况相同 • 选择方式3时,T0|T1的工作情况不同 方式0:13位定时器/计数器,TH0的高8位,TL0的低5位 方式1:16位定时器/计数器,TH0的高8位,TL0的低8位 方式2:自动重...
  • 51单片机 中断定时器

    千次阅读 2020-06-23 11:45:27
    51单片机,拥有两个定时器,用来中断计数,分别是T0和T1。而52单片机和51单片机定时器是一样的,只是52比51多了一个定时器/计数器T2,它们的设置都大同小异 定时器T0与T1不同之处在于它们的工作方式3不同,方式0...
  • 51单片机使用定时器中断模拟PWM控制端口电压

    千次阅读 多人点赞 2018-11-13 20:10:34
    最近应实验室需求写一篇51单片机产生PWM的文章供参考.  单片机芯片STC89C52,晶振12MHz,编译环境Keil5.  分析:若使单片机端口为高电平, 则单片机输出电压为恒值5V. 反之低电平输出电压为0V. 但是我们如果在周期为...
  • 要学习51单片机中断的朋友,拥有这一篇博文就够了,深入浅出,里面包含了寄存器,外部中断定时器中断中断嵌套等的讲解,还有代码实战。快一万字,写得不容易,还请大家点赞支持一下,后续持续更新(一)寄存器1....
  • 51单片机定时器0工作在模式0,每中断10次,使P2.0引脚连接的LED灯闪烁
  • 51单片机定时方式0,1和2的区别: 首先采用Fsoc=12MHz晶振,其机器周期为12/Fsoc,即为1us; 定时方式0为13位定时/计数器,记满值为213=8192;定时方式1为16位定时/计数器,记满值为216=65536,16位初值分为高8位与低8...

空空如也

空空如也

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

51单片机定时器t1中断