51单片机定时/计数器的功能实现

8051单片机内部有两个16位的定时/计数器:T0和T1

51单片机定时/计数器的功能实现_第1张图片

定时器用途:延时和脉宽测量
读取方式:软件读取和中断

公式:
T(初值)=2^N-定时时间/机器周期时间
机器周期时间=12/fosc
N:代表几位定时器,有13 16 8位定时器
定时时间:希望设定时间,例如希望设定时间是65.535,初值就是0
fosc:晶振频率,一般用的多的晶振频率是12

四种工作方式,在TMOD中设置:
M1 M0=0X00,方式0,13位计数器
M1 M0=0X01,方式1,16位计数器,用的最多
M1 M0=0X10,方式2,8位计数器
M1 M0=0X11,方式3,8位计数器

例如:
如果我们希望定时0.2ms,定时单位用的us
65536-200/1=65336=FF38H;
初值放在TH0 TL0中,分别是高八位和低八位
TH0=0XFF;TL0=0X38;

当我们写程序的时候也可以不用计算,直接使用公式代入,例如:
TH0= -设置的定时时间/256;
TL0= -设置的定时时间%256;

定时器的实现过程:
1.给定时器设置初值(TH0 TL0的初始化)
2.打开定时器中断:ET0 =1 或 ET1=1;
3.启动定时器:TR0 =1 或 TR1=1;
4.打开全局中断:EA=1;
5.配置定时器工作方式:TMOD=0x01;
如果定时器到了TF0=1 或 TF1=1;

一旦定时器到了就会触发中断,进入中断函数中执行函数中语句。
注:一旦进入中断,定时器的初值又会从0开始,所以在中断函数中必须重新将TH0和TL0赋初值。
简单的定时器中断的实现:
#include 

sbit LED= P0^0;
void main()
{
	P0 = 0xff;

	EA = 1;//允许所有中断
	ET0 = 1;//定时器中断0
	TMOD |= 0x01;
//设置初值
	TH0 = 0x3c;//设置了初值就会不断的加1,加到溢出
	TL0 = 0xb0;
//	TH0 = 65536-50000/256;
//	TL0 = 65536-50000%256
	TR0 = 1;//定时器0开始工作
	while(1);//不让程序结束出去,一旦发生中断就会跳到中断

}

void intersrv1(void) interrupt 1 //定时器中断,遇到定时器溢出//了就会触发中断
{
	TH0 = 0x3c;//又要重新赋初值
	TL0 = 0xb0;
	LED = !LED;//和原来的状态相反,定时精确到0.001ms
}



你可能感兴趣的:(Linux)