IO口分类

此单片机有39个IO口,P0到P3每个8个口,P4有7个口

一般用P1,P2,P3,P4口与外部模块通信,这4个口是准双向口,具备弱上拉电阻的;P0口重新上电后是开漏输出,若总线扩展用,不需要加上拉电阻,但是作为IO口与外部模块通信的时候,要加上拉电阻。

P4口是新版本51单片机添加的,在传统的51头文件里面没有关于P4的配置,需要自己添加,对于P4口的首地址是E8H,有7个口所以增添头文件如下

sfr  P4  = 0xe8;    /*C语言中声明P4口特殊功能寄存器地址*/
sbit P40 = 0xe8; /*C语言中声明P4.0口位地址*/
sbit P41 = 0xe9; /*C语言中声明P4.1口位地址*/
sbit P42 = 0xea;
sbit P43 = 0xeb;
sbit P44 = 0xec;
sbit P45 = 0xed;
sbit P46 = 0xee;

单片机控制IO口

单片机自身会引出IO口,这些IO口如果和一些片外外设相连,单片机就可以通过IO口和片外外设信息交流

而在单片机中,CPU对各种片内外设的控制是采用特殊功能寄存器(SFR)的集中控制方式共有26个特殊功能寄存器,这些寄存器是对各种片内外设的控制寄存器和状态寄存器,地址映射在RAM区的80H到FFH内,所以CPU要对单片机的片内外设或者片外外设操作,都需要通过寄存器。CPU操作寄存器,从而引起片内外设或者片外外设工作,类似于人类大脑先在相应控制区域产生指令,然后通过神经,控制对应身体部位产生行动

比如26个特殊功能寄存器中的IO口寄存器是和具体的IO口引脚映射的,那么这些寄存器就可以控制这些IO口,而且这些寄存器会被标识符命名,比如(srf P0= 0x80,0x80这个地址就是控制P0串口的寄存器地址,通过操作P0变量,就可以控制P0串口)。单片机直接对这些寄存器地址内容修改或者检测,会直接影响到具体IO口硬件的电平,IO口是可以寻址的,IO口组的各个口相当于可寻址空间的一个位,在相关头文件里面,会对这些地址进行配置

注意:对于可以位寻址的SFR,其字节地址的末位只能是0H或8H

有两个指令配置寻址,sfr和sbit

IO口的高低电平相当于就是对IO口与模块或者单片机连接的开关,如果低电平就导通,高电平就截止

注意:sfr和sbit指令是非标准C语言指令,不在ANSI标准中,一般的C编译器可能不认识这两个指令

sfr

通过sfr指令将单片机里的特殊功能寄存器取一个名字;操作此变量,就会引起对应寄存器的存储的值变化

sbit

再通过sbit指令将IO口组的具体某个口对应的内存地址映射到某个变量

代码实例

#include "reg52.h"sbit led1 = P3^7;
sbit led2 = P3^6;
void main(){while(1){led1=0;led1=1;led2=0;led2=1;}}

我们在操作的时候对配置的变量操作,就会操作单片机的某个内存地址的内容,而这个内存地址又会影响到到具体IO口的硬件电平,这样操作此变量就相当于操作此IO口,通过给变量赋值0,1从而控制IO口电平的高低

由于看原理图,P3^7代表的是P3IO口的7引脚,而P3IO口的7引脚又和一个小灯连接着,通过sbit将led1指向P3IO口的7引脚,然后给led1赋值0,就相当于给该IO口引脚传递低电平,,相当于GND,传递低电平后,灯和IO口和电源形成成回路,从而让灯亮

输入与输出

输入与输出都是针对单片机自身来说的,即输入给单片机,和单片机输出

而且对于52单片机,输入输出功能不需要配置

输入

对于单片机,输入就是将外部模块的内容传递给单片机,在代码里面,如果将已经有值的IO口,赋值给一个变量,对于单片机就是输入,因为可能外部模块与这个IO口连通了的,运行之后,外部模块对IO口产生了数据,然后单片机用一个变量接受IO口的数据,就可以通过这个数据来操作其他的模块

输出

对于单片机,输出就是将单片机的内容传递给外部模块,在代码里面,如果将具体的值,0或1等,赋值给某个IO口,对于单片机就是输出,因为这个IO口所赋的值会影响与这个IO口连接的外部模块

代码实例

#include "reg52.h"sbit led1 = P3^7;
sbit IFfire=P1^0;
void main(){while(1){led1=1;int input=IFfire;if(input==0){led1=0;      }     }}

首先将led1配置为1,对于单片机这个口就是输出,单片机通过将P3^7口配置为高电平,导致与该口所连的灯不亮,然后用input接受火焰传感器传给P1^0口的数据,对于单片机这个口就是输入,如果该口是低电平,那么让led1配置为1,让灯亮

小项目

一、项目1-灯的闪烁

#include "reg52.h"sbit ledblue =P3^7;
sbit ledyellow =P3^6;
void delay500(){int n=61404;while(n--);
}
void light(int x,int y){ledblue=x;ledyellow=y;}
void main(){while(1){light(0,0);delay500();light(1,1);delay500();light(0,1);delay500();light(1,1);delay500();light(0,0);delay500();light(1,1);delay500();light(1,0);delay500();light(1,1);delay500();}}

要实现灯的闪烁,需要延时函数,51单片机可以自动帮助生成延迟函数的代码(比如延迟0.5秒,相当于数61404次数)

二、项目2-按键控制灯

#include "reg52.h"
#define LightBlue 1
#define LightYellow 2
#define LightAll 3
sbit ledblue =P3^7;
sbit ledyellow =P3^6;
sbit key1=P2^1;
sbit key2=P2^0;void delay100(){int tmp=61404*0.2;while(tmp--);
}
void delay500(){int tmp=61404;while(tmp--);
}
int light(int x){if(x==LightBlue){int n=3;while(n--){ledblue=0;delay500();ledblue=1;if(n!=0)delay500();}}if(x==LightYellow){int n=3;while(n--){ledyellow=0;delay500();ledyellow=1;if(n!=0)delay500();}}if(x==LightAll){int n=3;while(n--){ledyellow=0;ledblue=0;delay500();ledyellow=1;ledblue=1;if(n!=0)           delay500();}}return x;
}
void main(){int flag=LightAll; int tmp=LightAll;while(1){int n=3;ledblue=1;ledyellow=1;if(key1==0){delay100();if(key1==0){if(tmp==LightAll){flag=LightBlue;tmp=light(flag);continue;}if(tmp==LightBlue){flag=LightYellow;tmp=light(flag);continue;}if(tmp==LightYellow){flag=LightAll;tmp=light(flag);continue;}}}}
}

单片机点灯和物理点灯的区别

现实中,按键控制点灯,按键和灯在一个电路中,按键相当于开关,控制电路的通断而实现灯的亮灭

在单片机中,按键是一个电路,可以输出高低电平;点灯是一个电路,需要高低电平,而单片机是一个媒介,去检测按键的输出的高低电平,然后对应给灯输入高低电平,在逻辑上形成按键控制点灯

消抖

消抖,因为人按键按下到弹起可能有个150ms,如果板子用久了接触不良可能抖动导致按下按键,这样抖动从按下到弹起速度很快。软件消抖就是不立刻检测,延迟检测,延迟时间大于抖动的时间小于按键到松开的时间,那么就可以避免抖动,记录下的都是人为的信号

记录状态位

当按键需要控制的模块较多时,可以用一个状态变量来记录状态,模块可根据对应状态变量的值实现相应的功能,如果需要记录上一次的状态,可以再增加一个变量来记录上一层的状态

io口电平翻转

如果想要一个按键实现按下点灯,再次按下关灯,就可以通过led=!led,来翻转io的电平,也相当于是一个记录状态位的操作

三、终项目-简易电动车报警器

#include "reg52.h"sbit kaiguan  =P2^3;
sbit zhendong =P3^3;
sbit key1     =P2^1;
sbit key2     =P2^0;
sbit A        =P1^5;
sbit C        =P1^7;
sbit led1     =P3^7;
sbit led2     =P3^6;void delay200(){int tmp=61404*0.3;while(tmp--);
}
void delay400(){int tmp=61404*0.6;while(tmp--);
}void main(){led1=1;led2=1;while(1){if(A==1){led1=1;led2=1;kaiguan=0;delay200();kaiguan=1;delay200();kaiguan=0;delay400();kaiguan=1;}if(C==1){led2=0;led1=0;kaiguan=0;delay200();kaiguan=1;}if(led2==0&&led1==0&&zhendong==0){int i=0;for(i;i<3;i++){int n=3;while(n--){kaiguan=0;delay200();kaiguan=1;delay200();}}}}
}

用到的模块

振动传感器

VCC和GND针脚供电,DO口可以接到单片机的IO口,如果振动传感器感受到了振动,DO口就会向IO口发送低电平,并且DO-LED灯会亮,没有振动DO口维持高电平

振动传感器用于检测振动

继电器

继电器相当于是一个电路控制的开关,可以控制家用220v电灯的那种开关,继电器VCC和GND口连单片机供电,IN口连接单片机的IO口,当单片机向IN口输入低电平时,继电器另一端COM口和NO口接通,相当于开关闭合,就可以维持电路导通;默认情况,当继电器线圈两端无电压或电压不够,COM口和NC口接通,相当于开关断开。

继电器用于给喇叭当开关

433m射频遥控模块

该模块配套了一个433射频遥控器,模块的VCC和GND口连单片机供电,D0,D1,D2,D3连接单片机IO口

433射频遥控器的ABCD按键分别对应D0到D3口,按下按键,会给模块发出信号,对应的D口就会给单片机的对应IO口发送高电平

遥控模块用于整体的开关,按下A键关闭报警器,按下C键打开报警器

小喇叭

小喇叭和继电器和电池,组成报警模块,如果简易报警器处于打开状态,振动模块感应到振动就会,打开继电器,从而报警;如果简易报警器处于关闭状态,继电器是关闭的,振动模块就算感应到振动也不会报警

51单片机——IO口相关推荐

  1. 51单片机IO口输入输出方式

    传统51单片机IO接口只可以作为标准双向IO接口,如果用其来驱动LED只能用灌电流的方式或是用三极管外扩驱动电路. 灌电流方式:LED正极接VCC,负极接IO口.IO为高电平是LED两极电平相同,没有 ...

  2. 推挽输出和开漏输出_关于51单片机IO口的输出模式结构

    单片机种类繁多今天主要谈谈51单片机,在stm32单片机中IO(GPIO)输出模式有很多种.如 模拟输入 .浮空输入.下拉输入.上拉输入.开漏输出.推挽输出等很多种,不同的输入输出有不同的功能,实现不 ...

  3. 学习笔记之-51单片机IO口详解

    前言 对单片机的控制,其实就是对I/O口的控制,无论单片机对外界进行何种控制,或接受外部的何种控制,都是通过I/O口进行的.51单片机每个IO端口结构都有差异,都各有各的特点.在平时的应用中,特别是设 ...

  4. 51单片机---IO口 (准双向口和双向口的区别)

    MCS-51有4个双向并行IO口:P0.P1.P2.P3;其中,P0为三态双向口,其驱动能力比较大,可驱动高达8个TTL电路;P1.P2.P3为准双向口(作为输入时,口线需要被拉成高电平,故称准双向口 ...

  5. 51单片机IO口介绍

    文章目录 前言 1.内存空间 2.引脚 2.1 复位引脚 2.2 晶振 2.3 第二引脚功能 2.4 30管脚ALE 2.5 EA 2.6 GPIO 前言 本文介绍51单片的管脚 1.内存空间 C51 ...

  6. c语言单片机驱动数码管程序,51单片机IO口直接驱动LED数码管方法

    1.实验任务 如图13所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个共阴数码管的a-h的笔段上,数码管的公共端接地.在数码管上循环显示0-9数字,时间间隔0.2秒. 2.电路原 ...

  7. 51单片机c语言io口程序,51单片机IO口直接驱动LED数码管方法

    1.实验任务 如图13所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个共阴数码管的a-h的笔段上,数码管的公共端接地.在数码管上循环显示0-9数字,时间间隔0.2秒. 2.电路原 ...

  8. 51单片机有几个通用io口_51单片机IO口的四种使用方法

    原标题:51单片机IO口的四种使用方法 传统51单片机IO接口只可以作为标准双向IO接口,如果用其来驱动LED只能用灌电流的方式或是用三极管外扩驱动电路. 灌电流方式 LED正极接VCC,负极接IO口 ...

  9. 单片机c语言怎么把p0口换p1口,关于51单片机P0口的结构及上拉问题

    1.P0作为地址数据总线时,V1和V2是一起工作的,构成推挽结构.高电平时,V1打开,V2截止:低电平时,V1截止,V2打开.这种情况下不用外接上拉电阻.而且,当V1打开,V2截止,输出高电平的时候, ...

最新文章

  1. 算法应用与加速器系统架构的碰撞:AI软硬结合的方向怎么走?
  2. Linux学习之CentOS(七)--CentOS下j2ee环境搭建
  3. (12)调用门阶段测试
  4. Xilinx IP解析之Processor System Reset v5.0
  5. 用WPF做了几个小游戏
  6. Arcgis for javascript不同的状态下自定义鼠标样式
  7. 某储云商城系统源码V1.782 绿色版
  8. 【转载】C#反射 获取程序集信息和通过类名创建类实例(转载)
  9. VMware Workstation 12 Pro 安装mac系统中遇到的一些问题:
  10. CleanMyMac X2022纯净版苹果电脑管家
  11. PS2022丨Photoshop 2022软件下载+Ps安装教程
  12. excel数据库_如何通过INTOUCH组态软件做EXCEL报表(含代码)
  13. linux svn安装教程
  14. winpe修复改linux工具,巧用WinPE修复故障系统的解决方法
  15. 计算机主机有异响,电脑主机有异响怎么办?电脑主板有异响的原因和解决方法...
  16. 植发搞笑图片_搞笑:终于找到原图了!像不像?
  17. [AHK]为通达信画线工具中的文字注释功能增加热键
  18. 关于Java中抽象类和接口的一点思索
  19. 2021.06.03邮票面值设计
  20. buu-crypto-yxx-异性相吸

热门文章

  1. 网格布局之合并单元格
  2. java 将jso 格式的字符串转换为ListMapString,String
  3. Matlab/Simulink六自由度机器人运动学与控制系统仿真(二)【附源文件】
  4. java面试高频点深入第三期
  5. CentOS Linux release 7.8.2003 系统上部署KVM系统
  6. rtl8188cus移植
  7. 太阳镜颜色深浅有考究
  8. 无人商店是“风口”吗? 风险与机遇并存!
  9. 编写程序模拟两个村庄共用同一口井水,编写一个Village类
  10. wzz24_0604