当前位置: 首页 > news >正文

51单片机IO口控制

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;}}}
}
http://www.lryc.cn/news/99245.html

相关文章:

  • ERROR 1064 - You have an error in your SQL syntax;
  • leetcode做题笔记46
  • 快问快答JS面向对象面试题
  • googlenet论文理解
  • OnnxRuntime TensorRT OpenCV::DNN性能对比(YoloV8)实测
  • 【QT 网络云盘客户端】——获取用户文件列表信息
  • 从0到1,无代码开发如何简化产品创新流程
  • select、epoll 的快速核心理解
  • HTTP和HTTPS的区别
  • 分布式异步任务处理组件(二)
  • Jenkins 拉取 GitHub 私有仓库失败问题
  • 小程序 多层次对象数组的赋值、动态赋值
  • angular踩坑
  • C#时间轴曲线图形编辑器开发1-基本功能
  • elasticsearch查询操作(DSL语句方式)
  • JavaScript详解
  • 电缆振荡波局部放电检测定位技术
  • AI Chat 设计模式:10. 组合模式
  • 【Nginx12】Nginx学习:HTTP核心模块(九)浏览器缓存与try_files
  • 【1】-Locust性能测试工具介绍与安装
  • 基于拉格朗日-遗传算法的最优分布式能源DG选址与定容(Matlab代码实现)
  • 【已解决】jupyter notebook里已经安装了第三方库,还是提示导入失败
  • Mybatis使用collection映射一对多查询分页问题
  • Linux/Windows路由管理
  • openpnp - 设备矫正的零碎记录
  • Linux内核中的链表、红黑树和KFIFO
  • 【C++】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动
  • Android 设备兼容性使用(详细版)
  • React 中的常见 API 和生命周期函数
  • 神经网络中遇到的 python 函数(Pytorch)