官术网_书友最值得收藏!

  • 創客智能電子制作
  • 《無線電》編輯部
  • 1921字
  • 2021-01-06 18:06:17

3.2 程序設計思路

大家最關心的想必是怎樣在這個迷你光立方上實現自己喜歡的3D動畫。其實光立方的圖形實現跟數碼管的掃描是一樣的,都是把要顯示圖形的數據送到對應的I/O口上面,然后再用單片機快速切換掃描每一層的數據,由于每一層切換的時間非常快,整體看來就是一個圖形了,好多電子愛好者的光立方都是這么實現的。考慮到要實時響應按鍵開關的切換以及動畫的顯示速度,動畫顯示函數我是在定時器中斷里實現的,而不是用之前的,比如“delay()”這種軟件延時方式去掃描,這樣做就可以最大化響應用戶的按鍵操作了。為了更好地去編輯自己的動畫顯示,我寫了一個可以顯示任何動畫的函數,內容如下:

在使用函數之前,先來看看LED方陣的連接。為了方便操作,我把每個LED的控制引腳都標出來了,箭頭的方向就是我們正面觀看的方向(見圖3.2)。

圖3.2 LED方陣的連接

LED的方陣是由P2組跟P3組控制的,這兩組的I/O口設置為推挽輸出,這樣把要顯示的對應點設置為高電平“1”,就可以點亮了。那么如何使用這個函數呢?每一幀的動畫是由4層方陣組成,比如我們要設計動畫的第一幀是全亮,我們先定義兩個數組,這兩個數組分別由P2組和P3組輸入:

兩個數組里面各有4個元素,每組第一個元素代表第一層的顯示,第二個元素代表第二層的顯示,以此類推,到了第四個元素就完成這一幀的顯示了。函數的n代表每個數組的元素個數。

使用的時候這樣操作:figureshow(All_P2,All_P3,4);就可以全亮了!這只是簡單的使用,因為動畫是要“動”起來的,也就是每一幀的數據都不同才可以,我們要設計一個動畫,就要考慮好這個動畫的幀數,然后把每一幀的數據編寫出來,放在這個函數里面就可以顯示動畫了!當要修改動畫的快慢(也就是幀數的轉換速度)時,把ledspeed修改為不同的值即可。注意,這個函數要放在定時器中斷里面,要設置時間就要修改中斷的累積時間計數值。程序中我設置了短按控制來轉變動畫時間的快慢,關于按鍵的長按、短按已經在之前的文章中有了比較詳細的說明,在這里我就不多介紹了。還有一點要補充說明的是,為什么在數組前面加code呢?因為我們要顯示的動畫有很多種,為了節省RAM的資源,所以把數組的數據放在ROM上面。

我不是“標題黨”,為了使光立方有種“夢幻”的效果,我加入了各種形式的呼吸燈模式,也就是逐漸變亮、變暗的效果,專業名詞就是脈沖寬度調制(也就是PWM)。因為直接用軟件循環的語句很難控制PWM的周期,在這里,我們用定時器0產生特定周期的PWM,從而控制亮度。我們先定義一個10ns的定時器中斷,注意中斷一定要快,由于人的視覺暫留現象,LED就會出現不同的亮度。然后在中斷里面進行以下操作:

用通俗的語言來講,就是在快速掃描的時間段內,亮的次數比滅的次數要多,這樣就可以產生不同的亮度了。修改if(Pcount<levelcount)語句里面P2組與P3組所控制的LED數,就可以設置不同形式的呼吸燈了!但是上面的中斷函數只能產生一種亮度,修改levelcount的值就可以修改不同亮度,levelcount的數值范圍是0~255,也就是有256級的亮度。而一種亮度顯然不能達到我們所需要的“呼吸”效果,因此我們要在其他地方讓levelcont自動增加數值到最高值,之后又逐漸減少數值到最小值,來回循環,這樣就有呼吸的效果了!

首先定義一個開始轉變亮度的標志位levelflag,初始化的值為1,levelcount每次到達最高點以及最低點都翻轉levelflag的數值。把上面的程序放在你需要設置的轉變亮度時間內,就能實現“夢幻呼吸燈”的效果了!

再來說一下聲控效果的實現。其實簡單來說,就是用駐極體話筒采集、放大聲音,然后轉變為電壓值,再用STC15F204EA內置的10位AD功能讀取電壓值。駐極體話筒的放大電路可參考我畫的電路圖,單片機內部的10位AD讀取函數可以參考單片機的數據手冊。不過,檢測到聲音也不能讓光立方一直亮著呀,最好是檢測到聲音的不同大小、長短會有不同層次的亮起,讓光立方“顯示”出聲音的級別,這樣就會更加有動感了。只需要進行下面的簡單操作即可實現不同級別聲音顯示不同的效果了:

將上面那段程序放到定時器中斷里掃描,由于要檢查到AD值大于1才能進入掃描,當聲音很小或者很短的時候,就只能掃描到一兩層的LED方陣,同理,聲音持續的時候,就能不斷進行LED方陣的掃描。由于掃描速度很快,聲音大的時候,顯示層數就多,聲音小的時候,顯示層數就少,用這種簡單的操作就可以“看”出來聲音的大小了。要是你在一旁“high歌”,光立方就隨樂而動,很有動感!

好了,上述算是這個制作的精髓了,其實大家了解深透的話,就可以舉一反三,用到更多的工程上面了。趁著將要過年,如果能親手打造一個屬于自己的光立方放在客廳里,客人來拜訪,看到隨聲而動的光立方,一定會增加不少樂趣!

最后來看看幾種夜晚的顯示效果吧(見圖3.3~圖3.5)!

圖3.3 “閃電”式流動

圖3.4 呼吸燈狀態,可以看到所有的LED的“呼吸”過程

圖3.5 “龍卷風”轉動模式,很有立體感

實際視頻操作效果見:http://hi.baidu.com/haorongwu。

主站蜘蛛池模板: 如皋市| 遵义市| 阳江市| 定南县| 车险| 嘉善县| 金川县| 岚皋县| 民和| 五大连池市| 罗甸县| 泉州市| 镇安县| 澎湖县| 台东市| 新丰县| 会东县| 宣威市| 乡宁县| 江源县| 北辰区| 友谊县| 定州市| 南开区| 邵阳县| 景谷| 清新县| 保亭| 南乐县| 邮箱| 松滋市| 右玉县| 兴业县| 绿春县| 德清县| 广东省| 乌什县| 如皋市| 上蔡县| 晋宁县| 清镇市|