第5課 讓發(fā)光二極管閃爍
在第4課中我們分別用位操作法和總線(xiàn)操作法點(diǎn)亮了第一個(gè)發(fā)光二極光,也可以說(shuō)正式邁出了單片機程序設計的第一步,相信通過(guò)前面的學(xué)習,大家已經(jīng)可以很輕松的點(diǎn)亮發(fā)光二極管。但光會(huì )點(diǎn)亮發(fā)光二極管肯定不夠的,大家經(jīng)??梢钥吹酵饷娲蠼中∠锔鞣N各樣漂亮的閃爍的流水或者說(shuō)廣告燈,如圖1,這是怎么實(shí)現的呢,這節課我們就來(lái)講下如讓發(fā)光二極管閃爍和流水燈程序的設計。
本文引用地址:http://dyxdggzs.com/article/201612/324297.htm
圖1 漂亮的廣告燈
1如何實(shí)現發(fā)光二極管閃爍和簡(jiǎn)單延時(shí)
學(xué)過(guò)匯編的同學(xué)都清楚,單片機機在執行指令時(shí),是一條一條指令順序執行的,對于C語(yǔ)言也一樣,也是一條一條語(yǔ)句執行,而每執行一條指令或一條語(yǔ)句,都要占用一定的時(shí)間,利用單片機執行程序的這個(gè)特點(diǎn)就可能用來(lái)實(shí)現發(fā)光二極管閃爍。
具體方法就如圖2所示,是先點(diǎn)亮發(fā)光二極管,然后寫(xiě)一條延時(shí)語(yǔ)句,在這段延時(shí)時(shí)間內,單片機什么事也不做,而此時(shí)發(fā)光二極管還是一直保持亮的狀態(tài),然后延時(shí)時(shí)間完后,再讓發(fā)光二極管熄滅,熄滅后也寫(xiě)一條延時(shí)程序,而在這段時(shí)間內,發(fā)光二極管一直保持熄滅,直到延時(shí)時(shí)間結束再復上而的亮的過(guò)程,這樣一直不斷的循環(huán)下去就實(shí)現在發(fā)光二極不斷閃爍。

圖2 發(fā)光二極管閃爍
延時(shí)可以由while語(yǔ)句來(lái)實(shí)現,也可由for語(yǔ)句實(shí)現,由于前面我們已經(jīng)介紹過(guò)while語(yǔ)句,所以這里先介紹如何利用while語(yǔ)句實(shí)現延時(shí)。
(1)利用while語(yǔ)句進(jìn)行延時(shí)
由于while語(yǔ)句在前我們已經(jīng)講解過(guò),這里直接給出程序如例1。
例1 利用whiel語(yǔ)句實(shí)現發(fā)光二極管閃爍程序
#include
sbit D1=P1^0;
unsigned int a;
void main()
{
while(1)
{
a=50000;
D1=0;
while(a--);
a=50000;
D1=1;
while(a--);
}
}
程序分析:上面程序中出現了新的語(yǔ)句,unsigned int a;由于程序的需要,這里我們先定義了一個(gè)變量a,所謂變量其實(shí)就是代表單片機內存中具有特定屬性的一個(gè)存儲單元,它用來(lái)存放數據,也就是變量的值,如下面的a=50000,在程序中這些值是可以改變的。其中a表示變量的名字,unsigned int是無(wú)符號整形的意思,它的取值范圍為0-65535,也就是定義成此類(lèi)型后,在對程序編譯時(shí),編譯系統會(huì )給這個(gè)變量分配一個(gè)存儲空間用來(lái)存放數據,且無(wú)符號整形的空間存數的范圍為0-65535。 后面的程序對a賦值時(shí),其范圍只能是0-65535,如程序后面的a=50000,如果此時(shí)我們對a賦值a=70000,此時(shí)編譯時(shí)就是報錯。我們也可以把變量a定義為其它類(lèi)型的,如unsigned char a表示為把變量a定義為無(wú)符號字符型,其賦值范圍為0-255
當然我們也可以定義其它的類(lèi)型 short int、float等,但作為單片機初學(xué)者,一般只用到無(wú)符號字符型unsigned char(賦值范圍為0-255)和無(wú)符號整形unsigned int(賦值范圍為0-65535)兩種,其它類(lèi)型可以暫時(shí)不管,具體請參考C語(yǔ)言相關(guān)書(shū)籍。
unsigned int a明白后,下面就是一個(gè)大循環(huán)while(1),在大循環(huán)里,我們先給a賦值50000,然后燈亮D1=0,再進(jìn)行延時(shí)while(a--)(a--,表示自減1的意思,while(a--),表示a從50000開(kāi)始自減50000次,此時(shí)每自減1有一定的時(shí)間,所以自減50000次相當于延時(shí)的意思),再后的程序就是延時(shí)后再燈滅,再延時(shí),再重復前面的過(guò)程,最終就可以實(shí)現燈一亮一滅閃爍的現象。下載到實(shí)驗室的現象如圖3所示。
圖3 發(fā)光管閃爍
通過(guò)上面程序我們實(shí)現 了發(fā)光管閃爍的功能,但這里閃爍的間隔時(shí)間我們并不清楚具體是多少,我們只能根據具體的多次實(shí)驗確定我們所需的時(shí)間間隔,如果實(shí)在要知道的話(huà),可以通過(guò)51單片機的軟件仿真得出,這里我們不作講解,以后等大家單片機學(xué)得差不多再去學(xué)習。
下面我們再給出另一種程序延時(shí)的for語(yǔ)句的寫(xiě)法,這種寫(xiě)法在具體的項目用得更多。
(2)for語(yǔ)句及其延時(shí)
for語(yǔ)句是C語(yǔ)言中重要的語(yǔ)句,其格式如下:
格式:
利用for語(yǔ)句同樣可以寫(xiě)出延時(shí)程序,例如:
unsigned int i;
for(i=1;i<=3;i++) ;
這里首先定義了一個(gè)無(wú)符號變量i,在for語(yǔ)句中,i=1為表達式1;i<=100為表達式2;i++為表達式3,for語(yǔ)句內程序執行如下
1、給變量i賦值為1;
2、判斷i是否小于等于3;此時(shí)值為真,即執行for中的語(yǔ)句,此處for后面的語(yǔ)句為空語(yǔ)句,省略不寫(xiě),
相當于什么都不執行,然后跳到語(yǔ)句3;
3、執行i++,i++為自加1的意思,此時(shí)i的值變?yōu)?,
4、跳到第2 步判斷i是否小于等于3,此時(shí)仍然小于等于3,又執行空語(yǔ)句;
5、執行i++,此時(shí)i的值變?yōu)?;
6、跳到第2 步判斷i是否小于等于3,此時(shí)等于3,直接跳出;
通過(guò)上面6步,for語(yǔ)句執行完畢,注意,單片機在執行每一條語(yǔ)句的時(shí)候都需要一定的時(shí)間,此時(shí)我們只需要改變表達式2的值就
可以得到我們想要的延時(shí)時(shí)間了。
此處需要注意的時(shí),我們把i定義為無(wú)符號整形后,i的值最大值只能為65535,也就是利用上面的格式,我們可以寫(xiě)出最大的延時(shí)程序如下:
unsigned int i;
for(i=1;i<=65536;i++)
但我們此時(shí)如還需要更長(cháng)的時(shí)間時(shí),如果再讓i值變大的話(huà),編譯時(shí)就會(huì )出錯,此時(shí)我們可以寫(xiě)成如下的寫(xiě)法:
unsigned int i;
unsigned int j;
for(i=1;i<=65536;i++)
{
for(j=1;j<=100;j++);
}
上面的語(yǔ)句稱(chēng)為c語(yǔ)句的嵌套,是指一個(gè)for語(yǔ)句中又包含一個(gè)完整的for語(yǔ)句,內嵌的語(yǔ)句還可以嵌套for語(yǔ)句,這稱(chēng)為多層嵌套,我們這里只有兩層。
注意第一個(gè)for語(yǔ)句后面沒(méi)有“;”,這里第一個(gè)for語(yǔ)句執行了65535次,第二個(gè)for語(yǔ)句執行了100次,相當于總共執行了655535x100次,這樣的寫(xiě)法就可以寫(xiě)出較長(cháng)的延時(shí)時(shí)間。
關(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ē)電子
- 轉換器
- 電源管理
- 信號放大器
評論