找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2005|回复: 11
收起左侧

用几个单片机点亮LED时,同时供电后会出现时间差

[复制链接]
ID:276442 发表于 2019-4-19 16:47 | 显示全部楼层 |阅读模式
如题,我用几个单片机点亮LED,一开始用的延时而已,同时供电后亮灭同步,经过一段时间后会出现不同步的现象,我以为是延时误差的原因,后来改用了定时器,定时0.5S,出现的问题一样,也是一开始同步,经过一段时间后不同步,请问是什么原因导致的呢;
回复

使用道具 举报

ID:155507 发表于 2019-4-19 17:41 | 显示全部楼层
你这改的代码程序也不发,让大家猜嘛,那叫人家怎么帮你?
回复

使用道具 举报

ID:499770 发表于 2019-4-19 17:55 | 显示全部楼层
难道是晶震误差?
回复

使用道具 举报

ID:434390 发表于 2019-4-19 18:00 | 显示全部楼层
时间长了单片机之间时间偏差肯定越来越大,时钟同步解决
回复

使用道具 举报

ID:276442 发表于 2019-4-20 08:40 | 显示全部楼层
补发下代码
#include <REG52.H>       
#include <stdio.h>   //Keil library       
#include <INTRINS.H>
#define FSCLK        11059200
typedef unsigned char  uchar;
typedef unsigned short ushort;
typedef unsigned int   uint;
uint num = 1,flag = 1,time = 0;

sbit led1=P1^2;
sbit led2=P1^4;
void times(int num);
void Delay_ms(uint time)
{
        uint i,j;
        for(i = 0;i < time;i ++)
                for(j = 0;j < 930;j ++);
}

void main()
{
         
        while(1)
        {
    led1 = 0;
    led2 = 0;
    times(1);
                led2 = 1;
                led1 = 1;
                times(1);
       
}
        }
void time0()interrupt 1
{
        TMOD = 0X01;
        TH0 = (65536-FSCLK/12/20)/256;
        TL0 = (65536-FSCLK/12/20)%256;
        ET0 = 1;
        EA = 1;
        time ++;
        if(time == 10)
        {
                time = 0;
                flag = 1;
        }
}
void times(uint num)
{
        while(num!=0)
        {
                TR0 = 1;
        if(flag!=0)
        {
                num--;
                flag = 0;
                TR0 = 0;
        }
}
}
回复

使用道具 举报

ID:276442 发表于 2019-4-20 08:42 | 显示全部楼层
用的是STC15W408AS,内置晶振的
回复

使用道具 举报

ID:471632 发表于 2019-4-20 10:10 | 显示全部楼层
点led还要用多个单片机吗?一个不就解决问题了吗?好像内置的晶振精度不是很高吧!
回复

使用道具 举报

ID:213173 发表于 2019-4-20 10:12 | 显示全部楼层
namecy 发表于 2019-4-20 08:42
用的是STC15W408AS,内置晶振的

首先单片机内置时钟误差就比较大,何况多机工作不可能同频同相,时间长了积累误差非常大。如果必须采用多机工作只能用一个外部时钟源向所有MCU提供同步时钟。STC15W408AS可以设置为使用外部时钟。
回复

使用道具 举报

ID:160500 发表于 2019-4-20 10:30 | 显示全部楼层
必须用同步信号才行
回复

使用道具 举报

ID:276442 发表于 2019-4-20 11:00 | 显示全部楼层
wulin 发表于 2019-4-20 10:12
首先单片机内置时钟误差就比较大,何况多机工作不可能同频同相,时间长了积累误差非常大。如果必须采用多 ...

好的,谢谢,我试试
回复

使用道具 举报

ID:509408 发表于 2019-4-20 11:05 | 显示全部楼层
我也遇到过类似问题。 延时时间超过以 unsigned char为基准的数值(即>255后) 进位标志上(CY)有时会出错误。
仿真的反汇编也看不出来。 延时一下长一下短的。
建议你再判断一次会杜绝这个问题。

比如
//=====延时函数===
//由定时器2确定lgRunTime基准时间===
void TestDelay(unsigned int lDelayTime)
{
        lgRunTime = 0;
       
        while(lgRunTime<lDelayTime)
        {
                ;       
        }
        while(lgRunTime<lDelayTime)
        {
                ;       
        }
}
回复

使用道具 举报

ID:510365 发表于 2019-4-22 15:44 | 显示全部楼层
是晶振误差导致的,建议用一个同步信号去让多个单片机同步
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表