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--);
        }
           
    }       
}

猜你喜欢

转载自www.cnblogs.com/lg-blog/p/8973303.html