嘿嘿,自我感觉不错。就是这个用手摇晃的东西有点累。
补充下,这个惯性开关 就是把单片机的两个引脚引出来,然后在负极上接上一根弹性导线,摇动的时候这个弹性导线会向两边摆动而触动到两个引脚(为了增加惯性,我得弹性导线很长,并且在顶端弯了几个圈增加惯性)。为了防止摆动出来,我在两个引脚上加了一段带皮导线,这样就能随便乱晃,不至于导线出来
| 正面,上面一排是发光二极管。右下角的是惯性开关
关灯后的效果(视频截图,相机拍不到)
STC12C5a60S2单片机
原理图,上面少了外震荡电路和上电复位电路。其实这个单片机在写入程序后可设置为内部晶振,然后晶振和复位 ...
源程序:
- #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;//产生显示行移位
- }
- }
- }
- }
复制代码 |