導(dǎo)語
根據(jù)前面對51單片機(jī)的了解和基礎(chǔ)理論知識的掌握,經(jīng)過自己的焊接或鈔能力手中有了開發(fā)板,就開始了正式的單片機(jī)學(xué)習(xí)實(shí)踐。
在前續(xù)知識的了解和掌握就進(jìn)入了程序編寫以及電路調(diào)試等工程開展中,真正做到理論與實(shí)踐結(jié)合。
通過查看原理圖可知,主要有P0端口,P1端口,P2端口,P3端口等,這些端口占了端口的大部分,除此之外還有復(fù)位端口Rst,時鐘電路XTLin和XTLout,電源和其他功能端口,在大多數(shù)時候,我們都將使用P0到P3這些端口。
LED
簡介
Led為發(fā)光二極管光源。此種光源具有體積小、壽命長、效率高等優(yōu)點(diǎn)。由等半導(dǎo)體材料制成的、直接將電能轉(zhuǎn)變成光能,效率很高。當(dāng)加上一定的正向電流時,Led發(fā)光,并呈現(xiàn)相對穩(wěn)定的正向電壓,隨電流變化不明顯。
正負(fù)極區(qū)分
直插
- 單色LED有兩根引腳,這兩根引腳有正、負(fù)極之分。長腳為正。
- 當(dāng)長短腳無法觀察時,可從側(cè)面觀察兩條引出線在管體內(nèi)的形狀.較小的是正極,較大的類似于碗狀的是負(fù)極
- 也可通過萬用表的蜂鳴擋區(qū)分,通過調(diào)整紅黑表筆在LED的順序使得LED發(fā)光,此時紅表筆所在的引腳為正極。
貼片LED
- 有色點(diǎn)的為負(fù)極,相對的為正極。
- “T”一橫的一邊是正極,相對的為負(fù)極。
- 三角形底邊靠近的是正極,頂角靠近的是負(fù)極。
- 帶小缺角那端就是負(fù)極,另一端是正極。
管壓降
當(dāng)電流過LED以后相對于同一參考點(diǎn)的電勢(電位)變化稱為電壓降,簡稱壓降。通常二極管的管壓降在0.7V左右,在LED中,紅色LED在2v-2.2v,綠色在3v-3.2v,白色藍(lán)色在3.5v。
流水燈電路
正極通過限流電阻連接到5V,負(fù)極連接到P1端口。也就是說,當(dāng)陰極為低電平時,LED通過電流,被點(diǎn)亮。反之LED熄滅。
軟件程序
位定義
通過sbit關(guān)鍵字定義IO,是C51專有的關(guān)鍵字。
sbit LED0=P1^0;//LED0
sbit LED1=P1^1;//LED1
sbit LED2=P1^2;//LED2
sbit LED3=P1^3;//LED3
sbit LED4=P1^4;//LED4
sbit LED5=P1^5;//LED5
sbit LED6=P1^6;//LED6
sbit LED7=P1^7;//LED7
延時函數(shù)
編寫延時函數(shù),實(shí)現(xiàn)延時的功能,傳參為延時時間,無返回值。
其內(nèi)部實(shí)現(xiàn)與單片機(jī)的運(yùn)行速度有關(guān),主要原理是,單片機(jī)在運(yùn)行程序時,每一條指令會占用單片機(jī)的一個機(jī)器周期,如12M外部京真心,一條指令會占用1ms時間。通過for循環(huán)使得單片機(jī)進(jìn)行大量運(yùn)算,占用大量機(jī)器周期達(dá)到目的。延時計算不準(zhǔn)確,可通過stc-isp軟件生成更精準(zhǔn)的值。
void delay_ms(unsignedchar ms)
{
unsignedint i,j;
for(i=0;i for(j=0;j<333;j++);?
};i++)
主函數(shù)
void main(void)
{
while(1)
{
LED0=0;delay_ms(1000);LED0=1;//LED0點(diǎn)亮,其余熄滅
LED1=0;delay_ms(1000);LED1=1;//LED1點(diǎn)亮,其余熄滅
LED2=0;delay_ms(1000);LED2=1;//LED2點(diǎn)亮,其余熄滅
LED3=0;delay_ms(1000);LED3=1;//LED3點(diǎn)亮,其余熄滅
LED4=0;delay_ms(1000);LED4=1;//LED4點(diǎn)亮,其余熄滅
LED5=0;delay_ms(1000);LED5=1;//LED5點(diǎn)亮,其余熄滅
LED6=0;delay_ms(1000);LED6=1;//LED6點(diǎn)亮,其余熄滅
LED7=0;delay_ms(1000);LED7=1;//LED7點(diǎn)亮,其余熄滅
}
}
通過while(1)使得函數(shù)循環(huán)運(yùn)行,通過定義的IO名稱對單個IO進(jìn)行操作,在多個操作時十分容易出錯,所以也可以對IO進(jìn)行總線操作。
總線IO
當(dāng)我們使用大量的IO時候,可進(jìn)行總線操作,對端口直接賦值,可將端口直接看作unsigned char的變量。
P1=0xfe;//相當(dāng)于二進(jìn)制 1111 1110
//即P1.1 - P1.7寫入1,P10寫入0,LED0點(diǎn)亮
對此,我們可以使用位運(yùn)算操作P1端口。
void main(void)
{
while(1)
{
unsignedchar temp=0xfe,i;
temp=0xfe; // 1111 1110
for(i=0; i8; i++)?
{
LED= temp;
temp=(temp<<1)?|?1;?//1111 1101?
delay_ms(1000);//延時1s
}
}
}
1111 1110 << 1 = 1111 1100,向左移動空位補(bǔ)零
1111 1100 | 1 = 1111 1101,即1111 1100 | 0000 0001。有1則1。最低位補(bǔ)1;
同樣,我們也可以使用數(shù)組對其操作。
數(shù)組
我們通過盒中與里面的東西來表示。
變量的類型相當(dāng)于盒子的大小,char可以裝255個,int可以裝65535個,使用什么數(shù)據(jù)類型取決于數(shù)據(jù)的范圍,范圍大,需要的盒就大。大盒子裝的多,占用地方(內(nèi)存)也多。
一個盒子有唯一的一個名字,稱為變量名,給他裝上東西,稱為賦值。這些盒子沒什么聯(lián)系,當(dāng)然也有一些盒子里面裝了一些小盒子,不過只有大盒子有名字叫LED_DAT,小盒子只能通過大盒子才能獲得自己的名字。老大在大盒子里排第一個,我們叫他LED_DAT[0],以此類推。當(dāng)然,我們再給大盒子裝東西的時候就需要考慮,有多少數(shù)據(jù),因?yàn)橛卸嗌贁?shù)據(jù)就需要多少盒子。盒子用多大的,因?yàn)楹凶哟罅诵枰嫉胤健?/p>
因此我們定義了整個大盒子
unsignedchar LED_DAT[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
我們選擇了unsigned char類型的盒子,因?yàn)槔锩孀畲蟮臄?shù)據(jù)也沒超過unsigned char的表示范圍。同時,我們裝了{(lán)0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}這些數(shù),編譯器將數(shù)據(jù)數(shù)出來創(chuàng)建了一個可以裝8個unsigned char小盒子的大盒子起名為LED_DAT;并通過LED_DAT[下標(biāo)]訪問或修改里面小盒子的值。
unsignedchar LED_DAT[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void main(void)
{
while(1)
{
unsignedchar i;
for(i=0;i<8;i++)?
{
P1=LED_DAT[i];
delay_ms(1000);
}
}
}
在這個里面,我們通過LED_DAT[i]獲得了里面的值,并寫入了P1,實(shí)現(xiàn)了流水燈的效果。
不太建議使用_crol_()這些循環(huán)左移和循環(huán)右移函數(shù),建議位運(yùn)算直接干,位運(yùn)算YYDS。
快去實(shí)現(xiàn)你的炫酷流水燈吧。
-
led
+關(guān)注
關(guān)注
242文章
23347瀏覽量
662393 -
51單片機(jī)
+關(guān)注
關(guān)注
274文章
5705瀏覽量
124078
發(fā)布評論請先 登錄
相關(guān)推薦
評論