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

2019-04-15 17:34发布

单片机的定时器是作为片外资源,开启定时器需要设置相关的寄存器,当然,这些寄存器是可以位寻址的,怎么位寻址?在头文件中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)%256;   //赋初值为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)%256;   //赋初值为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)%256;   //赋初值为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状态取反一次
}
}