光立方电路原理图设计与解析附光立方程序Word文档下载推荐.docx
《光立方电路原理图设计与解析附光立方程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《光立方电路原理图设计与解析附光立方程序Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
一个按键开关,1个按键;
画电路时每个芯片的电源引脚隐藏了,(单片机是20接负,40接正;
573是10接负,20接正;
还有就是这个电路我没有画全,因为全部都一样的:
就是:
把8个573的2—9引脚对应接在一起;
把8个573的11脚接在一起;
总结:
上面的2个电路,每个595或者573都有8个引脚没有接,那是用来接灯的负极的,8*8=64;
7404的八个引脚是来接灯的正极的,8层就是8个引脚;
同时最好把芯片按顺序依次的排列和连接,这样可以大大方便写程序。
下面我会给你一段程序,我的的时间有点忙,没有那么多时间来写花样。
#include<
reg52.h>
#include<
intrins.h>
//空语句调用头文件
#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>
j--);
}
}
/*ms延时*/
voiddelayms(ucharxms)
uchari,j;
for(i=0;
i<
xms;
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;
8;
if(temp&
0x01)
{
DS=1;
}
elseDS=0;
temp=temp>
>
1;
CLK=0;
_nop_();
CLK=1;
//移位上升沿有效?
voiddis595(void)
STB=0;
_nop_();
STB=1;
//串行输出上升沿有效
voidSet595_1(unsignedcharxie,unsignedcharxie1)
DS=xie&
0x01;
DS=xie1&
DS=0;
DS=1;
xie>
=1;
xie1>
//移位上升沿有效?
/*倒计时*/
voiddaojishi(void)
uchari,j,k;
for(j=0;
j++)
for(k=0;
k<
60;
k++)
for(i=0;
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<
y++)
for(x=0;
x<
x++)
if((z==0)&
&
(y==0)||(z==0)&
(y==7))
{
P1=y1[y];
P2=z1[0];
Set595(x1[x]);
dis595();
}
for(e=0;
e<
e++)
for(r=0;
r<
r++)
if((w==0)&
(e==0)||(w==0)&
(e==7))
P1=y1[e];
P2=z1[r];
Set595(x1[0]);
Set595(x1[7]);
for(a=0;
a<
a++)
P1=y1[a];
P2=z1[7];
Set595(x1[0]);
dis595();
Set595(x1[7]);
for(s=0;
s<
s++)
P1=y1[s];
P2=z1[0];
P2=z1[7];
voidxingdian()
ucharx,y,z;
for(z=0;
z<
z++)
if((y==0)||(y==2)||(y==4)||(y==6)||(y==1)||(y==3)||(y==5)||(y==7))
P2=z1[z];
}
}
delayms(20000);
/*主函数*/
voidmain()
ucharj;
while
(1)
daojishi();
//倒计时7—0
50;
suofang();
//方框缩放
//xingdian();
//星点
这是595的程序,实现0—9倒数。
#defineuintunsignedint
#defineucharunsignedchar
voiddelay(uintz);
voidmain()
P3=0x00;
delay(10);
P2=0x00;
delay(5);
P1=0x00;
voiddelay(uintz)
ucharx,y;
for(x=0;
z;
for(y=0;
121;
y++);
这是573的程序简单的点亮512个灯。
所以573写程序方便,595接线方便。
随你怎么选择。
/*-----------------------------------------------
名称:
光立方的控制程序
QQ:
1101956457
编写:
电子协会技术小组
日期:
修改:
第三次
内容:
通过层扫描方式将512个逐层扫描,扫描时间由参数b决定
------------------------------------------------*/
//包含头文件,一般情况不需要改动,
//头文件包含特殊功能寄存器的定义
#defineulnP1//uln2803控制端
#definelsP0//ls573输入端
#defineclsP2//ls573控制端
ucharcodedisplay0[]={//花样数组
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//screen1
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,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,
/*****************************************************************************/
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,//screen35
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];
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++){
cls=0x01;
//74ls573C控制端赋值,1输入,0锁存
for(j=0;
j++){
wdata();
//调用数据写入函数
cls=cls<
<
//对下一个74ls573写入数据
ls=0x00;
t=t+1;
uln=uln<
//准备显示下一层花样
t=t-64;
//循环显示这八层数据,等待中断
voidT0_int()interrupt1{
TR0=0;
//关定时器
ET0=0;
//关T0中断
//重装初值
switch(z){//根据t值不同选择花样停留的时间长度
b=300;
b=45;
if(t<
p[z]){//花样Z中总共有p[z]个元素
counter++;
if(counter==b){//定时时间是否已到
t=t+64;
//显示下一个花样
counter=0;
//重新计时(对10ms计数)
}
elsez=z+1;
t=0;
//全部显示完毕,从头重新开始
//启动定时器
//开T0中断
电子协