51单片机-定时器中断

2023-05-16

目录

1.定时器/计数器

1.1.工作原理

1.2.相关寄存器

1.3.工作模式(模式1)

2.中断系统

2.1.中断的概念

2.2.中断结构

2.3.中断源

2.4.相关寄存器

3.如何配置定时器中断

4.实际应用

4.1.LED闪烁

4.2.独立按键控制LED流水灯

4.3.计时器

5.知识点

5.1.什么是静态局部变量


1.定时器/计数器

1.1.工作原理

工作原理:定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值增加到“设定的闹钟提醒时间”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行

1.2.相关寄存器

1.工作模式寄存器TMOD

  • GATE:门控制;GATE=0,仅有运行控制位TRx来控制定时/计数器的开启;GATE=1,由TRx和外部中断脉冲计数。(用于计算外部中断负跳变的次数)
  • C/T:计数器模式和定时器模式选择;C/T=0,选择定时器模式;C/T=1,选择计数器模式
  • M1/M0:选择定时/计数器的工作模式,如下表:

2.定时器/计数器控制寄存器TCON

  • TF0/ TF1: 是定时器中断标志(定时器0溢出标志位、定时器1溢出标志位)
  • TR0 /TR1: 打开相应的定时器(定时器0运行控制位,=1时启动定时器0、定时器1运行控制位,=1时启动定时器1);由软件清0关闭定时器0/1。当GATE=1,且INIT为高电平时,TR1置1启动定时器1;当GATE=0时,TR1置1启动定时器0/1。
  • IT0/IT1: 是外部中断的触发方式; =0时低电平触发,=1时负跳变触发。
  • IE0/IE1: 是外部中断的标志位

1.3.工作模式(模式1)

模式1:16位定时器/计数器,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器 

当GATE=0(TMOD.3)时,如TR0=1,则定时器计数;GATE=1时,允许由外部输入INT0控制定时器0,这样可以实现脉宽测量;TR0位TCON寄存器内的控制位;

当C/T=0时,多路开关连接到系统时钟的分频输出,T0对时钟周期计数,T0工作在定时模式;

当C/T=1时,多路开关连接到外部脉冲输入P3.4/T0,即使=T0工作在计数模式;

2.中断系统

2.1.中断的概念

  • 中断:当CPU正在处理某项事务的时候,如果外界或者内部发生了紧急事件,要求CPU暂停正在处理工作而去处理这个紧急事件,待处理完后,再回到原来中断的地方,继续执行原来被中断的程序,这个过程称作中断;

  • 中断系统:实现这种功能的部件称为中断系统(中断机构),包含了中断源,中断方式,中断控制寄存器,中断响应和中断请求的撤除;
  • 中断源:请示 CPU 中断的请求源称为中断源
  • 中断嵌套:中断过程中又有中断发生称为中断嵌套;
  • 中断服务子程序:中断执行的程序称为中断服务子程序;
  • 中断优先级:中断的处理有高优先级和低优先级之分,且低优先级中断可以被高优先级中断所中断,反之不能

2.2.中断结构

2.3.中断源

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

2.4.相关寄存器

1.中断允许寄存器IE

  • EA: 总中断允许; EA=0,CPU屏蔽所有中断的请求;EA=1,开放所有中断。
  • ES:串行口中断允许位;ES=0,禁止串行中断;ES=1,允许串口中断。
  • ET0/ET1: 定时器/计数器0和定时器/计数器1,中断允许位=0时,禁止相应的定时器中断;=1时,允许相应的定时器中断。
  • EX0/EX1: 外部中断0和外部中断1,中断允许位=0时,禁止相应的外部中断;=1时,允许相应的外部中断。
  • ——:无效位

2.中断优先寄存器IP

  • PS: 串行口中断优先级 PS = 1;(高) 。PS = 0; (低)。
  • PT0:定时器0中断优先级 PT0 = 1;(高) PT0 = 0;(低)。
  • PT1:定时器1中断优先级 PT1 = 1;(高) PT1 = 0;(低)。
  • PX0:外部中断0中断优先级 PX0 = 1;(高) PX0 = 0;(低)。
  • PX1:外部中断1中断优先级 PX1 = 1;(高) PX1 = 0;(低)。
  • ——:无效位

  • IP寄存器不做设置,上电复位后为00H(IP = 0X00),默认是为低优先级;优先级从低到高:外部中断0→定时器0→外部中断1→定时器1→串口
  • 把IP寄存器设置为:IP = 0X10;优先级从高到低:串口→外部中断0→定时器0→外部中断1→定时器1

3.如何配置定时器中断

如何配置定时器中断呢,大置流程TMOD-->TCON-->计数器初值-->中断配置;如配置为模式1,且定时为1ms的中断系统:

  • 工作模式寄存器TMOD配置:不可位寻址,需整体赋值,TMOD=0000 0001
  • 控制寄存器TCON配置:因GATE=0,所以中断控制开关有TR0控制;TR0=1
  • 计数器初值配置:如果定时1ms;初值就为1ms / 1us = 1000;也就是要计数1000个数, 初值 = 65535-1000+1 = 64536,65536才会溢出; 所以初值即FC18H(十进制为64536),TH0=0xFC,TL0=0x18
  • 中断配置:TF0=0//一旦=1的时候,产生中断;EA=1//总中断允许;ET0=1//允许对应定时器中断;PT0=0//低优先级;

//*定时器中断函数
void Timer0_Init()
{
    //*TMOD配置:配置为0x01,为不干扰定时器1,改用如下代码
    TMOD&=0xF0;//把TMOD的低四位清零,高四位保持不变
    TMOD|=0x01;//把TMOD的低四位置1,高四位保持不变
    
    //*TCON配置
    TR0=1;//定时器0开始计算

    //*计数器配置:初值设置为64535
    TH0=0xFC;//设置定时初值 64535/256
    TL0=0x18;//设置定时初值 64535%256
    /********************************************
      如单片机为12Mhz晶振,则  
      时钟周期: 1/12000000   机器周期: 12/12000000
      
      假设定时1ms,则
          次数*(12/12000000)=0.001
      则 
          次数=1000
      而单片机的定时器相当于一个水桶,能装65535,要让他数1000次就满,
      所以要在里面提前装好65535-1000的水才可以。
    **********************************************/

    //*中断配置
    TF0=0;//清楚TF0标志
    ET0=1;//对应的定时器中断允许
    EA=1;//总中断允许
    PT0=0;//低优先级
}

4.实际应用

4.1.LED闪烁

功能需求:LED闪烁,每过一秒,改变LED的状态,用定时器中断实现

程序设计:配置定时器中断;主程序可以啥也不干,运行1000次,中断溢出,去执行中断子程序;中断子程序用来设计LED的闪烁效果(确定是哪颗灯闪烁,闪烁的周期等)

main.c文件

#include <REGX52.H>

//*定时器中断程序
void Timer0_Init()
{
	TMOD&=0xF0;
	TMOD|=0x01;
	TR0=1;
	TH0=0xFC;
	TL0=0x18;
	TF0=0;
	ET0=1;
	EA=1;
	PT0=0;
}

//*主程序
void main()
{
	Timer0_Init();//调用定时器中断函数,循环1000次之后(1ms),中断溢出
	while(1)
	{
	
	}
}

//*中断服务程序
unsigned int T0Count;
void Timer0_Routine() interrupt 1//中断溢出后,执行中断服务程序
{
	TH0=0xFC;
	TL0=0x18;//因中断溢出之后,初始值从0开始计算;为确保是1ms的循环周期,故要在此处重新配置初始值为64535
	T0Count++;
	if(T0Count>=1000)//我们需要LED灯1s亮灭,1s=1000*1ms
	{
		T0Count=0;//T0Count归零
		P2_0=~P2_0;	//取反,LED闪烁
	}
}

4.2.独立按键控制LED流水灯

功能需求:通过独立按键,控制LED流水灯左右移动

程序设计:配置定时器中断,主程序用来设计独立按键按下之后的结果,中断子程序用来设计流水灯的效果

main.c文件

#include <REGX52.H>
#include <INTRINS.H>
#include"Delay.h"

//*定时器中断程序
void Timer0_Init()
{
	TMOD&=0xF0;
	TMOD|=0x01;
	TR0=1;
	TH0=0xFC;
	TL0=0x18;
	TF0=0;
	ET0=1;
	EA=1;
	PT0=0;
}

//*独立按键子程序
unsigned char Key()
{
	unsigned char KeyNumber=0;
	if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}
	if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}
	if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}
	if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}
	return KeyNumber;
}

//*主程序
unsigned char KeyNum,LEDMode;
void main()
{
	P2=0xFE;
	Timer0_Init();
	while(1)
	{
		KeyNum=Key();//调用独立按键程序
		if(KeyNum)
		{
			if(KeyNum==1)//如果按键1按下
			{
				LEDMode++;
				if(LEDMode>=2)LEDMode=0;//控制LEDMode只有0和1两个变量
			}
		}
	}
}

//*中断服务程序
void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TH0=0xFC;
	TL0=0x18;
	T0Count++;
	if(T0Count>=500)//500ms为一周期
	{
		T0Count=0;
		if(LEDMode==0) P2=_crol_(P2,1);//调用系统程序<INTRINS.H>中的左移功能
		if(LEDMode==1) P2=_cror_(P2,1);//调用系统程序<INTRINS.H>中的右移功能
/*按键按1次左移,再按1次右移*/
	}
}

4.3.计时器

功能需求:通过LCD1602,显示简单的计时功能

程序设计:配置定时器中断,主程序用来显示“时间”;中断子程序用来设计分秒时如何换算(60进1)过程

main.c文件

#include <REGX52.H>
#include"Delay.h"
#include"LCD1602.h"

//*定时器中断程序
void Timer0_Init()
{
	TMOD&=0xF0;
	TMOD|=0x01;
	TR0=1;
	TH0=0xFC;
	TL0=0x18;
	TF0=0;
	ET0=1;
	EA=1;
	PT0=0;
}

//*主函数
unsigned char Sec,Min,Hour;
void main()
{
	LCD_Init();
	Timer0_Init();
	LCD_ShowString(1,1,"Clock:");
	LCD_ShowString(2,3,":");
	LCD_ShowString(2,6,":");
	while(1)
	{
		LCD_ShowNum(2,1,Hour,2);
		LCD_ShowNum(2,4,Min,2);
		LCD_ShowNum(2,7,Sec,2);
	}
}

//*中断子函数
void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TH0=0xFC;
	TL0=0x18;
	T0Count++;
	if(T0Count>=1000)
	{
		T0Count=0;
		Sec++;
		if(Sec>=60)
		{
			Sec=0;
			Min++;
			if(Min>=60)
			{
				Min=0;
				Hour++;
				if(Hour>=24)
				{
					Hour=0;
				}
			}
		}
	}
}

5.知识点

5.1.什么是静态局部变量

使用:局部变量前加static,修饰局部变量为静态局部变量。

作用:改变局部变量的销毁时期。静态局部变量的作用域和局部变量的作用域一样,当定义它的函数或语句块结束的时候,作用域结束。不同的是,静态局部变量存储在静态存储区,当静态局部变量离开作用域后,并没有被销毁。当该函数再次被调用的时候,该变量的值为上次函数调用结束时的值。

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;//静态局部变量
	TH0=0xFC;
	TL0=0x18;
	T0Count++;
	if(T0Count>=500)
	{
		T0Count=0;
		if(LEDMode==0) P2=_crol_(P2,1);
		if(LEDMode==1) P2=_cror_(P2,1);
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机-定时器中断 的相关文章

  • 基于stm32的GPS解析数据

    目录 1 GPS模块 2 GPS发送的数据格式 3 软件设计 3 1配置好串口 3 2然后写串口中断函数 效果 1 GPS模块 2 GPS发送的数据格式 GPRMC lt 1 gt lt 2 gt lt 3 gt lt 4 gt lt 5
  • 大疆遥控控制M3508电机二(基于HAL库)

    接上一篇文章 xff0c 话不多说直接开始 一 打开我们创建的工程文件 xff0c 先就建立一个文件夹用来存放我们写的子文件 xff08 不建立也行 xff09 xff0c 然后建立pid h xff0c pid c存入我们建立的文件夹中
  • aruco_ros 在相机图像中显示的坐标轴姿态与TF发布的姿态不一致 解决方法

    aruco ros 在相机图像中显示的坐标轴姿态与TF发布的姿态不一致 解决方法 运行环境问题描述解决方案 运行环境 系统版本 xff1a Ubuntu 16 04 ROS版本 xff1a Kinetic 问题描述 在进行手眼标定过程中 x
  • 安装vscode的时候没有勾选快捷方式用vscode打开文件,如何用vscode快速打开文件或者文件夹

    1 需要在注册表里面添加内容可以实现 xff0c 下面有一种简单的方式来完成这个操作 2 需要在电脑桌面新建一个Open File With VS code reg 文件然后用打开文件 xff0c 将以下代码复制 Windows Regis
  • C语言学习笔记->const和define区别

    1 define 是预编译指令 xff0c 而const 是普通变量的定义 define定义的宏是在预处理阶段展开的 xff0c 而const定义的只读变量在编译运行中使用 2 const定义的是变量 xff0c 而define定义的是常量
  • 基于栈、寄存器的优缺点

    基于栈的优点 xff1a 对硬件的依赖不高 xff0c 跨平台性 缺点 xff1a 使用的指令集高基于寄存器的优点 xff1a 相对于栈来说 xff0c 寄存器的性能高 xff0c 使用的指令集少 Java代码执行流程 xff1a java
  • Makefile文件的编写(实例详解)

    1 什么是Makefile xff1f 一个工程中的源文件不计其数 xff0c 其按类型 功能 模块分别放在若干个目录中 xff0c Makefile定义了一系列的规则来指定哪些文件需要先编译 xff0c 哪些文件需要后编译 xff0c 哪
  • 用C语言实现万年历的代码及思路(详细教程)

    万年历程序要求 xff1a 1 当选择1的时候 xff0c 输入年 xff0c 打印输入的这一年12月的日历 2 当选择2的时候 xff0c 输入年 月 xff0c 打印输入这一年这一月的日历 实现效果 xff1a 选择1时 span cl
  • 有符号数和无符号数参与运算时的问题

    陷阱题目 xff1a 下面的代码输出是 xff08 xff09 span class token macro property span class token directive hash span span class token di
  • 【Linux网络编程】基于UDP实现多人聊天室

    文章目录 一 UDP的概念1 1 UDP1 2 UDP特点 二 采用UDP实现多人聊天室原因三 多人聊天室项目功能四 实现多人聊天室项目流程分析4 1 前期准备4 1 1 定义结构体4 1 2 定义链表 4 2 多人聊天室服务器4 2 1
  • 【C++】C向C++的知识过度(上)

    文章目录 一 C与C 43 43 的区别1 1 C是面向过程的1 2 C 43 43 是面向对象的1 3 编译器的区别 二 C与C 43 43 默认代码的不同三 命名空间3 1 关键字 96 namespace 96 去定义自己的名字空间
  • 【C++】四种类型转换 | C++异常处理机制 | C++11新特性之右值引用和移动构造

    文章目录 一 C 43 43 中的四种类型转换1 1 静态类型转换1 1 1 C 43 43 中内置类型的转换1 1 2 C 43 43 中的有继承关系存在的场景下的类型强转 1 2 动态类型转换1 3 常类型转换1 4 解释类型转换 二
  • 【Linux操作系统】进程详解(上)

    文章目录 一 进程的定义二 进程的特征三 进程的组成及其作用四 进程控制块4 1 进程控制块定义4 2 task struct的内容 五 进程与程序的区别六 进程与线程的区别七 进程的种类八 PID8 1 PID定义8 2 特殊PID的进程
  • 【Linux操作系统】进程详解(下)

    文章目录 前言一 父子进程共用光标问题1 1 验证1 2 规避共用光标问题使用多进程拷贝同一个文件 二 进程相关函数2 1 getpid getppid函数2 2 exit exit函数2 3 wait waitpid函数 三 守护进程3
  • git补丁操作(git diff、git format-patch、git apply、git am)

    https blog csdn net qq 42138454 article details 119058431 实际使用补丁用的 xff1a patch p1 lt device nuwa diff 一 打补丁的两种方法 Git 提供了
  • 三、C++ 链接器 linker

    cilinking 从C 43 43 源码到可执行二进制的过程 compile文件之后进行链接 xff0c 找到每个符号 函数的位置 xff0c 并将其链接在一起 每个文件被编译成一个独立的 obj文件作为translation unit
  • 五、C++中的头文件 Header Files

    头文件 Header Files传统上用于声明某些函数类型 xff0c 以便可以用于整个程序中 例如 xff1a 在一个文件1中创建函数 xff0c 然后想在另一个文件2中使用 xff0c 尝试编译此文件2时 xff0c C 43 43 不
  • 六、如何使用VS调试代码、条件语句

    how to use Visual Studio to debug our code 查看程序断点 调试程序 1 设置断点 断点 xff0c 调试器将中断 xff0c break xff0c 程序调试是将会中断 xff0c continue
  • 七、如何设置C++项目 set up C++ project

    Visual Studio设置项目文件目录 组织项目文件 打开Visual Studio Start Page 起始页 xff0c 新建项目 New Project xff0c C 43 43 下的General Empty Project
  • 八、C++中的循环 for while do...while及控制流语句

    xff08 1 xff09 for while do while循环 简单来讲 xff0c 循环就是多次执行同样的代码 例 xff0c 如何输出重复内容多次 xff1a 代码复制多次 xff1b 写个函数调用多次 xff1b 写循环重复执行

随机推荐

  • 九、C++ 指针 pointer 引用 Reference

    原始指针 raw pointer 非智能指针 smart pointer 指针是一个整数 xff0c 一个数字 xff0c 它存储一个内存地址 创建指针 xff1a void ptr 61 0 void指针表明不关心指针存储地址的数据类型
  • 基础电路-电子电路

    1 1 电流 xff1a 在导体的两端加上电压 xff0c 导体的电子就会在电场的作用下做定向运动 xff0c 形成电子流 xff0c 称之为 电流 xff1b 电流方向和电子移动方向相反 xff1b 电流有直流和之分 1 2 电压 xff
  • CTP工作原理及结构

    1 工作原理 自容TP xff1a 自电容的扫描方式是进行逐行扫描 xff0c 所有通道既是感应通道也是驱动信号通道 xff0c 通过对比触摸前后电容量的变化来判定X Y方向坐标 xff0c 然后组合成触摸点的坐标 互容TP xff1a 互
  • LCD工作原理及结构

    1 主流显示面板技术 xff1a LCD xff0c OLED xff0c MicroLED 2 主流显示屏的发展趋势 3 LCD堆叠结构 xff1a 背光 xff0c 下偏光片 xff0c TFT Glass xff0c CF Glass
  • OLED工作原理及结构

    1 主流显示面板技术 xff1a LCD xff0c OLED xff0c MicroLED 2 主流显示屏的发展趋势 3 OLED堆叠结构 xff1a 相比LCD xff0c OLED没了背光和下偏光片 4 OLED发光原理 xff1a
  • Git Fork操作与配置

    https blog csdn net Lu Ca article details 128612125 我理解的git fork xff1a 将别人 xff08 张三 xff09 仓库包括文件 xff0c 提交历史 xff0c issues
  • 背光的工作原理及结构

    1 什么是背光 xff1a LCD本身是不发光的 xff0c 因此它需要一个外部面光源系统来帮助其显示 xff0c 即背光源 xff08 Backlight xff09 xff1b 2 背光的种类 xff1a 从发光类型来分 xff0c 可
  • Microled简介及关键工艺(巨量转移)

    1 什么是Microled xff1f 通俗来讲 xff0c 将作为发光器件LED用作显示屏的像素 xff0c 固这种LED的尺寸就得做得很小 xff08 约 xff1c 100 m xff09 xff0c 这种技术就是Microled x
  • 数字电路基础-逻辑门电路

    1 门电路的概念 实现基本逻辑运算和复合运算的单元电路称为门电路 xff0c 常用的门电路有非门 与非门 或非门 与非门 与或非门等 2 基本逻辑门电路 a 与门 xff1a 全1出1 xff0c 有0出0 工作原理 xff1a 输入A B
  • 51单片机-控制LED灯

    目录 1 硬件设计 2 软件设计 2 1 点亮一颗LED灯 2 2 LED闪烁 2 3 LED流水灯 3 知识点 3 1 while函数的应用 3 2 常用数据类型 3 3 延时函数的自动生成 1 硬件设计 通过原理图分析 xff0c LE
  • 51单片机-74HC595移位寄存器

    目录 1 74HC595芯片介绍 1 1 引脚定义 1 2 工作原理 2 实际应用 2 1 控制数码管 2 2 点阵屏显示图形 2 3 点阵屏显示动画 3 知识点 3 1 位变量 xff08 sbit bit xff09 3 2 字模提取
  • 51单片机-独立按键控制LED灯

    目录 1 硬件设计 2 软件设计 2 1 独立按键控制LED闪烁 2 2 独立按键控制LED状态 2 3 独立按键控制LED显示二进制 2 4 独立按键控制LED移位 3 知识点 3 1 if语句的运用 3 2 常用运算符 1 硬件设计 轻
  • 51单片机-控制数码管

    目录 1 硬件设计 1 1 LED数码管介绍 1 2 原理图设计 2 软件设计 2 1 静态数码管显示 2 2 动态数码管显示 2 3 模块化编程 xff08 头文件 xff09 3 知识点 3 1 数组 3 2 子函数 3 3 switc
  • LCD的制作工艺

    目录 1 LCD简介 2 LCD制程 2 1 Array制程 2 1 1 像素电路 2 1 2 制程简介 2 2 Cell制程 2 3 Module组装 3 总结 1 LCD简介 LCD是目前显示领域的重要组成部分 xff0c 可通过如下链
  • 51单片机-LCD1602

    目录 1 硬件设计 1 1 LCD1602介绍 1 2 原理图 2 软件设计 2 1 控制原理 2 2 控制时序 2 3 指令集 2 4 程序设计 3 知识点 3 1 宏定义 3 2 指针与数组 3 3 for语句 1 硬件设计 1 1 L
  • 51单片机-矩阵键盘

    目录 1 硬件设计 2 软件设计 2 1 矩阵键盘扫描 2 2 矩阵键盘 密码锁 3 知识点 3 1 模块化编程的应用 3 2 include详解 1 硬件设计 矩阵键盘按键数量较多 xff0c 为了减少I O口的占用 xff0c 通常将按
  • 如何优雅的让fork后的仓库与原仓库同步

    https www cnblogs com tudou1179006580 p 14875486 html https github com selfteaching the craft of selfteaching issues 67
  • UDP——C语言socket编程

    UDP编程相比TCP来说相对简单主要用到sendto 和recvfrom 这两个函数 xff0c 接下来主要介绍一下这两个函数 头文件 span class token macro property span class token dir
  • 函数与宏定义

    前言 本文介绍函数与宏定义 一 函数的概念 1 函数的定义 自定义函数的形式 xff1a 存储类型符 返回值类型符 函数名 xff08 形参说明表 xff09 函数语句体 xff08 1 xff09 存储类型符 函数作用范围 xff0c 默
  • 51单片机-定时器中断

    目录 1 定时器 计数器 1 1 工作原理 1 2 相关寄存器 1 3 工作模式 xff08 模式1 xff09 2 中断系统 2 1 中断的概念 2 2 中断结构 2 3 中断源 2 4 相关寄存器 3 如何配置定时器中断 4 实际应用