发新帖我要提问
12
返回列表
打印

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

[复制链接]
楼主: sandisker
手机看帖
扫描二维码
随时随地手机跟帖
21
sandisker|  楼主 | 2008-6-7 23:23 | 只看该作者 回帖奖励 |倒序浏览

拍晕了

使用特权

评论回复
22
hyg1984| | 2008-6-7 23:26 | 只看该作者

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

使用特权

评论回复
23
sandisker|  楼主 | 2008-6-8 20:49 | 只看该作者

有延时误差???

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

欢迎拍砖,o(∩_∩)o...

使用特权

评论回复
24
xwj| | 2008-6-8 20:51 | 只看该作者

唉,我算是服了

真不知你们的误差从何而来...

使用特权

评论回复
25
awey| | 2008-6-8 20:53 | 只看该作者

怎么还在讨论这个问题?

使用特权

评论回复
26
walnutcy| | 2008-6-9 01:19 | 只看该作者

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

使用特权

评论回复
27
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++;
     }
}

使用特权

评论回复
28
jt4117| | 2008-6-9 15:15 | 只看该作者

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

使用特权

评论回复
29
呆板书生| | 2008-6-9 17:31 | 只看该作者

27楼太聪明了

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

我是很呆板的,所以写成

++ms >= 1000

想想:

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

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

使用特权

评论回复
30
xwj| | 2008-6-9 20:29 | 只看该作者

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


27楼自己去仿真、跟踪下,看看你那1秒钟到底有多少毫秒,一分钟到底有多少秒!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则