51单片机LED驱动

时间:2024-10-17 09:18:00

  本章节介绍51单片机硬件IO口输出模式应用示例。通过对IO输出模式应用,实现对硬件LED灯驱动。
  LED 即发光二极管。它具有单向导电性,通过 5mA 左右电流即可发光,电流越大,其亮度越强,但若电流过大,会烧毁二极管,一般我们控制在 3 mA-20mA之间,通常我们会在 LED 管脚上串联一个电阻,目的就是为了限制通过发光二极管的电流不要太大,因此这些电阻又可以称为“限流电阻”。当发光二极管发光时,测量它两端电压约为 1.7V,这个电压又叫做发光二极管的“导通压降”。下图左右分别为直插式发光二极管和贴片式发光二极管实物图。发光二极管正极又称阳极,负极又称阴极,电流只能从阳极流向阴极。直插式发光二极管长脚为阳极,短脚为阴极。仔细观察贴片式发光二极管正面的一端有彩色标记,通常有标记的一端为阴极。
在这里插入图片描述

  • 硬件接口
    在这里插入图片描述
      本次开发板上有8个LED灯,位D1D8,IO驱动端口为P2^0P2^8,硬件原理图如上所示。根据原理图可知,对P2端口写入低电平即可实现LED点亮,写入高电平则熄灭。

  • 软件设计

  • 创建main.h文件

  为了便于后续LED应用,可以创建一个”main.h”头文件,在”main.h”中添加下面代码:

#ifndef _MAIN_H
#define _MAIN_H
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned short u16;
#define LED P2//LED硬件接口
#endif
  • 创建delay.c和delay.h文件

  为了便于后续延时函数应用,创建”delay.c”和”delay.h”文件,编写延时函数,代码实现如下:

#include "delay.h"
void Delay1us()		//@11.0592MHz
{
	_nop_();
	_nop_();
	_nop_();
}
void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}
void Delay_Us(u16 time)
{
  while(time--)
  {
    Delay1us();
  }
}
void Delay_Ms(u16 time)
{
  while(time--)
  {
    Delay1ms();
  }  
}

  注意:其中”Delay1us()”和”Delay1ms()”函数是通过STC工具生成。

  • 实现流水灯效果
#include "main.h"
#include "delay.h"
int main()
{
  u8 i=0;
  LED=~0x1;
  while(1)
  {
    for(i=0;i<7;i++)
    {
      //LED=~(1<<i);
      LED=_crol_(LED,1);//左移一位
      Delay_Ms(20);
    }
    for(i=0;i<7;i++)
    {
      
      //LED=~(0x80>>i);
      LED=_cror_(LED,1);//右移一位
      Delay_Ms(20);
    }
  }
}

  KEIL C51软件内有对应的移位库函数,左移函数是_crol_(),右移函数是_cror_(),要使用这两个函数在我们的程序中,必须包含intrins.h头文件。

  • 程序下载在这里插入图片描述
      注意:波特率不要调太高,否则会下载失败。