首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)(代码演示&单片机现象对照LCD闪烁)(9)

【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)(代码演示&单片机现象对照LCD闪烁)(9)

作者头像
YY的秘密代码小屋
发布2024-02-17 10:20:53
发布2024-02-17 10:20:53
2.4K0
举报
文章被收录于专栏:C++系列C++系列

前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含:

※前言(必看!必看!必看!)

一.前置知识

1.学会查看手册,明确设置目标

  • AT89C52的手册已经上传资料,需要自取
  • 打开PDF文件后可以看到手册全貌
  • 我们先明确 目标 :我们要设置定时/计数器为: 定时器0

2.明白什么是可位寻址&不可位寻址

  • 可位寻址:可以对每一位单独赋值
  • 不可位寻址:不可以对每一位单独赋值

举例子:

二.查手册配置TMOD寄存器

1.判断要配置的位

  • 我们根据手册,找到配置TMOD的说明
  • 我们需要配置定时器0,和说明书对应查看相应位
  • 我们需要配置 Gate,C/
\overline{T}

,M1,M0

2.配置【Gate,C/

\overline{T}

,M1,M0】

  • 设置定时器0 (低4位)
  • 定时器1不管(全部置成0)
  • 选择定时器工作模式:定时器模式1 (M1设置0,M0设置1)
  • 选择定时/计数器为定时模式: C/
\overline{T}

为0

  • 门控端 GATE:选择0
  • 代码表现形式:
  • 注意:TMOD是 不可位寻址 ,不可以一位一位赋值
代码语言:javascript
复制
TMOD = 0x01;		//设置定时器模式    0000 0001

3.优化配置【Gate,C/

\overline{T}

,M1,M0】的代码——与或赋值法

  • TMOD = 0x01; //设置定时器模式 0000 0001固然能够改变位,但是当我们遇到同时需要定时器1定时器0的场景时, 改动TMOD的同时也会改动其他定时器
  • 例:原来是0001 0000改成0000 0001后,覆盖了前面;

优化方式:

代码语言:javascript
复制
TMOD &= 0xF0;		//设置定时器模式,把TMOD的低四位清零,高四位保持不变
//1010 0011 & 1111 0000 = 1010 0000

TMOD |= 0x01;		//设置定时器模式,把TMOD的最低位置1,高四位保持不变
//1010 0000 | 00000 0001 = 1010 0001

三.查手册配置TCON寄存器

1.判断要配置的位

  • 查看手册
  • 我们在上一步配置TMOD时,把 门控端GATE 置0 也就是无视了外部中断
\overline{INT0}

,只需要设置图中 TF0和TR0

  • 此过程中 不需要配置 IT0
  • 即 此过程中不需要配置IE和IP (在main程序中根据需要启动)

2.配置【溢出位TF0】和【运行控制位TR0】

  • 配置溢出位 TF0
  • 配置控制定时器0的运行控制位 TR0
  • 代码表现形式:
代码语言:javascript
复制
TF0 = 0;		//清除TF0标志
TR0 = 1;		//定时器0开始计时

四.对照流程图(模式1)配置计数电路中【定时初值】

※注意事项

  • 在实际应用中,我们往往可以通过 STC-ISP工具来设置定时器的定时初值 ,来 控制LCD闪烁的快慢;

1.判断要配置的位

  • 根据下图,我们知道我们要 对TL0,TH0赋初值
  • TF在第三步配置TCON时已经赋0
  • TL0(LOW)低八位
  • TH0(HIGH)高八位

2.手搓配置【低8位TL0(low)】和【高8位TH0(high)】

  • 我们知道TL0 和TH0是一个16位寄存器,他会不断+1, 间隔是1微秒
  • 总共定时时间 65535微秒 1111 1111 1111 1111
  • 我们要求计时为1ms,64535离计数器溢出(65535)差1000,也就是当我们设初值为65535+1时,每过1ms,计数器就会溢出
  • 同时我们知道一个规律: 一个n进制m位数,/
n^2

n^2

能够平分前面几位和后面几位

  • 1234->1234/100=12
  • 1234->1234%100=34
  • 综上所述:
  • 一个2进制16位数,/
16^2

得到前八位,%

16^2

得到后八位

  • 故最终代码为:
代码语言:javascript
复制
TH0 = 63536/256;		//高八位
TL0 = 63536%256;		//低八位

3.利用STC-ISP软件工具配置【低8位TL0(low)】和【高8位TH0(high)】

1.找到STC-ISP软件工具【定时器计算器】位置
  • 打开STC-SIP,找到定时器计算器
2.cv前的工具配置(重点)
  • 系统频率设置成:12MHZ
  • 选择定时器:这里我们选择定时器0
  • 设置定时长度:1ms
  • 定时器模式:16位(AT89C52没有16位自动重载)
  • 定时器时钟:12T
3.发现TH0和TL0已经自动配置(重点)
  • 如图所示

五.对照流程图(模式1)设置【中断】

1.回顾【定时器和中断配合流程图】判断要配置的位

  • 如下图所示,一个完整的【定时器满->溢出标志位置1->中断系统】的过程
  • 我们在TCON的设置中已经设置了TF0
  • 还需要设置的有: ET0; 使能EA ; 优先级PT0

3.配置【中断允许控制寄存器IE【ET0】和【使能EA】】和【中断优先控制寄存器IP【PT0】】

代码语言:javascript
复制
ET0=1;
EA=1;
PT0=0;

六.设置中断函数

  • 引入:在定时器工作完跳转到中断程序时,怎么识别我们的中断程序在哪里呢?

1.中断号

  • 在函数后加上关键字如图所示,即可标记

2.中断函数设置演示

  • 注意看void Timer0_Routine() interrupt 1
代码语言:javascript
复制
#include <REGX52.H>

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

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;		//设置定时初值      //要赋初值,保证下一次计数也是1ms     
	TH0 = 0xFC;		//设置定时初值
	
	T0Count++;		//T0Count计次,对中断频率进行分频
	if(T0Count>=1000)
	{
		T0Count=0;
        P2_0=~P2_0;
	}
}

七.结合流程,实现LCD在中断过程中不断闪烁(代码演示)

1.配置定时器0代码

代码语言:javascript
复制
void Timer0Init(void)
{
	TMOD = 0x01;		//设置定时器模式
	
	TL0 = 0x18;		//设置定时初值  64536/256
	TH0 = 0xFC;		//设置定时初值  64536%256
	
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	ET0=1;
	EA=1;
	PT0=0;
}

2.主函数代码

代码语言:javascript
复制
void main()
{
	Timer0Init();
	while(1)
	{
	}
}

3.中断函数代码

代码语言:javascript
复制
void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	
	T0Count++;		//T0Count计次,对中断频率进行分频
	if(T0Count>=500)//分频500次,500ms
	{
		T0Count=0;
        P2_0=~P2_0;
	}
}

4.现象

  • 小灯点亮,每隔1s一闪一灭
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-16,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • ※前言(必看!必看!必看!)
  • 一.前置知识
    • 1.学会查看手册,明确设置目标
    • 2.明白什么是可位寻址&不可位寻址
  • 二.查手册配置TMOD寄存器
    • 1.判断要配置的位
    • 2.配置【Gate,C/
    • 3.优化配置【Gate,C/
  • 三.查手册配置TCON寄存器
    • 1.判断要配置的位
    • 2.配置【溢出位TF0】和【运行控制位TR0】
  • 四.对照流程图(模式1)配置计数电路中【定时初值】
    • ※注意事项
    • 1.判断要配置的位
    • 2.手搓配置【低8位TL0(low)】和【高8位TH0(high)】
    • 3.利用STC-ISP软件工具配置【低8位TL0(low)】和【高8位TH0(high)】
      • 1.找到STC-ISP软件工具【定时器计算器】位置
      • 2.cv前的工具配置(重点)
      • 3.发现TH0和TL0已经自动配置(重点)
  • 五.对照流程图(模式1)设置【中断】
    • 1.回顾【定时器和中断配合流程图】判断要配置的位
    • 3.配置【中断允许控制寄存器IE【ET0】和【使能EA】】和【中断优先控制寄存器IP【PT0】】
  • 六.设置中断函数
    • 1.中断号
    • 2.中断函数设置演示
  • 七.结合流程,实现LCD在中断过程中不断闪烁(代码演示)
    • 1.配置定时器0代码
    • 2.主函数代码
    • 3.中断函数代码
    • 4.现象
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档