对于AT89S52单片机,共有3个定时器,T0,T1,T2。其中T0,T1可以作为16位计数器,16位定时器和8位自动装载定时器使用,而T2则可以作为16为自动装载 定时器。这里以T0为例,讲述16位定时器实现延时的代码。
定时器的相关寄存器不在这里叙述,大家可以根据程序查阅手册看看各个寄存器的使用。鼓励大家自己也进行思考,查阅资料。
代码如下,这里采用定时器实现1ms延时,延后以循环的方式延时1秒实现LED闪烁。
#include<reg52.h>
#define LED P1
typedef unsigned int uint;
typedef unsigned char uchar;
void Delay_Nms(uint N); //延时N毫秒子函数
void Hardware_Delay_1ms(); //定时器延时,12MHz晶振,延时1ms
void main()
{
LED = 0xFF; //熄灭所有的灯
while(1)
{
LED ^= 0xFF;//取反,使灯闪烁
Delay_Nms(1000); //延时1秒
}
}
void Delay_Nms(uint N)
{
uint j;
for(j=N;j>0;j--)
Hardware_Delay_1ms();
}
void Hardware_Delay_1ms(void)
{
TMOD &=0xF0;
TMOD |=0x01; //T0——16位定时器器模
TH0 = 0xFC;
TL0 =0x18; //64536
TF0=0; //清除定时器溢出标志
TR0=1; //启动定时器
while(TF0==0);//等待计数完成
TR0=0; //停止定时器
}
定时器的相关寄存器不在这里叙述,大家可以根据程序查阅手册看看各个寄存器的使用。鼓励大家自己也进行思考,查阅资料。
代码如下,这里采用定时器实现1ms延时,延后以循环的方式延时1秒实现LED闪烁。
#include<reg52.h>
#define LED P1
typedef unsigned int uint;
typedef unsigned char uchar;
void Delay_Nms(uint N); //延时N毫秒子函数
void Hardware_Delay_1ms(); //定时器延时,12MHz晶振,延时1ms
void main()
{
LED = 0xFF; //熄灭所有的灯
while(1)
{
LED ^= 0xFF;//取反,使灯闪烁
Delay_Nms(1000); //延时1秒
}
}
void Delay_Nms(uint N)
{
uint j;
for(j=N;j>0;j--)
Hardware_Delay_1ms();
}
void Hardware_Delay_1ms(void)
{
TMOD &=0xF0;
TMOD |=0x01; //T0——16位定时器器模
TH0 = 0xFC;
TL0 =0x18; //64536
TF0=0; //清除定时器溢出标志
TR0=1; //启动定时器
while(TF0==0);//等待计数完成
TR0=0; //停止定时器
}