一、作品說(shuō)明 搖搖棒是如今流行的一種玩具,在各種聚會(huì)、節(jié)日中均見得到它的身影。本設(shè)計(jì)也追隨著搖搖棒的原理,利用人眼的視覺暫留特性,通過(guò)AT89S52單片機(jī)對(duì)16只高亮度LED發(fā)光二極管進(jìn)行控制, 配合手的左右搖晃就可呈現(xiàn)一幅完整的畫面。 該搖搖棒具有如下功能:1) 顯示 “歡迎使用神奇魔幻搖搖棒!”;2) 顯示 “o(∩_∩)o”微笑圖案;3) 顯示 心形圖案;4) 顯示 “LOVE”;5) 可以通過(guò)開關(guān)實(shí)現(xiàn)轉(zhuǎn)換,輪流顯示并循環(huán)。
二、系統(tǒng)總體設(shè)計(jì)
1、總體方案比較與論證所謂的“搖搖棒”,其實(shí)就是一個(gè)循環(huán)的LED顯示,利用人的視覺滯留產(chǎn)生靜態(tài)顯示的現(xiàn)象。要實(shí)現(xiàn)這個(gè)目標(biāo),就要求延時(shí)部分做的比較小,所以采用石英晶體振蕩器。而目前能夠?qū)崿F(xiàn)這種功能的器件有很多種,不同的類型的器件也能夠很好的完成。本作品本著方便、價(jià)格低廉的原則,采用單片機(jī)控制,由水銀開關(guān)的閉合對(duì)單片機(jī)產(chǎn)生外部中斷,從而對(duì)中斷進(jìn)行采集。到達(dá)一定數(shù)量便進(jìn)行圖象的轉(zhuǎn)換。整個(gè)系統(tǒng)由單片機(jī)控制模塊,開關(guān)及電源模塊和輸出顯示模塊三個(gè)部分構(gòu)成。2、主要部件原理 (1)單片機(jī)控制模塊 用單片機(jī)想要控制LED顯示只需要定時(shí)輸出就可以,但每個(gè)人搖動(dòng)的速度不一樣,如何準(zhǔn)確的并穩(wěn)定的變換圖案呢?這就需要用到外部中斷。將水銀開關(guān)的兩個(gè)引腳一端接VCC,一端接GND,這樣的話,當(dāng)搖棒向一邊運(yùn)動(dòng)時(shí)LED按照程序編輯好的規(guī)律顯示,而向另一邊運(yùn)動(dòng)時(shí)LED全滅,此時(shí)一個(gè)周期就會(huì)產(chǎn)生一個(gè)下跳沿的信號(hào),信號(hào)傳遞給單片機(jī)的nINT0產(chǎn)生中斷,對(duì)中斷的數(shù)量計(jì)數(shù),當(dāng)計(jì)到10時(shí)便轉(zhuǎn)換顯示的圖案,當(dāng)依次顯示完后便回到初始狀態(tài)進(jìn)行循環(huán)。由于人的視覺滯留時(shí)間長(zhǎng)達(dá)0.1s,所以在每顯示完一列LED后加入一段合適的延時(shí),如5ms,每個(gè)字之間加入延時(shí)如15ms,這樣,我們就能看到靜態(tài)的穩(wěn)定的字,并且每個(gè)字之間是有空隙的。為了讓字能夠在空間的中部顯示,在啟動(dòng)中斷顯示后延時(shí)一段合適的時(shí)間,使棒在半圓軌跡的大約1/4處開始顯示,這樣看到的字方向上才比較正。 (2水銀開關(guān) 水銀開關(guān),又稱傾側(cè)開關(guān),是電路開關(guān)的一種,以一接著電極的小巧容器儲(chǔ)存著一小滴水銀,容器中多數(shù)注入惰性氣體或真空。 仔細(xì)觀察水銀開關(guān),實(shí)際上他是一個(gè)封閉的玻璃管,里面有兩個(gè)分開著的導(dǎo)線和一段水銀球,當(dāng)玻璃管的平衡位置變化時(shí),水銀球會(huì)來(lái)回移動(dòng),當(dāng)水銀球移動(dòng)到兩根導(dǎo)線時(shí),因水銀是金屬-導(dǎo)體,故電路變?yōu)橥罚藭r(shí)接收器處于工作狀態(tài);反之,水銀球遠(yuǎn)離兩根導(dǎo)線時(shí)為斷路,此時(shí)接收器處于非工作狀態(tài)。本設(shè)計(jì)采用震動(dòng)開關(guān)代替水銀開關(guān),試驗(yàn)測(cè)試發(fā)現(xiàn),水銀開關(guān)多次高頻率的接通斷開后觸點(diǎn)會(huì)氧化,容易接觸不良,因此改用下面的震動(dòng)開關(guān)。
3、系統(tǒng)設(shè)計(jì) 本系統(tǒng)包括單片機(jī)控制模塊,開關(guān)及電源模塊和輸出顯示模塊三個(gè)部分。單片機(jī)控制模塊由Keil C進(jìn)行編寫,實(shí)現(xiàn)起來(lái)簡(jiǎn)單,主要有三部分,主程序、中斷服務(wù)部分還有字符點(diǎn)陣。開關(guān)及電源模塊采用5V變壓器并配合水銀開關(guān)使用。輸出顯示模塊采用16個(gè)LED燈,在版上一字排開。
三、硬件設(shè)計(jì)硬件連接上用水銀開關(guān)產(chǎn)生的電平轉(zhuǎn)換引發(fā)中斷,傳遞給單片機(jī),再由單片機(jī)調(diào)用點(diǎn)陣文件輸出到LED上。AT89S52單片機(jī)作為控制器,在它的P0、P2口接有16只以共陽(yáng)的方式連接的高亮度LED,由單片機(jī)輸出低電平點(diǎn)亮。P0口處接上拉電阻RA1。串在LED公共端的二極管D1會(huì)產(chǎn)生一定的壓降,用來(lái)保護(hù)LED。K1是畫面切換開關(guān),用于切換顯示不同內(nèi)容;S1為水銀開關(guān)。系統(tǒng)電源VCC為5V,實(shí)際使用時(shí)用3節(jié)干電池串聯(lián)4.5V即可。16只LED發(fā)光管作為畫面每一列的顯示,左右搖晃起到了掃描的作用,人眼的視覺暫留現(xiàn)象使得看到的是一幅完整的畫面。水銀開關(guān)的作用:棒在搖動(dòng)時(shí),只能在朝某一方向搖動(dòng)時(shí)顯示,否則會(huì)出現(xiàn)鏡像字或鏡像畫面,所以通過(guò)接一只水銀開關(guān)來(lái)控制,使搖搖棒從左向右搖動(dòng)時(shí)將內(nèi)容顯示出來(lái)。
四、軟件設(shè)計(jì)軟件部分包括主函數(shù)程序、中斷服務(wù)程序、延時(shí)子程序以及四個(gè)顯示子程序。軟件設(shè)計(jì)流程如下: 五、系統(tǒng)調(diào)試與分析主要測(cè)試單片機(jī)的工作情況,能否正常用LED顯示出各圖案,并且記錄各圖案持續(xù)的時(shí)間和穩(wěn)定顯示度以及一個(gè)循環(huán)周期所用的時(shí)間。并且檢查L(zhǎng)ED的發(fā)光亮度,使之可以明顯的分辯出來(lái)。圖 案穩(wěn)定程序歡迎使用神奇魔幻搖搖棒較穩(wěn)定心形較穩(wěn)定笑臉較穩(wěn)定LOVE較穩(wěn)定經(jīng)過(guò)測(cè)試,當(dāng)擺動(dòng)的幅度和速度適當(dāng)時(shí),各個(gè)畫面均可以明顯的顯示出來(lái)。整體來(lái)說(shuō),本方案設(shè)計(jì)比較成功。
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
單片機(jī)源程序如下:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int //宏定義
- sbit KEY=P1^0;
- uchar KY; //KY作用在后面說(shuō)明
- uchar disp; //顯示漢字指針
- uchar pic=0,num=0; //pic為按鍵次數(shù);num為中斷次數(shù)
- uchar code love[] = {
- 0x80,0x40,0x40,0x40,0x30,0x42,0x1E,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0xFF,0x7F,
- 0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x40,0x00,0x40,0x00,0x00,/*"生",0*/
- /* (16 X 16 , 宋體 ) */
- 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,
- 0x82,0x40,0x82,0x40,0x82,0x40,0xFE,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"日",1*/
- /* (16 X 16 , 宋體 ) */
- 0x00,0x01,0xE0,0x00,0x00,0x00,0xFF,0xFF,0x10,0x00,0x20,0x81,0x08,0x41,0x08,0x31,
- 0x08,0x0D,0xFF,0x03,0x08,0x0D,0x08,0x31,0xF8,0x41,0x00,0x81,0x00,0x81,0x00,0x00,/*"快",2*/
- /* (16 X 16 , 宋體 ) */
- 0x00,0x00,0x00,0x20,0xE0,0x10,0x9C,0x08,0x84,0x06,0x84,0x40,0x84,0x80,0xF4,0x7F,
- 0x82,0x00,0x82,0x00,0x83,0x02,0x82,0x04,0x80,0x08,0x80,0x30,0x00,0x00,0x00,0x00,/*"樂(lè)",3*/
- /* (16 X 16 , 宋體 ) */
- };
- uchar code loveyou[] = {
- 0x00,0x08,0x08,0x08,0x88,0x08,0x88,0x08,0x89,0x08,0x8E,0x08,0x88,0x08,0xF8,0xFF,
- 0x88,0x08,0x8C,0x08,0x8B,0x08,0x88,0x08,0x88,0x08,0x08,0x08,0x00,0x08,0x00,0x00,/*"羊",0*/
- /* (16 X 16 , 宋體 ) */
- 0x00,0x04,0x20,0x04,0x18,0x04,0xC7,0x07,0x44,0x04,0x44,0x04,0x44,0x04,0x44,0x04,
- 0xFC,0xFF,0x44,0x04,0x44,0x04,0x44,0x04,0x44,0x04,0x04,0x04,0x00,0x04,0x00,0x00,/*"年",1*/
- /* (16 X 16 , 宋體 ) */
- 0x20,0x80,0x20,0x80,0x20,0x40,0x20,0x20,0x20,0x10,0x20,0x0C,0x20,0x03,0xFF,0x00,
- 0x20,0x03,0x20,0x0C,0x20,0x10,0x20,0x20,0x20,0x40,0x20,0x80,0x20,0x80,0x00,0x00,/*"大",2*/
- /* (16 X 16 , 宋體 ) */
- 0x08,0x00,0x08,0x00,0x88,0x00,0x88,0xFC,0x88,0x44,0x88,0x44,0x88,0x44,0xFF,0x44,
- 0x88,0x44,0x88,0x44,0x88,0x44,0x88,0xFC,0x88,0x00,0x08,0x00,0x08,0x00,0x00,0x00,/*"吉",3*/
- /* (16 X 16 , 宋體 ) */
- };
- uchar code hehe[] = {
- 0x40,0x80,0x48,0x7E,0x48,0x10,0xFF,0x3F,0x48,0x44,0x48,0x44,0x00,0x40,0xF8,0x4F,
- 0x08,0x44,0x08,0x50,0xFF,0x49,0x08,0x46,0x89,0x49,0x6A,0x5C,0x00,0x40,0x00,0x00,/*"越",0*/
- /* (16 X 16 , 宋體 ) */
- 0x00,0x21,0x08,0x21,0x08,0x11,0x28,0x11,0xC8,0x09,0x08,0x05,0x08,0x03,0xFF,0xFF,
- 0x08,0x03,0x08,0x05,0x88,0x09,0x68,0x11,0x08,0x11,0x08,0x21,0x00,0x21,0x00,0x00,/*"來(lái)",1*/
- /* (16 X 16 , 宋體 ) */
- 0x40,0x80,0x48,0x7E,0x48,0x10,0xFF,0x3F,0x48,0x44,0x48,0x44,0x00,0x40,0xF8,0x4F,
- 0x08,0x44,0x08,0x50,0xFF,0x49,0x08,0x46,0x89,0x49,0x6A,0x5C,0x00,0x40,0x00,0x00,/*"越",2*/
- /* (16 X 16 , 宋體 ) */
- 0x44,0x00,0x54,0xFF,0x54,0x15,0x7F,0x55,0x54,0x95,0x54,0x7F,0x44,0x00,0x00,0x80,
- 0xFE,0x63,0x02,0x1C,0xF2,0x03,0x02,0x7C,0x02,0x80,0xFE,0x83,0x00,0xE0,0x00,0x00,/*"靚",3*/
- /* (16 X 16 , 宋體 ) */
- };
- unsigned char code hanzi[] = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
- /* (8 X 16 , 宋體 ) */
- 0x08,0x02,0x08,0x01,0x89,0x00,0xEE,0xFF,0x98,0x80,0x00,0x43,0x7E,0x20,0x42,0x18,
- 0xC2,0x07,0x42,0x00,0x42,0x00,0xC2,0x3F,0x42,0x40,0x7E,0x40,0x00,0x78,0x00,0x00,/*"祝",1*/
- /* (16 X 16 , 宋體 ) */
- 0x00,0x08,0x00,0x04,0x7F,0x02,0x55,0xFF,0xD5,0x55,0x55,0x55,0x7F,0x55,0x00,0x55,
- 0xFF,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x55,0x00,0x41,0x00,0x00,0x00,0x00,/*"瞿",2*/
- /* (16 X 16 , 宋體 ) */
- 0x82,0x00,0x62,0x00,0x2A,0xF8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xA8,0xFA,0xFB,
- 0x2A,0xA8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xF8,0xA2,0x00,0x62,0x00,0x00,0x00,/*"蕾",3*/
- /* (16 X 16 , 宋體 ) */
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",4*/
- /* (8 X 16 , 宋體 ) */
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
- /* (8 X 16 , 宋體 ) */
- 0x08,0x02,0x08,0x01,0x89,0x00,0xEE,0xFF,0x98,0x80,0x00,0x43,0x7E,0x20,0x42,0x18,
- 0xC2,0x07,0x42,0x00,0x42,0x00,0xC2,0x3F,0x42,0x40,0x7E,0x40,0x00,0x78,0x00,0x00,/*"祝",1*/
- /* (16 X 16 , 宋體 ) */
- 0x00,0x08,0x00,0x04,0x7F,0x02,0x55,0xFF,0xD5,0x55,0x55,0x55,0x7F,0x55,0x00,0x55,
- 0xFF,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x55,0x00,0x41,0x00,0x00,0x00,0x00,/*"瞿",2*/
- /* (16 X 16 , 宋體 ) */
- 0x82,0x00,0x62,0x00,0x2A,0xF8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xA8,0xFA,0xFB,
- 0x2A,0xA8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xF8,0xA2,0x00,0x62,0x00,0x00,0x00,/*"蕾",3*/
- /* (16 X 16 , 宋體 ) */
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",4*/
- /* (8 X 16 , 宋體 ) */
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
- /* (8 X 16 , 宋體 ) */
- 0x08,0x02,0x08,0x01,0x89,0x00,0xEE,0xFF,0x98,0x80,0x00,0x43,0x7E,0x20,0x42,0x18,
- 0xC2,0x07,0x42,0x00,0x42,0x00,0xC2,0x3F,0x42,0x40,0x7E,0x40,0x00,0x78,0x00,0x00,/*"祝",1*/
- /* (16 X 16 , 宋體 ) */
- 0x00,0x08,0x00,0x04,0x7F,0x02,0x55,0xFF,0xD5,0x55,0x55,0x55,0x7F,0x55,0x00,0x55,
- 0xFF,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x55,0x00,0x41,0x00,0x00,0x00,0x00,/*"瞿",2*/
- /* (16 X 16 , 宋體 ) */
- 0x82,0x00,0x62,0x00,0x2A,0xF8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xA8,0xFA,0xFB,
- 0x2A,0xA8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xF8,0xA2,0x00,0x62,0x00,0x00,0x00,/*"蕾",3*/
- /* (16 X 16 , 宋體 ) */
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",4*/
- /* (8 X 16 , 宋體 ) */
- };
- /*****函數(shù)聲明*****/
- void display1_ltor(void);
- void display2_ltor(void);
- void display2_rtol(void);
- void display3(void);
- void display4(void);
- /*****n(us)延時(shí)子程序*****/
- void DelayUs(uint N)
- {
- uint x;
- for(x=0; x<=N;x++);
- }
- /*****中斷服務(wù)程序*****/
- void intersvr0(void) interrupt 0
- {
- ;
- KY=~KY; //每個(gè)搖動(dòng)來(lái)回水銀開關(guān)會(huì)在擺幅兩端分別產(chǎn)生下降沿中斷,只提取其中一次(從左向右搖才顯示)
- if(KY==0)
- {
- num++; //計(jì)算中斷次數(shù)
- switch(pic) //選擇畫面
- {
- case 0:{display1_ltor();}break;
- case 1:{display2_ltor();}break;
- case 2:{display3();}break;
- case 3:{display4();}break;
- default:{display1_ltor();}
- }
- }
- }
- /*****顯示子程序1(漢字)*****/
- void display1_ltor(void)
- {
- uchar i;
- if(num>10){disp++;num=0;} //12個(gè)漢字分為3次顯示完(每次顯示4個(gè)),每中斷10次切換
- if(disp>2)disp=0;
- DelayUs(5200); //此處延時(shí)時(shí)間依各硬件差別而各不相同,試著調(diào)整使得顯示內(nèi)容居中即可
- for(i=0;i<64;i++)
- {
- P0=~hanzi[disp*128+i*2];
- P2=~hanzi[disp*128+i*2+1];
- DelayUs(100);
- }
- }
- /*****顯示子程序2(LOVE)*****/
- void display2_ltor(void)
- {
- uchar i;
- DelayUs(4000);
- for(i=0;i<64;i++)
- {
- P0=~love[i*2];
- P2=~love[i*2+1];
- DelayUs(140);
- }
- }
- /*****顯示子程序3(心形圖案)*****/
- void display3(void)
- {
- uchar i;
- DelayUs(4000);
- for(i=0;i<64;i++)
- {
- P0=~loveyou[i*2];
- P2=~loveyou[i*2+1];
- DelayUs(120);
- }
- }
- /*****顯示子程序4(呵呵o(∩_∩)o圖案)*****/
- void display4(void)
- {
- uchar i;
- DelayUs(4000);
- for(i=0;i<64;i++)
- {
- P0=~hehe[i*2];
- P2=~hehe[i*2+1];
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
搖搖棒.rar
(8.42 MB, 下載次數(shù): 250)
2018-8-21 10:35 上傳
點(diǎn)擊文件名下載附件
|