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.0-P2.3读入开关状态 if ((P2 & 0x0f) != 0x0f)时,通过对其移位 P2 = P2<< 4;,将P2.0-P2.3的值对应移到了P2.4-P2.7中

代码分析:

#include <reg51.h>

#define uint unsigned int

//延时子程序

void delay()

{

uint i, j;

for (i = 3; i > 0; i--)

{

for(j = 1000; j > 0; j--);

}

}

void main()

{

while(1)

{

P2 = 0xff;

",才能确保输入结果正确

if ((P2 & 0x0f) != 0x0f)

//屏蔽高四位,判断低四位是否闭合,书上原为 if (P2 != 0x0f),有问题

{

P2 = P2<< 4;位,闭合第二个开关后,变成 0000 1011

delay();

}

}

}

代码具体执行情况以及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;

程序代码执行结束,分析完毕。

51单片机I/O口直接输入输出实例(附调试及分析过程)的更多相关文章

  1. 51单片机 | I/O口直接输入输出实例

    51单片机P0/P1/P2/P3口的区别: P0口要作为低8位地址总线和8位数据总线用,这种情况下P0口不能用作I/O,要先作为地址总线对外传送低8位的地址,然后作为数据总线对外交换数据: P1口只能 ...

  2. MOS管、PCB、H桥、步进电机驱动电路、51单片机的IO口驱动能力、灌电流、拉电流、上拉电阻的选择

    嵌入式开发PCB设计几点体会(转载):http://bbs.ednchina.com/BLOG_ARTICLE_3021801.HTMCollector-Emitter Saturation Volt ...

  3. 51单片机:IO口扩展芯片用法(74HC165,74HC595)

    IO口扩展芯片,主要是解决单片机IO口太少. 74HC165:数据从并转串 74HC595:数据从串转并 两种芯片,都是通过时序电路,加上移位功能,进行数据传输 74HC165:数据从并转串.以下实例 ...

  4. 51单片机 | 实现SMC1602液晶屏显示实例

    ———————————————————————————————————————————— LCD1602 - - - - - - - - - - - - - - - - - - - - - - - - ...

  5. 51单片机I/O口使用经验

    按常规,在51端口(P1.P2.P3)某位用作输入时,必须先向对应的锁存器写入1,使FET截止.一般情况是这样,也有例外.所谓IO口内部与电源相连的上拉电阻而非一常规线性电阻,实质上,该电阻是由两个场 ...

  6. 51单片机 | A/D转换器实现数字电压表实例

    ———————————————————————————————————————————— ADC0809 - - - - - - - - - - - - - - - - - - - - - - - - ...

  7. STM32GPIO口8种模式细致分析(类比51单片机)

    关于STM32GPIO口的8种工作模式,我们先引出一些问题? STM32GPIO口如果既要输入又要输出怎么办? 1.浮空输入模式 上图红色的表示便是浮空输入的过程,外部输入时0读出的就是0,外部输入时 ...

  8. 51单片机入门1--与C语言的交接

    我们即将进入51单片机的编程学习,咱们今天就来讲解一下单片机中的C语言(你可以称作C51) 在说编程之前,要先说一些别的东西: 二进制,八进制,十六进制 二进制中只有数字0和1,在二进制中1+1为10 ...

  9. 单片机I/O口推挽与开漏输出详解(力荐)

    推挽输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止. 开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电 ...

随机推荐

  1. SQL Sever数据库的基本操作和它的建立

    SQL数据库: 1.数据库概述 (1) 用自定义文件格式保存数据的劣势. (2) DBMS(DataBase Management System,数据库管理系统)和数据库,平时谈到"数据库& ...

  2. 20ms Ac Code

    Rectangle Aread C Code #include <stdio.h> int computeArea(int A,int B,int C,int D,int E,int F, ...

  3. noscript 标签,一个被忽视的重要标签

    打开 Drupal 的新后台,发现显示大面积空白 .本以为是 CSS 的问题,后来折腾好久才发现是我之前因为某些站的安全问题把浏览器的 Javascript 给禁用了.Javascript 的日益强大 ...

  4. 阿里宣布Atlas正式开源:带你重返App开发的田园时代

    继Weex之后,阿里在移动技术领域又有开源大动作. 3月13日,手机淘宝安卓客户端容器化框架Atlas正式宣布开源(https://github.com/alibaba/atlas ).Atlas由阿 ...

  5. koahub.js 0.09 发布,新增钩子机制

    koahubjs发布0.09 新增钩子机制添加钩子机制,控制器钩子和函数钩子修复自动加载bug,实现除自动加载导出的default外,还能自动加载其他的方法记koahubjs钩子开发过程在使用koah ...

  6. Vuex 模块化实现待办事项的状态管理

    前言 在vue里,组件之间的作用域是独立的,父组件跟子组件之间的通讯可以通过prop属性来传参,但是在兄弟组件之间通讯就比较麻烦了.比如A组件要告诉一件事给B组件,那么A就要先告诉他们的爸组件,然后爸 ...

  7. ubuntu auto mount自动挂载硬盘

    Ubuntu 挂载的文章在网上也不少,推荐一个: http://wenku.baidu.com/link?url=N2c7axijp_KYaYkt2CrZFNZPzzS8xBHLQSTUcI2F85I ...

  8. Python中参数是传值,还是传引用?

    在 C/C++ 中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码. 代码段1: def foo(arg): arg = 2 print(a ...

  9. python 机器学习 K-近邻算法

    本人想边写文章,边学习,用的是 网上最火的<机器学习实战>machine learning in action 来做一次实践. 希望在过程中理顺思路之余,也有分享自己的一些理解,学习.加油 ...

  10. 初用Linux, 安装Ubuntu16.04+NVIDIA387+CUDA8.0+cudnn5.1+TensorFlow1.0.1

    因为最近Deep Learning十分热门, 装一下TensorFlow学习一下. 本文主要介绍安装流程, 将自己遇到的问题说明出来, 并记录自己如何处理, 原理方面并没有能力解释. 由于本人之前从来 ...