光立方电路原理图设计与解析附光立方程序.docx
《光立方电路原理图设计与解析附光立方程序.docx》由会员分享,可在线阅读,更多相关《光立方电路原理图设计与解析附光立方程序.docx(19页珍藏版)》请在冰豆网上搜索。
光立方电路原理图设计与解析附光立方程序
这是用595的电路,材料清单如下:
1:
8个74HC595(封装为DIP—16);
2:
2个74HC04(封装为DIP—14);
3:
2个30PF的瓷介电容;一个10UF的电解电容;一个220UF的电解电容;
4:
一块89C516(单片机);
5:
每个芯片配套的座子;
6:
24或者12MHZ的晶振;
7:
1个1K,1个10K(都是碳膜电阻);
8:
一个按键开关,3个按键;
9:
最好买600个灯,因为焊接的时候可能会损坏(颜色随便你自己选择);
10:
你可以考虑买4个铜柱;
备注:
上面的3个按键可以只要1个,另外2个是我设计的外部中断,你可以不用它;同时我自己有开发板,所以我没有设计程序下载电路,全以最节省的方案为前提,你只要把单片机在开发板上下载好程序,再插到光立方上就好了。
同时画电路时每个芯片的电源引脚隐藏了,(单片机是20接负,40接正;595是8接负,16接正;7404是7接负,14接正。
),还有注意电解电容的极性。
关于你接电源的问题是你自己的事,我是在板子上面安装了一个USB的接口供电。
这是用573的电路,材料清单如下:
1:
8个74HC573(封装为DIP—20);
2:
2个74HC04(封装为DIP—14);
3:
2个30PF的瓷介电容;2个10UF的电解电容;一个220UF的电解电容;
4:
一块89C516(单片机);
5:
每个芯片配套的座子;
6:
24或者12MHZ的晶振;
7:
1个1K,2个10K,8个500欧(都是碳膜电阻);
8:
一个按键开关,1个按键;
9:
最好买600个灯,因为焊接的时候可能会损坏(颜色随便你自己选择);
10:
你可以考虑买4个铜柱;
备注:
画电路时每个芯片的电源引脚隐藏了,(单片机是20接负,40接正;573是10接负,20接正;7404是7接负,14接正。
),还有注意电解电容的极性。
关于你接电源的问题是你自己的事,我是在板子上面安装了一个USB的接口供电。
还有就是这个电路我没有画全,因为全部都一样的:
就是:
1:
把8个573的2—9引脚对应接在一起;
2:
把8个573的11脚接在一起;
总结:
上面的2个电路,每个595或者573都有8个引脚没有接,那是用来接灯的负极的,8*8=64;7404的八个引脚是来接灯的正极的,8层就是8个引脚;同时最好把芯片按顺序依次的排列和连接,这样可以大大方便写程序。
下面我会给你一段程序,我的的时间有点忙,没有那么多时间来写花样。
#include
#include//空语句调用头文件
#include"zimo.h"
#defineucharunsignedchar
#defineuintunsignedint
/**********************************************************************/
sbitDS=P1^0;
/**********************************************************************/
/**********************************************************************/
sbitCLK=P1^1;//74HC595的SH-CP(11脚)
sbitSTB=P1^2;//74HC595的时钟和输出锁存(12脚)
/**********************************************************************/
/*坐标数组*/
/**********************************************************************/
ucharcodeshu[8]={0,1,2,3,4,5,6,7};//十进制数选
ucharcodex1[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//595数据
ucharcodey1[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//595使能
ucharcodez1[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//层扫描
/************************************************************************/
/*亮度调节延时*/
/************************************************************************/
voiddelay(unsignedinti)
{
unsignedintj;
for(;i>0;i--)
{
for(j=5;j>0;j--);
}
}
/**********************************************************************/
/*ms延时*/
/**********************************************************************/
voiddelayms(ucharxms)
{
uchari,j;
for(i=0;i{
for(j=0;j<110;j++);
}
}
/************************************************************************/
/*亮度调整*/
/************************************************************************/
/*voidPWM_LIGHT(unsignedcharp)
{
OE=0;
delay(p);
OE=1;
delay(10-p);
}*/
/***********************************************************************/
/*595发送一字节*/
/***********************************************************************/
voidSet595(unsignedcharxie)
{
unsignedchari;
unsignedinttemp;
temp=xie;
for(i=0;i<8;i++)
{
if(temp&0x01)
{
DS=1;
}
elseDS=0;
temp=temp>>1;
CLK=0;
_nop_();
_nop_();
CLK=1;//移位上升沿有效?
}
}
/**********************************************************************/
/**********************************************************************/
voiddis595(void)
{
STB=0;
_nop_();
_nop_();
STB=1;//串行输出上升沿有效
}
/**********************************************************************/
/**********************************************************************/
voidSet595_1(unsignedcharxie,unsignedcharxie1)
{
unsignedchari;
for(i=0;i<8;i++)
{
DS=xie&0x01;
DS=xie1&0x01;
DS=0;
DS=1;
xie>>=1;
xie1>>=1;
//移位上升沿有效?
}
}
/**********************************************************************/
/*倒计时*/
/**********************************************************************/
voiddaojishi(void)
{
uchari,j,k;
for(j=0;j<8;j++)
{
for(k=0;k<60;k++)
for(i=0;i<8;i++)
{
Set595(shuzi[7][i]);
Set595(shuzi[6][i]);
Set595(shuzi[5][i]);
Set595(shuzi[4][i]);
Set595(shuzi[3][i]);
Set595(shuzi[2][i]);
Set595(shuzi[1][i]);
Set595(shuzi[0][i]);
P1=y1[j];
P2=z1[7-i];
dis595();
}
}
}
/**********************************************************************/
/*方框缩放*/
/**********************************************************************/
voidsuofang()
{
ucharx,y,z,w,e,r,a,s;
for(y=0;y<8;y++)
{
for(x=0;x<8;x++)
{
if((z==0)&&(y==0)||(z==0)&&(y==7))
{
P1=y1[y];
P2=z1[0];
Set595(x1[x]);
dis595();
}
}
}
for(e=0;e<8;e++)
{
for(r=0;r<8;r++)
{
if((w==0)&&(e==0)||(w==0)&&(e==7))
{
P1=y1[e];
P2=z1[r];
Set595(x1[0]);
dis595();
}
}
}
for(e=0;e<8;e++)
{
for(r=0;r<8;r++)
{
if((w==0)&&(e==0)||(w==0)&&(e==7))
{
P1=y1[e];
P2=z1[r];
Set595(x1[7]);
dis595();
}
}
}
for(a=0;a<8;a++)
{
P1=y1[a];
P2=z1[7];
Set595(x1[0]);
dis595();
P1=y1[a];
P2=z1[7];
Set595(x1[7]);
dis595();
}
for(s=0;s<8;s++)
{
P1=y1[s];
P2=z1[0];
Set595(x1[0]);
dis595();
P1=y1[s];
P2=z1[0];
Set595(x1[7]);
dis595();
}
for(y=0;y<8;y++)
{
for(x=0;x<8;x++)
{
if((z==0)&&(y==0)||(z==0)&&(y==7))
{
P1=y1[y];
P2=z1[7];
Set595(x1[x]);
dis595();
}
}
}
}
/**********************************************************************/
voidxingdian()
{
ucharx,y,z;
for(z=0;z<8;z++)
for(y=0;y<8;y++)
{
for(x=0;x<8;x++)
{
if((y==0)||(y==2)||(y==4)||(y==6)||(y==1)||(y==3)||(y==5)||(y==7))
{
P1=y1[y];
P2=z1[z];
Set595(x1[x]);
dis595();
}
}
delayms(20000);
}
}
/*主函数*/
/**********************************************************************/
voidmain()
{
ucharj;
while
(1)
{
daojishi();//倒计时7—0
for(j=0;j<50;j++)
{
suofang();//方框缩放
}
//xingdian();//星点
}
}
这是595的程序,实现0—9倒数。
#include
#defineuintunsignedint
#defineucharunsignedchar
voiddelay(uintz);
voidmain()
{
while
(1)
{
P3=0x00;
delay(10);
P2=0x00;
delay(5);
P1=0x00;
}
}
voiddelay(uintz)
{
ucharx,y;
for(x=0;xfor(y=0;y<121;y++);
}
这是573的程序简单的点亮512个灯。
所以573写程序方便,595接线方便。
随你怎么选择。
/*-----------------------------------------------
名称:
光立方的控制程序
QQ:
1101956457
编写:
电子协会技术小组
日期:
修改:
第三次
内容:
通过层扫描方式将512个逐层扫描,扫描时间由参数b决定
------------------------------------------------*/
#include//包含头文件,一般情况不需要改动,
//头文件包含特殊功能寄存器的定义
#defineulnP1//uln2803控制端
#definelsP0//ls573输入端
#defineclsP2//ls573控制端
#defineucharunsignedchar
#defineuintunsignedint
ucharcodedisplay0[]={//花样数组
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//screen1
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*****************************************************************************/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,//screen5
0xFF,0x81,0x81,0x81,0x81,0x81,0x81,0xFF,
0xFF,0x81,0xBD,0xBD,0xBD,0xBD,0x81,0xFF,
0xFF,0x81,0xBD,0xBD,0xBD,0xBD,0x81,0xFF,
0xFF,0x81,0xBD,0xBD,0xBD,0xBD,0x81,0xFF,
0xFF,0x81,0xBD,0xBD,0xBD,0xBD,0x81,0xFF,
0xFF,0x81,0x81,0x81,0x81,0x81,0x81,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};
ucharcodedisplay1[]={
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//screen6
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
/*****************************************************************************/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,//screen35
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
uintt=0;//花样数组检测数
ucharz=0;//选择标志位
uintp[]={0x140,0x780};//花样个数
uintb=10;//停留时间常数
uchara=0;
ucharj=0;
uintcounter=0;
voidwdata(){
//花样写入函数
switch(z==0){
case0:
ls=display0[t];break;//写入花样,以参数z为选择标志位
case1:
ls=display1[t];break;
}
}
voidinitial(){//定时器初始化函数
TMOD=0x01;//设定工作方式1
TH0=55536/256;//计算初始值,载入,定时
TL0=55536%256;
EA=1;//开总中断
ET0=1;//开T0中断
TR0=1;//启动定时器
}
voidmain(){
initial();//初始化
while
(1){//显示花样并等待进入中断
uln=0x01;//uln2803初始化
for(a=0;a<8;a++){
cls=0x01;//74ls573C控制端赋值,1输入,0锁存
for(j=0;j<8;j++){
wdata();//调用数据写入函数
cls=cls<<1;//对下一个74ls573写入数据
ls=0x00;
t=t+1;
}
uln=uln<<1;//准备显示下一层花样
}
t=t-64;//循环显示这八层数据,等待中断
}
}
voidT0_int()interrupt1{
TR0=0;//关定时器
ET0=0;//关T0中断
TH0=55536/256;//重装初值
TL0=55536%256;
switch(z){//根据t值不同选择花样停留的时间长度
case0:
b=300;break;
case1:
b=45;break;
}
if(t
counter++;
if(counter==b){//定时时间是否已到
t=t+64;//显示下一个花样
counter=0;//重新计时(对10ms计数)
}
}
elsez=z+1;t=0;//全部显示完毕,从头重新开始
TR0=1;//启动定时器
ET0=1;//开T0中断
}
/*-----------------------------------------------
名称:
光立方的控制程序
QQ:
1101956457
编写:
电子协