放假回家了,基本上都是一個(gè)人在家,晚上除了自己的房間有光,其他房間都是黑漆漆的,每當(dāng)要去客廳接水喝,走到門(mén)口時(shí)都有種恐怖的感覺(jué)……
于是想到很久以前用89C52做的人體紅外感應(yīng)燈,從柜子里翻出來(lái)看了看,LED什么的都拆了,但是人體紅外感應(yīng)模 塊還在,89C52的最小系統(tǒng)也是完整的,反正51單片機(jī)現(xiàn)在不用以后也用不到了,于是就開(kāi)干,把這個(gè)人體紅外感應(yīng)等做完整,正好也復(fù)習(xí)(學(xué)習(xí))一下51單片機(jī)的玩法。
第一部分 原理圖設(shè)計(jì)
這就是板子原本的樣子。其實(shí)這是我當(dāng)年自己焊的第一塊板子,背后太難看就不拍了。

然后這就是STM89C52,注意方向哦,認(rèn)真看圖能發(fā)現(xiàn)上面是有個(gè)半圓弧的缺口的,他朝上。

然后基于目前的板子來(lái)設(shè)計(jì)電路圖吧。
首先我們要知道89C52封裝后的引腳和原理圖中標(biāo)的是不同的,所以看89C52的引腳圖。

結(jié)合圖看到我們?nèi)梭w紅外傳感器離P2.0這個(gè)IO口很近,于是決定把P2.0口作為輸入口。
51單片機(jī)需要最小系統(tǒng)才能正確運(yùn)行,所以我們是來(lái)了解一下,雖然板子上已經(jīng)焊好了。
打開(kāi)Proteus,開(kāi)始設(shè)計(jì)原理圖。

這就是最基本的電路了。XTAL1和XTAL2這一部分是時(shí)鐘電路,RST接出去的就是復(fù)位電路。
復(fù)位電路很好理解,就是按一下就復(fù)位嘛,51單片機(jī)是高電平復(fù)位,所以平時(shí)應(yīng)該要通過(guò)下拉電阻下拉,保證平時(shí)是低電平,那個(gè)10K的電阻一頭接地一頭接RST,所以他就是下拉電阻了。
可能沒(méi)玩過(guò)51單片機(jī)的同學(xué)不清楚時(shí)鐘電路是什么回事,時(shí)鐘電路就是產(chǎn)生象時(shí)鐘一樣準(zhǔn)確的振蕩電路。震蕩電路就相當(dāng)于我們的心臟,他要按一定的頻率跳動(dòng)我們才能活。另外時(shí)鐘電路就像是我們做廣播體操一樣,需要提供一個(gè)節(jié)拍,我們每個(gè)人跟著節(jié)拍做才能做整齊,而這個(gè)節(jié)拍就是單片機(jī)心臟跳動(dòng)的頻率。
我們平時(shí)玩Arduino時(shí)并不用關(guān)心振蕩電路或者復(fù)位電路,因?yàn)榘遄由弦呀?jīng)都設(shè)計(jì)好了,比如我的UNO就是16MHz的晶振,并且AVR單片機(jī)可以使用內(nèi)部的晶振。而51單片機(jī)沒(méi)有內(nèi)部晶振,必須要使用外部晶振。
另外可以看到圖上EA口接了高電平,EA為片外程序存儲(chǔ)器選擇輸入端,低電平時(shí),使用片外程序存儲(chǔ)器;高電平時(shí),使用片內(nèi)程序存儲(chǔ)器。當(dāng)然我們就是使用片內(nèi)程序存儲(chǔ)器咯。
這樣連接好單片機(jī)最基本的電路就完成了,燒上程序供電就能運(yùn)行了。
在我們編程之前,先把電路設(shè)計(jì)完整。

這里我們加了2部分。
第一部分就是P2.0的輸入,由于沒(méi)有人體紅外傳感器的仿真模塊,就用一個(gè)按鈕來(lái)代替。我們的人體紅外傳感器使用的是HC-SR501,根據(jù)文檔我們可以知道當(dāng)感應(yīng)到有人時(shí),OUT引腳是置為高電平3.3V的。在51中,或者Arduino中,單片機(jī)系統(tǒng)使用5V作為高電平時(shí),3.3V也是算作高電平的。
第二部分就是LED啦。電阻是作為限流用的,防止電流過(guò)大燒壞LED或者單片機(jī),我這里使用了玩Arduino都陪的220歐電阻,當(dāng)然可以小一點(diǎn),也可以大一點(diǎn),只不過(guò)太小了起不到限流的作用,太大了雖然對(duì)硬件沒(méi)有損壞但是亮度就太小了。
第二部分 程序設(shè)計(jì)
直接上程序。

這樣就是最簡(jiǎn)易的代碼了,大家應(yīng)該都有C語(yǔ)言基礎(chǔ)就不用講太細(xì)了。P1,P2都是“reg51.h”里面定義了的,直接拿來(lái)用就行了。sbit是位定義,我們定義了“in”為P2.0這個(gè)引腳。P1我們沒(méi)有單獨(dú)定義每個(gè)引腳,因?yàn)槲覀兛梢灾苯訉⑺蠵1的端口置0或者置1。延時(shí)函數(shù)大家都能理解嘛,執(zhí)行空循環(huán)浪費(fèi)時(shí)間就行了。而while(1){}就相當(dāng)于Arduino的loop(){}。
這里我們只要判斷,P2.0口如果是高電平,那么就把P1口設(shè)置為0,即低電平,延時(shí)1000毫秒,再將P1口設(shè)置為1,即高電平。當(dāng)然,真正使用時(shí)延時(shí)1秒肯定不夠,我最后設(shè)置的是60秒。
第三部分 仿真
Proteus有仿真功能,加載Keil C生成的HEX文件,然后點(diǎn)擊左下角的運(yùn)行仿真即可。

這樣就開(kāi)始仿真了,然后點(diǎn)擊P2.0口的按鈕。

按下按鈕后對(duì)比發(fā)現(xiàn)LED亮了,并且延時(shí)約1秒后又熄滅了,說(shuō)明程序正確執(zhí)行了。
第四部分 動(dòng)手開(kāi)工
先來(lái)把程序燒錄上。記得把延時(shí)程序改成60秒哦。

通過(guò)USB2TTL,RX,TX反接。

按通常的燒錄方法就行了。
然后上電烙鐵,對(duì)照原理圖設(shè)計(jì)電路圖。因?yàn)檫@個(gè)原理圖很簡(jiǎn)單,直接在大腦里就能畫(huà)出電路圖。如果復(fù)雜了,還是先把電路圖設(shè)計(jì)好再焊接。
我一直記得我有白光LED,但是找來(lái)找去都沒(méi)有找到,翻了翻淘寶發(fā)現(xiàn)真的是我記錯(cuò)了,于是我就用2個(gè)紅色LED和2個(gè)藍(lán)色LED來(lái)代替了。
注意LED的導(dǎo)線,由于要安裝在不同的位置所以導(dǎo)線也不一樣長(zhǎng),這個(gè)要根據(jù)自身情況而定。

要說(shuō)的就是我把面包版的電源模塊拿來(lái)用了,又可以用電池又可以通過(guò)USB用移動(dòng)電源。
然后開(kāi)始部署,我是用透明膠固定導(dǎo)線。想到拆的時(shí)候會(huì)留膠,所以沒(méi)粘很多,看起來(lái)不太美觀。

正好我門(mén)口對(duì)面就有個(gè)平臺(tái)可以放。然后需要調(diào)節(jié)下傳感器的感知距離,我調(diào)到最低的,反正完全夠用了。
第五部分 使用測(cè)試
好不容易等到了晚上,可以測(cè)試了。
先打開(kāi)電源,單片機(jī)運(yùn)行,感受到了我的人體紅外,燈亮。于是我進(jìn)房間,留下一條門(mén)縫,一分鐘左右燈熄滅了,于是我拉開(kāi)門(mén),燈又一下亮了起來(lái)。程序是沒(méi)問(wèn)題,單片機(jī)能正確運(yùn)行。蛋似!光線真的太弱了。雖然我們看得到,但是本來(lái)就弱的光線,還是紅色和藍(lán)色的,這氛圍更加詭異了……

這是什么!瞬間有種進(jìn)了鬼屋的感覺(jué)啊!嚇?biāo)辣緦殞毩耍?/p>
我覺(jué)得還是早睡早起好!
第六部分 總結(jié)
如果真的要做的話,還是賣(mài)個(gè)大功率白光LED吧,有條件的同學(xué)還可以繼電器加電燈。
最后附上所有資料的下載。
*本文作者:zhangtory |