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;}}}
}
相关文章:
51单片机IO口控制
51单片机IO口控制 1.点亮LED灯 原理:根据电路图,指向IO口的引脚;拉低电平,灯亮、 如图: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zfco4IjK-1690308697530)(C:/Users/xie19/Pictur…...

ERROR 1064 - You have an error in your SQL syntax;
ERROR 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near (/, 少个逗号吧,以前开始写SQL,特别是修改SQL的时候容易出现这样错误。 而且自己也知道在附近…...
leetcode做题笔记46
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 思路一:回溯 void swap(int *nums,int index1,int index2) {int temp nums[index1];nums[index1] nums[index2];nums[index2] temp; }void prem(int* nu…...
快问快答JS面向对象面试题
1、说说你对闭包的理解 使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用…...
googlenet论文理解
参考文章:https://www.cnblogs.com/czy4869/p/8977788.html 以及下面这篇的前几行让我弄懂了论文里说的稀疏性和计算性能兼顾:参考文章:https://blog.csdn.net/weixin_52121118/article/details/119740279...

OnnxRuntime TensorRT OpenCV::DNN性能对比(YoloV8)实测
1. 前言 之前把ORT的一套推理环境框架搭好了,在项目中也运行得非常愉快,实现了cpu/gpu,fp32/fp16的推理运算,同onnx通用模型在不同推理框架下的性能差异对比贴一下,记录一下自己对各种推理框架的学习状况 YoloV8模型大小 模型名称参数量NANO3.2M...... 2. CPU篇 CPU推理框架性…...

【QT 网络云盘客户端】——获取用户文件列表信息
目录 1.获取用户文件列表信息分析 2.设置图标属性 3.向服务器获取文件的数量 4.向服务器获取文件信息列表 4.显示图标 1.获取用户文件列表信息分析 1.将QListWidget设置为图标模式 2. 当我们点击"按下载量升序","按下载量降序",“更新” 菜单选项 都会…...

从0到1,无代码开发如何简化产品创新流程
在当今竞争激烈的市场环境中,产品创新已经成为企业成功的关键因素之一。为了在市场上保持竞争力,企业需要不断地推出新产品或改进现有产品。然而,传统的开发流程往往耗时费力,且成本高昂。因此,简化产品创新流程成为了…...

select、epoll 的快速核心理解
一、 select 最low的就是在用户代码中自旋实现所有阻塞socket的监听。但是每次判断socket是否产生数据,都涉及到用户态到内核态的切换。 于是select改进:将fd_set传入内核态,由内核判断是否有数据返回; 然后最low的只能使用自旋…...
HTTP和HTTPS的区别
一、两者概念 1.1 HTTP概念 HTTP 的全称是超文本传输协议(HyperText Transfer Protocol) 是一种用于分布式、协作式和超媒体信息系统的应用协议,简单来说就是一种分布和接收HTML页面的方法,被用于在Web浏览器和网站服务器之间传递…...
分布式异步任务处理组件(二)
一些关键点的设计脑暴记录----very important!!! 首先,任务存储交给kafka,由节点负责写入kafka,acks1;失败重试;透传kafka的提交可靠性,保证任务提交成功;后…...

Jenkins 拉取 GitHub 私有仓库失败问题
添加仓库的时候提示 stderr: fatal: Cannot prompt because user interactivity has been disabled. 把在 GitHub账户设置中生成的个人访问令牌填到地址里...
小程序 多层次对象数组的赋值、动态赋值
1、给对象赋值 data: {form: {Name: ,IDCard: ,Sex: ,}},对单个属性赋值 this.setData({form.Name:章三,[form.Sex]:女,}) 动态赋值 onChangeDate(e) {let field e.currentTarget.dataset.field;this.setData({[form.${field}]: e.detail.data})}, field 是wxml上通过dat…...
angular踩坑
1 新版路由守卫由于canActivate已被废弃,采用函数函数,但其参数中无法像类一样进行路由对象注入,如何实现路由首位中的页面跳转? import { CanActivateFn,Router,ActivatedRouteSnapshot, RouterStateSnapshot,} from angular/ro…...

C#时间轴曲线图形编辑器开发1-基本功能
目录 一、前言 1、简介 2、开发过程 3、工程下载链接 二、基本功能实现 1、绘图面板创建 (1)界面布置 (2)显示面板代码 (3) 面板水平方向、竖直方向移动功能实现 (4)面板放…...

elasticsearch查询操作(DSL语句方式)
说明:本文介绍在kibana,es的可视化界面上对文档的查询操作; 添加数据 先使用API,创建索引库,并且把数据从MySQL中查出来,传到ES上,参考(http://t.csdn.cn/NaTHg) 索引库…...

JavaScript详解
目录 一、JavaScript是什么? 1.1、JavaScript 和 HTML 和 CSS 之间的关系 1.2、JavaScript 运行过程 1.3、JavaScript 的组成 二、JavaScript 的书写形式 1. 行内式 2. 内嵌式 3、外部式 注释 三、输入输出 输入: prompt 输出: alert 输出: …...

电缆振荡波局部放电检测定位技术
电缆振荡波检测技术主要用于交联聚乙烯电力电缆检测,是属于离线检测的一种有效形式 。该技术基于LCR阻尼振荡原理,在完成电缆直流充电的基础上,通过内置的高压电抗器、高压实时固态开关与试品电缆形成阻尼振荡电压波,在试品电缆上…...

AI Chat 设计模式:10. 组合模式
本文是该系列的第八篇,采用问答式的方式展开,问题由我提出,答案由 Chat AI 作出,灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 给我介绍一下组合模式A.1Q.2 好的,给我举一个组合模式的例子,使…...

【Nginx12】Nginx学习:HTTP核心模块(九)浏览器缓存与try_files
Nginx学习:HTTP核心模块(九)浏览器缓存与try_files 浏览器缓存在 Nginx 的 HTTP 核心模块中其实只有两个简单的配置,这一块也是 HTTP 的基础知识。之前我们就一直在强调,学习 Nginx 需要的就是各种网络相关的基础知识&…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...