第5课 让发光二极管闪烁
在第4课中我们分别用位操作法和总线操作法点亮了第一个发光二极光,也可以说正式迈出了单片机程序设计的第一步,相信通过前面的学习,大家已经可以很轻松的点亮发光二极管。但光会点亮发光二极管肯定不够的,大家经常可以看到外面大街小巷各种各样漂亮的闪烁的流水或者说广告灯,如图1,这是怎么实现的呢,这节课我们就来讲下如让发光二极管闪烁和流水灯程序的设计。
本文引用地址://m.amcfsurvey.com/article/201612/324297.htm![](http://m.amcfsurvey.com/editerupload/fetch/20161101/324297_1_0.jpg)
图1 漂亮的广告灯
1如何实现发光二极管闪烁和简单延时
学过汇编的同学都清楚,单片机机在执行指令时,是一条一条指令顺序执行的,对于C语言也一样,也是一条一条语句执行,而每执行一条指令或一条语句,都要占用一定的时间,利用单片机执行程序的这个特点就可能用来实现发光二极管闪烁。
具体方法就如图2所示,是先点亮发光二极管,然后写一条延时语句,在这段延时时间内,单片机什么事也不做,而此时发光二极管还是一直保持亮的状态,然后延时时间完后,再让发光二极管熄灭,熄灭后也写一条延时程序,而在这段时间内,发光二极管一直保持熄灭,直到延时时间结束再复上而的亮的过程,这样一直不断的循环下去就实现在发光二极不断闪烁。
![](http://m.amcfsurvey.com/editerupload/fetch/20161101/324297_1_1.jpg)
图2 发光二极管闪烁
延时可以由while语句来实现,也可由for语句实现,由于前面我们已经介绍过while语句,所以这里先介绍如何利用while语句实现延时。
(1)利用while语句进行延时
由于while语句在前我们已经讲解过,这里直接给出程序如例1。
例1 利用whiel语句实现发光二极管闪烁程序
#include
sbit D1=P1^0;
unsigned int a;
void main()
{
while(1)
{
a=50000;
D1=0;
while(a--);
a=50000;
D1=1;
while(a--);
}
}
程序分析:上面程序中出现了新的语句,unsigned int a;由于程序的需要,这里我们先定义了一个变量a,所谓变量其实就是代表单片机内存中具有特定属性的一个存储单元,它用来存放数据,也就是变量的值,如下面的a=50000,在程序中这些值是可以改变的。其中a表示变量的名字,unsigned int是无符号整形的意思,它的取值范围为0-65535,也就是定义成此类型后,在对程序编译时,编译系统会给这个变量分配一个存储空间用来存放数据,且无符号整形的空间存数的范围为0-65535。 后面的程序对a赋值时,其范围只能是0-65535,如程序后面的a=50000,如果此时我们对a赋值a=70000,此时编译时就是报错。我们也可以把变量a定义为其它类型的,如unsigned char a表示为把变量a定义为无符号字符型,其赋值范围为0-255
当然我们也可以定义其它的类型 short int、float等,但作为单片机初学者,一般只用到无符号字符型unsigned char(赋值范围为0-255)和无符号整形unsigned int(赋值范围为0-65535)两种,其它类型可以暂时不管,具体请参考C语言相关书籍。
unsigned int a明白后,下面就是一个大循环while(1),在大循环里,我们先给a赋值50000,然后灯亮D1=0,再进行延时while(a--)(a--,表示自减1的意思,while(a--),表示a从50000开始自减50000次,此时每自减1有一定的时间,所以自减50000次相当于延时的意思),再后的程序就是延时后再灯灭,再延时,再重复前面的过程,最终就可以实现灯一亮一灭闪烁的现象。下载到实验室的现象如图3所示。
图3 发光管闪烁
通过上面程序我们实现 了发光管闪烁的功能,但这里闪烁的间隔时间我们并不清楚具体是多少,我们只能根据具体的多次实验确定我们所需的时间间隔,如果实在要知道的话,可以通过51单片机的软件仿真得出,这里我们不作讲解,以后等大家单片机学得差不多再去学习。
下面我们再给出另一种程序延时的for语句的写法,这种写法在具体的项目用得更多。
(2)for语句及其延时
for语句是C语言中重要的语句,其格式如下:
格式:
利用for语句同样可以写出延时程序,例如:
unsigned int i;
for(i=1;i<=3;i++) ;
这里首先定义了一个无符号变量i,在for语句中,i=1为表达式1;i<=100为表达式2;i++为表达式3,for语句内程序执行如下
1、给变量i赋值为1;
2、判断i是否小于等于3;此时值为真,即执行for中的语句,此处for后面的语句为空语句,省略不写,
相当于什么都不执行,然后跳到语句3;
3、执行i++,i++为自加1的意思,此时i的值变为2,
4、跳到第2 步判断i是否小于等于3,此时仍然小于等于3,又执行空语句;
5、执行i++,此时i的值变为3;
6、跳到第2 步判断i是否小于等于3,此时等于3,直接跳出;
通过上面6步,for语句执行完毕,注意,单片机在执行每一条语句的时候都需要一定的时间,此时我们只需要改变表达式2的值就
可以得到我们想要的延时时间了。
此处需要注意的时,我们把i定义为无符号整形后,i的值最大值只能为65535,也就是利用上面的格式,我们可以写出最大的延时程序如下:
unsigned int i;
for(i=1;i<=65536;i++)
但我们此时如还需要更长的时间时,如果再让i值变大的话,编译时就会出错,此时我们可以写成如下的写法:
unsigned int i;
unsigned int j;
for(i=1;i<=65536;i++)
{
for(j=1;j<=100;j++);
}
上面的语句称为c语句的嵌套,是指一个for语句中又包含一个完整的for语句,内嵌的语句还可以嵌套for语句,这称为多层嵌套,我们这里只有两层。
评论