找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5981|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

制作SHOOK16搖搖棒

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
    黑夜里打開(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、1112系列的單片機(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ì)盡量幫助你解決。

  1. /*********************************************************************************************
  2. 程序名:    SHOOK16搖搖棒控制程序
  3. 編寫(xiě)人:    杜洋 
  4. 編寫(xiě)時(shí)間:  11月12日
  5. 硬件支持:  STC12C5A60S2 內(nèi)部RC時(shí)鐘
  6. 接口說(shuō)明:  單片機(jī)P0、P2側(cè)并行排列16個(gè)貼片LED(自P2.0開(kāi)始(-))  
  7. 修改日志:
  8. [TEST測(cè)試版]  
  9.   1-200911122244 在主函數(shù)寫(xiě)入簡(jiǎn)單程序測(cè)試慣性開(kāi)關(guān)是否正常,通過(guò)測(cè)試并備份。(備)
  10.         2-200911130112 往返搖動(dòng)雙重顯示實(shí)驗(yàn)成功,目前已經(jīng)達(dá)到搖搖棒功能的基本要求。(備)
  11. [V1正式版]
  12.         3-200911130309 加入了3個(gè)字幕內(nèi)容,通過(guò)敲擊切換字幕。(備)
  13.         4-200911131910 為網(wǎng)站照片重新設(shè)計(jì)方案并重定義了IO接口。(備)                                                               
  14. /*********************************************************************************************
  15. 說(shuō)明:

  16. 了解字幕的修改方法,請(qǐng)參考《mini1608字模設(shè)計(jì)方法》

  17. V1正式版

  18. # 硬件制作只需要單片機(jī)、LED、電池和導(dǎo)線(xiàn),制作非常簡(jiǎn)單。
  19. # 采用STC增強(qiáng)型單片機(jī)。



  20. /*********************************************************************************************/


  21. #include <STC12C5A60S2.H> //單片機(jī)頭文件

  22. unsigned char MENU;
  23. #define DY_DELAY                5 //設(shè)置每一個(gè)點(diǎn)顯示的時(shí)間長(zhǎng)度(1~20)

  24. sbit KEY1 = P1 ^ 2; //搖動(dòng)慣性開(kāi)關(guān)
  25. sbit KEY2 = P1 ^ 3;
  26. sbit KEY3 = P1 ^ 4; //選擇鍵(大力橫向碰擊觸發(fā))

  27. sbit LED1 = P0 ^ 3; //LED燈定義,低電平時(shí)亮(自上到下)
  28. sbit LED2 = P0 ^ 4;
  29. sbit LED3 = P0 ^ 5;
  30. sbit LED4 = P0 ^ 6;
  31. sbit LED5 = P0 ^ 7;
  32. sbit LED6 = P4 ^ 6;
  33. sbit LED7 = P4 ^ 5;
  34. sbit LED8 = P4 ^ 4;
  35. sbit LED9 = P2 ^ 7;
  36. sbit LED10 = P2 ^ 6;
  37. sbit LED11 = P2 ^ 5;
  38. sbit LED12 = P2 ^ 4;
  39. sbit LED13 = P2 ^ 3;
  40. sbit LED14 = P2 ^ 2;
  41. sbit LED15 = P2 ^ 1;
  42. sbit LED16 = P2 ^ 0;

  43. /*********************************************************************************************/
  44. unsigned char code logo[] =  {            // (取碼:從上到下從左到右,縱向8位下高位)
  45. 0x00,0x00,0x10,0x0E,0xD0,0x01,0xFF,0xFF,//杜
  46.       0xFF,0xFF,0x90,0x01,0x10,0x43,0x40,0x40,
  47.       0x40,0x40,0x40,0x40,0xFF,0x7F,0xFE,0x7F,
  48.       0x40,0x40,0x60,0x40,0x40,0x60,0x00,0x40,

  49.         0x00,0x00,0x10,0x04,0xE1,0x78,0x4E,0xFE,//洋
  50.       0x8C,0x63,0x60,0x00,0x00,0x04,0x49,0x04,
  51.       0x4A,0x04,0x4E,0x04,0xF8,0xFF,0xFC,0xFF,
  52.       0x4E,0x04,0x6B,0x04,0x4A,0x06,0x00,0x04,

  53.         0x00,0x00,0x00,0x40,0x04,0x40,0x04,0x40,//工
  54.       0x04,0x40,0x04,0x40,0x04,0x40,0xFC,0x7F,
  55.       0xFC,0x7F,0x04,0x40,0x04,0x40,0x04,0x40,
  56.       0x06,0x40,0x04,0x60,0x00,0x40,0x00,0x00,

  57.         0x00,0x00,0x80,0x00,0x60,0x00,0xF8,0xFF,//作
  58.       0xEF,0x7F,0x06,0x00,0x40,0x00,0x30,0x00,
  59.       0x1C,0x00,0xFF,0xFF,0xFA,0xFF,0x48,0x04,
  60.       0x48,0x04,0x68,0x04,0x4C,0x06,0x08,0x04,

  61.         0x00,0x00,0x08,0x00,0x1C,0x80,0x0E,0x81,//室
  62.       0x94,0x8B,0xD4,0x89,0x75,0x89,0x37,0xFF,
  63.       0x16,0xFF,0x34,0x89,0xD4,0x89,0x94,0x8B,
  64.       0x1C,0x81,0x0E,0xC0,0x04,0x80,0x00,0x00
  65. };
  66. /*********************************************************************************************/
  67. unsigned char code logo1[] =  {            // “DoYoung” (取碼:從上到下從左到右,縱向8位下高位)
  68.         0x04,0x08,0xFC,0x0F,0xFC,0x0F,0x04,0x08,  // -D-
  69.         0x0C,0x0C,0xF8,0x07,0xF0,0x03,0x00,0x00,

  70.         0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x08,  // -o-
  71.         0x20,0x08,0xE0,0x0F,0xC0,0x07,0x00,0x00,

  72.         0x00,0x00,0x3C,0x00,0x7C,0x08,0xC0,0x0F,  // -Y-
  73.         0xC0,0x0F,0x7C,0x08,0x3C,0x00,0x00,0x00,

  74.         0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x08,  // -o-
  75.         0x20,0x08,0xE0,0x0F,0xC0,0x07,0x00,0x00,

  76.         0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x08,  // -u-
  77.         0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x00,

  78.         0x20,0x00,0xE0,0x0F,0xC0,0x0F,0x20,0x00,  // -n-
  79.         0x20,0x00,0xE0,0x0F,0xC0,0x0F,0x00,0x00,

  80.         0xC0,0x27,0xE0,0x6F,0x20,0x48,0x20,0x48,  // -g-
  81.         0xC0,0x7F,0xE0,0x3F,0x20,0x00,0x00,0x00,

  82.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //空格

  83.         0x18,0x06,0x3C,0x0E,0x64,0x08,0x44,0x08,  // -S-
  84.         0xC4,0x08,0x9C,0x0F,0x18,0x07,0x00,0x00,

  85.         0x20,0x00,0x20,0x00,0xF8,0x07,0xFC,0x0F,  // -t-
  86.         0x20,0x08,0x20,0x0C,0x00,0x04,0x00,0x00,

  87.         0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x08,  // -u-
  88.         0xE0,0x07,0xE0,0x0F,0x00,0x08,0x00,0x00,

  89.         0x80,0x07,0xC0,0x0F,0x60,0x08,0x24,0x08,  // -d-
  90.         0xFC,0x07,0xFC,0x0F,0x00,0x08,0x00,0x00,

  91.         0x00,0x00,0x00,0x00,0x20,0x08,0xEC,0x0F,  // -i-
  92.         0xEC,0x0F,0x00,0x08,0x00,0x00,0x00,0x00,

  93.         0xC0,0x07,0xE0,0x0F,0x20,0x08,0x20,0x08,  // -o-
  94.         0x20,0x08,0xE0,0x0F,0xC0,0x07,0x00,0x00,
  95. };
  96. /*********************************************************************************************/
  97. unsigned char code logo2[] =  {            // “與電子愛(ài)好者同行” (取碼:從上到下從左到右,縱向8位下高位)
  98. 0x00,0x00,0x00,0x08,0x00,0x08,0x80,0x08,
  99.       0xFF,0x09,0xFE,0x08,0x88,0x08,0x88,0x08,
  100.       0x88,0x08,0x88,0x08,0x88,0x0C,0x88,0x48,
  101.       0x88,0xC0,0x8C,0x7F,0xC8,0x3F,0x80,0x00,

  102.         0x00,0x00,0x00,0x00,0xF8,0x0F,0xF0,0x07,
  103.       0x90,0x04,0x90,0x04,0x90,0x04,0xFF,0x7F,
  104.       0xFE,0xFF,0x90,0xC4,0x90,0xC4,0x90,0xC4,
  105.       0xF0,0xCF,0xF8,0xC7,0x10,0xF0,0x00,0x40,

  106.         0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
  107.       0x82,0x00,0x82,0x00,0x82,0x40,0x82,0x40,
  108.       0xE2,0xFF,0xF2,0x7F,0x9A,0x00,0x8E,0x00,
  109.       0x87,0x00,0x82,0x00,0xC0,0x00,0x80,0x00,

  110.         0x00,0x00,0x40,0x00,0xE0,0x40,0x74,0x20,
  111.       0xA4,0x98,0xAC,0x8E,0xFA,0x47,0xE2,0x6F,
  112.       0xBE,0x3A,0xAA,0x12,0xB2,0x3A,0xBF,0x6E,
  113.       0xAB,0x67,0xE2,0xC2,0x70,0xC0,0x20,0x40,

  114.         0x00,0x00,0x20,0x80,0x20,0x63,0xF8,0x37,
  115.       0xFF,0x1C,0x26,0x0F,0xF0,0x7B,0xE0,0x30,
  116.       0x82,0x00,0x82,0x20,0x82,0x40,0xF2,0xFF,
  117.       0xEA,0x7F,0x8E,0x00,0xC7,0x00,0x82,0x00,

  118.         0x00,0x00,0x40,0x04,0x40,0x04,0x44,0x02,
  119.       0x44,0xFF,0x44,0x7F,0xC4,0x49,0xFF,0x49,
  120.       0x7F,0x49,0x64,0x49,0x66,0x49,0x54,0xFF,
  121.       0xD8,0x7F,0x4E,0x01,0x64,0x00,0x40,0x00,

  122.         0x00,0x00,0x00,0x00,0xFF,0xFF,0xFE,0x7F,
  123.       0x12,0x00,0xD2,0x1F,0x92,0x0F,0x92,0x08,
  124.       0x92,0x08,0x92,0x1F,0xDA,0x4F,0x92,0x40,
  125.       0xFE,0xFF,0xFF,0x7F,0x02,0x00,0x00,0x00,

  126.         0x00,0x00,0x20,0x04,0x10,0x02,0x8C,0xFF,
  127.       0xE7,0x7F,0x42,0x00,0x00,0x00,0x20,0x00,
  128.       0x22,0x00,0x22,0x40,0x22,0x40,0xE2,0xFF,
  129.       0xE2,0x7F,0x23,0x00,0x32,0x00,0x20,0x00
  130. };
  131. /*********************************************************************************************
  132. 函數(shù)名:LED顯示用延時(shí)函數(shù)
  133. 調(diào)  用:delay(?);
  134. 參  數(shù):1~65535(參數(shù)不可為0)
  135. 返回值:無(wú)
  136. 結(jié)  果:占用CPU方式延時(shí)與參數(shù)數(shù)值相同的毫秒時(shí)間
  137. 備  注:應(yīng)用于1T單片機(jī)時(shí)i<600,應(yīng)用于12T單片機(jī)時(shí)i<125
  138. /*********************************************************************************************/
  139. void delay (unsigned int a){ // 用于點(diǎn)掃描的延時(shí)
  140.         unsigned int i;
  141.         while( --a != 0){
  142.                 for(i = 0; i < 1; i++);
  143.         }                                      
  144. }
  145. /*********************************************************************************************/

  146. /*********************************************************************************************
  147. 函數(shù)名:毫秒級(jí)CPU延時(shí)函數(shù)
  148. 調(diào)  用:DELAY_MS (?);
  149. 參  數(shù):1~65535(參數(shù)不可為0)
  150. 返回值:無(wú)
  151. 結(jié)  果:占用CPU方式延時(shí)與參數(shù)數(shù)值相同的毫秒時(shí)間
  152. 備  注:應(yīng)用于1T單片機(jī)時(shí)i<600,應(yīng)用于12T單片機(jī)時(shí)i<125
  153. /*********************************************************************************************/
  154. void DELAY_MS (unsigned int a){
  155.         unsigned int i;
  156.         while( --a != 0){
  157.                 for(i = 0; i < 600; i++);
  158.         }
  159. }
  160. /*********************************************************************************************/

  161. /*********************************************************************************************
  162. 函數(shù)名:關(guān)閉所有LED燈(操作硬件)
  163. 調(diào)  用:DISPLAY_OFF();
  164. 參  數(shù):無(wú)
  165. 返回值:無(wú)
  166. 結(jié)  果:所有LED燈熄滅
  167. 備  注:
  168. /**********************************************************************************************/
  169. void DISPLAY_OFF (void){
  170.         delay(DY_DELAY);//顯示停留
  171.         P0 = 0xff;
  172.         P2 = 0xff;
  173.         P4 = 0xff;
  174. }
  175. /**********************************************************************************************/

  176. /*********************************************************************************************
  177. 函數(shù)名:?jiǎn)螏瑪?shù)據(jù)送入顯示(操作硬件)
  178. 調(diào)  用:DISPLAY_PIN(?,?);
  179. 參  數(shù):16位顯示數(shù)據(jù)(下高位)(d:上面8位,e:下面8位)
  180. 返回值:無(wú)
  181. 結(jié)  果:點(diǎn)亮對(duì)應(yīng)數(shù)據(jù)的LED燈
  182. 備  注:
  183. /**********************************************************************************************/
  184. void DISPLAY_PIN (unsigned char d,unsigned char e){ //第1列橫向顯示程序
  185.         unsigned char i;
  186.         i = d & 0x01;
  187.         if(i == 0x01){LED1 = 0;}DISPLAY_OFF();
  188.         i = d & 0x02;
  189.         if(i == 0x02){LED2 = 0;}DISPLAY_OFF();
  190.         i = d & 0x04;
  191.         if(i == 0x04){LED3 = 0;}DISPLAY_OFF();
  192.         i = d & 0x08;
  193.         if(i == 0x08){LED4 = 0;}DISPLAY_OFF();
  194.         i = d & 0x10;
  195.         if(i == 0x10){LED5 = 0;}DISPLAY_OFF();
  196.         i = d & 0x20;
  197.         if(i == 0x20){LED6 = 0;}DISPLAY_OFF();
  198.         i = d & 0x40;
  199.         if(i == 0x40){LED7 = 0;}DISPLAY_OFF();
  200.         i = d & 0x80;
  201.         if(i == 0x80){LED8 = 0;}DISPLAY_OFF();

  202.         i = e & 0x01;
  203.         if(i == 0x01){LED9 = 0;}DISPLAY_OFF();
  204.         i = e & 0x02;
  205.         if(i == 0x02){LED10 = 0;}DISPLAY_OFF();
  206.         i = e & 0x04;
  207.         if(i == 0x04){LED11 = 0;}DISPLAY_OFF();
  208.         i = e & 0x08;
  209.         if(i == 0x08){LED12 = 0;}DISPLAY_OFF();
  210.         i = e & 0x10;
  211.         if(i == 0x10){LED13 = 0;}DISPLAY_OFF();
  212.         i = e & 0x20;
  213.         if(i == 0x20){LED14 = 0;}DISPLAY_OFF();
  214.         i = e & 0x40;
  215.         if(i == 0x40){LED15 = 0;}DISPLAY_OFF();
  216.         i = e & 0x80;
  217.         if(i == 0x80){LED16 = 0;}DISPLAY_OFF();
  218. }
  219. /*********************************************************************************************
  220. 函數(shù)名:初始化程序
  221. 調(diào)  用:init();
  222. 參  數(shù):無(wú)
  223. 返回值:無(wú)
  224. 結(jié)  果:設(shè)計(jì)IO接口為強(qiáng)推方式并全部置1
  225. 備  注:
  226. /**********************************************************************************************/
  227. void init (void){
  228.         P4SW = 0xff; //啟動(dòng)P4接口
  229.         P0M0 = 0xff; //接口設(shè)置為強(qiáng)推
  230.         P2M0 = 0xff;
  231.         P4M0 = 0xff;
  232.         P1 = 0xff; //初始IO接口狀態(tài)
  233.         P0 = 0xff;
  234.         P2 = 0xff;
  235.         P4 = 0xff;
  236. }
  237. /**********************************************************************************************/

  238. /*********************************************************************************************
  239. 函數(shù)名:主函數(shù)
  240. 調(diào)  用:無(wú)
  241. 參  數(shù):無(wú)
  242. 返回值:無(wú)
  243. 結(jié)  果:程序開(kāi)始處,無(wú)限循環(huán)
  244. 備  注:
  245. /**********************************************************************************************/
  246. void main (void){
  247.         unsigned char a,c;
  248.         init();//初始程序
  249.         while(1){
  250.                 if(MENU > 2){
  251.                         MENU = 0;
  252.                 }
  253.                 if(MENU == 0){ //字幕1
  254.                          if(KEY2 == 0){
  255.                                 DELAY_MS(20);
  256.                                 while(KEY2 == 0);
  257.                                 c = 0;
  258.                                 for(a=1;a<80;a++){ //這里的“80”是這個(gè)字幕需要掃描的列數(shù),修改字幕時(shí)必須修改此參數(shù)。
  259.                                         DISPLAY_PIN (logo[c],logo[c+1]); //“LOGO”是第一個(gè)字幕的數(shù)據(jù)表名
  260.                                         c=c+2;//產(chǎn)生顯示行移位
  261.                                 }
  262.                         }
  263.                         if(KEY1 == 0){
  264.                                 DELAY_MS(20);
  265.                                 while(KEY1 == 0);
  266.                                 c = 158;
  267.                                 for(a=1;a<80;a++){
  268.                                         DISPLAY_PIN (logo[c],logo[c+1]);
  269.                                         c=c-2;//產(chǎn)生顯示行移位
  270.                                 }
  271.                         }
  272.                         if(KEY3 == 0){
  273.                                 DELAY_MS(20);
  274.                                 while(KEY3 == 0);
  275.                                 MENU++;
  276.                         }
  277.                 }
  278.                 if(MENU == 1){ //字幕2
  279.                          if(KEY2 == 0){
  280.                                 DELAY_MS(20);
  281.                                 while(KEY2 == 0);
  282.                                 c = 0;
  283.                                 for(a=1;a<108;a++){
  284.                                         DISPLAY_PIN (logo1[c],logo1[c+1]);
  285.                                         c=c+2;//產(chǎn)生顯示行移位
  286.                                 }
  287.                         }
  288.                         if(KEY1 == 0){
  289.                                 DELAY_MS(20);
  290.                                 while(KEY1 == 0);
  291.                                 c = 214;
  292.                                 for(a=1;a<108;a++){
  293.                                         DISPLAY_PIN (logo1[c],logo1[c+1]);
  294.                                         c=c-2;//產(chǎn)生顯示行移位
  295.                                 }
  296.                         }
  297.                         if(KEY3 == 0){
  298.                                 DELAY_MS(20);
  299.                                 while(KEY3 == 0);
  300.                                 MENU++;
  301.                         }
  302.                 }
  303.                 if(MENU == 2){ //字幕3
  304.                          if(KEY2 == 0){
  305.                                 DELAY_MS(20);
  306.                                 while(KEY2 == 0);
  307.                                 c = 0;
  308.                                 for(a=1;a<128;a++){
  309.                                         DISPLAY_PIN (logo2[c],logo2[c+1]);
  310.                                         c=c+2;//產(chǎn)生顯示行移位
  311.                                 }
  312.                         }
  313.                         if(KEY1 == 0){
  314.                                 DELAY_MS(20);
  315.                                 while(KEY1 == 0);
  316.                                 c = 254;
  317.                                 for(a=1;a<128;a++){
  318.                                         DISPLAY_PIN (logo2[c],logo2[c+1]);
  319.                                         c=c-2;//產(chǎn)生顯示行移位
  320.                                 }
  321.                         }
  322.                         if(KEY3 == 0){
  323.                                 DELAY_MS(20);
  324.                                 while(KEY3 == 0);
  325.                                 MENU++;
  326.                         }
  327.                 }
  328.         }
  329. }
  330. /**********************************************************************************************

  331. /**********************************************************************************************/

  332. /*************************************************************
  333. * 杜洋工作室 DoYoung Studio
  334. * 與電子愛(ài)好者同行 www.DoYoung.net
  335. /*************************************************************/
復(fù)制代碼



原理圖:


單片機(jī)源代碼和hex文件下載:
SHOOK16_SC_V1.zip (24.28 KB, 下載次數(shù): 14)
SHOOK16_V1_HEX.rar (1.34 KB, 下載次數(shù): 6)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2016-8-24 16:53 | 只看該作者
51黑有你更精彩。!
回復(fù)

使用道具 舉報(bào)

板凳
ID:136460 發(fā)表于 2016-8-24 20:10 來(lái)自觸屏版 | 只看該作者
有你更精彩
回復(fù)

使用道具 舉報(bào)

地板
ID:166768 發(fā)表于 2017-9-12 13:22 | 只看該作者
這不是杜洋的資料嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表