0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于單片機的流水燈電路設(shè)計

CHANBAEK ? 來源:郎哥編程課堂 ? 作者:郎宏林 ? 2023-10-31 14:56 ? 次閱讀

前面一課掌握了嵌入式程序源代碼級調(diào)試,為復(fù)雜單片機實驗程序的調(diào)試做好了準備工作。本次實驗完成流水燈電路模型設(shè)計和編程,在實驗過程中,學習流水燈電路設(shè)計、編寫延遲函數(shù)、循環(huán)移位宏定義。

流水燈電路設(shè)計

本次實驗設(shè)計要求通過單片機P0口實現(xiàn)流水燈控制電路,P0口8個端口外接8個LED,每個LED串聯(lián)一個200歐姆的限流電阻,8個限流電阻的公共端接5V直流電源。電路設(shè)計如下圖所示:

圖片

8個LED正極端通過串聯(lián)電阻接5V直流電源,負極端接P0端口,只要給P0端口一個低電平,就可以點亮LED,若需要熄滅LED,需要給P0端口一個高電平,要實現(xiàn)LED流水燈功能,只要將8個LED依次點亮、熄滅即可。

編寫時間延遲函數(shù)

流水燈電路要求LED依次點亮,每個LED要持續(xù)亮一段時間后熄滅。用程序來控制LED的點亮和熄滅,只需要將與LED連接的端口寫入低電平或高電平即可,代碼如下:

#include
void main()
{
       P0 = 0xFF;
    P0 = 0xFD;
}

上述代碼第1條語句將P0第0位寫入低電平,與第0位連接的lED被點亮,第2條語句將第0位寫入高電平,與第0位連接的lED熄滅。兩條語句連續(xù)執(zhí)行,每條語句的執(zhí)行時間非常短,也就十幾微秒,LED點亮后很快被熄滅,人們通過眼睛感覺不到LED被點亮。因此需要在第1條語句和第2條語句之間進行時間延遲,延遲一段時間后再執(zhí)行第2條語句。

如何用軟件來模擬延時時間呢?在設(shè)計的電路模型中,51單片機時鐘頻率是12MHZ,一個時鐘周期約0.08微秒,一個機器周期由12個時鐘周期構(gòu)成,一個機器周期約1微秒,51單片機執(zhí)行一個指令的時間是機器周期的倍數(shù),若使用for循環(huán)語句來實現(xiàn)時間延遲,一條基本的for循環(huán)語句執(zhí)行時間大約為8微秒,若延遲500毫秒,大約需要執(zhí)行500*120次循環(huán)。

// 時間延遲函數(shù)
void delay(unsigned int millisecond)
{
       unsigned int i,j;
       for(i=millisecond;i >0;i--)
              for(j=120;j >0;j--);
}

delay()函數(shù)延遲millisecond毫秒,函數(shù)使用for嵌套循環(huán),外層for循環(huán)用于控制延遲的毫秒數(shù),內(nèi)層for循環(huán)用于控制1毫秒執(zhí)行的語句次數(shù)。

循環(huán)移位

流水燈需要在每個時間間隔內(nèi)只有一個LED點亮,其余LED均為熄滅狀態(tài),流水燈可以通過循環(huán)左移實現(xiàn)。循環(huán)左移是將操作數(shù)的二進制位按1位進行循環(huán)左移,移出的位并不會丟失,而是被后續(xù)移動的位填充。

圖片

P0默認值為0xFE,P0第0位的LED被點亮,其它位熄滅;延遲一段時間后,P0循環(huán)左移1位,其值為0xFD,P0第1位LED被點亮,其它位熄滅;延遲一段時間后,P0循環(huán)左移1位,其值為0xFB,P0第2位LED被點亮,其它位熄滅;以此類推,P0不斷循環(huán)左移1位,從而實現(xiàn)了流水燈控制。

C語言并沒有提供循環(huán)左移或循環(huán)右移的運算功能,需要開發(fā)者自己編程實現(xiàn)。

圖片

循環(huán)左移位的具體算法如上圖所示:value為操作數(shù),其值為0xFE,先將value左移1位,賦值給變量a,其值為0xFC,然后將value右移7位,賦值給變量b,其值為0X1,最后計算a|b,計算結(jié)果為value循環(huán)左移1位,并將計算結(jié)果賦值為value。

流水燈算法實現(xiàn)代碼如下:

void main()
{
    unsigned char value=0xfe,a,b;
       unsigned char count = 0;
       while(1)
       {
             
              P0 = value;
              delay(5000);
              a = value < < 1;
              b = value > > 7;
              value = a | b;
              count += 1;
              if( count >= 8 )
              {
                     value = 0xfe;
                     count = 0;
              }
       }
      
}

算法通過while循環(huán)實現(xiàn)流水燈控制,在循環(huán)內(nèi)部,變量value賦值給P0,點亮第0位的LED,其它位的LED為熄滅狀態(tài),然后調(diào)用delay()函數(shù)延遲5000毫秒,value循環(huán)左移1位,在下輪循環(huán)中,點亮第1位的LED,其它位的LED為熄滅狀態(tài),以此類推……。

count為計數(shù)變量,當流水燈循環(huán)點亮一次后,將value重新賦值為0xFE,并將conunt清零。

考慮到循環(huán)移位是經(jīng)常使用的操作,可以將循環(huán)左移位操作定義為宏,在代碼中直接調(diào)用宏就可以了。

循環(huán)左移位的宏定義:

#define ROTATE_LEFT(x) ((x) << 1) | ((x) >> 7 )

完整C程序代碼如下:

#include
#define ROTATE_LEFT(x) ((x) < < 1) | ((x) > > 7 )
void delay(unsigned int millisecond)
{
       unsigned int i,j;
       for(i=millisecond;i >0;i--)
              for(j=120;j >0;j--);
}
void main()
{
    unsigned char value=0xfe,count=0;
       while(1)
       {
              P0 = value;
              delay(5000);
              value = ROTATE_LEFT(value);
              count += 1;
              if( count >= 8 )
              {
                     value = 0xfe;
                     count = 0;
              }
       }
      
}

實驗小結(jié)

通過這次實驗,掌握了流水燈的電路模型設(shè)計和編程,流水燈電路模型比較簡單,單片機通過I/O口的8個端口來控制8個LED的點亮和熄滅。流水燈的控制通過編程實現(xiàn),編程主要涉及到時間延遲函數(shù)和循環(huán)左移位宏定義,時間延遲函數(shù)用于控制間LED點亮和熄滅的隔時間,循環(huán)左移位用于控制I/O口循環(huán)輸出高電平和低電平。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • led
    led
    +關(guān)注

    關(guān)注

    240

    文章

    23062

    瀏覽量

    657046
  • 單片機
    +關(guān)注

    關(guān)注

    6030

    文章

    44489

    瀏覽量

    631968
  • 嵌入式
    +關(guān)注

    關(guān)注

    5059

    文章

    18973

    瀏覽量

    302016
  • 電路設(shè)計
    +關(guān)注

    關(guān)注

    6659

    文章

    2420

    瀏覽量

    202813
  • 流水燈
    +關(guān)注

    關(guān)注

    21

    文章

    432

    瀏覽量

    59598
收藏 人收藏

    評論

    相關(guān)推薦

    STM32單片機流水燈#電路設(shè)計 #電子元器件 #電子工程師 #物聯(lián)網(wǎng)

    單片機ST流水燈
    jf_21394466
    發(fā)布于 :2022年08月24日 13:37:36

    基于51單片機的心形流水燈原理圖

    51單片機控制的心形流水燈原理圖,通心形流水燈的制作熟悉單片機的接口
    發(fā)表于 11-23 11:03 ?70次下載

    51單片機流水燈程序

    51單片機流水燈程序 51單片機流水燈程序 51單片機流水燈
    發(fā)表于 12-21 15:52 ?170次下載

    單片機流水燈設(shè)計報告

    單片機流水燈設(shè)計報告,感興趣的可以看看。
    發(fā)表于 06-08 17:29 ?6次下載

    單片機經(jīng)典流水燈程序

    單片機經(jīng)典流水燈
    發(fā)表于 03-21 20:01 ?31次下載

    基于單片機流水燈介紹_51單片機流水燈的五種實現(xiàn)方法

    本文為大家?guī)砦宸N51單片機流水燈的實現(xiàn)方法。
    發(fā)表于 01-06 10:23 ?5.1w次閱讀
    基于<b class='flag-5'>單片機</b>的<b class='flag-5'>流水燈</b>介紹_51<b class='flag-5'>單片機</b><b class='flag-5'>流水燈</b>的五種實現(xiàn)方法

    單片機控制花樣流水燈原理圖及程序

    本文詳細介紹了AT89C51單片機流水燈的編寫方法以及介紹了單片機32位LED花樣流水燈程序及原理圖。
    發(fā)表于 04-26 16:15 ?5.5w次閱讀
    <b class='flag-5'>單片機</b>控制花樣<b class='flag-5'>流水燈</b>原理圖及程序

    基于單片機的簡易流水燈實驗設(shè)計方案

    基于單片機的簡易流水燈實驗設(shè)計方案
    發(fā)表于 03-19 10:10 ?0次下載
    基于<b class='flag-5'>單片機</b>的簡易<b class='flag-5'>流水燈</b>實驗設(shè)計方案

    基于51單片機流水燈參考案例下載

    基于51單片機流水燈參考案例下載
    發(fā)表于 09-05 17:02 ?42次下載

    淺析PIC單片機流水燈運用程序

    淺析PIC單片機流水燈運用程序
    發(fā)表于 10-18 09:53 ?1次下載

    C51單片機流水燈C代碼

    C51單片機流水燈C代碼
    發(fā)表于 11-05 15:20 ?34次下載
    C51<b class='flag-5'>單片機</b><b class='flag-5'>流水燈</b>C代碼

    51單片機流水燈教程。

    51單片機流水燈教程。
    發(fā)表于 11-11 20:21 ?22次下載
    51<b class='flag-5'>單片機</b><b class='flag-5'>流水燈</b>教程。

    51單片機流水燈實驗

    基于51單片機流水燈實驗 我們知道通過編寫程序?qū)?1單片機進行控制,完成流水燈實驗的方式有許多種。今天我們試通過51單片機的外部中斷系統(tǒng)來
    發(fā)表于 11-20 17:51 ?65次下載
    51<b class='flag-5'>單片機</b><b class='flag-5'>流水燈</b>實驗

    單片機51的流水燈

    實驗一 單片機流水燈【實驗?zāi)康摹?、熟練掌握AT89C51開發(fā)板的使用方法和注意事項。2、了解簡單單片機應(yīng)用系統(tǒng)的設(shè)計方法。3、掌握應(yīng)用KEIL軟件編輯、編譯源程序的操作方法。4、掌握
    發(fā)表于 11-23 16:20 ?24次下載
    <b class='flag-5'>單片機</b>51的<b class='flag-5'>流水燈</b>

    51單片機流水燈制作

    ?流水燈是學習51單片機的一個基本項目,是我們對單片機IO口輸出認識的基本項目。當然學會了花樣流水燈也很好玩。 下面就分享一種51單片機
    的頭像 發(fā)表于 02-26 10:06 ?1450次閱讀
    51<b class='flag-5'>單片機</b><b class='flag-5'>流水燈</b>制作