找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14424|回復: 9
收起左側(cè)

純手工打造搖擺LED時鐘—原理圖+程序

  [復制鏈接]
ID:140725 發(fā)表于 2016-10-11 21:27 | 顯示全部樓層 |閱讀模式
   看到市場上正在流行的時尚商品——搖擺LED 時鐘,感覺非常新穎獨特,正在玩單片機的我,激起了自己也想DIY 一個的沖動。不就是一個流水燈嗎?有什么難的?! 于是,一個單片機項目就這樣開始了。然而動手以后才知道問題并非想象那樣簡單,因沒有任何現(xiàn)成的資料,機械的、電子的和編程的問題一大堆,一個一個需要自己來解決。經(jīng)歷二十多天的苦戰(zhàn)和無數(shù)次的修改與調(diào)試,作品終于完成,基本達到預(yù)先要求。
   現(xiàn)將制作資料整理出來,與廣大DIY 愛好者分享。
一. 整體方案
    本制作是根據(jù)視覺暫留原理, 讓一排8 只LED作往復運動, 在空中呈現(xiàn)八個字符的顯示屏,可顯示數(shù)字或英文字符。開機后先顯示“Welcome!”歡迎字符(見圖1), 再進入時鐘顯示狀態(tài)。顯示屏同時顯示“時” 、“分” 、“秒”信息,用“:”分隔(見圖2)。
   104547nr0injrlgg4rntje.jpg 10455691bbvtdb6xs5bjs9.jpg
圖1 開機畫面                                                                                     圖2 運行狀態(tài)
    顯示分“正常運行”、“調(diào)分”和“調(diào)時” 三種狀態(tài)。當處于調(diào)整狀態(tài)時,調(diào)整的項會閃現(xiàn),以便識別。為此,設(shè)置三個調(diào)整按鍵,一個為“狀態(tài)鍵”,一個為“加法鍵”,一個為“減法鍵”。(見圖3)
104556wqosoowccwshoziq.jpg 104556zfxcjuuqncw4vnvj.jpg
圖3 按鍵的設(shè)置                                                                              圖4 音圈電機組件
    搖棒的動力部分采用從廢舊硬盤拆下的音圈電機(見圖4),驅(qū)動采用直流電機驅(qū)動方式。
    結(jié)構(gòu)方面,將音圈電機直接安裝在萬用板上,將萬用板的四周用四根螺柱與一透明有機板結(jié)合成一體,構(gòu)成支撐搖棒底座。(見圖5, 圖6)。
104556dmay7rb7jk54uumj.jpg 104556j7j7h8at2772m228.jpg
圖5 萬用板與有機板構(gòu)成底座                                                        圖6 底座側(cè)面
二. 實作要點
1. 主板的結(jié)構(gòu)布局見圖7。
104556agljuazw979kakbk.jpg 104556f5wn0nntdrxt00hk.jpg
圖7 主板布局                                                                                    圖8 搖棒上的LED
2.LED 的焊接,將LED 兩腳跨接在電路板兩端的方式進行焊接。使LED 緊密排列在一起。
3.搖棒上的LED 與主板上的信號用柔性排線連接,音圈電機供電占2 位,LED 信號傳輸占9 位,所以至少要11 位的排線。(見圖9)
1045567qpex0vkd6jg01pr.jpg 104559oj1zjjcj7d71yj8n.jpg
圖9 排線與拉簧                                                                               圖10 拉簧
4.為保持搖棒的平衡, 在搖棒接近旋轉(zhuǎn)軸的兩端加裝兩只拉簧,這兩只拉簧的規(guī)格盡量保持一致,彈性強弱要適中,最好可多找?guī)追N規(guī)格的試試。(圖9,圖10)
5.采用驅(qū)動直流電機正反轉(zhuǎn)的方式,驅(qū)動音圈電機來回擺動。讓電機正、反轉(zhuǎn)的方法很多,最典型的是H 橋電路驅(qū)動,H 橋電路原理見圖11,常見的是用三級管代替圖中的開關(guān)。
104600qm2wm3cq6dw72n93.jpg
圖11 H 橋驅(qū)動原理
    為了簡化電路,最好采用H 橋功能的集成電路。這種IC 很多,比如象TA7257,TA8429H,L6203 等,這里用的是三菱公司的M54544AL(見圖12)。IC 各腳定義見圖13。
104600mjqe0j0zmzmb8j5k.jpg
圖12 電機驅(qū)動IC
104600xs87p68gpcz1181f.jpg
圖13 M56544AL 各腳定義
6.電原理圖見圖14。
104600h0hxu4c3ssd435hb.jpg.thumb.jpg
圖14 電原理圖
7.完成圖見圖15
104600sgwp2zec2eh6we0e.jpg.thumb.jpg
圖15 完成圖
三. 軟件設(shè)計
1. 搖棒的啟動
    為了使搖棒從靜止狀態(tài)過度到正常運行狀態(tài),在正式顯示前加一啟動程序。其實質(zhì)就是逐漸加快驅(qū)動的頻率,一直到搖棒正常擺動為止。通過下面的代碼實現(xiàn)
do {
mm++;
Delay(120+mm);
put1=~put1; put2=~put2;
}while(mm<60);
Delay(20); //根據(jù)實際情況確定延時值
2. 秒閃現(xiàn)的實現(xiàn):數(shù)字或字符的閃現(xiàn)是通過變量Ms 和數(shù)組w[]實現(xiàn)的,如需要八位字符中的間的第4 位閃現(xiàn),則w[3]=1。這是通過全局變量Ms 在void timer0(void)函數(shù)中每隔一秒改變一次狀態(tài)(0 或1),打開或關(guān)閉顯示。
if(Ms*w[ii-3]==1) P2=0xff; else P2=~ASCIIDOC[v[ii]*6+jj]; //正向顯示
if(Ms*w[10-ii]==1) P2=0xff; else P2=~ASCIIDOC[v[13-ii]*6+5-jj]; //反向顯示
3. 調(diào)試中發(fā)現(xiàn),顯示屏上的字符并不是一樣寬的(見圖16),仔細分析是由于搖棒在運動中,一直受力,而且所受的力是隨時變化的。為方便精確調(diào)整顯示,特別作了一個顯示中斷表Tr[],改變顯示LED 的時間段,協(xié)調(diào)顯示效果。
1046048toikiv2z56ri1ir.jpg
圖16 調(diào)整前的顯示
4. 按鍵去抖程序
    按鍵的去抖采用軟件編程實現(xiàn),其方法是當檢測到按鍵的接口出現(xiàn)低電平后,隔一段時間再檢測,如還是低電平,則確認為有效,否則無效。具體的程序是通過函數(shù)unsigned char ChKey(bit Key)完成的。
5. 顯示同步
    因沒有位置傳感器,顯示同步完全靠時鐘中斷來確定。這樣就有一個問題,音圈電機的驅(qū)動信號在什么時刻改變,顯示才能保持在中間,并能保證正反顯示能很好地重合。經(jīng)實際觀察, 音圈電機的驅(qū)動信號在顯示中部, 要根據(jù)具體情況細調(diào)。由程序中的變量Ta 調(diào)試確定。
6. 完整C51 程序代碼
請見附件
四.調(diào)試方法
雖說是個機電一體的制作,但調(diào)試過程并不復雜。
1. 機械部分的調(diào)整主要是兩只拉簧, 要盡量保證兩邊受力一致,讓搖棒靜態(tài)時保持在豎直狀態(tài)。
2. 軟件部分,先將void timer1(void)函數(shù)中的“Ti=-Tr[ii*6+jj];”這段程序刪除,試著讓Ti 取一常數(shù)值(大約-2000 左右)看顯示效果(搖棒擺動的幅度),一直到滿意為止,這時正反顯示可能沒有重合,接著試Ta 的取值,范圍在42 到50 之間,使正反顯示重合為止。最后一步就是調(diào)整顯示的不均勻性,將“Ti=-Tr[ii*6+jj];”這段程序恢復回來,試著改變Tr[]表中數(shù)組元素的值,并保證表中的元素的平均值為開始Ti 取得的值,讓顯示的每個字符寬度一致為止。
五.結(jié)語
    本制作電路簡單,其原理實質(zhì)就是LED 流水燈,而關(guān)鍵的音圈電機也很容易找到,很適合剛?cè)腴T的單片機愛好者制作。制作還有發(fā)揮的地方,
1. 添加時鐘IC,使顯時更精準,而且不怕掉電;
2. 加裝位置傳感器,增加顯示的穩(wěn)定性;
3. 增添搖控功能,使調(diào)整更方便。


程序:
純手工打造搖擺LED時鐘.rar (2.37 KB, 下載次數(shù): 43)

回復

使用道具 舉報

11#
無效樓層,該帖已經(jīng)被刪除
ID:77589 發(fā)表于 2025-6-30 16:40 | 顯示全部樓層
確實可以,感覺機械部分做起來有些麻煩
回復

使用道具 舉報

ID:1153018 發(fā)表于 2025-6-6 23:32 | 顯示全部樓層
六六六
回復

使用道具 舉報

ID:79544 發(fā)表于 2025-6-4 09:20 | 顯示全部樓層
感謝分享,學習了。。。。。。。。!
回復

使用道具 舉報

ID:525478 發(fā)表于 2025-5-26 14:27 | 顯示全部樓層
POV 搖擺顯示LED 鐘C51 程序
周正華編
2008.3.19
*/
#include <reg52.h>
/*硬件端口定義*/
sbit set0=P0^1;
sbit set1=P0^0;
sbit set2=P0^2;
sbit put1=P3^6;
sbit put2=P3^7;
/*時鐘用數(shù)組*/
unsigned char BUFFER[]={0,0,0,0};
unsigned char maxnum[]={59,23};
/*顯示數(shù)組*/
unsigned int v[14];
unsigned int w[8];
/*顯示中斷表*/
int code Tr[]={
2000,2000,2000,2000,2000,2000,
2000,2000,2000,2000,2000,2000,
2000,2000,2000,2000,2000,2000,
2550,2500,2450,2400,2350,2300,
2250,2200,2150,2100,2050,2000,
1950,1900,1850,1800,1750,1700,
1650,1600,1550,1500,1450,1400,
1400,1450,1500,1550,1600,1650,
1700,1750,1800,1850,1900,1950,
2000,2050,2100,2150,2200,2250,
2300,2350,2400,2450,2500,2550,
2000,2000,2000,2000,2000,2000,
2000,2000,2000,2000,2000,2000,
2000,2000,2000,2000,2000,2000,
};
/*字符字模*/
unsigned char code ASCIIDOC[] = // ASCII
{
0x7C,0x8A,0x92,0xA2,0x7C,0x00, // -0-00
0x00,0x42,0xFE,0x02,0x00,0x00, // -1-01
0x46,0x8A,0x92,0x92,0x62,0x00, // -2-02
0x84,0x82,0x92,0xB2,0xCC,0x00, // -3-03
0x18,0x28,0x48,0xFE,0x08,0x00, // -4-04
0xE4,0xA2,0xA2,0xA2,0x9C,0x00, // -5-05
0x3C,0x52,0x92,0x92,0x8C,0x00, // -6-06
0x80,0x8E,0x90,0xA0,0xC0,0x00, // -7-07
0x6C,0x92,0x92,0x92,0x6C,0x00, // -8-08
0x62,0x92,0x92,0x94,0x78,0x00, // -9-09
0x00,0x00,0x00,0x00,0x00,0x00, // - -10
0x00,0x00,0xFA,0x00,0x00,0x00, // -!-11
0x04,0x08,0x10,0x20,0x40,0x00, // -/-12
0x00,0x6C,0x6C,0x00,0x00,0x00, // -:-13
0x3E,0x48,0x88,0x48,0x3E,0x00, // -A-14
0xFE,0x92,0x92,0x92,0x6C,0x00, // -B-15
0x7C,0x82,0x82,0x82,0x44,0x00, // -C-16
0xFE,0x82,0x82,0x82,0x7C,0x00, // -D-17
0xFE,0x92,0x92,0x92,0x82,0x00, // -E-18
0xFE,0x90,0x90,0x90,0x80,0x00, // -F-19
0x7C,0x82,0x8A,0x8A,0x4E,0x00, // -G-20
0xFE,0x10,0x10,0x10,0xFE,0x00, // -H-21
0x00,0x82,0xFE,0x82,0x00,0x00, // -I-22
0x04,0x02,0x82,0xFC,0x80,0x00, // -J-23
0xFE,0x10,0x28,0x44,0x82,0x00, // -K-24
0xFE,0x02,0x02,0x02,0x02,0x00, // -L-25
0xFE,0x40,0x30,0x40,0xFE,0x00, // -M-26
0xFE,0x20,0x10,0x08,0xFE,0x00, // -N-27
0x7C,0x82,0x82,0x82,0x7C,0x00, // -O-28
0xFE,0x90,0x90,0x90,0x60,0x00, // -P-29
0x7C,0x82,0x8A,0x84,0x7A,0x00, // -Q-30
0xFE,0x90,0x98,0x94,0x62,0x00, // -R-31
0x64,0x92,0x92,0x92,0x4C,0x00, // -S-32
0x80,0x80,0xFE,0x80,0x80,0x00, // -T-33
0xFC,0x02,0x02,0x02,0xFC,0x00, // -U-34
0xF8,0x04,0x02,0x04,0xF8,0x00, // -V-35
0xFE,0x04,0x18,0x04,0xFE,0x00, // -W-36
0xC6,0x28,0x10,0x28,0xC6,0x00, // -X-37
0xC0,0x20,0x1E,0x20,0xC0,0x00, // -Y-38
0x86,0x8A,0x92,0xA2,0xC2,0x00, // -Z-39
0x24,0x2A,0x2A,0x1C,0x02,0x00, // -a-40
0xFE,0x14,0x22,0x22,0x1C,0x00, // -b-41
0x1C,0x22,0x22,0x22,0x10,0x00, // -c-42
0x1C,0x22,0x22,0x14,0xFE,0x00, // -d-43
0x1C,0x2A,0x2A,0x2A,0x10,0x00, // -e-44
0x10,0x7E,0x90,0x90,0x40,0x00, // -f-45
0x19,0x25,0x25,0x25,0x1E,0x00, // -g-46
0xFE,0x10,0x20,0x20,0x1E,0x00, // -h-47
0x00,0x00,0x9E,0x00,0x00,0x00, // -i-48
0x00,0x01,0x11,0x9E,0x00,0x00, // -j-49
0xFE,0x08,0x14,0x22,0x02,0x00, // -k-50
0x00,0x82,0xFE,0x02,0x00,0x00, // -l-51
0x1E,0x20,0x1E,0x20,0x1E,0x00, // -m-52
0x20,0x1E,0x20,0x20,0x1E,0x00, // -n-53
0x1C,0x22,0x22,0x22,0x1C,0x00, // -o-54
0x3F,0x24,0x24,0x24,0x18,0x00, // -p-55
0x18,0x24,0x24,0x24,0x3F,0x00, // -q-56
0x20,0x1E,0x20,0x20,0x10,0x00, // -r-57
0x12,0x2A,0x2A,0x2A,0x24,0x00, // -s-58
0x20,0xFC,0x22,0x22,0x24,0x00, // -t-59
0x3C,0x02,0x02,0x3C,0x02,0x00, // -u-60
0x38,0x04,0x02,0x04,0x38,0x00, // -v-61
0x3C,0x02,0x3C,0x02,0x3C,0x00, // -w-62
0x22,0x14,0x08,0x14,0x22,0x00, // -x-63
0x39,0x05,0x05,0x09,0x3E,0x00, // -y-64
0x22,0x26,0x2A,0x32,0x22,0x00, // -z-65
};[!--empirenews.page--]
unsigned int Ti;
unsigned char ii,jj,mm, ff ,TZ ,Ms ,Ta;
/*延時程序*/
void Delay(unsigned int msec)
{
unsigned int x,y;
for(x=0; x<=msec;x++)
{
for(y=0;y<=110;y++);
}
}
/*鍵盤去抖處理函數(shù)*/
unsigned char ChKey(bit Key)
{
if(Key==0){
Delay(100);
if(Key==0) return(1);
}
}
/*定時中斷1 處理(時鐘)函數(shù)*/
void timer0(void) interrupt 1 using 1
{
TH0=-(50000/256);
TL0=-(50000%256);
TR0=1;
BUFFER[0]=BUFFER[0]+1;
}
/*定時中斷2 處理(LED 驅(qū)動和音圈驅(qū)動)函數(shù)*/
void timer1(void) interrupt 3 using 1
{
TH1=Ti/256; TL1=Ti%256;
if((ii*6+jj)==Ta) {put1=~put1;put2=~put2;}; //音圈電機驅(qū)動輸出
if(ff==1){
if(Ms*w[ii-3]==1) P2=0xff; else P2=~ASCIIDOC[v[ii]*6+jj]; //正向顯示
}
else {
if(Ms*w[10-ii]==1) P2=0xff; else P2=~ASCIIDOC[v[13-ii]*6+5-jj]; //反向顯示
}
jj++;
if(jj>5) {ii++; jj=0;}
if(ii>13) {ii=0;ff=!ff;}
Ti=-Tr[ii*6+jj]; //讀顯示中斷表
}
/*主程序*/
void main(void)
{
//變量初始化
Ms=0;
ff=0;
Ta=46; //正反顯一致性調(diào)整, 取值范圍在42~50 之間, 根據(jù)實際確定
put1=0;put2=1;
//中斷初始化
TMOD=0x11;
TH0=-5000/256; TL0=-5000%256;
TR0=1;ET0=1;
TH1=-2000/256; TL1=-2000%256;
TR1=1;ET1=1;
//十四個字符中前三個和后三個不顯(不用)
v[0]=10;
v[1]=10;
v[2]=10;
v[11]=10;
v[12]=10;
v[13]=10;
/*搖擺棒初始啟動*/
do {
mm++;
Delay(120+mm);
put1=~put1; put2=~put2;
}while(mm<60);
Delay(20);
/*啟動顯示*/
ii=0;jj=0;
EA=1;
/*正式運行*/
for(;;){
v[3]=36;v[4]=44;v[5]=51;v[6]=42;v[7]=54;v[8]=52;v[9]=44;v[10]=11; //顯示歡迎
Delay(6000);
v[3]=10;v[4]=10;v[5]=10;v[6]=10;v[7]=10;v[8]=10;v[9]=10;v[10]=10; //關(guān)閉顯示
Delay(600);
v[3]=0;v[4]=0;v[5]=13;v[6]=0;v[7]=0;v[8]=13;v[9]=0;v[10]=0; //顯示時鐘初始狀
態(tài)
/*進入時鐘狀態(tài)*/
while(1){
//時鐘處理
if (BUFFER[0]>21){ //進位到秒
BUFFER[0]=0; BUFFER[1]=BUFFER[1]+1;
Ms=!Ms;
if (BUFFER[1]==60){ //進位到分
BUFFER[1]=0;BUFFER[2]=BUFFER[2]+1;
if (BUFFER[2]==60){
BUFFER[2]=0;BUFFER[3]=BUFFER[3]+1; //進位到時
if (BUFFER[3]==24) BUFFER[3]=0;
}
}
}
//將顯示內(nèi)容送顯示緩沖區(qū)
v[9]=BUFFER[1]/10;
v[10]=BUFFER[1]-v[9]*10;
v[6]=BUFFER[2]/10;
v[7]=BUFFER[2]-v[6]*10;
v[3]=BUFFER[3]/10;
v[4]=BUFFER[3]-v[3]*10;
//鍵盤處理
if(ChKey(set0)==1){ //模式鍵
Ms=1; //秒閃開
if(TZ<2) TZ++; else TZ=0; //三種狀態(tài)循環(huán)轉(zhuǎn)換
switch(TZ){
case 0:w[0]=0;w[1]=0;w[2]=0;w[3]=0;w[4]=0;w[5]=0;w[6]=0;w[7]=0;break;
case 1:w[0]=0;w[1]=0;w[2]=0;w[3]=1;w[4]=1;w[5]=0;w[6]=0;w[7]=0;break;
case 2:w[0]=1;w[1]=1;w[2]=0;w[3]=0;w[4]=0;w[5]=0;w[6]=0;w[7]=0;break;
}
Ms=0; //秒閃關(guān)
};
Delay(80);
if(ChKey(set1)==1){ if(BUFFER[TZ+1]<maxnum[TZ-1]) BUFFER[TZ+1]++; else
BUFFER[TZ+1]=0;Delay(300);};
//鍵盤"+"
if(ChKey(set2)==1){ if(BUFFER[TZ+1]>0) BUFFER[TZ+1]--; else
BUFFER[TZ+1]=maxnum[TZ-1];Delay(300);};
//鍵盤"-"
Delay(80);
}
}
}
回復

使用道具 舉報

ID:798859 發(fā)表于 2020-7-7 09:50 | 顯示全部樓層
真心不錯 感謝分享
回復

使用道具 舉報

ID:798859 發(fā)表于 2020-7-7 09:39 | 顯示全部樓層
這個牛批,感謝分享
回復

使用道具 舉報

ID:196311 發(fā)表于 2017-5-28 23:25 | 顯示全部樓層
收藏備用,謝謝樓主
回復

使用道具 舉報

ID:205161 發(fā)表于 2017-5-26 17:26 來自觸屏版 | 顯示全部樓層
也想做   贊
回復

使用道具 舉報

ID:142493 發(fā)表于 2016-10-12 20:25 | 顯示全部樓層
這個可以,新手膜拜中
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表