一. /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);
}
来源:CSDN
作者:howx
链接:https://blog.csdn.net/howx123/article/details/104637098