久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10484|回復: 0
收起左側

五種方法實現流水燈

[復制鏈接]
ID:51090 發表于 2014-9-24 22:03 | 顯示全部樓層 |閱讀模式
嗨,大家好,我是寶哥,很高興您能關注我的文章,作為一名職業的IT男,把自己的所學記錄下來并與大家分享是我由來已久的一個想法,于是開通了這個博客,希望對還在迷茫和困惑中的朋友有所幫助。
今天懷著無比激動的心情,我完成了單片機C語言板塊第一篇博客的撰寫,寫的不好希望大家見諒,歡迎大家拍磚,給我提寶貴意見,我一定盡力改進,寫的不對的地方也請大家指出,以免誤人子弟,總之本人能力有限,希望大家不吝賜教!
本系列博客的撰寫我打算采用這樣的一個思路:以例子為路線,講解單片機C程序設計的方法,側重知識的活學活用,適合于有一定單片機和C語言基礎的朋友。
好了,廢話少說,開始我今天的主題,今天的主題是五種方法實現流水燈,講這個的目的不是為了讓你會五種方法而可以在小伙伴中炫耀,而是想告訴大家一個理念,學習要善于思考,活學活用,解決問題的辦法不只有一個。
好了,先上一個電路圖:


P0口為例,我連接了8個共陽的led燈,電路很簡單,當IO口給低電平時,led點亮。那么實現流水燈的原理是:先點亮第一個led,保持一會,然后熄滅,點亮下一個led,保持,再熄滅,直到第8led點亮,之后熄滅,循環執行這個過程。
其實這個功能的實現很簡單,就是循環執行點亮、熄滅的過程。根據上面的電路圖,我想到了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,原理其二是01按位或相當于01。掌握了這兩個原理,那好的,方法二的程序順理成章的可以改成下面的這個程序,代碼如下:
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
最后提一句,學習很重要的一點是舉一反三,舉個例子,現在你可以實現一個往返的流水燈了嗎?如果可以,很好,恭喜你已經理解了!那么我們繼續加油!好了今天就到這里吧,再次歡迎大家拍磚,多提寶貴意見,感謝您的支持。
歡迎轉載,轉載請保留以下信息:
文章出自:寶哥的博客
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天堂一区 | 亚洲欧美视频一区 | 国产精品国产三级国产aⅴ无密码 | 在线观看免费av片 | 久久久一区二区三区 | 久热伊人 | 韩日精品在线观看 | 在线免费观看日本视频 | 一级毛片黄片 | 亚洲一区二区久久 | 午夜精品在线观看 | 天堂资源视频 | 欧美日韩国产精品激情在线播放 | 国产成人免费在线观看 | 九九热在线免费视频 | 免费精品久久久久久中文字幕 | 男人天堂午夜 | 中文字幕av亚洲精品一部二部 | 91黄在线观看 | 国产精品无码专区在线观看 | 亚洲成a| 一区二区三区四区在线播放 | 亚洲欧美日韩电影 | 久久久久se| 久久亚洲综合 | 一区二区三区精品 | 在线观看亚洲 | 操网站| 亚洲综合大片69999 | 欧美日韩在线一区二区三区 | 男人av网 | 免费一看一级毛片 | 中文字幕亚洲一区二区三区 | 国产精品视频网 | 成人免费在线视频 | 羞羞视频免费在线 | 成人午夜在线 | 亚洲小视频在线播放 | 成人三级av | 免费黄色a视频 | 欧美一区二区三区国产精品 |