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


    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 = 0xff; P2口全部赋高电平 1111 1111,因为I/O作为输入时应先设置各个锁存器为"1",才能确保输入结果正确;

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

    代码分析:

        

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

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

  • 相关阅读:
    Nodejs的下载和安装以及环境配置
    java的JDK的安装和环境变量配置
    CSS3与页面布局——概要、选择器、特殊性与刻度单位
    angular2.x 多选框事件
    NiceFish的ERROR in AppModule is not an NgModule问题
    angularjs分页组件
    获取当前日期
    angularjs实现星星评分
    angularjs1 自定义轮播图(汉字导航)
    获取未来几天的日期以及是星期几
  • 原文地址:https://www.cnblogs.com/isAndyWu/p/9566892.html
Copyright © 2020-2023  润新知