前言
大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁
主要内容含:
欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!
目录
※前言(必看!必看!必看!)
- 本文主要是带大家 手动对照手册来设置定时器
- 本文中以配置 定时器0 为例子
- 利用STC-ISP配置定时器传送门:传送门
- 推荐阅读此篇博客前先看:初学者必读的一文【探究定时计数器与中断系统是如何配合起来的?】
一.前置知识
1.学会查看手册,明确设置目标
- AT89C52的手册已经上传资料,需要自取
- 打开PDF文件后可以看到手册全貌
- 我们先明确 目标 :我们要设置定时/计数器为: 定时器0
2.明白什么是可位寻址&不可位寻址
- 可位寻址:可以对每一位单独赋值
- 不可位寻址:不可以对每一位单独赋值
举例子:
3.注意点:中断函数一般放在主函数所在文件中
- 中断函数会用到许多主函数中的变量,不好模块化,我们一般把他放在主函数的所在文件中
加粗样式
二.查手册配置TMOD寄存器
1.判断要配置的位
- 我们根据手册,找到配置TMOD的说明
- 我们需要配置定时器0,和说明书对应查看相应位
- 我们需要配置 Gate,C/ T ‾ \overline{T} T ,M1,M0
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
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程序中根据需要启动)
2.配置【溢出位TF0】和【运行控制位TR0】
- 配置溢出位 TF0
- 配置控制定时器0的运行控制位 TR0
- 代码表现形式:
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 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 = 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】】
ET0=1;
EA=1;
PT0=0;
六.设置中断函数
- 引入:在定时器工作完跳转到中断程序时,怎么识别我们的中断程序在哪里呢?
1.中断号
- 在函数后加上关键字如图所示,即可标记
2.中断函数设置演示
- 注意看
void Timer0_Routine() interrupt 1
#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代码
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一闪一灭