|
終極原理為你而來(lái) ——mini1608電子時(shí)鐘(原理篇)
作者 杜洋
今天陽(yáng)光明媚,今夜多云轉(zhuǎn)晴,《無(wú)線電》的老地方,杜洋靜靜的等候。一個(gè)月前,我心潮澎湃的把我最新設(shè)計(jì)的mini1608電子時(shí)鐘與你分享。精簡(jiǎn)的制作、漂亮的外觀、強(qiáng)大的功能都深深的吸引了你。你熱情高漲,興沖沖炮制了一個(gè),結(jié)果大獲成功。欣喜之后卻變得迷惑起來(lái),這是認(rèn)真研究、深入思考的結(jié)果,當(dāng)你從制作層面往技術(shù)原理層面思考的時(shí)候,就會(huì)遇見(jiàn)問(wèn)題,有所不解。欣悉8月杜洋有約,促膝長(zhǎng)談mini1608的技術(shù)原理,帶你從制作到創(chuàng)作,全面了解并徹底使用它們,為你的DIY事業(yè)創(chuàng)造新鮮樂(lè)趣。
自力更生——什么是I/O接口的推挽工作方式
上文提到STC11F32XE的每一個(gè)I/O接口都有4種工作方式,其中包括推挽輸出。推挽輸出是什么呢?對(duì)于沒(méi)有使用過(guò)增強(qiáng)型8051單片機(jī)的朋友,這個(gè)名詞是有些陌生的。傳統(tǒng)8051單片機(jī)的I/O接口只可以作為標(biāo)準(zhǔn)雙向輸入/輸出接口,如果用其來(lái)驅(qū)動(dòng)LED則只能用灌電流的方式或是用三極管外擴(kuò)驅(qū)動(dòng)電路。灌電流方式是將LED正極接在VCC上,負(fù)極接在I/O接口上,當(dāng)I/O接口為高電平時(shí)LED兩極的電平相同,沒(méi)有電流,LED為熄滅狀態(tài)。當(dāng)I/O接口為低電平時(shí),電流從VCC流入I/O接口,LED點(diǎn)亮。當(dāng)把LED正極接在I/O接口,負(fù)極接在GND,將I/O接口置于高電平時(shí),LED會(huì)點(diǎn)亮,但因?yàn)镮/O接口上拉能力不足而使亮度不理想。推挽工作方式就是具有強(qiáng)上拉能力的工作方式,它可以實(shí)現(xiàn)高電平驅(qū)動(dòng)LED。驚喜出現(xiàn)了,把LED正負(fù)極分別接在兩個(gè)I/O接口上,然后設(shè)置正極的I/O接口為推挽輸出,負(fù)極的I/O接口為標(biāo)準(zhǔn)雙向灌電流輸入,結(jié)果會(huì)怎么樣呢?非常好,我們可以直接用I/O接口驅(qū)動(dòng)LED而不需要VCC和GND。LED點(diǎn)陣屏就是多個(gè)LED的陣列連接,只要把LED點(diǎn)陣屏的所有引腳接在I/O接口上,然后根據(jù)LED點(diǎn)陣屏的引腳定義,將對(duì)應(yīng)正極的I/O接口設(shè)置成推挽,將對(duì)應(yīng)負(fù)極的I/O接口設(shè)置成標(biāo)準(zhǔn)雙向輸入,余下的就是把將要點(diǎn)亮的LED點(diǎn)陣屏上的點(diǎn)所對(duì)應(yīng)的行列線分別給予高低電平,那么一切就盡在掌握之中。
P1 口設(shè)定 (P1.7,P1.6,P1.5,P1.4,P1.3,P1.2,P1.1,P1.0)
(表)
有朋友會(huì)問(wèn)了,推挽工作方式這么好,我們?cè)诰幊虝r(shí)要如何設(shè)置呢?這個(gè)問(wèn)題問(wèn)得好,其實(shí)設(shè)置I/O接口的工作方式和設(shè)置I/O接口的電平狀態(tài)一樣簡(jiǎn)單。我們以C語(yǔ)言編程為例,首先要加載STC11Fxx.h的頭文件,因?yàn)镾TC單片機(jī)官方給出的頭文件中有I/O接口工作狀態(tài)設(shè)置的定義。可以在宏晶公司STC單片機(jī)的官方網(wǎng)站上找到頭文件,然后把下載到的頭文件放到C:\Keil\C51\INC文件夾里面。下一步就是在程序開(kāi)始處聲明這個(gè)頭文件。注意聲明中的文件名要和INC文件夾中存放的頭文件的名字相同。
#include <STC11Fxx.h> //聲明STC單片機(jī)頭文件
P1M0 = 0x01; //設(shè)置P1接口工作方式
P1M1 = 0x04; //設(shè)置P1接口工作方式
P4M0 = 0x02; //設(shè)置P3接口工作方式
P4M1 = 0xf4; //設(shè)置P3接口工作方式
P4SW = 0xff; //設(shè)置單片機(jī)功能引腳作為P4接口使用
例如我們對(duì)I/O接口的工作方式做出如下設(shè)置:
P1M0 = 0x09; //0000 1001
P1M1 = 0x05; //0000 0101
即表示P1接口中,P1.7到P1.4為標(biāo)準(zhǔn)雙向輸入/輸出接口,P1.3為推挽工作輸出接口,P1.2為高阻態(tài)輸入接口,P1.1為標(biāo)準(zhǔn)雙向輸入/輸出接口,P1.0為開(kāi)漏狀態(tài)接口。具體設(shè)置可以對(duì)照STC單片機(jī)的SFR數(shù)據(jù)表。注意P4SW寄存器對(duì)應(yīng)位設(shè)置為1時(shí),則此引腳才可作為P4接口使用。
STC11/10xx 系列8051 單片機(jī) I/O 口 特殊功能寄存器 Port SFRs
(表)
權(quán)宜之計(jì)——為什么要用逐點(diǎn)掃描
通常我們驅(qū)動(dòng)LED點(diǎn)陣屏都會(huì)使用一種習(xí)慣的方法,那就是遂列掃描法。把一組I/O接口定義為行,然后依次選通每一列,在選通某列時(shí)對(duì)應(yīng)地送入這一列所需要的行數(shù)據(jù)。也就是說(shuō)在同一時(shí)間里會(huì)有至多一列LED被點(diǎn)亮。對(duì)于mini1608的電路設(shè)計(jì)來(lái)說(shuō),這是不可能實(shí)現(xiàn)的。因?yàn)閿?shù)據(jù)手冊(cè)告訴我們,I/O接口的推挽工作方式也并非萬(wàn)能。一般情況下推挽工作方式所能輸出的最大電流是20mA,而標(biāo)準(zhǔn)雙向輸入/輸出工作方式也只能灌入20mA的電流。同時(shí),整個(gè)單片機(jī)在同一時(shí)間內(nèi)所能承受的最大電流為60mA,超過(guò)這個(gè)電流值,單片機(jī)就會(huì)有生命危險(xiǎn)。遂列掃描時(shí),每一個(gè)LED都會(huì)消耗10~20mA的電流,讓I/O接口同時(shí)驅(qū)動(dòng)8個(gè)LED,結(jié)果只有死路一條。為了解決這個(gè)問(wèn)題,我們只好采用遂點(diǎn)掃描方式,即在同一時(shí)間內(nèi)只有一個(gè)LED被點(diǎn)亮。這樣做既保證了單片機(jī)和LED的身體健康,讓單片機(jī)I/O接口的推挽能力恰好達(dá)到要求,同時(shí)又不會(huì)出現(xiàn)遂列掃描時(shí)LED顯示亮度不均的問(wèn)題。從這一點(diǎn)上看,這并非被迫之選,而是決佳之計(jì)。
技術(shù)嚴(yán)謹(jǐn)又注意細(xì)節(jié)的愛(ài)好者朋友可能會(huì)發(fā)現(xiàn)整個(gè)電路設(shè)計(jì)中沒(méi)有用到任何電阻,自然也就沒(méi)有LED必配的限流電阻。限流電阻是在電路電壓大于LED驅(qū)動(dòng)電壓時(shí),為保持LED在正常工作電流范圍內(nèi)而使用的。現(xiàn)在整個(gè)電路的電壓為5V,mini1608公然省略了限流電路是否會(huì)對(duì)電路有一定影響呢?我在設(shè)計(jì)時(shí)也認(rèn)真考慮并做了一些實(shí)驗(yàn),結(jié)果令人愉快。使用I/O接口的推挽方式,并在軟件上使用遂點(diǎn)掃描,不加限流電阻依然可以保證LED工作在正常電流范圍之內(nèi)。有驚無(wú)險(xiǎn),暢通無(wú)阻。
層出不窮——怎樣實(shí)現(xiàn)LED點(diǎn)陣屏多級(jí)顯示亮度
當(dāng)我第一次把我設(shè)計(jì)的漸明漸暗LED燈程序演示給一個(gè)同學(xué)看的時(shí)候,他的感覺(jué)是好神奇。他奇怪為什么單片機(jī)只能輸出高、低電平,怎么會(huì)使LED產(chǎn)生漸變的亮度呢?他對(duì)單片機(jī)性能的了解確實(shí)值得肯定,但他忘記了眼睛的雙重間諜身份。當(dāng)我們以1分鐘為一個(gè)周期,在1分鐘內(nèi)讓LED亮1分鐘,就也是一直亮著,LED的亮度就是最大的亮度。當(dāng)我們?cè)?分鐘內(nèi)只讓LED在前30秒鐘點(diǎn)亮,后30秒鐘熄滅,那么LED的亮度就只有原來(lái)亮度的一半。當(dāng)我們?cè)?分鐘內(nèi)只讓LED在前6秒鐘點(diǎn)亮,那么LED的亮度就只有還來(lái)亮度的十分之一,這就是亮度控制的基本原理。現(xiàn)在該有人暴跳如雷地說(shuō)我騙人了,因?yàn)榈厍蛉硕贾牢疑厦嬲f(shuō)的現(xiàn)象實(shí)際上只會(huì)讓LED慢慢地亮熄閃爍,怎么會(huì)是亮度的變化呢?是的,如果以1分鐘為一個(gè)周期,LED確實(shí)只會(huì)閃爍,這僅是為了方便大家理解。當(dāng)我們以1毫秒為一個(gè)周期時(shí)候,就是我們見(jiàn)證奇跡的時(shí)刻,因?yàn)槲覀冄劬Φ囊曈X(jué)暫留特性,我們已經(jīng)看不出LED的閃爍,我們的眼睛親眼見(jiàn)證了LED亮度真的不同了。眼睛騙了你,善意的謊言。那么讓單片機(jī)控制亮度變化的程序應(yīng)該怎么寫呢?我反問(wèn)單片機(jī)在1分鐘之內(nèi)前6秒點(diǎn)亮,后54秒熄滅的程序應(yīng)該怎么寫呢?問(wèn)題自有答案。
(圖片)
一箭雙雕——如何用LED點(diǎn)陣屏實(shí)現(xiàn)測(cè)光
《無(wú)線電》2009年第4期的《LED進(jìn)化史》有一段介紹LED的反向應(yīng)用,即把LED當(dāng)作光電二極管使用。當(dāng)時(shí)我只是引用了一個(gè)外國(guó)網(wǎng)站的資料。從那之后我就一直關(guān)注著LED的反向應(yīng)用,不久前的實(shí)驗(yàn)拉近了我們的距離,將LED反向應(yīng)用的始末完全呈現(xiàn)在我的眼前。在光線不同的情況下,LED的反向電阻會(huì)有所變化,光線強(qiáng)時(shí)電阻值變小,光線弱時(shí)電阻值變大。如果利用AD轉(zhuǎn)換功能可以讀出電阻值變化的每一個(gè)細(xì)節(jié),但我在mini1608上沒(méi)有使用AD轉(zhuǎn)換,而是利用了單片機(jī)I/O接口的高阻態(tài)輸入功能。Mini1608的LED點(diǎn)陣顯示屏在正常情況下,正極為推挽輸出,負(fù)極為標(biāo)準(zhǔn)雙向接口,上文已經(jīng)講過(guò)。當(dāng)我們要檢測(cè)環(huán)境光線的時(shí)候我們就將LED負(fù)極的I/O接口變?yōu)橥仆旄唠娖捷敵觯oLED一個(gè)反向電壓。LED正極的I/O接口變?yōu)楦咦钁B(tài)輸入。當(dāng)環(huán)境光線強(qiáng)的時(shí)候,LED的反向電阻值變小,LED正極的電壓會(huì)變高,當(dāng)高過(guò)I/O接口高電平的最小值時(shí)(一般為2V),則單片機(jī)識(shí)別為高電平輸入。當(dāng)環(huán)境光線弱時(shí),LED反向電阻值變大,LED正極的電壓會(huì)變低,當(dāng)?shù)陀贗/O接口高電平的最小值時(shí),單片機(jī)識(shí)別為低電平輸入。雖然只有兩種狀態(tài)的判斷,但對(duì)于mini1608觀察白天還是晚上已經(jīng)足夠了。如果想判斷光線強(qiáng)弱的更多種狀態(tài),可以通過(guò)讀取反向LED電平變化的時(shí)間,如果電平變化時(shí)間短,則說(shuō)明光線強(qiáng),電平變化時(shí)間長(zhǎng),則說(shuō)明光線弱,完全不需要AD就可以完成測(cè)光。白天環(huán)境光線強(qiáng),LED點(diǎn)陣屏本身要亮一些才能看得清楚。晚上環(huán)境光線弱,LED點(diǎn)陣屏要變得暗一些才不會(huì)讓起夜上廁所的你感覺(jué)刺眼。Mini1608變聰明了,也更體貼了。我還會(huì)繼續(xù)研究LED反向應(yīng)用的技術(shù),并會(huì)在《無(wú)線電》雜志上一一與大家分享。
LED測(cè)光原理
各大電子技術(shù)類雜志都不把源程序代碼算做稿費(fèi)的一部分,這樣做可以使作者不愿意公開(kāi)源程序代碼,是一種變向激勵(lì)讀者獨(dú)立創(chuàng)熱情的方法,對(duì)此我也表示支持。在此僅提供HEX文件供感興趣的愛(ài)好者朋友仿制。如果你有能力、也有熱情編寫程序,按照上文說(shuō)明的原理去思考,很快你便有了思路甚至方案。無(wú)論是白天還是夜晚,當(dāng)你閱讀本文的時(shí)候,我正端坐在電腦前,面對(duì)上千條的程序代碼,對(duì)mini1608進(jìn)行升級(jí)。我有熱情和勇氣與mini1608并肩做戰(zhàn),實(shí)現(xiàn)每種奇妙的功能,完成每個(gè)不可完成的任務(wù)。Mini1608會(huì)不會(huì)是LED點(diǎn)陣屏電子時(shí)鐘的終結(jié)者?我們拭目以待。
源碼與詳細(xì)制作過(guò)程下載:http://m.zg4o1577.cn/bbs/dpj-92154-1.html
|
評(píng)分
-
查看全部評(píng)分
|