首页 > 其他分享 >51单片机定时器/计数器中断

51单片机定时器/计数器中断

时间:2022-11-12 14:24:28浏览次数:58  
标签:定时器 中断 51 T0 单片机 计数器 定时

51单片机定时器/计数器中断

一、定时器/计数器

1-1 定时器

❤ CPU时序相关知识点

振荡周期:为单片机提供定时信号的振荡源的周期

状态周期:2个振荡周期为1个状态周期,其中振荡周期又称为时钟周期

机器周期:1个机器周期含6个状态周期,12个振荡周期(即12个时钟周期)

指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。

例如:外接晶振为12MHZ时,51单片机相关周期的具体值为:

振荡周期=1/12MHZ=1/12 us

状态周期=2*振荡周期=1/6 us

机器周期=6状态周期=12振荡周期=1 us (定期/计算器的计数基本单位)

指令周期=1~4 us

❤ 定时器相关知识点

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

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

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

STC89C5X 单片机内有两个可编程的定时/计数器T0、T1 和一个特殊功能定时器T2。

定时/计数器的实质是加1 计数器(16 位),由高8 位和低8 位两个寄存器THx 和TLx 组成。

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

1-2 定时/计数器相关寄存器

定时/计数器0、1对应单片机的P3^4P3^5引脚

51单片机定时/计数器的工作由两个特殊功能寄存器控制。其中TMOD寄存器是控制工作方式和功能(即定时或计数),TCON寄存器是控制启动和停止的溢出标志

工作方式寄存器TMOD(不可为寻址)

低四位用于T0,高四位用于T1

GATE是门控位,用于控制定时器的启动是否受外部中断源信号的影响

C/T表示定时/计数器模式选择位;C/T=0为定时模式,C/T=1为计数模式

M1、M0表示工作方式置位。有4种组合方式,构成4中工作方式(方式1是最常用的

控制寄存器TCON(可为寻址)

TCON的低4位用于控制外部中断,高4位用于控制定时/计数器的开启和中断请求

TF1:表示T1溢出中断请求标志位,当T1计数溢出,由硬件自动将TF1置1(即TF1=1)。CPU响应中断后,TF1由硬件自动清0(即TF1=0)。当然TF1也可以用软件置1或清0,跟硬件置1或清0达到一样的效果。

TR1:表示T1的运行控制位,当TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以用软件控制定时/计数器的启动与停止

TF0、TR0类比TF1、TR1

二、定时器/计数器T0中断实验

❤ 实验目的:每个1s点亮LED模块,每个1s熄灭LED模块

❤ 思路:使用定时/计数器T0算好定时1s时间,然后在中断函数中执行亮灭操作

计算定时/计数器T0的初值,选择方式1(16位寄存器 取值范围:0~63325),从初值0x00开始计数,定时中断时长:65536(晶振频率/12)= 65536(11.0592MHz/12) = 60,397.9776 us

通过调整初值,可以定义定时中断时长:定时时长 = (65536-初值)*[1000/(晶振频率/12]

很显然一次中断时长无法达到1s,可以选择多次中断积累;若选择定时时长为1000us,则需要中断积累1000次

1000us的定时触发的寄存器初始值:65536-[1000/(晶振频率/12)]

65536-[1000/(11.0592/12)] = 65536-1085 = 64451 转换成16进制 0xFBC3

❤ 实验代码

#include<REG52.h>

// 定时器0中断函数
void led_flash_t0() interrupt 1
{
	static unsigned i;  //静态局部变量累计中断次数(每次中断为1ms)
	TH0 = 0xFB;	    //重新复位
	TL0 = 0xC3;
	i++;
	if(i == 1000)       //定时1s条件
	{
		i=0;
		P2 = ~P2;
	}
} 

// 定时/计数器T0中断初始化
void time0_init(void)
{
	TMOD=0x01;      //选择定时/计数器T0模式,工作方式1(即16位寄存器计数)

	TH0 = 0xFB;	//给定时/计数器T0赋初值,定时1ms;可以通过51定时器计算工作得知
	TL0 = 0xC3;

	ET0=1;	       //开启定时/计数器T0中断允许
	TR0=1;	       //打开定时/计数器T0
	EA=1;	       //开启中断总允许
}

void main(void)
{
	time0_init();
	while(1)
	{
	
	}
}

❤ 实验结果

每个1s点亮LED模块,每个1s熄灭LED模块,熄灭状态就不放图了

标签:定时器,中断,51,T0,单片机,计数器,定时
From: https://www.cnblogs.com/caojun97/p/16882963.html

相关文章

  • 51单片机的中断系统 && 外部中断
    51单片机的中断系统&&外部中断中断系统是为使CPU具有外界紧急事件的实时处理能力而设置的。一、中断概念对于单片机来说,中断是指CPU在处理某一事件A时,发生另外一事......
  • Keil51单片机解决数字显示不稳的问题
    Keil51单片机解决数字显示不稳的问题数字显示不稳,就是我们人眼的特点决定的,0.1秒的残留现象,低于这个值人眼发现不了其中变化,大于这个值就会出现同一个数字闪烁的现象。解......
  • Keil51单片机数码管鬼影显示问题
    Keil51单片机数码管鬼影显示问题所为的鬼影就是程序逻辑正确,但电路逻辑有问题。就是按程序逻辑,前一个数字显示后,直接显示下一组数字,因为没清干净,导致瞬间残留;处理的办法,......
  • 28-jmeter-固定定时器(设置两个sampler之间的等待时间)
    前言Jmeter的线程组在发送2个请求之间需要设置一个等待时间时,类似于代码里面的sleep休眠时间,可以用固定定时器解决。固定定时器有2个HTTP请求,a是注册用户请求,b是登录的......
  • 【单片机/嵌入式】复位中断服务函数与main函数
    一、复位中断服务函数调用main函数在GD32F450ZGT6的启动文件startuup_gd32f450_470.s中可以发现,复位中断服务函数调用了main函数。【疑问】为什么复位中断服务程序里面直......
  • 27-jmeter-同步定时器
    前言LoadRunner中可以设置一个集合点,设置多个虚拟用户等待到一个时间点,到齐后一起发请求达到并发的目的。集合点概念:阻塞线程,直到指定的线程数量到达后,再一起释放,可以瞬......
  • arm 实现mdio 读写 88X5113 寄存器
    88X5113芯片说明该芯片和平常的phy芯片不同,以下为芯片采用MDIO接口实现读写寄存器的说明配置说明寄存器分为基地址和扩展地址,每次读写扩展地址的数据,需要先......
  • stm32单片机:使用串口下载程序。
    ①连接开发板USB转串口接口并上电。②通过MCUISP选定所下载的程序文件。③通过调帽连接p9—RXD,p10—TXD,Boot0=1(接3.3v),Boot1=0(接地GND)。④在mcuisp设置DTR低电平复位,RTS......
  • ed25519加密签名算法及应用
    刷知乎时看到一篇文章,很感兴趣,来学习一下!转载文章:ed25519加密签名算法及应用初次使用Github时都需上传本地的公钥,这时需要提前在本地生成密钥对,使用的是ssh-keygen命令......
  • [Bug0051]idea插件jrebel 运行报错JRebel-JVMTI [FATAL] Couldn‘t write to C:\User
    1、问题idea插件jrebel运行报错JRebel-JVMTI[FATAL]Couldn‘twritetoC:\Users\报错JRebel:Couldnotcreatelogfile:C:\Users\22611\.jrebel\jrebel.log(系......