手头上攒了一些手机电池不知道干嘛就寻思着做一些小玩意,于是就有了一个主意就是摇摇棒即简单又好玩,本人喜欢小而巧的东西所以就把这个东西做的很小。
上图是摇摇棒的原理利用人的视觉暂留结合单片机控制LED的亮灭就可以在空中显示字符或者图标。
上图是电路图为了把东西做小我选择了STC15F104单片机它有8个引脚去除VCC和GND还有6个I/O口可以显示一些简单的字母和数字单片机内部自带了EEPROM所以利用它可以存储每一次显示的状态(每一次的开关电源就可以切换到下一个显示的字符)程序在最后面。
代码在下面:defineucharunsignedchar
defineS_MODE0x00;//待机模式
defineW_MODE0x02;//写模式
#defineF_MODE0x03;//擦除模式sfrIAP_DATA=0xC2;sfrIAP_ADDRH=0xC3;sfrIAP_ADDRL=0xC4;sfrIAP_CMD=0xC5;sfrIAP_TRIG=0xC6;sfrIAP_CONTR=0xC7;voidinit();ucharnum=0,m=0;ucharread_dat(ucharaddr_h,ucharaddr_l);voiderase_dat(ucharaddr_h,ucharaddr_l);voidwrite_dat(ucharaddr_h,ucharaddr_l,ucharw_dat);unsignedcharcodetab[10][32]={{0xe7,0xc3,0xc1,0xe0,0xc1,0xc3,0xe7,0xff,0xff,0xff,0xff,0xe7,0xc3,0xc1,0xe0,0xc1,0xc3,0xe7,0xff,0xff,0xff,0xff,0xe7,0xc3,0xc1,0xe0,0xc1,0xc3,0xe7,0xff,0xff,0xff},{0xff,0xff,0xde,0xc0,0xde,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xc3,0xc1,0xe0,0xc1,0xc3,0xe7,0xff,0xff,0xff,0xff,0xff,0xc1,0xfe,0xfe,0xfe,0xfe,0xc1,0xff,0xff,0xff},{0xde,0xed,0xf3,0xf3,0xed,0xde,0xff,0xff,0xff,0xff,0xff,0xde,0xed,0xf3,0xf3,0xed,0xde,0xff,0xff,0xff,0xff,0xff,0xff,0xde,0xed,0xf3,0xf3,0xed,0xde,0xff,0xff,0xff},{0xfb,0xfd,0xd6,0xe8,0xd6,0xfd,0xfb,0xff,0xff,0xff,0xff,0xfb,0xfd,0xd6,0xe8,0xd6,0xfd,0xfb,0xff,0xff,0xff,0xff,0xfb,0xfd,0xd6,0xe8,0xd6,0xfd,0xfb,0xff,0xff,0xff},{0xea,0xd5,0xea,0xd5,0xea,0xd5,0xea,0xd5,0xea,0xd5,0xea,0xd5,0xea,0xd5,0xea,0xd5,0xea,0xd5,0xea,0xd5,0xea,0xd5,0xea,0xd5,0xea,0xd5,0xea,0xd5,0xea,0xd5,0xea,0xd5},{0xfa,0xfd,0xfa,0xff,0xef,0xd7,0xef,0xff,0xfa,0xfd,0xfa,0xff,0xef,0xd7,0xef,0xff,0xfa,0xfd,0xfa,0xff,0xef,0xd7,0xef,0xff,0xfa,0xfd,0xfa,0xff,0xef,0xd7,0xef,0xff},{0xf0,0xed,0xdd,0xed,0xf0,0xff,0xff,0xdf,0xdf,0xc0,0xdf,0xdf,0xff,0xff,0xc1,0xfe,0xfe,0xfe,0xc1,0xff,0xff,0xc1,0xfe,0xf1,0xfe,0xc1,0xff,0xff,0xe1,0xde,0xde,0xe1},{0xc0,0xfb,0xfb,0xfb,0xc0,0xff,0xff,0xff,0xff,0xff,0xde,0xed,0xf3,0xf3,0xed,0xde,0xff,0xff,0xff,0xff,0xff,0xff,0xcf,0xf7,0xf8,0xf7,0xcf,0xff,0xff,0xff,0xff,0xff},{0xc0,0xde,0xd2,0xda,0xda,0xc2,0xfe,0xc0,0xdf,0xd0,0xd6,0xd6,0xd2,0xde,0xc0,0xff,0xc0,0xde,0xd2,0xda,0xda,0xc2,0xfe,0xc0,0xdf,0xd0,0xd6,0xd6,0xd2,0xde,0xc0,0xff},{0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xff},};voiddelay(ucharxms){chari,j;for(i=0;ifor(j=0;j50;j++);}voidmain(){init();num=read_dat(0x00,0x01);++num;if(num=11){num=1;};erase_dat(0x00,0x01);write_dat(0x00,0x01,num);while(1){uchari=0;for(i=0;i32;i++){P3=tab[num-1][i];delay(100);}}}voidinit(){IAP_CONTR=EN_EPROM;//把第7位置1允许EEPROM可以读写
IAP_CMD=S_MODE;//待机模式无ISP操作IAP_ADDRH=0x00;IAP_ADDRL=0x00;}ucharread_dat(ucharaddr_h,ucharaddr_l){ucharE_dat=0x00;
IAP_CMD=R_MODE;//模式选择为读EEPROMIAP_ADDRH=addr_h;IAP_ADDRL=addr_l;IAP_TRIG=0x5A;//使命令有效IAP_TRIG=0xA5;//使命令有效E_dat=IAP_DATA;returnE_dat;}voidwrite_dat(ucharaddr_h,ucharaddr_l,ucharw_dat){IAP_CMD=W_MODE;//模式选择为写EEPROMIAP_ADDRH=addr_h;IAP_ADDRL=addr_l;IAP_DATA=w_dat;IAP_TRIG=0x5A;//使命令有效IAP_TRIG=0xA5;//使命令有效}voiderase_dat(ucharaddr_h,ucharaddr_l){IAP_CMD=F_MODE;//模式选择为擦除EEPROMIAP_ADDRH=addr_h;IAP_ADDRL=addr_l;IAP_TRIG=0x5A;//使命令有效IAP_TRIG=0xA5;
//使命令有效
}
若代码出现错误可以通过
文章素材来自互联网