WLGK-51单片机接口技术基础实验 ——LED流水灯

时间:2021-11-04 19:48:28

WLGK-51单片机接口技术基础实验——LED流水灯

    

     当我们已经明白了LED灯的基本特性,我们就会对街头上五光十色的LED灯的技术原理了然于胸。有小伙伴说,LED的使用感觉还是不太过瘾,那么今天阿甘老师将带领大家来实现一个LED的小应用—LED流水灯。

      快来感受一下吧,技术的世界里,其乐无穷!

 

万立高科官网:www.wanligaoke.com

万立高科官方商城:http://www.wlgkbj.com

万立高科淘宝直销店铺:https://robot-ds.taobao.com

万立高科-单片机技术交流群:477250411

一、  实验目的

掌握以下方法:

1.掌握在实际使用环境下,如何配合硬件原理图实现LED流水灯程序的编写;

2.掌握如何将编译生成的可执行文件LED.HEX文件下载到单片机并运行起来看到试验效果

二、实验环境

1.个人微机一台:Windows操作系统(Win xp或者win7均可以);

2.Keil 4集成开发环境;

3.串口下载线一根;

4.WLGK-51ZC开发板。

三、试验步骤

在做学习这个试验之前,我首先给大家讲一下什么叫LED流水灯??它是一个什么样的效果:顾名思义,多个LED灯点亮的效果好像流水一样在流。再具体一点:比如现在有8LED灯并排,如果每次只点亮1LED灯,那么效果就应该是:每次正好点亮相邻的一个LED灯,而其他灯熄灭。

 

下面我们将沿着这个思路一步一步带你实现这个过程和现象。具体的可以拆分成下面几步:

首先我们学习在系统上电后如何点亮1LED灯,而其他LED灯熄灭;

然后我们学习将8LED灯都按照这个效果依次实现,并循环起来;

 

3.1 LED灯硬件电路原理图分析

这里我们可以看到“WLGK-51ZC开发板”*有8路LED灯。这8路是并列的,也就是说我们学会控制一路LED灯,就可以学会控制8路LED灯。

LED点亮的条件:当阳极与阴极之间电压的压降到达一定参考值时,LED就会发光点亮,下面是一个压降的参考值。这里我们可以看到上图VCCJP4端子用短线帽接上后,电压为5V,然后每一路LED串联了一个电阻(排阻),这个LED两端的压降(LED阳极电压-LED阴极电压)只要满足下面的值,就可以点亮。

所以我们当我们给P00端0V的电压的时候,经过二极管的电流就可以点亮LED。

3.2 单步控制LED灯

我们先来实验一下控制P00路LED灯(D2)亮,其他路灯(D3-D9)熄灭。

OK,下面看一下完整的程序:

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

*                                                               

* WLGK-51ZC开发板接口技术基础实验-LED流水灯-演示程序                 

*                                                                

* 版本: V1.0 (2015/9/27)                                          

* 作者: 阿甘 (单片机技术交流群:477250411 )                                 

* 网站: www.wanligaoke.com(万立高科)                            

*                                                                

*                                                               

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

 

#include<reg52.h>

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

第一行是一个"文件包含"处理。

所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来

这里的程序虽然只有短短几行,但C编译器在处理的时候却要处理几十或几百行

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

sbit dat0=P0^0;                                         //定义IO口,P00对应的IO控制口

sbit dat1=P0^1;                                         //定义IO口,P01对应的IO控制口

sbit dat2=P0^2;                                         //定义IO口,P02对应的IO控制口

sbit dat3=P0^3;                                         //定义IO口,P03对应的IO控制口

sbit dat4=P0^4;                                         //定义IO口,P04对应的IO控制口

sbit dat5=P0^5;                                         //定义IO口,P05对应的IO控制口

sbit dat6=P0^6;                                         //定义IO口,P06对应的IO控制口

sbit dat7=P0^7;                                         //定义IO口,P07对应的IO控制口

 

void delay02s(void)                            //约延时0.2秒子程序

{

       unsigned char i,j,k;                   //定义3个无符号字符型数据。

       for(i=20;i>0;i--)//作循环延时

{                         

          for(j=20;j>0;j--)

       {

              for(k=240;k>0;k--);

       }

    }

}

 

void main(void)                                        //每一个C语言程序有且只有一个主函数,

{

       while(1)                                         //循环条件永远为真,以下程序一直执行下去。

       {

              dat0=0;                                   // I/O口P0.0输出高电平,小灯点亮。

        dat1=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat2=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat3=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat4=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat5=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat6=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat7=1;                                   // I/O口P0.0输出高电平,小灯点灭。

 

delay02s();                                 //延时经过0.2秒。    

 

//这里加上全部熄灭的控制,主要是为了效果观察更明显

              dat0=1;                                   // I/O口P0.0输出高电平,小灯点亮。

        dat1=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat2=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat3=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat4=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat5=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat6=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat7=1;                                   // I/O口P0.0输出高电平,小灯点灭。

 

        while(1);                    //程序停止在这里,不再往下循环

       }

}

    实现现象:LEDD2常亮,其他LED灯(D3-D9)熄灭。即已经达到了我们的实现目的。

3.2 多步控制LED灯

   多步控制LED灯,怎么控制了?小伙伴很容易就容易联想到将上面的代码复制一下稍作修改就可以完成了:

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

*                                                               

* WLGK-51ZC开发板接口技术基础实验-LED流水灯-演示程序                 

*                                                                

* 版本: V1.0 (2015/9/27)                                          

* 作者: 阿甘 (单片机技术交流群:477250411 )                                 

* 网站: www.wanligaoke.com(万立高科)                            

*                                                                

*                                                               

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

 

#include<reg52.h>

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

第一行是一个"文件包含"处理。

所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来

这里的程序虽然只有短短几行,但C编译器在处理的时候却要处理几十或几百行

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

sbit dat0=P0^0;                                         //定义IO口,P00对应的IO控制口

sbit dat1=P0^1;                                         //定义IO口,P01对应的IO控制口

sbit dat2=P0^2;                                         //定义IO口,P02对应的IO控制口

sbit dat3=P0^3;                                         //定义IO口,P03对应的IO控制口

sbit dat4=P0^4;                                         //定义IO口,P04对应的IO控制口

sbit dat5=P0^5;                                         //定义IO口,P05对应的IO控制口

sbit dat6=P0^6;                                         //定义IO口,P06对应的IO控制口

sbit dat7=P0^7;                                         //定义IO口,P07对应的IO控制口

 

void delay02s(void)                            //约延时0.2秒子程序

{

       unsigned char i,j,k;                   //定义3个无符号字符型数据。

       for(i=20;i>0;i--)//作循环延时

{                         

          for(j=20;j>0;j--)

       {

              for(k=240;k>0;k--);

       }

    }

}

 

void main(void)                                        //每一个C语言程序有且只有一个主函数,

{

       while(1)                                         //循环条件永远为真,以下程序一直执行下去。

       {

              dat0=0;                                   // I/O口P0.0输出高电平,小灯点亮。

        dat1=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat2=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat3=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat4=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat5=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat6=1;                                   // I/O口P0.0输出高电平,小灯点灭。

        dat7=1;                                   // I/O口P0.0输出高电平,小灯点灭。

delay02s();                                 //延时经过0.2秒。    

 

              dat0=1;                                  

        dat1=0;                                  

        dat2=1;                                  

        dat3=1;                                  

        dat4=1;                                  

        dat5=1;                                  

        dat6=1;                                  

        dat7=1;                                        

delay02s();                                 //延时经过0.2秒。

 

              dat0=1;                                  

        dat1=1;                                  

        dat2=0;                                  

        dat3=1;                                  

        dat4=1;                                  

        dat5=1;                                  

        dat6=1;                                  

        dat7=1;                                  

delay02s();                                 //延时经过0.2秒。

 

              dat0=1;                                  

        dat1=1;                                  

        dat2=1;                                  

        dat3=0;                                  

        dat4=1;                                  

        dat5=1;                                  

        dat6=1;                                  

        dat7=1;                                  

delay02s();                                 //延时经过0.2秒。

 

              dat0=1;                                  

        dat1=1;                                  

        dat2=1;                                  

        dat3=1;                                  

        dat4=0;                                  

        dat5=1;                                  

        dat6=1;                                  

        dat7=1;                                  

delay02s();                                 //延时经过0.2秒。

 

              dat0=1;                                  

        dat1=1;                                  

        dat2=1;                                  

        dat3=1;                                  

        dat4=1;                                  

        dat5=0;                                  

        dat6=1;                                  

        dat7=1;                                  

delay02s();                                 //延时经过0.2秒。

 

              dat0=1;                                  

        dat1=1;                                  

        dat2=1;                                  

        dat3=1;                                  

        dat4=1;                                  

        dat5=1;                                  

        dat6=0;                                  

        dat7=1;                                  

delay02s();                                 //延时经过0.2秒。

 

              dat0=1;                                  

        dat1=1;                                  

        dat2=1;                                  

        dat3=1;                                  

        dat4=1;                                  

        dat5=1;                                  

        dat6=1;                                  

        dat7=0;                                  

delay02s();                                 //延时经过0.2秒。

 

//这里注释掉停顿,单片机就会循环执行程序指令

        //while(1);                    //程序停止在这里,不再往下循环

       }

}

3.3 多步控制LED灯

   通过上面的两个例子我们发现单片机程序写起来并不是我们想象的那么困难,如果调试不出结果怎么办?加1while(1);语句就可以调试,这是很简单实用的办法,当然更高级的就是单步调试和仿真器,大家可以自行研究下,我们只要掌握了它的本质,万变不离其宗。

   但是我们感觉上面的程序虽然逻辑上十分简单明了,写起来还挺费劲的嗯,的确是这样,有两种方式:

第一种方式:我们将LED灯的编号控制写成一个函数,即一个模块,这个是一种思路,这个随着大家软件编程能力的提高,自然而然的会掌握;我不在这里单独给大家讲。

第二种方式:是LED灯的另外一种控制方式,准备的说是单片机的IO还可以有另外一种控制方式:除了我们在LED闪烁灯实验里降到的位控制(sbit),还有字节控制方式,一次就可以控制8IO口,也就是说可以一次控制8LED灯。

   阿甘老师给出参考程序如下,大家仔细体会一下:

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

*                                                               

* WLGK-51ZC开发板接口技术基础实验-LED流水灯-演示程序                 

*                                                                

* 版本: V1.0 (2015/9/27)                                          

* 作者: 阿甘 (单片机技术交流群:477250411 )                                 

* 网站: www.wanligaoke.com(万立高科)                            

*                                                                

*                                                               

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

 

#include<reg52.h>

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

第一行是一个"文件包含"处理。

所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来

这里的程序虽然只有短短几行,但C编译器在处理的时候却要处理几十或几百行

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

 

void delay02s(void)                            //约延时0.2秒子程序

{

       unsigned char i,j,k;                   //定义3个无符号字符型数据。

       for(i=20;i>0;i--)//作循环延时

{                         

          for(j=20;j>0;j--)

       {

              for(k=240;k>0;k--);

       }

    }

}

 

void main(void)                                        //每一个C语言程序有且只有一个主函数,

{

       while(1)                                         //循环条件永远为真,以下程序一直执行下去。

       {

P0 = 0xfe;                    //即十六进制的0xfe对应二进制11111110

delay02s();                                 //延时经过0.2秒。    

 

//这里加上全部熄灭的控制,主要是为了效果观察更明显

P0 = 0xff;                    //即十六进制的0xfe对应二进制11111111

 

        while(1);                    //程序停止在这里,不再往下循环

       }

}

  很简单吧:这里阿甘老师要提醒大家的是P0的P一定要大写,这个是在头文件里面标注的一个单片机寄存器标号。

  好的,下面大家自己将这个程序改成流水灯的效果,程序的编写逻辑是一致的。

四、试验总结与引申

好了,到这里了,相信小伙伴对LED的使用十分熟练了,留给大家一个任务:

任务:如何实现2路或多路LED的流水效果??

这应该是一个很简单的任务,但是大家一定要动手去做看到效果,做IT行业什么作重要,嗯,逻辑能力的确很重要,但要想爬上高山,努力和实践最为重要,我们应该从一开始就养成一个实干的态度,不要纸上谈兵。

 

万立高科-阿甘老师 感谢您的参与,精彩一路相随!!!

万立高科官网:www.wanligaoke.com

万立高科官方商城:http://www.wlgkbj.com

万立高科淘宝直销店铺:https://robot-ds.taobao.com

万立高科单片机技术交流群:477250411