基於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就改變一次量變狀態從而達到閃爍的效果。

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