單片機(jī)遠(yuǎn)程同步燈電路+程序
1.概述
遠(yuǎn)程同步燈系統(tǒng)能夠在300米的距離內(nèi)實(shí)現(xiàn)多個(gè)單片機(jī)控制器的同步功能。整個(gè)同步系統(tǒng)分為三大組成部分:單片機(jī)控制器、LED燈板以及同步信號傳輸線路。
系統(tǒng)框架如下所示:
2.各部分組成
1)單片機(jī)控制器
使用飛利浦P89C52單片機(jī)作為主控芯片。在300米的傳輸線路上由一臺(tái)控制器作為產(chǎn)生同步信號的主機(jī),其余多臺(tái)控制器作為從機(jī),接收從主機(jī)傳送來的同步信號。主機(jī)發(fā)送一次同步信號,所有控制器進(jìn)行一次同步操作。
每一個(gè)控制器由89C52的最小系統(tǒng)加4個(gè)驅(qū)動(dòng)芯片ULN2003組成,圖2和圖3顯示出具體的電路構(gòu)成和連接方式。帶上驅(qū)動(dòng)芯片后,一個(gè)控制器就可以同時(shí)驅(qū)動(dòng)24盞LED燈。
2)LED燈板
每一塊LED燈板帶24個(gè)LED燈,分為8組,每組有紅綠藍(lán)燈珠各一顆,即為8*3=24顆。每一顆燈珠帶300歐姆限流電阻。(參見圖3)
3)同步信號傳輸線路
遠(yuǎn)程傳輸線路由傳輸導(dǎo)線和信號輸出、信號輸入端三部分組成。其中,主機(jī)與信號輸出端相連,各個(gè)從機(jī)與各自的信號輸入端相連。由于傳輸距離較遠(yuǎn),我們需要將傳輸電壓抬高至30伏特左右。具體輸出端(升壓)和輸入端(降壓)電路由圖4與圖5所示。
附加說明:在圖4與圖5的接口之間,可以接雙絞線作為同步信號的傳輸介質(zhì)。
3.同步系統(tǒng)軟件設(shè)計(jì)流程
1)問題的提出
單片機(jī)的運(yùn)行速度是不同的。即使是同一型號的單片機(jī)在同一頻率標(biāo)識(shí)的晶振下,同時(shí)上電開始運(yùn)行同樣的程序,也不可能做到精確的同步。這種運(yùn)行速度的差異性一開始可能不會(huì)被察覺,但是當(dāng)系統(tǒng)運(yùn)行時(shí)間久了之后,各個(gè)單片機(jī)之間的運(yùn)行速度的差異性就會(huì)逐漸積累起來,一直能夠累計(jì)到我們不能容忍的程序。
因此,我們必須在這些的差異積累到一定程度之前,使所有的單片機(jī)在同一時(shí)刻運(yùn)行到同樣的程序位置,這樣就可以清零正在積累的差異性,達(dá)到運(yùn)行長時(shí)間都能夠同步的效果。
2)程序流程圖
初步設(shè)計(jì)同步系統(tǒng)中的主機(jī)和從機(jī)運(yùn)行一輪效果(6個(gè)不同的燈光效果)之后,進(jìn)行一次同步操作。用16MHZ晶振的實(shí)際測量效果是運(yùn)行完一輪的時(shí)間為1分20秒左右。在進(jìn)行同步操作之前,主機(jī)與從機(jī)運(yùn)行相同的程序,以盡量減少不同程序引起的時(shí)間差異;在運(yùn)行完6個(gè)效果之后,所有從機(jī)立刻進(jìn)入等待狀態(tài),不斷查詢中斷標(biāo)志。而主機(jī)則在運(yùn)行完效果之后再運(yùn)行一段延時(shí)程序,這樣做的目的,是有意造成主從之間的快慢差異--主機(jī)慢,從機(jī)快。這樣從機(jī)就可以有充分的時(shí)間來響應(yīng)由主機(jī)發(fā)送過來的同步信號,消除之前積累的各個(gè)單片機(jī)實(shí)際運(yùn)行的速度差異。流程圖如圖6所示。
通過實(shí)際測量,我們在300米距離內(nèi)運(yùn)行10臺(tái)控制器,并進(jìn)行了24小時(shí)的同步測試,運(yùn)行效果良好,可以達(dá)到預(yù)期目的。
4.實(shí)測同步系統(tǒng)特性參數(shù)
1)遠(yuǎn)程同步信號傳輸線路電路基本參數(shù)
傳輸電壓:30v
傳輸電流:0.04A(介質(zhì)為雙絞網(wǎng)線,長度300米)
消耗功率:1.2w
2)單片控制器及燈板功耗:5w
3)最大可同步距離:500米
4)最大可同步控制器數(shù):待測
附錄A: 材料清單
從機(jī)材料清單
PART1、2電源部分:
器件種類
標(biāo)號
型號參數(shù)
封裝
數(shù)量
橋堆
D2
DB107
直插
1
高速開關(guān)
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單片機(jī)最小系統(tǒng)
單片機(jī)
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驅(qū)動(dòng)
驅(qū)動(dòng)芯片
U2------U5
ULN2003
SOP16
4
主機(jī)材料清單
PART1、2電源部分:
器件種類
標(biāo)號
型號參數(shù)
封裝
數(shù)量
橋堆
D2
DB107
直插
1
高速開關(guān)
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單片機(jī)最小系統(tǒng)
單片機(jī)
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同步信號發(fā)生電路
三極管
Q1
9015
SOT54
1
可控硅
Q2
100-6
SOT54
1
電阻
R29
10K
0805
1
電阻
R30
5.1K
0805
1
電阻
R31
1K
0805
1
PART6 LED驅(qū)動(dòng)
驅(qū)動(dòng)芯片
U2------U5
ULN2003
SOP16
4
程序說明:主機(jī)與從機(jī)程序盡可能一樣,避免運(yùn)行不同程序帶來的不同步效果。
主機(jī)只發(fā)送同步信號,以自己的時(shí)鐘運(yùn)行 從機(jī)接收同步信號,
在約定的時(shí)間開始查詢中斷,體現(xiàn)“快等慢”這一原則
附錄B:試驗(yàn)程序清單
主機(jī)程序:
//============================
// 主機(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;
EA=0;
IT0=1; //主機(jī)本身不中響應(yīng)斷
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++)
;
}
}
效果程序略
從機(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; //下降沿觸發(fā)
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;
}