51单片机控制LED闪烁

时间:2024-02-17 15:41:41

51单片机最小系统

  • 供电部分:5V供电
  • 时钟部分:
    • 晶振的选择 一般使用12MHz或者11.0592MHz的晶振,51单片机12个时钟周期执行一个机器周期,使用12MHz的晶振,那么1个机器周期是1uS;使用11.0592MHz的晶振是为了减小串口通信的误码率。
    • 起振电容的选择,参考数据手册选择。

LED闪烁

LED灯驱动电路分析

LED限流电阻的计算方法

Proteus中默认的LED的压降是2.2V,电流一般5 - 20mA就可以了,电源VCC=5V。要使LED的驱动电流为10ma,那么电阻R=(5V - 2.2V) / 10mA = 280欧,可以取比较接近的330欧电阻。由于51单片机的P0口,拉电流(高电平驱动)最大电流只有1mA,灌电流(低电平驱动)最大有10mA,整个P0口不能超过24mA,直接使用灌电流可以不需要三级管就行了。

LED属性

实现LED闪烁程序

//LED限流电阻的计算方法
//Proteus中默认的LED的压降是2.2V,电流一般5-20mA就可以了,电源VCC=5V
//要使LED的驱动电流为10ma,那么电阻R=(5V - 2.2V) / 10mA = 280欧,可以取比较接近的330欧电阻。
//由于51单片机的P0口,拉电流(高电平驱动)最大电流只有1mA,灌电流(低电平驱动)最大有10mA,
//整个P0口不能超过24mA,直接使用灌电流可以不需要三级管就行了。

#include <REG51.H>

//定义数据类型,u8表示无符号8bit整数(数值范围是0-255)
//u16表示16bit整数(数值范围是0-65535)
typedef unsigned char u8;
typedef unsigned int u16;

//定义P00引脚为LED所在引脚
sbit LED = P0^0;


//延时1毫秒,1秒=1000毫秒
void delay_ms(u16 ms)
{
    while (ms--)
    {
        volatile u8 x = 120;
        while (x--);
    }
}

//程序入口函数
void main()
{
    while (1)
    {
        //LED灯亮500毫秒
        LED = 0;   
        delay_ms(500);
        
        //LED灯灭500毫秒
        LED = 1;
        delay_ms(500);
    }
}