专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

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

作者:佚名   来源:本站原创   点击数:  更新时间:2011年02月18日   【字体:


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
电容
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
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
 

程序说明:主机与从机程序尽可能一样,避免运行不同程序带来的不同步效果。
主机只发送同步信号,以自己的时钟运行 从机接收同步信号,
在约定的时间开始查询中断,体现“快等慢”这一原则
程序下载: http://www.51hei.com/f/tbdd.rar  
灯光效果子程序见:http://www.51hei.com/mcu/1178.html

附录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;
}

关闭窗口

相关文章