51单片机IO口控制
1.点亮LED灯
原理:根据电路图,指向IO口的引脚;拉低电平,灯亮、
如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zfco4IjK-1690308697530)(C:/Users/xie19/Pictures/Camera Roll/屏幕截图 2023-07-19 014128.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ldzpl4XB-1690308697531)(C:/Users/xie19/Pictures/Camera Roll/屏幕截图 2023-07-19 014157.png)]
#include "reg52.h"sbit ledOne=P3^7;//根据电路图指定引脚
sbit ledTwo=P3^6;void main()
{ledOne=0; ledTwo=0;//拉低电平,灯亮
}
2.LED灯闪烁
原理:根据延时实现LED灯闪烁的效果;也要根据原理图指定引脚
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TpMUOFiQ-1690308697532)(C:/Users/xie19/Pictures/Camera Roll/屏幕截图 2023-07-19 014128.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ntz7JKWI-1690308697533)(C:/Users/xie19/Pictures/Camera Roll/屏幕截图 2023-07-19 014157.png)]
#include "reg52.h"
#include "intrins.h"sbit ledOne=P3^7; //根据电路图指定引脚
sbit ledTwo=P3^6;void Delay500ms() //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 4;j = 129;k = 119;do{do{while (--k);} while (--j);} while (--i);
}void main()
{while(1){ ledOne=0;//置低电平,点亮灯ledTwo=0;//置低电平,点亮灯Delay500ms(); ledOne=1;//置高电平,灭灯ledTwo=1;//置高电平,灭灯Delay500ms();}
}
3.按下按键点亮灯
3.1查询法控制点灯
- 怎么知道sw1按键被按下
- KEY1位置和GND接通,表现为低电平,值为0
- 怎么知道sw1按键没有被按下
- KEY1位置通过上拉电阻到5V,表现为高电平,值为1
通过下图得知
同理LED的分析,
KEY1接到STC89C52RC的P2.1口,我们只要不断检测P2.1口的值(0-按下,1-松开)就知道按键是否被按下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sYDfhi4N-1690308697533)(C:/Users/xie19/Pictures/Camera Roll/屏幕截图 2023-07-19 015556.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t82sTeun-1690308697534)(C:/Users/xie19/Pictures/Camera Roll/屏幕截图 2023-07-19 015619.png)]
/*
实现功能,按下按键一点亮灯
*/#include "reg52.h"
#include "intrins.h"sbit ledOne=P3^7; //根据电路图指定引脚
sbit key1=P2^1;void main()
{while(1){ if(key1==0) //KEY1位置和GND接通,表现为低电平,值为0{ledOne=0; 灯亮,给一个P3.7低电平} }
}
/*实现功能:按下按键一,LED亮;按下按键二,lED灭*/#include "reg52.h"
#include "intrins.h"sbit ledOne =P3^7; //根据电路图指定引脚
sbit key1 =P2^1;
sbit key2 =P2^0;void main()
{while(1){ if(key1==0) //KEY1位置和GND接通,表现为低电平,值为0{ledOne=0; //灯亮,给一个P3.7低电平} if(key2==0){ledOne=1; //灯灭,给一个P3.7低电平} }
}
/*按下按键一,两盏灯亮;按下按键二,两盏灯灭;
*/#include "reg52.h"
#include "intrins.h"sbit ledOne =P3^7; //根据电路图指定引脚
sbit ledTwo =P3^6;
sbit key1 =P2^1;
sbit key2 =P2^0;void main()
{while(1){ if(key1==0) //KEY1位置和GND接通,表现为低电平,值为0{ledOne=0; //灯亮,给一个P3.7低电平ledTwo=0;} if(key2==0){ledOne=1; //灯灭,给一个P3.7低电平ledTwo=1;} }
}
3.2软件消抖
软件消抖:为了防止开发板遭遇抖动导致灯亮灭(不是人为导致的);这里用延时,更科学的方法应该是用定时器。
#include "reg52.h"
#include "intrins.h"sbit ledOne =P3^7; //根据电路图指定引脚
sbit key1 =P2^1;
sbit key2 =P2^0;void Delay500us() //@11.0592MHz
{unsigned char i;_nop_();i = 227;while (--i);
}void main()
{while(1){ if(key1==0) //KEY1位置和GND接通,表现为低电平,值为0{Delay500us();//这里延时一下,防止意外抖动,软件消抖if(key1==0){ ledOne=0; //灯亮,给一个P3.7低电平} } if(key2==0){Delay500us();//这里延时一下,防止意外抖动,软件消抖if(key2==0){ ledOne=1; //灯灭,给一个P3.7低电平} } }
}
3.3IO口翻转(有一些代码会这么写)
#include "reg52.h"
#include "intrins.h"sbit ledOne =P3^7; //根据电路图指定引脚
sbit key1 =P2^1;
sbit key2 =P2^0;void Delay500us() //@11.0592MHz
{unsigned char i;_nop_();i = 227;while (--i);
}void main()
{ledOne=1;while(1){ if(key1==0) //KEY1位置和GND接通,表现为低电平,值为0{Delay500us();//这里延时一下,防止意外抖动,软件消抖if(key1==0){ ledOne=!ledOne; //灯亮,给一个P3.7低电平(取反,也可以叫IO口状态翻转)} } if(key2==0){Delay500us();//这里延时一下,防止意外抖动,软件消抖if(key2==0){ ledOne=1; //灯灭,给一个P3.7低电平} } }
}
3.4.记录状态位点灯
状态位的作用是:当按键被按下时,不着急点灯,在这里记下状态,在别的地方点灯;当业务比较复杂时,可以在当下记下状态,在别的地方实现;
#define的作用主要是让没有意义的数据变得有意义,让代码的可读性更好。
#include "reg52.h"
#include "intrins.h"#define off_status 0
#define on_status 1 sbit ledOne =P3^7; //根据电路图指定引脚
sbit key1 =P2^1;
sbit key2 =P2^0;void Delay500us() //@11.0592MHz
{unsigned char i;_nop_();i = 227;while (--i);
}void main()
{int ledMark=off_status;ledOne=1;while(1){ if(key1==0) //KEY1位置和GND接通,表现为低电平,值为0{Delay500us();//这里延时一下,防止意外抖动,软件消抖if(key1==0){ ledMark=on_status;//当按键被按下,记录状态位在别的地方点灯,适用与业务场景复杂;} } if(key2==0){Delay500us();//这里延时一下,防止意外抖动,软件消抖if(key2==0){ ledMark=off_status;} }if(ledMark==on_status){ledOne=0;}else{ledOne=1;} }
}
4.震动传感器点灯
原理:当输出低电平的时候,震动,点亮灯
#include "reg52.h"
#include<intrins.h>sbit led1=P3^7;
sbit virbrate=P3^3;void Delay2000ms() //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 15;j = 2;k = 235;do{do{while (--k);} while (--j);} while (--i);
}void main()
{while(1){if(virbrate==0) //模块说明,D0输出低电平震动{led1=0;Delay2000ms();led1=1;} else{led1=1;} } }
5.震动控制继电器
继电器:电子开关
#include "reg52.h"
#include<intrins.h>sbit switcher=P1^1;
sbit vibrate = P3^3;void Delay2000ms() //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 15;j = 2;k = 235;do{do{while (--k);} while (--j);} while (--i);
}void main()
{while(1){if(vibrate==0) //模块说明,D0输出低电平震动{switcher=0;//当发生震动适合,导通继电器,给继电器IN一个低电平Delay2000ms();switcher=1;//高电平,继电器N0和COM不通} else{switcher=1;} } }
6.按键控制继电器开关
#include "reg52.h"
#include<intrins.h>sbit key1 =P2^1;
sbit key2 =P2^0;
sbit switcher =P1^1;void main()
{while(1){if(key1==0) //模块说明,D0输出低电平震动{switcher=0;//当发生震动适合,导通继电器,给继电器IN一个低电平} if(key2==0){switcher=1;} } }
7.433M控制继电器开关
按下A按键,继电器亮;按下B按键,继电器灭;
#include "reg52.h"
#include<intrins.h>sbit D0_ON =P1^2;
sbit D1_OFF =P1^3;
sbit switcher =P1^1;void main()
{//查询方式哪个按键被按下 while(1){if(D0_ON==1) //收到遥控信号A,D0表现为高电平{switcher=0;//A被按下,我们导通继电器,给继电器IN一个低电平} if(D1_OFF==1)//收到遥控信号C,D1表现为高电平{switcher=1;//B被按下,我们不导通继电器,给继电器IN一个高电平} } }
8.电动车简易报警器
硬件模块:51单片机,震动传感器,喇叭,继电器,433M模块
#include "reg52.h"
#include<intrins.h>#define J_ON 1
#define J_OFF 0
sbit switcher = P1^0;
sbit D0_ON = P1^1;
sbit D1_OFF = P1^2;
sbit vibrate = P1^3;void Delay2000ms() //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 15;j = 2;k = 235;do{do{while (--k);} while (--j);} while (--i);
}
void Delay500ms() //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 4;j = 129;k = 119;do{do{while (--k);} while (--j);} while (--i);
}
void main()
{int mark = J_OFF;while(1){//1. 如果a按键被按下,设定为开启警报模式if(D0_ON == 1){//长响,表示进入警报模式switcher = 0;Delay2000ms();switcher = 1;//设定警报模式标记mark = J_ON ;}//2. 如果b按键被按按下,设定为关闭警报模式if(D1_OFF == 1){//短响,表示进入解除警报模式switcher = 0;Delay500ms();switcher = 1;//设定警报解除模式标记mark = J_OFF ;}//3. 如果标记是在警报模式下if(mark == J_ON){//3.1 如果发生了震动if(vibrate == 0){//喇叭响,给继电器低电平,导通switcher = 0;}//3.2 如果不发生震动else{//喇叭不响,给继电器高电平,不导通switcher = 1;}}}
}