51单片机led灯模块

1.1 51单片机led灯的点亮

根据进制转换表,将二进制转换成16进制

其中程序中的P2口,0x是表示后面是16进制的

1.2 led闪烁

1.3  led流水灯

#include <REGX52.H>


void Delay1ms(unsigned int xms)    //@12.000MHz
{
    unsigned char data i, j;
    while(xms)
    {
        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
        xms=xms-1;
    }
    
}

void main()
{
    while(1)
    {
                        
                        P2=0xFE;
                        Delay1ms(100);
                        P2=0xFD;
                        Delay1ms(100);
                        P2=0xFB;
                        Delay1ms(100);
                        P2=0xF7;
                        Delay1ms(100);
                        P2=0xEF;
                        Delay1ms(100);
                        P2=0xDF;
                        Delay1ms(100);
                        P2=0xBF;
                        Delay1ms(100);
                        P2=0x7F;
                        Delay1ms(100);
            
    }
}

1.4led灯的原理

LED由P型半导体和N型半导体组成,这两者之间形成一个PN结,当电流通过PN结时,P型半导体中的空穴和N型半导体中的电子在PN结附近相遇并复合,这个过程中释放能量,激发半导体材料中的原子发出光子,从而产生光线。光的颜色(可见光的不同部分)由LED使用的半导体材料决定,不同的材料产生不同颜色的光。例如,红、绿、蓝三种基色的LED灯可以组合产生多种颜色,甚至全彩显示。

通过两个半导体材料的相连,之后接上电源,从而使得N中的电子流向P中的空穴(P是阳极、N是阴极)。

特点就是具有单项导电性,电流从正极流向负极,电子方向与电流方向相反。

如图,电流方向由左向右。

2.1 独立按键控制led灯亮灭

程序如下

#include <REGX52.H>

void main()
{
    
    
    while(1)//如果放进循环外面,则需要按住复位键,之后再同时按住独立按键,之后松开复位

                //键,这样的程序只能运行一次。
    {
        if(P3_1==0&&P3_3==0)//&&表示逻辑与,||表示逻辑或;独立按键具体编码看原理图
        {
                
                P2_0=0;//这里是只控制一个led,其他的不涉及;这里要是写P2=0xfe是八个灯都在使用
        }
        else
        {
                    P2_0=1;
        }
    
    }
}

这个是头文件里面显示的led灯的

这个是头文件里面,独立按键的名称

2.2 创造一个延时的子函数

如图

生成一个1ms的延时函数,之后复制到代码里去

将延时函数放在while的循环里面,Delay后面的括号改写为unsinged int xms ,从而给定一个延时时间的参数

从而unsinged int可以最大延时65535

之后将while后的括号填入xms,只要是xms不是0都会为真,则while都会一直循环。

由于生成的是1ms的延时,所以后面对xms进行减一(xms--),从而达到参数值是多少,延时就是多少。

2.3 消除按键抖动的情况下,独立按键对led灯的控制

独立按键的抖动

因此为了消除抖动,要么是增加外设,要么是在软件上进行解决,在软件上进行解决可以通过延时的方法

程序如下

#include <REGX52.H>

void Delay(unsigned int xms)    //@12.000MHz
{
    while(xms)
    {
            unsigned char data i, j;

        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
        xms--;
    }
    
}

void main()
{
    
        while(1)
        {
            if(P3_1==0)
            {
                Delay(500);//对闭合阶段进行延时
                
                while(P3_1==0)//达到稳定阶段使之循环
                {
                    
                }
                Delay(500);//松开阶段进行延时
                P2_0=~P2_0;//进行取反
                
                
          }
             
        }
            
            
    
}

2.4 运算符号以及基础语句

2.5独立按键控制led以二进制方式亮灯

#include <REGX52.H>
void Delay(unsigned int xms);


void main()
{
         int LED;
        while(1)
        {
            Delay(20);
            if(P3_0==0)
            {
                while(P3_0==0);
                Delay(20);
                P2=~(LED++);
                
            }
        }
}


void Delay(unsigned int xms)    
{
    while(xms--)
    {
            unsigned char data i, j;

        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
        
    }
    
}

子函数如果放在下面,需要将函数的名称放在上面,后面写上“;”。如果变量没有规定值,则会输出高电平1,使用int或者char都可以。当LED=1的时候,则LED++就是八个位置全部是00000000则此时灯会全亮,之后依次按按键,只有灭的灯会按二进制规律(该亮的不亮,不该亮的亮了),如果对LED++进行取反,就会得到想要的结果,因此使p2=~(LED++)。

2.6 一个独立按键控制依次进行点亮

程序如下

#include <REGX52.H>

void Delay(unsigned int xms)    //@12.000MHz
{
    while(xms)
    {
            unsigned char data i, j;

        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
        xms--;
    }
    
}
void main()
{
    unsigned char sum=0;
    while(1)
    {
        
        if(P3_1==0)
        {
            Delay(20);
            while(P3_1==0);
            Delay(20);
            
            if(sum>7)
            {
                sum=0;
            }
            
                
            
        
        
            P2=~(0x01<<sum);
            sum++;
        }
        
    }
}

sum的值在0~7之间,如果出了范围会与结果不同,因此需要加一个选择语句。

2.7 两个独立按键对led灯的来回控制

两个独立按键分别为,第一个P3_1,第二个P3_2,分别对两个独立按键进行按键震动消除后,把它们放进一个循环里,只有根据低电平亮灯的特点进行编写程序,这个程序的本质就是设置好“sum”值(就是向左移位的移位数目)。程序如下

#include <REGX52.H>

void Delay(unsigned int xms)    //@12.000MHz
{
    while(xms)
    {
            unsigned char data i, j;

        i = 2;
        j = 239;
        do
        {
            while (--j);
        } while (--i);
        xms--;
    }
    
}
void main()
{
    unsigned char sum=0;
    P2=~0x01<<sum;
    while(1)
    {
        
        if(P3_1==0)
        {
            Delay(20);
            while(P3_1==0);
            Delay(20);
            
            
            if(sum>=7)
            {
                sum=0;
            }
            else
            {
                sum++;
            }
                
            P2=~(0x01<<sum);
        
            
            
        }
        if(P3_0==0)
        {
            Delay(20);
            while(P3_0==0);
            Delay(20);
            
            
            if(sum==0)
            {
                sum=7;
            }
                
            else
            {
                sum--;
            }
        
            P2=~(0x01<<sum);
        }
        
            
    }
}

  • 47
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值