基于Proteus的一个LED灯闪烁实验

1.实验原理

根据原理图对单片机进行编程,使LED灯每隔一小段时间就改变一下量变状态,若上一个时间段为点亮状态,则隔段时间熄灭,间隔时间可相同可不同,这里我们假定LED灯量变间隔时间相同。

2Proteus仿真电路图

在这里插入图片描述

3所用元器件图

在这里插入图片描述

4.c51代码(双重for循环)

#include<reg51.h>	//定义头文件

sbit LED=P0^0; 	   //定义引脚

int i,j;

void main()		 //main代表主函数,程序执行的部分
{
	while(1)
	{
		LED=0;
		for(i=1000;i>0;i--)	 //用双重for循环实现延时功能
	  for(j=110;j>0;j--);

		LED=1;
		for(i=1000;i>0;i--)
	  for(j=110;j>0;j--);

	}
}

①添加延时功能的原因:
单片机的程序执行速度是非常快的,在微秒级,程序在执行“LED=0;”时(让LED点亮),经过几个微秒后就让“LED=1;”(让LED熄灭),一直循环往复,但是实际上由于LED灯闪烁频率太快使得人眼是看不到LED灯闪烁的,只能看到LED持续保持点亮状态。为了让LED闪烁时间固定并且频率低一些,那么就需要添加一个延时程序,让LED的状态不管是亮还是灭都保持1秒钟(程序里是设为1秒的),然后再发生变化。
②双重for循环:
就是不停的执行循环体里面的内容,执行次数为第一层for循环与第二层for循环次数的乘积。
上图代码中循环内容为空循环(第二层循环后仅有一个分号)
空循环的作用是为了消耗CPU的时间,也就是这里的延时功能。需要注意的是灯亮要延时,灯灭也要延时。

5C51代码(延时子函数)

#include<reg51.h>	//定义头文件

sbit LED=P0^0; 	   //定义引脚

void delay(int ms) //定义延时子函数
{
	int i,j;
	for(i=ms;i>0;i--) //通过改变ms的次数来改变延时时间	 
	  for(j=110;j>0;j--); 
}

void main()		 //main代表主函数,程序执行的部分
{
	while(1)
	{
		LED=0;
		delay(1000);  //延时,调用延时子函数

		LED=1;
		delay(1000);  

	}
}

由于双重for循环在修改延时时间时,只要延时时间稍有变化,就需要修改循环次数,而且还要计算修改后的延时时间是否合适,较为麻烦。所以我们这里提前定义一个可方便修改延时参数的延时子函数。因为1s在单片机中单位较大,所以这里用1000ms来代替,使得LED灯每隔1s就改变一次量变状态从而达到闪烁的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章