目录
一、定时计数器
二、什么是寄存器
三、定时器如何定时10毫秒
四、定时器编程前寄存器配置计划
五、编程定时器控制LED每隔一秒亮灭
一、定时计数器
1、定时计数器的概念引入
定时器和计数器,电路一样
定时或者计数的本质就是让单片机某个部件数数
当定时器用的时候,靠内部震荡电路数数
当计算器用的时候,数外面的信号,读取针脚的数据
负跳变指:从高电平回到低电平
2、定时器怎么定时
定时器的本质原理:每经过一个机器周期,就加1
什么是晶振:
晶振(晶体震荡器)又称数字电路的心脏,是各种电子产品里面必不可少的频率元器件,数字电路的所有工作都离不开时钟,晶振的好坏,晶振电路设计的好坏,会影响到整个系统的稳定性
什么是时钟周期:
时钟周期也称为振荡周期,定义为时钟频率的倒数。时钟周期是计算机中最基本的、最小的时间单位,在一个时钟周期内,CPU仅完成一个最基本的动作,时钟周期是一个时间的量。更小的时钟周期就意味着更高的工作频率
什么是机器周期:
机器周期也称为CPU周期,在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段(如取指、译码、执行等),每一阶段完成一个基本操作,完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个时钟周期组成
一个机器周期 = N个时钟周期
一个时钟周期 = 晶振频率的倒数
3、定时器加一经过多久:≈ 1.085微妙
当晶振频率是11.0592MHz的时候,等于11059.2KHz = 11059200Hz
跳一次等于一个机器周期
一个机器周期 等于12个时钟周期
一个时钟周期 等于 晶振的倒数:1/11059200秒
那么跳一次就是:12/11059200秒 = 12 000 000 / 11059200微秒 ≈ 1.085微妙
二、什么是寄存器
#include "reg52.h"
sbit ledOne = P3^7; //就是在配置寄存器
sbit ledTwo = P3^6; //就是在配置寄存器
void main()
{
ledOne = 0; //往寄存器里写值0
ledTwo = 0;
}
如上图:P3就是一个寄存器,然后ledOne是往P3寄存器的地址里写一个值0
特殊功能寄存器:
特殊功能寄存器是用来对片内功能模块进行管理、控制、监视的控制寄存器和状态寄存器,是一个特殊功能的RAM区
定时器的寄存器是什么
TCON为定时器/计数器T0、T1的控制寄存器
TF0:定时器/计数器T0溢出中断标志
TR0:定时器T0的运行控制位
三、定时器如何定时10毫秒
定时器的TL0:指低八位
定时器的TH0:指高八位
给定时器一个初始值:
TL0 = 0x00;
TH0 = 0xDC;
TL0+TH0 = 16位,从0开始数,能数2的16次方= 65536下
数一下1.085微秒,数65536下就是71毫秒,
也就是说计时器,从0开始数,最多能数到71毫秒,就爆表了(TF0状态发生改变),不能再数了
那么要定义数10毫秒,定时器就得从61毫秒开始数,数到71毫秒
10毫秒= 10 000微秒
10 000微秒 / 1.085 =9216下,说明10毫秒,要数9216下
65536 - 9216 = 56320下
56320下,转换成十六进制的是:DC00
为什么转换成十六进制,因为计时器有两个寄存器,只有转换成十六进制,才能平均放到两个寄存器中
所以:
TL0 = 0x00 (低位),初始值是在这里加
TH0 = 0xDC(高位),数数是在这里数
最后结果是:从56320下开始数,数到65536下,就正好是10毫秒的时间
下面是用stc-isp-15xx-v6.87D软件计算定时10毫秒的方法
四、定时器编程前寄存器配置计划
1、怎么知道定时器爆表了
TCON寄存器的bit5能表示爆表:当爆表的时候,硬件会修改bit5(TF0)位上面的数据,会改成1(置1)会像CPU中请求中断,如果不用中断,我们需要手动代码清零
2、怎么开始计时
TCON寄存器的bit4,通过编程让TR0=1的时候,开始计时,相当于按下了闹钟
3、定时器使用时有很多种模式的
定时器模式寄存器:TMOD来选择定时器模式,选择工作方式1,TMOD的bit0 bit1配置成0 1 ,选择16位的定时器功能
TMOD定时器通过M1和M0的互相配合,来确定定时器的模式
TMOD.1/TMOD.0 M1、 M0 定时器/计数器0模式选择
0 0 13位定时器/计数器,兼容8048定时模式,TL0只用低5位参 与分频,TH0整个8位全用
0 1 16位定时器/计数器,TL0、TH0全用
1 0 8位自动重装载定时器,当溢出时将TH0存放的值自动重装入 TL0
1 1 定时器0此时作为双8位定时器/计数器。TL0作为一个8位定时 器/计数器,通过标准定时器0的控制位控制。TH0仅作为一个 8位定时器,由定时器1的控制位控制
五、编程定时器控制LED每隔一秒亮灭
#include "reg52.h"
sbit led = P3^6;
void main()
{
int cnt = 0;
led = 1;
//1、配置定时器0工作模式位16位计时
TMOD = 0x01;
//2、给定时器一个初值
TL0 = 0x00;
TH0 = 0xD0;
//3、定时器开始计时
TR0 = 1;
TF0 = 0;
//4、爆表了,操作led,累计到1s,再操作led
while(1){
if(TF0 == 1){ //这时定时器爆表了
TF0 = 0; //不用中断,软件清零
cnt ++; //统计爆表的次数
//给定时器重新定义初值
TL0 = 0x00;
TH0 = 0xD0;
if(cnt == 100){ //要爆表101次
led = !led; //每经过1s,翻转led的状态
cnt = 0; //当100次表示1s,重新让cnt从0开始,计算下一次的1s
}
}
}
}