利用51单片机做出一些炫彩效果

  今天我们来讨论一下我们如何利用单片机做出一些炫彩的效果,而昨天好像是七夕节,很多人都把它当做了情人节,那么我们来做一个浪漫的“I  Love u”;今天我就把代码写出来,而不再是截图挂出来。效果图我也就拍出来了,你们如果有单片机可以自己复制代码下来看一些效果。(其实这一次的代码有一点跨度大了,毕竟前面我并没有说的很深入,现在一下子又变得看不懂了,不过慢慢来,我会在以后的博客中把后边的讨论写详细一点)代码如下,注释我来写了一部分,但是不全,我会慢慢把它补齐。

    效果大致如我以下描述:首先,LED灯慢慢的像流水灯一样一个接一个亮起来;而后是点阵从靠近LED灯的那一排开始亮起来,就像蛇一样游动,第一排是从第一个亮完最后一个,从第二排接着第一排的最后一个那侧开始亮(就像蛇游动)一直到最后一排;接下来是数码管,数码管只有那一个点“.“亮,像流水灯一样亮起来;前面效果都完之后所有的LED灯,点阵,数码管都会全部亮起来;点阵就会显示“I love u”那句话了,不过不是同时显示,成一个先后顺序。

(如果代码和注释中有误,请指出,我会第一时间和你沟通并改正,谢谢)

#include <reg52.h>
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;

//延时函数
void delay(unsigned int t){
    unsigned int i;
    for(i=0;i<t;i++);
}

//左移函数
void change1(){
    unsigned int j;
    for(j=0;j<8;j++){
        P0=~(0x01<<j);
        delay(10000);
    }
}
//右移函数
void change2(){
    unsigned int j;
    for(j=0;j<8;j++){
        P0=~(0x80>>j);
        delay(3000);
    }
}
//LED流水灯的依次点亮
void y6(unsigned int j){    
    ENLED=0;
    ADDR3=1;
    ADDR2=1;
    ADDR1=1;
    ADDR0=0;
    if(j==1){
        change1();
    }else{
        change2();
    }
}

//点阵的点亮
void y0_5(unsigned int i){
    unsigned int j;
    ENLED=0;
    ADDR3=0;
    switch(i){
        case 0:    ADDR2=1;    ADDR1=1;    ADDR0=1;    change2();    break;
        case 1:    ADDR2=1;    ADDR1=1;    ADDR0=0;    change1();    break;
        case 2:    ADDR2=1;    ADDR1=0;    ADDR0=1;    change2();    break;
        case 3:    ADDR2=1;    ADDR1=0;    ADDR0=0;    change1();    break;
        case 4:    ADDR2=0;    ADDR1=1;    ADDR0=1;    change2();    break;
        case 5:    ADDR2=0;    ADDR1=1;    ADDR0=0;    change1();    break;
        case 6:    ADDR2=0;    ADDR1=0;    ADDR0=1;    change2();    break;
        case 7:    ADDR2=0;    ADDR1=0;    ADDR0=0;    change1();    break;
    }
}

//数码管的点亮
void y0_s(unsigned int i,unsigned int wk){
    unsigned int j;
    ENLED=0;
    ADDR3=1;
    switch(i){
        case 0:    ADDR2=1;    ADDR1=0;    ADDR0=1;    break;
        case 1:    ADDR2=1;    ADDR1=0;    ADDR0=0;    break;
        case 2:    ADDR2=0;    ADDR1=1;    ADDR0=1;    break;
        case 3:    ADDR2=0;    ADDR1=1;    ADDR0=0;    break;
        case 4:    ADDR2=0;    ADDR1=0;    ADDR0=1;    break;
        case 5:    ADDR2=0;    ADDR1=0;    ADDR0=0;    break;
    }
    if(wk==1){
            P0=0x00;
        }else{
            P0=0x7f;
        }
}

//数码管的全部点亮

void alllion6(unsigned int wk){
    unsigned int j;
    ENLED=0;
    ADDR3=1;
    for(j=0;j<6;j++){
        switch(j){
            case 0:    ADDR2=1;    ADDR1=0;    ADDR0=1;    break;
            case 1:    ADDR2=1;    ADDR1=0;    ADDR0=0;    break;
            case 2:    ADDR2=0;    ADDR1=1;    ADDR0=1;    break;
            case 3:    ADDR2=0;    ADDR1=1;    ADDR0=0;    break;
            case 4:    ADDR2=0;    ADDR1=0;    ADDR0=1;    break;
            case 5:    ADDR2=0;    ADDR1=0;    ADDR0=0;    break;
        }
        if(wk==1){
            P0=0x00;
        }else{
            P0=0x7f;
        }
        delay(100);
    }
}

//点阵全部点亮
void alllion8(){
    unsigned int j;
    ENLED=0;
    ADDR3=0;
    for(j=0;j<8;j++){
        switch(j){
            case 0:    ADDR2=1;    ADDR1=1;    ADDR0=1;    P0=0x00;    break;
            case 1:    ADDR2=1;    ADDR1=1;    ADDR0=0;    P0=0x00;    break;
            case 2:    ADDR2=1;    ADDR1=0;    ADDR0=1;    P0=0x00;    break;
            case 3:    ADDR2=1;    ADDR1=0;    ADDR0=0;    P0=0x00;    break;
            case 4:    ADDR2=0;    ADDR1=1;    ADDR0=1;    P0=0x00;    break;
            case 5:    ADDR2=0;    ADDR1=1;    ADDR0=0;    P0=0x00;    break;
            case 6:    ADDR2=0;    ADDR1=0;    ADDR0=1;    P0=0x00;    break;
            case 7:    ADDR2=0;    ADDR1=0;    ADDR0=0;    P0=0x00;    break;
        }
        delay(100);
    }
}
//LED全部点亮

void alllionled(){
     ENLED=0;
    ADDR3=1;
    ADDR2=1;    
    ADDR1=1;    
    ADDR0=0;    
    P0=0x00;
}

//“I love U”中的“I”
void alllioni(){
    unsigned int j;
    ENLED=0;
    ADDR3=0;
    for(j=0;j<8;j++){
        switch(j){
            case 0:    ADDR2=1;    ADDR1=1;    ADDR0=1;    P0=0x00;    break;
            case 1:    ADDR2=1;    ADDR1=1;    ADDR0=0;    P0=0x00;    break;
            case 2:    ADDR2=1;    ADDR1=0;    ADDR0=1;    P0=0xe7;    break;
            case 3:    ADDR2=1;    ADDR1=0;    ADDR0=0;    P0=0xe7;    break;
            case 4:    ADDR2=0;    ADDR1=1;    ADDR0=1;    P0=0xe7;    break;
            case 5:    ADDR2=0;    ADDR1=1;    ADDR0=0;    P0=0xe7;    break;
            case 6:    ADDR2=0;    ADDR1=0;    ADDR0=1;    P0=0x00;    break;
            case 7:    ADDR2=0;    ADDR1=0;    ADDR0=0;    P0=0x00;    break;
        }
        delay(100);
    }
}

//“I love U”中的“love”
void alllionl(){
    unsigned int j;
    ENLED=0;
    ADDR3=0;
    for(j=0;j<8;j++){
        switch(j){
            case 0:    ADDR2=1;    ADDR1=1;    ADDR0=1;    P0=0xe7;    break;
            case 1:    ADDR2=1;    ADDR1=1;    ADDR0=0;    P0=0xc3;    break;
            case 2:    ADDR2=1;    ADDR1=0;    ADDR0=1;    P0=0x81;    break;
            case 3:    ADDR2=1;    ADDR1=0;    ADDR0=0;    P0=0x00;    break;
            case 4:    ADDR2=0;    ADDR1=1;    ADDR0=1;    P0=0x00;    break;
            case 5:    ADDR2=0;    ADDR1=1;    ADDR0=0;    P0=0x00;    break;
            case 6:    ADDR2=0;    ADDR1=0;    ADDR0=1;    P0=0x99;    break;
            case 7:    ADDR2=0;    ADDR1=0;    ADDR0=0;    P0=0xff;    break;
        }
        delay(100);
    }
}

//“I love U”中的“u”
void allliony(){
    unsigned int j;
    ENLED=0;
    ADDR3=0;
    for(j=0;j<8;j++){
        switch(j){
            case 0:    ADDR2=1;    ADDR1=1;    ADDR0=1;    P0=0x81;    break;
            case 1:    ADDR2=1;    ADDR1=1;    ADDR0=0;    P0=0x00;    break;
            case 2:    ADDR2=1;    ADDR1=0;    ADDR0=1;    P0=0x3c;    break;
            case 3:    ADDR2=1;    ADDR1=0;    ADDR0=0;    P0=0x3c;    break;
            case 4:    ADDR2=0;    ADDR1=1;    ADDR0=1;    P0=0x3c;    break;
            case 5:    ADDR2=0;    ADDR1=1;    ADDR0=0;    P0=0x3c;    break;
            case 6:    ADDR2=0;    ADDR1=0;    ADDR0=1;    P0=0x3c;    break;
            case 7:    ADDR2=0;    ADDR1=0;    ADDR0=0;    P0=0x3c;    break;
        }
        delay(100);
    }
}

main(){
    while(1){
        unsigned int  wk=0;
        unsigned int  wc=0;
        unsigned int j;

y6(1);//流水LED灯
        for(j=0;j<8;j++){
            y0_5(j);//点阵循环点亮   
        }
        for(j=0;j<6;j++){
            y0_s(j,0);//数码管
            delay(10000);    
        }
        //全亮
        for(j=0;j<200;j++){
            alllion6(1);
            delay(20);
            alllion8();
            delay(20);
            alllionled();
            delay(20);
        }
        //I love you
        for(wk=0;wk<200;wk++){
                alllioni();
                delay(50);
                alllionled();
                delay(50);
                alllion6(1);
                delay(50);    
        }
        for(wk=0;wk<200;wk++){
                alllionl();
                delay(50);
                alllionled();
                delay(50);
                alllion6(1);
                delay(50);        
        }
        for(wk=0;wk<200;wk++){
                allliony();
                delay(50);
                alllionled();
                delay(50);    
                alllion6(1);
                delay(50);    
        }
    }
}

时间: 2024-10-13 22:42:02

利用51单片机做出一些炫彩效果的相关文章

利用51单片机制作的电子时钟

最近研究起来了单片机,用的是国产STC98C52芯片. STC89C52是STC公司生产的一种低功耗.高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器.STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能.在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活.超有效的解决方案. 买了很长时间了可是一直在那里放着,今天重新拿出来写了一段电子时钟的C++程序,利用充电宝供

炫彩效果——窗体淡入淡出

在实际项目中,经常会有窗体弹出,为了不显得那么突兀,可以给加些动画过度效果,淡入淡出就是一种比较常见的动画. 1 using System; 2 using System.Windows.Forms; 3 4 namespace TestFormEffect 5 { 6 public partial class Form1 : Form 7 { 8 private readonly Timer _timer; 9 private readonly double _inspeed; 10 priv

[Micropython]发光二极管制作炫彩跑马灯

先甩锅 做完后才发现最后一个灯坏了,就坏了一个灯也不好意思去找淘宝店家,大家视频凑合着看把.不过并不影响实验效果.因为这个发光二极管白天不是很明显 晚上炫彩效果就能出来了.本次实验用的是8个灯珠,大家可以尝试更多用更多灯珠的,或者买灯带,那样呈现的效果会更酷.更炫!视频文章最后面. 实验器材(来自某宝,可惜没有实体店不然省很多麻烦) TPYBoard v102 1块 ws2812b RGB-Ring-8 1个 micro USB数据线 1条 杜邦线 若干 WS2812B是一个集控制电路与发光电路

炫彩logo粒子效果

h2{font-size:1.5em}p{text-indent:2em;}前端开发whqet,csdn,王海庆,whqet,前端开发专家 昨天我们学习了利用requestAnimationFrame优化动画控制,然后就忍不住冲动,在fork别人codepen的基础上,实现了这个炫彩logo粒子效果,效果预览如下. -------------------------------------------------------------------------------------------

使用51单片机点亮我们的点阵灯

通过前面我们都知道点亮我们的不管是点阵,数码管,还是LED灯,不仅要熟悉我们的代码还要会看我们的原理图和真值表,所以我们如果真的要写代码倒是其次的,首先我们得学会看我们的原理图和真值表,但是认识那个我们可以在网上找教程的,所以啊我这里就不去重诉别人的话了.那么我们今天要讨论什么问题勒!?我们今天讲一下点阵吧,点阵说实话对于单片机来说虽然并不是最重要的,但是点阵却是我们单片机中花样最多的之一.可能说到这么有人会说了,学了单片机我们有什么用呢,那么我们可以留意一下我们身边的一些物品,比如我们常在街上

[学习笔记]15个QA让你快速入门51单片机开发

一.C语言相关... 1 Q1:sbit与sfr代表是什么?有什么作用?... 1 Q2:#define OSC_FREQ  22118400L这句宏命令里的“L”是什么意思?... 1 Q3:我粘贴了别人的代码,怎么发现没有unit这个类型?... 1 Q4:为什么好多变量都是char类型?它不是字符类型吗?怎么可以用来计数?    1 Q4.1:51单片机中的char,int,long,float,double各占多少个字节,取值范围多大?    1 Q5:unsigned char dat

Windows 通用应用尝试开发 “51单片机汇编”总结

一.前言 终于完成windows通用应用“51单片机汇编”,半年前开始玩WindowsPhone开发的第一个真正意义上的App(还很多缺点=_=).开发从1月中旬考完试到今天,期间实习了半个月,玩了几天,算起来基本弄了3个多星期吧.不多说,总结总结. 二.开发数据准备 应用中主要的数据是单片机的汇编指令,我主要用XML文件来储存数据,没有使用SQLLite数据库,数据格式如下图: xml文件的数据是我手输入的,所以这是比较烦的.(可能有更简洁的办法获取数据). 而xml文件每个每个节点对应实例,

[51单片机学习笔记ONE]-----LED灯的多种使用方法

一.交替闪烁8个LED灯,时间间隔为1s 1 /****************************************************** 2 实验名称: 交替闪烁8个LED灯,时间间隔1s 3 实验时间: 2014年12月2日 4 ******************************************************/ 5 6 #include <reg51.h> 7 8 void delay(unsigned char a); 9 10 void m

51单片机指令详解

                                                            数据传递类指令 以累加器为目的操作数的指令  MOV A,Rn MOV A,direct MOV A,@Ri  MOV A,#data  第一条指令中,Rn代表的是R0-R7.第二条指令中,direct就是指的直接地址,而第三条指令中,就是我们刚才讲过的.第四条指令是将立即数data送到A中. 下面我们通过一些例子加以说明: MOV A,R1 :将工作寄存器R1中的值送入A,R