89c51單片機流水燈操作

要用51單片機實現流水燈操作我想是每個初學者學習單片機,瞭解嵌入式的第一個動手的小實驗吧,今天在重新學習的時候遇到了一點小問題,在這裏和大家分享一下。

要想控制流水燈操作其實是用單片機給每個二極管高低電平來控制燈的亮與不亮。

我用的51單片機學習板的二極管的硬件原理圖如下圖所示


板子上電之後,J2是跳線帽,一般是連接上的,再過來是LED1~LED8共8個發光二極管,然後經過電阻連接到51單片機的8個P1端口上。


電阻的作用是爲了限流,是爲了達到二極管規定的電壓與電流,避免燒壞二極管。

51單片機上電引腳默認是高電平,所以我們通過給P1各個引腳低電平(即邏輯0),電路即導通則指定的二極管變亮(因爲二極管的單向導電性,陽極電壓高於陰極電壓則二極管導通,則燈亮)。

剛開始我寫的程序如下


因爲編譯器會一直執行主函數裏的程序,所以單片機的第一個燈則一直亮


sbit 是位操作,P1^0即對P1的第0位進行操作,所以要想控制哪個燈亮則對哪個位進行置0操作即可。

接下來我又進行了一個操作,我想使8個燈依次點亮,我用了左移運算符 <<,因爲單片機的初始引腳都是高電平,所以P1端口8個位的初始值是0xff(即8個位是 1111 1111)依次點亮即每次左移一位即可。所以我進行了如下操作。


我的理解是8個燈依次亮直到全亮,結果實驗現象爲只有第一個燈亮,當時我就很鬱悶,與我設想的實驗現象不一致,然後我又回頭從新按照網上的一些資料從新編程,結果如下


這次的實驗現象爲依次點亮直到全亮(由於懶得放視頻,就口頭描述現象)

這時我就比較納悶了因爲新的程序只比我的多了一個while(1)死循環,但是我當時的理解是程序是一直會執行主函數裏的程序,所以我就又做了一個實驗來驗證我的想法結果如下


假如燈只亮滅一次,那麼主函數只執行一次,結果一直在那亮滅,就說明我理解的沒有錯誤,主函數一直在重複執行

這時我就納悶了,我預想的第一個實驗加while 與不加while的實驗現象應該都是一樣的啊,執行一次主函數P1左移一位,燈依次點亮直到全亮,也是一個無限循環與wile(1)的操作應該是一樣的啊,這時我就去請教了一下我的大哥,哈哈哈,終於在一頓激烈的討論下,得出了一個結論,我的理解如下,加了while(1)的主函數在進行第一次的時候,在執行第一次的主函數時進行了無限循環,即一直是在執行第一次的主函數,P1的值一直是一個局部變量,一直在接着上次的值在改變,而沒有加while(1)的則進行了無限次循環,每次循環則重新調用庫函數裏的P1值每次都是0xFF,左移一位每次都是0xFE,那麼每次循環則是第一個燈亮這樣就能解釋爲什麼兩個實驗現象不一致(比較繞,要對c語言變量的作用域與生存空間有一定理解,c語言有一定基礎)

所以我就行進行了如下實驗來驗證這個猜想


如果猜想正確,那麼實驗現象就應該是第一個燈亮然後8個全亮,接着又是第一個燈亮,懷着激動地心情我燒錄了程序之後,果然和我想的一樣!!!

最後實現簡單流水燈的終極操作如下


所以我們在以後的編程裏要注意這個坑!!!

變量的作用域和作用的作用範圍,要不然會出現很多難以理解的現象。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章