首先,介紹下原理。下圖為主控芯片和流水燈模塊的原理圖。流水燈模塊接在單片機的P1口,由原理圖可以知道,在P1口給一個低電平即可點亮LED燈。相反,如果要LED燈熄滅,就要把P1口的電平變為高電平即可。要實現流水燈功能,我們只要將LED1~LED8依次點亮、熄滅,依始類推,8只LED變會一亮一暗的做流水燈了。
實現8個LED流水燈程序用中文表示為:P1.0低、延時、P1.0高、P1.1低、延時、P1.1高、P1.2低、延時、P1.2高、P1.3低、延時、P1.3高、P1.4低、延時、P1.4高、P1.5低、延時、P1.5高、P1.6低、延時、P1.6高、P1.7低、延時、P1.7高、返回到開始、程序結束。
聽起來是不是很簡單?。∧敲聪旅嫖覀儊砜聪聦崿F流水燈功能的三種常用方法!
第一種,總線方法實現流水燈。
這是一種比較笨但又最易理解的方法,采用順序程序結構,用位指令控制P1口的每一個位輸出高低電平,加上延時函數,即可控制每個LED燈的亮滅。C程序如下:
-
#include
-
#defineucharunsignedchar
-
#defineuintunsignedint
-
codeunsignedchartmpled[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定義八只LED燈,依次點亮八只LED燈
-
//N毫秒的延時函數
delay_ms(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=114;j>0;j--); return 0; }void main(void){unchar i;while (1){for(i=0;i<8;i++) //循環點亮8只LED燈{P1=tmpled[i];delay_ms(500); //延時500毫秒}}}
第二種,移位方法實現流水燈
上一種方法是逐個將P1口的LED燈點亮來實現閑的,因此程序看起來有一點復雜。下面將一種用移位的方法。采用循環程序結構編程。首先在程序開始給P1.0口送一個低電平,其它位為高。然后延時一段時間再讓低電平往高位移動,這樣就實現“流水”的效果了。下面來看具體程序:
-
#include
-
#defineucharunsignedchar
-
#defineuintunsignedint
-
//N毫秒的延時函數
delay_ms(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=114;j>0;j--); return 0; }
void main(){uchar a,i;while(1){a=0xfe; //點亮第一位LED燈for(i=0;i<8;i++){P1=a;a=a<<1; //左移一位a=a|0x01; //左移一位后與0x01相或,保證左移后最低位為1 delay_ms(500); }}}
第三種,庫函數實現流水燈
C52 提供了 _crol_(字符循環左移);_cror_ (字符循環右移)等庫函數,包含在頭文件intrins.h中。接下來還是先講一下移位的小知識點吧。
左移。C52中操作符為“<<”,每執行一次左移指令,被操作的數將最高位移入單片機PSW寄存器的CY位。CY位中原來的數丟棄,最低位補0,其他位依次向左移動一位。相信大家學過C語言都清楚吧,這里就不多說了。而函數_crol_的作用是循環左移。它會將最高位移入最低位,其他位依次向左移一位。用法:x=0xfe;x=_crol_(x,1);//循環左移移位。接下來看具體程序:
-
#include
-
#include
-
#defineucharunsignedchar
-
#defineuintunsignedint
-
//N毫秒的延時函數
delay_ms(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=114;j>0;j--); return 0; }
void main(){uint a;a=0xfe;while(1){P1=a;a=_crol_(a,1); delay_ms(500);}}
知識點:PSW寄存器。
PSW(Program StatusWord)全稱為程序狀態字標志寄存器,是一個8位寄存器,位于單片機片內的特殊功能寄存器區,字節地址D0H,用來存放運算結果的一些特征,如有無進位、借位等。使用匯編編程時PSW寄存器很有用,但在利用C語言編程時,編譯器會自動控制該寄存器,很少人為操作它,大家只需做簡單了解即可。其每位的具體含義
如圖1 所示:
圖 1 PWD(Program Status Word)寄存器
①CY:進位標志位,它表示運算是否有進位(或借位)。如果操作結果在最高位有進位(加法)或者借位(減法),則該位為1,否則為0。
②AC:輔助進位標志,又稱半進位標志,它指兩個8位數運算低四位是否有半進位,即低四位相加(或相減)是否進位(或借位),如有,則AC為1,否則為0。
③F0:由用戶使用的一個狀態標志位,可用軟件來使它置1或清0;也可由軟件來測試它,以控制程序的流向。
④RS1、RS0:4組工作寄存器區選擇控制位。在匯編語言中這兩位用來選擇4組工作寄存器區中的哪一組為當前工作寄存區。
⑤OV:溢出標志位,反映帶符號數的運算結果是否有溢出。有溢出時,此位為1,否則為0。
⑥P:奇偶標志位,反映累加器ACC內容的奇偶性,如果ACC中的運算結果有偶數個l(如11001100B,其中有4個1),則P為0,否則P為1。
-
流水燈
+關注
關注
21文章
432瀏覽量
59692
原文標題:51單片機流水燈的三種實現方法
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論