找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 9295|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

不怎么講原理的51單片機(jī)應(yīng)用入門(2)點(diǎn)亮一個(gè)LED燈

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:105323 發(fā)表于 2016-2-23 15:59 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
出自:西漂sky的博客

沒(méi)錯(cuò),跟所有教程一樣,第一個(gè)學(xué)習(xí)的外設(shè)是LED燈。其實(shí)在下起初也很奇怪為什么所有教程的第一個(gè)實(shí)驗(yàn)不是流水燈就是點(diǎn)亮一個(gè)LED。現(xiàn)在就個(gè)人認(rèn)為,主要原因就是LED是一個(gè)只要一個(gè)輸出引腳就可以驅(qū)動(dòng)的外設(shè)元件,而且現(xiàn)象明顯,容易進(jìn)一步引發(fā)學(xué)習(xí)者的學(xué)習(xí)興趣。與其叫“點(diǎn)亮一個(gè)LED燈”,不如叫“輸出端口的操作”。上一篇講過(guò),單片機(jī)輸出的方式就是把IO口輸出引腳的電壓按要求改變。IO口引腳的電壓在理想的情況只能為兩個(gè)值——要么在Vcc附近,要么在GND附近。在電壓在Vcc附近的情況被視為邏輯1,電壓在GND附近的情況被視為邏輯0。
大部分的開(kāi)發(fā)板/學(xué)習(xí)板的LED外設(shè)如下圖:

Vcc指電源,R2與R3分別是限流電阻,最右側(cè)LED1與LED2分別直接與IO口的引腳相連。
現(xiàn)在想想如何讓這兩個(gè)LED發(fā)光,我們知道LED全稱為發(fā)光二極管,當(dāng)正負(fù)極之間的電壓超過(guò)一定值時(shí),發(fā)出光亮。這個(gè)定值一般在2~3V左右。LED1與LED2的電壓只能在Vcc附近和GND附近——也就是邏輯1或邏輯0。我們分類討論一下:當(dāng)LED1為邏輯1時(shí),發(fā)光二級(jí)管的兩端電壓幾乎相同,不會(huì)導(dǎo)通,也就不會(huì)發(fā)光;當(dāng)LED1為邏輯0時(shí),發(fā)光二極管正負(fù)極間的正向電壓較大,在電阻選取合適的情況下超過(guò)那個(gè)定值,也就會(huì)發(fā)光。于是,我們得出一個(gè)等效——LED發(fā)光=單片機(jī)輸出端口輸出邏輯0;LED不發(fā)光=單片機(jī)輸出端口輸出邏輯1。
于是,我們知道若想要D1發(fā)光,只要使標(biāo)號(hào)為L(zhǎng)ED1的輸出端口輸出邏輯0就可以了。我們假設(shè)標(biāo)號(hào)LED1的輸出端口是P1的最低位P1^0。
第一種方法,就是對(duì)IO口P1整體進(jìn)行操作。若想讓最低位輸出0,那么P1要輸出的值就是1111_1110(不考慮P1的其他位)16進(jìn)制就是0xFE。那么如上一章所說(shuō),只要一句語(yǔ)句“P1=0xFE;”就可以了。
第二種方法,就是單獨(dú)對(duì)P1的最低位操作。其本質(zhì)就是“P1^0=0;”這樣一句。但是這樣寫編譯器會(huì)報(bào)錯(cuò)。原因是編譯并不認(rèn)識(shí)P1^0是個(gè)什么玩意,在進(jìn)行對(duì)IO口的位單獨(dú)操作前,必須告訴編譯器P1^0是什么。于是有了這樣一個(gè)定義:
sbit P10 = P1^0;
這條語(yǔ)句一般是寫在main函數(shù)之外的。這個(gè)玩意看上去有點(diǎn)像宏定義#define,作用也像,不過(guò)作用的原理不同。sbit表示對(duì)位定義,“P10”是在下給P1最低位取得名字,這個(gè)名字可以隨便取,只要不與關(guān)鍵字沖突就行!癙1^0”表示IO口P1的第0位。這個(gè)是有固定格式的,IO口位的固定格式為“Px^y”,x是指第幾個(gè)IO口,y是指IO口的第幾位。再舉個(gè)例子:“sbitABC=P3^5;”這條語(yǔ)句就是把IO口P3的第5位命名為ABC。
命名后,你起的名字編譯器就可以識(shí)別了。在“sbitP10 =P1^0;”語(yǔ)句之后,再寫“P10=0;”,編譯器就知道你想讓被命名為P10的輸出引腳輸出邏輯0了。
現(xiàn)在來(lái)一個(gè)完整的程序:
#include<reg52.h>
sbit LED1=P1^0;
void main(void)
{
LED1=0;
for(;;);
}
想必第2和5行的意思已經(jīng)解釋的很清楚了,4和7行是大括號(hào)。第1行是頭文件,這個(gè)頭文件就像C語(yǔ)言中的stdio.h一樣,一般都會(huì)用到。第6行是一個(gè)死循環(huán),阻止程序結(jié)束的。對(duì)于單片機(jī)的程序,我們是不希望結(jié)束的,若是沒(méi)有無(wú)限運(yùn)行的部分,需要在最后加一個(gè)死循環(huán)(想知道沒(méi)有死循環(huán)有什么后果......去掉死循環(huán)上單片機(jī)跑一下就知道了)。就這樣,IO口的基本操作就結(jié)束了,也就是說(shuō),用Px=0xyz或sbit定義+對(duì)位操作的方法,就可以自由的操作IO口的輸出了。
(如需轉(zhuǎn)載,在下感激不敬,也請(qǐng)注明出處)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表