51單片機led燈控制

關於內容理解:編程

先讀懂51單片機的實驗原理圖,而後再着手編程。函數

由圖可知spa

1,led燈接的是單片機的P0口,意味着咱們只能用P0口來編程。code

2,led燈是共陽極,當給低電平時led燈纔會亮,(單片機灌電流能力較強,輸出電流較弱,因此通常用共陽極)blog

3,led所在的P0口是讀io口,故使用時用一個變量來作中介io

實驗效果class

實現跑馬燈效果,P0^0->P0^7口依次亮且每次只亮一個燈,而後P0^7->P0^0。變量

實驗代碼原理

#include <reg52.h>      //此文件中定義了51的一些特殊功能寄存器
#include <intrins.h>

//--聲明全局函數--//
void Delay10ms(unsigned int c);   //延時10ms        

void main()
{
        unsigned char i;
               unsigned char LED;
      //--首先賦值LED--//
        LED = 0xFE;

    while (1) 
    {              
        //--LED往左閃爍--//   
        for (i = 0 ;i < 7 ; i++)
        { 
            //--將LED 的值賦給P2口--//
            P0  = LED;
    
            Delay10ms(50);         //延時一下,爲了讓燈有持續點亮的時間
    
            LED = LED << 1;         // 將LED裏面的值左移一位,而後從新賦給LED
    
            LED = LED | 0x01;     // 移位後,前面的位爲高電平
        }
    
        //--LED向右顯示--//
        for (i = 0 ;i < 7 ; i++)
        {        
            P0  = LED;

            Delay10ms(50);

            LED = LED >> 1;     // 右移

            LED = LED | 0x80;     // 移位後,後面的位爲高電平        
        }
        
    }
}

void Delay10ms(unsigned int c)   //偏差 0us
{
    unsigned char a, b;

    //--c已經在傳遞過來的時候已經賦值了,因此在for語句第一句就不用賦值了--//
    for (;c>0;c--)
    {
        for (b=38;b>0;b--)
        {
            for (a=130;a>0;a--);
        }
           
    }       
}

擴展:實現流水燈擴展

一次點亮P0^0->P0^7

#include <reg52.h>      //此文件中定義了51的一些特殊功能寄存器
#include <intrins.h>

//--聲明全局函數--//
void Delay10ms(unsigned int c);   //延時10ms        

void main()
{
        unsigned char i;
               unsigned char LED;
      //--首先賦值LED--//
        

    while (1) 
    {     
         LED = 0xFE;     
        //--LED往左閃爍--//   
        for (i = 0 ;i < 8 ; i++)
        { 
            //--將LED 的值賦給P2口--//
            P0  = LED;
    
            Delay10ms(50);         //延時一下,爲了讓燈有持續點亮的時間
    
            LED = LED << 1;         // 將LED裏面的值左移一位,而後從新賦給LED
    
        //    LED = LED | 0x01;     // 移位後,前面的位爲高電平
        }
        
        //--LED向右顯示--//
        LED = 0x7F;     

        for (i = 0 ;i < 8 ; i++)
        {        
            P0  = LED;

            Delay10ms(50);

            LED = LED >> 1;     // 右移

        //    LED = LED | 0x80;     // 移位後,後面的位爲高電平        
        }
        
    }
}

void Delay10ms(unsigned int c)   //偏差 0us
{
    unsigned char a, b;

    //--c已經在傳遞過來的時候已經賦值了,因此在for語句第一句就不用賦值了--//
    for (;c>0;c--)
    {
        for (b=38;b>0;b--)
        {
            for (a=130;a>0;a--);
        }
           
    }       
}
相關文章
相關標籤/搜索