单片机/MCUwilliam hill官网
直播中

林林林

11年用户 162经验值
擅长:可编程逻辑
私信 关注
[问答]

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

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


回帖(60)

bob

2013-4-10 20:20:06
首先设置定时器工作方式 也就是TMOD  在设置TH0/1,TL0/1的初值 也就是定时时间的设置 然后设置中断允许 ,并开中断  
举报

王承利

2013-4-10 22:43:12
{:20:}{:20:}
举报

林林林

2013-4-11 08:37:56
我也知道流程是这样的,但具体怎么写呀?
还有定义一个变量,可以输入数值的。。。
1 举报

林林林

2013-4-12 08:18:10
没人会吗?????
举报

李小康

2013-4-12 08:32:29
#include
void main()
{
    TMOD=0X01;
    TH0=0X3C;
    TL0=0XB0;
    EA=1;
    ET0=1;
    TR0=1;
    while(1);
}
void timer0() interrupt 1
{
    TH0=0X3F;
    TL0=0XB0;   
}
我也是新手啊,刚刚学的,还不熟练,多多指教。
2 举报

李小康

2013-4-12 08:35:03
程序没编译,肯能有点错啊
举报

林林林

2013-4-12 13:39:03
不能像delay那样输入数值得呀~~~
举报

林林林

2013-4-18 20:16:11

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

刘玉德

2013-6-10 08:59:11
帮顶,我也想想看
举报

耿冬冬

2013-6-10 10:42:10
楼主可以考虑用汇编语言写,相对简单一些。用C的话,上面那个人写的差不多,但是不能在delay中写值的那样。
举报

耿冬冬

2013-6-10 10:46:14
楼主可以考虑用汇编语言写,相对简单一些。用C的话,上面那个人写的差不多,但是不能在delay中写值的那样。
举报

Hugo

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

宋志标

2013-6-25 00:34:42
按照你的意思,写了如下三个函数。在初始化定时器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--;
}

5 举报

邱虎

2013-6-25 00:45:33
写的很好,恐怕你是第一次这样拿定时器这样做延时吧。
举报

邱虎

2013-6-25 00:47:27
这个延时函数,有强大的后盾啊
举报

邱虎

2013-6-25 01:03:47
貌似存在问题哦,当需要定时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);
}
3 举报

宋志标

2013-6-25 01:12:14
引用: 一抹阳光 发表于 2013-6-25 01:03
貌似存在问题哦,当需要定时1ms时  若执行  count=t; 定时器计数是无法保证刚好在65536-1000的,因此如果定 ...

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

ˇ√ˇ

2013-6-25 10:24:36
还是不怎么理解定时中断怎么调用的
举报

skyfly_HUT

2013-6-25 14:43:28
本帖最后由 skyfly_HUT 于 2013-6-25 14:59 编辑
引用: 爱我别走 发表于 2013-6-25 00:34
按照你的意思,写了如下三个函数。在初始化定时器0后(调用InitTimer0()),你可以调用DelayNms(unsigned i ...

不错不错,
     
举报

更多回帖

发帖
×
20
完善资料,
赚取积分