51单片机定时器学习

51单片机定时器

  • 前言:作者的话
    • 什么是定时器
    • 单片机的周期
    • 定时器的初始化
    • 定时器里面的寄存器
    • 程序讲解

前言:作者的话

这是我第一次在CSDN上做文章,我可能写的不是很好,但是我会加油的。

什么是定时器

定时器Timer人类最早使用的定时工具是沙漏或水漏,但在钟表诞生发展成熟之后,人们开始尝试使用这种全新的计时工具来改进定时器,达到准确控制时间的目的。
定时器确实是一项了不起的发明,使相当多需要人控制时间的工作变得简单了许多。人们甚至将定时器用在了军事方面,制成了定时炸弹,定时雷管。不少家用电器都安装了定时器来控制开关或工作时间。

51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。
定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。
51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。
有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。
CPU转而处理一些复杂的事情。同时可以实现精确定时作用。

单片机的周期

振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)
状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。
机器周期:1个机器周期含6个状态周期,12个振荡周期。
指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。

例如:51单片机 内部时钟频率是外部时钟的12分频。也就是说当外部晶振的频率输入到单片机里面的时候要进行12分频外接晶振为12MHz时,那么单片机内部的时钟频率就是12/12MHZ。

51单片机(12Mhz 晶振)相关周期的具体值为:
振荡周期=1/12us;
状态周期=1/6us;
机器周期=1/1M=1us;
指令周期=1~4us;

定时器的初始化

下面我们在STC-ISP中的几个定时器的初始化程序:
11.0692Mhz晶振:100微秒

void Timer0Init(void) //100微秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xA4; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}

11.0692Mhz晶振:10毫秒

void Timer0Init(void) //10毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}

定时器里面的寄存器

1.**辅助寄存器AUXR **
51单片机定时器学习_第1张图片
如果我们平时使用的话,一般仅使用AUXR的B6和B7的两个定时器的预分频数

我们使用定时器0的12分频时:
AUXR &= 7F;// 0111 1111

这里引入与或非的讲解:
P1 &= 0X40; 相当于P1 = P1 & 0x40;
当P1 = 0x20时,P1 = 0x20 & 0x40;
0x20 = 0b 00100000
0x40 = 0b 01000000
&是按位与,就是相同bit位相乘,结果就是:
0x00 = 0b 00000000
P1 = 0b00100000 & 0b01000000;
P1 = 0b00000000 = 0x00;
那么当P1 = 0x40时,P1 &= 0X40;的结果是0x40
而P1|=0x40,就是将P1的第7 位置1,而其它位保持不变

2.定时器/计数器工作模式寄存器TMOD
51单片机定时器学习_第2张图片
51单片机定时器学习_第3张图片
3.控制寄存器TCON
51单片机定时器学习_第4张图片
TF1:定时器1溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除。或用软件清除。
TF0:定时器0溢出标志。定时/计数器溢出时由硬件置位。中断处理时由硬件清除,或用软件清除

程序讲解

#include //使用11.0592Mhz晶振
int i = 0;
void Timer0Init(void) ;//初始化定时器
void main()
{
Timer0Init();
while(1)
{
if(TF0 == 1) //检测定时器0是否溢出,每到65535次
{
TF0 = 0;//TF清零
i++;//单片机记满65535时会花费约71ms
if(i == 14) //71ms乘以14为1s
{
i = 0;
P0 = ~P0;//翻转P0
}
}
}
}
void Timer0Init(void) //初始化定时器
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x00; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}

你可能感兴趣的:(单片机)