51单片机IO口的四种工作状态切换

51单片机IO口的四种工作状态切换

1.概述

这篇文章介绍单片机IO引脚的四种工作模式,每个模式都有各自的用武之地,后面在驱动外设硬件时会用它不同的模式。

2.IO口四种工作模式介绍

PnM1PnM0I/O口工作模式
00准双向口:灌电流达20mA, 上拉电流为150~270uA
01推挽输出:强上拉输出达20mA,外接限流电阻
10高阻输入
11开漏:内部上拉电阻断开,外接上拉电阻。既可以读外部状态也可对外部输出

名词解释
灌电流:VCC给其他IO引脚输入的电流
上拉电流:其他IO引脚到GND的电流

2.切换IO口四种工作模式

下面切换IO口工作模式是基于STC12C2052单片机介绍,该单片机默认IO模式为准双向。下面介绍下如何将它切换为其他的模式。

2.1.切换I/O口模式原理

单片机切换不同的模式是通过对PnM1和PnM0两个寄存器值的修改实现,下面介绍下修改原理。

  1. PnM1和PnM0中的n表示修改第几组IO接口,例如修改P1组I/O口,设置为P1M1和P1M0;修改P3组I/O口,设置为P3M1和P3M0
  2. PnM1和PnM0的值采用16进制,下面通过一个例子介绍如何计算它的值。
    例如:设置P1.7和P1.6两个引脚为推挽输出模式
引脚组名第8位第7位第6位第5位第4位第3位第2位第1位
P1(一组占用一个字节8位)P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0
二进制位11000000

将上面表格中的二进制分为高4位和低4位,1100转换为十进制是12,用十六进制值表示就是0xC0。

//设置P1.7 P1.6推挽输出 P1M0和P1M1值
P1M0 = 0X00 // 0000 0000
P1M1 = 0XC0 // 1100 0000

将一组接口的8位二进制分为高4位和低4位,如果要将设置P1.3和P1.2两个引脚为推挽输出模式,低4位也是1100转换为十进制是12,不就和上面的冲突了吗。其实十进制转十六进制时候,十六进制0x后面两位也是分开的,左边一位对应二进制高4位的值,右边一位对应二进制低4位值。

//设置P1.3  P1.2推挽输出 P1M0和P1M1值
P1M0 = 0X00 // 0000 0000
P1M1 = 0X0C // 0000 1100

2.1.切换为推挽输出模式

1.程序代码

下面是定义P1组I/O接口的P1.7 P1.6引脚为推挽模式,该引脚对应二进制中高四位。转换为十六进制是0XC0

/*************************************************************
* 程序名: 设置接口推挽模式
* 编写人: bruce
* 硬件支持:STC12C2052
* 日  期: 2023-11-23
* 修改日志: 
/*************************************************************/

#include<STC12C2052AD.H>

// 定义P1.7 和 P1.6接口
sbit LED1 = P1^7;
sbit LED2 = P1^6;


void main(void){
	//设置P1.7 和 P1.6接口为推挽模式
	P1M0 = 0X00;
	P1M1 = 0XC0;
	// 定义接口高低电平
	LED1 = 1;
	LED2 = 0;
}

下面是定义P1组I/O接口的P1.3 P1.2引脚为推挽模式,该引脚对应二进制中低四位。转换为十六进制是0X0C

/*************************************************************
* 程序名: 设置接口推挽模式
* 编写人: bruce
* 硬件支持:STC12C2052
* 日  期: 2023-11-23
* 修改日志: 
/*************************************************************/

#include<STC12C2052AD.H>

// 定义P1.3 和 P1.2接口
sbit LED1 = P1^3;
sbit LED2 = P1^2;


void main(void){
	//设置P1.3 和 P1.2接口为推挽模式
	P1M0 = 0X00;
	P1M1 = 0X0C;
	// 定义接口高低电平
	LED1 = 1;
	LED2 = 0;

}
2.硬件电路

设置P1.7 和 P1.6接口为推挽模式

LED灯正极连接单片机9号引脚,负极连接单片机7号引脚,设置为推挽模式后,输出20mA点亮,高亮LED灯。

斜体样式设置P1.3 和 P1.2接口为推挽模式

LED灯正极连接单片机5号引脚,负极连接单片机4号引脚,设置为推挽模式后,输出20mA点亮,高亮LED灯。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/183510.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode:合并两个有序链表

题目描述 题目链接&#xff1a;21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 题目分析 这个算法思路很简单&#xff1a;就是直接找小尾插 定义一个tail和head&#xff0c;对比两个链表结点的val&#xff0c;小的尾插到tail->next&#xff0c;如果一个链表…

ebpf实战(一)-------监控udp延迟

问题背景: 为了分析udp数据通信中端到端的延迟,我们需要对整个通信链路的每个阶段进行监控,找出延迟最长的阶段. udp接收端有2个主要路径 1.数据包到达本机后&#xff0c;由软中断处理程序将数据包接收并放入udp socket的接收缓冲区 数据接收流程 2. 应用程序调用recvmsg等a…

如何解决tinder注册失败的问题?

tinder创立在2012年&#xff0c;是一款海外热门的交友软件。2020年&#xff0c;Tinder拥有620万用户和7500万月活跃用户。截至2021年&#xff0c;Tinder在全球范围内的匹配记录超过650亿。已成为全球最受欢迎的约会软件之一。 目前tinder暂时未对中国大陆开发使用&#xff0c;…

一个最简单的工业通讯数据分析例子

1.背景 对工业设备的通讯协议进行分析可以帮助我们更好地理解其工作原理和相关技术&#xff0c;并且有助于以下几个方面&#xff1a; 1. 优化工业设备的通讯效率&#xff1a;了解通讯协议的细节可以帮助我们找到通讯效率低下的原因并进行优化&#xff0c;提高设备的通讯效率和…

vue3实现验证码校验的功能

&#x1f4d3;最近想实现使用vue3实现一个简易的前端验证码校验的功能&#xff0c;就花了点时间实现了&#xff0c;这只是一个简易版的&#xff0c;但是用在项目中是没有啥问题的&#xff0c;废话不多说&#xff0c;先来看下最终实现的效果。 &#x1f4d3;现在让我们来一步一步…

java制作简单飞翔的鸟

创建三个包&#xff0c;存放代码。把图片放进文件中 APP包&#xff08;运行&#xff09; GameApp类 package APP; import mian.GameFrame;public class GameApp {public static void main(String[] args) {new GameFrame();} } mian包&#xff08;主内容&#xff09; Barri…

如何开发洗鞋店用的小程序

随着人们生活水平的提高&#xff0c;洗护行业是越来越细分化了&#xff0c;从最开始的干洗店包含洗护行业的所有服务到现在有专门为洗鞋开的店&#xff0c;如果开发一款洗鞋店用的小程序&#xff0c;可以实现用户在家下单直接有人上门取鞋的话&#xff0c;应该如何去开发呢&…

高质量短效SOCKS5代理IP是什么意思?作为技术你了解吗

小张是一位网络安全技术测试员&#xff0c;最近他接到了一个头疼的任务&#xff0c;那就是评估公司系统的安全性&#xff0c;因此他前来咨询&#xff0c;在得知SOCKS5代理IP可以帮他之后&#xff0c;他不禁产生疑问&#xff0c;这是什么原理&#xff1f;其实和小张一样的朋友不…

Lua脚本解决redis实现的分布式锁多条命令原子性问题

线程1现在持有锁之后&#xff0c;在执行业务逻辑过程中&#xff0c;他正准备删除锁&#xff0c;而且已经走到了条件判断的过程中&#xff0c;比如他已经拿到了当前这把锁确实是属于他自己的&#xff0c;正准备删除锁&#xff0c;但是此时他的锁到期了&#xff0c;那么此时线程2…

Flutter 小技巧之 3.16 升级最坑 M3 默认适配技巧

如果要说 Flutter 3.16 升级里是最坑的是什么&#xff1f;那我肯定要说是 Material 3 default &#xff08;M3&#xff09;。 倒不是说 M3 bug 多&#xff0c;也不是 M3 在 3.16 上使用起来多麻烦&#xff0c;因为虽然从 3.16 开始&#xff0c;MaterialApp 里的 useMaterial3 …

Shell循环:for(一)

语法结构&#xff1a; for 变量名 [ in 取值列表] do 循环体 done 示例1&#xff1a; 1、需求&#xff1a;自动循环创建10个用户 2、演示&#xff1a; [rootlocalhost ~]# vim for.sh #脚本编写 #!/bin/bash for i in {1..10} do useradd "user$…

探究Kafka原理-2.Kafka基本命令实操

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44…

csv文件添加文件内容和读取

append content to file import numpy as np acc_listnp.array([0.97,0.92,0.93,0.89]) # 注意这个地方添加文件不需要特别声明是什么文件 file open("result.csv", "a") print("{:.2f}, {:.2f}".format(acc_list.mean(), acc_list.std()), f…

服务器安全如何保障

主机安全是指保护计算机主机&#xff08;也称为服务器、终端或主机设备&#xff09;免受潜在的安全威胁和攻击的一系列措施和实践。主机安全旨在防止未经授权的访问、数据泄露、恶意软件感染和其他安全漏洞的利用&#xff0c;主机一旦被黑客入侵&#xff0c;企业会面临很多安全…

buck降压电路

一、Buck电路的拓扑结构 Buck是直流转直流的降压电路,下面是拓扑结构,作为硬件工程师,这个最好是能够记下来,了然于胸。 为啥要记下来,自然是因为这个电路太基础了,并且谁都会用到,更重要的一点,面试可能会考。。。 上图是个异步buck,同步buck就是将里面的二极管换成M…

手持式无线通信频谱分析仪 MS2713E

MS2713E 手持式无线通信频谱分析仪 安立手持式无线通信频谱分析仪 MS2713E 旨在处理最恶劣的现场条件&#xff0c;使您能够监控、定位、识别和分析各种蜂窝、2G/3G/4G、陆地移动无线电、Wi-Fi 和广播信号。多功能 Spectrum Master 在定位和识别宽频率范围内的信号时&#xff0…

Java设计模式系列:单例设计模式

Java设计模式系列&#xff1a;单例设计模式 介绍 所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法&#xff08;静态方法&#xff09; 比如 Hiberna…

【云原生 Prometheus篇】Prometheus的动态服务发现机制与认证配置

目录 一、Prometheus服务发现的方式1.1 基于文件的服务发现1.2 基于consul的服务发现1.3 基于 Kubernetes API 的服务发现1.3.1 简介1.3.2 基于Kurbernetes发现机制的部分配置参数 二、实例一&#xff1a;部署基于文件的服务发现2.1 创建用于服务发现的文件2.2 修改Prometheus的…

中国毫米波雷达产业分析2——毫米波雷达产业链分析

一、产业链构成 毫米波雷达产业链分为三部分&#xff1a;上游主要包括射频前端组件&#xff08;MMIC&#xff09;、数字信号处理器&#xff08;DSP/FPGA&#xff09;、高频PCB板、微控制器&#xff08;MCU&#xff09;、天线及控制电路等硬件供应商&#xff1b;中游主体是毫米波…

多线程 02

1.线程的常见构造方法 方法说明Thread()创建线程对象Thread(Runnable target)使用 Runnable 对象创建线程对象Thread(String name)创建线程对象&#xff0c;并命名Thread(Runnable target, String name)使用 Runnable 对象创建线程对象&#xff0c;并命名【了解】Thread(Threa…