黑夜里打開(kāi)搖搖棒,在空中快速的左右搖晃,神奇的事情就會(huì)出現(xiàn)。如果是干木材上的一點(diǎn)碳火,那么搖晃出來(lái)的只會(huì)是一條弧線(xiàn)。搖搖棒卻可以讓棒身上的LED燈在劃過(guò)空中的適當(dāng)位置顯示文字和圖形,這一奇跡就是單片機(jī)的杰作。單片機(jī)愛(ài)好者都會(huì)在《無(wú)線(xiàn)電》雜志或者網(wǎng)上找到關(guān)于搖搖棒制作的文章,相信許多熱血沸騰的朋友已經(jīng)著手制作了,最先要解決的問(wèn)題是買(mǎi)到水銀開(kāi)關(guān),它并不怎么常見(jiàn),雖然價(jià)格只有1元錢(qián)。接下來(lái)是要買(mǎi)一塊長(zhǎng)條形洞洞板,把8個(gè)或16個(gè)LED燈并排焊在上面,然后連接LED燈與單片機(jī)之間的導(dǎo)線(xiàn)。如果你覺(jué)得這樣的制作太麻煩,何不試試精簡(jiǎn)設(shè)計(jì)的搖搖棒,讓制作更簡(jiǎn)單,讓外觀更簡(jiǎn)潔。單片機(jī)、LED、電池、導(dǎo)線(xiàn)、塑料管,這5件東西可以制作什么?下面你將了解到如何用這5件材料制作可顯示漢字的搖搖棒。我為這款設(shè)計(jì)取名SHOOK16搖搖棒。
制作SHOOK16搖搖棒
SHOOK16搖搖棒制作起來(lái)非常簡(jiǎn)單,而且它使用的是16個(gè)LED燈來(lái)顯示,可以輕松顯示中文、英文和圖型。程序設(shè)計(jì)上考慮了將來(lái)的字幕更換,可直接用取模軟件生成你需要的字幕內(nèi)容。整個(gè)制作無(wú)需PCB板,焊接容易、結(jié)構(gòu)緊湊。只要把貼片LED直接焊接在單片機(jī)的引腳上就可以了。而且一般的搖搖棒多采用微動(dòng)開(kāi)關(guān)來(lái)切換字幕,SHOOK16搖搖棒卻另有創(chuàng)新,它采用縱向搖動(dòng)或敲擊棒身來(lái)切換字幕,字幕的數(shù)量完全取決于單片機(jī)FLASH大小,SHOOK16采用的單片機(jī)是STC12C5A60S2,內(nèi)部具有60K字節(jié)的FLASH空間,而程序本身才使用了2K字節(jié),余下的58K字節(jié)可以任你發(fā)揮。
制作SHOOK16搖搖棒 第1步 準(zhǔn)備制作材料。制作SHOOK16搖搖棒所需要的材料少的可憐,通常的制作都不把電池和導(dǎo)線(xiàn)算到材料里面,而在這里算上它們也不過(guò)5種。電池、單片機(jī)、貼片LED都可以在電子市場(chǎng)或者網(wǎng)上買(mǎi)到,包裝單片機(jī)用的塑料管可以在賣(mài)芯片的柜臺(tái)找到,店家都是把它當(dāng)垃圾處理的,而我們卻要把它變廢為寶。導(dǎo)線(xiàn)和廢棄的元器件引腳不用準(zhǔn)備,相信每一個(gè)愛(ài)好者的桌面上都有一大堆。當(dāng)然了,因?yàn)橹谱髦惺褂昧藛纹瑱C(jī),所以你還需要準(zhǔn)備電腦和為STC單片機(jī)燒寫(xiě)程序的ISP下載工具。有了這些就可以完成制作,是不是有些不可思議呢?原來(lái)電子制作可以這么簡(jiǎn)單! 制作SHOO K16搖搖棒所需要的材料
好的制作其實(shí)并不需要過(guò)多的文字說(shuō)明,那就發(fā)揮我的強(qiáng)項(xiàng),用圖解的方式介紹SHOOK16搖搖棒的制作方法。首先來(lái)看一下制作SHOOK16搖搖棒所需要的材料清單。

SHOOK16搖搖棒電路原理圖 SHOOK16搖搖棒的電路原理圖也很簡(jiǎn)單,主要有單片機(jī)、LED、慣性開(kāi)關(guān)和電池。電路圖中標(biāo)號(hào)相同的引腳是連接在一起的,這是網(wǎng)絡(luò)標(biāo)號(hào)的表示方法,省去了密密麻麻的連接線(xiàn)。其實(shí)在以下的制作過(guò)程中并不需要回頭來(lái)參考原理圖,因?yàn)殡娐分谱魇侨绱撕?jiǎn)單,以至于只看實(shí)物圖片就可以完成制作。下面我們就按順序?qū)χ谱鞯年P(guān)鍵節(jié)點(diǎn)做圖文介紹。 第2步 把單片機(jī)第21腳到第40腳一側(cè)的引腳全部用鉗子向外側(cè)彎曲,目的是為了增加單片機(jī)的寬度。為什么要這樣做呢?我在設(shè)計(jì)的時(shí)候是使用了電子市場(chǎng)中常見(jiàn)的包裝單片機(jī)的塑料管,店家多把空出來(lái)的塑料管丟掉。我覺(jué)得它們結(jié)實(shí)而且透明,應(yīng)該可以制作些什么,于是就向店家要了一些。在設(shè)計(jì)搖搖棒的時(shí)候突然想到塑料管的妙用,如果用塑料管來(lái)做搖搖棒的身體應(yīng)該是很理想的?墒钱(dāng)我把單片機(jī)放進(jìn)去的時(shí)候卻發(fā)現(xiàn)單片機(jī)會(huì)左右、上下晃蕩,這樣制作出來(lái)的搖搖棒會(huì)在搖動(dòng)時(shí)叮噹亂響,不知道的還以為是撥浪鼓呢。我也想過(guò)用膠帶固定或是用紙?zhí)畛淇障,可是?huì)讓制作變得困難,而且也不美觀。所以不是縮小塑料管的寬度就是增加單片機(jī)的寬度,于是彎曲一側(cè)引腳就可以最快速地解決問(wèn)題。那為什么只彎曲第21腳到第40腳一側(cè)的引腳呢?這里面還是有門(mén)道的,下文告訴你。

用鉗子彎曲單片機(jī)第21腳到第40腳一側(cè)的引腳 彎曲角度以單片機(jī)放入塑料管后不易左右移動(dòng)為止 第3步 制作LED顯示電路。把貼片LED直接焊接在剛剛被彎曲過(guò)的單片機(jī)引腳上。從單片機(jī)的21腳(P2.0)開(kāi)始焊起,貼片LED的負(fù)極連接到21腳一側(cè),后續(xù)的LED負(fù)極也都朝向這一側(cè)。16個(gè)LED分別焊接在單片機(jī)的21腳到37腳之間。焊接LED的時(shí)間不要過(guò)長(zhǎng),烙鐵尖不到碰到貼片LED的塑料面上,LED的排列的整齊,顯示效果才會(huì)更好。
將LED直接焊接在單片機(jī)的引腳上,LED負(fù)極都朝向單片機(jī)的21腳一側(cè)

0805型貼片LED燈
有朋友可能很少接觸這種0805型貼片LED,它的體積比大米粒還要小,亮度卻不比直插式的LED差。這種貼片LED在各大電子市場(chǎng)都有銷(xiāo)售,包裝它們的是一個(gè)大圓盤(pán)里面的黑色塑料條,好像電影膠片一樣,許多貼片元器件都是這么包裝的。 貼片式LED燈的極性說(shuō)明
貼片LED和直插LED在使用上并沒(méi)有太大區(qū)別,只需要學(xué)會(huì)識(shí)別貼片LED的極性,還有就是在焊接時(shí)控制好烙鐵的溫度和焊接時(shí)間。貼片LED的兩側(cè)有兩個(gè)電極,其中標(biāo)有綠色小點(diǎn)的一側(cè)為LED的負(fù)極。焊接時(shí)先將兩個(gè)焊盤(pán)中的其中一個(gè)上錫,用烙鐵熔化焊盤(pán)上的錫,同時(shí)用攝子輕輕地夾起貼片LED放到對(duì)應(yīng)位置,撤走烙鐵等錫凝固后再用常規(guī)方法焊接另一邊的焊盤(pán)。初次焊接的朋友可以在洞洞板上練習(xí),熟悉動(dòng)作之后再正式焊接。 這種直接焊接的靈感來(lái)自于我之前設(shè)計(jì)的mini1608電子時(shí)鐘,當(dāng)我把LED點(diǎn)陣屏直接焊接在單片機(jī)的引腳上時(shí),我就開(kāi)始對(duì)直接焊接的制作著了迷。后來(lái)的一段時(shí)間里,我總會(huì)用身邊可以找到元器件往單片機(jī)的引腳上安,其中的某一天就想到了貼片LED。但是當(dāng)時(shí)并沒(méi)有想到用這個(gè)方法來(lái)制作什么東西,于是存入了大腦深處,直到在寫(xiě)搖搖棒設(shè)計(jì)方案的時(shí)候才又把陳年的創(chuàng)意翻了出來(lái)。貼片LED的體積小巧,包裝單片機(jī)的塑料管又是透明的,正好可以透出LED的光.如此焊接在硬件結(jié)構(gòu)上確實(shí)不錯(cuò),可是在電路原理和單片機(jī)編程上面是否行得通呢?嗯,這里的關(guān)鍵問(wèn)題就是連續(xù)16個(gè)貼片LED所連接的引腳都必須是I/O接口,并且I/O接口在輸出高、低電平時(shí)都可以直接驅(qū)動(dòng)LED發(fā)光。也就是說(shuō),單片機(jī)I/O接口輸出高電平時(shí)至少需要有20mA電流的推動(dòng)能力。唯一可以做到這一點(diǎn)的也只有I/O接口的推挽工作方式了。恰好STC公司的10、11、12系列的單片機(jī)都有這一配置,所以我選擇了手邊常用的STC12C5A60S2來(lái)實(shí)現(xiàn)。 電路原理沒(méi)了問(wèn)題,那么如何編寫(xiě)LED的驅(qū)動(dòng)程序呢?不僅讓LED可以任意點(diǎn)亮,還要能控制它們?cè)趽u動(dòng)過(guò)程中顯示漢字和圖形。老實(shí)講,我在設(shè)計(jì)SHOOK16搖搖棒之前并沒(méi)有了解過(guò)其他搖搖棒的原理和編程方法,所以編寫(xiě)傳統(tǒng)設(shè)計(jì)的搖搖棒尚無(wú)把握,更何況這種從來(lái)沒(méi)有試過(guò)的驅(qū)動(dòng)方式了!攻下這一難關(guān)確實(shí)耗費(fèi)了不少精力,值得慶幸的是N次調(diào)試之后我成功了,并濾除那些挫折與失敗,僅把成功經(jīng)驗(yàn)與你分享。 傳統(tǒng)的搖搖棒設(shè)計(jì)是采用傳統(tǒng)的單片機(jī)灌電流方式點(diǎn)亮LED的,F(xiàn)在閉上眼睛,想象一下?lián)u搖棒搖動(dòng)時(shí)的1/4慢鏡頭,在搖搖棒處在最左邊的時(shí)候,16個(gè)LED燈會(huì)顯示字幕數(shù)據(jù)表里最左邊的一列,停留一段時(shí)間之后所有LED熄滅,等待搖搖棒的身體搖動(dòng)到字幕數(shù)據(jù)中下一列的位置,然后顯示、停留、熄滅。如此方法一直顯示到字幕的最右邊。好了,現(xiàn)在取消慢鏡頭,變成正常速度,我們的眼睛便可以看到那星星點(diǎn)點(diǎn)的亮光在浩瀚無(wú)際的夜空中形成飄浮的文字,這種顯示方法應(yīng)該叫做逐列顯示。 逐點(diǎn)掃描形成列數(shù)據(jù),然后再逐列掃描形成字幕

某一I/O 接口為低電平時(shí)負(fù)極與之連接的LED點(diǎn)亮
SHOOK16搖搖棒在1/4慢鏡頭的時(shí)候看起來(lái)是逐列顯示的,可是在1/16慢鏡頭的時(shí)候卻又有不同。SHOOK16搖搖棒中單片機(jī)與LED的連接方式注定讓16個(gè)LED不能同時(shí)點(diǎn)亮,它們必須逐一點(diǎn)亮。同一時(shí)間內(nèi)只能有1個(gè)引腳為低電平,其余引腳都必須為高電平。在搖搖棒的身體搖動(dòng)到某一位置時(shí),這一列的字幕數(shù)據(jù)表會(huì)被送入顯示程序,顯示程序要怎么做呢?有點(diǎn)麻煩,它要從上到下依次檢查這一列數(shù)據(jù)中需要點(diǎn)亮的LED。首先檢查最上邊第1個(gè)LED,這一列的數(shù)據(jù)中不需要它亮,那所有I/O接口輸出高電平,停留一段時(shí)間再檢查第2個(gè)LED。嗯,第2個(gè)LED需要亮,于是連接第2個(gè)LED負(fù)極的引腳輸出低電平,其他I/O接口輸出高電平。這時(shí)第2個(gè)LED正極是高電平,負(fù)極是低電平,LED點(diǎn)亮。因?yàn)?/font>LED 反向不導(dǎo)通,所以第3個(gè)LED不亮,其他的LED兩極都是高電平也不亮。點(diǎn)亮一段時(shí)間后再依此方法檢查其他LED。在1/16慢鏡頭時(shí),16個(gè)LED就好像單片機(jī)實(shí)驗(yàn)板上的流水燈程序一樣逐一點(diǎn)亮又逐一熄滅。在1/4 慢鏡頭的時(shí)候逐點(diǎn)掃描只是一瞬間的事,所以看起來(lái)它們是同時(shí)點(diǎn)亮的,因?yàn)樗鼈兲幵诓煌乃俣鹊燃?jí)上。 編寫(xiě)驅(qū)動(dòng)硬件的工作就只是循環(huán)將17個(gè)I/O接口中的某一個(gè)變成低電平而已了。解決了貼片LED驅(qū)動(dòng)的問(wèn)題卻又產(chǎn)生了新問(wèn)題,我們?nèi)绾巫寙纹瑱C(jī)知道在搖動(dòng)時(shí)哪一時(shí)刻搖搖棒的身體處在最左邊呢? 第4步 制作三向慣性開(kāi)關(guān)。將一支廢棄元器件引腳對(duì)折并焊接在彈性導(dǎo)線(xiàn)的一端上,彈性導(dǎo)線(xiàn)的另一端焊接在單片機(jī)的第20腳(GND)內(nèi)側(cè),注意掌握導(dǎo)線(xiàn)長(zhǎng)度。將第4腳(P1.3)引腳向內(nèi)彎曲至芯片底部,形成慣性開(kāi)關(guān)的一個(gè)觸點(diǎn)。再用廢棄元器件引腳向上延長(zhǎng)第5腳(P1.2),使之形成與第4腳(P1.3)平行且相對(duì)的另一個(gè)觸點(diǎn)。把第6腳(P1.4)稍微向內(nèi)彎曲一點(diǎn),使它可以在導(dǎo)線(xiàn)向這一側(cè)撞擊時(shí)首先接觸到第6腳,這樣就形成了3個(gè)觸點(diǎn)。3個(gè)觸點(diǎn)分別對(duì)應(yīng)SHOOK16搖搖棒的三個(gè)方向,所以叫三向慣性開(kāi)關(guān)。彈性導(dǎo)線(xiàn)指的是在輕微的外力作用后能夠恢復(fù)原狀的普通導(dǎo)線(xiàn),也可以用細(xì)鐵絲代替。調(diào)整彈性導(dǎo)線(xiàn)使之在靜止?fàn)顟B(tài)時(shí)處于上、下兩個(gè)觸點(diǎn)的中間。導(dǎo)線(xiàn)懸空的一端應(yīng)該有一定重量,增加慣性的作用力。 彈性導(dǎo)線(xiàn)的另一端焊接在單片機(jī)的第20腳內(nèi)側(cè) 調(diào)整彈性導(dǎo)線(xiàn)使之在靜止?fàn)顟B(tài)時(shí)處于上、下兩個(gè)觸點(diǎn)的中間

三向慣性開(kāi)關(guān)分別對(duì)應(yīng)SHOOK16搖搖棒的3個(gè)方向 為什么要制作慣性開(kāi)關(guān)呢?其實(shí)慣性開(kāi)關(guān)的出現(xiàn)就是為了解決我們前面出現(xiàn)的問(wèn)題——讓單片機(jī)知道搖搖棒身體所處的位置。在判斷棒身位置的設(shè)計(jì)中,除了為搖搖棒安裝全球衛(wèi)星定位系統(tǒng)(GPS)之外,還可以使用慣性開(kāi)關(guān)。關(guān)于慣性還有這樣一個(gè)笑話(huà),話(huà)說(shuō)一公共汽車(chē)?yán)镎局粋(gè)美女和一個(gè)丑男,司機(jī)突然剎車(chē),丑男措手不及向前一擁撞到了美女,美女白了丑男一眼說(shuō):“哼,德性!”。丑男不好意思的笑了笑說(shuō):“嘿嘿,不是德性,是慣性。”在SHOOK16搖搖棒上有三個(gè)美女和一個(gè)丑男,雖然這個(gè)比喻會(huì)讓大家感覺(jué)妒忌,但事實(shí)就是如此。由焊接在單片機(jī)第20腳的彈性導(dǎo)線(xiàn)充當(dāng)著丑男的角色,經(jīng)過(guò)彎曲的第3、4、5腳分別充當(dāng)著美女的角色。當(dāng)向右搖晃的時(shí)候,由于慣性的作用,丑男(慣性開(kāi)關(guān)柄)就會(huì)撞到左邊的美女(慣性開(kāi)關(guān)2),向左搖晃的時(shí)候就會(huì)撞到右邊的美女(慣性開(kāi)關(guān)1),向前搖晃的時(shí)候就會(huì)撞到后邊的美女(字幕切換開(kāi)關(guān))。他們相撞的時(shí)候就是速度剛剛開(kāi)始改變的時(shí)候,他們分開(kāi)的時(shí)候也就是速度趨于穩(wěn)定的時(shí)候。更多關(guān)于慣性的原理解釋可以致電你的中學(xué)物理老師。單片機(jī)正是利用了這個(gè)原理來(lái)判斷棒身所處的位置的,其中“慣性開(kāi)關(guān)1”和“慣性開(kāi)關(guān)2”兩個(gè)觸點(diǎn)是用來(lái)判斷棒身左右位置的,那“字幕切換開(kāi)關(guān)”讓搖搖棒多了一樣功能——前后搖晃或敲擊時(shí)切換字幕。所以這種用彈性導(dǎo)線(xiàn)制作的慣性開(kāi)關(guān)不但不需要使用水銀開(kāi)關(guān),而且還獨(dú)具特色。 第5步 制作電源電路。取一段導(dǎo)線(xiàn)將一端焊接在單片機(jī)的第20腳(GND)上。導(dǎo)線(xiàn)另一端的接頭處掛上大量的錫,作為電池負(fù)極的接觸點(diǎn)。用膠帶固定導(dǎo)線(xiàn),使之在搖動(dòng)時(shí)不易亂竄。再把一支廢棄的元器件引腳焊接在單片機(jī)的第40腳(VCC)上,使引腳與單片機(jī)上方的導(dǎo)線(xiàn)平行且相對(duì),它們之間的空隙就用來(lái)安放電池。將單片機(jī)連同電池一并塞進(jìn)塑料管中,可用透明膠帶纏繞單片機(jī)一圈并在塑料管開(kāi)口處留出膠帶頭以方便拉出電池和單片機(jī),搖搖棒不用時(shí)可拉出電池(或把紙片塞在兩塊電池中間)。最后用透明膠帶把開(kāi)口處包好。因搖動(dòng)時(shí)的離心力向上,加之電池塞入塑料管時(shí)本來(lái)就已經(jīng)很緊了,所以單片機(jī)及電池不會(huì)向下滑落,不需要設(shè)計(jì)單片機(jī)下方固定。 取一段導(dǎo)線(xiàn)將一端焊接在單片機(jī)的第20腳上 把一支廢棄的元器件引腳焊接在單片機(jī)的第40腳上

將鈕扣電池重疊后放入正、負(fù)極接口處

將單片機(jī)連同電池一并塞進(jìn)塑料管中
選擇適合的電池是決定整個(gè)設(shè)計(jì)成敗的又一關(guān)鍵。最初的我采用的是3節(jié)5號(hào)堿性電池,因?yàn)槲铱傆X(jué)得堿性電池的能量是很大的,可以讓SHOOK16搖搖棒使用的更長(zhǎng)久一些。于是我在單片機(jī)的正、負(fù)極上引出兩條導(dǎo)線(xiàn),通過(guò)中空塑料管延長(zhǎng)到手柄握著的一端,然后把大大的電池盒用膠帶綁在塑料管上。這樣一來(lái)既不美觀也不好操作,和前面的巧妙設(shè)計(jì)形成了很大的反差。必須重新設(shè)計(jì)電池方案,那怕做出一些犧牲。正巧手邊有前不久為錄制LED點(diǎn)陣屏測(cè)試方法視頻節(jié)目時(shí)而購(gòu)買(mǎi)的鈕扣電池,型號(hào)是CR2032。我拿出電池往塑料管里塞了塞,雖然有點(diǎn)緊,可以還是可以牢固的塞進(jìn)去。我大喜!這不正是我想要的樣子嗎?馬上用短一點(diǎn)的導(dǎo)線(xiàn)把兩節(jié)鈕扣電池夾在中間,一并塞進(jìn)塑料管里。哈哈,那電池、那塑料管、那單片機(jī),就好像老天爺為它們保了媒一樣,那么的般配、適合。不過(guò)兩節(jié)CR2032串聯(lián)的電壓是6V,單片機(jī)的工作電壓是4.5~5.5V,這樣連接會(huì)不會(huì)損壞單片機(jī)呢?其實(shí)并不會(huì),首先電路中存在一定壓降,加之鈕扣電池可提供的電流并不大,二者相配有驚無(wú)險(xiǎn)。而且因?yàn)閱纹瑱C(jī)第21腳到第40腳向外彎曲,使得另外一側(cè)的引腳緊貼塑料管內(nèi)壁,讓引腳內(nèi)側(cè)空出一大塊空間,正好是給慣性開(kāi)關(guān)預(yù)留的位置。這也正是我要彎曲單片機(jī)第21腳到第40腳一側(cè)引腳的原因。 SHOOK16搖搖棒在夜間的顯示效果
現(xiàn)在,SHOOK16搖搖棒制作完成。在寧?kù)o的夜晚,招集家里的親朋好友坐在沙發(fā)上,關(guān)燈,然后把搖搖棒上LED的一面對(duì)著他們勻速搖晃,那空中飄浮的文字一定會(huì)讓在場(chǎng)的觀眾驚嘆不已。敲擊棒身,“啪”的一聲,字幕改變了內(nèi)容,再敲擊——“啪”——又變了。表演結(jié)束后,打開(kāi)燈,其中某位觀眾站起身來(lái)氣憤的說(shuō):“你要換字幕就換嘛,為什么用棒子打我的頭?!”沒(méi)錯(cuò),SHOOK16搖搖棒可以為你的生活帶來(lái)更多精彩和樂(lè)趣。
除文章中的提示外,你還需要注意以下幾個(gè)問(wèn)題: 1. 在開(kāi)始制作之前,先要將SHOOK16搖搖棒的HEX文件燒寫(xiě)到單片機(jī)里。 3. 用STC-ISP軟件燒寫(xiě)HEX文件時(shí)需要有“步驟4”中選擇“內(nèi)部RC振蕩器”。 4. 本制作采用STC12C5A60S2單片機(jī),不可使用其他系列的單片機(jī)替代。 5. 如果遇到制作上的問(wèn)題可以在網(wǎng)上向我提問(wèn),我會(huì)盡量幫助你解決。
- /*********************************************************************************************
- 程序名: SHOOK16搖搖棒控制程序
- 編寫(xiě)人: 杜洋
- 編寫(xiě)時(shí)間: 11月12日
- 硬件支持: STC12C5A60S2 內(nèi)部RC時(shí)鐘
- 接口說(shuō)明: 單片機(jī)P0、P2側(cè)并行排列16個(gè)貼片LED(自P2.0開(kāi)始(-))
- 修改日志:
- [TEST測(cè)試版]
- 1-200911122244 在主函數(shù)寫(xiě)入簡(jiǎn)單程序測(cè)試慣性開(kāi)關(guān)是否正常,通過(guò)測(cè)試并備份。(備)
- 2-200911130112 往返搖動(dòng)雙重顯示實(shí)驗(yàn)成功,目前已經(jīng)達(dá)到搖搖棒功能的基本要求。(備)
- [V1正式版]
- 3-200911130309 加入了3個(gè)字幕內(nèi)容,通過(guò)敲擊切換字幕。(備)
- 4-200911131910 為網(wǎng)站照片重新設(shè)計(jì)方案并重定義了IO接口。(備)
- /*********************************************************************************************
- 說(shuō)明:
- 了解字幕的修改方法,請(qǐng)參考《mini1608字模設(shè)計(jì)方法》
- V1正式版
- # 硬件制作只需要單片機(jī)、LED、電池和導(dǎo)線(xiàn),制作非常簡(jiǎn)單。
- # 采用STC增強(qiáng)型單片機(jī)。
- /*********************************************************************************************/
- #include <STC12C5A60S2.H> //單片機(jī)頭文件
- unsigned char MENU;
- #define DY_DELAY 5 //設(shè)置每一個(gè)點(diǎn)顯示的時(shí)間長(zhǎng)度(1~20)
- sbit KEY1 = P1 ^ 2; //搖動(dòng)慣性開(kāi)關(guān)
- sbit KEY2 = P1 ^ 3;
- sbit KEY3 = P1 ^ 4; //選擇鍵(大力橫向碰擊觸發(fā))
- sbit LED1 = P0 ^ 3; //LED燈定義,低電平時(shí)亮(自上到下)
- sbit LED2 = P0 ^ 4;
- sbit LED3 = P0 ^ 5;
- sbit LED4 = P0 ^ 6;
- sbit LED5 = P0 ^ 7;
- sbit LED6 = P4 ^ 6;
- sbit LED7 = P4 ^ 5;
- sbit LED8 = P4 ^ 4;
- sbit LED9 = P2 ^ 7;
- sbit LED10 = P2 ^ 6;
- sbit LED11 = P2 ^ 5;
- sbit LED12 = P2 ^ 4;
- sbit LED13 = P2 ^ 3;
- sbit LED14 = P2 ^ 2;
- sbit LED15 = P2 ^ 1;
- sbit LED16 = P2 ^ 0;
- /*********************************************************************************************/
- unsigned char code logo[] = { // (取碼:從上到下從左到右,縱向8位下高位)
- 0x00,0x00,0x10,0x0E,0xD0,0x01,0xFF,0xFF,//杜
- 0xFF,0xFF,0x90,0x01,0x10,0x43,0x40,0x40,
- 0x40,0x40,0x40,0x40,0xFF,0x7F,0xFE,0x7F,
- 0x40,0x40,0x60,0x40,0x40,0x60,0x00,0x40,
- 0x00,0x00,0x10,0x04,0xE1,0x78,0x4E,0xFE,//洋
- 0x8C,0x63,0x60,0x00,0x00,0x04,0x49,0x04,
- 0x4A,0x04,0x4E,0x04,0xF8,0xFF,0xFC,0xFF,
- 0x4E,0x04,0x6B,0x04,0x4A,0x06,0x00,0x04,
- 0x00,0x00,0x00,0x40,0x04,0x40,0x04,0x40,//工
- 0x04,0x40,0x04,0x40,0x04,0x40,0xFC,0x7F,
- 0xFC,0x7F,0x04,0x40,0x04,0x40,0x04,0x40,
- 0x06,0x40,0x04,0x60,0x00,0x40,0x00,0x00,
- 0x00,0x00,0x80,0x00,0x60,0x00,0xF8,0xFF,//作
- 0xEF,0x7F,0x06,0x00,0x40,0x00,0x30,0x00,
- 0x1C,0x00,0xFF,0xFF,0xFA,0xFF,0x48,0x04,
- 0x48,0x04,0x68,0x04,0x4C,0x06,0x08,0x04,
- 0x00,0x00,0x08,0x00,0x1C,0x80,0x0E,0x81,//室
- 0x94,0x8B,0xD4,0x89,0x75,0x89,0x37,0xFF,
- 0x16,0xFF,0x34,0x89,0xD4,0x89,0x94,0x8B,
- 0x1C,0x81,0x0E,0xC0,0x04,0x80,0x00,0x00
- };
- /*********************************************************************************************/
- unsigned char code logo1[] = { // “DoYoung” (取碼:從上到下從左到右,縱向8位下高位)
- 0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x04,0x08, // -D-
- 0x0C,0x0C,0xF8,0x07,0xF0,0x03,0x00,0x00,
- 0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x08, // -o-
- 0x20,0x08,0xE0,0x0F,0xC0,0x07,0x00,0x00,
- 0x00,0x00,0x3C,0x00,0x7C,0x08,0xC0,0x0F, // -Y-
- 0xC0,0x0F,0x7C,0x08,0x3C,0x00,0x00,0x00,
- 0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x08, // -o-
- 0x20,0x08,0xE0,0x0F,0xC0,0x07,0x00,0x00,
- 0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x08, // -u-
- 0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x00,
- 0x20,0x00,0xE0,0x0F,0xC0,0x0F,0x20,0x00, // -n-
- 0x20,0x00,0xE0,0x0F,0xC0,0x0F,0x00,0x00,
- 0xC0,0x27,0xE0,0x6F,0x20,0x48,0x20,0x48, // -g-
- 0xC0,0x7F,0xE0,0x3F,0x20,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空格
- 0x18,0x06,0x3C,0x0E,0x64,0x08,0x44,0x08, // -S-
- 0xC4,0x08,0x9C,0x0F,0x18,0x07,0x00,0x00,
- 0x20,0x00,0x20,0x00,0xF8,0x07,0xFC,0x0F, // -t-
- 0x20,0x08,0x20,0x0C,0x00,0x04,0x00,0x00,
- 0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x08, // -u-
- 0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x00,
- 0x80,0x07,0xC0,0x0F,0x60,0x08,0x24,0x08, // -d-
- 0xFC,0x07,0xFC,0x0F,0x00,0x08,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x20,0x08,0xEC,0x0F, // -i-
- 0xEC,0x0F,0x00,0x08,0x00,0x00,0x00,0x00,
- 0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x08, // -o-
- 0x20,0x08,0xE0,0x0F,0xC0,0x07,0x00,0x00,
- };
- /*********************************************************************************************/
- unsigned char code logo2[] = { // “與電子愛(ài)好者同行” (取碼:從上到下從左到右,縱向8位下高位)
- 0x00,0x00,0x00,0x08,0x00,0x08,0x80,0x08,
- 0xFF,0x09,0xFE,0x08,0x88,0x08,0x88,0x08,
- 0x88,0x08,0x88,0x08,0x88,0x0C,0x88,0x48,
- 0x88,0xC0,0x8C,0x7F,0xC8,0x3F,0x80,0x00,
- 0x00,0x00,0x00,0x00,0xF8,0x0F,0xF0,0x07,
- 0x90,0x04,0x90,0x04,0x90,0x04,0xFF,0x7F,
- 0xFE,0xFF,0x90,0xC4,0x90,0xC4,0x90,0xC4,
- 0xF0,0xCF,0xF8,0xC7,0x10,0xF0,0x00,0x40,
- 0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
- 0x82,0x00,0x82,0x00,0x82,0x40,0x82,0x40,
- 0xE2,0xFF,0xF2,0x7F,0x9A,0x00,0x8E,0x00,
- 0x87,0x00,0x82,0x00,0xC0,0x00,0x80,0x00,
- 0x00,0x00,0x40,0x00,0xE0,0x40,0x74,0x20,
- 0xA4,0x98,0xAC,0x8E,0xFA,0x47,0xE2,0x6F,
- 0xBE,0x3A,0xAA,0x12,0xB2,0x3A,0xBF,0x6E,
- 0xAB,0x67,0xE2,0xC2,0x70,0xC0,0x20,0x40,
- 0x00,0x00,0x20,0x80,0x20,0x63,0xF8,0x37,
- 0xFF,0x1C,0x26,0x0F,0xF0,0x7B,0xE0,0x30,
- 0x82,0x00,0x82,0x20,0x82,0x40,0xF2,0xFF,
- 0xEA,0x7F,0x8E,0x00,0xC7,0x00,0x82,0x00,
- 0x00,0x00,0x40,0x04,0x40,0x04,0x44,0x02,
- 0x44,0xFF,0x44,0x7F,0xC4,0x49,0xFF,0x49,
- 0x7F,0x49,0x64,0x49,0x66,0x49,0x54,0xFF,
- 0xD8,0x7F,0x4E,0x01,0x64,0x00,0x40,0x00,
- 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x7F,
- 0x12,0x00,0xD2,0x1F,0x92,0x0F,0x92,0x08,
- 0x92,0x08,0x92,0x1F,0xDA,0x4F,0x92,0x40,
- 0xFE,0xFF,0xFF,0x7F,0x02,0x00,0x00,0x00,
- 0x00,0x00,0x20,0x04,0x10,0x02,0x8C,0xFF,
- 0xE7,0x7F,0x42,0x00,0x00,0x00,0x20,0x00,
- 0x22,0x00,0x22,0x40,0x22,0x40,0xE2,0xFF,
- 0xE2,0x7F,0x23,0x00,0x32,0x00,0x20,0x00
- };
- /*********************************************************************************************
- 函數(shù)名:LED顯示用延時(shí)函數(shù)
- 調(diào) 用:delay(?);
- 參 數(shù):1~65535(參數(shù)不可為0)
- 返回值:無(wú)
- 結(jié) 果:占用CPU方式延時(shí)與參數(shù)數(shù)值相同的毫秒時(shí)間
- 備 注:應(yīng)用于1T單片機(jī)時(shí)i<600,應(yīng)用于12T單片機(jī)時(shí)i<125
- /*********************************************************************************************/
- void delay (unsigned int a){ // 用于點(diǎn)掃描的延時(shí)
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 1; i++);
- }
- }
- /*********************************************************************************************/
- /*********************************************************************************************
- 函數(shù)名:毫秒級(jí)CPU延時(shí)函數(shù)
- 調(diào) 用:DELAY_MS (?);
- 參 數(shù):1~65535(參數(shù)不可為0)
- 返回值:無(wú)
- 結(jié) 果:占用CPU方式延時(shí)與參數(shù)數(shù)值相同的毫秒時(shí)間
- 備 注:應(yīng)用于1T單片機(jī)時(shí)i<600,應(yīng)用于12T單片機(jī)時(shí)i<125
- /*********************************************************************************************/
- void DELAY_MS (unsigned int a){
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 600; i++);
- }
- }
- /*********************************************************************************************/
- /*********************************************************************************************
- 函數(shù)名:關(guān)閉所有LED燈(操作硬件)
- 調(diào) 用:DISPLAY_OFF();
- 參 數(shù):無(wú)
- 返回值:無(wú)
- 結(jié) 果:所有LED燈熄滅
- 備 注:
- /**********************************************************************************************/
- void DISPLAY_OFF (void){
- delay(DY_DELAY);//顯示停留
- P0 = 0xff;
- P2 = 0xff;
- P4 = 0xff;
- }
- /**********************************************************************************************/
- /*********************************************************************************************
- 函數(shù)名:?jiǎn)螏瑪?shù)據(jù)送入顯示(操作硬件)
- 調(diào) 用:DISPLAY_PIN(?,?);
- 參 數(shù):16位顯示數(shù)據(jù)(下高位)(d:上面8位,e:下面8位)
- 返回值:無(wú)
- 結(jié) 果:點(diǎn)亮對(duì)應(yīng)數(shù)據(jù)的LED燈
- 備 注:
- /**********************************************************************************************/
- void DISPLAY_PIN (unsigned char d,unsigned char e){ //第1列橫向顯示程序
- unsigned char i;
- i = d & 0x01;
- if(i == 0x01){LED1 = 0;}DISPLAY_OFF();
- i = d & 0x02;
- if(i == 0x02){LED2 = 0;}DISPLAY_OFF();
- i = d & 0x04;
- if(i == 0x04){LED3 = 0;}DISPLAY_OFF();
- i = d & 0x08;
- if(i == 0x08){LED4 = 0;}DISPLAY_OFF();
- i = d & 0x10;
- if(i == 0x10){LED5 = 0;}DISPLAY_OFF();
- i = d & 0x20;
- if(i == 0x20){LED6 = 0;}DISPLAY_OFF();
- i = d & 0x40;
- if(i == 0x40){LED7 = 0;}DISPLAY_OFF();
- i = d & 0x80;
- if(i == 0x80){LED8 = 0;}DISPLAY_OFF();
- i = e & 0x01;
- if(i == 0x01){LED9 = 0;}DISPLAY_OFF();
- i = e & 0x02;
- if(i == 0x02){LED10 = 0;}DISPLAY_OFF();
- i = e & 0x04;
- if(i == 0x04){LED11 = 0;}DISPLAY_OFF();
- i = e & 0x08;
- if(i == 0x08){LED12 = 0;}DISPLAY_OFF();
- i = e & 0x10;
- if(i == 0x10){LED13 = 0;}DISPLAY_OFF();
- i = e & 0x20;
- if(i == 0x20){LED14 = 0;}DISPLAY_OFF();
- i = e & 0x40;
- if(i == 0x40){LED15 = 0;}DISPLAY_OFF();
- i = e & 0x80;
- if(i == 0x80){LED16 = 0;}DISPLAY_OFF();
- }
- /*********************************************************************************************
- 函數(shù)名:初始化程序
- 調(diào) 用:init();
- 參 數(shù):無(wú)
- 返回值:無(wú)
- 結(jié) 果:設(shè)計(jì)IO接口為強(qiáng)推方式并全部置1
- 備 注:
- /**********************************************************************************************/
- void init (void){
- P4SW = 0xff; //啟動(dòng)P4接口
- P0M0 = 0xff; //接口設(shè)置為強(qiáng)推
- P2M0 = 0xff;
- P4M0 = 0xff;
- P1 = 0xff; //初始IO接口狀態(tài)
- P0 = 0xff;
- P2 = 0xff;
- P4 = 0xff;
- }
- /**********************************************************************************************/
- /*********************************************************************************************
- 函數(shù)名:主函數(shù)
- 調(diào) 用:無(wú)
- 參 數(shù):無(wú)
- 返回值:無(wú)
- 結(jié) 果:程序開(kāi)始處,無(wú)限循環(huán)
- 備 注:
- /**********************************************************************************************/
- void main (void){
- unsigned char a,c;
- init();//初始程序
- while(1){
- if(MENU > 2){
- MENU = 0;
- }
- if(MENU == 0){ //字幕1
- if(KEY2 == 0){
- DELAY_MS(20);
- while(KEY2 == 0);
- c = 0;
- for(a=1;a<80;a++){ //這里的“80”是這個(gè)字幕需要掃描的列數(shù),修改字幕時(shí)必須修改此參數(shù)。
- DISPLAY_PIN (logo[c],logo[c+1]); //“LOGO”是第一個(gè)字幕的數(shù)據(jù)表名
- c=c+2;//產(chǎn)生顯示行移位
- }
- }
- if(KEY1 == 0){
- DELAY_MS(20);
- while(KEY1 == 0);
- c = 158;
- for(a=1;a<80;a++){
- DISPLAY_PIN (logo[c],logo[c+1]);
- c=c-2;//產(chǎn)生顯示行移位
- }
- }
- if(KEY3 == 0){
- DELAY_MS(20);
- while(KEY3 == 0);
- MENU++;
- }
- }
- if(MENU == 1){ //字幕2
- if(KEY2 == 0){
- DELAY_MS(20);
- while(KEY2 == 0);
- c = 0;
- for(a=1;a<108;a++){
- DISPLAY_PIN (logo1[c],logo1[c+1]);
- c=c+2;//產(chǎn)生顯示行移位
- }
- }
- if(KEY1 == 0){
- DELAY_MS(20);
- while(KEY1 == 0);
- c = 214;
- for(a=1;a<108;a++){
- DISPLAY_PIN (logo1[c],logo1[c+1]);
- c=c-2;//產(chǎn)生顯示行移位
- }
- }
- if(KEY3 == 0){
- DELAY_MS(20);
- while(KEY3 == 0);
- MENU++;
- }
- }
- if(MENU == 2){ //字幕3
- if(KEY2 == 0){
- DELAY_MS(20);
- while(KEY2 == 0);
- c = 0;
- for(a=1;a<128;a++){
- DISPLAY_PIN (logo2[c],logo2[c+1]);
- c=c+2;//產(chǎn)生顯示行移位
- }
- }
- if(KEY1 == 0){
- DELAY_MS(20);
- while(KEY1 == 0);
- c = 254;
- for(a=1;a<128;a++){
- DISPLAY_PIN (logo2[c],logo2[c+1]);
- c=c-2;//產(chǎn)生顯示行移位
- }
- }
- if(KEY3 == 0){
- DELAY_MS(20);
- while(KEY3 == 0);
- MENU++;
- }
- }
- }
- }
- /**********************************************************************************************
- /**********************************************************************************************/
- /*************************************************************
- * 杜洋工作室 DoYoung Studio
- * 與電子愛(ài)好者同行 www.DoYoung.net
- /*************************************************************/
復(fù)制代碼
原理圖:
SHOOK16_SCH.jpg (196.87 KB, 下載次數(shù): 72)
下載附件
2016-6-19 16:19 上傳
單片機(jī)源代碼和hex文件下載:
SHOOK16_SC_V1.zip
(24.28 KB, 下載次數(shù): 14)
2016-6-19 16:20 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|