# 創新設計16個LED燈的搖搖棒,可顯示英文、圖形及漢字
# 僅需5種元器件(單片機、LED、導線、電池和塑料殼),讓DIY簡單、快速
# 往返雙程掃描,慢速搖動也可清晰顯示
# 敲擊字幕切換功能,無需按鍵操作
# 在軟件上有很大的升級空間(包括雙色顯示、LED測光等)
-----------------------------------------------------------------------
[注意事項]
-----------------------------------------------------------------------
# HEX文件燒寫時需選擇“內部RC時鐘”
# 本制作采用STC12C5A60S2單片機,不可以用其他型號單片機替代
# 慣性開關在制作時注意靜止時開關柄到左右觸點間的距離應盡量相等
# 本制作無開關,不用時需取下電池或在電池間塞入絕緣紙片
1555586149hxzccgxtgvct.png.thumb.jpg (205.26 KB, 下載次數: 51)
下載附件
2016-9-8 14:55 上傳
1559027pgzo2gtm9pszpm9.jpg.thumb.jpg (37.59 KB, 下載次數: 69)
下載附件
2016-9-8 14:55 上傳
155601kqeqzrbh9u6qekyb.png.thumb.jpg (197.43 KB, 下載次數: 61)
下載附件
2016-9-8 14:55 上傳
單片機采用STC12C5A60S2(1pcs)
155605n57nr7mvpb3tdzrj.png.thumb.jpg (175.71 KB, 下載次數: 58)
下載附件
2016-9-8 14:55 上傳
- 0805型貼片式LED燈(16pcs)
155607i4zvql445z2l2fq4.png.thumb.jpg (192.53 KB, 下載次數: 64)
下載附件
2016-9-8 14:55 上傳
- CR2032鈕扣電池(2pcs)
155613b6lqaz2lilgw6zzq.png.thumb.jpg (185.33 KB, 下載次數: 65)
下載附件
2016-9-8 14:55 上傳
- 具有一定彈性的導線和廢棄的元器件引腳
155355pqs9en88knsdsmq9.png.thumb.jpg (181.22 KB, 下載次數: 58)
下載附件
2016-9-8 14:55 上傳
- 用來包裝DIP40腳單片機的塑料殼(1pcs)
155358p3pvvz8ksttpphze.png.thumb.jpg (201.82 KB, 下載次數: 43)
下載附件
2016-9-8 14:55 上傳
- 確保單片機可以放入并有較大余地
155405iiv228xmt8272trk.png.thumb.jpg (198.57 KB, 下載次數: 57)
下載附件
2016-9-8 14:55 上傳
- 用鉗子將P0、P2接口所在一側的引腳全部向外彎折
1554087qb1zp12n6h2oirz.png.thumb.jpg (186.17 KB, 下載次數: 74)
下載附件
2016-9-8 14:55 上傳
- 目的是保證將單片機放入塑料殼時不會左右亂竄
155642yl3qqrb5zq5wy0ge.png.thumb.jpg (154.43 KB, 下載次數: 49)
下載附件
2016-9-8 14:55 上傳
- 彎折時盡量不斷放入塑料殼中比對
- 擦拭彎折后的引腳表面 確保無污物可以順利上錫
155422ic2lcf46ewaoaz22.png.thumb.jpg (198.96 KB, 下載次數: 70)
下載附件
2016-9-8 14:55 上傳
- 用攝子取出貼片LED燈并焊接在單片機引腳上
155428jvnft2q8vjdj87tt.png.thumb.jpg (195.78 KB, 下載次數: 59)
下載附件
2016-9-8 14:55 上傳
- 從P2.0引腳開始焊接 左邊焊LED負極(P2.0負極、P2.1正極)
155432rn2ncn2fxno4e2nc.png.thumb.jpg (206.46 KB, 下載次數: 61)
下載附件
2016-9-8 14:55 上傳
- 依次焊接16個LED燈到P0.2引腳為止
15543622w5re22d1xw2ga2.png.thumb.jpg (215.76 KB, 下載次數: 61)
下載附件
2016-9-8 14:55 上傳
- 將一支廢棄元器件引腳對折并焊接在彈性導線上
155443960zddz9mdzj9dl0.png.thumb.jpg (225.73 KB, 下載次數: 42)
下載附件
2016-9-8 14:55 上傳
- 彈性導線的另一端焊接在單片機的第20腳上(GND) 注意掌握導線長度
155448uq6rukta7iio98s9.png.thumb.jpg (206.99 KB, 下載次數: 46)
下載附件
2016-9-8 14:55 上傳
- 將P1.3引腳彎折至芯片底部 再用廢棄元器件引腳向上延長P1.2引腳
1554536d9aoupuxpbjj56o.png.thumb.jpg (220.29 KB, 下載次數: 42)
下載附件
2016-9-8 14:55 上傳
- 使之形成慣性開關的兩個觸點 再把P1.4引腳略向內彎曲形成側撞觸點
1554564jqe9ij3vjkjji43.png.thumb.jpg (174.23 KB, 下載次數: 59)
下載附件
2016-9-8 14:55 上傳
- 把一支廢棄的元器件引腳焊接在單片機的第40腳上(VCC)
1555006drhvaf9lvlvnvv9.png.thumb.jpg (191.87 KB, 下載次數: 66)
下載附件
2016-9-8 14:55 上傳
- 再取一段導線將一端焊接在單片機的第20腳上(GND)
1555158f36k6fuz6m7m77m.png.thumb.jpg (201.77 KB, 下載次數: 62)
下載附件
2016-9-8 14:55 上傳
- 導線另一端的接頭處掛大量的錫
155519888l2lsykackycqu.png.thumb.jpg (202.12 KB, 下載次數: 54)
下載附件
2016-9-8 14:55 上傳
- 用膠帶固定導線 使之在搖動時不易亂竄
155522sjjdx47j727duy8l.png.thumb.jpg (177.67 KB, 下載次數: 59)
下載附件
2016-9-8 14:55 上傳
- 此時在單片機一側形成了電源的正、負極接口
155529yp7ojwtyoafwjj2r.png.thumb.jpg (251.94 KB, 下載次數: 62)
下載附件
2016-9-8 14:55 上傳
將鈕扣電池重疊后放入正、負極接口處
1555334lm4jm6h2k5b4i5z.png.thumb.jpg (224.59 KB, 下載次數: 50)
下載附件
2016-9-8 14:55 上傳
- 最后將單片機連同電池一并塞進塑料殼中
155545x4rqgz08zixhq8g0.png.thumb.jpg (209.66 KB, 下載次數: 52)
下載附件
2016-9-8 14:55 上傳
- 用透明膠帶把開口處包好 - 因搖動時的離心力向上所以單片機及電池不會向下滑落 無需設計下方固定
1555481yznu4l9upkmmtny.png.thumb.jpg (186.89 KB, 下載次數: 56)
下載附件
2016-9-8 14:55 上傳
0.png (107.86 KB, 下載次數: 48)
下載附件
2016-9-8 14:57 上傳
- /*********************************************************************************************
- 程序名: SHOOK16搖搖棒控制程序
- 編寫人: 杜洋
- 硬件支持: STC12C5A60S2 內部RC時鐘
- 接口說明: 單片機P0、P2側并行排列16個貼片LED(自P2.0開始(-))
- 修改日志:
- [TEST測試版]
- 1-200911122244 在主函數寫入簡單程序測試慣性開關是否正常,通過測試并備份。(備)
- 2-200911130112 往返搖動雙重顯示實驗成功,目前已經達到搖搖棒功能的基本要求。(備)
- [V1正式版]
- 3-200911130309 加入了3個字幕內容,通過敲擊切換字幕。(備)
- 4-200911131910 為網站照片重新設計方案并重定義了IO接口。(備)
- /*********************************************************************************************
- 說明:
- 了解字幕的修改方法,請參考《mini1608字模設計方法》
- V1正式版
- # 硬件制作只需要單片機、LED、電池和導線,制作非常簡單。
- # 采用STC增強型單片機。
- /*********************************************************************************************/
- #include <STC12C5A60S2.H> //單片機頭文件
- unsigned char MENU;
- #define DY_DELAY 5 //設置每一個點顯示的時間長度(1~20)
- sbit KEY1 = P1 ^ 2; //搖動慣性開關
- sbit KEY2 = P1 ^ 3;
- sbit KEY3 = P1 ^ 4; //選擇鍵(大力橫向碰擊觸發)
- sbit LED1 = P0 ^ 3; //LED燈定義,低電平時亮(自上到下)
- sbit LED2 = P0 ^ 4;
- sbit LED3 = P0 ^ 5;
- sbit LED4 = P0 ^ 6;
- sbit LED5 = P0 ^ 7;
- sbit LED6 = P4 ^ 6;
- sbit LED7 = P4 ^ 5;
- sbit LED8 = P4 ^ 4;
- sbit LED9 = P2 ^ 7;
- sbit LED10 = P2 ^ 6;
- sbit LED11 = P2 ^ 5;
- sbit LED12 = P2 ^ 4;
- sbit LED13 = P2 ^ 3;
- sbit LED14 = P2 ^ 2;
- sbit LED15 = P2 ^ 1;
- sbit LED16 = P2 ^ 0;
- /*********************************************************************************************/
- unsigned char code logo[] = { // (取碼:從上到下從左到右,縱向8位下高位)
- 0x00,0x00,0x10,0x0E,0xD0,0x01,0xFF,0xFF,//杜
- 0xFF,0xFF,0x90,0x01,0x10,0x43,0x40,0x40,
- 0x40,0x40,0x40,0x40,0xFF,0x7F,0xFE,0x7F,
- 0x40,0x40,0x60,0x40,0x40,0x60,0x00,0x40,
- 0x00,0x00,0x10,0x04,0xE1,0x78,0x4E,0xFE,//洋
- 0x8C,0x63,0x60,0x00,0x00,0x04,0x49,0x04,
- 0x4A,0x04,0x4E,0x04,0xF8,0xFF,0xFC,0xFF,
- 0x4E,0x04,0x6B,0x04,0x4A,0x06,0x00,0x04,
- 0x00,0x00,0x00,0x40,0x04,0x40,0x04,0x40,//工
- 0x04,0x40,0x04,0x40,0x04,0x40,0xFC,0x7F,
- 0xFC,0x7F,0x04,0x40,0x04,0x40,0x04,0x40,
- 0x06,0x40,0x04,0x60,0x00,0x40,0x00,0x00,
- 0x00,0x00,0x80,0x00,0x60,0x00,0xF8,0xFF,//作
- 0xEF,0x7F,0x06,0x00,0x40,0x00,0x30,0x00,
- 0x1C,0x00,0xFF,0xFF,0xFA,0xFF,0x48,0x04,
- 0x48,0x04,0x68,0x04,0x4C,0x06,0x08,0x04,
- 0x00,0x00,0x08,0x00,0x1C,0x80,0x0E,0x81,//室
- 0x94,0x8B,0xD4,0x89,0x75,0x89,0x37,0xFF,
- 0x16,0xFF,0x34,0x89,0xD4,0x89,0x94,0x8B,
- 0x1C,0x81,0x0E,0xC0,0x04,0x80,0x00,0x00
- };
- /*********************************************************************************************/
- unsigned char code logo1[] = { // “DoYoung” (取碼:從上到下從左到右,縱向8位下高位)
- 0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x04,0x08, // -D-
- 0x0C,0x0C,0xF8,0x07,0xF0,0x03,0x00,0x00,
- 0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x08, // -o-
- 0x20,0x08,0xE0,0x0F,0xC0,0x07,0x00,0x00,
- 0x00,0x00,0x3C,0x00,0x7C,0x08,0xC0,0x0F, // -Y-
- 0xC0,0x0F,0x7C,0x08,0x3C,0x00,0x00,0x00,
- 0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x08, // -o-
- 0x20,0x08,0xE0,0x0F,0xC0,0x07,0x00,0x00,
- 0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x08, // -u-
- 0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x00,
- 0x20,0x00,0xE0,0x0F,0xC0,0x0F,0x20,0x00, // -n-
- 0x20,0x00,0xE0,0x0F,0xC0,0x0F,0x00,0x00,
- 0xC0,0x27,0xE0,0x6F,0x20,0x48,0x20,0x48, // -g-
- 0xC0,0x7F,0xE0,0x3F,0x20,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空格
- 0x18,0x06,0x3C,0x0E,0x64,0x08,0x44,0x08, // -S-
- 0xC4,0x08,0x9C,0x0F,0x18,0x07,0x00,0x00,
- 0x20,0x00,0x20,0x00,0xF8,0x07,0xFC,0x0F, // -t-
- 0x20,0x08,0x20,0x0C,0x00,0x04,0x00,0x00,
- 0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x08, // -u-
- 0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x00,
- 0x80,0x07,0xC0,0x0F,0x60,0x08,0x24,0x08, // -d-
- 0xFC,0x07,0xFC,0x0F,0x00,0x08,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x20,0x08,0xEC,0x0F, // -i-
- 0xEC,0x0F,0x00,0x08,0x00,0x00,0x00,0x00,
- 0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x08, // -o-
- 0x20,0x08,0xE0,0x0F,0xC0,0x07,0x00,0x00,
- };
- /*********************************************************************************************/
- unsigned char code logo2[] = { // “與電子愛好者同行” (取碼:從上到下從左到右,縱向8位下高位)
- 0x00,0x00,0x00,0x08,0x00,0x08,0x80,0x08,
- 0xFF,0x09,0xFE,0x08,0x88,0x08,0x88,0x08,
- 0x88,0x08,0x88,0x08,0x88,0x0C,0x88,0x48,
- 0x88,0xC0,0x8C,0x7F,0xC8,0x3F,0x80,0x00,
- 0x00,0x00,0x00,0x00,0xF8,0x0F,0xF0,0x07,
- 0x90,0x04,0x90,0x04,0x90,0x04,0xFF,0x7F,
- 0xFE,0xFF,0x90,0xC4,0x90,0xC4,0x90,0xC4,
- 0xF0,0xCF,0xF8,0xC7,0x10,0xF0,0x00,0x40,
- 0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
- 0x82,0x00,0x82,0x00,0x82,0x40,0x82,0x40,
- 0xE2,0xFF,0xF2,0x7F,0x9A,0x00,0x8E,0x00,
- 0x87,0x00,0x82,0x00,0xC0,0x00,0x80,0x00,
- 0x00,0x00,0x40,0x00,0xE0,0x40,0x74,0x20,
- 0xA4,0x98,0xAC,0x8E,0xFA,0x47,0xE2,0x6F,
- 0xBE,0x3A,0xAA,0x12,0xB2,0x3A,0xBF,0x6E,
- 0xAB,0x67,0xE2,0xC2,0x70,0xC0,0x20,0x40,
- 0x00,0x00,0x20,0x80,0x20,0x63,0xF8,0x37,
- 0xFF,0x1C,0x26,0x0F,0xF0,0x7B,0xE0,0x30,
- 0x82,0x00,0x82,0x20,0x82,0x40,0xF2,0xFF,
- 0xEA,0x7F,0x8E,0x00,0xC7,0x00,0x82,0x00,
- 0x00,0x00,0x40,0x04,0x40,0x04,0x44,0x02,
- 0x44,0xFF,0x44,0x7F,0xC4,0x49,0xFF,0x49,
- 0x7F,0x49,0x64,0x49,0x66,0x49,0x54,0xFF,
- 0xD8,0x7F,0x4E,0x01,0x64,0x00,0x40,0x00,
- 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x7F,
- 0x12,0x00,0xD2,0x1F,0x92,0x0F,0x92,0x08,
- 0x92,0x08,0x92,0x1F,0xDA,0x4F,0x92,0x40,
- 0xFE,0xFF,0xFF,0x7F,0x02,0x00,0x00,0x00,
- 0x00,0x00,0x20,0x04,0x10,0x02,0x8C,0xFF,
- 0xE7,0x7F,0x42,0x00,0x00,0x00,0x20,0x00,
- 0x22,0x00,0x22,0x40,0x22,0x40,0xE2,0xFF,
- 0xE2,0x7F,0x23,0x00,0x32,0x00,0x20,0x00
- };
- /*********************************************************************************************
- 函數名:LED顯示用延時函數
- 調 用:delay(?);
- 參 數:1~65535(參數不可為0)
- 返回值:無
- 結 果:占用CPU方式延時與參數數值相同的毫秒時間
- 備 注:應用于1T單片機時i<600,應用于12T單片機時i<125
- /*********************************************************************************************/
- void delay (unsigned int a){ // 用于點掃描的延時
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 1; i++);
- }
- }
- /*********************************************************************************************/
- /*********************************************************************************************
- 函數名:毫秒級CPU延時函數
- 調 用:DELAY_MS (?);
- 參 數:1~65535(參數不可為0)
- 返回值:無
- 結 果:占用CPU方式延時與參數數值相同的毫秒時間
- 備 注:應用于1T單片機時i<600,應用于12T單片機時i<125
- /*********************************************************************************************/
- void DELAY_MS (unsigned int a){
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 600; i++);
- }
- }
- /*********************************************************************************************/
- /*********************************************************************************************
- 函數名:關閉所有LED燈(操作硬件)
- 調 用:DISPLAY_OFF();
- 參 數:無
- 返回值:無
- 結 果:所有LED燈熄滅
- 備 注:
- /**********************************************************************************************/
- void DISPLAY_OFF (void){
- delay(DY_DELAY);//顯示停留
- P0 = 0xff;
- P2 = 0xff;
- P4 = 0xff;
- }
- /**********************************************************************************************/
- /*********************************************************************************************
- 函數名:單幀數據送入顯示(操作硬件)
- 調 用:DISPLAY_PIN(?,?);
- 參 數:16位顯示數據(下高位)(d:上面8位,e:下面8位)
- 返回值:無
- 結 果:點亮對應數據的LED燈
- 備 注:
- /**********************************************************************************************/
- void DISPLAY_PIN (unsigned char d,unsigned char e){ //第1列橫向顯示程序
- unsigned char i;
- i = d & 0x01;
- if(i == 0x01){LED1 = 0;}DISPLAY_OFF();
- i = d & 0x02;
- if(i == 0x02){LED2 = 0;}DISPLAY_OFF();
- i = d & 0x04;
- if(i == 0x04){LED3 = 0;}DISPLAY_OFF();
- i = d & 0x08;
- if(i == 0x08){LED4 = 0;}DISPLAY_OFF();
- i = d & 0x10;
- if(i == 0x10){LED5 = 0;}DISPLAY_OFF();
- i = d & 0x20;
- if(i == 0x20){LED6 = 0;}DISPLAY_OFF();
- i = d & 0x40;
- if(i == 0x40){LED7 = 0;}DISPLAY_OFF();
- i = d & 0x80;
- if(i == 0x80){LED8 = 0;}DISPLAY_OFF();
- i = e & 0x01;
- if(i == 0x01){LED9 = 0;}DISPLAY_OFF();
- i = e & 0x02;
- if(i == 0x02){LED10 = 0;}DISPLAY_OFF();
- i = e & 0x04;
- if(i == 0x04){LED11 = 0;}DISPLAY_OFF();
- i = e & 0x08;
- if(i == 0x08){LED12 = 0;}DISPLAY_OFF();
- i = e & 0x10;
- if(i == 0x10){LED13 = 0;}DISPLAY_OFF();
- i = e & 0x20;
- if(i == 0x20){LED14 = 0;}DISPLAY_OFF();
- i = e & 0x40;
- if(i == 0x40){LED15 = 0;}DISPLAY_OFF();
- i = e & 0x80;
- if(i == 0x80){LED16 = 0;}DISPLAY_OFF();
- }
- /*********************************************************************************************
- 函數名:初始化程序
- 調 用:init();
- 參 數:無
- 返回值:無
- 結 果:設計IO接口為強推方式并全部置1
- 備 注:
- /**********************************************************************************************/
- void init (void){
- P4SW = 0xff; //啟動P4接口
- P0M0 = 0xff; //接口設置為強推
- P2M0 = 0xff;
- P4M0 = 0xff;
- P1 = 0xff; //初始IO接口狀態
- P0 = 0xff;
- P2 = 0xff;
- P4 = 0xff;
- }
- /**********************************************************************************************/
- /*********************************************************************************************
- 函數名:主函數
- 調 用:無
- 參 數:無
- 返回值:無
- 結 果:程序開始處,無限循環
- 備 注:
- /**********************************************************************************************/
- void main (void){
- unsigned char a,c;
- init();//初始程序
- while(1){
- if(MENU > 2){
- MENU = 0;
- }
- if(MENU == 0){ //字幕1
- if(KEY2 == 0){
- DELAY_MS(20);
- while(KEY2 == 0);
- c = 0;
- for(a=1;a<80;a++){ //這里的“80”是這個字幕需要掃描的列數,修改字幕時必須修改此參數。
- DISPLAY_PIN (logo[c],logo[c+1]); //“LOGO”是第一個字幕的數據表名
- c=c+2;//產生顯示行移位
- }
- }
- if(KEY1 == 0){
- DELAY_MS(20);
- while(KEY1 == 0);
- c = 158;
- for(a=1;a<80;a++){
- DISPLAY_PIN (logo[c],logo[c+1]);
- c=c-2;//產生顯示行移位
- }
- }
- if(KEY3 == 0){
- DELAY_MS(20);
- while(KEY3 == 0);
- MENU++;
- }
- }
- if(MENU == 1){ //字幕2
- if(KEY2 == 0){
- DELAY_MS(20);
- while(KEY2 == 0);
- c = 0;
- for(a=1;a<108;a++){
- DISPLAY_PIN (logo1[c],logo1[c+1]);
- c=c+2;//產生顯示行移位
- }
- }
- if(KEY1 == 0){
- DELAY_MS(20);
- while(KEY1 == 0);
- c = 214;
- for(a=1;a<108;a++){
- DISPLAY_PIN (logo1[c],logo1[c+1]);
- c=c-2;//產生顯示行移位
- }
- }
- if(KEY3 == 0){
- DELAY_MS(20);
- while(KEY3 == 0);
- MENU++;
- }
- }
- if(MENU == 2){ //字幕3
- if(KEY2 == 0){
- DELAY_MS(20);
- while(KEY2 == 0);
- c = 0;
- for(a=1;a<128;a++){
- DISPLAY_PIN (logo2[c],logo2[c+1]);
- c=c+2;//產生顯示行移位
- }
- }
- if(KEY1 == 0){
- DELAY_MS(20);
- while(KEY1 == 0);
- c = 254;
- for(a=1;a<128;a++){
- DISPLAY_PIN (logo2[c],logo2[c+1]);
- c=c-2;//產生顯示行移位
- }
- }
- if(KEY3 == 0){
- DELAY_MS(20);
- while(KEY3 == 0);
- MENU++;
- }
- }
- }
- }
- /**********************************************************************************************
- /**********************************************************************************************/
- /*************************************************************
- * 杜洋工作室 DoYoung Studio
- /*************************************************************/
復制代碼
|