蓝桥杯----锁存器、LED、蜂鸣器、继电器、Motor

   (七)、锁存器

 1、原理

      蓝桥杯中数据传入口都是P0,也就是数码管段选、位选数据、LED亮灭的数据、蜂鸣器启动或禁用的数据,外设启动或者关闭都需要通过P0写入数据,那么如何这样共用一个端口会造成冲突嘛,答案是肯定的。所以蓝桥杯加入了锁存器---通过P2高三位(22、21、20)操作。如图 三十LED锁存器对应地址为Y4C,凑成高三位数据100,后五位自动补零,P2对应数据1000 0000(用十六进制表示0x80)。Y5C对应数据就是1010 0000(0xa0)…

  2、代码示范与解读

 如 图 三十一,首先定义一个temp临时变量,再在P0口传入数据

P2 & 0x1f就是保留低五位,单独使高三位全为0,因为高三位才是锁存器的选择位。

再单独改变temp = temp | 0x80,0x80是刚刚推出来的数据,这样|上,就是单独修改了高三位,低五位 保持不变。再将数据放入P2中,此时P0中数据就已经传入了。

最后我们temp = P2 & 0x1f就是清空高三位,P2 = temp关闭锁存器。注意如果此时不关闭锁存器,那么一旦有数据传入P0就会被立即写入。

对这个代码进行推广,只需改变0x80那个位置的数据即可,假设想操作数码管位选的锁存器Y6C,可知为1100 0000(即为0xc0),将0x80改成0xc0就可以传入数码管位选数据了。

                        图 三十 LED原理图

            

                 图 三十一  借助锁存器写入数据

(八)、LED

 1、原理(图 三十)

        在P00-P07口传入数据,对应第一盏灯到第八盏灯,打开锁存器,就可以实现LED亮灭了。由原理图可知,为共阳极接法,当P0端口传入低电平数据时,就点亮LED了。注意51单片机LED亮灭可能不同。

 2、代码解读(图 三十二)

        定义一个数组,传入LED亮灭的数据,1为亮表示使能,0为灭表示失能

       定义两个变量,temp_1与temp_1_old,只有这两者不相等时操作寄存器(改变)写入,temp_1存放亮灭的八位数据。

       LED_Buf[0]<<0就是将第一个灯数据左移0位,放在temp_1的最低位,就是操作P00第一个灯。LED_Buf[1]<<1就是把第二个灯数据按二进制左移1位,放在temp_1的Bit2位…

       有改变发生,两者不同了,写入数据,记住低电平点亮灯,所以要取反,在打开LED的锁存器,更新temp_1_old的值。

      在主程序中我们可以打开定时器0,写一个1ms中断函数,在中断中扫描这个函数。

                   图 三十二 LED代码解读

(九)、继电器、蜂鸣器、Motor

  1、原理(图 三十三)

      最左边P01~P07是数据输入端口,最右边Relay就是对应继电器,Motor就是发动机,Buzz对应蜂鸣器,低电平0就是打开这个设备,但是ULN2003设备在中间会对数据进行取反,所以打开Relay数据为 空一位011 1111,对应最左边数据为 0001 0000,即为0x10。同理打开蜂鸣器即为0x40,打开Motor即为0x20。

                    图 三十三 外设原理图

               

 2、代码解读(图 三十四 )

     开局必须定义两个全局变量为蜂鸣器、继电器、发动机共用,防止不同变量操作对其他设备影响。

     当Flag为1时,必须单独变化第四位为1,其余的不变,用 | 操作符来实现,|上0这一位就是保持不变,|上1就是强制为1。当Flag为1时,第四位为0,其余的不变,用 & 符来实现。

    temp_2就是临时数据值,temp_2_Old就是记录上一个状态的值,不相同说明状态发生了改变,将数据传入P0端,打开锁存器即可。

                图 三十四 代码解读(继电器)

 3、代码推广(图 三十五、图 三十六)

   将0x10改为0x40就是单独打开蜂鸣器代码,改成0x20就是启动Motor电机代码,电机适用于设计PWM波形的。一般来说只考继电器在特定条件下打开与关闭。

                  图 三十五 蜂鸣器推广代码

                      图 三十六 Motor推广代码

4、提供参考代码,希望对读者有帮助

#include <STC15F2K60S2.H>idata unsigned char temp_1 = 0x00;
idata unsigned char temp_old_1 = 0xff;
void LED_Disp(unsigned char *LED_Buf)   //传入LED数据数组,1亮、0灭
{unsigned char temp; temp_1 = 0x00;temp_1 = (LED_Buf[0]<<0) | (LED_Buf[1]<<1) |(LED_Buf[2]<<2) |(LED_Buf[3]<<3) |(LED_Buf[4]<<4) |(LED_Buf[5]<<5) |(LED_Buf[6]<<6) |(LED_Buf[7]<<7);    //通过一个数组传入8个LED灯的数据  //LED_Buf[0]<<0,假设第一个数据为1,数据<<(按位左移)0就是让Bit1为1//LED_Buf[1]<<1,假设第一个数据为1,数据<<(按位左移)1就是让Bit2为1if(temp_1 != temp_old_1)  //数据改变{P0 = ~temp_1;    //一定记得取反temp = P2 & 0x1f;temp = temp | 0x80;   //操作Led灯的锁存器P2 = temp;temp = P2 & 0x1f;P2 = temp;temp_old_1 = temp_1;   //更新temp_old_1}
}idata unsigned char temp_2 = 0x00;
idata unsigned char temp_2_old = 0xff;//继电器操作函数
void Relay_Disp(unsigned char Flag)
{unsigned char temp;if(Flag)temp_2 |= 0x10;elsetemp_2 &= ~0x10;if(temp_2 != temp_2_old){P0 = temp_2;temp = P2 & 0x1f;temp = temp | 0xa0;P2 = temp;temp = P2 & 0x1f;P2 = temp;temp_2_old = temp_2;}
}//蜂鸣器操作函数
void Beep_Disp(unsigned char Flag)
{unsigned char temp;if(Flag)temp_2 |= 0x40;elsetemp_2 &= ~0x40;if(temp_2 != temp_2_old){P0 = temp_2;temp = P2 & 0x1f;temp = temp | 0xa0;P2 = temp;temp = P2 & 0x1f;P2 = temp;temp_2_old = temp_2;}
}//Motor操作函数
void Motor_Disp(unsigned char Flag)
{unsigned char temp;if(Flag)temp_2 |= 0x20;elsetemp_2 &= ~0x20;if(temp_2 != temp_2_old){P0 = temp_2;temp = P2 & 0x1f;temp = temp | 0xa0;P2 = temp;temp = P2 & 0x1f;P2 = temp;temp_2_old = temp_2;}
}

5、提供定时器1代码与中断

//定时器一初始化,自己加上EA = 1;ET1 = 1;
void Timer1_Init(void)		//1毫秒@12.000MHz
{AUXR &= 0xBF;			//定时器时钟12T模式TMOD &= 0x0F;			//设置定时器模式TL1 = 0x18;				//设置定时初始值TH1 = 0xFC;				//设置定时初始值TF1 = 0;				//清除TF1标志TR1 = 1;				//定时器1开始计时EA = 1;                 //打开总中断ET1 = 1;                //打开定时器一中断允许位
}void Timer1_Routine() interrupt 3
{
LED_Disp(LED_Buf);         //LED扫描
}

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92727.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI热点周报(8.3~8.9):OpenAI重返开源,Anthropic放大招,Claude4.1、GPT5相继发布

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录一、OpenAI的"开源回归"&#xff1a;时隔5年的战略大转弯1. GPT-OSS系列&a…

《Kubernetes部署篇:基于x86_64+aarch64架构CPU+containerd一键离线部署容器版K8S1.33.3高可用集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要针对不同的客户环境部署基于containerd容器版 K8S 1.33.3集群&a…

Linux抓包命令tcpdump详解笔记

文章目录一、tcpdump 是什么&#xff1f;二、基本语法三、常用参数说明四、抓包示例&#xff08;通俗易懂&#xff09;1. 抓所有数据包&#xff08;默认 eth0&#xff09;2. 指定接口抓包3. 抓取端口 80 的数据包&#xff08;即 HTTP 请求&#xff09;4. 抓取访问某个 IP 的数据…

抖音、快手、视频号等多平台视频解析下载 + 磁力嗅探下载、视频加工(提取音频 / 压缩等)

跟你们说个安卓上的下载工具&#xff0c;还挺厉害的。它能支持好多种下载方式&#xff0c;具体多少种我没细数&#xff0c;反正挺全乎的。​ 平时用得最多的就是视频解析&#xff0c;像抖音、快手、B 站上那些视频&#xff0c;想存下来直接用它就行&#xff0c;连海外视频的也能…

【iOS】JSONModel源码学习

JSONModel源码学习前言JSONModel的使用最基础的使用转换属性名称自定义错误模型嵌套JSONModel的继承源码实现initWithDictionaryinit__doesDictionaryimportDictionary优点前言 之前了解过JSONModel的一些使用方法等&#xff0c;但是对于底层实现并不清楚了解&#xff0c;今天…

SmartMediaKit 模块化音视频框架实战指南:场景链路 + 能力矩阵全解析

✳️ 引言&#xff1a;从“内核能力”到“模块体系”的演进 自 2015 年起&#xff0c;大牛直播SDK&#xff08;SmartMediaKit&#xff09;便致力于打造一个可深度嵌入、跨平台兼容、模块自由组合的实时音视频基础能力框架。经过多轮技术迭代与场景打磨&#xff0c;该 SDK 已覆…

【第5话:相机模型1】针孔相机、鱼眼相机模型的介绍及其在自动驾驶中的作用及使用方法

相机模型介绍及相机模型在自动驾驶中的作用及使用方法 相机模型是计算机视觉中的核心概念&#xff0c;用于描述真实世界中的点如何投影到图像平面上。在自动驾驶系统中&#xff0c;相机模型用于环境感知&#xff0c;如物体检测和场景理解。下面我将详细介绍针孔相机模型和鱼眼相…

推荐一款优质的开源博客与内容管理系统

Halo是一款由Java Spring Boot打造的开源博客与内容管理系统&#xff08;CMS&#xff09;&#xff0c;在 GitHub上拥有超过36K Start的活跃开发者社区。它使用GPL‑3.0授权开源&#xff0c;稳定性与可维护性极高。 Halo的设计简洁、注重性能&#xff0c;同时保持高度灵活性&a…

【GPT入门】第43课 使用LlamaFactory微调Llama3

【GPT入门】第43课 使用LlamaFactory微调Llama31.环境准备2. 下载基座模型3.LLaMA-Factory部署与启动4. 重新训练![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e7aa869f8e2c4951a0983f0918e1b638.png)1.环境准备 采购autodl服务器&#xff0c;24G,GPU,型号3090&am…

计算机网络:如何理解目的网络不再是一个完整的分类网络

这一理解主要源于无分类域间路由&#xff08;CIDR&#xff09;技术的广泛应用&#xff0c;它打破了传统的基于类的IP地址分配方式。具体可从以下方面理解&#xff1a; 传统分类网络的局限性&#xff1a;在早期互联网中&#xff0c;IP地址被分为A、B、C等固定类别&#xff0c;每…

小米开源大模型 MiDashengLM-7B:不仅是“听懂”,更能“理解”声音

目录 前言 一、一枚“重磅炸弹”&#xff1a;开源&#xff0c;意味着一扇大门的敞开 二、揭秘MiDashengLM-7B&#xff1a;它究竟“神”在哪里&#xff1f; 2.1 “超级耳朵” 与 “智慧大脑” 的协作 2.2 突破&#xff1a;从 “听见文字” 到 “理解世界” 2.3 创新训练&a…

mysql出现大量redolog、undolog排查以及解决方案

排查步骤 监控日志增长情况 -- 查看InnoDB状态 SHOW ENGINE INNODB STATUS;-- 查看redo log配置和使用情况 SHOW VARIABLES LIKE innodb_log_file%; SHOW VARIABLES LIKE innodb_log_buffer_size;-- 查看undo log信息 SHOW VARIABLES LIKE innodb_undo%;检查长时间运行的事务 -…

华为网路设备学习-28(BGP协议 三)路由策略

目录&#xff1a; 一、BGP路由汇总1、注&#xff1a;使用network命令注入的BGP不会被自动汇总2、主类网络号计算过程如下&#xff1a;3.示例 开启BGP路由自动汇总bgp100 开启BGP路由自动汇总import-route 直连路由 11.1.1.0 /24对端 为 10.1.12.2 AS 2004.手动配置BGP路…

微信小程序中实现表单数据实时验证的方法

一、实时验证的基本实现思路表单实时时验证通过监听表单元素的输入事件&#xff0c;在用户输入过程中即时对数据进行校验&#xff0c;并并即时反馈验证结果&#xff0c;主要实现步骤包括&#xff1a;为每个表单字段绑定输入事件在事件处理函数中获取当前输入值应用验证规则进行…

openpnp - 顶部相机如果超过6.5米影响通讯质量,可以加USB3.0信号放大器延长线

文章目录openpnp - 顶部相机如果超过6.5米影响通讯质量&#xff0c;可以加USB3.0信号放大器延长线概述备注ENDopenpnp - 顶部相机如果超过6.5米影响通讯质量&#xff0c;可以加USB3.0信号放大器延长线 概述 手头有1080x720x60FPS的摄像头模组备件&#xff0c;换上后&#xff…

【驱动】RK3576-Debian系统使用ping报错:socket operation not permitted

1、问题描述 在RK3576-Debian系统中,连接了Wifi后,测试网络通断时,报错: ping www.csdn.net ping: socktype: SOCK_RAW ping: socket: Operation not permitted ping: => missing cap_net_raw+p capability or setuid?2、原因分析 2.1 分析打印日志 socktype: SOCK…

opencv:图像轮廓检测与轮廓近似(附代码)

目录 图像轮廓 cv2.findContours(img, mode, method) 绘制轮廓 轮廓特征与近似 轮廓特征 轮廓近似 轮廓近似原理 opencv 实现轮廓近似 轮廓外接矩形 轮廓外接圆 图像轮廓 cv2.findContours(img, mode, method) mode:轮廓检索模式&#xff08;通常使用第四个模式&am…

mtrace定位内存泄漏问题(仅限 GNU glibc 的 Linux)

一、mtrace原理 函数拦截机制&#xff1a;mtrace 利用 glibc 的内部机制&#xff0c;对 malloc() / calloc() / realloc() / free() 等内存函数进行 hook&#xff0c;记录每一次分配和释放行为。日志记录&#xff1a;记录会写入 MALLOC_TRACE 环境变量指定的日志文件中&#xf…

高校合作 | 世冠科技联合普华、北邮项目入选教育部第二批工程案例

近日&#xff0c;教育部学位与研究生教育发展中心正式公布第二批工程案例立项名单。由北京世冠金洋科技发展有限公司牵头&#xff0c;联合普华基础软件、北京邮电大学共同申报的"基于国产软件栈的汽车嵌入式软件开发工程案例"成功入选。该项目由北京邮电大学修佳鹏副…

TOMCAT笔记

一、前置知识&#xff1a;Web 技术演进 C/S vs B/S – C/S&#xff1a;Socket 编程&#xff0c;QQ、迅雷等&#xff0c;通信层 TCP/UDP&#xff0c;协议私有。 – B/S&#xff1a;浏览器 HTTP&#xff0c;文本协议跨网络。 动态网页诞生 早期静态 HTML → 1990 年 HTTP 浏览…