给单片机检测io口高低电平其中一个IO口赋0x01,会输出高电平吗?

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和sbitIO口的高低电平相当于就是对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键打开报警器小喇叭小喇叭和继电器和电池,组成报警模块,如果简易报警器处于打开状态,振动模块感应到振动就会,打开继电器,从而报警;如果简易报警器处于关闭状态,继电器是关闭的,振动模块就算感应到振动也不会报警

我要回帖

更多关于 单片机检测io口高低电平 的文章