本文主要是介绍STC89C52之定时器中断实验 ---- 自学笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、简述
STC89C5X含有3个定时器:定时器0,定时器1,定时器2.
二、定时器\计数器
2.1、CPU 时序的有关知识
- 1(微秒)us=0.000001s(秒)
- 1秒专(s)=1000毫秒(ms)
- 1秒(s)=1000000 微秒(μs)
2.2,学习定时器前需要明白的几点
2.3、单片机定时器原理
2.4、51 单片机定时/计数器结构
- 51 单片机定时/ 计数器的工作由两个特殊功能寄存器控制
- TMOD 是定时/计数器的工作方式寄存器,确定工作方式和功能
- TCON 是控制寄存器,控制 T0、 T1 的启动和停止及设置溢出标志
- T0 和 T1 引脚对应的是单片机 P3.4 和 P3.5 管脚
2.4.1、工作方式寄存器
用于设置定时/计数器的工作方式,低四位用于 T0,高 四位用于 T1。
GATE 是门控位

2.4.2、控制寄存器TCON

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

2、方式1

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

4、方式3

三、定时器\计数器实现步骤
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之定时器中断实验 ---- 自学笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!