微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第5课 让发光二极管闪烁

第5课 让发光二极管闪烁

时间:12-01 来源:互联网 点击:

535,也就是利用上面的格式,我们可以写出最大的延时程序如下:

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语句,这称为多层嵌套,我们这里只有两层。

注意第一个for语句后面没有“;”,这里第一个for语句执行了65535次,第二个for语句执行了100次,相当于总共执行了655535x100次,这样的写法就可以写出较长的延时时间。

这里的for语句和上面的while语句都可以用来进行延时,这种方法称为软件延时,和上面for语句一样,其准确的延时时间在C语言程序中不容易计算出来。如果想要得到精确的延时时间,我们则可以用到单片机内部的硬件资源定时器,它可以精确的微秒级,这个后面的课程中会讲到。虽然得不到精确的延时时间,但大概的时间我们刚可以通过软件仿真的方法得出,关于仿真具体的调试方法我们这里不作讲解,这此我们给出一个51单片机经常用到延时时间:

for语句中两个变量的类型都为unsigned int 时,内层的for语句变量的值恒为110时,外层for语句变量的值为多少,这个for嵌套语句延时时间就约为多少毫秒。如下面的程序:

unsigned int i;

unsigned int j;

for(i=1;i<=1000;i++)

{

for(j=1;j<=110;j++);

}

这个程序中外层for语句中变的值为1000,其延时的时间就约为1000毫秒,即1秒,若要想得到其它的延时时间,只需要改变i变量的值就可以了。

下面我们利用 for语句写一个程序,其功能为让L1灯以间隔1秒的时间闪烁。程序如例2所示。

例2 L2灯以1秒的时间时隔闪烁

#include

#define unsigned int;

sbit D1=P1^0;

uint i,j;

void main()

{

while(1)

{

D1=0;

for(i=1;i<=1000;i++)

{

j=1;j<=110;j++;

}

D1=1;

for(i=1;i<=1000;i++)

{

j=1;j<=110;j++;

}

}

}

下载到实验板上现象如图4所示:

图4 L1以1秒的间隔闪烁。

例2程序中,在写延时程序时,分别用到了两个延时程序,并且这两个程序内容格式完全相同,此时从简化程序的角度出发,我们可以采取另外一种写法-子函数调用法.下面对其进行介绍.

3、不带参数的子函数调用

我们把上式中的延时函数单独提取出来,然后写成一个函数—此函数称为一个程序中的子函数,然后在主函数中直接调用即可。上式中延时函数的子函数写法如下。

void delay1s()

{ 

for(i=1;i<=1000;i++)

{

j=1;j<=110;j++;

}

 }

上式中,void意为无返回值,也就是此函数执行完毕后不返回任何值。delay1s表示函数名,这里用户可以随便取,只需要满意C语言的命名规则即,因为这个子程序在上面已经写过,是延时1钞的函数,所以我们此时命名延时1秒(delay1ms)样可以便于大家阅读和记忆。函数名delay1s后面紧跟一小括号,括号里面什么内容也没有,这表示此子函数不带任何参数(后面会介绍到带参数的子函数)。

需要注意的是,程序中中的子函数,如果是写在主函数之前,此不需要声明,但如果是写在主函数之后,则需要声明,声明的方法如下:将返回值特性、函数名及后面的小括号完全复制,若是无参函数,则小括号内为空,若是有参函数,则需要在小括号内依次写上参数类型,参数类型之间用逗号隔开。最后在小括号后面加上分号即可。

下面对例2的程序改为不带参数子函数的写法,程序如例3所示。

例2 L2灯以1秒的时间时隔闪烁(不带参数子函数的写法)

#include

#define unsigned int;

sbit D1=P1^0;

 

void delay1s()

void main()

{

while(1)

{

D1=0;

    delay1s();   

D1=1;

delay1s();

}

}

void delay1s()

{

 uint i,j;

for(i=1;i<=1000;i++)

{

j=1;j<=110;j++;

}

 }

在例3中,我们注意到“uint i,j”语句,i和j两个变量的定义放到了子函数里,而没有写在主函数的最外面。在主函数外面定义的变量叫做全局变量,像这种定义在了函数内部的称为局部变量,这里i和j就是局部变量;局部变量只在当前函数中起作用,程序一但执行完当前子函数,它内部的所有变量将自动销毁,当下次再调用此子函数时,编译器重新为其分配内存空间。我们要知道,在一个程序中,每个变量都占据着单片机的固定的RAM, 局部变量是用时随时分配,不用时立即销毁。一个单片机的RAM是很有限的,像STC89C52内部有256字节的RAM,所以用时我们必须节约,显然,放在子程序中更能节省RAM空间。将来程序下载到实验板,我们此时依然可以看到如例2中的现象,L1灯以1秒的时间间隔闪烁。

4、带参数子函数的写法

上面我们讲到过,C语言中子函数分为两种,一种是不带参数子函数,另

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top