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

前言

大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁
主要内容含:
【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)(代码演示&单片机现象对照LCD闪烁)(9)_第1张图片

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

  • YY的《C++》专栏
  • YY的《C++11》专栏
  • YY的《Linux》专栏
  • YY的《数据结构》专栏
  • YY的《C语言基础》专栏
  • YY的《初学者易错点》专栏
  • YY的《小小知识点》专栏
  • YY的《单片机期末速过》专栏
  • YY的《C++期末速过》专栏
  • YY的《单片机》专栏
  • YY的《STM32》专栏
  • YY的《数据库》专栏
  • YY的《数据库原理》专栏

目录

  • ※前言(必看!必看!必看!)
  • 一.前置知识
    • 1.学会查看手册,明确设置目标
    • 2.明白什么是可位寻址&不可位寻址
  • 二.查手册配置TMOD寄存器
    • 1.判断要配置的位
    • 2.配置【Gate,C/ T ‾ \overline{T} T ,M1,M0】
    • 3.优化配置【Gate,C/ T ‾ \overline{T} T ,M1,M0】的代码——与或赋值法
  • 三.查手册配置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.现象

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

  • 本文主要是带大家 手动对照手册来设置定时器
  • 本文中以配置 定时器0 为例子
  • 利用STC-ISP配置定时器传送门:传送门
  • 推荐阅读此篇博客前先看:初学者必读的一文【探究定时计数器与中断系统是如何配合起来的?】

一.前置知识

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

  • AT89C52的手册已经上传资料,需要自取
  • 打开PDF文件后可以看到手册全貌
  • 我们先明确 目标 :我们要设置定时/计数器为: 定时器0 【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)(代码演示&单片机现象对照LCD闪烁)(9)_第2张图片

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

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

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

二.查手册配置TMOD寄存器

1.判断要配置的位

  • 我们根据手册,找到配置TMOD的说明
  • 我们需要配置定时器0,和说明书对应查看相应位
  • 我们需要配置 Gate,C/ T ‾ \overline{T} T ,M1,M0 【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)(代码演示&单片机现象对照LCD闪烁)(9)_第5张图片

2.配置【Gate,C/ T ‾ \overline{T} T ,M1,M0】

  • 设置定时器0 (低4位)
  • 定时器1不管(全部置成0)
  • 选择定时器工作模式:定时器模式1 (M1设置0,M0设置1)
  • 选择定时/计数器为定时模式: C/ T ‾ \overline{T} T 为0
  • 门控端 GATE:选择0
  • 代码表现形式:
  • 注意:TMOD是 不可位寻址 ,不可以一位一位赋值
TMOD = 0x01;		//设置定时器模式    0000 0001

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

3.优化配置【Gate,C/ T ‾ \overline{T} T ,M1,M0】的代码——与或赋值法

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

优化方式:

TMOD &= 0xF0;		//设置定时器模式,把TMOD的低四位清零,高四位保持不变
//1010 0011 & 1111 0000 = 1010 0000

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

三.查手册配置TCON寄存器

1.判断要配置的位

  • 查看手册
  • 我们在上一步配置TMOD时,把 门控端GATE 置0 也就是无视了外部中断 I N T 0 ‾ \overline{INT0} INT0,只需要设置图中 TF0和TR0
  • 此过程中 不需要配置 IT0
  • 此过程中不需要配置IE和IP (在main程序中根据需要启动) 【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)(代码演示&单片机现象对照LCD闪烁)(9)_第8张图片
    【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)(代码演示&单片机现象对照LCD闪烁)(9)_第9张图片

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

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

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

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

※注意事项

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

1.判断要配置的位

  • 根据下图,我们知道我们要 对TL0,TH0赋初值
  • TF在第三步配置TCON时已经赋0
  • TL0(LOW)低八位
  • TH0(HIGH)高八位 【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)(代码演示&单片机现象对照LCD闪烁)(9)_第11张图片

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 n2 n 2 n^2 n2能够平分前面几位和后面几位
  • 1234->1234/100=12
  • 1234->1234%100=34
  • 综上所述:
  • 一个2进制16位数,/ 1 6 2 16^2 162得到前八位,% 1 6 2 16^2 162得到后八位
  • 故最终代码为:
TH0 = 63536/256;		//高八位
TL0 = 63536256;		//低八位

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已经自动配置(重点)

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

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

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

  • 如下图所示,一个完整的【定时器满->溢出标志位置1->中断系统】的过程
  • 我们在TCON的设置中已经设置了TF0
  • 还需要设置的有: ET0; 使能EA ; 优先级PT0
    【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)(代码演示&单片机现象对照LCD闪烁)(9)_第13张图片

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

ET0=1;
EA=1;
PT0=0;

六.设置中断函数

  • 引入:在定时器工作完跳转到中断程序时,怎么识别我们的中断程序在哪里呢?
    【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)(代码演示&单片机现象对照LCD闪烁)(9)_第14张图片

1.中断号

  • 在函数后加上关键字如图所示,即可标记
    【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)(代码演示&单片机现象对照LCD闪烁)(9)_第15张图片

2.中断函数设置演示

  • 注意看void Timer0_Routine() interrupt 1
#include 

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代码

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.主函数代码

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

3.中断函数代码

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一闪一灭
    【51单片机】从零开始手把手带你【查手册】配置定时器,并完成小项目(定时器&中断的应用)(代码演示&单片机现象对照LCD闪烁)(9)_第16张图片

你可能感兴趣的:(YY滴《单片机系列》,单片机,51单片机,mongodb)