|
第一章 緒言
隨著科學(xué)技術(shù)的發(fā)展,LED顯示屏得到廣泛的應(yīng)用,但大部分的顯示屏只能在平面顯示,不能滿足人們的需求,所以LED旋轉(zhuǎn)屏的想法正好能填補這個空缺。LED旋轉(zhuǎn)屏利用人的視,覺暫留效應(yīng),通過高速旋轉(zhuǎn)的LED燈陣列,形成一個360環(huán)形畫面,創(chuàng)造立體效果,不管人站在那個角度都能看到顯示的內(nèi)容。該應(yīng)用實用性好,制作相對簡單,而且能節(jié)省LED燈的使用。
本設(shè)計以STC89C52單片機為核心最大限度的利用單片機的資源LED驅(qū)動芯片緊密。系統(tǒng)以STC89C52單片機作為核心,控制器件通過控制電機保持一定的速度穩(wěn)定旋轉(zhuǎn)帶動單排LED旋轉(zhuǎn)形成掃描顯示屏,單片機根據(jù)LED旋轉(zhuǎn)的速度控制LED發(fā)光或熄滅,在視覺上形成平面圖形點陣的顯示效果。
第二章 方案設(shè)計第一節(jié) 設(shè)計任務(wù)與要求
一、設(shè)計任務(wù)
基于視覺暫留原理,利用了POV“視覺暫留”原理,在這短暫的時間段里,當(dāng)前面的視覺形象還沒有完全消退,新的視覺形象又繼續(xù)產(chǎn)生時,就會在人的大腦里形成連貫的視覺錯覺。利用高速旋轉(zhuǎn)中控制LED亮滅,設(shè)計一種旋轉(zhuǎn)式LED顯示屏。在穩(wěn)定旋轉(zhuǎn)地載體上安裝16個貼片發(fā)光二極管。靜止時,各個發(fā)光二極管等間距排布,隨著掃描速度的加快,不斷掃描出預(yù)設(shè)的文字。
二、設(shè)計要求
1、底座供電部分,底座為主板供電;
2、主板旋轉(zhuǎn)部分,主板負責(zé)文字旋轉(zhuǎn)。
3、制作完成后,載入程序,調(diào)試并分析結(jié)果。
第二節(jié) 任務(wù)分析
一、LED 旋轉(zhuǎn)控制
用電動機帶動LED轉(zhuǎn)動,用單片機控制LED點亮和熄滅來形成文字的,這些文字一看也去,就象懸浮在空中的。
旋轉(zhuǎn)LED旋轉(zhuǎn)起來是一個圓,那么就需要有一個傳感器來判斷起點位置,這個起點檢測非常重要,單片機就是根據(jù)這個起點來判斷是否要開始顯示數(shù)據(jù)的。如果起點檢測不到單片機就不開始顯示。我選用紅外對管,單片機控制LED燈使用紅外發(fā)射,在底座上有一個紅外發(fā)射管,這個紅外發(fā)射管不斷地向旋轉(zhuǎn)的主電路板發(fā)射紅外線。
二、底座供電部分
供電模塊電路設(shè)計的完善,采用無線輸電技術(shù),利用電磁轉(zhuǎn)換原理,先將電流變成磁場,然后再將磁場變成電流給電路供電。
三、主板旋轉(zhuǎn)部分
主板電路設(shè)計的完善,核心系統(tǒng)的選擇,用于旋轉(zhuǎn)起點檢測的傳感器選用。
第三節(jié) 方案框圖
基于以上設(shè)計方案與要求所設(shè)計方案框圖如下:主控電路,電源部分,程序端口,穩(wěn)壓濾波電路,紅外接收管,LED顯示部分。
圖 2-1 方案框圖
第三章 硬件電路設(shè)計第一節(jié) 主控電路設(shè)計
一、STC89C52簡介
單片機是指一個集成在一塊芯片上的完整計算機系統(tǒng)。盡管他的大部分功能集在一塊小芯片上,但是它具有一個完整計算機所需要的大部分部件: CPU、內(nèi)存、內(nèi)部和外部總線系統(tǒng),目前大部分還會具有外存。同時集成諸如通訊接口、定時器,實時時鐘等外圍設(shè)備而STC89C52是一種可編程可檫除只讀存儲器的低電壓,高性能的微處理器,俗稱單片機。
二、單片機最小系統(tǒng)
用單片機控制LED點亮和熄滅來形成文字。如圖3-1所示:
圖 3-1 主控電路
第二節(jié) 電源電路設(shè)計
無線供電方式,經(jīng)過實踐論證,功率很有限,需要改進的地方還很多,電路原理是把直流轉(zhuǎn)成交流,然后經(jīng)過初級線圈 ,最后次級線圈感應(yīng)得電,經(jīng)過整流濾波后給旋轉(zhuǎn)部分供電,直流轉(zhuǎn)交流部分電路是一個自激震蕩電路。將直流電轉(zhuǎn)化成高頻交流信號,通過線圈將交流信號輸送到旋轉(zhuǎn)的主電路板上,主電路板上利用5.1v的穩(wěn)壓二極管,將接收到的交流信號變成5.1v直流電,通過220uF的電解電容濾波,供給單片機,使單片機能正常工作。如圖3-2所示:
圖 3-2 無線供電小板
第三節(jié) LED顯示電路設(shè)計
一、字幕顯示設(shè)置
如何讓一列燈不斷的送數(shù)據(jù)實現(xiàn)一個文字的顯示呢?這個我們就要了解文字取模的原理了,這里以PC2002字幕軟件為例,取一個16*16的中文字,見字幕選項設(shè)置:
圖 3-3 文字取模設(shè)置圖
二、LED顯示電路
電動機帶動LED轉(zhuǎn)動,用單片機控制LED點亮和熄滅來形成文字;一個紅外發(fā)射管,一個紅外接收管,板上的紅外接受管每轉(zhuǎn)動一圈就會導(dǎo)通一次,讓單片機知道從哪一點開始播放字符;無線供電部分通過線圈向主板供電,相當(dāng)于變壓器的工作原理。
圖 3-4 LED顯示屏原理圖
第四節(jié) 穩(wěn)壓濾波電路設(shè)計
由于電源是從電機中引出來的所以需要通過整流濾波才能為系統(tǒng)供電。如圖3-5所示:
圖 3-5 穩(wěn)壓整流濾波電路
第五節(jié) 其它部分電路設(shè)計
一、程序端口
下載程序,通過程序來來實現(xiàn)想要達到的效果。如圖3-6所示:
圖 3-6 程序端口
二、紅外接收電路部分
判斷起點位置,起點檢測,根據(jù)紅外接收管電路來判斷是否要開始顯示。如圖3-7所示:
圖 3-7 紅外接收管電路
第四章 軟件設(shè)計
當(dāng)程序開始運行的時候,首先就是要對程序進行初始化,主要作用就是讓程序按照我們所設(shè)計的初始值去運行。初始化之后,讓單片機知道從哪一點開始播放字符,讓LED點亮和熄滅來形成文字;一個紅外發(fā)射管,一個紅外接收管,板上的紅外接受管每轉(zhuǎn)動一圈就會導(dǎo)通一次,對數(shù)據(jù)進行校對,執(zhí)行完成后返回到初始化操作之后重復(fù)以上的操作。
圖4-1 軟件設(shè)計流程圖
第五章 系統(tǒng)調(diào)試第一節(jié) 問題及解決方法
一、旋轉(zhuǎn) LED 上電后,電機旋轉(zhuǎn),但是無任何反應(yīng)。
解決方法:
1、檢查了供電板上元件的位置以及正負極性。
2、檢查元件有無虛焊現(xiàn)象。
3、連接電源后,測量初級線圈電壓。用萬用表交流檔 20V 測試,有 6-9V 的交流電壓輸出是正常。如不正常,檢查輸入電源是否是 5V。
4、檢查旋轉(zhuǎn)主板 4 個 4148 焊接位置以及正負極性是否正確。
二、部分燈不亮
解決方法:
1、利用提供的“流水燈測試程序”,測試 LED 是否有虛焊以及損壞的問題,下載好程序,通過程序下載口供電,可以看到每個燈都會流水點亮。如果發(fā)現(xiàn)不亮的燈,檢測 LED 正負極性有無焊接錯,有無虛焊現(xiàn)象,對應(yīng)的限流電阻是否損壞或者焊接良好。
2、排除以上問題后,檢查該 IO 口到單片機管腳的線是否連接完好。如果是斷路,就應(yīng)該是單片機控制該LED的IO口虛焊,補焊單片機即可。
三、旋轉(zhuǎn) LED 旋轉(zhuǎn)時抖動大
解決方法:
1、確定銅柱固定是否和制作說明中的一樣。
2、底盒通過加沙石加重重量。
結(jié)論
在焊接之前先看原理圖以便理解電路工作原理,然后進行電路焊接。由于焊接的器件都比較小,所以焊接過程比較麻煩,經(jīng)常會出現(xiàn)虛焊等情況,所以經(jīng)常進行反復(fù)檢查。且這次設(shè)計存在不足的地方,比如重心偏移,電機旋轉(zhuǎn)時產(chǎn)生抖動,應(yīng)該在設(shè)計時對電路布局進行科學(xué)的分析,調(diào)整重心。
剛開始會遇到很多挫折,并不是說按照原理圖焊接出來,就直接可以正常使用,在這幾日里,我經(jīng)歷了階段性成功的喜悅,測試失敗后的沮喪,陷入困境的急噪,重新投入的振作,這樣的心路歷程是非常寶貴的體會,正是有了大家的幫助終于成功了。同學(xué)們在設(shè)計的過程中互相幫助讓我深刻的體會出團結(jié)就是力量的含義。
部分代碼
#include "NEW_8051.H"
#include "task.h"
#include <intrins.h>
void delay_300ms(void);
bit BIT_timeout=0;
uint i=0,j=0;
uchar Data_L=0xff;
uchar Data_H=0xff;
uchar time_delay=0;
uchar k;
bit Scan_bit=0;
uint uiFontNumber=0;
#define ucNumRows 176
uchar code liushui[1]={0x01};
void DelayUs(uint N)
{
uint x ;
for(x=0;x<=N;x++);
}
void int0() interrupt 0
{
BIT_timeout=1;
}
void start(void)
{
P1=0XFF;
P2=0XFF;
P0=0XFF;
P3=0XFF;
uiFontNumber=((byte_read(0x2000)<<8)+byte_read(0x2001))*16;
Send_data(0X55);
}
void OS_ALLRun(void)
{
if(BIT_timeout)
{
BIT_timeout=0;
Scan_bit=1;
j++;
if( j>uiFontNumber )
{
j=0 ;
}
for(i=j;i<ucNumRows+j;i++)
{
P2=Data_L;
P0=Data_H;
time_delay=1;
while(time_delay)
{
Data_L=byte_read(i*2+0x2002);
Data_H=byte_read(i*2+1+0x2002);
DelayUs(3);
time_delay=0;
}
P0=P2=0XFF;
if(BIT_timeout)
{
return;
}
}
}
if(Scan_bit==0)
{
for(k=0;k<1;k++)
{
P0=~liushui[k];
P2=~liushui[k];
delay_300ms();
}
}
}
void delay_300ms(void)
{
unsigned char a,b,c;
for(c=98;c>0;c--)
for(b=127;b>0;b--)
for(a=17;a>0;a--);
}
#ifdef EN_OS_INT0
IT0 = 1;
EX0 = 1;
#endif
#ifdef EN_OS_INT1
IT1 = 1;
EX1 = 1;
#endif
#ifdef EN_OS_SERIAL
SCON = 0x50;
TMOD|= 0x20;
TH1 = 0xFB;
TL1 = 0xFB;
TR1 = 1;
ES = 1;
PS = 1;
PSH;
#endif
#ifdef EN_OS_TIMER0
TMOD|=0X01;
ET0=1;
TH0=0x0FF;
TL0=0x0F1;
TR0=1;
#endif
#ifdef EN_OS_TIMER1
TMOD|=0X20;
ET1=1;
TH1=0x00;
TL1=0x00;
#endif
#ifdef EN_OS_UART2
S2CON = 0x50;
BRT = 0xfb;
AUXR |= 0x11;
IE2 = 0x01;
#endif
#ifdef EN_OS_PCA0
CMOD = 0x80;
CCON = 0x00;
CL = 0;
CH = 0;
CCAP0H = 0xEF;
CCAP0L = 0xD8;
#endif
#ifdef EN_OS_PCA1
CMOD = 0x80;
CCON = 0x00;
CL = 0;
CH = 0;
CCAP1H =0x01;
CCAP1L =0x68;
#endif
}
void main(void)
{
init();
start();
while(1)
{
OS_ALLRun();
}
}
|
|