看着各位大神鼓捣光立方,闲着没事也做了一个简单的4乘4乘4的光立方,直接上图。制作过程没有拍照只有成品照片,请各位见谅。
编译
程序编译完成,主要有纵向一层一层的扫描,横向一层一层扫描,线扫描,点扫描,全部闪烁及随机亮等功能;
原理图
原理图最简单的就是这样了
由于杜邦线用光了,临时用线和接线端子制作的线连接。
51单片机最小系统
USB转TTL
USB转TTL模块,网上买的用来给单片机刷程序及通讯;
- /****************************************Copyright Mr.Asia************************************/
- /****************************************Date 2019-05-01************************************/
- /*包含头文件*/
- #include <STC12C5A60S2.h> //STC12C5A60S2头文件
- #include <intrins.h> //循环左移右移函数头文件
- //#include <reg52.h> //使用89C51单片机使用该头文件,注释掉 STC12C5A60S2头文件
- /*宏定义*/
- #define uint unsigned int
- #define uchar unsigned char
- /*数组定义*/
- uint code ceng[]={0x00,0x10,0x20,0x40,0x80,0xf0}; //层数数组定义
- uint code num[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //LED IO口定义
- /*全局变量声明*/
- uint i = 6000; //延时函数参数
- /*函数声明*/
- void Delay(uint z); //ms延时函数
- void Init(); //初始化函数
- void All(); //光立方闪烁
- void Heng(); //横扫描
- void Lie_v(); //V列扫描
- void Lie_h(); //H列扫描
- void Shu(); //竖线扫描
- void Heng_V(); //横V扫描
- void Heng_H(); //横H扫描
- void Dian(); //点扫描
- void Suiji(); //随机竖线扫描
- void DianSuiji(); //随机点扫描
- /*******************************************************************************
- * 名称: void main()
- * 功能: 主函数
- * 形参: 无
- * 返回: 无
- * 说明: 主函数
- ******************************************************************************/
- void main()
- {
- while(1)
- {
- Init();
- All();
- Heng(); //横扫描
- Lie_v(); //V列扫描
- Lie_h(); //H列扫描
- Shu(); //竖线扫描
- Heng_V(); //横V扫描
- Heng_H(); //横H扫描
- Dian(); //点扫描
- Suiji(); //随机竖线扫描
- DianSuiji(); //随机点扫描
- }
- }
- /*******************************************************************************
- * 名称: void Delay()
- * 功能: 延时函数
- * 形参: uint x, y, z;
- * 返回: 无
- * 说明: 延时一定时间 单位为ms
- ******************************************************************************/
- void Delay(uint z)
- {
- uint x;
- uint y;
- for(x = z; x > 0; x--)
- for(y = 120; y > 0 ; y--);
- }
- /*******************************************************************************
- * 名称: void Init()
- * 功能: 初始化光立方
- * 形参: 无
- * 返回: 无
- * 说明: 所有LED灯熄灭
- ******************************************************************************/
- void Init()
- {
- P1 = ceng[0];
- P0 = 0xff;
- P2 = 0xff;
- }
- /*******************************************************************************
- * 名称: void All()
- * 功能: 光立方
- * 形参: 无
- * 返回: 无
- * 说明: 闪烁
- ******************************************************************************/
- void All()
- {
- uchar k;
-
- P0 = 0x00;
- P2 = 0x00; //IO口置0
- for(k=0;k<3;k++)
- {
- P1 = ceng[5]; //全亮
- Delay(i-2000);
- P1 = ceng[0]; //全灭
- Delay(i-2000);
- }
- }
- /*******************************************************************************
- * 名称: void Heng()
- * 功能: 层数上下扫描
- * 形参: uchar k
- * 返回: 无
- * 说明: 层数上下滚动扫描
- ******************************************************************************/
- void Heng()
- {
- uchar k;
- /*层自下而上扫描*/
- for(k=1;k<5;k++)
- {
- P1 = ceng[k];
- P0 = 0x00;
- P2 = 0x00;
- Delay(i);
- }
-
- /*层自上而下扫描 */
- for(k=3;k>0;k--)
- {
- P1 = ceng[k];
- P0 = 0x00;
- P2 = 0x00;
- Delay(i);
- }
- Init();
- }
- /*******************************************************************************
- * 名称: void lie_v()
- * 功能: 竖直v面扫描
- * 形参: 无
- * 返回: 无
- * 说明: 竖直面扫描
- ******************************************************************************/
- void Lie_v()
- {
- uchar k;
-
- P0 = 0xee;
- P2 = 0xee; //P0、P2赋初值0x77,右移后分别是 0x77 --> 0xbb --> 0xdd --> 0xee
- for(k=1;k<5;k++)
- {
- P1 = ceng[5];
- P0 = _cror_(P0,1);
- P2 = _cror_(P2,1); //循环右移函数
- Delay(i);
- }
- // Init();
- }
- /*******************************************************************************
- * 名称: void lie_h()
- * 功能: 竖直h面扫描
- * 形参: 无
- * 返回: 无
- * 说明: 竖直面扫描
- ******************************************************************************/
- void Lie_h()
- {
- P1 = ceng[5]; //电源全部打开
- P0 = 0xf0;
- Delay(i);
- P0 = 0x0f;
- Delay(i);
- P0 = 0xff; //将P0口置高关闭P0口LED灯
- P2 = 0xf0;
- Delay(i);
- P2 = 0x0f;
- Delay(i);
- Init();
- }
- /*******************************************************************************
- * 名称: void Shu()
- * 功能: 竖线面扫描
- * 形参: 无
- * 返回: 无
- * 说明: 竖线扫描
- ******************************************************************************/
- void Shu()
- {
- uchar k;
- P1 = ceng[5];
- P0 = 0xfe;
- for(k=0;k<8;k++)
- {
- P0 = _cror_(P0,1); //P0口循环右移1位
- Delay(i-1000);
- }
- P0 = 0xff;
- P2 = 0xfe;
- for(k=0;k<8;k++)
- {
- P2 = _cror_(P2,1); //P2口循环右移1位
- Delay(i-1000);
- }
- Init(); //初始化函数
- }
- /*******************************************************************************
- * 名称: void Heng_V()
- * 功能: 线V扫描
- * 形参: 无
- * 返回: 无
- * 说明: 线V扫描
- ******************************************************************************/
- void Heng_V()
- {
- uchar k;
- for(k=1;k<5;k++)
- {
- P1 = ceng[k];
- P0 = 0xf0;
- Delay(i);
- P0 = 0x0f;
- Delay(i);
- P0 = 0xff;
- P2 = 0xf0;
- Delay(i);
- P2 = 0x0f;
- Delay(i);
- P2 = 0xff;
- }
- Init();
- }
- /*******************************************************************************
- * 名称: void Heng_H()
- * 功能: 线H扫描
- * 形参: 无
- * 返回: 无
- * 说明: 线H扫描
- ******************************************************************************/
- void Heng_H()
- {
- uchar k,j;
- for(k=1;k<5;k++)
- {
- P1 = ceng[k];
- P0 = 0x77;
- P2 = 0x77;
- for(j=1;j<5;j++)
- {
- P0 = _cror_(P0,1);
- P2 = _cror_(P2,1);
- Delay(i);
- }
- P0 = 0xff;
- P2 = 0xff;
- }
- }
- /*******************************************************************************
- * 名称: void Suiji()
- * 功能:随机扫描
- * 形参: 无
- * 返回: 无
- * 说明: 数组随机扫描
- ******************************************************************************/
- void Suiji()
- {
- int rand();
- uint k;
- uchar j;
- P1 = ceng[5];
- for(j=0;j<9;j++)
- {
- k = rand();
- P0 = num[k%9];
- Delay(i);
- P0 = 0xff;
- P2 = num[k%9];
- Delay(i);
- P2 = 0xff;
- }
- }
- /*******************************************************************************
- * 名称: void Dian()
- * 功能:点扫描
- * 形参: 无
- * 返回: 无
- * 说明: 点扫描
- ******************************************************************************/
- void Dian()
- {
- uchar k,j;
- for(k=1;k<5;k++)
- {
- P1 = ceng[k];
- P0 = 0x01;
- for(j=1;j<9;j++)
- {
- P0 = num[j];
- Delay(i);
- }
- P0 = 0xff;
- P2 = 0x01;
- for(j=1;j<9;j++)
- {
- P2 = num[j];
- Delay(i);
- }
- P2 = 0xff;
- }
- }
- /*******************************************************************************
- * 名称: void DianSuiji()
- * 功能:点随机扫描
- * 形参: 无
- * 返回: 无
- * 说明: 点随机扫描
- ******************************************************************************/
- void DianSuiji()
- {
- int rand();
- uint k;
- uchar j;
-
- for(j=1;j<20;j++)
- {
- k = rand();
- P1 = ceng[k%5];
- P0 = num[k%9];
- Delay(i);
- P0 = 0xff;
- P2 = num[k%9];
- Delay(i);
- P2 = 0xff;
- }
- }
复制代码
现在想做的是使用串口通讯来控制光立方,尝试了很多次都没有成功,望大神指点!使用串口调试助手接收数据,然后通过switch来使用不同数据不同状态!
全部资料51hei下载地址:
444光立方.rar
(627.8 KB, 下载次数: 74)
|