51单片机点亮LED的五种方法(从简单到困难)

本文将介绍用各种不同的方法和算法点亮51单片机LED的程序,包括详细的注释和说明。

方法1:使用GPIO口点亮LED

#include<reg52.h> //头文件
sbit LED=P1^0; //定义LED
void main()
{
    LED=0; //LED亮,输出低电平
}

以上代码使用了P1口的第0位控制LED的亮灭。当LED=0时,输出低电平,LED亮;当LED=1时,输出高电平,LED灭。

方法2:使用定时器控制LED闪烁

#include<reg52.h> //头文件
sbit LED=P1^0; //定义LED
void delay(unsigned int i) //延时函数
{
    while(i--);
}
void main()
{
    while(1)
    {
        LED=0; //LED亮
        delay(500); //延时500ms
        LED=1; //LED灭
        delay(500); //延时500ms
    }
}

以上代码使用了延时函数和定时器来控制LED的闪烁。在这段代码中,我们定义了一个延时函数,来实现LED闪烁的时间间隔。当LED=0时,LED亮,执行延时函数;当LED=1时,LED灭,执行延时函数。

方法3:使用中断控制LED闪烁

#include<reg52.h> //头文件
sbit LED=P1^0; //定义LED
void delay(unsigned int i) //延时函数
{
    while(i--);
}
void main()
{
    TMOD=0x01; //定时器1工作在模式1
    TH0=(65536-50000)/256; //装入初值,使定时器从50ms开始计时
    TL0=(65536-50000)%256;
    ET0=1; //开启定时器1的中断
    EA=1; //开总中断
    TR0=1; //启动定时器1
    while(1)
    {
        //主程序不执行任何操作
    }
}
void Timer0() interrupt 1 //定时器1中断函数
{
    static unsigned char i=0;
    TH0=(65536-50000)/256; //重新装载初值,使定时器1从50ms开始计时
    TL0=(65536-50000)%256;
    i++;
    if(i==20) //当定时器1中断20次,即1秒时
    {
        i=0;
        LED=!LED; //LED状态取反
    }
}

以上代码使用了定时器中断来控制LED的闪烁。在这段代码中,我们定义了一个定时器中断函数,来实现LED闪烁的时间间隔。当定时器1中断20次,即1秒时,LED状态取反。

方法4:使用PWM控制LED亮度

#include<reg52.h> //头文件
sbit LED=P1^0; //定义LED
void main()
{
    TMOD=0x01; //定时器1工作在模式1
    TH0=0xFC; //装入初值,使定时器1的工作频率为10kHz
    TL0=0x67;
    EA=1; //开总中断
    ET0=1; //开定时器1中断
    TR0=1; //启动定时器1
    while(1)
    {
        for(unsigned char i=0;i<=99;i++) //PWM调节亮度的循环
        {
            if(i==LED) continue; //如果亮度相等,则跳过
            LED=i; //改变LED的亮度
            delay(10); //延时10ms
        }
    }
}
void Timer0() interrupt 1 //定时器1中断函数
{
    static unsigned char cnt=0;
    cnt++;
    if(cnt==100) cnt=0; //当计数到100时,重新计数
    if(cnt<LED) LED=0; //当计数小于LED的亮度时,LED亮
    else LED=1; //当计数大于LED的亮度时,LED灭
}

以上代码使用了PWM来控制LED的亮度。在这段代码中,我们定义了一个定时器中断函数和一个PWM调节亮度的循环。当计数小于LED的亮度时,LED亮;当计数大于LED的亮度时,LED灭。

方法5:使用移位寄存器控制多个LED的亮灭

#include<reg52.h> //头文件
void main()
{
    unsigned char LED[]={0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00}; //定义8个LED的状态
    unsigned char i,j;
    while(1)
    {
        for(i=0;i<8;i++) //移位循环
        {
            for(j=0;j<8;j++) //输出循环
            {
                P1=LED[j]; //输出LED的状态
                delay(10); //延时10ms
            }
            LED[i]=LED[i]<<1; //移位
            if(LED[i]==0) LED[i]=0x80; //当最高位为0时,将最低位设为1
        }
    }
}

以上代码使用了移位寄存器来控制多个LED的亮灭。在这段代码中,我们定义了一个LED数组和一个移位循环和一个输出循环。当最高位为0时,将最低位设为1,以实现LED的循环显示。

结论

本文介绍了用各种不同的方法和算法点亮51单片机LED的程序,包括使用GPIO口点亮LED、使用定时器控制LED闪烁、使用中断控制LED闪烁、使用PWM控制LED亮度和使用移位寄存器控制多个LED的亮灭。以上代码都有详细的注释和说明,希望对读者有所帮助。

  • 方法1:使用GPIO口点亮LED – 简单
  • 方法2:使用定时器控制LED闪烁 – 中等
  • 方法3:使用中断控制LED闪烁 – 高级
  • 方法4:使用PWM控制LED亮度 – 高级
  • 方法5:使用移位寄存器控制多个LED的亮灭 – 高级
  • 在实际编程中,这些程序都可以用于控制LED灯的亮灭和闪烁,适用于各种不同的场景。例如,方法1可以用于简单的LED控制,方法2可以用于制作闪烁的警示灯,方法3可以用于制作节奏感强的LED灯效,方法4可以用于制作可调节亮度的LED灯,方法5可以用于制作多个LED灯的循环显示效果。这些程序的难度和应用场景有所不同,可以根据具体需求选择合适的方法和算法。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 51单片机点亮LED的五种方法(从简单到困难)

    发表评论