呼吸燈最早見于蘋果的電腦,近年來,在各種手機(jī)上也頻頻出現(xiàn)。
呼吸燈是很簡單的東西,用一片555,搭成一個(gè)多諧振蕩器,再用RC電路濾成鋸齒波,再驅(qū)動LED就可以了。
LED在鋸齒波的控制下,逐漸的由亮到暗、再由暗到明的周期性變化,看起來就好像是在呼吸。
555電路,調(diào)整起來比較困難,不如使用單片機(jī)來制成呼吸燈,可控性較強(qiáng)。
用單片機(jī)來制作呼吸燈,電路很簡單,也不過就是在單片機(jī)的引腳上,連接一個(gè)LED和一個(gè)電阻而已。
只是呼吸燈需要用PWM波形來驅(qū)動,編程時(shí),稍稍麻煩一點(diǎn)。
在上一篇博文中,做而論道已經(jīng)介紹了使用按鍵來調(diào)整占空比的參數(shù),進(jìn)而控制LED亮度的方法。
現(xiàn)在,不再用人工調(diào)整了,而是讓單片機(jī)周期性、自動的調(diào)整占空比參數(shù),這就可以使LED的亮度出現(xiàn)周期性的變化。
這種方法,做而論道在幾年前就用實(shí)際的硬件電路實(shí)現(xiàn)了。
近來,在網(wǎng)上看見有人提問,但是也沒有看到正面回答。再廣泛的查了查,一直也沒有看到有像樣的程序。
其實(shí),呼吸燈,算不上什么難題,用PROTEUS仿真,也能弄出來,程序也是很簡單的,比流水燈,也多不上十余句。
先看看下面的電路與波形,在圖中,暫時(shí)把LED斷開了,在限流電阻的位置上,用一個(gè)大電容接地。
這時(shí),電容、電阻,就構(gòu)成了一個(gè)積分電路,它可以對單片機(jī)輸出的矩形波進(jìn)行濾波。
看看圖中的波形,是不是濾成了一個(gè)近似的正弦波?
調(diào)整一下分辨率,這下看清了吧。
矩形波的占空比不變,濾波后的電壓就是恒定值,占空比增大,電壓就上升,反之就下降。
把LED接通后,LED中的電流,就是近似正弦函數(shù)的規(guī)律,LED亮度變化,就像是在呼吸。
調(diào)整一下電阻、電容的數(shù)值,LED外接的電源,也可以用6V試試,看看效果如何。
制作實(shí)際的電路,圖中的大電容可以省略,利用人眼視覺的暫留效應(yīng),就相當(dāng)于進(jìn)行了積分濾波,就能看到呼吸燈的現(xiàn)象。
制成硬件電路后,其效果要比軟件仿真要穩(wěn)定的多。
;=========================================
;驅(qū)動呼吸燈的程序,用匯編語言編程。全部程序如下:
;=========================================
N_T0DATA30H;T0的中斷次數(shù)
N_20msDATA31H
P_WTDATA32H;脈沖寬度Pulsewidth
HX_LEDBITP1.0;輸出接口
HX_DIRBIT20H.0;亮度遞增、遞減的狀態(tài)位
ORG0000H
JMPSTART
ORG000BH
JMPT0_INT
ORG0030H
START:
MOVTH0,#220;1250us@11.0592MHz,T0定時(shí)方式0
SETBTR0
MOVIE,#82H
MOVN_20ms,#10
MOVN_T0,#16
MOVP_WT,#1
SJMP$;此處可以寫任意的主程序
;-----------------------------------------
T0_INT:;1.25ms中斷一次
MOVTH0,#220;220:1250us@11.0592MHz
PUSHPSW
PUSHACC
;-----------------------下面輸出PWM波形---
DJNZN_T0,T0_1;中斷次數(shù)減一
MOVN_T0,#16;為0就重設(shè),T=16*1.25ms=20ms
CLRHX_LED;每到20ms就輸出0
DECN_20ms
JMPT0_2
T0_1:
MOVA,N_T0;當(dāng)前中斷次數(shù)1~16
DECA
CJNEA,P_WT,$+3;減去脈寬度值0~15
JNCT0_2;大于等于就不用變
SETBHX_LED;小于就輸出1
;-----------------------下面修改脈寬參數(shù)--
T0_2:
MOVA,N_20ms
JNZT0_END;不到0.2s不用修改
MOVN_20ms,#10;10*20ms=200ms
JNBHX_DIR,JIA;轉(zhuǎn)去遞增
;----------------------
DJNZP_WT,T0_END;P_WT減,非零退出
JMPTURN;為零就去改為遞增
;----------------------
JIA:
INCP_WT;P_WT加
MOVA,P_WT
CJNEA,#15,T0_END;不到15就退出
TURN:
CPLHX_DIR;到了0或15就改變方向
;---定時(shí)修改脈寬,只不過上面這十條指令而已。執(zhí)行起來,也不過就是十幾個(gè)微秒。
;---這十條就是呼吸燈所需要用的程序,是不是很簡單?
;----------------------
T0_END:;退出定時(shí)中斷
POPACC
POPPSW
RETI
;-----------------------------------------
END
;=========================================