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