STC 51单片机62——极简 4x4x4光立方
本次设计一个非常简洁的光立方,省略了限流电阻,用两节1.5V干电池直接驱动。
主控芯片:STC8H1K28,属于STC中比较新的系列单片机,管脚够用,也没有很多的空余。
电源直接使用带开关的电池盒,内含2节1.5v干电池。将电池盒的引线焊接到PCB上的电源孔,增加两个滤波电容:
程序下载电路,按照datasheet设计,需要加二极管和限流电阻:
核心部分是电路板上的4x4的共阴极LED矩阵:
然后是每层LED的公共极,连接一个三极管:
完整原理图:
并绘制出PCB:
焊接的时候,由于不喜欢LED躺着的光立方,所以设计一个模具,能够让LED直立:
把模具排开,做成二维图,用于激光切割亚克力板:
代码就先写了个框架,凑合试试:
#include "STC8H.h"
#include "usart.h"
#define u8 unsigned char
#define u16 unsigned int
sbit Ceng1=P3^7; //公共极图层1
sbit Ceng2=P3^6; //公共极图层2
sbit Ceng3=P3^5; //公共极图层3
sbit Ceng4=P3^4; //公共极图层4
u8 Tu1[8]={0x0f,0x00,0x0f,0x00,0x0f,0x00,0x0f,0x00};//一帧图像
u8 Tu2[8]={0xf0,0x00,0xf0,0x00,0xf0,0x00,0xf0,0x00};//一帧图像
u8 Tu3[8]={0x00,0x0f,0x00,0x0f,0x00,0x0f,0x00,0x0f};//一帧图像
u8 Tu4[8]={0x00,0xf0,0x00,0xf0,0x00,0xf0,0x00,0xf0};//一帧图像
void Mydelay(u8 t)
{
unsigned char i,j,k;
for(i=0;i<t;i++)
for(j=0;j<20;j++)
for(k=0;k<250;k++)
;
}
void IOInit()//IO初始化
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0xff;
P1M1 = 0x00;
P2M0 = 0xff;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
}
void XuanCeng(u8 CengN) //选择哪层亮
{
switch (CengN){
case 1: P3=0x10; break;
case 2: P3=0x20; break;
case 3: P3=0x40; break;
case 4: P3=0x80; break;
default: P3=0x00;
}
Mydelay(1); //调整延时,控制显示速度
}
void YiZhen(u8 Table[])//显示一帧图像
{
P1=Table[0];
P2=Table[1];
XuanCeng(1);
P1=Table[2];
P2=Table[3];
XuanCeng(2);
P1=Table[4];
P2=Table[5];
XuanCeng(3);
P1=Table[6];
P2=Table[7];
XuanCeng(4);
}
void Donghua()//动画,由多个图像帧组成
{
u8 i;
for(i=0;i<10;i++)
YiZhen(Tu1);
for(i=0;i<10;i++)
YiZhen(Tu2);
for(i=0;i<10;i++)
YiZhen(Tu3);
for(i=0;i<10;i++)
YiZhen(Tu4);
}
void main()//主函数
{
unsigned int n;
n=0;
IOInit();
UartInitP();//串口初始化,用于调试
//Mydelay();
Ceng1=0;
Ceng2=0;
Ceng3=0;
Ceng4=0;
P1=0x01;
P2=0x01;
while(1){
Donghua();
}
}