51单片机P0/P1/P2/P3口的区别:
P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据;
P1口只能作为I/O口(P1.0、P1.1以外);
P2口除了作为普通I/O口之外,在扩展外围设备时,要用作高8位地址线;
P3口除了作为普通I/O口之外,其每个引脚都有第二功能。
I/O端口具有以下特性:
① 端口自动识别:无论是P0 P2口的总线复用还是P3口的功能复用,内部资源会自动选择,不需要通过指令的状态选择。
② 准双向口功能:准双向口作为输入口时,应先使锁存器置"1",然后再读引脚。
③ P0作为普通I/O口使用:不使用并行扩展总线时,必须外加上拉电阻。
④ I/O口驱动特性:P0口作为I/O口时可输出驱动8个LSTTL输入端,P1-P3口则可以输出驱动4个LSTTL输入端
————————————————————————————————————————————
I/O接口直接输入输出实例
//《51单片机原理及应用(第二版)——基于Keil C与Proteus》第四章例4.3
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
程序分析:
电路中的P2口既用作输入也用作输出,P2.0-P2.3作为输入,P2.4-P2.7作为输出;
首先将 P2 = 0xff; P2口全部赋高电平 1111 1111,因为I/O作为输入时应先设置各个锁存器为"1",才能确保输入结果正确;
当P2.0-P2.3读入开关状态 if ((P2 & 0x0f) != 0x0f)时,通过对其移位 P2 = P2<< 4;,将P2.0-P2.3的值对应移到了P2.4-P2.7中
代码分析:
代码具体执行情况以及P2调试情况见下 ↓
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
调试及P2情况
Keil与Proteus联调,打开P2状态图;
开始调试并且未操作时,P2 = 0xff;,P2状态为 1111 1111,
闭合开关2,单击RUN执行,在这个执行过程中P2情况:
① 初始状态 1111 1111
② 闭合开关 1111 1101
④ "与运算" 0000 1101
//通过 (1111 1101 & 0000 1111) 运算得到 (0000 1101) 屏蔽掉高四位的情况,进行!= 0x0f 判断。
// 如果四开关同时断开,(1111 1111 & 0000 1111) == (0000 1111)
// 如果有任何一个开关闭合,则将执行左移操作
③ 左移四位 1101 0000
LED2 左端获得低电平,右端高电平,LED亮
所有开关断开,重新进入循环,P2 = 0xff;
程序代码执行结束,分析完毕。