51单片机中,定时器怎么做延时函数用,比如说,要精确延时1s,该怎么写???

如题所述

unsigned long TimeTickCount;//1ms计时器
void Timer0Configuration();
void Delay1ms(unsigned int a);
void main()

{
while(1)
{
Delay1ms(1000);//1s延时;
}
}
void Delay1ms(unsigned int a)//0~65535
{
unsigned long b;//0~0xffffffff
b = TimeTickCount;//记下及时器初始值
while((TimeTickCount-b<a)||(0xffffffff+TimeTickCount-b<a));
//当计数器未溢出只须用 计数器实时变化的值-其初始值
//当计数器溢出则须用 计时器上限值+计数器实时变化的值-其初始值
}
void Timer1Configuration()
{
TMOD=0X10;//选择为定时器模式,工作方式1。
TH1=0Xfc; //给定时器赋初值,定时1000us
TL1=0X18;
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
TR1=1;//打开定时器
}
void interrupt_timer1() interrupt 3 //1000us
{
TH1 = 0xfc; //重装
TL1 = 0x18;
TimeTickCount++;//1000us计时器
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-05-02
用应该可以吧中断吧

没写主函数;自己调用应该就行了

unsigned int i;

void Init_Timer1(void)
{
TMOD |= 0x10; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH1=0xd1;
TL1=0x1f; //给定初值,一直到65535溢出
EA=1; //总中断打开
ET1=1; //定时器中断打开
TR1=1; //定时器开关打开
}
void Timer1_isr(void) interrupt 3 using 1
{
TH1=0xd1;
TL1=0x1f; //重新赋值
i++;
if(i=1000)
{
i=0;//1s到达
/*****************/
}
}
没试过 不知行不行!!!
第2个回答  推荐于2017-10-09
你好!
void init() //定时器T0初始化 1秒

{

EA=1;

ET0=1;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;
TR0=1;

}

void time0() interrupt 1 //进入中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}本回答被提问者和网友采纳
第3个回答  2015-05-02
定时器定时一次,最大是 65536 us。

重复几次,即可。