GPIO简介与LED灯

与世无争的帅哥 提交于 2020-03-03 22:28:37

一. /IO口的简介

1.单片机IO口

STC89C52单片机有40个引脚。如下图所示
在这里插入图片描述
(1)电源引脚:引脚图中的 VCC、 GND 都属于电源引脚。
(2)晶振引脚:引脚图中的 XTAL1、XTAL2 都属于晶振引脚。
(3)复位引脚:引脚图中的 RST/VPD 属于复位引脚,不做其他功能使用
(4)下载引脚:串口功能引脚(TXD、RXD)可以作为下载引脚使用
(5)GPIO引脚:有4组:P0、P1、P2、P3,每组8个(Px0~7),共有32个。其中每个P3引脚有附加功能,通过对相应寄存器的设置,可以启动附加功能。

2.GPIO简介

GPIO是通用输入输出端口的简称,可以直接通过软件来控制其输入输出。GPIO与外部各种电气设备连接,从而实现与外部通讯、控制、数据采集的功能。

比如,用软件控制GPIO口的高低电平,就可以直接控制LED灯的亮灭。

3.GPIO结构

在这里插入图片描述
除了P0口外,其它的I/O口内部都有上拉电阻。

注意:P0 口做普通 I/O 使用时,要加上拉电路,因为其没有内部上拉。

二.点亮LED灯

原理

在这里插入图片描述
用软件可以操控P2口。LED灯有单向导电性,其公共端接高电平(称为共阳极)。当P2口为低电平,LED灯就会亮起来
实质上,也就是用软件控制P2中的一位或者几位。

1.点亮单个LED灯

有两种方法:
1.只操控P2中的某一位
sbit led = P2^0;
led = 0;
2.操控P2全体
如:P2=0xaa;

#include <reg52.h>

sbit led1 = P2^0;   //定义P2口的第0位为led1

void main()
{
  led1=0;
}

2.有延时反复闪烁效果

#include <reg52.h>

sbit led = P2^0;     //同样,先定义P0中的一位

void main()
{
  void delay(int xms);
   while(1)
 {
	led = 0;
    delay(500);
    led= 1;
    delay(500);
 }
}

void delay(int xms)
{
	int i,j;      //通过执行反复的循环操作来延时
	for(i=xms;i>0;i--)
		for(j=110;j>0;j--);
}

3.流水灯

让LED灯往一个方向反复“流动”
事实上,也就是每次只让1位为低电平,延时一段时间后,把低电平传递给下一位(位操作)
这里,要用到<intrins.h>里的_crol_(c,d)和_crol_(c,d)函数(左移位、右移位函数)。每次循环后,P2上各位的点平如下变化:
11111110→11111101→11111011→…01111111→11111110→…

#include <stdio.h>
#include <reg52.h>
#include <intrins.h>

typedef unsigned int u16;

#define led P2		//定义整个P2为led。接下来是操作整个P2

void delay(u16 i)
{
	while(i--);
} 

void main()
{
	

	led = ~0x01;		//在P2中,除了最后一位为低电平其余都为高电平(取反)
	delay(50000);
	while(1)
	{
		led = _crol_(led,1);	//每一次循环,就让led各位左移
		delay(50000);
	}
}

如果要让流水灯“流来流去”,只需在main函数的循环部分替换成如下:

for(i=0;i<7;i++)
	{
		led = _crol_(led,1);
		delay(50000);
	}
		for(i=0;i<7;i++)
	{
		led = _cror_(led,1);
		delay(50000);
	}	 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!