1.梦的开始——点灯大师

1.什么是GPIO

        不论学习什么单片机,最简单的外设莫过于IO口的高低电平控制,本章就是通过控制51单片机的GPIO使开发板上的LED灯点亮。

        GPIO(general purpose input output )是通用输入输出端口的简称,可以通过软件来控制其输入和输出。51单片机芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。不过GPIO最简单的应用还属点亮LED灯了 ,只需通过软件控制GPIO输出高电平即可。当然,GPIO还可以作为输入控制,比如在引脚上接入一个按键,通过电平的高低判断按键是否按下。

        这个开发板上使用的51单片机型号是STC89C52,此芯片共有40个引脚,芯片引脚图如下图所示:

1.梦的开始——点灯大师_第1张图片

那么是不是所有的引脚都是GPIO呢?NO NO NO!51单片机的引脚可以分为这么几大类:

  1. 电源引脚:VCC(正极)GND(负极)。
  2. 晶振引脚:引脚图中的XTAL1、XTAL2都属于晶振引脚。
  3. 复位引脚:RST/VPD属于复位引脚。
  4. 下载引脚:51单片机的串口功能引脚(TXD、RXD)可以作为下载引脚使用。
  5. GPIO引脚:引脚图中带有Px.x等字样的均属于GPIO引脚

        对于这么多GPIO引脚,我们怎么知道具体某个引脚有什么功能呢?这个时候就要看看我们的芯片手册啦!

1.梦的开始——点灯大师_第2张图片

        芯片手册里有引脚的名称编号和说明,开发板芯片原理图内已经将所有功能都标进去了,所以后面也不需要查找具体引脚有什么功能,直接看原理图即可。

2.认识LED

在点灯之前,我们先来了解一下点的是什么灯。

1.梦的开始——点灯大师_第3张图片

 这便是我们接下来要点亮的LED模块,图中有8个LED灯,我们本章就是要通过代码来实现控制某个LED的亮暗状态。

        LED即发光二极管。它具有单向导电性,通过5mA左右电流即可发光,电流越大,亮度越强,但若电流过大,会烧毁二极管,一般我们控制在3mA-20mA之间,通常我们会在LED管脚上串联一个电阻,目的就是为了限制通过发光二极管的电流不要太大,因此这些电阻又可以称为“限流电阻”。

        发光二极管正极又称为阳极,负极又称为阴极,电流只能从阳极流向阴极。

        直插式发光二极管长脚为 阳极,短脚为阴极。仔细观察贴片式发光二极管正面的一端有彩色标记,通常有标记的一端为阴极。
        接下来是单片机内部LED模拟电路的原理图:
1.梦的开始——点灯大师_第4张图片
        如果要想 51 单片机控制 LED,就必须通过单片机管脚在 P2 口上输出低电平。
本章所要实现的功能是:点亮 D1 指示灯。

3.点亮第一个LED

方式一:直接操作端口位

#include
void main()
{
    P2_1=0;//连接引脚为P21上的LED点亮
    while(1)
    {

    }
}

方式二:使用位操作指令

#include 

// 定义P2.0为LED引脚
sbit LED = P2^0;

void main()
{
    // 将LED引脚置为低电平,点亮LED
    LED = 0;
    while(1);
}

方式三:操作整个端口

#include 

void main()
{
    // 将P2端口的第0位置为低电平,点亮连接到P2.0的LED
    P2 = 0xFE; 
    while(1);
}

4.LED闪烁实验

        51 单片机的 LED 闪烁本质上是通过软件程序控制单片机 I/O 端口电平的高低变化,并在电平切换之间插入适当的延时(延时函数我们可以通过在烧录软件上自动生成),使 LED 按照一定的频率亮灭,从而产生闪烁的视觉效果。

#include 
#include 
void Delay500ms()	//@12.000MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		P2=0xFE;
		 Delay500ms();
		P2=0xFF;
		Delay500ms();
	}	
}

5.LED流水灯实验

        LED 流水灯是由多个发光二极管(LED)按照一定的顺序排列,依次点亮和熄灭,形成灯光像流水一样流动效果的一种灯光展示形式。它能营造出动态、绚丽的视觉感受。

#include 
#include 

// 延时函数,实现约 500 毫秒的延时,@12.000MHz
void Delay500ms()
{
    unsigned char i, j, k;

    _nop_();
    i = 4;
    j = 205;
    k = 187;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void main()
{
    unsigned char led = 0xFE; // 初始状态,仅 P2.0 引脚对应的 LED 点亮
    while(1)
    {
        P2 = led; // 将 led 的值输出到 P2 端口
        Delay500ms(); // 延时 500 毫秒
        led = _crol_(led, 1); // 循环左移一位,实现流水灯效果
    }
}

        通过本章的学习,你已经成功踏入了 51 单片机开发的大门。从认识基础的 GPIO 引脚、了解 LED 的特性,到一步步实现点亮单个 LED 灯、让 LED 闪烁以及打造绚丽的流水灯效果,恭喜你已经完成了单片机开发中至关重要的起步阶段。

        建议你在掌握现有知识的基础上,尝试对代码进行优化和创新。例如,调整 LED 闪烁的频率、改变流水灯的流动方向,甚至结合多个实验,创造出属于自己的独特效果。同时,要养成良好的编程习惯,对代码进行注释和整理,这将有助于你更好地理解和复用代码。

你可能感兴趣的:(单片机,嵌入式硬件,51单片机)