嘿嘿,自我感覺不錯。就是這個用手搖晃的東西有點累。
補充下,這個慣性開關 就是把單片機的兩個引腳引出來,然后在負極上接上一根彈性導線,搖動的時候這個彈性導線會向兩邊擺動而觸動到兩個引腳(為了增加慣性,我得彈性導線很長,并且在頂端彎了幾個圈增加慣性)。為了防止擺動出來,我在兩個引腳上加了一段帶皮導線,這樣就能隨便亂晃,不至于導線出來
| 正面,上面一排是發光二極管。右下角的是慣性開關
195748f7qbrb8xz7xkgppq.jpg.thumb.jpg (45.58 KB, 下載次數: 90)
下載附件
2016-10-11 22:25 上傳
關燈后的效果(視頻截圖,相機拍不到)
195757zx8zkugfd57fm6jz.jpg.thumb.jpg (20.01 KB, 下載次數: 115)
下載附件
2016-10-11 22:25 上傳
STC12C5a60S2單片機
195805gtz5ymt1611c4ew6.jpg.thumb.jpg (41.58 KB, 下載次數: 109)
下載附件
2016-10-11 22:25 上傳
原理圖,上面少了外震蕩電路和上電復位電路。其實這個單片機在寫入程序后可設置為內部晶振,然后晶振和復位 ...
200008xv442mffprmdqyv2.jpg.thumb.jpg (30.32 KB, 下載次數: 128)
下載附件
2016-10-11 22:25 上傳
源程序:
- #include //單片機頭文件
- #define DY_DELAY 5 //設置每一個點顯示的時間長度(1~20)
- sbit KEY1 = P1 ^ 2; //搖動慣性開關
- sbit KEY2 = P1 ^ 3;
- 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位下高位)
- //"老",
- 0x40,0x40,0x40,0x20,0x48,0x10,0x48,0x08,
- 0x48,0x04,0x48,0x7E,0x7F,0x91,0xC8,0x90,
- 0x4C,0x88,0x68,0x88,0x50,0x84,0x48,0x86,
- 0x4C,0x80,0x60,0xE0,0x40,0x00,0x00,0x00,
- //"婆",
- 0x00,0x04,0x84,0x04,0xC9,0x87,0x22,0x84,
- 0x06,0x4D,0x80,0x54,0x7E,0x26,0x12,0x24,
- 0x32,0x26,0x52,0x55,0x9F,0x4C,0x52,0x85,
- 0x32,0x06,0x0A,0x06,0x06,0x04,0x00,0x00,
- //"我",
- 0x20,0x00,0x24,0x08,0x24,0x48,0x24,0x84,
- 0xFE,0x7F,0x23,0x02,0x22,0x21,0x20,0x10,
- 0xFF,0x09,0x20,0x06,0x22,0x1A,0xAC,0x61,
- 0x20,0x80,0x30,0xE0,0x20,0x00,0x00,0x00,
- //"愛",
- 0x40,0x00,0xB0,0x00,0x92,0x40,0x96,0x30,
- 0x9A,0x8C,0x92,0x83,0xF2,0x46,0x9E,0x2A,
- 0x92,0x12,0x91,0x2A,0x99,0x26,0x95,0x42,
- 0x91,0xC0,0x50,0x40,0x30,0x00,0x00,0x00,
- //"你",
- 0x40,0x00,0x20,0x00,0xF8,0xFF,0x07,0x00,
- 0x40,0x00,0x20,0x08,0x18,0x04,0x0F,0x43,
- 0x08,0x80,0xC8,0x7F,0x08,0x00,0x08,0x01,
- 0x28,0x06,0x18,0x0C,0x00,0x00,0x00,0x00
- }
- void delay (unsigned int a){ // 用于點掃描的延時
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 1; i++);
- }
- }
- void DELAY_MS (unsigned int a){
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 600; i++);
- }
- }
- /*********************************************************************************************/
- void DISPLAY_OFF (void){
- delay(DY_DELAY);//顯示停留
- P0 = 0xff;
- P2 = 0xff;
- P4 = 0xff;
- }
- /**********************************************************************************************/
- 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();
- }
- 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(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;//產生顯示行移位
- }
- }
- }
- }
復制代碼 |