| 
 
| 1.IO对应的寄存器 P0(80H):P0 口锁存器,双向 8 位 I/O 口(可复用为地址 / 数据总线)。
 P1(90H):P1 口锁存器,准双向 8 位 I/O 口。
 P2(A0H):P2 口锁存器,准双向 8 位 I/O 口(可复用为高 8 位地址线)。
 P3(B0H):P3 口锁存器,准双向 8 位 I/O 口,每一位有第二功能(如串口、中断、定时器等)
 
 2. 输出工作原理
 当作为输出口时,CPU 通过写入数据到端口寄存器(如 P0),控制内部 MOS 管导通或截止,从而使引脚输出高电平或低电平:
 
 输出高电平时:内部上拉电阻导通,引脚呈现高电平(P0 口无内部上拉,需外部电阻)
 
 输出低电平时:下拉 MOS 管导通,引脚接地,呈现低电平
 
 3. 输入工作原理
 作为输入口使用时,需先向端口寄存器写入0xFF(全 1),使内部 MOS 管截止,此时引脚状态可被内部缓冲器读取:
 
 读引脚:通过MOV C, P0.0等指令直接读取外部引脚状态
 
 读锁存器:通过MOV A, P0等指令读取端口寄存器的值(用于某些特殊操作)
 
 4.按键控制小灯代码
 (此处输入引脚硬件电路默认上拉)
 
 /**************************************************************************************
 *                              独立按键实验                                                                                                  *
 实现现象:下载程序后按下K1按键可以对D1小灯状态取反。
 注意事项:无
 ***************************************************************************************/
 
 #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
 
 typedef unsigned int u16;          //对数据类型进行声明定义
 typedef unsigned char u8;
 
 sbit k1=P3^1;         //定义P31口是k1
 sbit led=P2^0;         //定义P20口是led
 
 /*******************************************************************************
 * 函 数 名         : delay
 * 函数功能                   : 延时函数,i=1时,大约延时10us
 *******************************************************************************/
 void delay(u16 i)
 {
 while(i--);
 }
 
 /*******************************************************************************
 * 函 数 名         : keypros
 * 函数功能                   : 按键处理函数,判断按键K1是否按下
 *******************************************************************************/
 void keypros()
 {
 if(k1==0)                  //检测按键K1是否按下
 {
 delay(1000);   //消除抖动 一般大约10ms
 if(k1==0)         //再次判断按键是否按下
 {
 led=~led;          //led状态取反
 }
 while(!k1);         //检测按键是否松开
 }
 }
 
 /*******************************************************************************
 * 函 数 名       : main
 * 函数功能                 : 主函数
 * 输    入       : 无
 * 输    出             : 无
 *******************************************************************************/
 void main()
 {
 while(1)
 {
 keypros();  //按键处理函数
 }
 }
 
 
 5.各端口详细说明
 
 (1)P0 口(80H)
 结构特点:漏极开路设计,无内部上拉电阻,作为普通 I/O 口使用时需外接 10kΩ 上拉电阻
 双重功能:
 普通 I/O 口:8 位双向口,可输入输出数据
 复用功能:访问外部存储器时,分时作为低 8 位地址线(A0~A7)和 8 位数据线(D0~D7)
 应用场景:需要大电流驱动的外部设备、外部存储器扩展
 (2) P1 口(90H)
 结构特点:准双向口,内部集成上拉电阻,无需外部电阻
 功能:唯一纯 I/O 口,无复用功能,每一位均可独立作为输入或输出
 应用场景:LED 指示灯、按键、传感器等简单外设连接
 (3)P2 口(A0H)
 结构特点:准双向口,内部带上拉电阻
 双重功能:
 普通 I/O 口:8 位双向口
 复用功能:访问外部存储器时作为高 8 位地址线(A8~A15)
 注意:当系统扩展外部存储器时,P2 口通常被用作地址线,不能再作为普通 I/O 口
 (4)P3 口(B0H)
 结构特点:准双向口,内部带上拉电阻
 双重功能:
 普通 I/O 口:8 位双向口
 第二功能:每一位都有特殊功能,如下表:
 
 
 
 ————————————————
 版权声明:本文为CSDN博主「chem4111」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
 原文链接:https://blog.csdn.net/weixin_46286415/article/details/149742670
 
 
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册 
  |