51单片机——IO口

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键打开报警器

小喇叭

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

  • 5
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做台无人机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值