蓝桥杯----锁存器、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.mfbz.cn/a/2727.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 分类刷题:611. 有效三角形的个数

题目 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3示例 2: 输入: nums [4,2,3,4] 输出: 4 解析 分析 首先明…

MATLAB深度学习之数据集-数据库构建方法详解

前言 在MATLAB中&#xff0c;训练深度学习模型时&#xff0c;数据库的构建与输入是关键十分关键的一环&#xff0c;真对不同的数据类型和训练样本&#xff0c;正确的数据构建是训练代码跑通的基本前提。 本文章主要基于matlab官方文档内容和实际应用问题、技巧进行的总结。 …

Linux《进程间通信(上)》

在以上的动静态库的章节当中我们了解了库的制作和原理&#xff0c;了解到了.o文件以及动静态库的本质上都是FLF格式的文件&#xff0c;还了解了ELF文件各个的组成部分。接下来在本篇开始我们就将学习Linux当中又一重要的章节——进程间通信。在进程间通信的学习当中我们将了解到…

Vue2博客项目笔记(完结)

this.$emit(load): 子组件负责监听,然后告诉父组件,父组件来执行 load 方法 <div ref"scroll" >ref"scroll"&#xff1a;给元素取引用名&#xff0c;在 JS 中可以通过 this.$refs.scroll 拿到这个元素 <slot></slot> :用于把父组件传入的…

WinForm之ListView 组件

在 WinForm 中&#xff0c;ListView是用于展示列表型数据的灵活控件&#xff0c;支持多种视图模式&#xff08;如详情列表、图标、列表等&#xff09;&#xff0c;可展示带有图标、多列属性的项目&#xff08;如文件列表、产品信息&#xff09;&#xff0c;兼具展示和交互功能&…

2025年渗透测试面试题总结-01(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 常见面试题 一、有趣的挖洞经历 二、高频漏洞及修复方案 三、渗透工具链及特点 四、WAF绕过技术 五、系…

C++(线程)

一、线程1、线程构造函数类模板原型&#xff1a;template <class Fn, class... Args>explicit thread (Fn&& fn, Args&&... args);1&#xff09;thread&#xff08;线程的构造函数&#xff09;格式&#xff1a;#include <thread>thread 线程名(回调…

cf.训练

1. Buying Lemonade Buying Lemonade 解题思路&#xff1a; 排序&#xff1a;将插槽的罐数 a 从小到大排序&#xff08;sort(a, an)&#xff09;。 特殊情况处理&#xff1a; 若最小罐数足够大&#xff08;a[0] > k/n 且 k%n0&#xff09;或 k1&#xff0c;直接输出 k&…

JAVA无人共享球杆柜系统球杆柜租赁系统源码支持微信小程序

JAVA无人共享球杆柜系统&#xff1a;物联网小程序打造高尔夫租赁新体验市场机遇与行业痛点1. 高尔夫球杆租赁市场蓝海市场规模快速增长&#xff1a;2023年中国高尔夫球杆行业市场规模达到14.77亿元&#xff0c;预计2024年将突破15.75亿元。全球高尔夫装备市场2024年达到132.6亿…

uniapp Android App集成支付宝的扫码组件mPaaS

第一步&#xff0c;设置包名&#xff0c;下载插件导项目中 在manifest.json中添加package, 设置完指定的包名后&#xff1a;Hbuilderx打包时包名也会变化 变成 下载插件导项目中&#xff0c; 第二步&#xff1a;进入阿里云mPaas后台完成代码配置&#xff0c;下载配置文件http…

Effective C++ 条款22: 将成员变量声明为private

Effective C 条款22&#xff1a;将成员变量声明为private核心思想&#xff1a;始终将成员变量声明为private&#xff0c;通过函数接口控制访问&#xff0c;提供封装弹性、精确访问控制和一致性维护点。 ⚠️ 1. 公开成员的致命缺陷 数据一致性破坏&#xff1a; class AccessPoi…

Java基础-斗地主游戏

目录 案例要求&#xff1a;​ 实现思路&#xff1a; 代码&#xff1a; Main启动类&#xff1a; Card实体类&#xff1a; Room操作类&#xff1a; 总结&#xff1a; 案例要求&#xff1a; 实现思路&#xff1a; 1构造卡牌,细节&#xff1a;实体类另设一个int类型变量表示…