POV系列制作之十字旋转LED

@TOC 最开始接触POV的制作应该是在大学一年级的时候,看到师兄们做的摇摇棒,感觉好有意思,那个时候只会用STC89C52,当时用一块大的洞洞板 分成几份,又细又长的洞洞板,全用插件手工焊接,那个时候有兴趣的支撑,焊接都不怕麻烦。那个时候做出来摇晃起来就能看到自己设定的图案,后来慢慢的得知这个原理其实就是POV。
如果你在网上搜索“POVled”一词(POV即persistancd of vision),会找到世界各地的各种ED旋转屏的制作介绍,那些摇晃出的空中图案,漂浮在车轮上的动画,以及形态各异的时钟,一定给你留下深刻印象。看到这些千奇百怪、创意无限的电子作品,除了羡慕、敬佩、感叹外,你是否想过自己亲自动手也做一个,做一个属于你自己的LED旋转屏呢?其实,无论你看到的LED旋转屏如何神奇,如何复杂,其原理都一样,也很简单,说白了就是一个晃动的流水灯。
下面就来分享一款基于STC89C52制作的十字单色旋转LED!
考虑到旋转的电路板要尽量轻一些,如果主板上背个电池,就显得太重了,因此我们采用无线供电的方式,现如今无线供电技术已经非常成熟了,我们选择一个成本比较低的方案来设计制作,这种电流小一点的无线供电淘宝大概就3元左右在这里插入图片描述
接下来就要选则一个电机,我用了配套的370电机
在这里插入图片描述
最后,还需要一个电机带动旋转板子的结构件
在这里插入图片描述
制作POV系列 必须要买的就是以上3种配件,剩下的就是画板和采购元件了
先来画无线供电的电路板
在这里插入图片描述
这是一个自激震荡电路,线圈出来是交流电压,2个线圈感应得电供给旋转主板整流稳压。
接下来我们还是采用STC89C52 LQFP44脚的 单片机来设计旋转板和灯板
在这里插入图片描述
图画好后就可以发给嘉立创白嫖一次打样了,因此有免费打样的可以不需要花钱做电路板了,把需要的元件淘宝买一下,焊接制作过程忽略了,
在这里插入图片描述
对了亚克力直径淘宝找人做一下,或者用3D打印一个,又或者找个铁盒子来当底座用,能固定住电机就可以了
接下来是程序的编写了

#include "NEW_8051.H"
#include "task.h"
#include <stddef.h>
 
bit BIT_timeout=0;
uint i=0,j=0;
#define ucNumRows 176 //定义一周显示字个数 一个字16列 160/16=10个字
/*********延时子程序**********/
/*****n(us)延时子程序*****/
void DelayUs(uint N)
{
    uint x ;
    for(x=0;x<=N;x++);
}

/*********中断子程序**********/
void int0() interrupt 0	//使用外部中断0
{
	BIT_timeout=1; //起点标志位	
}

/********************************/
void start(void)
{
	P1=0XFF;
	P2=0XFF;
	P0=0XFF;
	P3=0XFF; 
	
}
/***************************************/
void OS_ALLRun(void)
{

	if(BIT_timeout)	//起点判断
 	{			
		BIT_timeout=0; //清零
		
		j++; 				           
        if( j>1920 )//显示完文字后 循环; j=16*需要显示的字数	 这里大概有120个字符 所以120*16=1920
        {
            j=0 ;
        }            
        for(i=j;i<ucNumRows+j;i++)  //立体显示176列 数据   176/16=11个字
        {                               
           
			P2=zimo[i*2];	//送数据低位显示
			P0=zimo[i*2+1];//送数据高位显示	
						
			DelayUs(15);
			P0=P2=0XFF;							
           if(BIT_timeout)//这里如果没有显示完一圈的数据 回到起点了 
		                  //直接跳出 就不会出现头吃尾的现象 而且盲点很小
		   {
		   		return;
		   }
		}
		   
	}
}
#include "NEW_8051.H"
#include "task.h"

bit BIT_10MS;

extern void OS_ALLRun(void);
extern void start(void);

/*********************************************************************************************************
** 函数名称: init
** 功能描述: 初始化程序,此处包含定时器0、串行口初始化
** 输  入: 无
** 输  出: 无
** 全局变量: 无
** 调用模块: 
  **
** 作  者: 
** 日  期: 
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日  期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void init()
{
    
	//"系统初始化"
	//IE = 0x00;      //"清除中断"
	EA = 1;			//总中断
	//ES = 1;         //4"串行中断允许"
	//EX0 = 1;        //0"外部中断0允许"
	//ET0 = 1;        //1"定时器0中断允许"
	//EX1 = 1;        //2"外部中断1允许"
	//ET1 = 1;        //3"定时器1中断允许"
	//ET2 = 1;
	//IP = 0;         //"清除中断优先级"
	//PS = 1;         //"串行中断优先"
	//PX0 = 1;        //"外部中断0"
	//PT0 = 1;        //"定时器中断0"
	//PX1 = 1;        //"外部中断1"
	//PT1 = 0;        //"定时器中断1"
	//TCON--------     "定时器控制寄存器",   TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0
	//TCON = 0;
	//TF1             "T1溢出标志"
	//TR1 = 1;        //"T1运行控制"
	//TF0             "T0溢出标志"
	//TR0 = 1;        //"T0运行控制"
	//IE1             "外部中断1申请标志"
	//IT1 = 1;        //"外部中断1触发方式 0=电平 1=边沿"
	//IE0             "外部中断0申请标志"
	//IT0 = 1;        //"外部中断0触发方式 0=电平 1=边沿"
	//TMOD--------    "定时器模式控制寄存器"
	//  | GATE   | C//T   | M0     | M1    | GATE   | C//T   | M0       | M1        |
	//"高4位用于T1  低4位用于T0"
	//TMOD = 0x21;
	//SCON  "串行控制"
	//| SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI  | RI  |
	//"| SM0  SM1 | 工作方式  |   说    明   |   波 特 率    |"
	//"|   0    0 | 方 式 0   |? 同步移位   |   fosc/12     |"
	//"|   0    1 | 方 式 1   | 10位异步收发 |  定时器控制   |"
	//"|   1    0 | 方 式 2   | 11位异步收发 |fosc/32|fosc/64|"
	//"|   1    1 | 方 式 3   | 11位异步收发 |  定时器控制   |"
	//"SM2 多机通讯允许"
	//"REN 接收允许控制"
	//"TB8 发送数据第9位"
	//"RB8 接收数据第9位"
	//"TI  发送中断标志"
	//"RI  接受中断标志"
	//SCON = 0x50;
	//PCON "电源控制寄存器"
	//SMOD"波特率选择位 =1 方式1,2,3 波特率加倍"
	//"波特率=2^(sod)*fosc/(32*12*(256-初值))"
    //T2CON = 0x0;
    //TR2 = 1;
    //ET2 = 1;
//-----------中斷初始化-------------------------------------------------  BELL
//INT0 init		  
#ifdef EN_OS_INT0
    IT0 = 1;    //外部中断为边沿触发
    EX0 = 1;    //允许外部中断 
#endif

  #ifdef EN_OS_INT1
//	PX1 = 1;    //"外部中断1"
    IT1 = 1;    //外部中断为边沿触发
    EX1 = 1;    //允许外部中断 
  #endif  	
  
    
#ifdef EN_OS_SERIAL
    SCON = 0x50;
    //TMOD|= 0x20;
	//BRT	   = 0xfb;  //0xfb: 18.432MHz,12T,SMOD=0,9600bps
	AUXR   |= 0x11;
   TH1  = 0xFB;
    TL1  = 0xFB;
    TR1  = 1; 
    ES   = 1;       //允許串口中斷
    PS = 1;         //"串行中断优先"
    PSH;
#endif

#ifdef EN_OS_TIMER0
/****************定时器0初始化****************/
  TMOD|=0X02;
  	ET0=1; 
	TH0=0x000;	//设定定时器初值 20US
	TL0=0x0E1; //
	TR0=1;	 
#endif
/****************定时器1初始化****************/
#ifdef EN_OS_TIMER1
     TMOD|=0X20;//8位自动重载模式 
  	 ET1=1;  //定时器0开中断
     TH1=0x00;//定时160us 晶振18.432M
     TL1=0x00;
#endif
/***************************/
#ifdef EN_OS_UART2	 

	S2CON  = 0x50;  //0101,0000 8位可变波特率,无奇偶校验位,允许接收
	BRT	   = 0xfb;  //0xfb: 18.432MHz,12T,SMOD=0,9600bps
	AUXR   |= 0x11;  //T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRS	
	IE2	    = 0x01;	//允许串口2中断,ES2=1
#endif

/***/
#ifdef EN_OS_PCA0  //用于16位定时

    CMOD = 0x80;   	 //12分频
    CCON = 0x00;   //清中断标志
    CL = 0;
    CH = 0;
	CCAP0H = 0xEF; //40ms定时
    CCAP0L = 0xD8;  
//	CCAPM0 = 0x49; //设置PCA0为16位定时器,允许PCA模块0中断
	//CR=1; //启动PCA计数
#endif
/*******************************************/
#ifdef EN_OS_PCA1	  //用于16位定时

    CMOD = 0x80;   	 //12分频
	CCON = 0x00;   //清中断标志    
    CL = 0;
    CH = 0;  
    CCAP1H =0x01;
    CCAP1L =0x68;	//us定时
	//CCAPM1 = 0x49;  允许PCA模块1中断 

#endif
/***********************************************************************/
}
/*********************************************************************************************************
** 函数名称: main
** 功能描述: 主函数,用户程序从这里执行
** 输  入: 无
** 输  出: 无
** 全局变量: 无
** 调用模块: init()
**
** 作  者:
** 日  期: 
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日  期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

void main(void)
{
    init();
	start();
				    
	while(1)
	{
       OS_ALLRun();
    }
}
#include "NEW_8051.H"
#include "task.h"

//PC2002字幕软件  配置 (逐列 阳码 逆向)
uchar code zimo[]={
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*/

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",2*/

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,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,0x7F,0xFF,0xBF,0xFE,0xDF,0xFD,
0x6F,0xFB,0xB7,0xF6,0xDB,0xED,0xED,0xDB,0xF6,0xB7,0xFB,0x6F,0xFD,0xDF,0xFF,0xFF,/*"《",0*/

0xEF,0xFD,0xF7,0xFE,0x7B,0xFF,0x39,0x00,0x8C,0xFF,0xDD,0xFF,0xBF,0xFF,0xBB,0xFF,
0xBB,0xBF,0xBB,0x7F,0x3B,0x80,0xBB,0xFF,0xBB,0xFF,0xBB,0xFF,0xBF,0xFF,0xFF,0xFF,/*"行",1*/

0xEF,0xFD,0xF7,0xFE,0x7B,0xFF,0x39,0x00,0x8C,0xFF,0xDD,0xFF,0xBF,0xFF,0xBB,0xFF,
0xBB,0xBF,0xBB,0x7F,0x3B,0x80,0xBB,0xFF,0xBB,0xFF,0xBB,0xFF,0xBF,0xFF,0xFF,0xFF,/*"行",2*/

0xF7,0xBF,0xF7,0xBF,0xF5,0xB7,0x15,0xB4,0x55,0xB5,0x55,0xB5,0x55,0xB5,0x00,0x80,
0x56,0xB5,0x56,0xB5,0x56,0xB5,0x16,0xB4,0xF7,0xB7,0xF7,0xBF,0xF7,0xBF,0xFF,0xFF,/*"重",3*/

0xEF,0xFD,0xF7,0xFE,0x7B,0xFF,0x39,0x00,0x8C,0xFF,0xDD,0xFF,0xBF,0xFF,0xBB,0xFF,
0xBB,0xBF,0xBB,0x7F,0x3B,0x80,0xBB,0xFF,0xBB,0xFF,0xBB,0xFF,0xBF,0xFF,0xFF,0xFF,/*"行",4*/

0xEF,0xFD,0xF7,0xFE,0x7B,0xFF,0x39,0x00,0x8C,0xFF,0xDD,0xFF,0xBF,0xFF,0xBB,0xFF,
0xBB,0xBF,0xBB,0x7F,0x3B,0x80,0xBB,0xFF,0xBB,0xFF,0xBB,0xFF,0xBF,0xFF,0xFF,0xFF,/*"行",5*/

0xFD,0xDF,0xFB,0x6F,0xF6,0xB7,0xED,0xDB,0xDB,0xED,0xB7,0xF6,0x6F,0xFB,0xDF,0xFD,
0xBF,0xFE,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"》",6*/

0xFF,0xDF,0xF7,0x9F,0xF7,0xCF,0xF7,0xF7,0xF7,0xE7,0xF7,0xDB,0xF6,0xDB,0xF5,0xDD,
0xF3,0xBE,0x77,0xBF,0xB7,0xBF,0xD7,0xBF,0xE3,0xBF,0xF7,0xBF,0xFF,0xBF,0xFF,0xFF,/*"之",7*/

0xFF,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,
0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x3F,0xFF,0x7F,0xFF,0xFF,0xFF,/*"一",8*/

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",9*/

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",10*/

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*" ",11*/

0xEF,0xFD,0xF7,0xFE,0x7B,0xFF,0x39,0x00,0x8C,0xFF,0xDD,0xFF,0xBF,0xFF,0xBB,0xFF,
0xBB,0xBF,0xBB,0x7F,0x3B,0x80,0xBB,0xFF,0xBB,0xFF,0xBB,0xFF,0xBF,0xFF,0xFF,0xFF,/*"行",12*/

0xEF,0xFD,0xF7,0xFE,0x7B,0xFF,0x39,0x00,0x8C,0xFF,0xDD,0xFF,0xBF,0xFF,0xBB,0xFF,
0xBB,0xBF,0xBB,0x7F,0x3B,0x80,0xBB,0xFF,0xBB,0xFF,0xBB,0xFF,0xBF,0xFF,0xFF,0xFF,/*"行",13*/

0xF7,0xBF,0xF7,0xBF,0xF5,0xB7,0x15,0xB4,0x55,0xB5,0x55,0xB5,0x55,0xB5,0x00,0x80,
0x56,0xB5,0x56,0xB5,0x56,0xB5,0x16,0xB4,0xF7,0xB7,0xF7,0xBF,0xF7,0xBF,0xFF,0xFF,/*"重",14*/

0xEF,0xFD,0xF7,0xFE,0x7B,0xFF,0x39,0x00,0x8C,0xFF,0xDD,0xFF,0xBF,0xFF,0xBB,0xFF,
0xBB,0xBF,0xBB,0x7F,0x3B,0x80,0xBB,0xFF,0xBB,0xFF,0xBB,0xFF,0xBF,0xFF,0xFF,0xFF,/*"行",15*/

0xEF,0xFD,0xF7,0xFE,0x7B,0xFF,0x39,0x00,0x8C,0xFF,0xDD,0xFF,0xBF,0xFF,0xBB,0xFF,
0xBB,0xBF,0xBB,0x7F,0x3B,0x80,0xBB,0xFF,0xBB,0xFF,0xBB,0xFF,0xBF,0xFF,0xFF,0xFF,/*"行",16*/

0xFF,0xFF,0xFF,0xFF,0xFF,0xA7,0xFF,0xC7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*",",17*/
};

字幕软件PC2002设置参考图
在这里插入图片描述
程序比较简单,成本也不高,适合大学的学生入门制作,用兴趣来引导单片机的学习,我觉得是最好的!
旋转的效果如下

十字旋转LED POV制作

下面我将制作资料打包分享给大家!!
链接:https://pan.baidu.com/s/1SaaE3l9ksqv6uKFYNREHKg?pwd=ugxx
提取码:ugxx

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值