第5課 讓發(fā)光二極管閃爍
這里的for語(yǔ)句和上面的while語(yǔ)句都可以用來(lái)進(jìn)行延時(shí),這種方法稱(chēng)為軟件延時(shí),和上面for語(yǔ)句一樣,其準確的延時(shí)時(shí)間在C語(yǔ)言程序中不容易計算出來(lái)。如果想要得到精確的延時(shí)時(shí)間,我們則可以用到單片機內部的硬件資源定時(shí)器,它可以精確的微秒級,這個(gè)后面的課程中會(huì )講到。雖然得不到精確的延時(shí)時(shí)間,但大概的時(shí)間我們剛可以通過(guò)軟件仿真的方法得出,關(guān)于仿真具體的調試方法我們這里不作講解,這此我們給出一個(gè)51單片機經(jīng)常用到延時(shí)時(shí)間:
for語(yǔ)句中兩個(gè)變量的類(lèi)型都為unsigned int 時(shí),內層的for語(yǔ)句變量的值恒為110時(shí),外層for語(yǔ)句變量的值為多少,這個(gè)for嵌套語(yǔ)句延時(shí)時(shí)間就約為多少毫秒。如下面的程序:
unsigned int i;
unsigned int j;
for(i=1;i<=1000;i++)
{
for(j=1;j<=110;j++);
}
這個(gè)程序中外層for語(yǔ)句中變的值為1000,其延時(shí)的時(shí)間就約為1000毫秒,即1秒,若要想得到其它的延時(shí)時(shí)間,只需要改變i變量的值就可以了。
下面我們利用 for語(yǔ)句寫(xiě)一個(gè)程序,其功能為讓L1燈以間隔1秒的時(shí)間閃爍。程序如例2所示。
例2 L2燈以1秒的時(shí)間時(shí)隔閃爍
#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++;
}
}
}
下載到實(shí)驗板上現象如圖4所示:
圖4 L1以1秒的間隔閃爍。
例2程序中,在寫(xiě)延時(shí)程序時(shí),分別用到了兩個(gè)延時(shí)程序,并且這兩個(gè)程序內容格式完全相同,此時(shí)從簡(jiǎn)化程序的角度出發(fā),我們可以采取另外一種寫(xiě)法-子函數調用法.下面對其進(jìn)行介紹.
3、不帶參數的子函數調用
我們把上式中的延時(shí)函數單獨提取出來(lái),然后寫(xiě)成一個(gè)函數—此函數稱(chēng)為一個(gè)程序中的子函數,然后在主函數中直接調用即可。上式中延時(shí)函數的子函數寫(xiě)法如下。
void delay1s()
{
for(i=1;i<=1000;i++)
{
j=1;j<=110;j++;
}
}
上式中,void意為無(wú)返回值,也就是此函數執行完畢后不返回任何值。delay1s表示函數名,這里用戶(hù)可以隨便取,只需要滿(mǎn)意C語(yǔ)言的命名規則即,因為這個(gè)子程序在上面已經(jīng)寫(xiě)過(guò),是延時(shí)1鈔的函數,所以我們此時(shí)命名延時(shí)1秒(delay1ms)樣可以便于大家閱讀和記憶。函數名delay1s后面緊跟一小括號,括號里面什么內容也沒(méi)有,這表示此子函數不帶任何參數(后面會(huì )介紹到帶參數的子函數)。
需要注意的是,程序中中的子函數,如果是寫(xiě)在主函數之前,此不需要聲明,但如果是寫(xiě)在主函數之后,則需要聲明,聲明的方法如下:將返回值特性、函數名及后面的小括號完全復制,若是無(wú)參函數,則小括號內為空,若是有參函數,則需要在小括號內依次寫(xiě)上參數類(lèi)型,參數類(lèi)型之間用逗號隔開(kāi)。最后在小括號后面加上分號即可。
下面對例2的程序改為不帶參數子函數的寫(xiě)法,程序如例3所示。
例2 L2燈以1秒的時(shí)間時(shí)隔閃爍(不帶參數子函數的寫(xiě)法)
#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”語(yǔ)句,i和j兩個(gè)變量的定義放到了子函數里,而沒(méi)有寫(xiě)在主函數的最外面。在主函數外面定義的變量叫做全局變量,像這種定義在了函數內部的稱(chēng)為局部變量,這里i和j就是局部變量;局部變量只在當前函數中起作用,程序一但執行完當前子函數,它內部的所有變量將自動(dòng)銷(xiāo)毀,當下次再調用此子函數時(shí),編譯器重新為其分配內存空間。我們要知道,在一個(gè)程序中,每個(gè)變量都占據著(zhù)單片機的固定的RAM, 局部變量是用時(shí)隨時(shí)分配,不用時(shí)立即銷(xiāo)毀。一個(gè)單片機的RAM是很有限的,像STC89C52內部有256字節的RAM,所以用時(shí)我們必須節約,顯然,放在子程序中更能節?。遥粒涂臻g。將來(lái)程序下載到實(shí)驗板,我們此時(shí)依然可以看到如例2中的現象,L1燈以1秒的時(shí)間間隔閃爍。
4、帶參數子函數的寫(xiě)法
上面我們講到過(guò),C語(yǔ)言中子函數分為兩種,一種是不帶參數子函數,另一種是帶參數的子函數。下面我們講一下帶參數子函數。在例3中,我們延時(shí) 1000ms,i=1000.如果我們要延時(shí)500ms,剛i=500.如果要延時(shí)300ms,i=300,這樣程序改起來(lái)就很麻煩,特別是在一些大型的程序中,這里我們如果寫(xiě)成帶參數的子函數就方便很多。程序寫(xiě)法如下:
void delayxms(unsigned int z)
{
for(i=z;i>0;i--)
{
j=1;j<=110;j++;
}
}本文引用地址:http://dyxdggzs.com/article/201612/324297.htm
上面程序中小括號內多了“unsigned int z”,其中“z”這個(gè)就是這個(gè)子函數帶的參數,unsigned int 是定義參數z的類(lèi)型為無(wú)符號整型。子函數中z這個(gè)參數我們稱(chēng)為形參,在調用子函數時(shí)我們用一個(gè)真實(shí)的數據代替此形參,這個(gè)真實(shí)的數據我們稱(chēng)為實(shí)參。在調用子函數時(shí),只需要的延時(shí)時(shí)間改變小括號內的數據就可以了,如要延時(shí)1000s,則delayxms(1000),800ms時(shí),delayxms(800)。
下面我們寫(xiě)一個(gè)程序讓8個(gè)發(fā)光二極管以間隔800ms的時(shí)間閃爍。
例5 8個(gè)發(fā)光二極管以間隔500ms的時(shí)間間隔閃爍。
#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();
}
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
關(guān)鍵詞:
發(fā)光二極管單片
相關(guān)推薦
技術(shù)專(zhuān)區
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線(xiàn)
- 開(kāi)關(guān)電源
- 單片機
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機控制
- 藍牙
- PLC
- PWM
- 汽車(chē)電子
- 轉換器
- 電源管理
- 信號放大器
評論