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