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)]
c
#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;
}
}
}
}