51单片机IO口控制

news/2024/5/19 18:42:38

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.mrgr.cn/p/12181328

相关文章

CAN学习笔记1:计算机网络

计算机网络 1 概述 计算机网络就是把多种形式的计算机用通信线路连接起来&#xff0c;并使其能够互相进行交换的系统。实际上&#xff0c;计算机网络包括了计算机、各种硬件、各种软件、组成网络的体系结构、网络传输介质和网络通信计数。因此&#xff0c;计算机网络是计算机…

“程序员求职攻略:IT技术岗面试的必备技巧“

文章目录 每日一句正能量前言分享面试IT公司的小技巧IT技术面试有哪些常见的问题&#xff1f;分享总结遇到过的面试题后记 每日一句正能量 人活一世&#xff0c;不在乎朋友多少&#xff0c;不问财富几车&#xff0c;关键看在你最困难的时候&#xff0c;是否有一个伸出援手的人&…

直播预告 | 开源运维工具使用现状以及可持续产品的思考

运维平台自上世纪90年代开始进入中国市场&#xff0c;曾形成以传统四大外企&#xff1a;IBM、BMC、CA、HP为代表的头部厂商&#xff0c;还有一众从网管起家的国内厂商。2010年前后&#xff0c;出现了以Zabbix、Nagios、Cacti为代表的开源工具&#xff0c;后来又陆续出现了Prome…

应用无线鼠标中的2.4GHz无线收发芯片

无线键盘和无线鼠标作为现代办公环境中常见的工具&#xff0c;为我们的工作带来了便利。无线键盘和无线鼠标的工作原理都是基于无线技术实现的&#xff0c;其中常见的是2.4GHz无线技术。让我们一起来详细了解一下它们的工作原理。 无线鼠标的原理非常简单,鼠标部分工作与传统鼠…

使用docker-compose搭建lnmpr环境

源码gitee compose 使用的三个步骤&#xff1a; • 使用 Dockerfile 定义应用程序的环境。 • 使用 docker-compose.yml 定义构成应用程序的服务&#xff0c;这样它们可以在隔离环境中一起运行。 • 最后&#xff0c;执行 docker-compose up -d 命令来启动并运行整个应用程序…

C++笔记之迭代器失效问题处理

C笔记之迭代器失效问题处理 code review! 参考博文&#xff1a;CSTL迭代器失效的几种情况总结 文章目录 C笔记之迭代器失效问题处理一.使用返回新迭代器的插入和删除操作二.对std::vector 来说&#xff0c;擦除&#xff08;erase&#xff09;元素会导致迭代器失效 一.使用返回…

小白三步即可设置企业在线帮助中心?

设置企业在线帮助中心是提升客户服务质量和用户体验的重要举措。以下将介绍三个简单的步骤&#xff0c;帮助企业建立一个高效的在线帮助中心。 第一步&#xff1a;规划与设计 在设置企业在线帮助中心之前&#xff0c;需要进行一定的规划和设计工作&#xff0c;确保帮助中心能够…

Django模板语法和请求

1、在django关于模板文件加载顺序 创建的django项目下会有一个seeetings.py的文件 如果在seeetings.py 中加了 os.path.join(BASE_DIR,‘templates’)&#xff0c;如果是pycharm创建的django项目会加上&#xff0c;就会默认先去根目录找templates目录下的html文件&#xff0c…

【Linux | Shell】结构化命令2 - test命令、方括号测试条件、case命令

目录 一、概述二、test 命令2.1 test 命令2.2 方括号测试条件2.3 test 命令和测试条件可以判断的 3 类条件2.3.1 数值比较2.3.2 字符串比较 三、复合条件测试四、if-then 的高级特性五、case 命令 一、概述 上篇文章介绍了 if 语句相关知识。但 if 语句只能执行命令&#xff0c…

华为HCIP第二节-------------------------ISIS

IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO &#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP&#xff08;ConnectionLessNetwork Protocol&…

ED透明屏有哪些应用场景?

ED透明屏是一种新型的显示技术&#xff0c;它采用了电致变色技术&#xff0c;可以实现屏幕的透明显示。ED透明屏的出现&#xff0c;为我们的生活带来了许多便利和创新。 首先&#xff0c;ED透明屏可以应用于商业广告领域。 传统的广告牌往往是固定的&#xff0c;无法改变内容&…

陪诊小程序软件|陪诊系统定制|医院陪诊小程序

开发一个陪诊小程序需要投入一定的费用&#xff0c;具体金额会因项目的复杂程度、功能需求和推广政策而有所差异在投入资金之前&#xff0c;建议进行市场调研和需求分析&#xff0c;制定出合理的预算&#xff0c;并选择专业的开发团队进行合作&#xff0c;那么开发陪诊小程序需…

学习Maven Web 应用

Maven Web 应用 本章节我们将学习如何使用版本控制系统 Maven 来管理一个基于 web 的项目&#xff0c;如何创建、构建、部署已经运行一个 web 应用。 创建 Web 应用 我们可以使用 maven-archetype-webapp 插件来创建一个简单的 Java web 应用。 打开命令控制台&#xff0c;…

20.2 HTML 常用标签

1. head头部标签 <head>标签用于定义网页的头部, 其中的内容是给浏览器读取和解析的, 并不在网页中直接显示给用户. <head>标签通常包含以下一些常见的子标签: - <title>: 定义网页的标题, 在浏览器的标题栏或标签页上显示. - <meta>: 用于设置网页的…

SQL高级教程第三章

SQL CREATE DATABASE 语句 CREATE DATABASE 语句 CREATE DATABASE 用于创建数据库。 SQL CREATE DATABASE 语法 CREATE DATABASE database_name SQL CREATE DATABASE 实例 现在我们希望创建一个名为 "my_db" 的数据库。 我们使用下面的 CREATE DATABASE 语句&…

Html5播放器按钮在移动端变小的问题解决方法

Html5播放器按钮在移动端变小的问题解决方法 用手机浏览器打开酷播云视频&#xff0c;有时会出现播放器按钮太小的情况&#xff0c;此时只需在<head>中加入下面这段代码即可解决&#xff1a; <meta name"viewport" content"widthdevice-width, initia…

数字电路(一)

1、例题 1、进行DA数模转换器选型时&#xff0c;一般要选择主要参数有&#xff08; A&#xff09;、转换精度和转换速度。 A、分辨率 B、输出电流 C、输出电阻 D、模拟开关 2、下图所示电路的逻辑功能为&#xff08; B&#xff09; A、与门 B、或门 C、与非门 D、或非门 分析该…

什么是Docker

一 、什么是Docker 1.1 简介 Docker 使用 Google 公司推出的 Go 语言 (opens new window)进行开发实现&#xff0c;基于 Linux 内核的 cgroup (opens new window)&#xff0c;namespace (opens new window)&#xff0c;以及 OverlayFS (opens new window)类的 Union FS (open…

【LeetCode每日一题】——566.重塑矩阵

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 简单 三【题目编号】 566.重塑矩阵 四【题目描述】 在 MATLAB 中&…

特大消息春秋链向web4.0进军

新疆春秋文创科技股份有限公司7月28日在新疆春秋艺术博物馆召开了“春秋链开放网络白皮书”新闻发布会。 该公司CEO高建新先生介绍说&#xff1a;“筹建春秋链开放网络是新疆春秋文创科技股份有限公司未来的重要项目&#xff0c;是公司的第一个五年发展计划&#xff0c;将在未来…