本篇文章给大家谈谈快新摇摇棒震动开关,以及快新摇摇棒震动开关的深度体验对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
LED摇摇棒很好地利用了人眼的视觉暂留特性。下图是基于51单片机控制、32只高亮度LED发光LED构成的摇摇棒,配合手的左右摇晃就可呈现一幅完整的画面,可以显示字符、图片等。演示效果见自制LED摇摇棒效果展示图
黑暗条件下拍摄的效果图片:
基本原理与硬件电路设计:
32只LED发光管作为画面每一列的显示,左右摇晃起到了扫描的作用,人眼的视觉暂留现象使得看到的是一幅完整的画面。与LED点阵的显示有几分相仿。
硬件电路如下图(点击可放大)由于上传不上去我画的图,所以就截图分享一下!
水银开关的作用:棒在摇动时,只能在朝某一方向摇动时显示,否则会出现镜像字或者镜像画面,所以采用接一支水银开关来进行控制,使摇摇棒在摇动过程时将内容显示出来。
硬件制作:包含单片机、PCB板、32个高亮蓝光LED、电池盒、震动开关、轻触按键、3pin插针(预留的程序下载接口)
水银开关里的水银珠很活跃,导致在接通时容易产生抖动,所以将水银开关斜向上放置(尖尖朝斜上方45°角),靠水银珠自身重力的作用减少抖动。
IC座里面隐藏元件,既美观又能保护元件:
软件设计:
/****************************************************************************************
/*描述:摇摇棒程序,通过滚珠开关检测周期,摇动时间自适应,图像始终保持在中间。开机后每摇晃10次切换下一组字模
/*按了一下按键后变成了手动切换,直到回到第一组字的时候再自动切换
最后祝各位制作成功!学*进步!
/*****************************************************************************************/
#include
/*********外部接口定义**********/
#defineucharunsignedchar
#defineuintunsignedint//宏定义
#defineoutP1//数据输出端口
sbitled1=P3^0;//第1组LED
sbitled2=P3^1;//第2组LED
sbitled3=P3^3;//第3组LED
sbitled4=P3^4;//第4组LED
sbitkey1=P3^5;//按键输入
sbitp3_2=P3^2;
ucharKY,num;//KY作用在后面说明
ucharBUFF;//缓存
/*********全局变量定义**********/
unsignedlongintTimeCount=0;
unsignedintDelayN=80,//延时临时计数
DelayTime=80;//每次延时的周期个数
unsignedcharkey,keyy;
/**********************************************/
voiddelay(unsignedcharn);
voidDelayMs(void);
/*******************************************/
unsignedcharcodetext0[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"",0*/
0x20,0x00,0x20,0x80,0x20,0x80,0x20,0x46,0xA0,0x45,0x70,0x28,0x2F,0x28,0x20,0x10,0x20,0x18,0x20,0x26,0xE0,0x21,0x20,0x40,0x20,0x80,0x20,0x00,0x20,0x00,0x00,0x00,/*"女",1*/
0x08,0x02,0x08,0x01,0x89,0x00,0xEE,0xFF,0x98,0x00,0x00,0x03,0x00,0x00,0xF8,0x1F,0x88,0x08,0x88,0x08,0xFF,0xFF,0x88,0x08,0x88,0x08,0xF8,0x1F,0x00,0x00,0x00,0x00,/*"神",2*/
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*/
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*/
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*/
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*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"",3*/
};
unsignedcharcodetext1[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"",0*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"",1*/
0xF7,0xFD,0xF7,0xFE,0x76,0xFF,0x31,0x00,0x57,0xFF,0xE7,0x7C,0xFF,0xBF,0x01,0xCF,0x7D,0xF0,0x7D,0xFF,0x7D,0xFF,0x7D,0x80,0x01,0x7F,0xFF,0x7F,0xFF,0x0F,0xFF,0xFF,/*"祝",2*/
0x7F,0xFF,0xBF,0xFF,0x0F,0x80,0xD3,0xFF,0xBC,0xEF,0xDF,0xF3,0x67,0xFC,0xF0,0xDE,0xF5,0xBF,0x17,0xC0,0xF7,0xFF,0x77,0xFF,0xD7,0xFC,0xE3,0xE3,0xF7,0xF7,0xFF,0xFF,/*"你",3*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"",4*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"",5*/
0xFF,0xFF,0xBF,0x7F,0xBD,0xBF,0xBD,0xDF,0xBD,0xEF,0xBD,0xF7,0xBD,0xF9,0x01,0xFE,0xBD,0xFD,0xBD,0xFB,0xBD,0xF7,0xBD,0xEF,0xBD,0xCF,0xBD,0x9F,0xBF,0xDF,0xFF,0xFF,/*"天",6*/
0xFF,0xFF,0xBF,0x7F,0xBD,0xBF,0xBD,0xDF,0xBD,0xEF,0xBD,0xF7,0xBD,0xF9,0x01,0xFE,0xBD,0xFD,0xBD,0xFB,0xBD,0xF7,0xBD,0xEF,0xBD,0xCF,0xBD,0x9F,0xBF,0xDF,0xFF,0xFF,/*"天",7*/
0xBF,0xFF,0xBD,0xBF,0xBD,0xDF,0xBD,0xEF,0xBD,0xF3,0x01,0xFC,0xBD,0xFF,0xBD,0xFF,0xBD,0xFF,0xBD,0xFF,0x01,0x80,0xBD,0xFF,0xBD,0xFF,0xBD,0xFF,0xBD,0xFF,0xFF,0xFF,/*"开",8*/
0xFF,0xFB,0x7F,0xFC,0xFF,0xFF,0xFF,0xFF,0x0F,0xC0,0xFF,0xBF,0xFE,0xBF,0xFD,0xBF,0xE3,0xBF,0xF7,0xBF,0xFF,0xBF,0xBF,0x87,0x7F,0xFF,0xFF,0xF8,0xFF,0xFD,0xFF,0xFF,/*"心",9*/
};
unsignedcharcodetext2[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0xFF,0xFF,0x9F,0xF9,0xFF,0xFF,0x9F,0xF9,0xFF,0xFF,0x9F,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0xF9,0xFF,0xFF,0x9F,
0xF9,0xFF,0xFF,0x9F,0xF9,0xFF,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xFF,0x01,0xFE,0xFF,
0x7F,0x00,0xF8,0xFF,0x3F,0x00,0xF0,0xFF,0x1F,0x00,0xE0,0xFF,0x0F,0x00,0xC0,0xFF,0x07,0x00,0x80,0xFF,0x03,0x00,0x00,0xFF,0x03,0x00,0x00,0xFF,0x03,0x00,0x00,0xFE,
0x03,0x00,0x00,0xFC,0x03,0x00,0x00,0xF8,0x07,0x00,0x00,0xF0,0x0F,0x00,0x00,0xE0,0x1F,0x00,0x00,0xE0,0x3F,0x00,0x00,0xC0,0x3F,0x00,0x00,0x80,0x1F,0x00,0x00,0xC0,
0x0F,0x00,0x00,0xE0,0x07,0x00,0x00,0xF0,0x03,0x00,0x00,0xF8,0x03,0x00,0x00,0xFC,0x03,0x00,0x00,0xFE,0x03,0x00,0x00,0xFF,0x07,0x00,0x80,0xFF,0x0F,0x00,0xC0,0xFF,
0x1F,0x00,0xE0,0xFF,0x3F,0x00,0xE0,0xFF,0xFF,0x00,0xF8,0xFF,0xFF,0x01,0xFC,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0x07,0x00,0x00,0xE0,0x07,0x00,0x00,0xC0,0x07,0x00,0x00,0xC0,0xFF,0xFF,0xFF,0xC7,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xCF,
0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFF,0xC7,0x07,0x00,0x00,0xC0,0x07,0x00,0x00,0xC0,0x07,0x00,0x00,0xE0,0xFF,0xFF,0xFF,0xFF,/*"未命名文件",0*/
};
unsignedcharcodetext3[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"",0*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"",1*/
0x00,0x08,0x00,0x04,0x00,0x03,0xE0,0x00,0x00,0x00,0x00,0x40,0x00,0x80,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x0E,0x00,0x00,/*"小",0*/
0x10,0x04,0x60,0x04,0x02,0x7E,0x8C,0x01,0x00,0x00,0x44,0x00,0x54,0xFF,0x54,0x15,0x54,0x15,0x7F,0x15,0x54,0x55,0x54,0x95,0x54,0x7F,0x44,0x00,0x40,0x00,0x00,0x00,/*"清",1*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"",4*/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"",5*/
0x40,0x20,0x44,0x12,0x54,0x4A,0x65,0x82,0xC6,0x7F,0x64,0x02,0x54,0x0A,0x44,0x92,0x00,0x60,0xFC,0x1F,0x44,0x00,0x44,0x00,0xC4,0xFF,0x42,0x00,0x40,0x00,0x00,0x00,/*"新",2*/
0x40,0x00,0x40,0x40,0x42,0x20,0xCC,0x1F,0x00,0x20,0x88,0x40,0x89,0x50,0x8E,0x48,0x88,0x46,0xF8,0x41,0x88,0x42,0x8C,0x44,0x8B,0x58,0x88,0x40,0x80,0x40,0x00,0x00,/*"送",3*/
};
/***********n(us)延时子程序***************/
voidDelayUs(uintN)
{
uintx;
for(x=0;x<=N;x++);
}
/******************************************/
voidmain()
{
AUXR=0x80;
CLK_DIV=0;
EX0=1;//开放外部中断0
IT0=1;//中断0为边沿触发方式
IP=0x02;//设置中断优先级
TMOD=0x02;//定时器0方式2,8位重装载
TH0=0x80;//设定定时器初值
TL0=0x80;
KY=0;
EA=1;//开放中断
ET0=1;//开放定时器0中断
TR0=1;//启动定时器0,开始计时*/
key=0;//初始化显示第一组文字
keyy=0;
P1M0=0x55;//01010101/P1.0P1.2P1.4P1.6推挽输出
P1M1=0xAA;
while(1){//等待中断
if(key1==0){//有键按下
DelayUs(50);
if(key1==0){
key++;//更换下一幅图片
if(key>2)key=0;//图片循环显示根据显示的组数来定义这里有9组所以就要keyy>9
while(key1==0);//等待按键释放
}
}
if(num>10)//每中断10次切换
{
keyy++;
num=0;
}
if(keyy>2)keyy=0;//图片循环显示根据显示的组数来定义这里有9组所以就要keyy>9
}
}
/*********文字显示子程序**********/
voiddisplay_word(unsignedcharcode*text)
{
unsignedchari,j=2;//j为图片起始位置3为第3个开始是图片如果要显示高时32的大字也属于图片格式
DelayUs(6300);
for(i=0;i<64;i++)
{
P3M0=0x00;//00000000//P3.0推挽输出P3.1P3.3P3.4输入高阻
P3M1=0x1B;
if((key>=j)||(keyy>=j))
BUFF=(*(text+i*4+3));
else
BUFF=(*(text+128+i*2+1));
led4=0;
P1=~BUFF>>1;
P3M0=0x10;//00010000//P3.4推挽输出P3.0P3.3P3.1输入高阻
P3M1=0x0B;//00001011
delay(1);
P3M0=0x00;//00000000//P3.0推挽输出P3.1P3.3P3.4输入高阻
P3M1=0x1B;//00011011
led4=1;
P1=BUFF;//010101011357
P3M0=0x10;//00010000//P3.4推挽输出P3.0P3.3P3.1输入高阻
P3M1=0x0B;//00001011
delay(1);
P3M0=0x00;//00000000//P3.0推挽输出P3.1P3.3P3.4输入高阻
P3M1=0x1B;//00011011
if((key>=j)||(keyy>=j))
BUFF=(*(text+i*4+2));
else
BUFF=(*(text+128+i*2));
led3=0;
P1=~BUFF>>1;
P3M0=0x08;//00001000//P3.3推挽输出P3.0P3.1P3.4输入高阻
P3M1=0x13;//00010011
delay(1);
P3M0=0x00;//00000000//P3.0推挽输出P3.1P3.3P3.4输入高阻
P3M1=0x1B;//00011011
led3=1;
P1=BUFF;//010101011357
P3M0=0x08;//00001000//P3.3推挽输出P3.0P3.1P3.4输入高阻
P3M1=0x13;//00010011
delay(1);
P3M0=0x00;//00000000//P3.0推挽输出P3.1P3.3P3.4输入高阻
P3M1=0x1B;
if((key>=j)||(keyy>=j))
BUFF=(*(text+i*4+1));
else
BUFF=(*(text+i*2+1));
led2=0;
P1=~BUFF>>1;
P3M0=0x02;//00000010//P3.1推挽输出P3.0P3.3P3.4输入高阻
P3M1=0x19;//00011001
delay(1);
P3M0=0x00;//00000000//P3.0推挽输出P3.1P3.3P3.4输入高阻
P3M1=0x1B;//00011011
led2=1;
P1=BUFF;//010101011357
P3M0=0x02;//00000010//P3.1推挽输出P3.0P3.3P3.4输入高阻
P3M1=0x19;//00011001
delay(1);
P3M0=0x00;//00000000//P3.0推挽输出P3.1P3.3P3.4输入高阻
P3M1=0x1B;//0001
if((key>=j)||(keyy>=j))
BUFF=(*(text+i*4));
else
BUFF=(*(text+i*2));
led1=0;
P1=~BUFF>>1;
P3M0=0x01;//00000001//P3.0推挽输出P3.1P3.3P3.4输入高阻
P3M1=0x1A;//00011010
delay(1);
P3M0=0x00;//00000000//P3.0推挽输出P3.1P3.3P3.4输入高阻
P3M1=0x1B;//00011011
led1=1;
P1=BUFF;//010101011357
P3M0=0x01;//00000001//P3.0推挽输出P3.1P3.3P3.4输入高阻
P3M1=0x1A;//00011010
delay(1);
}}
/*********显示内容选择子程序**********/
voiddisplay(unsignedchart)
{keyy=0;
switch(t){//通过按键选择显示内容
case0:{display_word(text0);}break;
case1:{display_word(text1);}break;
case2:{display_word(text2);}break;
case3:{display_word(text3);}break;
//case4:{display_word(text4);}break;
//case5:{display_word(text5);}break;
//case6:{display_word(text6);}break;
//case7:{display_word(text7);}break;
//case8:{display_word(text8);}break;
//case9:{display_word(text9);}break;
//case10:{display_word(text10);}break;
//default:{display_word(text1);}
}}
/*****************************************/
voiddisplay1(unsignedchary)
{
switch(y){//通过按键选择显示内容
case0:{display_word(text0);}break;
case1:{display_word(text1);}break;
case2:{display_word(text2);}break;
case3:{display_word(text3);}break;
//case4:{display_word(text4);}break;
//case5:{display_word(text5);}break;
//case6:{display_word(text6);}break;
//case7:{display_word(text7);}break;
//case8:{display_word(text8);}break;
//case9:{display_word(text9);}break;
//case10:{display_word(text10);}break;
}
}
/***************************************/
/*********延时子程序**********/
voiddelay(unsignedcharn)
{
for(;n>0;n--){
DelayN=DelayTime;
while(DelayN);
}
}
/*********中断子程序**********/
voidint0()interrupt0//使用外部中断0
{
KY=~KY;
if(KY==0)
{
DelayTime=TimeCount/1580;
TimeCount=0;//延时周期计数清零
if(key==0)
{
num++;
display1(keyy);//根据按键选择循环显示文字
}
else
{
display(key);//根据按键选择循环显示文字
}
}
}
voidtimer0()interrupt1//定时器0中断子程序
{
TimeCount++;
if(DelayN!=0)
DelayN--;
}
最后别的不多说了,自己刚刚学*,希望大家可以多多给予小清新同学在学*上面的帮助,十分感谢各位!
好了,关于快新摇摇棒震动开关和快新摇摇棒震动开关的深度体验的问题到这里结束啦,希望可以解决您的问题哈!