STC89C52之定时器中断实验 ---- 自学笔记

2023-10-14 12:18

本文主要是介绍STC89C52之定时器中断实验 ---- 自学笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简述

STC89C5X含有3个定时器:定时器0,定时器1,定时器2.

51 系列单片机一定有基本的 2 个 定时器(定时器 0 和定时器 1),但不全有 3 个中断,通常 我们使用的都是基本的 2 个定时器:定时器 0/1。

二、定时器\计数器

2.1、CPU 时序的有关知识

①振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡 周期)【晶振振荡产生的脉冲,一个脉冲表示一个时钟周期 】。
②状态周期:一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。一个状态周期等于两个时钟周期【 2 个振荡周期为 1 个状态周期,用 S 表示。振荡周期又称 S 周 期或时钟周期。
③机器周期:1 个机器周期含 6 个状态周期,12 个振荡周期【也叫CPU周期,表示从内存读取一条指令字的最短时间,它是指令周期的最小单位。它等于单指令的周期长度 】。
④指令周期:完成 1 条指令所占用的全部时间,它以机器周期为单位【条指令包括1个或多个机器周期。所有的C语言代码最后都会编译成汇编代码来执行,而执行一条汇编指令需要的机器周期就叫做指令周期 】。
振荡周期 =1/2状态周期=1\12机器周期
例如:外接晶振为 12MHz 时,51 单片机相关周期的具体值为:
振荡周期=1/12us;
  • 1(微秒)us=0.000001s(秒)
  • 1秒专(s)=1000毫秒(ms)
  • 1秒(s)=1000000 微秒(μs)
状态周期=1/6us;
机器周期=1us;
指令周期=1~4us;

2.2,学习定时器前需要明白的几点

①51 单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之 为定时器/计数器。
②定时器/计数器和单片机的 CPU 是相互独立的。定时器/计数器工作的过程 是自动完成的, 不需要 CPU 的参与。
③51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信 号对寄存器中的数据加 1。
有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加 1 的 工作可以交给定时器/计数器处理。CPU 转而处理一些复杂的事情。同时可以 实 现精确定时 作用。

2.3、单片机定时器原理

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

2.4、51 单片机定时/计数器结构

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

2.4.1、工作方式寄存器

用于设置定时/计数器的工作方式,低四位用于 T0,高 四位用于 T1。

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

2.4.2、控制寄存器TCON

TCON 的低 4 位用于控制外部中断,TCON 的高 4 位用于控制定时/计数器的启动和中断申请。
格式:
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 类同。

2.5、定时器\计数器的工作方式

1、方式0

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

 

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

2、方式1

方式 1 的计数位数是 16 位,由 TL0 作为低 8 位,TH0 作为高 8 位,组成了 16 位加 1 计数器。

计数初值与计数个数的关系为:X=2(16)-N。

3、方式2

方式 2 为自动重装初值的 8 位计数方式。工作方式 2 特别适合于用作 较 精确的脉冲信号发生器

 

4、方式3

方式 3 只适用于定时/计数器 T0, 定时器 T1 处于方式 3 时相当于 TR1=0, 停止计数。工作方式 3 将 T0 分成为两个独立的 8 位计数器 TL0 和 TH0。
这几种工作方式中应用较多的是方式 1 和方式 2。定时器中通常使用定时器 方式 1,串口通信中通常使用方式 2。

三、定时器\计数器实现步骤

①对 TMOD 赋值,以确定 T0 和 T1 的工作方式,如果使用定时器 0 即对 T0 配 置,如果使用定时器 1 即对 T1 配置。
②根据所要定时的时间计算初值,并将其写入 TH0、TL0 或 TH1、TL1。
③如果使用中断,则对 EA 赋值,开放定时器中断。
④使 TR0 或 TR1 置位,启动定时/计数器定时或计数。
   机器周期=1/单片机的时钟频率。51 单片机内部时钟频率是外部 时钟的 12 分频,也就是说当外部晶振的频率输入到单片机里面的时候要进行 12 分频。比如说你用的是 12MHZ 晶振,那么单片机内部的时钟频率就是 12/12MHZ, 当你使用 12MHZ 的外部晶振的时候,机器周期=1/1M=1us。如果我们想定时 1ms 的初值是多少呢?1ms/1us=1000。也就是要计数 1000 个,初值=65535-1000+1 (因为实际上计数器计数到 66636(2 的 16 次方)才溢出,所以后面要加 1) =64536=FC18H,所以初值即为 THx=0XFC,TLx=0X18。
   知道了如何计算定时/计数器初值,那么想定时多长时间都可以计算出,当 然由于定时计数器位数有限,我们不可能直接通过初值定时很长时间,如果要实 现很长时间的定时,比如定时 1 秒钟。可以通过初值设置定时 1ms,每当定时 1ms 结束后又重新赋初值,并且设定一个全局变量累计定时 1ms 的次数,当累计到 1000 次,表示已经定时 1 秒了。需要其他定时时间类似操作,这样我们就可以 使用定时器来实现精确延时来替代之前的 delay 函数。 这里以定时器 0 为例介绍配置定时器工作方式 1、设定 1ms 初值,开启定时 器计数功能以及总中断.
void Timer0Init() 
{ 
TMOD|=0X01;        //选择为定时器 0 模式,工作方式 1,仅用 TR0 打开启动。TH0=0XFC;         //给定时器赋初值,定时 1ms 
TL0=0X18; ET0=1;   //打开定时器 0 中断允许 
EA=1;              //打开总中断 
TR0=1;             //打开定时器}

 

四、代码

要实现的功能是:通过定时器 0 中断控制 D1 指示灯间隔 1 秒闪烁。

/**************************************************************************************
实验现象:下载程序后,D1小灯循环点亮1秒,熄灭1秒。使用单片机内部定时器可以实现准确延时接线说明: (具体接线图可见开发攻略对应实验的“实验现象”章节)1,单片机-->LED&交通灯模块P20-->D1注意事项:																				***************************************************************************************/#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;sbit led=P2^0;	 //定义P20口是led// 定时器0初始化void Timer0Init()
{TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。TH0=0XFC;	//给定时器赋初值,定时1msTL0=0X18;	ET0=1;//打开定时器0中断允许EA=1;//打开总中断
/******************************************************************** 
** * TCON的中断请求标志											      
** *																  
** *       位:	   7      6      5      4      3      2     1      0  
** *																  
** * 字节地址:	  TF1     TR1    TF0   TR0    IE1    IT1   IE0    ITO  
** *     说明:														  
** *ITO(TCON.0):外部中断0触发控制位。								  
** *    当IT0=0时,为电平触发方式   低电平						      
** *    当IT0=1时,为边沿触发方式(下降沿有效)						  
** *IE0(TCON.1):外部中断0中断请求标志位。							  
** *IT1(TCON.2):外部中断1触发方式控制位。							  
** *IE1(TCON.3):外部中断1中断请求标志位。							  
** *TF0(TCON.5):定时/计数器T0溢出中断请求标志位。置1溢出			  
** *TF1(TCON.7):定时/计数器T1溢出中断请求标志位。					  
** *********************************************************************																  
** *																 
** ********************************************************************************
** * 控制寄存器(TCON)														  ** * TCON的低四位用于控制外部中断,											   
** * TCON的高四位用于控制定时器\计数器的启动和中断							       
** *  																		   位:  7    6    5     4     3   2    1   0						   字节地址: TF1  TR1  TF0   TR0											   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相同。							   ** ********************************************************************************/	TR0=1;//打开定时器			
}/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	Timer0Init();  //定时器0初始化while(1);		
}//函 数 名         : void Timer0() interrupt 1void Timer0() interrupt 1
{static u16 i;TH0=0XFC;	//给定时器赋初值,定时1msTL0=0X18;i++;if(i==1000){i=0;led=~led;	}	
}
																																			/**************************************************************************************
实验现象:下载程序后,静态数码管间隔一秒循环显示0-F接线说明: (具体接线图可见开发攻略对应实验的“实验现象”章节)1,单片机-->静态数码管模块J22-->J8	注意事项:																				***************************************************************************************/#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
u8 n=0;
/*******************************************************************************
* 函 数 名         : Timer1Init
* 函数功能		   : 定时器1初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer1Init()
{TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。TH1=0XFC;	//给定时器赋初值,定时1msTL1=0X18;	ET1=1;//打开定时器1中断允许EA=1;//打开总中断/******************************************************************** **
** * TCON的中断请求标志											      **
** *																  **
** *       位:	   7      6      5      4      3      2     1      0  **
** *																  **
** * 字节地址:	  TF1     TR1    TF0   TR0    IE1    IT1   IE0    ITO **  
** *     说明:														  **
** *ITO(TCON.0):外部中断0触发控制位。								  **
** *    当IT0=0时,为电平触发方式   低电平						      **
** *    当IT0=1时,为边沿触发方式(下降沿有效)						  **
** *IE0(TCON.1):外部中断0中断请求标志位。							  **
** *IT1(TCON.2):外部中断1触发方式控制位。							  **
** *IE1(TCON.3):外部中断1中断请求标志位。							  **
** *TF0(TCON.5):定时/计数器T0溢出中断请求标志位。置1溢出			  **
** *TF1(TCON.7):定时/计数器T1溢出中断请求标志位。					  **
** *********************************************************************																  
** *																  **
** ********************************************************************************
** * 控制寄存器(TCON)														   ********									 
** * TCON的低四位用于控制外部中断,											   ****
** * TCON的高四位用于控制定时器\计数器的启动和中断							   ****
** *  																		   ****位:  7    6    5     4     3   2    1   0						   ****字节地址: TF1  TR1  TF0   TR0											   ********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相同。							   ****************
** ********************************************************************************/	TR1=1;//打开定时器			
}/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	Timer1Init();  //定时器1初始化while(1);		
}/*******************************************************************************
* 函 数 名         : void Timer1() interrupt 3
* 函数功能		   : 定时器0中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer1() interrupt 3
{static u16 i;TH1=0XFC;	//给定时器赋初值,定时1msTL1=0X18;i++;if(i==1000){i=0;P0=smgduan[n++];if(n==16)n=0;	}	
}

 

这篇关于STC89C52之定时器中断实验 ---- 自学笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/210439

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个