0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机定时/计数器的工作方式

CHANBAEK 来源:电子开发之家 作者: 小树 2023-10-31 15:48 次阅读

1硬件连接

定时器是单片机内部的特殊功能模块。

控制系统中,常常要求有一些实时时钟以实现定时或者延时控制,如定时中断、定时检测、定时扫描等等,也往往要求有计数器,对外部事件进行计数。

要实现定时或者延时功能,一般有三种方法:软件定时,不可编程硬件定时,可编程硬件定时。

软件定时——让软件循环执行一段程序,程序本身并无执行目的,而是通过执行程序延时固定的时间,也就是以前的程序中经常使用的延时程序。这种方法降低了cpu的利用率。

不可编程硬件定时——如外部芯片555 时基电路,通过外部阻容,达到一定的延时功能,改变阻容大小可以改变延时长度。这种定时器取决于硬件,设定好以后不能通过软件更改。

可编程定时器——这种定时器的定时值可以通过软件确定和修改,使用灵活便捷。

本节所讲的定时器为第三种,可编程定时器,51单片机中T0/T1为2个相同的16位定时/计数器。

定时/计数器的结构:

图片
图 1 定时/计数器的结构

TCON控制寄存器:

图片

TCON用于控制外部中断和定时/计数器启动和中断,低4位用于控制外部中断,高4位用于控制定时/计数器T0和T1。

TCON.0~TCON.3(IT0、IE0、IT1、IE1)均为外部中断相关位,详见外部中断。

TR0(TCON.4):定时/计数器T0运行控制位。TR0=1时,T0开始工作;TR0=0时,T0停止工作。TR0由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。

TF0(TCON.5):定时/计数器T0溢出中断请求标志位。TF0=1时,申请进去定时器中断。T0计数溢出时由硬件自动置TF0为1。CPU响应中断后TF0由硬件自动清0。T0工作时,CPU可随时查询TF0的状态。所以,TF0可用作查询测试的标志。TF0也可以用软件置1或清0,同硬件置1或清0的效果一样。

TR1(TCON.6):定时/计数器T1运行控制位,其功能与TR0类同。

TF1(TCON.7):定时/计数器T1溢出中断请求标志位,其功能与TF0类同。

TMOD模式控制寄存器:

图片

图 3 TMOD模式控制寄存器格式

TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1

GATE: 门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动

定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。

image.png

M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。

图片
表1 定时/计数器工作方式表

2定时/计数器的工作方式

一、方式0

方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。

图片
图 4 方式0工作原理

计数初值计算初值的公式为:image.png

二、方式1

方式1的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了16位加1计数器。

图片
图 5 方式1工作原理图

计数个数与计数初值的关系为:image.png

三、方式2

方式2为自动重装初值的8位计数方式。当TL0装满溢出时,系统自动将TH0中的数值装给TL0,TLO重新开始计数。

图片
图 6 方式2工作原理图

计数个数与计数初值的关系为:image.png

四、方式3

方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。工作方式3将T0拆分成为两个独立的8位定时/计数器TL0和TH0,两个计数器独立工作。

图片
图 7 方式3工作原理图

计数个数与计数初值的关系为:image.png

3定时器0

#include< reg52.h > //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED=P1^2;    //定义LED端口

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
 TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
 TH0=0x00;	      //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
 TL0=0x00;
 EA=1;            //总中断打开
 ET0=1;           //定时器中断打开
 TR0=1;           //定时器开关打开
}
/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
 Init_Timer0();
 while(1);
}

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
 TH0=0x00;		  //重新赋值
 TL0=0x00;

 LED=~LED;        //指示灯反相,可以看到闪烁

}

定时器0的程序代码

定时/计数器0 使用16位定时模式,计数初值为0,计数到65536 溢出,中断程序中LED取反,LED 以65536*2个时钟周期为周期闪烁。

计数个数与计数初值的关系为:image.png

4定时器1

#include< reg52.h > //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED=P1^3;    //定义LED端口

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer1(void)
{
 TMOD |= 0x10;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
 TH1=0x00;	      //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
 TL1=0x00;
 EA=1;            //总中断打开
 ET1=1;           //定时器中断打开
 TR1=1;           //定时器开关打开
}
/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
 Init_Timer1();
 while(1);
}
/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3 using 1
{
 TH1=0x00;		 //重新赋值
 TL1=0x00;

 LED=~LED;       //LED闪烁

}

定时1的程序代码

5 产生1ms方波

#include< reg52.h > //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit OUT=P1^2;    //定义OUT输出端口

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
 TMOD |= 0x01;	              //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
 TH0=(65536-500)/256;	      //给定初值,这里使用定时器最大值从500开始计数一直到65535溢出
 TL0=(65536-500)%256;		  //12M晶振计算指令周期1us,1ms方波半个周期500us,即定时500次
 EA=1;                        //总中断打开
 ET0=1;                       //定时器中断打开
 TR0=1;                       //定时器开关打开
}
/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
 Init_Timer0();
 while(1);
}
/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
 TH0=(65536-500)/256;		  //重新赋值
 TL0=(65536-500)*256;        
                             							 
 OUT=~OUT;         			  //溢出然后输出端取反
                              //用示波器可看到方波输出
}

图 10 1ms方波的程序代码

示波器显示周期为1ms的方波信号

6 产生多路不同频率的方波

#include< reg52.h > //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
 TMOD |= 0x01;	              //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
 TH0=(65536-500)/256;	      //给定初值,这里使用定时器最大值从500开始计数一直到65535溢出
 TL0=(65536-500)%256;		  //12M晶振计算指令周期1us,1ms方波半个周期500us,即定时500次
 EA=1;                        //总中断打开
 ET0=1;                       //定时器中断打开
 TR0=1;                       //定时器开关打开
}
/*------------------------------------------------
                    主程序
------------------------------------------------*/
main()
{
 Init_Timer0();
 while(1);
}

/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
 static unsigned char i;

 TH0=(65536-500)/256;		  	 //重新赋值
 TL0=(65536-500)*256;        

 i++;
 P1=i; //P1口8路输出不同频率,相当于一个分频器,高频用示波
       //器测量,低频可以直接用led观测
       //P1.0输出1ms方波,P1.1输出2ms,p1.2输出4ms,以此类推

}

图 11 多路不同频率方波的程序代码

中断部分,相当于一个分频器,在P1 口可以测量出8 路不同频率的方波。

P1 口测量不同频率方波,周期依次增大一倍。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6035

    文章

    44553

    浏览量

    634767
  • 控制系统
    +关注

    关注

    41

    文章

    6605

    浏览量

    110581
  • 计数器
    +关注

    关注

    32

    文章

    2256

    浏览量

    94485
  • 定时器
    +关注

    关注

    23

    文章

    3246

    浏览量

    114742
收藏 人收藏

    评论

    相关推荐

    单片机定时器/计数器结构与工作方式详解

    定时器/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存组成。TMOD是定时器/计数器
    的头像 发表于 12-29 06:50 1.2w次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>/<b class='flag-5'>计数器</b>结构与<b class='flag-5'>工作方式</b>详解

    单片机中的定时计数器的四种工作方式详解

    单片机中的定时/计数器都能有多种用途,要通过定时/计数器方式控制字来设置,需要的用途。在
    发表于 04-30 06:30

    51单片机什么时候处于定时器\计数器工作方式

    51单片机定时器\计数器工作原理定时器/计数器的结构:何时处于计数器
    发表于 11-18 06:41

    单片机定时器/计数器有哪几种工作方式

    内部,即每个机器周期产生一个计数脉冲,计数器加1。若采用12M晶振,则计数频率为1MHz,即每过1μs,计数器加1。单片机
    发表于 11-23 06:26

    51单片机中的定时器/计数器有哪几种工作方式

    51单片机中的定时器/计数器有何作用?51单片机中的定时器/计数器有哪几种
    发表于 01-21 06:18

    单片机计数器_定时器工作原理_

    单片机计数器_定时器工作原理,定时器计数器寄存
    发表于 05-06 14:12 1次下载

    80C51单片机定时器/计数器详解(含工作方式

    80C51单片机要实现定时功能,比较方便的办法是利用单片机内部的定时/计数器。下面我们将对80C51单片
    发表于 11-09 20:10 5.9w次阅读
    80C51<b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>/<b class='flag-5'>计数器</b>详解(含<b class='flag-5'>工作方式</b>)

    51单片机定时器计数器工作方式详细说明

    定时/计数器单片机系统一个重要的部件,其工作方式灵活、编程简单、使用方便,可用来实现定时控制、延时、频率测量、脉宽测量、信号发生、信号检测
    发表于 08-29 17:03 2次下载
    51<b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>和<b class='flag-5'>计数器</b>的<b class='flag-5'>工作方式</b>详细说明

    MCS-51单片机定时器计数器的4种工作方式解析

    MCS-51单片机含有2个定时器/计数器,具有4种工作方式。具有两种工作模式(计数器模式和
    发表于 10-22 16:24 3.4w次阅读
    MCS-51<b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>和<b class='flag-5'>计数器</b>的4种<b class='flag-5'>工作方式</b>解析

    51单片机定时/计数器工作原理

    定时/计数器的最基本工作原理是进行计数。对内部时钟脉冲进行计数时,作为定时器;对外部脉冲信号
    发表于 11-10 20:36 14次下载
    51<b class='flag-5'>单片机</b><b class='flag-5'>定时</b>/<b class='flag-5'>计数器</b>的<b class='flag-5'>工作</b>原理

    单片机基础(五):定时/计数器工作原理及工作方式

    定时器计数器)  单片机中的模块,可通过编程实现对系统时钟计数定时器),也可以对外部信号计数
    发表于 11-11 09:51 10次下载
    <b class='flag-5'>单片机</b>基础(五):<b class='flag-5'>定时</b>/<b class='flag-5'>计数器</b>的<b class='flag-5'>工作</b>原理及<b class='flag-5'>工作方式</b>

    51单片机定时器\计数器工作原理

    51单片机定时器\计数器工作原理定时器/计数器的结构:何时处于计数器
    发表于 11-11 11:36 10次下载
    51<b class='flag-5'>单片机</b>之<b class='flag-5'>定时器</b>\<b class='flag-5'>计数器</b>的<b class='flag-5'>工作</b>原理

    单片机(AT89C51)定时/计数器详解及其实验案例

    单片机(AT89C51)定时/计数器及其实验案例目录:定时/计数器应用范围定时/
    发表于 11-17 10:06 114次下载
    <b class='flag-5'>单片机</b>(AT89C51)<b class='flag-5'>定时</b>/<b class='flag-5'>计数器</b>详解及其实验案例

    单片机定时器/计数器结构与工作方式详解

    定时器/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存组成。TMOD是定时器/计数器
    发表于 02-09 11:52 4次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>定时器</b>/<b class='flag-5'>计数器</b>结构与<b class='flag-5'>工作方式</b>详解

    单片机定时/计数器工作定时计数方式时有何异同点?

    单片机定时/计数器工作定时计数方式时有何异同点?
    的头像 发表于 10-25 11:50 4218次阅读