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;
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
#define uchar unsigned char
uint count=0; //5000微秒的次数,用于在中断中加1,count有多少,定时count*5ms
sbit led=P1^0;
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)//大循环,循环执行里面的程序
count=0; //重新赋成0
led=~led; //led状态取反一次
}
}
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状态取反一次
}
}