第一章 緒言
隨著科學技術的發展,LED顯示屏得到廣泛的應用,但大部分的顯示屏只能在平面顯示,不能滿足人們的需求,所以LED旋轉屏的想法正好能填補這個空缺。LED旋轉屏利用人的視,覺暫留效應,通過高速旋轉的LED燈陣列,形成一個360環形畫面,創造立體效果,不管人站在那個角度都能看到顯示的內容。該應用實用性好,制作相對簡單,而且能節省LED燈的使用。
本設計以STC89C52單片機為核心最大限度的利用單片機的資源LED驅動芯片緊密。系統以STC89C52單片機作為核心,控制器件通過控制電機保持一定的速度穩定旋轉帶動單排LED旋轉形成掃描顯示屏,單片機根據LED旋轉的速度控制LED發光或熄滅,在視覺上形成平面圖形點陣的顯示效果。
第二章 方案設計第一節 設計任務與要求
一、設計任務
基于視覺暫留原理,利用了POV“視覺暫留”原理,在這短暫的時間段里,當前面的視覺形象還沒有完全消退,新的視覺形象又繼續產生時,就會在人的大腦里形成連貫的視覺錯覺。利用高速旋轉中控制LED亮滅,設計一種旋轉式LED顯示屏。在穩定旋轉地載體上安裝16個貼片發光二極管。靜止時,各個發光二極管等間距排布,隨著掃描速度的加快,不斷掃描出預設的文字。
二、設計要求
1、底座供電部分,底座為主板供電;
2、主板旋轉部分,主板負責文字旋轉。
3、制作完成后,載入程序,調試并分析結果。
第二節 任務分析
一、LED 旋轉控制
用電動機帶動LED轉動,用單片機控制LED點亮和熄滅來形成文字的,這些文字一看也去,就象懸浮在空中的。
旋轉LED旋轉起來是一個圓,那么就需要有一個傳感器來判斷起點位置,這個起點檢測非常重要,單片機就是根據這個起點來判斷是否要開始顯示數據的。如果起點檢測不到單片機就不開始顯示。我選用紅外對管,單片機控制LED燈使用紅外發射,在底座上有一個紅外發射管,這個紅外發射管不斷地向旋轉的主電路板發射紅外線。
二、底座供電部分
供電模塊電路設計的完善,采用無線輸電技術,利用電磁轉換原理,先將電流變成磁場,然后再將磁場變成電流給電路供電。
三、主板旋轉部分
主板電路設計的完善,核心系統的選擇,用于旋轉起點檢測的傳感器選用。
第三節 方案框圖
基于以上設計方案與要求所設計方案框圖如下:主控電路,電源部分,程序端口,穩壓濾波電路,紅外接收管,LED顯示部分。
圖 2-1 方案框圖
第三章 硬件電路設計第一節 主控電路設計
一、STC89C52簡介
單片機是指一個集成在一塊芯片上的完整計算機系統。盡管他的大部分功能集在一塊小芯片上,但是它具有一個完整計算機所需要的大部分部件: CPU、內存、內部和外部總線系統,目前大部分還會具有外存。同時集成諸如通訊接口、定時器,實時時鐘等外圍設備而STC89C52是一種可編程可檫除只讀存儲器的低電壓,高性能的微處理器,俗稱單片機。
二、單片機最小系統
用單片機控制LED點亮和熄滅來形成文字。如圖3-1所示:
圖 3-1 主控電路
第二節 電源電路設計
無線供電方式,經過實踐論證,功率很有限,需要改進的地方還很多,電路原理是把直流轉成交流,然后經過初級線圈 ,最后次級線圈感應得電,經過整流濾波后給旋轉部分供電,直流轉交流部分電路是一個自激震蕩電路。將直流電轉化成高頻交流信號,通過線圈將交流信號輸送到旋轉的主電路板上,主電路板上利用5.1v的穩壓二極管,將接收到的交流信號變成5.1v直流電,通過220uF的電解電容濾波,供給單片機,使單片機能正常工作。如圖3-2所示:
圖 3-2 無線供電小板
第三節 LED顯示電路設計
一、字幕顯示設置
如何讓一列燈不斷的送數據實現一個文字的顯示呢?這個我們就要了解文字取模的原理了,這里以PC2002字幕軟件為例,取一個16*16的中文字,見字幕選項設置:
圖 3-3 文字取模設置圖
二、LED顯示電路
電動機帶動LED轉動,用單片機控制LED點亮和熄滅來形成文字;一個紅外發射管,一個紅外接收管,板上的紅外接受管每轉動一圈就會導通一次,讓單片機知道從哪一點開始播放字符;無線供電部分通過線圈向主板供電,相當于變壓器的工作原理。
圖 3-4 LED顯示屏原理圖
第四節 穩壓濾波電路設計
由于電源是從電機中引出來的所以需要通過整流濾波才能為系統供電。如圖3-5所示:
圖 3-5 穩壓整流濾波電路
第五節 其它部分電路設計
一、程序端口
下載程序,通過程序來來實現想要達到的效果。如圖3-6所示:
圖 3-6 程序端口
二、紅外接收電路部分
判斷起點位置,起點檢測,根據紅外接收管電路來判斷是否要開始顯示。如圖3-7所示:
圖 3-7 紅外接收管電路
第四章 軟件設計
當程序開始運行的時候,首先就是要對程序進行初始化,主要作用就是讓程序按照我們所設計的初始值去運行。初始化之后,讓單片機知道從哪一點開始播放字符,讓LED點亮和熄滅來形成文字;一個紅外發射管,一個紅外接收管,板上的紅外接受管每轉動一圈就會導通一次,對數據進行校對,執行完成后返回到初始化操作之后重復以上的操作。
圖4-1 軟件設計流程圖
第五章 系統調試第一節 問題及解決方法
一、旋轉 LED 上電后,電機旋轉,但是無任何反應。
解決方法:
1、檢查了供電板上元件的位置以及正負極性。
2、檢查元件有無虛焊現象。
3、連接電源后,測量初級線圈電壓。用萬用表交流檔 20V 測試,有 6-9V 的交流電壓輸出是正常。如不正常,檢查輸入電源是否是 5V。
4、檢查旋轉主板 4 個 4148 焊接位置以及正負極性是否正確。
二、部分燈不亮
解決方法:
1、利用提供的“流水燈測試程序”,測試 LED 是否有虛焊以及損壞的問題,下載好程序,通過程序下載口供電,可以看到每個燈都會流水點亮。如果發現不亮的燈,檢測 LED 正負極性有無焊接錯,有無虛焊現象,對應的限流電阻是否損壞或者焊接良好。
2、排除以上問題后,檢查該 IO 口到單片機管腳的線是否連接完好。如果是斷路,就應該是單片機控制該LED的IO口虛焊,補焊單片機即可。
三、旋轉 LED 旋轉時抖動大
解決方法:
1、確定銅柱固定是否和制作說明中的一樣。
2、底盒通過加沙石加重重量。
結論
在焊接之前先看原理圖以便理解電路工作原理,然后進行電路焊接。由于焊接的器件都比較小,所以焊接過程比較麻煩,經常會出現虛焊等情況,所以經常進行反復檢查。且這次設計存在不足的地方,比如重心偏移,電機旋轉時產生抖動,應該在設計時對電路布局進行科學的分析,調整重心。
剛開始會遇到很多挫折,并不是說按照原理圖焊接出來,就直接可以正常使用,在這幾日里,我經歷了階段性成功的喜悅,測試失敗后的沮喪,陷入困境的急噪,重新投入的振作,這樣的心路歷程是非常寶貴的體會,正是有了大家的幫助終于成功了。同學們在設計的過程中互相幫助讓我深刻的體會出團結就是力量的含義。
部分代碼
#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();
}
}
|