用51单片机实现爱心跑马灯程序

发布者:数据舞者最新更新时间:2020-05-04 来源: eefocus关键字:51单片机  爱心跑马灯  32个LED灯 手机看文章 扫描二维码
随时随地手机看文章

本人闲来无事做,见实验室的小伙伴用LED等做了一个跑马灯,顿时引来了一大群妹子,当时就不服了,哼,不就是一个流水灯,说的跟谁不会一样


制作的是32个LED灯的爱心流水灯,至于灯怎么安放,我就不多说了,关键是怎么连接布线。


由于条件有限,没有制作PCB的工具,所以就用的洞洞板,32个LED共阴极,连接在51单片机的GND上,每个LED的正极分别连接单片的一个引脚,


我的所有线路全是用电烙铁焊接的,线路丑爆了,在此就不上图了,为了后续程序好写一点,LED的正极和单片机的引脚的连线最好多考虑一下


好了,废话不多说了,直接上代码,只做了几个动画,可以按照自己的想法再添加


#include

#include

#include

 

void liushui();

void rjl();    //渐亮

void rja();    //渐暗

void huaxin();

void huaxin2();

void huaxin3();

void zkb(unsigned char d);

void ys1ms(unsigned int s); //延时声明,修改s的数值,就可以改变时间

 

unsigned char code table[11]={0xff,0xff ,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};

unsigned char code table6[11]={0xff,0xff ,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff};

unsigned char code table2[8]={0x7f,0x3f ,0x1f,0x0f,0x07,0x03,0x01,0x00};

unsigned char code table3[8]={0xfe,0xfc ,0xf8,0xf0,0xe0,0xc0,0x80,0x00};

unsigned char code table4[9]={0x00,0x01 ,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};

unsigned char code table5[9]={0x00,0x80 ,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};

 

unsigned char i; 

unsigned char j; 

unsigned char k;

unsigned char m;

 

int main()

{

EA=1;//打开中断,使用中断方便调试查看模式

EX0=1; //允许外部中断0中断

EX1=1; //允许外部中断1中断

PX0=1; // 外部中断0位高优先级

while(1)  //无限循环

{

liushui();   ////////////////////

ys1ms(50);

huaxin2();   

ys1ms(50);

rja();

ys1ms(100);

 

huaxin(); ////////////////////

rjl();

rja();

ys1ms(100);

 

huaxin3();   ////////////////////

rja();

ys1ms(100);

 

}

return 0;

}

 

void liushui()

{

for(i = 9; i > 0; i--)

{

P1 = table[i];

ys1ms(50);

}

for(i = 2; i <= 10; i++)

{

P0 = table[i];

ys1ms(50);

}

for(i = 9; i > 0; i--)

{

P2 = table[i];

ys1ms(50);

}

for(i = 9; i > 0; i--)

{

P3 = table[i];

ys1ms(50);

}

}

 

 void ys1ms(unsigned int s)    //定时器精确延时1毫秒函数,改变S数值即改变时间

 {

  TR0=1;

while(s!=0)

{

TH0=-(7629/256);

TL0=-(7629%256);

while(TF0!=1);

TF0=0;

s--;

}

TR0=0;

 }

 

 /****************************************************************************/

void rjl()  //渐亮函数 

{   

    unsigned char a, b;//a控制延时长度 b控制循环周期      

P0 = 0xff;

P1 = 0xff;

P2 = 0xff;

P3 = 0xff;

    a = 0;   

    for (b=250; b>0; b--)   //循环周期设置

    {   

            a++;   

            zkb (a);      //延时长度随a而改变    

            P0 = 0xff;

P1 = 0xff;

P2 = 0xff;

P3 = 0xff;

            a = ~a;         //a值取反,决定灯灭时的占空比    

            zkb (a);   

            P0 = 0x00;

P1 = 0x00;

P2 = 0x00;

P3 = 0x00;

        a = ~a;         //a值取反 使a回到原值继续循环 

         }

 }

/****************************************************************************/

void rja()  //渐暗函数

{

unsigned char a, b;//a控制延时长度 b控制循环周期    

    P0 = 0x00;

P1 = 0x00;

P2 = 0x00;

P3 = 0x00;            //亮起LED 

a = 0;   

        for (b=250; b>0; b--)   

        {   

            a++;   

            zkb (a);   

            P0 = 0x00;

P1 = 0x00;

P2 = 0x00;

P3 = 0x00;

        a = ~a;   

            zkb (a);   

            P0 = 0xff;

P1 = 0xff;

P2 = 0xff;

P3 = 0xff;  

        a = ~a;   

        }

}

void huaxin()

{

for(j = 0; j < 2; j++)

{

  for(i = 0; i < 8; i++)

{

P1 = table2[i];

P3 = table3[i];

ys1ms(50);

}

for(i = 0; i < 8; i++)

{

P0 = table3[i];

P2 = table3[i];

ys1ms(50);

}

for(i = 0; i < 9; i++)  

{

P2 = table5[i];

P0 = table5[i];

ys1ms(50);

}

for(i = 0; i < 9; i++)

{

P3 = table5[i];

P1 = table4[i];

ys1ms(50);

}

ys1ms(100);

}

}

void huaxin2()

{

for(i = 0; i < 8; i++)

{

P1 = table2[i];

ys1ms(50);

}

for(i = 0; i < 8; i++)

{

P0 = table3[i];

ys1ms(50);

}

for(i = 0; i < 8; i++)

{

P2 = table2[i];

ys1ms(50);

}

for(i = 0; i < 8; i++)

{

P3 = table2[i];

ys1ms(50);

}

}

void huaxin3()

{

k = 0;

for(m = 0; m < 2; m++)

{

for(j = 0; j < 4; j++)

{

for(i = 9; i > 0; i--)

{

P1 = table[i];

P0 = table6[i];

P2 = table[i];

P3 = table[i];

ys1ms(50);

}

}

 

for(i = 0; i < 8; i++)

{

P1 = table2[i];

P0 = table3[i];

P2 = table2[i];

P3 = table2[i];

ys1ms(50);

}

if(k == 0)

{

for(i = 0; i < 8; i++)

{

    P1 = table5[i];

P0 = table4[i];

P2 = table5[i];

P3 = table5[i];

ys1ms(50);

}

}

ys1ms(100);

k++;

}

}

/****************************************************************************/

void zkb(unsigned char d)   //占空比函数,由d决定延时长度    

{      

    unsigned char i;   

    while( --d != 0)   

    {   

        for(i = 0; i < 1; i++);   //占空比时间设置

    }                         

/****************************************************************************/  

 

到此,把妹神器就完成了,快去送给妹子吧

关键字:51单片机  爱心跑马灯  32个LED灯 引用地址:用51单片机实现爱心跑马灯程序

上一篇:51单片机,点阵显示汉字(C语言)
下一篇:使用51单片机点亮我们的点阵灯

推荐阅读最新更新时间:2024-11-09 02:29

如何利用51单片机同时扩展RAM和ROM
下面这个系统中,8051同时扩展片外程序存储器和数据存储器,两片存储器的片选信号都接地, 即同时有效,也就是说,这两片存储器无需选择。 51同时扩展RAM和ROM 下面来分析这个问题,该系统中虽然有两片存储器,但由于两片存储器的输入,输入允许信号不同,程序存储器没有输入允许,其输出允许由8051的引脚PSEN控制,只有当程序存储器的片选信号和输出允许信号同时有效时,程序存储器的总线才挂接到CPU总线上 。否则,程序存储器的所有总线引脚都为高阻态,即相当于存储器与CPU总线断开。 数据存储器的输入允许端为WR,受控于8051的P3.6, 输出允许信号为RD,受控于8051的P3.7,数据存储器要与8051挂接的条件是片选信号
[单片机]
51单片机流水灯控制(5种方法)
实现流程: 1. 新建一个工程(新项目) 2. 查看原理图确定需求(流水灯)对应LED引脚在单片机上的哪个引脚 3. 编写程序(通过查看原理图可以看到我们需要控制整个P2口以控制8个LED灯) 4. 编译程序,下载程序至开发板 5. 查看效果(调试) 进制转换表(因为单片机首先处理的是十六进制的数据,所以我们需要将二进制控制需求转换成十六进制去写代码): 控制代码: #include REGX52.H //头文件 #include Delay.h #include intrins.h /* ---------------------------------------------
[单片机]
<font color='red'>51单片机</font>流水灯控制(5种方法)
51单片机小白零基础教程——数码管的静态显示,以及数码管拓展程序
一、数码管的显示原理 数码管:是一种可以显示数字和其他信息的电子设备,可以看成是多个二极管的组成。 数码管有单位数码管、双位数码管、四位数码管,我们开发板上的数码管为2个四位数码管。 数码管显示原理:通过点亮内部的发光二极管来发光 引脚:又被称为管脚,从集成电路内部电路引出与外围电路的接线,所有的引脚构成了这块芯片的接口 单位数码管的引脚有10个,内部一共有8个小的发光二级管,还有2个引脚是公共端,其实只有一个公共端,但是生产厂家为了封装统一,把这2个引脚连接在了一起。 数码管根据其公共端所接的阳极和阴极的不同,分为了共阴极数码管和共阳极数码管。 共阳极接法:几个二极管的阳极接在一起,接到VCC(高电平),
[单片机]
<font color='red'>51单片机</font>小白零基础教程——数码管的静态显示,以及数码管拓展程序
基于51单片机的简易时钟设计
功能: 1、使用 单片机 内部定时器实现时分秒计时 2、能够设置闹钟时间 3、闹钟时间到,蜂鸣器响 4、使用LCD1602显示时间 部分程序: #include reg51.h #include lcd1602.h #define uchar unsigned char #define uint unsigned int sbit beep=P3^2;//蜂鸣器 sbit k1=P1^0;//按钮 sbit k2=P1^1; sbit k3=P1^2; sbit k4=P1^3; sbit k5=P1^4; sbit k6=P1^5; sbit k7=P1^6; sbit k8=P1^7; uchar shi=11,fen=5
[单片机]
基于<font color='red'>51单片机</font>的简易时钟设计
51单片机中变量的定义及应用方法
变量就是一种在程序执行过程中其值能不断变化的量。要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义一个变量的格式如下: 在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(statIC)和寄存器(register),缺省类型为自动(auto)。 而这里的数据类型则是和我们在第四课中学习到的名种数据类型的定义是一样的。说明了一个变量的数据类型后,还可选择说明该变量的存储器类型。存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。注意的是在AT89C51芯
[单片机]
<font color='red'>51单片机</font>中变量的定义及应用方法
51单片机实现按键控制LED灯亮灭
#include reg51.h //头文件 sbit LED=P2^0;//位定义LED灯 sbit k1=P3^1;//位定义按键 void delay()//延时函数 { unsigned char a,b; for(a=0;a 200;a++) for(b=0;b 200;b++); } void key()//按键处理函数 { if(k1==0)//判断按键是否按下(按键按下时k=0) { delay();//如果按下按键延时消抖 if(k1==0)//如果按键仍然按下 { LED=~LED;//对LED取反,原来亮则灭,原来灭则亮 } while(!k1);//等待
[单片机]
89C51单片机的步进电动机控制系统设计
本文为大家带来两个89C51单片机的步进电动机控制系统设计。 89C51单片机的步进电动机控制系统设计一 系统整图如图1所示,本系统采用外部中断方式,p0口作为信号的输入部分,p1口为发光二极管显示部分,p2口作为电机的驱动部分。 图1 系统整图 电源部分 利用LM7812和LM7805芯片得到12V和5V的电压,它们的应用要注意以下几点: (1)输入输出压差不能太大,太大则转换效率急速降低,而且容易击穿损坏; (2)输出电流不能太大,1.5A 是其极限值。大电流的输出,散热片的尺寸要足够大,否则会导致高温保护或热击穿; (3)输入输出压差也不能太小,大小效率很差。 其中12V电压给步进电机供电,5V电压则给单片机供电。分
[单片机]
89C<font color='red'>51单片机</font>的步进电动机控制系统设计
基于51单片机的霍尔水流量计设计
1、开发准备 (1)YF-B1流量传感器一个 (2)51开发板一个 2、基础知识 (1)YF-B1流量传感器只有三根线。即数据线、VCC、GND。数据线输出为占空比为50%的方波。当水流通过水流转子组件时,磁性转子转动并且转速随着流量的变化而成线性变化。霍尔传感器(霍尔元件采样)输出相应的脉冲信号。其流量脉冲特性计算公式为:脉冲f(Hz)=8.1x流量Q(L/min)-3。 (2)51单片机的中断工作方式。51单片机有定时器T0和T1,他们既有定时又有计数的功能。通过设置相关的特殊功能寄存器就可以启用定时或计数功能。需要注意的是,定时器系统是单片机内部一个独立的硬件部分,CPU一旦设置定时功能,定时器便在晶振的作用下计时
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved