51单片机之定时器篇

首先,学好单片机必须要搞懂定时器,定时器是单片机重要的组成部分之一,总之,学不好定时器,单片机相当于没学,下面就让我介绍如何学好单片机定时器。

学习单片机首先要明白的:

1,51单片机有两组定时器/计数器,既可以定时,又可以计数,总称之定时器

2,单片机内的定时器和CPU是相互独立的,互不影响。

3,有了定时器可以增加单片机的效率。

4,51单片机中的定时器是根据机器内部的时钟或者是外部的脉冲信号实现对寄存器的自加一。

定时器的工作原理:

1,CPU时序问题

振荡周期:为单片机提高定时信号的振荡源周期。

状态周期:2个振荡周期为一个状态周期。

机器周期:一个机器周期包含六个状态周期,十二个振荡周期。

指令周期:完成一条指令所占用的全部时间。

2,定时器内部结构

51单片机之定时器篇_第1张图片

 定时/计数器的实质是加一计数器(16位),由高8位和低八位两个寄存器TH和TL组成,TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TMON是控制寄存器,控制T0,T1的启动和停止及设置溢出标志位。

3,定时器的控制

1,工作方式寄存器TMOD

    工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1,格式如下:

工作方式寄存器TMOD
7 6 5 4 3 2 1 0
字节地址:89H GATE C/T M1 M0 GATE C/T M1 M0 TMOD

GATE:门控位,GATE=0时,用于控制定时器的启动是否受外部中断源信号的影响,只要用软件使TCON中的TR0或者TR1为1,就可以启动定时器;而当GATE=1时,要用软件使TCON中的TR0或者TR1为1,同时外部中断INT0/1也为高电平,才能启动定时器。

C/T:定时/计数模式选择位。C/T=0时,为定时模式;C/T=1时,为计数模式;

M1M0:为工作方式设置位。

工作方式设置表
M1M0 工作方式 说明
00 方式0 13位定时/计数器
01 方式1 16位定时/计数器
10 方式2 8位自动重装定时/计数器
11 方式3 T0分为两个独立的8位定时/计数器

2,工作方式寄存器TCON

     TCON的低四位用于外部中断,暂时不用了解,高四位用于定时/计数器的启动和和中断申请

4

工作方式寄存器TCON
7 6 5 4 3 2 1 0
字节地址:88H TF1 TR1 TF0 TR0 TCON

TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1=1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。
TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。
TR0(TCON.4):T0运行控制位,其功能与TR1类同。

定时器/计数器的工作方式:

方式1:

51单片机之定时器篇_第2张图片

计数个数与计数初值的关系为:X=2^16-N 

方式2:

51单片机之定时器篇_第3张图片

计数个数与计数初值的关系为:X=2^8-N 

方式三:

51单片机之定时器篇_第4张图片

T0分为两个独立的8位计数器TL0和TH0

始化程序应完成如下工作:
1,对TMOD赋值,以确定T0和T1的工作方式。


2,计算初值,并将其写入TH0、TL0或TH1、TL1。


3,中断方式时,则对EA赋值,开放定时器中断。


4,使TR0或TR1置位,启动定时/计数器定时或计数。

定时0实现LED一秒亮灭闪烁程序:

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit led=P1^1;
void timer0Init();
void timer0() interrupt 1        
{ 
	static u16 count;
    TH0=0xfc;
	TL0=0x18;
	//count++;
	if(count-- ==0)     //LED一秒闪烁亮灭
		{
		count=1000;
		led=~led;
		}
	

}
int main()
{
 timer0Init();
  while(1);
}

void timer0Init()      //定时器的初始化
{
    TMOD=TMOD|0X01;      //对TMOD赋值
	TH0=0xfc;          //高位赋值
	TL0=0x18;          //低位赋值
	ET0=1;            //定时器中断允许位
	EA=1;             //总中断开关
	TR0=1;            //开始计数控制位
}

如果不懂,可以随时解答,谢谢支持!

你可能感兴趣的:(51单片机,stm32,c语言,嵌入式硬件,蓝桥杯)