第5課 讓發(fā)光二極管閃爍
在第4課中我們分別用位操作法和總線操作法點(diǎn)亮了第一個(gè)發(fā)光二極光,也可以說正式邁出了單片機(jī)程序設(shè)計(jì)的第一步,相信通過前面的學(xué)習(xí),大家已經(jīng)可以很輕松的點(diǎn)亮發(fā)光二極管。但光會(huì)點(diǎn)亮發(fā)光二極管肯定不夠的,大家經(jīng)??梢钥吹酵饷娲蠼中∠锔鞣N各樣漂亮的閃爍的流水或者說廣告燈,如圖1,這是怎么實(shí)現(xiàn)的呢,這節(jié)課我們就來講下如讓發(fā)光二極管閃爍和流水燈程序的設(shè)計(jì)。
本文引用地址:http://m.butianyuan.cn/article/201612/324297.htm圖1 漂亮的廣告燈
1如何實(shí)現(xiàn)發(fā)光二極管閃爍和簡單延時(shí)
學(xué)過匯編的同學(xué)都清楚,單片機(jī)機(jī)在執(zhí)行指令時(shí),是一條一條指令順序執(zhí)行的,對(duì)于C語言也一樣,也是一條一條語句執(zhí)行,而每執(zhí)行一條指令或一條語句,都要占用一定的時(shí)間,利用單片機(jī)執(zhí)行程序的這個(gè)特點(diǎn)就可能用來實(shí)現(xiàn)發(fā)光二極管閃爍。
具體方法就如圖2所示,是先點(diǎn)亮發(fā)光二極管,然后寫一條延時(shí)語句,在這段延時(shí)時(shí)間內(nèi),單片機(jī)什么事也不做,而此時(shí)發(fā)光二極管還是一直保持亮的狀態(tài),然后延時(shí)時(shí)間完后,再讓發(fā)光二極管熄滅,熄滅后也寫一條延時(shí)程序,而在這段時(shí)間內(nèi),發(fā)光二極管一直保持熄滅,直到延時(shí)時(shí)間結(jié)束再復(fù)上而的亮的過程,這樣一直不斷的循環(huán)下去就實(shí)現(xiàn)在發(fā)光二極不斷閃爍。
圖2 發(fā)光二極管閃爍
延時(shí)可以由while語句來實(shí)現(xiàn),也可由for語句實(shí)現(xiàn),由于前面我們已經(jīng)介紹過while語句,所以這里先介紹如何利用while語句實(shí)現(xiàn)延時(shí)。
(1)利用while語句進(jìn)行延時(shí)
由于while語句在前我們已經(jīng)講解過,這里直接給出程序如例1。
例1 利用whiel語句實(shí)現(xiàn)發(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--);
}
}
程序分析:上面程序中出現(xiàn)了新的語句,unsigned int a;由于程序的需要,這里我們先定義了一個(gè)變量a,所謂變量其實(shí)就是代表單片機(jī)內(nèi)存中具有特定屬性的一個(gè)存儲(chǔ)單元,它用來存放數(shù)據(jù),也就是變量的值,如下面的a=50000,在程序中這些值是可以改變的。其中a表示變量的名字,unsigned int是無符號(hào)整形的意思,它的取值范圍為0-65535,也就是定義成此類型后,在對(duì)程序編譯時(shí),編譯系統(tǒng)會(huì)給這個(gè)變量分配一個(gè)存儲(chǔ)空間用來存放數(shù)據(jù),且無符號(hào)整形的空間存數(shù)的范圍為0-65535。 后面的程序?qū)賦值時(shí),其范圍只能是0-65535,如程序后面的a=50000,如果此時(shí)我們對(duì)a賦值a=70000,此時(shí)編譯時(shí)就是報(bào)錯(cuò)。我們也可以把變量a定義為其它類型的,如unsigned char a表示為把變量a定義為無符號(hào)字符型,其賦值范圍為0-255
當(dāng)然我們也可以定義其它的類型 short int、float等,但作為單片機(jī)初學(xué)者,一般只用到無符號(hào)字符型unsigned char(賦值范圍為0-255)和無符號(hào)整形unsigned int(賦值范圍為0-65535)兩種,其它類型可以暫時(shí)不管,具體請(qǐng)參考C語言相關(guān)書籍。
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開始自減50000次,此時(shí)每自減1有一定的時(shí)間,所以自減50000次相當(dāng)于延時(shí)的意思),再后的程序就是延時(shí)后再燈滅,再延時(shí),再重復(fù)前面的過程,最終就可以實(shí)現(xiàn)燈一亮一滅閃爍的現(xiàn)象。下載到實(shí)驗(yàn)室的現(xiàn)象如圖3所示。
圖3 發(fā)光管閃爍
通過上面程序我們實(shí)現(xiàn) 了發(fā)光管閃爍的功能,但這里閃爍的間隔時(shí)間我們并不清楚具體是多少,我們只能根據(jù)具體的多次實(shí)驗(yàn)確定我們所需的時(shí)間間隔,如果實(shí)在要知道的話,可以通過51單片機(jī)的軟件仿真得出,這里我們不作講解,以后等大家單片機(jī)學(xué)得差不多再去學(xué)習(xí)。
下面我們?cè)俳o出另一種程序延時(shí)的for語句的寫法,這種寫法在具體的項(xiàng)目用得更多。
(2)for語句及其延時(shí)
for語句是C語言中重要的語句,其格式如下:
格式:
利用for語句同樣可以寫出延時(shí)程序,例如:
unsigned int i;
for(i=1;i<=3;i++) ;
這里首先定義了一個(gè)無符號(hào)變量i,在for語句中,i=1為表達(dá)式1;i<=100為表達(dá)式2;i++為表達(dá)式3,for語句內(nèi)程序執(zhí)行如下
1、給變量i賦值為1;
2、判斷i是否小于等于3;此時(shí)值為真,即執(zhí)行for中的語句,此處for后面的語句為空語句,省略不寫,
相當(dāng)于什么都不執(zhí)行,然后跳到語句3;
3、執(zhí)行i++,i++為自加1的意思,此時(shí)i的值變?yōu)?,
4、跳到第2 步判斷i是否小于等于3,此時(shí)仍然小于等于3,又執(zhí)行空語句;
5、執(zhí)行i++,此時(shí)i的值變?yōu)?;
6、跳到第2 步判斷i是否小于等于3,此時(shí)等于3,直接跳出;
通過上面6步,for語句執(zhí)行完畢,注意,單片機(jī)在執(zhí)行每一條語句的時(shí)候都需要一定的時(shí)間,此時(shí)我們只需要改變表達(dá)式2的值就
可以得到我們想要的延時(shí)時(shí)間了。
此處需要注意的時(shí),我們把i定義為無符號(hào)整形后,i的值最大值只能為65535,也就是利用上面的格式,我們可以寫出最大的延時(shí)程序如下:
unsigned int i;
for(i=1;i<=65536;i++)
但我們此時(shí)如還需要更長的時(shí)間時(shí),如果再讓i值變大的話,編譯時(shí)就會(huì)出錯(cuò),此時(shí)我們可以寫成如下的寫法:
unsigned int i;
unsigned int j;
for(i=1;i<=65536;i++)
{
for(j=1;j<=100;j++);
}
上面的語句稱為c語句的嵌套,是指一個(gè)for語句中又包含一個(gè)完整的for語句,內(nèi)嵌的語句還可以嵌套for語句,這稱為多層嵌套,我們這里只有兩層。
注意第一個(gè)for語句后面沒有“;”,這里第一個(gè)for語句執(zhí)行了65535次,第二個(gè)for語句執(zhí)行了100次,相當(dāng)于總共執(zhí)行了655535x100次,這樣的寫法就可以寫出較長的延時(shí)時(shí)間。
關(guān)鍵詞:
發(fā)光二極管單片
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論