×
单片机 > 单片机程序设计 > 详情

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

发布时间:2021-12-21 发布时间:
|

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

定时器用途:延时和脉宽测量

读取方式:软件读取和中断


公式:

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

}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会