单片机第一季:零基础6——定时器和计时器

这篇具有很好参考价值的文章主要介绍了单片机第一季:零基础6——定时器和计时器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1,单片机定时器原理

2,51单片机定时器/计数器结构

3,定时器配置 

4,示例代码-通过定时器控制LED灯间隔1s闪烁 


51 单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。

定时器/计数器和单片机的CPU 是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU 的参与。

51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。

有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1 的工作可以交给定时器/计数器处理。CPU 转而处理一些复杂的事情。同时可以实现精确定时作用。

譬如外部12MHz晶振,单片机工作在12T模式下,则内部时钟频率是1MHz,则时钟脉冲宽度为1us(1/1MHz = 1us)。如果单片机工作在6T模式下,则内部时钟频率是2MHz,则时钟脉冲宽度为0.5us(1/2MHz = 0.5us)

1,单片机定时器原理

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

2,51单片机定时器/计数器结构

单片机第一季:零基础6——定时器和计时器,C++,单片机,嵌入式硬件

上图中的T0 和T1 引脚对应的是单片机P3.4 和P3.5 管脚。51 单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD 是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON 是控制寄存器,控制T0、T1 的启动和停止及设置溢出标志。

工作方式寄存器TMOD 用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:

单片机第一季:零基础6——定时器和计时器,C++,单片机,嵌入式硬件

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:工作方式设置位。定时/计数器有四种工作方式。

单片机第一季:零基础6——定时器和计时器,C++,单片机,嵌入式硬件

TCON 的低4 位用于控制外部中断,已在前面介绍。TCON 的高4 位用于控制定时/计数器的启动和中断申请。其格式如下: 

单片机第一季:零基础6——定时器和计时器,C++,单片机,嵌入式硬件

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 类同。 

 以方式0为例介绍单片机的工作方式:

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

单片机第一季:零基础6——定时器和计时器,C++,单片机,嵌入式硬件

门控位GATE 具有特殊的作用。当GATE=0 时,经反相后使或门输出为1,此时仅由TR0 控制与门的开启,与门输出1 时,控制开关接通,计数开始;当GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚信号和TR0 共同控制。当TR0=1 时,外中断引脚信号引脚的高电平启动计数,外中断引脚信号引脚的低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽度。计数模式时,计数脉冲是T0 引脚上的外部脉冲。计数初值与计数个数的关系为:X=213-N。 

3,定时器配置 

在使用定时器时,应该如何配置使其工作?其步骤如下(各步骤顺序可任意):
①对TMOD 赋值,以确定T0 和T1 的工作方式,如果使用定时器0 即对T0 配置,如果使用定时器1 即对T1 配置。

②根据所要定时的时间计算初值,并将其写入TH0、TL0 或TH1、TL1。

③如果使用中断,则对EA 赋值,开放定时器中断。

④使TR0 或TR1 置位,启动定时/计数器定时或计数。上述中有一个定时/计数器初值的计算,下面我们来看下如何计算定时/计数器初值。

前面我们介绍过机器周期的概念,它是CPU 完成一个基本操作所需要的时间。其计算公式是:机器周期=1/单片机的时钟频率。51 单片机内部时钟频率是外部时钟的12 分频,也就是说当外部晶振的频率输入到单片机里面的时候要进行12分频。比如说你用的是12MHZ 晶振,那么单片机内部的时钟频率就是12/12MHZ,当你使用12MHZ 的外部晶振的时候,机器周期=1/1M=1us。如果我们想定时1ms的初值是多少呢?1ms/1us=1000。也就是要计数1000 个,初值=65535-1000+1(因为实际上计数器计数到65536(2 的16 次方)才溢出,所以后面要加1)=64536=FC18H,所以初值即为THx=0XFC,TLx=0X18。知道了如何计算定时/计数器初值,那么想定时多长时间都可以计算出,当然由于定时计数器位数有限,我们不可能直接通过初值定时很长时间,如果要实现很长时间的定时,比如定时1 秒钟。可以通过初值设置定时1ms,每当定时1ms结束后又重新赋初值,并且设定一个全局变量累计定时1ms 的次数,当累计到1000 次,表示已经定时1 秒了。需要其他定时时间类似操作,这样我们就可以使用定时器来实现精确延时来替代之前的delay 函数。这里以定时器0 为例介绍配置定时器工作方式1、设定1ms 初值,开启定时器计数功能以及总中断,如下: 

void time0_init(void)
{
    TMOD|=0X01;//选择为定时器0 模式,工作方式1
    TH0=0XFC; //给定时器赋初值,定时1ms
    TL0=0X18;
    ET0=1;//打开定时器0 中断允许
    EA=1;//打开总中断
    TR0=1;//打开定时器
}

其中ET0和EA的设置是在中断允许寄存器IE中:

CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE 控制的。 

单片机第一季:零基础6——定时器和计时器,C++,单片机,嵌入式硬件

EA (IE.7), CPU 中断允许(总允许)位。

ET0(IE.1),定时/计数器T0 中断允许位。

4,示例代码-通过定时器控制LED灯间隔1s闪烁 

#include <reg51.h>

//使用T0定时器控制LED灯间隔1s闪烁
unsigned int u16 = 0;  //计数初始值
sbit led = P0^0;

void time0_ini()
{
	TMOD = 0x01; //T0工作在定时模式,工作方式1:16位定时/计数器
	TR0 = 1;     //T0 运行控制位,TR0 置1 时,T0 开始工作
	TH0 = 0xfc;
	TL0 = 0x18;		 //按一秒时间计时,先计算1ms的对应的初值65535 - 1000 + 1 = 64536
				     //对应16进制 0xFBB4
	EA = 1;		     //中断总开关
	ET0 = 1;         //T0中断开关

}

void time0_isr() interrupt 1  //定时器0中断处理程序
{
	u16++;
	TH0 = 0xfc;
	TL0 = 0x18;

	if(u16 == 1000)
	{
	  u16 = 0;
	  led = !led;
	}


}

void main()
{
	time0_ini();  //调用定时器配置函数,即打开定时器和允许定时器的中断

    while(1);   //主程序
}

内部时钟频率是1MHz,时钟周期是1us。最多能定65535(16位定时器),也就是说最大定时时间为65535*1us=65535us=65.535ms。
如果要定比较长的时间(譬如2s),定时器直接是不能满足的,解决办法是多次定时后加起来构成一个长时间。

实验目的:
(1)使用定时器来完成LED闪烁;
(2)原来实现闪烁时中间的延迟是用delay函数实现的,在delay的过程中CPU要一直耗在这里不能去做别的事情。这是之前的缺点;
(3)本节用定时器来定一个时间(譬如1s),在这个定时器定时时间内CPU还可以去做主任务,定时时间到产生中断,在中断处理程序isr中让LED闪烁即可。 文章来源地址https://www.toymoban.com/news/detail-557485.html

到了这里,关于单片机第一季:零基础6——定时器和计时器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机第一季:零基础13——AD和DA转换

    51 单片机系统内部运算时用的全部是数字量,即0 和1,因此对单片机系统而言,无法直接操作模拟量,必须将模拟量转换成数字量。所谓数字量,就是用一系列0 和1 组成的二进制代码表示某个信号大小的量。用数字量表示同一个模拟量时,数字位数可以多也可以少,位数越多

    2024年02月13日
    浏览(37)
  • 单片机第一季:零基础10——串口通信和RS485

    目录 1,串口通讯基础 1.1,同步和异步 1.2,并行和串行  1.3,单工、半双工与全双工通信  1.4,通信速率  2,单片机串口通讯 2.1,接口标准  2.2,通讯协议  2.3,串口内部结构  3,串口相关寄存器  4,波特率计算  5,串口初始化  6,开发板硬件设计  7,串口发送和接收

    2024年02月04日
    浏览(40)
  • 单片机第一季:零基础9——直流电机和步进电机

    目录 1,直流电机 2,步进电机  直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流

    2024年02月16日
    浏览(31)
  • 单片机第一季:零基础12——I2C和EEPROM

    目录 1,EEPROM 2,I2C  2.1,I2C物理层  2.2,I2C协议层  3,AT24C02介绍  4,代码  为什么需要EEPROM? 单片机内部的ROM只能在程序下载时进行擦除和改写,但是程序运行本身是不能改写的。单片机内部的RAM中的数据程序运行时可以改,但是掉电就丢失了。有时候我们有一些数据要

    2024年02月14日
    浏览(34)
  • STM32单片机入门学习笔记——定时器TIM第一部分

    笔记整理自B站UP主 江科大自化协 教程 《STM32入门教程-2023持续更新中》 ,所用单片机也为教程推荐单片机。 第一部分:定时器基本定时的功能,定时器每隔这个时间产生一个中断,来实现每隔一个固定时间执行一段程序的目的,比如要做一个时钟、秒表或者使用一些程序算

    2024年02月03日
    浏览(41)
  • 51单片机定时器基础知识

    经验总结:定时器0工作方式1的溢出中断初始值计算 1.晶振11.0592M 11.0592MHz除12为921600Hz,就是一秒921600次机器周期,50ms=46080次机器周期。 65536-46080=19456(4c00) TH0=0x4c,TL0=0x00 2.晶振12M 12MHz除12为1MHz,也就是说一秒=1000000次机器周期。50ms=50000次 机器周期。 65536-50000=15536(3cb0) TH0=0x

    2024年02月04日
    浏览(100)
  • 【51单片机】:定时器的详解(包括对单片机定时解释、各类定时方式,以及中断方式)

              51定时/计数器的详解。                   码字不易,如有帮助请收藏,点赞哦。         前提:首先我们知道51单片机内部有21~26个特殊功能寄存器: P.x口寄存器:P0、P1、P2、P3 数据指针寄存器:DP0H、DP0L、DP1H、DP1L 定时器: TH1、TL1、TH0、TL0、TMOD、TCON 串口:

    2024年02月07日
    浏览(86)
  • 【单片机】STM32单片机的各个定时器的定时中断程序,标准库

    高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041): TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用

    2024年02月11日
    浏览(41)
  • 单片机-定时器时钟

    89C52RC 1.定时器0,lcd1602显示时间。    main.c

    2024年02月11日
    浏览(32)
  • 51单片机定时器

    目录 前言 一、定时器的介绍及其作用 二、定时器的内部构造及其原理 计算机周期 定时器的工作模式与流程 定时器中断相关寄存器 寄存器的配置  三、程序 总结         下面来介绍学习51单片机第一个也是最常用的片上外设——定时器。该硬件是集成在单片机内部的,

    2024年02月05日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包