新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 第5课 让发光二极管闪烁

第5课 让发光二极管闪烁

作者: 时间:2016-12-01 来源:网络 收藏
这里的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语言中子函数分为两种,一种是不带参数子函数,另一种是带参数的子函数。下面我们讲一下带参数子函数。在例3中,我们延时 1000ms,i=1000.如果我们要延时500ms,刚i=500.如果要延时300ms,i=300,这样程序改起来就很麻烦,特别是在一些大型的程序中,这里我们如果写成带参数的子函数就方便很多。程序写法如下:
void delayxms(unsigned int z)
{ 
for(i=z;i>0;i--)
{
j=1;j<=110;j++;
}
 }

本文引用地址:https://www.eepw.com.cn/article/201612/324297.htm
上面程序中小括号内多了“unsigned int z”,其中“z”这个就是这个子函数带的参数,unsigned int 是定义参数z的类型为无符号整型。子函数中z这个参数我们称为形参,在调用子函数时我们用一个真实的数据代替此形参,这个真实的数据我们称为实参。在调用子函数时,只需要的延时时间改变小括号内的数据就可以了,如要延时1000s,则delayxms(1000),800ms时,delayxms(800)。
下面我们写一个程序让8个发光二极管以间隔800ms的时间闪烁。
例5 8个发光二极管以间隔500ms的时间间隔闪烁。
#include
#define unsigned int;
sbit D1=P1^0;
 
void delayxms(unsigned int z)
{ 
for(i=z;i>0;i--)
{
j=1;j<=110;j++;
}
 }
void main()
{
while(1)
{
D1=0;
      delay1s();   
D1=1;
delay1s();
}
}
上一页 1 2 下一页

关键词: 发光二极管单片

评论


技术专区

关闭