找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 18952|回复: 7
收起左侧

51单片机的IO口操作基础知识介绍

  [复制链接]
ID:101489 发表于 2016-1-5 01:42 | 显示全部楼层 |阅读模式
以我们常用的STC单片机为例:STC单片机所有IO口均可由软件配置成4种工作类型。4种类型分别为:准双向口/弱上拉(标准8051输出模式)、强推挽输出/强上拉、仅为输入(高阻)或开漏输出功能。每个口有2个寄存器中的相应位控制每个引脚的工作类型。上电复位后的工作模式为准双向/弱上拉模式。2V以上为高电平,0.8V以下为低电平,每个I/O口驱动能力可以达到20mA。
那么我们通过配置哪两个寄存器来设定I/O口的工作模式呢:这两个寄存器就是PxM1和PxM0,P0口对应的就是P0M1和P0M0,P1口对应的就是P0M1和P0M0,P2口对应的就是P0M1和P0M0,P3口对应的就是P0M1和P0M0。以P0口的设置为例:
如果有P0M1为10100000;P0M0为11000000,我们对照上表可以知道:P0.7管脚为开漏输出;P0.6为强推挽输出;P0.5为输入(高阻);P0.4到P0.0为准双向口。

单片机I/O控制电路典型接法:
1、典型三极管控制电路
如果用弱上拉控制,建议加上拉电阻R1(3.3K - 10K),如果不加上拉电阻R1,建议R2的阻值在15K以上,或用强推挽输出。

2、典型发光二极管控制电路
采用准双向口模式,用灌电流驱动发光二极管限流电阻尽量大于1K,最小不要小于470Ω

推挽/强上拉口模式,用拉电流驱动发光二极管,限流电阻一般为1K。

3、混合电压供电系统3V/5V器件I/O口互连
STC单片机如果供电是5V,当它连接3.3V器件时,为防止3.3V器件承受不了5V,可将相应的5V单片机I/O口先串一个330Ω的限流电阻到3.3V器件I/O口,程序初始化时将5V器件的I/O口设置成开漏配置,断开内部上拉电阻,相应的3.3V器件I/O口外部加10K上拉电阻到3.3V器件的VCC,这样高电平是3.3V,低电平是0V,输入输出一切正常。

4、当I/O口作为PWM输出I/O口时,需要设置成强推挽输出/强上拉输出,同时加输出限流电阻10K即可。

回复

使用道具 举报

ID:299857 发表于 2018-4-1 08:19 | 显示全部楼层
P0口对应的就是P0M1和P0M0,P1口对应的就是P0M1和P0M0,P2口对应的就是P0M1和P0M0,P3口对应的就是P0M1和P0M0。是不是错了?还有怎么设置啊,我在keil软件里写       
P2M0 == 11111111;
P2M1 == 00000000;
或者输入
P2M0 = 1;
P2M1 = 0;
都报错说MAIN.C(28): error C202: 'P2M0': undefined identifier。(没定义变量)
回复

使用道具 举报

ID:200844 发表于 2018-4-5 10:32 | 显示全部楼层
STC89C52RC I/O口有4种工作类型吗,怎么配置不了,哪些型号有这功能。
回复

使用道具 举报

ID:398477 发表于 2018-10-3 19:51 来自手机 | 显示全部楼层
山水2000 发表于 2018-4-5 10:32
STC89C52RC I/O口有4种工作类型吗,怎么配置不了,哪些型号有这功能。

这个单片机只有准双向口!你可以上STC官网查询!
回复

使用道具 举报

ID:731755 发表于 2021-4-3 18:15 | 显示全部楼层
请问楼主,P0M0,P1M0,在表格里面怎么对应着看看,我在一本书看到楼主一样的,也是没有介绍清楚
回复

使用道具 举报

ID:289371 发表于 2023-3-30 22:42 | 显示全部楼层
单片机我来了 发表于 2018-4-1 08:19
P0口对应的就是P0M1和P0M0,P1口对应的就是P0M1和P0M0,P2口对应的就是P0M1和P0M0,P3口对应的就是P0M1和P0 ...

你说的是对的,P后面的数字是端口号,值的位数对应是端口的第几个,我用stc8是可以的,用stc12C5A60S2就存在P0M0之类的没定义的问题,我感觉是软件用的reg52的问题,那里面可能没定义,这个我也不清楚,希望有人解答
回复

使用道具 举报

ID:975054 发表于 2023-9-17 11:32 | 显示全部楼层
单片机我来了 发表于 2018-4-1 08:19
P0口对应的就是P0M1和P0M0,P1口对应的就是P0M1和P0M0,P2口对应的就是P0M1和P0M0,P3口对应的就是P0M1和P0 ...

还没见过这么写的:P2M0 == 11111111;P2M1 == 00000000;
应写成十六进:P2M0 =0xff ; P2M1 =0x00;
报错原因是你这样写编译器只能把P2M0/P2M1当成变量了而你没定义变量类型(而实际是寄存器).
回复

使用道具 举报

ID:975054 发表于 2023-9-17 11:34 | 显示全部楼层
任何混合供电系统的I/O都要结合具体连接情况,严谨来说是"必要时加适当阻值的限流电阻,一般0-330Ω";注意是必要时!
0Ω就是可不接情况:接口已设开漏且距离很近无其他风险,是可不接。但万一你调试时错改成非开漏或其他特殊情况,就可能直接输出5V到3V芯片去了,那不就危险了么?串了限流电阻就基本可以高枕无忧了;并非“应该是完全没必要加限流电阻了嘛!”。
又如这个口是连接电缆到设备外部的,一般都会接个限流电阻,可能还需要稳压防静电浪涌等等,才能防止外部引入不可预测的高压、静电、短路开路等等各种干扰的危害!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表