c51中如何实现1ms到10s范围内的延时?

[复制链接]
11143|29
 楼主| sandisker 发表于 2008-6-7 23:23 | 显示全部楼层

拍晕了

hyg1984 发表于 2008-6-7 23:26 | 显示全部楼层

我知道了,3楼的方法太好了,受教了!

 楼主| sandisker 发表于 2008-6-8 20:49 | 显示全部楼层

有延时误差???

用三楼的方法做了一下,延时6s时,示波器测得是5.8s
延时6ms时,测得的是5.8ms,相对误差是一样的。??
我的代码是在1ms定时中断程序内加入三楼的代码,在主程序中不断判断ms和second是否满足条件?这样做对否?

欢迎拍砖,o(∩_∩)o...
xwj 发表于 2008-6-8 20:51 | 显示全部楼层

唉,我算是服了

真不知你们的误差从何而来...
awey 发表于 2008-6-8 20:53 | 显示全部楼层

怎么还在讨论这个问题?

walnutcy 发表于 2008-6-9 01:19 | 显示全部楼层

由一个原子引发的故事,呵呵,

 楼主| sandisker 发表于 2008-6-9 13:27 | 显示全部楼层

唉,被人嘲笑了,可还是要问问。我的代码如下:

#define OSC_FREQ    12000000
#define C1ms              (65536-OSC_FREQ/(12000000/980))
//考虑重装时时间上的误差,将1000调整为980
unsigned int ms, second;
void main()
{  DelayXms(60000);  //延时6s
   DelayXms(6);  //延时6ms
}
void DelayXms(unsigned long z)
{
    second=0;
    ms=0;
    TMOD=TMOD&(0x0f)|0x10;
    EA=1;
    ET1=1;
    TR1=1;
    do { } while (second*1000+ms<z);
    TR1=0;
    second=0;
    ms=0;
}

void timer1(void) interrupt 3 using 3
{
    TH1=C1ms/256;
    TL1=C1ms%256;
    if(ms>=1000) {
            ms=0;
            if(second>=60) {
                 second=0;
                }
            else{
                   second++;        
                }
            }
    else{
         ms++;
     }
}
jt4117 发表于 2008-6-9 15:15 | 显示全部楼层

用自动赋初值的定时器做呗!

呆板书生 发表于 2008-6-9 17:31 | 显示全部楼层

27楼太聪明了

27楼的头脑是灵活,没俺呆板,不过还是火候没到

我是很呆板的,所以写成

++ms >= 1000

想想:

开始时候 ms=0,然后等到 ++ms >= 1000,      要经历多少次?

或者开始 ms=0,然后等到 ms >= 1000,ms++;  要经历多少次?

xwj 发表于 2008-6-9 20:29 | 显示全部楼层

所以我才说:7楼yewuyi的方法看似漂亮,实际上却很容易出错


27楼自己去仿真、跟踪下,看看你那1秒钟到底有多少毫秒,一分钟到底有多少秒!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部