1762|8

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

延时误差 [复制链接]

求助:下列延时程序做好了,但总是多了0.3秒(设置0.2结果是0.5,设置2.3结果是2.6……),单片机用stc15w201s,频率6Mhz。望各大神给指点。

include

sbit timeup = P1^4; sbit flash = P1^5; unsigned int tt, nn, time; void delay(unsigned short x) { unsigned short i, j; for(i = 0;i <= x; i++) for(j = 0; j <= 50; j++);} void main() {unsigned short x, y, timeup = 1; TMOD = 0x01; TR0 = 1;
IE = 0x82;
nn = 255; TH0 = 0x3C; TL0 = 0xB0; x = P1; x = ~x; y = P3; y = ~y; time = y % 16 * 10 + x % 16; nn = 0;

while (1) { flash=0; delay(1000); flash=1; delay(1000); } } void b() interrupt 1 { TH0 = 0x3C; TL0 = 0xB0; tt++; if (tt == 1) { tt = 0; nn++; if (nn == time) { TR0 = 0; timeup = 0;} } }

 

此帖出自51单片机论坛

最新回复

精确定时,是不是用中断模式比较好?   详情 回复 发表于 2022-11-25 14:39
点赞 关注
 

回复
举报

6773

帖子

2

TA的资源

版主

沙发
 
sbit timeup = P1^4;
sbit flash = P1^5; 
unsigned int tt, nn, time;
 
void delay(unsigned short x) 
{ 
    unsigned short i, j; 
    for(i = 0;i <= x; i++) 
        for(j = 0; j <= 50; j++);
} 
void main() 
{
    unsigned short x, y, timeup = 1; 
    TMOD = 0x01; 
    TR0 = 1;
    IE = 0x82;
    nn = 255; 
    TH0 = 0x3C; 
    TL0 = 0xB0; 
    x = P1; 
    x = ~x; 
    y = P3; 
    y = ~y; 
    time = y % 16 * 10 + x % 16; 
    nn = 0;

    while (1) 
    { 
        flash=0; 
        delay(1000); 
        flash=1; 
        delay(1000); 
    } 
} 
void b() interrupt 1 
{ 
    TH0 = 0x3C; 
    TL0 = 0xB0; 
    tt++; 
    if (tt == 1) 
    { 
        tt = 0; 
        nn++; 
        if (nn == time) 
        { 
            TR0 = 0; 
            timeup = 0;
        } 
    } 
}

 

此帖出自51单片机论坛
 
 
 

回复

6773

帖子

2

TA的资源

版主

板凳
 

帮你重新贴一下代码,直观一些。

每次都多0.3s【for(i = 0;i <= x; i++) 】中i=x,就别设置成0。

此帖出自51单片机论坛
 
 
 

回复

6773

帖子

2

TA的资源

版主

4
 

为啥不改【for(j = 0; j <= 50; j++);】中的50,因为你设置0.2秒多0.3秒,设置2.3秒也是多0.3秒。
可以用这个表达式描述,y=ax+b;其中,0.3秒是b,上面的50是a,如果改了a,则修改的是线性值。

此帖出自51单片机论坛

点评

先谢!原因找到了,不是延时程序岀问题,是燒写软件对引脚未定义好  详情 回复 发表于 2022-11-3 12:47
 
 
 

回复

1025

帖子

0

TA的资源

纯净的硅(高级)

5
 

除了程序问题外,一般认为6M晶振误差很小,其实这是个误区。

晶振一般稳定性很高,但精度除了自身的结构、材料、使用温度等因数外,还却决与外围电路和驱动,至少直接连接的电容、引线电容及内部的电阻等就直接影响精度,所以,精度再高的"时钟",都需要先校准后使用,如果和时间、定时等有关,无比“知己知彼”,对你使用的晶振和回路共同构成的系统,包括软件处理流程,都必须经行评估甚至检测,以决定你采用软件还是硬件的“微调”措施,否则,定时都是空谈。

我在30年前使用了日本一款当时很先进的控制器:C2000,功能就是PLC,相当于我们现在用的S7-1500以上的级别,但使用了一个2小时的定时器,做了个8小时切换备用电机的程序,最终误差超过30分钟。可笑不。后来采用很多方法“修改”。

此帖出自51单片机论坛

点评

老专家,30年前就接触过电学 我还没出生呢哈哈哈  详情 回复 发表于 2022-11-3 18:40
 
个人签名چوآن شـين
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

6
 
wangerxian 发表于 2022-11-3 09:25 为啥不改【for(j = 0; j <= 50; j++);】中的50,因为你设置0.2秒多0.3秒,设置2.3秒也是多0.3秒。 可以 ...

先谢!原因找到了,不是延时程序岀问题,是燒写软件对引脚未定义好

此帖出自51单片机论坛

点评

是软件没定义好,还是楼主没定义好? 51里面,P0~P3引脚好像是要自己定义的吧  详情 回复 发表于 2022-11-3 23:23
 
 
 

回复

4771

帖子

12

TA的资源

版主

7
 
除了程序问题外,一般认为6M晶振误差很小,其实这是个误区。 晶振一般稳定性很高,但精度除了自身的结构、材料、使用温度等因数外,还却决与外围电路和驱动,至少直接连接的电容、引线电容及内部的电阻等就直接影响精度,所以,精度再高的&quot;时钟&quot;,都需要先校准后使用,如果和时间、定时等有关,无比&ldquo;知己知彼&rdquo;,对你使用的晶振和回路共同构成的系统,包括软件处理流程,都必须经行评估甚至检测,以决定你采用软件还是硬件的&ldquo;微调&rdquo;措施,否则,定时都是空谈。 我在30年前使用了日本一款当时很先进的控制器:C2000,功能就是PLC,相当于我们现在用的S7-1500以上的级别,但使用了一个2小时的定时器,做了个8小时切换备用电机的程序,最终误差超过30分钟。可笑不。后来采用很多方法&ldquo;修改&rdquo;。

老专家,30年前就接触过电学 我还没出生呢哈哈哈

此帖出自51单片机论坛
 
 
 

回复

224

帖子

0

TA的资源

一粒金砂(高级)

8
 
蚂蚁仔 发表于 2022-11-3 12:47 先谢!原因找到了,不是延时程序岀问题,是燒写软件对引脚未定义好

是软件没定义好,还是楼主没定义好?

51里面,P0~P3引脚好像是要自己定义的吧

此帖出自51单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

9
 

精确定时,是不是用中断模式比较好?

此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表