我是靠谱客的博主 复杂白羊,这篇文章主要介绍51单片机——IO口IO口分类单片机控制IO口输入与输出小项目,现在分享给大家,希望可以做个参考。

IO口分类

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

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

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

复制代码
1
2
3
4
5
6
7
8
9
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口组的具体某个口对应的内存地址映射到某个变量

代码实例

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
#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口连接的外部模块

代码实例

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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-灯的闪烁

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#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-按键控制灯

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#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的电平,也相当于是一个记录状态位的操作

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#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口IO口分类单片机控制IO口输入与输出小项目的全部内容,更多相关51单片机——IO口IO口分类单片机控制IO口输入与输出小项目内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部