51单片机---定时器/计数器的配置

1.CPU时序

振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)。比如开发板的时钟电路上的12MHZ晶振,它就提供了单片机的振荡周期。周期T=1/12M,单位为秒。
状态周期:
两个振荡周期为1个状态周期,用S表示。振荡周期又称为S周期或时钟周期。
机器周期:6个状态周期,即12个振荡周期。以12MHZ晶振为例,机器周期=12*(1/12M)=1/M=1us.
指令周期:完成一条指令所占用的全部时间,以机器周期为单位。以12MHZ为例,指令周期为1~4us.

2.定时器绪论
51单片机有2组定时器/计数器,既可以定时又可以计数。
定时器/计数器和单片机的CPU是相互独立的,定时器/计数器工作时不需要CPU参与。
51单片机的定时器/计数器是根据机器内部的时钟或外部脉冲信号,对寄存器中的数据加1.
意义:减轻CPU的负担(提高单片机效率),也实现精确定时

3.定时器/计数器的工作原理
实际上是一个加1计数器,
随着计数器的输入脉冲自加1,每来一个脉冲数,计数器就自动加1,加到计数器为全1的时候,在输入一个脉冲就会使计数器归0,这个计数器的溢出会使相应的中断标志位置1,向CPU发出中断请求(前提是设置了定时/计数器的中断允许位。
计数器的溢出值-计数器初值=计数值

4.定时器的硬件结构
51单片机---定时器/计数器的配置_第1张图片定时/计数器的实质是加1计数器(16位:2字节)
由高8位THx和低8位TLx两个寄存器组成
51有2个定时/计数器
所以,
定时器0对应TH0和TL0
定时器1对应TH1和TL1
通过配置TMOD来配置定时/计数器的工作方式–定时还是计数
通过配置TCON控制寄存器,控制T0和T1的启动、停止、溢出标志

5.累加 的过程
比如,对于计数器0,先累加低8位TL0,加到0xFF后,
开始累加TH0
当TH0也累加满了,
则溢出,
TF0则会置1
.。。。。。。。。

6.TMOD是一个8位的寄存器(1个字节)
用于设置工作方式
低4位用于控制T0
高4位用于T1
51单片机---定时器/计数器的配置_第2张图片第7位:GATE门控位
GATE=0,软件使TR0或TR1为1,就可以启动定时/计数器
GATE=1,TR0或TR1为1,外部中断引脚INT0/1也为高电平,可启动定时/计数

第6位:C/T,
为0,定时模式
为1,计数模式

M1和M0
控制定时/计数器的4种工作方式
00 方式0 13位定时/计数器–-对T0而言,只是用了TL0的低5位和TH0的8位,TL0低5位溢出时,向TH0进位,TH0溢出时,将TCON中的TF0置1,向CPU发出中断申请初值=2的13次幂-计数个数
01 方式1 16位定时/计数器—初值=2的16次幂-计数个数
10 方式2 8位自动重装定时/计数器—计算频率,串口通信–只要低8位装载满,就自动清0,重新计数,初值=2的8次幂-计数个数,用作精确的计算
11 方式3 T0分成2个独立的8位定时/计数器;T1停止计数—
方式0和方式3很少使用

7.TCON
通过配置TCON控制寄存器,控制T0和T1的启动、停止、溢出标志
51单片机---定时器/计数器的配置_第3张图片高4位控制定时器/计数器的启动和中断申请
TF1:T1溢出中断请求标志位,计数器1:T1溢出,硬件自动将TF1置1,CPU响应中断后,TF1由硬件清0.
所以TF1可以作为标志位,查看查看有没有溢出
而且TF1也可以用软件置1/0

TR1是T1的运行控制位
TR1置1,则T1工作
置0,T1停止工作
TR1由软件置1或置0
所以用软件可控制T1的运行或停止

TF0是T0溢出中断请求标志位
TR0是T0运行控制位

8.如何使用定时器
(1)对TMOD赋值,确定T0 T1工作方式:定时器模式/计数模式
(2)计算初值,将其写进THx和TLx
(3)对EA赋值,开放定时器中断
(4)使TR1或TR0置位,启动定时器(一般这样配置GATE=0,软件使TR0或TR1为1)

51单片机---定时器/计数器的配置_第4张图片如图
打开定时器0,配置TMOD低4位
D3:GATE
D2:C/T
D1:M1
D0:M0

GATE=0
则TR0=1
配置为定时模式,则C/T=0
选择M1M0=01的16位定时器模式
即TMOD=0x01
再设置初值,溢出后硬件会配置TF0
还要记得配置中断
EA=1
ET0=1

TMOD|=0X01;//使用TMOD的低4位:定时器0模式; C/T=0定时模式  GATE=0软件使TR0为1就行了  M0M1=01:工作方式1,初值计算为2的16次幂减计数个数,仅用TR0打开启动。
TH0=0XFC;//装载初值
TL0=0X18;														 
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器

定时器控制led的代码


```c
#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
sbit led=P2^0;	 //定义P20口是led

void Timer0Init()
{
	TMOD|=0X01;//使用TMOD的低4位:定时器0模式; C/T=0定时模式  GATE=0软件使TR0为1就行了  M0M1=01:工作方式1,初值计算为2的16次幂减计数个数,仅用TR0打开启动。

	TH0=0XFC;	//给定时器赋初值,定时1ms	 65536-1000=64536,即FC18H,TH0=0XFC,
	TL0=0X18;														 //TL0=0X18
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器			
}


void main()
{	
	Timer0Init();  //定时器0初始化
	while(1);		
}


void Timer0() interrupt 1
{
	static u16 i;
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;
	i++;
	if(i==1000)//小灯间隔1s闪烁,1s=1000ms,即定时器的寄存器溢出1000次
	{
		i=0;
		led=~led;	
	}	
}

这里在中断服务函数中重新装载初值,是因为方式一只计数、定时
不会向方式2那样自动重装
不要忘了打开定时器的中断允许位ET0或ET1,以及总中断

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