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