定时器中断

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

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

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

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

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

3、定时器控制寄存器 TCON

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

 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. 打开允许中断的总开关

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

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

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

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

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

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

根据上述学习:

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

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

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

 

中断程序:可以简述为,设置定时器工作模式(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 = 1msTH0=0XFC;	//给定时器赋初值,定时1msTL0=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){}
}

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

效果:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/20289.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 有哪些特点?

目录 一、自动配置 二、嵌入式 Tomcat Web 服务器 三、入门 POM 四、Actuator执行器 API 五、SpringBoot初始化器 一、自动配置 Spring Boot的自动配置是Spring Boot框架提供的一种功能,它可以根据用程序的依赖和配置信息,自动配置一些常见的功能模…

数据结构(王卓版)——初识数据结构

一、数据结构讲什么: 程序数据结构算法 数据结构的基础以及数据结构的应用方向。 数据、数据元素、数据项、数据对象 数据结构 逻辑结构的种类 存储结构种类 主要学习顺序和链式存储结构。 有时间可以了解,不用重点学。 数据类型: 抽象数据类…

宝塔安装勾股OA系列服务

勾股oa地址 勾股OA办公系统—开源的OA办公系统 一、服务器配置 二、安装宝塔 1.下载宝塔面板、设置宝塔面板、增加网站。 yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec 根据提示…

Django_设置和读取cookie

设置cookie 在响应对象中使用set_cookie方法设置cookie from django.http import HttpResponsedef set_cookie(request):rsp HttpResponse("set cookie")rsp.set_cookie("set_cookie", "hello python", max_age3600)return rsp 注&#xff1…

MachineLearningWu_12_BuildNNUsingNumpyOrTF

x.1 咖啡机的例子 我们以煮咖啡为例子来做一个判断煮的咖啡是否符合自己预期的实验。假设煮咖啡的好坏有两个因素决定,温度和煮的时间,图中x表示煮的咖啡很好,o表示煮的咖啡不好,我们根据这个实验来建模,并将模型通过…

Web3 开发指南:使用 NFTScan NFT API 构建一个 NFT 链上追踪器

对于大多数 Web3 团队来说,构建一个完整的链上 NFT 数据追踪系统是一项具有挑战性的任务,构建一个 NFT 链上追踪器更是如此。涉及到处理区块链上的智能合约和交易数据,并将其与外部数据源进行整合和分析工作量是十分巨大的: 区块链…

[MySql]表的增删查改

目录 前言: 1.插入数据 2.查询数据 2.1全列查询 2.2指定查询 2.3别名 2.4去重 2.5排序 2.6条件查询 2.7聚合查询 2.7.1group by语句 2.7.2havin语句 2.8联合查询 2.8.1内连接 2.8.2外连接 2.8.3自连接 2.8.4子查询 3.修改 4.删除 前言: 本次大多数使用…

STL算法篇之拷贝修改类算法

STL算法篇之拷贝修改类算法 拷贝类算法copy与copy_backwardremove与remove_copyremove_if与remove_copy_if 修改类算法replace与replace_copyreplace_if与replace_copy_ifiter_swap与swap与swap_range、unique与unique_copy 拷贝类算法 1.copy 区间拷贝 2.copy_backward 逆向拷…

基于单片机的恒温恒湿温室大棚温湿度控制系统的设计与实现

功能介绍 以51单片机作为主控系统;液晶显示当前温湿度按键设置温湿度报警上限和下限;温度低于下限继电器闭合加热片进行加热;温度超过上限继电器闭合开启风扇进行降温湿度低于下限继电器闭合加湿器进行加湿湿度高于上限继电器闭合开启风扇进行…

6. Springboot快速回顾(集成Dubbo)

Dubbo是实现远程调用的一个框架,阿里巴巴开源的。远程调用就是B服务器可以调用A服务器的方法。大型项目会被拆分成多个模块,部署在不同的服务器上。若将公共模块集中部署在一台服务器上,可以方便其他服务器调用。因此,需要Dubbo。…

MATLAB 的函数计算与作图

基本初等函数的输入系统运算与操作函数的输入函数值的计算1. 数值计算方式2. 符号计算方式2.1 函数:sym2.2 函数:syms 函数的作图1. 一般函数 yf(x) 的作图(二维)作图基本形式作多重线作图的线型和颜色作图的网格和标记、图例、字…

如何在SQL Server中实现Ungroup操作

概要 我们经常在SQL Server中使用group by语句配合聚合函数,对已有的数据进行分组统计。本文主要介绍一种分组的逆向操作,通过一个递归公式,实现ungroup操作。 代码和实现 我们看一个例子,输入数据如下,我们有一张产…