嗨,大家好,我是寶哥,很高興您能關注我的文章,作為一名職業的IT男,把自己的所學記錄下來并與大家分享是我由來已久的一個想法,于是開通了這個博客,希望對還在迷茫和困惑中的朋友有所幫助。
今天懷著無比激動的心情,我完成了單片機C語言板塊第一篇博客的撰寫,寫的不好希望大家見諒,歡迎大家拍磚,給我提寶貴意見,我一定盡力改進,寫的不對的地方也請大家指出,以免誤人子弟,總之本人能力有限,希望大家不吝賜教! 本系列博客的撰寫我打算采用這樣的一個思路:以例子為路線,講解單片機C程序設計的方法,側重知識的活學活用,適合于有一定單片機和C語言基礎的朋友。 好了,廢話少說,開始我今天的主題,今天的主題是五種方法實現流水燈,講這個的目的不是為了讓你會五種方法而可以在小伙伴中炫耀,而是想告訴大家一個理念,學習要善于思考,活學活用,解決問題的辦法不只有一個。 好了,先上一個電路圖: 以P0口為例,我連接了8個共陽的led燈,電路很簡單,當IO口給低電平時,led點亮。那么實現流水燈的原理是:先點亮第一個led,保持一會,然后熄滅,點亮下一個led,保持,再熄滅,直到第8個led點亮,之后熄滅,循環執行這個過程。 其實這個功能的實現很簡單,就是循環執行點亮、熄滅的過程。根據上面的電路圖,我想到了5個我認為還比較簡單的方法(也許是我太自戀了,哈哈),那些位操作和單獨的總線操作的方法這里就不提了,實在是很笨的方法。 第一種方法:運用總線操作的方法,但使用了循環操作的方式,大大減少了代碼的編寫。首先定義一個數組將8個總線數據存到數組中,用循環的方法給IO口賦值,之后延時保持led點亮,然后重新給IO口賦值,實現了led的流水顯示,具體請看代碼,不再解釋: u_char table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void main(void) { u_char i; while(1) { for(i=0;i<8;i++) { P0=table[ i]; delay(); } } } 第二種方法:運用了“移位”和“按位或”兩個操作,還不清楚這兩個操作的朋友該回去惡補C語言了。這是實現流水燈最常用的方法之一了,原理是先給IO口賦值(代碼中的temp),點亮第一個led,然后將數值左移一位,此時數值低兩位變成0,需要將最低位置1,所以又將數值與0x01按位或,循環8次執行這個過程,實現了led的流水顯示,具體實現請看代碼: void main(void) { u_char i; while(1) { u_char temp=0xfe; for(i=0;i<8;i++) { P0=temp; delay(); temp=temp<<1; temp |= 0x01; } } } 第三種方法:相對于第二種方法在代碼上能簡單一點,但是原理同出一轍,原理其一是二進制數左移一位相當于數值乘以2,右移一位相當于數值除以2,原理其二是0與1按位或相當于0加1。掌握了這兩個原理,那好的,方法二的程序順理成章的可以改成下面的這個程序,代碼如下: void main(void) { u_char i; while(1) { u_char temp=0xfe; for(i=0;i<8;i++) { P0=temp; delay(); temp=temp*2+1; } } } 第四種方法:也是運用了移位的方法,但反其道而行之,使得代碼得到了一定簡化。這種方法數值temp給的是0x01,對它進行移位操作,如果直接將其賦值給IO口,那么實現的效果是流水熄滅,這個效果很好,想想如果我對temp這個值取了一下反,再賦值給IO口,實現的是什么效果呢?請看代碼: void main(void) { u_char i; while(1) { u_char temp=0x01; for(i=0;i<8;i++) { P0=~temp; delay(); temp=temp<<1; } } } 第五種方法:我認為很簡單,調用系統庫函數的循環移位函數實現,需要注意的是在預編譯時需要包含頭文件。循環移位的好處是可以保持各位數值間的關系不變,因此整個過程只需要一個操作即可。這種方法雖然簡單,但是使用面不是很廣,因為我們常常記不住系統都有哪些庫函數可以用,所以對這種方法做以了解即可,程序代碼如下: #include<reg52.h> #include"intrins.h" #define u_char unsigned char #define u_int unsigned int void delay(void); void main(void) { u_char temp=0xfe; while(1) { P0=temp; delay(); temp=_crol_(temp,1); } } 講到這里,五種方法實現流水燈已經給大家介紹完了,相信大家已經可以輕松自如的運用上面的某一種方法實現流水燈了。其實單片機學起來,就是這么簡單,只要你喜歡,肯努力,一切so easy! 最后提一句,學習很重要的一點是舉一反三,舉個例子,現在你可以實現一個往返的流水燈了嗎?如果可以,很好,恭喜你已經理解了!那么我們繼續加油!好了今天就到這里吧,再次歡迎大家拍磚,多提寶貴意見,感謝您的支持。 歡迎轉載,轉載請保留以下信息: 文章出自:寶哥的博客 |