定时器中断

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

背景:使用动态数码管读取光电传感器的值并且显示,因此要使用到定时器,每隔一个阶段进行一次检测并进行中断。

51单片机里的关于中断的寄存器如下:

IE – 中断允许控制寄存器
IP – 中断优先级控制寄存器
TMOD – 定时器工作方式寄存器
TCON – 定时器控制寄存器
SCON – 串口控制寄存器
THx/TLx – 定时器初值寄存器

在定时器中断中,需要设置的有TMOD、THx/TLx、TCON、IE。 

1、中断允许控制寄存器 IE

该寄存器的主要功能是控制中断的开启与关闭,共7个有效位,包含一个全局中断控制位和6个中断源的控制位。

EA 全局中断允许位,当此位是1时中断可用。(重要)
ET2 定时器/计数器2中断允许位
ES 串口中断允许位
ET1 定时器/计数器1中断允许位
EX1 外部中断1允许位
ET0 定时器/计数器0中断允许位 (重要)
EX0 外部中断0允许位
要使用定时器中断,需要将IE寄存器中的EA位设置为1,以及需要将ETx(x = 0,1,2)设置为1
 

2、 定时器工作方式寄存器 TMOD

该寄存器的主要功能是设置定时器/计数器中断的工作方式。

定时器中断,51,单片机,嵌入式硬件 说明:
GATE 定时器/计数器的开关控制选项。常将该位置0,即定时器/计数器的开关控制仅由TCON寄存器中的TRx(x = 0,1)控制。(见2.2.3的TRx)
C/T 定时器模式和计数器模式选择位,将该位置0则为定时器模式。
M1M0 设置定时器/计数器工作方式,常将该两位设置为0 1,

定时器中断,51,单片机,嵌入式硬件

即定时器常见的工作方式为0x01,即00000001,GATE为0(开),C/T为0(定时器模式),M1M2为01(16为计数)

3、定时器控制寄存器 TCON

该寄存器用于控制中断,如控制定时器的启动,停止、判断定时器的溢出和中断情况。

定时器中断,51,单片机,嵌入式硬件 TF1 定时器1溢出标志位
TR1 定时器1运行控制位,将该位置1时启动定时器1
TF0 定时器0溢出标志位
TR0 定时器0运行控制位,将该位置1时启动定时器0 
IE1 外部中断1请求标志
IT1 外部中断1触发方式选择位
IE0 外部中断0请求标志
IT0 外部中断0触发方式选择位

主要是设置运行控制位(TR1,0)其次是选择中断方式

若选择的是定时器1则TR1=1,若选择的是定时器0则TR0=0。

 4、定时器初值寄存器 THx/TLx

以定时器T0为例,其的工作原理是,每当晶振产生一次脉冲,就将该寄存器TL0加一,当TL0加满溢出后,将TL0清空,TH0加一,TH0计满后产生定时中断。即TH0与TL0组成了一个16位的计数器,这个计数器可以从0x0000(0)加到0xffff(65535)。
以12Mhz的晶振、定时10ms为例:
51单片机为12分频单片机,因此执行一条指令的时间是12×(1/12M) s,即计数器每1us加一。
若定时10ms,则共需要加10000次。
因此将TH0、TL0设置从(65536-10000)= 55536开始计数。55536 的16进制为0xD8F0。因此将TH0设置为0xD8,TL0 设置为0xF0。

综上:定时器的写法为

设置中断允许控制器---->设置工作模式---->控制定时器寄存器---->设置初值

对于初值寄存器THx/TLx的理解:

首先51单片机为12分频单片机,执行一条指令为12x12M/s,即1us,若要计时10ms,则10ms=10000us,其中寄存器TH0加满后(0xffff 65535)进行定时中断 ,则初值应为65535-10000=55536,即应该从55536us(0xD8F0)开始加,每执行一次加1us,当加到65535时候进行中断操作。又因为TH/TL分别为8位共16位,所以其值分别为TH = 0xD8,TL = 0xF0。

5、定时器程序写法

首先要初始化定时器,即将命令写入以上的寄存器。 假设使用定时器T0

步骤为设置定时器工作模式、设置定时时长、打开允许的中断开关、打开定时器开关(使定时器开始计数)
首先设置定时器工作模式TMOD:GATE设置为0;C/T位设置为0使其工作在定时器模式下;M1M0设置为01,使用16位计数。

  1. 设置定时器的工作方式:TMOD = 0x01 (基本都是这个值)设置开关、定时器模式(CT=0)、定时器工作方式(M0,M1=0,1)
  2. 设置定时时长TH0,TL0 16为计算公式为0x(65536-定时时间(单位us)),TH为前8位,TL0为后8位
  3. 打开允许中断的总开关定时器中断,51,单片机,嵌入式硬件

即将ET0、EA设置为 1,(ET为定时器中断,INT为外部中断),因为我们选择的是定时器0,所以也对应了中断的ET0。

        4.打开定时器开关:若选择的是定时器1则TR1=1,若选择的是定时器0则TR0=0。

        5.定时器中断服务函数:

              中断服务函数要写在主函数后面,且不需要声明 。
              中断服务函数无返回值,所以用void
              函数名可以随便起
              interrupt后的中断号由下表的重点服务号确定

void t0Intr() interrupt 1
{
  //执行到此时,计数器已经达到65535,寄存器清零,所以要重新赋值
   //55536 = 0xD8F0
  TH0 = 0xD8;    //65536-10000
  TL0 = 0xF0;    //55536
  
  //下面写需要执行的操作
}

定时器中断,51,单片机,嵌入式硬件

其中 interrupt 1要特别注意,当前我们使用的是T0定时器中断,所以其服务号为1,而不是外部中断0。!!!!!!!!!!!!!!!!!!!!!!!!

根据上述学习:

        定时器中断只不过是中断的一种类型,同外部中断一样,都是中断。只不过定时器中断具有自检测功能,当到一定时间后就开始执行中断,(类似与闹钟),而外部中断只有当外界的信号输入,才开始执行中断。

功能上定时器中断更偏向于单片机内部,而外部中断更偏于外部,即当按键按下时,或其他效果。

更加直观的理解为定时器中断类似于js的setTimeout( ),到达指定时间就会运行。而外部中断类似于onclick事件等,等待外来的信号才开始执行服务。

 文章来源地址https://www.toymoban.com/news/detail-551554.html

中断程序:可以简述为,设置定时器工作模式(TCON),“开两个中断位(ET0、EA)”,“设置两个时间(TH0,TL0)”,开启定时器中断(TR)。

二、程序实验

 测试光电传感器,将值使用8号数码管显示,并用定时器0,50ms检测一次

#include "reg52.h"
#include "public.h"
#define SMG_A_DP_PORT	P0	//使用宏定义数码管段码口
sbit LED1=P2^0;	//将P2.0管脚定义为LED1
sbit sensor_light = P3^2;
sbit motor = P1^3;
//数码管译码器
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 gsmg_code[3]={0x3f,0x06};
/*******************************************************************************
* 函 数 名       : time0_init
* 函数功能		 : 测试光电传感器,将值使用8号数码管显示,定时器0 50ms检测一次
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void time0_init(void)
{
	TMOD|=0X01;//选择为定时器0模式,工作方式1
	//FC18 = 64536,即定时时间为65535-64536 = 999 = 1ms
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器		
}


u16 numbr_verson(void)
{
	//8号位
	LSA = 0;
	LSB = 0;
	LSC = 0;
	if(sensor_light==1) return 1;	
	else  return 0;
}


//定时器中断服务函数
void time0() interrupt 1 
{
	//执行到此时,计数器已经达到65535,寄存器清零,所以要重新赋值
	static u16 i;
	TH0 = 0xFC;
	TL0 = 0x18;
	i++;
	if(i==50)//每50ms检测一次
	{
		i = 0;
		SMG_A_DP_PORT = gsmg_code[numbr_verson()];
	}
}



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

一定要注意函数的参数在服务程序中作用域的问题!!!!!!!!!!!!!

效果:

定时器中断,51,单片机,嵌入式硬件

 定时器中断,51,单片机,嵌入式硬件

 

到了这里,关于定时器中断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 51单片机中断定时器1用法

    中断为使单片机具有对内部或外部随机发生的事件实时处理而设置的。 中断技术不仅解决了快速主机与I/O设备的数据传送问题,而且还有具有如下的优点: 1. 分时操作:CPU可以分时为多个I/O设备服务,提高了计算机的利用率。 2. 实时操作:CPU能够及时处理应用系统的随机事

    2024年02月06日
    浏览(61)
  • 51单片机:中断系统(外部中断,定时器中断,串口通信)

    目录 中断系统简介: 中断的优先级和嵌套: 8个中断请求源及其优先级: 中断的分别介绍: 1、外部中断0:INT0   2、外部中断1  3、T0和 T1:定时计数器的功能 4、串口中断(串口为什么使用定时器后面讲) 中断寄存器 (1)中断允许控制(IE) (2)中断请求标志(TCON) (

    2024年01月25日
    浏览(48)
  • C51单片机——中断与定时器

    中断是大多数CPU最精彩的部分之一,下面我们通过讲解和编程练习学习中断和定时器相关概念 目录 1.1.什么是中断 1.2.中断的种类 1.3中断的相关概念 1.4. 51单片机可用中断及相关引脚 1.4.寄存器 1.5.中断优先级 在未进行任何关于优先级的设置情况下,51 单片机(52 单片机)中断

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

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

    2024年02月07日
    浏览(98)
  • 51单片机定时器中断按键消抖(无延时)

    单片机入门学习记录(二) 在机械按键的触点闭合和断开时,都会产生抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理。按键的抖动对于人类来说是感觉不到的,但对单片机来说,则是完全可以感应到的,而且还是一个很“漫长”的过程,因为单片

    2024年02月14日
    浏览(61)
  • 51单片机——定时器中断实验,小白讲解,相互学习

    定时器介绍 1,CPU时序的有关知识 震荡周期:为单片机提供定时信号的震荡源的周期(晶振周期或外加震荡周期)。 状态周期:2个震荡周期为1个状态周期,用S表示。震荡周期又称S周期或时钟周期。 机器周期:1个机器周期含6个状态周期,12个震荡周期 指令周期:完成1条指

    2024年02月03日
    浏览(48)
  • C51单片机中断系统与定时器/计时器(理论部分)

    前言 文章的开始,有人可能会问,我们在前几节课学了延时函数,为什么不用延时函数来取代定时器,而必须学定时器呢?这里,有如下几个理由: 1.使用delay函数时,单片机的cpu做不了其他事情,只能等待延时结束。 2.用了定时器cpu就可以做其他的事情,只要定时器溢出时

    2023年04月15日
    浏览(40)
  • 【51单片机】如何设置中断函数(场景:在定时器工作完跳转到中断程序时,怎么识别我们的中断程序在哪里呢?)

    前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 本章是【利用定时器和中断实现一个简单项目】中的一部分,感兴趣的老铁可以跳转传送门查看 传送门 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专

    2024年02月19日
    浏览(55)
  • 单片机学习 11-中断系统(定时器中断+外部中断)

    ​ 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一,是我们学习单片机必须要掌握的。很多初学者被困在中断中,学了很久仍然不知道中断究竟是

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

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

    2024年02月05日
    浏览(58)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包