WLGK-51单片机接口技术基础实验—LED闪烁灯
当我们开始接触单片机,首先接触的第一个实验就是LED灯的使用,类似于我们学习软件开始接触的第一个程序“HelloWorld”,这个实验是带领我们走入“软硬件综合使用”的一个很好入门示例,51单片机是他的一个载体。下面小伙伴们,让我们一起来揭开LED的神秘面纱吧!
万立高科官网:
万立高科官方商城:
万立高科淘宝直销店铺:
万立高科-单片机技术交流群:477250411
一、 实验目的
掌握以下方法:
1.掌握LED的电子特性;
2.掌握在实际使用环境下,如何配合硬件原理图实现LED闪烁灯程序的编写;
3.掌握如何将编译生成的可执行文件LED.HEX文件下载到单片机并运行起来看到试验效果
二、实验环境
1.个人微机一台:Windows操作系统(Win xp或者win7均可以);
2.Keil 4集成开发环境;
3.串口下载线一根;
4.WLGK-51ZC开发板。
三、试验步骤
在做学习这个试验之前,我们首先冥想一下:LED闪烁灯是一个什么样的效果?我相信即使从未接触过单片机的小伙伴,也很容易想象到是这样的一个效果:“亮-灭-亮-灭-…”,是这样一个亮和灭交替的过程。建立这个概念非常重要,下面我们将沿着这个思路一步一步带你实现这个过程和现象。具体的可以拆分成下面几步:
首先我们学习在系统上电后如何点亮LED灯;
然后我们学习在LED灯点亮以后,如何将LED灯熄灭;
最后我们学习如何控制LED灯一亮一灭;
这里最后一步,可能有人会问,阿甘老师,LED亮和灭都有了,一亮一灭不是很简单吗?把这两个步骤连接起来不就可以了吗?嗯,小伙伴都的确很聪明,这里我先带小伙伴跟我一起联想一下,一亮一灭,好像是这样,但是……如果亮和灭之间足够快,好比“亮-灭-亮”中间“灭”的时间足够短,是不是就相当于常亮(“亮-亮”),人眼并不能感觉到LED灭的这一个效果,这就是技术理论实现与做产品的一个区别,我们在学习和工作中将会经常遇到类似的思考,这就是我们慢慢积累起来的独特经验。这样一个性质就是LED最基本的一个电子特性,他将深刻的印在我们的脑海里。这就是这个试验,阿甘老师要给大家讲的LED的电子特性,下面的试验我将带大家去感觉一下这个效果。
3.1 LED灯硬件电路原理图分析
这里我们可以看到“WLGK-51ZC开发板”中共有8路LED灯。这8路是并列的,也就是说我们学会控制一路LED灯,就可以学会控制8路LED灯。
LED点亮的条件:当阳极与阴极之间电压的压降到达一定参考值时,LED就会发光点亮,下面是一个压降的参考值。这里我们可以看到上图VCC在JP4端子用短线帽接上后,电压为5V,然后每一路LED串联了一个电阻(排阻),这个LED两端的压降(LED阳极电压-LED阴极电压)只要满足下面的值,就可以点亮。
所以我们当我们给P00端0V的电压的时候,经过二极管的电流就可以点亮LED。
3.2 LED灯点亮
假设我们现在来控制P00路LED灯,那我们只需要P00端输出低电平就可以控制LED灯D2。程序上怎么来控制P00端输出低电平了?答案如下:
sbit dat=P0^0; //定义IO口,P00对应的IO控制口 dat = 0; //P00的标号dat赋值为0,表示为低电平 |
OK,下面看一下完整的程序:
/****************************************************************** * * WLGK-51ZC开发板接口技术基础实验-LED闪烁灯-演示程序 * * 版本: V1.0 (2015/9/26) * 作者: 阿甘 (单片机技术交流群:477250411 ) * 网站: (万立高科) * * ******************************************************************/
#include<reg52.h> /***************************************************************** 第一行是一个"文件包含"处理。 所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来 这里的程序虽然只有短短几行,但C编译器在处理的时候却要处理几十或几百行 *******************************************************************/ sbit dat=P0^0; //定义IO口,P00对应的IO控制口
void main(void) //每一个C语言程序有且只有一个主函数, { while(1) //循环条件永远为真,以下程序一直执行下去。 { dat=0; // I/O口P0.0输出高电平,小灯点亮。 } } |
实现现象:LED常亮。即已经达到了我们的实现目的。
3.2 LED灯熄灭
接上述内容,那么LED如何熄灭?答案很容易想到,如下:
sbit dat=P0^0; //定义IO口,P00对应的IO控制口 dat = 1; //P00的标号dat赋值为1,表示为高电平 |
OK,下面看一下完整的程序:
/****************************************************************** * * WLGK-51ZC开发板接口技术基础实验-LED闪烁灯-演示程序 * * 版本: V1.0 (2015/9/26) * 作者: 阿甘 (单片机技术交流群:477250411 ) * 网站: (万立高科) * ******************************************************************/
#include<reg52.h> /***************************************************************** 第一行是一个"文件包含"处理。 所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来 这里的程序虽然只有短短几行,但C编译器在处理的时候却要处理几十或几百行 *******************************************************************/ sbit dat=P0^0; //定义IO口,P00对应的IO控制口
void main(void) //每一个C语言程序有且只有一个主函数, { while(1) //循环条件永远为真,以下程序一直执行下去。 { dat=1; // I/O口P0.0输出高电平,小灯点亮。 dat=0; // I/O口P0.0输出高电平,小灯点亮。 } } |
实现现象:LED长亮。Why?回顾一下我们在一开始讲的LED电子特性。那么下面怎么来做了?嗯,有小伙伴说,阿甘老师,在亮和灭之间加一个延时,让亮常亮一会儿,灭长灭一会儿,这样不就可以了吗?嗯,阿甘老师想说的是:事实就是这样的,我们只是程序的搬运工,哈哈,开个玩笑,完整程序如下:
/****************************************************************** * * WLGK-51ZC开发板接口技术基础实验-LED闪烁灯-演示程序 * * 版本: V1.0 (2015/9/26) * 作者: 阿甘 (单片机技术交流群:477250411 ) * 网站: (万立高科) * * ******************************************************************/
#include<reg52.h> /***************************************************************** 第一行是一个"文件包含"处理。 所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来 这里的程序虽然只有短短几行,但C编译器在处理的时候却要处理几十或几百行 *******************************************************************/ sbit dat=P0^0; //定义IO口,P00对应的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) //循环条件永远为真,以下程序一直执行下去。 { dat=1; // I/O口P0.0输出高电平,小灯点亮。 delay02s(); //延时经过0.2秒。 dat=0; // I/O口P0.0输出高电平,小灯点亮。 delay02s(); //延时经过0.2秒。 } } |
实现现象:实现了LED灯一闪一灭的闪烁效果。
3.2 LED灯闪烁
有小伙伴会问:阿甘老师,你明明前两步做的是LED点亮和熄灭的效果,为什么最后弄出来一个闪烁的效果,这和我想要的效果不符??抗议!!!
好的,小伙伴稍安勿躁,阿甘老师来给大家说明一下:
(1) 首先,单片机的程序运行有一个什么特性??单片机的程序运行是一个单流程的环境,也就是说会一步一步的执行,即每一刻单片机MCU运行的时候会顺序执行程序。所以写单片机程序实际看起来就好比在时间的这样一个维度上去完成搭积木的一个过程,十分有趣,这是阿甘老师要给大家说明的第一点;
(2) 然后,上述的Main函数中的while(1)是做什么用的?防止单片机程序跑飞,不能按照我想要的闪烁效果来讲??为什么程序会跑飞了??这是因为外部环境可能会干扰单片机的电气引脚的电平,比如手指带静电碰一下,这个小伙伴很容易理解。但一般这种现象在学习过程中频率出现较低。但在日后的工作项目中,我们是需要去考虑这样的一种情况,我们常常需要去设计工业级甚至军工级的产品,每一种设计细节我们都需要考虑,这个问题随着小伙伴经验的慢慢积累,就会慢慢明了解决。我们通常采取的是一种看门狗定时喂狗的方式,这个我会在后面给大家单独讲解。
这里的while(1){}是单片机程序的一个标准写法,程序如下:
void main(void) //每一个C语言程序有且只有一个主函数, { while(1) //循环条件永远为真,以下程序一直执行下去。 { …… } } |
(3)如果我们想要程序实现亮和灭的效果怎么实现了?而不是闪烁的效果,也很简单,程序如下,小伙伴憋说话,用心感受一下:
/****************************************************************** * * WLGK-51ZC开发板接口技术基础实验-LED闪烁灯-演示程序 * * 版本: V1.0 (2015/9/26) * 作者: 阿甘 (单片机技术交流群:477250411 ) * 网站: (万立高科) * * ******************************************************************/
#include<reg52.h> /***************************************************************** 第一行是一个"文件包含"处理。 所谓"文件包含"是指一个文件将另外一个文件的内容全部包含进来 这里的程序虽然只有短短几行,但C编译器在处理的时候却要处理几十或几百行 *******************************************************************/ sbit dat=P0^0; //定义IO口,P00对应的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) //循环条件永远为真,以下程序一直执行下去。 { dat=1; // I/O口P0.0输出高电平,小灯点亮。 delay02s(); //延时经过0.2秒。 dat=0; // I/O口P0.0输出高电平,小灯点亮。 delay02s(); //延时经过0.2秒。
while(1); //程序停止在这里,不再往下循环 } } |
四、试验总结与引申
好了,到这里了,相信小伙伴对LED的使用并不陌生了,留给大家一个任务:
任务:如何实现8路LED的同时闪烁?? 给大家一个提示:写单片机程序实际看起来就好比在时间的这样一个维度上去完成搭积木的一个过程,所以8路LED灯好比就是1路1路的去控制。当然也可以一次性控制?这个大家自己查询资料一下看看,不外乎两种方式,要求大家两种方式都需要掌握: 第一种:1路1路的去控制每一路LED灯同时“亮”和同时“灭”; 第二种:一次控制8路LED灯“亮”和同时“灭”。 |
万立高科-阿甘老师 感谢您的参与,精彩一路相随!!!
万立高科官网:
万立高科官方商城:
万立高科淘宝直销店铺:
万立高科单片机技术交流群:477250411