标题:
3D8光立方的Proteus仿真+单片机代码分享
[打印本页]
作者:
刘飞洋123
时间:
2018-12-21 17:16
标题:
3D8光立方的Proteus仿真+单片机代码分享
采用51系列单片机
首先把512个灯板分为8个灯板,每个灯板64个灯
64个led灯横向共阴,纵向共阳,
8个74HC573锁存器来控制每一层灯板共阳端
一个ULN2803来驱动,输出接每层灯板的共阴端反向驱动
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(12.87 KB, 下载次数: 23)
下载附件
2018-12-21 17:46 上传
0.png
(41 KB, 下载次数: 22)
下载附件
2018-12-21 17:47 上传
单片机源程序如下:
#include<reg51.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
#define DataPort1 P1 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^0;//定义锁存使能端口 第一灯板的字节锁存
sbit LATCH2=P2^1;//
sbit LATCH3=P2^2;//
sbit LATCH4=P2^3;
sbit LATCH5=P2^4;
sbit LATCH6=P2^5;
sbit LATCH7=P2^6;
sbit LATCH8=P2^7;
void Delay(unsigned int t)
{
while(--t);
}
unsigned char line[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};// 显示行值01234567
void display(unsigned char *Data)//显示子程序,指针数组作为形参,直接指向传过来的实参数组的地址 ,这样就可直接操纵数组传过来的数组了
{
unsigned char i;
for(i=0;i<8;i++)
{
DataPort1=line[i]; //先给行(灯板的公共端)输入数据
DataPort=Data[i]; //把数组Data[0~7]里的值依次传给第一灯板的573锁存器中
LATCH1=1;LATCH1=0;
DataPort=Data[8+i]; //把数组Data[8~15]里的值依次传给第二灯板的573锁存器中
LATCH2=1;LATCH2=0;
DataPort=Data[16+i]; //把数组Data[16~23]里的值依次传给第三灯板的573锁存器中
LATCH3=1;LATCH3=0;
DataPort=Data[24+i];
LATCH4=1;LATCH4=0;
DataPort=Data[32+i];
LATCH5=1;LATCH5=0;
DataPort=Data[40+i];
LATCH6=1;LATCH6=0;
DataPort=Data[48+i];
LATCH7=1;LATCH7=0;
DataPort=Data[56+i];
LATCH8=1;LATCH8=0;
Delay(200); //扫描间隙延时,时间太长会闪烁,太短会造成重影
DataPort1=0x00; // 清空行锁存器里数据,防止出现乱码
} /*如此一趟循环下来,每次都是8块灯板的同一行一起点亮,
如此组成一个灯板,8次循环下来,就全部灯都点亮了*/
}
void display1(unsigned char *Data)//显示子程序,指针数组作为形参,直接指向传过来的实参数组的地址 ,这样就可直接操纵数组传过来的数组了
{
unsigned char i;
for(i=0;i<8;i++)
{
DataPort1=line[i]; //先给行(灯板的公共端)输入数据
DataPort=Data[i]; //把数组Data[0~7]里的值依次传给第一灯板的573锁存器中
LATCH1=1;LATCH1=0;
DataPort=Data[8+i]; //把数组Data[8~15]里的值依次传给第二灯板的573锁存器中
LATCH2=1;LATCH2=0;
DataPort=Data[16+i]; //把数组Data[16~23]里的值依次传给第三灯板的573锁存器中
LATCH3=1;LATCH3=0;
DataPort=Data[24+i];
LATCH4=1;LATCH4=0;
DataPort=Data[32+i];
LATCH5=1;LATCH5=0;
DataPort=Data[40+i];
LATCH6=1;LATCH6=0;
DataPort=Data[48+i];
LATCH7=1;LATCH7=0;
DataPort=Data[56+i];
LATCH8=1;LATCH8=0;
Delay(5000); //扫描间隙延时,时间太长会闪烁,太短会造成重影
DataPort1=0x00; // 清空行锁存器里数据,防止出现乱码
} /*如此一趟循环下来,每次都是8块灯板的同一行一起点亮,
如此组成一个灯板,8次循环下来,就全部灯都点亮了*/
}
void display2(unsigned char *Data)//显示子程序,指针数组作为形参,直接指向传过来的实参数组的地址 ,这样就可直接操纵数组传过来的数组了
{
unsigned char i;
for(i=0;i<8;i++)
{
DataPort1=line[i]; //先给行(灯板的公共端)输入数据
DataPort=Data[i]; //把数组Data[0~7]里的值依次传给第一灯板的573锁存器中
LATCH1=1;LATCH1=0;
DataPort=Data[8+i]; //把数组Data[8~15]里的值依次传给第二灯板的573锁存器中
LATCH2=1;LATCH2=0;
DataPort=Data[16+i]; //把数组Data[16~23]里的值依次传给第三灯板的573锁存器中
LATCH3=1;LATCH3=0;
DataPort=Data[24+i];
LATCH4=1;LATCH4=0;
DataPort=Data[32+i];
LATCH5=1;LATCH5=0;
DataPort=Data[40+i];
LATCH6=1;LATCH6=0;
DataPort=Data[48+i];
LATCH7=1;LATCH7=0;
DataPort=Data[56+i];
LATCH8=1;LATCH8=0;
Delay(1000); //扫描间隙延时,时间太长会闪烁,太短会造成重影
DataPort1=0x00; // 清空行锁存器里数据,防止出现乱码
} /*如此一趟循环下来,每次都是8块灯板的同一行一起点亮,
如此组成一个灯板,8次循环下来,就全部灯都点亮了*/
}
void liang() //点亮所有的灯
{
unsigned int i;
for(i=0;i<4000;i++)
{
DataPort1=0xff; //先给行(灯板的公共端)输入数据
DataPort=0xff; //把0xff送进锁存器1~8中,使它们的输出引脚都输出高电平,与行锁存器的0x00相对,点亮所有的灯
LATCH1=1;LATCH1=0;
LATCH2=1;LATCH2=0;
LATCH3=1;LATCH3=0;
LATCH4=1;LATCH4=0;
LATCH5=1;LATCH5=0;
LATCH6=1;LATCH6=0;
LATCH7=1;LATCH7=0;
LATCH8=1;LATCH8=0;
}
}
void mie() //熄灭所有的灯
{
unsigned int i;
for(i=0;i<4000;i++)
{
DataPort1=0xff; //先给行(灯板的公共端)输入数据
DataPort=0x00; //把0x00送进锁存器1~8中,使它们的输出引脚都输出高电平,与行锁存器的0x00相对,熄灭所有的灯
LATCH1=1;LATCH1=0;
LATCH2=1;LATCH2=0;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
3D8光立方.zip
(31.65 KB, 下载次数: 52)
2018-12-21 17:12 上传
点击文件名下载附件
光立方
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1