极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 39652|回复: 25

【原创软硬开源】电路极简2x2x2光立方——基于STC单片机

[复制链接]
发表于 2015-5-10 04:49:49 | 显示全部楼层 |阅读模式
本帖最后由 Ultrady 于 2015-6-24 11:11 编辑

直接进入正题,视频说明一切~



【勘误!】先前的原理图是错误的!今天经过群友提醒才发现,马上做出更改!
                本帖原理图已经替换,附件中的原理图文件也已经作出替换,请及时下载更新!
                对受困惑的同学深表抱歉!2015年6月24日


其实很久以前就想要做个小光立方玩,但是一直懒。
后来看着同学做了个8x8x8的觉得不错,但是又觉得工程量太大成本太高,于是昨晚(15年5月8日)我就端着他的光立方看了十分钟,看透了原理之后回来当场就搭了这个2x2x2的,并且熬夜把程序写完(别说了,我现在也熬夜,四点半了(@﹏@)~ )。今天早上又加了呼吸灯模式,并且不停地调试呼吸速率以更接近我的深呼吸曲线。。重复下载了有一百多次,单片机都快爆了哈哈。第一次搭棚焊没经验,其实阳极引脚弯的方向错了,导致引脚在前面把灯挡住。不过一般来说也不会在正面看立方的,从右侧45°观看最佳,也没多大影响。

2片洞洞板用弯排针焊起来呈90°即可。电路连接是每一层共阴,给IO口低电平选通该层,然后每一列分别叫a,b,c,d,把这4个IO口模式设为推挽模式,强上拉输出点亮LED。我用的暖黄色LED八灯全亮时实测电流为34mA,STC12C单片机DIP20可以承受66mA的电流,所以不需要外围功率元件驱动。点击按键切换灯光花样,按钮接在外部中断0,所以任何时候按都灵光。总共有1个全亮状态和10个灯光花样,而且基于有限状态机,可以随时自己增加灯光花样。物料成本大概就十来块钱,非常适合新手入门制作玩,在STC单片机最小系统之外只需要1个开关2颗电阻8颗LED即可完成。扔掉你的排成一条线的跑马灯吧,同样的8个LED,立起来之后马上整个档次都不一样了~
这个电路还可以加个DS1302之类的时钟模块,做一个以8421码表示时间的钟,用4颗LED表示小时,分别是8,4,2,1,亮的灯加起来就是当前的小时。然后再用6颗LED表示分钟,分别是32,16,8,4,2,1,同理加起来就是当前的分钟~这个创意供各位参考,自己回去实现~只有自己看的懂也挺有意思。

看图说话。




接下来是说好的软件开源。
[pre lang="C" line="1"]/*————————————————————————————————————————
                         2x2x2光立方程序
                        Design by Radical
                                2015.5.9
                            CC-BY-NC
                        LOFTER:Ultrady.cn
————————————————————————————————————————*/

#include <STC12C2052AD.H>

int keysum = 0;
sbit layer1 = P1 ^ 6;
sbit layer2 = P1 ^ 7;
sbit a = P1 ^ 5;
sbit b= P1 ^ 4;
sbit c = P1 ^ 3;
sbit d = P1 ^ 2;

//呼吸灯部分的程序为杜洋《爱上单片机》例程基础上修改而成。
#define SPEED1        4 //变亮时间
#define SPEED2        5 //变暗时间
#define PWM                240 //亮度总级数
#define MAX                240 //设置最大亮度
unsigned int t = 1;
unsigned int i;
bit LOOP = 0; //循环切换标志


void delayms (unsigned int a){
        unsigned int i;
        while( --a != 0){
                for(i = 0; i < 600; i++);
        }
}

void delayus (unsigned int a){
        unsigned char i;
        while( --a != 0){
                for(i = 0; i < 12; i++);
        }                                     
}

void delay(){
        delayms(100);
}

void display (unsigned int a){
        P1 = 0x3C;
        delayus (a);
        P1 = 0xFC;
        delayus (PWM-a);
}

void xyround(){
        a = 1;
        delay();
        a = 0;
        b = 1 ;
        delay();
        b = 0;
        c = 1;
        delay();
        c = 0;
        d = 1;
        delay();
        d = 0;
}

void yzround(){
        layer1 = 1;
        a = 1;
        b = 1;
        delay();
        layer2 = 1;
        layer1 = 0;
        delay();
        a = 0;
        b = 0;
        c = 1;
        d = 1;
        delay();
        layer1 = 1;
        layer2 = 0;
        delay();
}

void yzround_ad(){
        layer1 = 1;
        a = 1;
        delay();
        layer2 = 1;
        layer1 = 0;
        delay();
        a = 0;
        d = 1;
        delay();
        layer1 = 1;
        layer2 = 0;
        delay();
}

void yzround_bc(){
        layer1 = 1;
        b = 1;
        delay();
        layer2 = 1;
        layer1 = 0;
        delay();
        b = 0;
        c = 1;
        delay();
        layer1 = 1;
        layer2 = 0;
        delay();
}

//主程序采用有限状态机结构,可以随时增加灯光花样而不需要改动其他程序。
//增加花样时增加一个keysum的case即可,然后将下方的中断处理程序中最大的case号改动。
void main()
{
        P1M0 = 0x00;
        P1M1 = 0x3C;
    EX0 = 1;//INT0中断允许        
        IT0 = 0;//INT0低电平中断
        EA=1;//开总中断
        P1=0x00;

    while(1)//LOOP        
   {          
                switch (keysum){
                        case 0://Light
                                P1 = 0x3C;
                                break;
                        case 1://Blink
                                P1 = 0x3C;
                                delayms(500);
                                P1 = 0xFC;
                                delayms(500);
                                break;
                        case 2:
                                if(LOOP == 0){ //变亮循环
                                        for(i = 0; i < SPEED1; i++){
                                                display(t);
                                        }
                                        t++;
                                        if(t>(MAX-2)){
                                                LOOP = 1;
                                        }
                                }
                                if(LOOP == 1){ //变暗循环
                                        for(i = 0; i < SPEED2; i++){
                                                display(t);
                                        }
                                        t--;
                                        if(t<2){
                                                delayms(750);
                                                LOOP = 0;

                                        }
                                }
                                break;
                        case 3://xy螺旋
                                P1=0x00;
                                layer1 = 1;
                                layer2 = 0;
                                xyround();
                                layer1 = 0;
                                layer2 = 1;
                                xyround();
                                break;
                        case 4://xy旋转
                                P1=0x00;
                                xyround();
                                break;
                       
                        case 5://yz螺旋
                                P1=0x00;
                                yzround_ad();
                                P1=0x00;
                                yzround_bc();
                                break;
                        case 6://yz旋转
                                P1=0x00;
                                yzround();
                                break;
                        case 7://上下
                                P1 = 0x7C;
                                delayms(500);
                                P1 = 0xBC;
                                delayms(500);
                                break;
                        case 8://前后
                                P1 = 0x30;
                                delayms(500);
                                P1 = 0x0C;
                                delayms(500);
                                break;
                                break;
                        case 9://左右
                                P1 = 0x24;
                                delayms(500);
                                P1 = 0x18;
                                delayms(500);
                                break;
                        case 10://上下侧面
                                P1=0x00;
                                P1 = 0x24;
                                delayms(500);
                                P1=0x00;
                                P1 = 0x7C;
                                delayms(500);
                                P1=0x00;
                                P1 = 0x18;
                                delayms(500);
                                P1=0x00;
                                P1 = 0xBC;
                                delayms(500);
                                break;
                        case 11://上下前后
                                P1 = 0x7C;
                                delayms(500);
                                P1 = 0x30;
                                delayms(500);
                                P1 = 0xBC;
                                delayms(500);
                                P1 = 0x0C;
                                delayms(500);
                                break;
                }
    }
}

void ISR_Key(void) interrupt 0//中断处理程序
{
        EX0 = 0;//INT0中断关闭
        IE0=0;//清零外部中断0标志位
        if (keysum < 11){//**********注意**********增加灯光花样后此处填写最大的case号。
                keysum++;
        }
        else{
                keysum = 0;
        }
        delayms(200);//延时一段时间
        EX0=1;//恢复外部中断0
}[/code]

下面附件是开源文件,包括了12C2052AD的头文件和程序的.c文件还有原理图。
由于我本人也很讨厌在网上好不容易找到的资源又要注册又要回复有些还要给钱才能下(特别是某UDN网你们都懂得)
所以下载权限不设限制。不过还是希望大家喜欢的话顶一顶~
开源万岁!本项目基于CC协议开源,转发请署名注明出处,禁止商业用途。极客工坊首发。


本人是摄影摄像爱好者,也喜欢搞HIFI耳机,目前在校就读嵌入式专业,同时服务于国内2个音频产品厂商。
相同兴趣的同学欢迎找我聊天吹水~
个人LOFTER网站:Ultrady.cn
说实话做这个视频比做电路本身辛苦多了。。剪片剪了一晚上死多少脑细胞,腰散架了。
看看片场实拍。。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 2 +5 +2 +2 收起 理由
幻生幻灭 + 2 喜欢
lawrencedon + 3 + 2 + 2 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-5-10 05:30:37 | 显示全部楼层
构思,焊接,编程,调试,拍摄,后期,压制,上传,发帖。累
帖子发出来之后来来去去又增改了上十遍,一转眼天已经亮了。。5点半了。
这个开源项目花了整整2天2夜的时间,除了吃饭睡觉就是在搞这个。极客都是熬夜命啊
今天是母亲节,妈妈节日快乐。这个项目就作为是献礼吧。各位小同学做好了记得拿给妈妈看(~ ̄▽ ̄)~
睡觉去。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-10 05:40:56 | 显示全部楼层
本帖最后由 Ultrady 于 2015-5-10 22:33 编辑

这次的作品一天之内得到这么多好评谢谢大家支持,
近期我还会继续制作高质素的8051单片机开源DIY项目发布出来,
新手福音~邀请您关注。

下次做个3x3x3的玩,花样应该多很多。
说到底我还是没去睡啊,快6点了
回复 支持 反对

使用道具 举报

发表于 2015-5-10 08:26:56 | 显示全部楼层
手工精细!片子更好 !
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-10 11:09:22 | 显示全部楼层
mavericklx 发表于 2015-5-10 08:26
手工精细!片子更好 !

多谢!消灭零回复!
回复 支持 反对

使用道具 举报

发表于 2015-5-10 11:24:06 | 显示全部楼层
确实是原创。
回复 支持 反对

使用道具 举报

发表于 2015-5-10 11:57:09 | 显示全部楼层
说实话代码可以缩小,而且=-=这2X2X2是不是和1X1X1那啥…………{:soso_e103:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-10 12:05:37 | 显示全部楼层
可恨的大菠萝 发表于 2015-5-10 11:57
说实话代码可以缩小,而且=-=这2X2X2是不是和1X1X1那啥…………

旋转那部分确实可以浓缩,直接操作整个并口,但是我怕新手理解不了灯是怎么走的,所以就没缩囖
回复 支持 反对

使用道具 举报

发表于 2015-5-10 12:42:57 | 显示全部楼层
简单得来也很可爱嘛
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-10 17:17:38 | 显示全部楼层
刚把昨晚做视频时缺了的镜头重新做了一个短的放上去了~
回复 支持 反对

使用道具 举报

发表于 2015-5-10 17:41:17 | 显示全部楼层
顶!非常赞同你说的“由于我本人也很讨厌在网上好不容易找到的资源又要注册又要回复有些还要给钱才能下”。所以我特意注册了,来回复。貌似你是我的qq好友,从空间里看到过来的。最近也喜欢光立方,多谢你的教程,大赞!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-10 19:00:04 | 显示全部楼层
yu819778035 发表于 2015-5-10 17:41
顶!非常赞同你说的“由于我本人也很讨厌在网上好不容易找到的资源又要注册又要回复有些还要给钱才能下”。 ...

哈哈我发朋友圈的时候习惯点同步到空间,这样看到的人多。感谢支持
回复 支持 反对

使用道具 举报

发表于 2015-5-10 21:42:03 | 显示全部楼层
很喜欢~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-10 22:20:19 | 显示全部楼层
本帖最后由 Ultrady 于 2015-5-10 22:29 编辑
幻生幻灭 发表于 2015-5-10 21:42
很喜欢~


多谢版主桑~
回复 支持 反对

使用道具 举报

发表于 2015-5-10 22:23:02 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 19:24 , Processed in 0.042939 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表