[其它应用] C51 IO输入输出

[复制链接]
156|0
小海师 发表于 2025-10-9 15:32 | 显示全部楼层 |阅读模式
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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

89

主题

272

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部