51单片机的定时器深入讲解

单片机的定时器是作为片外资源,开启定时器需要设置相关的寄存器,当然,这些寄存器是可以位寻址的,怎么位寻址?在头文件中reg52.h中已经预定义好了。不用担心,你只需要学会设置就好了:

TMOD=0X01;    //定时器0工作在方式1(16位计数器)

TH0=0xfe;

TL0=0x33;

EA=1;

ET0=1;

TR0=1;

以上6条语句,已经将定时器设置好了,现在协议个led的项目来时间一下:

#include

#define uint unsigned int
#define uchar unsigned char
uint count=0; 

  //5000微秒的次数,用于在中断中加1,count有多少,定时count*5ms
sbit led=P1^0;

int main()

{
TMOD=0X01;    //定时器0工作在方式1(16位计数器)
TH0=0xfe;    //赋初值
//TH0=(65536-5000)/256;   //假设赋初值为60536,从60536开始,每隔1微秒,计数器加1,(高8位),计满为              5000微秒(5ms),之后产生中断
TL0=0x33;
////TH0=(65536-5000)%6;   //赋初值为60536,从60536开始,每隔1微秒,计数器加1,(低8位)
EA=1;     //开总中断
ET0=1;    //开T0中断
TR0=1;    //启动T0开始计数

while(1)//大循环,循环执行里面的程序
{
if(count==20)//判断:如果定时20*0.5=10ms,10ms亮灭一次led
{
count=0;  //重新赋成0
led=~led; //led状态取反一次
}
}

void timer0() interrupt 1  //中断函数
{
TH0=0xfe;    //,重新赋值
//TH0=(65536-5000)/256;   //赋初值为60536,从60536开始,每隔1微秒,计数器加1,(高8位)
TL0=0x33;
////TH0=(65536-5000)%6;   //赋初值为60536,从60536开始,每隔1微秒,计数器加1,(低8位)
count++;//0.5ms的次数加1

}

注意:这里使用到了中断,有时无需使用到中断:

#include

#define uint unsigned int
#define uchar unsigned char
uint count=0;     //5000微秒的次数,用于在中断中加1,count有多少,定时count*5ms
sbit led=P1^0;

int main()

{
TMOD=0X01;    //定时器0工作在方式1(16位计数器)
TH0=0xfe;    //赋初值
//TH0=(65536-5000)/256;   //假设赋初值为60536,从60536开始,每隔1微秒,计数器加1,(高8位),计满为              5000微秒(5ms),之后产生中断
TL0=0x33;
////TH0=(65536-5000)%6;   //赋初值为60536,从60536开始,每隔1微秒,计数器加1,(低8位)
EA=1;     //开总中断
ET0=1;    //开T0中断
TR0=1;    //启动T0开始计数

while(1)//大循环,循环执行里面的程序

{

          if(TF0==1)//每次产生中断的时候,TFx(0或1)都会置位

           {

                 TF0=0;

                 count++;

           }

          if(count==20)//判断:如果定时20*0.5=10ms,10ms亮灭一次led

{
count=0;  //重新赋成0
led=~led; //led状态取反一次
}
}

猜你喜欢

转载自www.cnblogs.com/ifreewolf/p/9346697.html