一、作品說明 搖搖棒是如今流行的一種玩具,在各種聚會、節日中均見得到它的身影。本設計也追隨著搖搖棒的原理,利用人眼的視覺暫留特性,通過AT89S52單片機對16只高亮度LED發光二極管進行控制, 配合手的左右搖晃就可呈現一幅完整的畫面。 該搖搖棒具有如下功能:1) 顯示 “歡迎使用神奇魔幻搖搖棒!”;2) 顯示 “o(∩_∩)o”微笑圖案;3) 顯示 心形圖案;4) 顯示 “LOVE”;5) 可以通過開關實現轉換,輪流顯示并循環。
二、系統總體設計
1、總體方案比較與論證所謂的“搖搖棒”,其實就是一個循環的LED顯示,利用人的視覺滯留產生靜態顯示的現象。要實現這個目標,就要求延時部分做的比較小,所以采用石英晶體振蕩器。而目前能夠實現這種功能的器件有很多種,不同的類型的器件也能夠很好的完成。本作品本著方便、價格低廉的原則,采用單片機控制,由水銀開關的閉合對單片機產生外部中斷,從而對中斷進行采集。到達一定數量便進行圖象的轉換。整個系統由單片機控制模塊,開關及電源模塊和輸出顯示模塊三個部分構成。2、主要部件原理 (1)單片機控制模塊 用單片機想要控制LED顯示只需要定時輸出就可以,但每個人搖動的速度不一樣,如何準確的并穩定的變換圖案呢?這就需要用到外部中斷。將水銀開關的兩個引腳一端接VCC,一端接GND,這樣的話,當搖棒向一邊運動時LED按照程序編輯好的規律顯示,而向另一邊運動時LED全滅,此時一個周期就會產生一個下跳沿的信號,信號傳遞給單片機的nINT0產生中斷,對中斷的數量計數,當計到10時便轉換顯示的圖案,當依次顯示完后便回到初始狀態進行循環。由于人的視覺滯留時間長達0.1s,所以在每顯示完一列LED后加入一段合適的延時,如5ms,每個字之間加入延時如15ms,這樣,我們就能看到靜態的穩定的字,并且每個字之間是有空隙的。為了讓字能夠在空間的中部顯示,在啟動中斷顯示后延時一段合適的時間,使棒在半圓軌跡的大約1/4處開始顯示,這樣看到的字方向上才比較正。 (2水銀開關 水銀開關,又稱傾側開關,是電路開關的一種,以一接著電極的小巧容器儲存著一小滴水銀,容器中多數注入惰性氣體或真空。 仔細觀察水銀開關,實際上他是一個封閉的玻璃管,里面有兩個分開著的導線和一段水銀球,當玻璃管的平衡位置變化時,水銀球會來回移動,當水銀球移動到兩根導線時,因水銀是金屬-導體,故電路變為通路,此時接收器處于工作狀態;反之,水銀球遠離兩根導線時為斷路,此時接收器處于非工作狀態。本設計采用震動開關代替水銀開關,試驗測試發現,水銀開關多次高頻率的接通斷開后觸點會氧化,容易接觸不良,因此改用下面的震動開關。
3、系統設計 本系統包括單片機控制模塊,開關及電源模塊和輸出顯示模塊三個部分。單片機控制模塊由Keil C進行編寫,實現起來簡單,主要有三部分,主程序、中斷服務部分還有字符點陣。開關及電源模塊采用5V變壓器并配合水銀開關使用。輸出顯示模塊采用16個LED燈,在版上一字排開。
三、硬件設計硬件連接上用水銀開關產生的電平轉換引發中斷,傳遞給單片機,再由單片機調用點陣文件輸出到LED上。AT89S52單片機作為控制器,在它的P0、P2口接有16只以共陽的方式連接的高亮度LED,由單片機輸出低電平點亮。P0口處接上拉電阻RA1。串在LED公共端的二極管D1會產生一定的壓降,用來保護LED。K1是畫面切換開關,用于切換顯示不同內容;S1為水銀開關。系統電源VCC為5V,實際使用時用3節干電池串聯4.5V即可。16只LED發光管作為畫面每一列的顯示,左右搖晃起到了掃描的作用,人眼的視覺暫留現象使得看到的是一幅完整的畫面。水銀開關的作用:棒在搖動時,只能在朝某一方向搖動時顯示,否則會出現鏡像字或鏡像畫面,所以通過接一只水銀開關來控制,使搖搖棒從左向右搖動時將內容顯示出來。
四、軟件設計軟件部分包括主函數程序、中斷服務程序、延時子程序以及四個顯示子程序。軟件設計流程如下: 五、系統調試與分析主要測試單片機的工作情況,能否正常用LED顯示出各圖案,并且記錄各圖案持續的時間和穩定顯示度以及一個循環周期所用的時間。并且檢查LED的發光亮度,使之可以明顯的分辯出來。圖 案穩定程序歡迎使用神奇魔幻搖搖棒較穩定心形較穩定笑臉較穩定LOVE較穩定經過測試,當擺動的幅度和速度適當時,各個畫面均可以明顯的顯示出來。整體來說,本方案設計比較成功。
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
單片機源程序如下:
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int //宏定義
- sbit KEY=P1^0;
- uchar KY; //KY作用在后面說明
- uchar disp; //顯示漢字指針
- uchar pic=0,num=0; //pic為按鍵次數;num為中斷次數
- 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,/*"樂",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,/*"來",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 , 宋體 ) */
- };
- /*****函數聲明*****/
- void display1_ltor(void);
- void display2_ltor(void);
- void display2_rtol(void);
- void display3(void);
- void display4(void);
- /*****n(us)延時子程序*****/
- void DelayUs(uint N)
- {
- uint x;
- for(x=0; x<=N;x++);
- }
- /*****中斷服務程序*****/
- void intersvr0(void) interrupt 0
- {
- ;
- KY=~KY; //每個搖動來回水銀開關會在擺幅兩端分別產生下降沿中斷,只提取其中一次(從左向右搖才顯示)
- if(KY==0)
- {
- num++; //計算中斷次數
- 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個漢字分為3次顯示完(每次顯示4個),每中斷10次切換
- if(disp>2)disp=0;
- DelayUs(5200); //此處延時時間依各硬件差別而各不相同,試著調整使得顯示內容居中即可
- 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];
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
搖搖棒.rar
(8.42 MB, 下載次數: 250)
2018-8-21 10:35 上傳
點擊文件名下載附件
|