微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 怎么用定时器写延时函数?

怎么用定时器写延时函数?

时间:10-02 整理:3721RD 点击:
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);       
}
延时函数,怎么用定时器做呀?
能像上面的例子一样,能输入延时值的函数?
想做一个精确一点的,方便调用。

首先设置定时器工作方式 也就是TMOD  在设置TH0/1,TL0/1的初值 也就是定时时间的设置 然后设置中断允许 ,并开中断  

我也知道流程是这样的,但具体怎么写呀?
还有定义一个变量,可以输入数值的。

没人会吗?

#include<reg51.h>
void main()
{
    TMOD=0X01;
    TH0=0X3C;
    TL0=0XB0;
    EA=1;
    ET0=1;
    TR0=1;
    while(1);
}
void timer0() interrupt 1
{
    TH0=0X3F;
    TL0=0XB0;   
}
我也是新手啊,刚刚学的,还不熟练,多多指教。

程序没编译,肯能有点错啊

不能像delay那样输入数值得呀~~~

不能像delay那样输入数值得呀~~~

帮顶,我也想想看

小编可以考虑用汇编语言写,相对简单一些。用C的话,上面那个人写的差不多,但是不能在delay中写值的那样。

小编可以考虑用汇编语言写,相对简单一些。用C的话,上面那个人写的差不多,但是不能在delay中写值的那样。

我觉得小编先搞清楚什么是定时器,你要实在想那样去做的话,设置好每次中断的时间,并在main函数中定义一个变量count,每次进T0中断后count++。 主函数中去判断count的大小,所以你要的精确定时=每次中断的时间*count

按照你的意思,写了如下三个函数。在初始化定时器0后(调用InitTimer0()),你可以调用DelayNms(unsigned int t)这个函数来达到你想要的要的延时效果。
unsigned int count;//定义全局变量用于计时
/*----------------------------------------
        函数名     :DelayNms(unsigned char t)
        功能        : 延时n毫秒
        输入参数 : t ,延时长度
        输出参数 : 无
-------------------------------------------*/
void DelayNms(unsigned int t)
{
      count=t;
      while(count);
}
/*----------------------------------------
        函数名     : InitTimer0
        功能        : 定时器0初始化
        输入参数 : 无
        输出参数 : 无
-------------------------------------------*/
void InitTimer0()
{
        TMOD |= 0x01;//定时器0,工作方式1
         TH0=(65536-1000)/256;//定时1ms
         TL0=(65536-1000)%256;
         ET0 = 1;//打开定时器0中断
         EA  = 1;//打开总中断
         TR0 = 1;//打开定时器0
}
/*----------------------------------------
       函数名      :IsrTimer0
        功能        :定时器0终端服务,间隔1ms将计数变量减一。
        输入参数 : 无
        输出参数 : 无
-------------------------------------------*/
void IsrTimer0() interrupt 1
{
         TH0=(65536-1000)/256;
         TL0=(65536-1000)%256;
         count--;
}

写的很好,恐怕你是第一次这样拿定时器这样做延时吧。

这个延时函数,有强大的后盾啊

貌似存在问题哦,当需要定时1ms时  若执行  count=t; 定时器计数是无法保证刚好在65536-1000的,因此如果定时tms      那么  (t-1)ms<实际<=tms,而且每次都不经相同。
这样改下如何:即使有误差,误差应该也是确定的
void DelayNms(unsigned int t)
{
      TH0=(65536-1000)/256;
      TL0=(65536-1000)%256;
      count=t;
      while(count);
}

哈哈,楼上是正解,原来程序的确有问题,会有小于1ms的误差。

还是不怎么理解定时中断怎么调用的

不错不错,
     

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top