成人app

首頁  /  單片機教程  /  流水燈  /  

流水燈

點擊打開在線編譯器,邊學邊練

本講講解用P0的8個IO端口控制8盞LED實現流水燈。

成人app本教程所用開發板的硬件連接簡化如下

3.png


1.數字模擬點燈

成人app我們用八位的二進制數表示八盞燈,對應的位為0燈就亮,為1燈就滅。

流水燈的實現如下所示

11111110   //對應十六進制=0xFE,P0.0輸出0,其余輸出1

成人app11111101   //對應十六進制=0xFD,P0.1輸出0,其余輸出1

成人app11111011   //對應十六進制=0xFB,P0.2輸出0,其余輸出1

成人app11110111   //對應十六進制=0xF7,P0.3輸出0,其余輸出1

成人app11101111   //對應十六進制=0xEF,P0.4輸出0,其余輸出1

11011111   //對應十六進制=0xDF,P0.5輸出0,其余輸出1

成人app10111111   //對應十六進制=0xBF,P0.6輸出0,其余輸出1

成人app01111111   //對應十六進制=0xF7,P0.7輸出0,其余輸出1

11111110

11111101

......


2.流水燈代碼

這里一次性控制8個IO端口就不需要sbit去定義單個IO端口了(請前去復習本章第二講),有了之前章節的基礎,代碼的實現就不難了

#include <reg52.h> 
//sbit LED2  = P0^0;  本節代碼中用不到這條語句了
sbit ADDR2 = P1^2;
sbit ADDR1 = P1^1;
sbit ADDR0 = P1^0;
sbit ENLED = P1^4;
sbit ADDR3 = P1^3;

void delay_ms(unsigned int x)
{
    unsigned int i,j;
    if(x==1000)
    {
        for(i=0;i<19601;i++)//延時1s
        {
            for(j=5;j>0;j--);
        }
    }
    else while(x--)for(j=115;j>0;j--);
}

void main()
{  
    ADDR3 = 1;//使能三八譯碼器
    ENLED = 0;// 
  
    ADDR2 = 1;//**************************
    ADDR1 = 1;//讓三八譯碼器的IO6輸出低電平
    ADDR0 = 0;//**************************
  
    while(1)
    {
        P0 = 0xFE; 
        delay_ms(100);// 大概延時一段時間 
        P0 = 0xFD; 
        delay_ms(100);
        P0 = 0xFB; 
        delay_ms(100);   
        P0 = 0xF7; 
        delay_ms(100);
        P0 = 0xEF; 
        delay_ms(100);   
        P0 = 0xDF; 
        delay_ms(100);
        P0 = 0xBF; 
        delay_ms(100);   
        P0 = 0x7F; 
        delay_ms(100);
    }
}

 

3.代碼優化

為了讓大家第一次了解switch語句在單片機程序中的運用(《手把手教你學51單片機》文檔6.3節有介紹語句用法),我們用switch語句讓代碼顯得整齊一些,且不需要重復書寫“delay_ms(100);”,實現了書寫上的優化,避免占據過多版面,修改主函數如下

void main()
{  
    unsigned char i=1;//定義新的變量用來輪流調用不同的case語句
    ADDR3 = 1;//使能三八譯碼器
    ENLED = 0;// 
  
    ADDR2 = 1;//**************************
    ADDR1 = 1;//讓三八譯碼器的IO6輸出低電平
    ADDR0 = 0;//**************************
  
    while(1)
    {
        switch(i)
        {   
            case 1: P0 = 0xFE; break;
            case 2: P0 = 0xFD; break;
            case 3: P0 = 0xFB; break;   
            case 4: P0 = 0xF7; break;
            case 5: P0 = 0xEF; break;   
            case 6: P0 = 0xDF; break;
            case 7: P0 = 0xBF; break;  
            case 8: P0 = 0x7F; i=0; break;//i歸0使語句又從case 1執行
        } 
        i++;//i從1變到8使switch語句輪流調用“P0 = xxxx;”
        delay_ms(100);
    }
}


4.提醒

成人app這里提及一下,在“delay_ms();”函數里有變量名i,主函數中也有同樣的變量名i,但這兩個相同名字的變量都是局部變量(文檔7.1節有簡單講解),兩個相同名字的變量各自占有獨立的內存,不受各自的值變化而影響到另一個值,C語言基礎知識普及。

在主函數中我們定義i為unsigned char類型是為了節約RAM內存,畢竟主函數里的i我們只需要它在1~8之間變化,不用超過255(文檔4.2節有普及數據類型)。還有大家別忘了case語句結尾記得加“break;”防止程序一次性從“case 1”執行到“case 8”都沒有去實現延時那部分,大家可嘗試把8個“break;”都去掉,然后編譯下載進開發板看會有什么現象?


本文固定URL:http://hnsaiyang.com/course/185

上一課:函數傳參調用 下一課:數組與移位
第一章 單片機入門
第二章 LED
第三章 蜂鳴器
第四章 數碼管
第五章 獨立按鍵
第六章 多文件編程
第七章 外部中斷
第八章 定時器
第九章 舵機與超聲波模塊
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 紅外遙控與溫度傳感器
第十四章 AD與DA
第十五章 混合例程
第十六章 完結
Dotcpp在線編譯      (登錄可減少運行等待時間)