一、GPIO
1.1 内部上拉电路
51单片机的I/O口都可以同时作为输入和输出之用。除了P0口以外,其他的I/O口都有内部上拉电阻。
3个内部上拉电阻都有不同的功用,要理解这个电路需要一定的模拟电路的知识。
内部上拉电阻示意图
由于相关的硬件配置,在编程时有以下需要注意的地方:
- 当I/O口被用作输入用途时,读取输入前要保证锁存器状态为1。
- 当将I/O口由低拉高时,指令执行后需要1~2个机器周期才能使实际的输出变成高电平。
在外围电路上需要注意的地方:
- P0口做普通I/O使用时,要加上拉电路,因为其没有内部上拉。
- 为防止电流过大,必要时外加限流电阻。
1.2 编程示例
51单片机的I/O口在使用时,并不需要对其进行初始化。
可以直接位寻址读/写单个GPIO状态,也可以直接访问sfr来读/写一组GPIO的状态。
/* byte */
unsigned char temp;
P0 = 0xff;
temp = P0;
/* bit */
P0_1 = 1;
}
假设需要读取一个I/O口的输入状态,而该I/O口目前被锁存为0,则需要先将锁存器置1,再延时2个时钟周期。
#define INPUT P2_6
#define NOP __asm nop __endasm
INPUT = 1;
NOP;
if (INPUT ==