【C51自学笔记】定时器

CPU时序:

v振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)

v状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。

v机器周期:1个机器周期含6个状态周期,12个振荡周期。

v指令周期:完成1条指令所占用的全部时间,以机器周期为单位。

例如:外接晶振为12MHz时,89S52单片机的4个时间周期的具体值为:​​​​​​

v振荡周期=1/12us;

v状态周期=1/6us;

v机器周期=1us;

v指令周期=1~4us;

注意:

v定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。

v51单片机有两组定时器/计数器,因为既可以定时又可以计数,故称之为定时器/计数器。

结构:

由高8位和低8位两个寄存器THx和TLx组成

TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能

TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志

控制:

TMOD用于设置其工作方式

TCON用于控制其启动和中断申请。

GATE是门控位:用于控制定时器的启动是否受外部中断源信号的影响。

  • GATE=0时:不受外部影响;(启动:TCON中的TR0或TR1为1)
  • GATA=1时:受外部影响;(启动:TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时)​​​​​​​​​​​​​​​​

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

M1M0:工作方式设置位。定时/计数器有四种工作方式。(主要用01)

vTF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。

vTR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。//人工主要操作TR

vTF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。

vTR0(TCON.4):T0运行控制位,其功能与TR1类同。

定时器初值计算公式:

定时器模式时有:N=t/ Tcy

计数初值计算的公式为:X=2^(定时器位数)-N。

定时器的初值还可以采用计数个数直接取补法获得。

计数模式时,计数脉冲是T0引脚上的外部脉冲。

如何使用计时器

v对TMOD赋值,以确定T0和T1的工作方式。

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

v对EA赋值,开放定时器中断。

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

#include<reg52.h>
#define uchar unsigned char 
#define uint unsigned int 

unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

uchar num,kk;


void main()
{
	TMOD=0x01;					//设置定时器0为工作方式1
	TH0=(65536-50000)/256; 		//设置初值
	TL0=(65536-50000)%256;
	EA=1;      					//打开总中断开关
	ET0=1;     					//打开定时器中断
	TR0=1;     					//启动定时器
	while(1)
	{
		if(kk==20)//定时器运行20次之后数码管显示
		{
			kk=0;	
			P1=smg_du[num];
			num++;
			if(num==10)//循环数码管
				num=0;
		}
	}

}

void timer0 () interrupt 1
{
	//进入到函数之后,只有方式二可以自动装载
	
	//手动装载初始值
	TH0=(65536-50000)/256; 
	TL0=(65536-50000)%256;
	
	kk++;//进来一次kk加一 一次

}

猜你喜欢

转载自blog.csdn.net/f_zmmfs/article/details/81155415