51單片機led燈控制


關於內容理解:

先讀懂51單片機的實驗原理圖,然后再着手編程。

由圖可知

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

2,led燈是共陽極,當給低電平時led燈才會亮,(單片機灌電流能力較強,輸出電流較弱,所以一般用共陽極)

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

實驗效果

實現跑馬燈效果,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--);
        }
           
    }       
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM