首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

单片机远程同步灯电路+程序

单片机远程同步灯电路+程序

1.概述
远程同步灯系统能够在300米的距离内实现多个单片机控制器的同步功能。整个同步系统分为三大组成部分:单片机控制器、LED灯板以及同步信号传输线路。
系统框架如下所示:

2.各部分组成
1)单片机控制器
使用飞利浦P89C52单片机作为主控芯片。在300米的传输线路上由一台控制器作为产生同步信号的主机,其余多台控制器作为从机,接收从主机传送来的同步信号。主机发送一次同步信号,所有控制器进行一次同步操作。
每一个控制器由89C52的最小系统加4个驱动芯片ULN2003组成,图2和图3显示出具体的电路构成和连接方式。带上驱动芯片后,一个控制器就可以同时驱动24盏LED灯。
2)LED灯板
每一块LED灯板带24个LED灯,分为8组,每组有红绿蓝灯珠各一颗,即为8*3=24颗。每一颗灯珠带300欧姆限流电阻。(参见图3)

3)同步信号传输线路
远程传输线路由传输导线和信号输出、信号输入端三部分组成。其中,主机与信号输出端相连,各个从机与各自的信号输入端相连。由于传输距离较远,我们需要将传输电压抬高至30伏特左右。具体输出端(升压)和输入端(降压)电路由图4与图5所示。

附加说明:在图4与图5的接口之间,可以接双绞线作为同步信号的传输介质。
3.同步系统软件设计流程
1)问题的提出
单片机的运行速度是不同的。即使是同一型号的单片机在同一频率标识的晶振下,同时上电开始运行同样的程序,也不可能做到精确的同步。这种运行速度的差异性一开始可能不会被察觉,但是当系统运行时间久了之后,各个单片机之间的运行速度的差异性就会逐渐积累起来,一直能够累计到我们不能容忍的程序。
因此,我们必须在这些的差异积累到一定程度之前,使所有的单片机在同一时刻运行到同样的程序位置,这样就可以清零正在积累的差异性,达到运行长时间都能够同步的效果。
2)程序流程图
初步设计同步系统中的主机和从机运行一轮效果(6个不同的灯光效果)之后,进行一次同步操作。用16MHZ晶振的实际测量效果是运行完一轮的时间为1分20秒左右。在进行同步操作之前,主机与从机运行相同的程序,以尽量减少不同程序引起的时间差异;在运行完6个效果之后,所有从机立刻进入等待状态,不断查询中断标志。而主机则在运行完效果之后再运行一段延时程序,这样做的目的,是有意造成主从之间的快慢差异--主机慢,从机快。这样从机就可以有充分的时间来响应由主机发送过来的同步信号,消除之前积累的各个单片机实际运行的速度差异。流程图如图6所示。


    通过实际测量,我们在300米距离内运行10台控制器,并进行了24小时的同步测试,运行效果良好,可以达到预期目的。
4.实测同步系统特性参数
   1)远程同步信号传输线路电路基本参数
   传输电压:30v
   传输电流:0.04A(介质为双绞网线,长度300米)
   消耗功率:1.2w
   2)单片控制器及灯板功耗:5w
   3)最大可同步距离:500米
   4)最大可同步控制器数:待测附录A: 材料清单
从机材料清单
PART1、2电源部分:
器件种类
标号
型号参数
封装
数量
桥堆
D2
DB107
直插
1
高速开关
U6
LM2576
TO-263
1
二极管
D1
IN8175
DIODE-0.4
1
电感
L1
100uH
直插
1
电容
C1
47Uf
直插
1
电容
C2
220uF
直插
1
电容
C4
100nF
贴片0603
1
电阻
R26
3K
0805
1
电阻
R27
1K
0805
1
PART3单片机最小系统
单片机
U1
P89S52XBN
DIP40
1
晶振
Y1
16MHz
RAD0.2
1
电阻
R28
10K
AXIAL-0.3
1
电容
C3
47uF
直插
1
电容
C5C6
33pF
AXIAL-0.3
2
PART4普通IO口上拉电阻
电阻
R1-----R25
1K
贴片0805
25
PART5同步信号接收电路
三极管
Q1
9015
SOT54
1
可控硅
Q2
100-6
SOT54
1
电阻
R29
300欧姆
0805
1
电阻
R30
5.1K
0805
1
电阻
R31、R32
1K
0805
2
电阻
R33
10K
0805
1
PART6 LED驱动
驱动芯片
U2------U5
ULN2003
SOP16
4


主机材料清单
PART1、2电源部分:
器件种类
标号
型号参数
封装
数量
桥堆
D2
DB107
直插
1
高速开关
U6
LM2576
TO-263
1
二极管
D1
IN8175
DIODE-0.4
1
电感
L1
100uH
直插
1
电容
C1
47uF
直插
1
电容
C2
220uF
直插
1
电容
C4
100nF
贴片0603
1
电阻
R26
3K
0805
1
电阻
R27
1K
0805
1
PART3单片机最小系统
单片机
U1
P89S52XBN
DIP40
1
晶振
Y1
16MHz
RAD0.2
1
电阻
R28
10K
AXIAL-0.3
1
电容
C3
47uF
直插
1
电容
C5、C6
33pF
AXIAL-0.3
2
PART4普通IO口上拉电阻
电阻
R1-----R25
1K
贴片0805
25
PART5同步信号发生电路
三极管
Q1
9015
SOT54
1
可控硅
Q2
100-6
SOT54
1
电阻
R29
10K
0805
1
电阻
R30
5.1K
0805
1
电阻
R31
1K
0805
1
PART6 LED驱动
驱动芯片
U2------U5
ULN2003
SOP16
4 程序说明:主机与从机程序尽可能一样,避免运行不同程序带来的不同步效果。

主机只发送同步信号,以自己的时钟运行 从机接收同步信号,
在约定的时间开始查询中断,体现“快等慢”这一原则
附录B:试验程序清单
主机程序:
//============================
//  主机程序
//
//============================
#include"myhead.h"
sbit P36=P3^6;
bit flag;
void main(void)
{
    uchar i;
    flag=0;
    P36=1;
    P0=0x00;
    P1=0x00;
    P2=0x00;
    EA=0;
    IT0=1;         //主机本身不中响应断
    EX0=0;
    while(1)
    {
        for(i=0;i<5;i++)
        RGBjianbian();
lable:  for(i=0;i<5;i++)
        RGBjianbian();
        for(i=0;i<5;i++)
        zhuizhu();
        for(i=0;i<5;i++)
        liushui();
        for(i=0;i<5;i++)
        shanshuo();
        for(i=0;i<5;i++)
        kaolong();
        for(i=0;i<5;i++)
        liushui2();
        delay2();
        P36=0;
        flag=0;
        flag=0;
        flag=0;
        flag=0;     
        goto lable;

    }
}
void delay(void)
{
    uchar i,j;
    for(i=0;i<MAX;i++)
    {   for(j=0;j<MAX;j++)
        ;
    }
}
效果程序略

从机程序:
#include"myhead.h"
sbit P36=P3^6;
bit flag;
void main(void)
{
    uchar i;
    flag=0;
    P36=1;
    P0=0x00;
    P1=0x00;
    P2=0x00;

    IT0=1;         //下降沿触发
    EX0=1;
    EA=1;
    while(1)
    {
        for(i=0;i<5;i++)
        RGBjianbian();
lable:  for(i=0;i<5;i++)
        RGBjianbian();
        for(i=0;i<5;i++)
        zhuizhu();
        for(i=0;i<5;i++)
        liushui();
        for(i=0;i<5;i++)
        shanshuo();
        for(i=0;i<5;i++)
        kaolong();
        for(i=0;i<5;i++)
        liushui2();
        flag=0;
        flag=0;
        while(flag==0)
        {   ;   }
        flag=0;
        goto lable;

    }
}
void delay(void)
{
    uchar i,j;
    for(i=0;i<MAX;i++)
    {   for(j=0;j<MAX;j++)
        ;
    }
}
效果程序略
void interrupt0(void)  interrupt 0 using 2
{
    flag=1;
}

返回列表