蓝桥杯模块学习3——蜂鸣器与继电器

news2024/10/6 4:07:09

第一章 硬件部分

1.1 电路的组成部分

1.1.1 译码器和锁存器

具体可回顾之前LED灯的文章:
https://blog.csdn.net/weixin_63568691/article/details/130660096

1.1.2 ULN2003达林顿管

  1. 原理图:
    在这里插入图片描述
  2. 功能:
    (1)改变电路特性,以提供大电流大电压
    (2)由下图可知,ULN2003是反输出
    在这里插入图片描述
  3. 为什么要用达林顿管改变电路特性,不能直接用IO口像驱动LED灯一样 ,驱动蜂鸣器和继电器吗?(需要一定的电路知识)
    (1)使用戴维南等效法,可将单片机IO口等效为一个5V电压源和一个十分大电阻组成的二端口网络,当外部电路接入IO口时,尽管它得到的是5V的电压,但是电流十分小,导致驱动功率即能量极小,所以除了LED灯,单片机基本都是用作控制器,而不是驱动器
    (2)由于蜂鸣器和继电器需要较高的功率以支撑它们完成高频振动、产生较强的磁力,所以需要用ULN2003来驱动

1.2 整体电路理解

在这里插入图片描述
在这里插入图片描述

  1. 蜂鸣器驱动我们很好理解,J6的1脚没用,即跟LED的接法相同
  2. 至于继电器我们要先明确,VB是在蜂鸣器图中与VCC相连的,即VB=VCC,那我们就可以把继电器控制图分成两部分:
    (1)当N_RELAY为电平时,继电器有电流,自动吸合
    3.
    (2)当K1被吸合,与3脚相连,构成回路,L10灯亮
    在这里插入图片描述
  3. 其实代码跟驱动LED类似的,只不过多了个达林顿管,P0输出高电平的引脚控制蜂鸣器或继电器工作

第二章 具体实验

2.1 实验内容

  8路LED灯闪烁三次后熄灭,接着依次点亮LED灯,继电器吸合一会后断开,然后依次熄灭LED灯,蜂鸣器鸣叫一会后关闭

2.2 无操作系统代码

注:一开始接触可以就写这个代码,过省赛应该是没问题的

2.1.1 按照以上思路写的代码

// 使用程序前,将J13调整为IO模式(2-3脚短接)
#include "reg52.h"
#define u8 unsigned char
#define u16 unsigned int

sbit HC138_A2 = P2^7;
sbit HC138_A1 = P2^6;
sbit HC138_A0 = P2^5;


#define buzzer 0X01<<6//相当于二进制01000000,代表P06
#define relay  0X01<<4
#define LED_LE_ON 4//相当于Y4
#define Buzzer_Relay_LE_ON 5
#define LE_OFF 0

void HC138_Y(u8 num);
void Delay_1ms(u16 num);
// 主函数
void main(void)
{
	u8 i;
  while(1)
  { 
		//关闭蜂鸣器和继电器
		HC138_Y(Buzzer_Relay_LE_ON);
		P0=0x00;	
		//全部连续闪三下
		HC138_Y(LED_LE_ON);
    for(i=0;i<3;i++)
		{
			P0=0x00;
			Delay_1ms(300);
			P0=0xff;
			Delay_1ms(300);
		}		
		Delay_1ms(800);
		//顺序点亮
		HC138_Y(LED_LE_ON);
		for(i=0;i<=8;i++)
		{
			P0=0XFF<<i;
			Delay_1ms(100);
		}
		Delay_1ms(800);
		//继电器闭合一段时间
		HC138_Y(Buzzer_Relay_LE_ON);
		P0=relay;//realy是宏定义的01000000,即P06
		Delay_1ms(300);
		P0=0x00;
		Delay_1ms(800);
		//顺序熄灭
		HC138_Y(LED_LE_ON);
		for(i=0;i<=8;i++)
		{
			P0=~(0XFF<<i);
			Delay_1ms(100);
		}
		Delay_1ms(800);
		//蜂鸣器鸣叫一段时间
		HC138_Y(Buzzer_Relay_LE_ON);
    P0=buzzer;
		Delay_1ms(300);
		P0=0x00;
		Delay_1ms(800);
		
		HC138_Y(LE_OFF);
  }
}
/*
	输入变量:4-7
	输出变量:无
	功能:操作138译码器,4-7分别对应Y4-Y7,其余都会使译码器不起作用
*/
void HC138_Y(u8 num)
{
	 switch(num)
	 {
		 case 4:HC138_A2=1;HC138_A1=0;HC138_A0=0;break;
		 case 5:HC138_A2=1;HC138_A1=0;HC138_A0=1;break;
		 case 6:HC138_A2=1;HC138_A1=1;HC138_A0=0;break;
		 case 7:HC138_A2=1;HC138_A1=1;HC138_A0=1;break;
		 default:HC138_A2=0;HC138_A1=0;HC138_A0=0;
	 }
}
void Delay_1ms(u16 num)
{
  unsigned int i;
  while(num--)
    for(i=0; i<628; i++);
}

2.1.2 模块化

// 使用程序前,将J13调整为IO模式(2-3脚短接)
#include "reg52.h"
#define u8 unsigned char
#define u16 unsigned int

sbit HC138_A2 = P2^7;
sbit HC138_A1 = P2^6;
sbit HC138_A0 = P2^5;


#define buzzer 0X01<<6//相当于二进制01000000,代表P06
#define relay  0X01<<4
#define LED_LE_ON 4//相当于Y4
#define Buzzer_Relay_LE_ON 5
#define LE_OFF 0

void Ouput_P0(u8 channel,u8 dat);
void Delay_1ms(u16 num);
// 主函数
void main(void)
{
	u8 i;
  while(1)
  { 
		//关闭蜂鸣器和继电器
		Ouput_P0(Buzzer_Relay_LE_ON,0x00);
		//全部连续闪三下
    for(i=0;i<3;i++)
		{
			Ouput_P0(LED_LE_ON,0x00);
			Delay_1ms(300);
			Ouput_P0(LED_LE_ON,0xff);
			Delay_1ms(300);
		}		
		Delay_1ms(800);
		//顺序点亮
		for(i=0;i<=8;i++)
		{
			Ouput_P0(LED_LE_ON,0XFF<<i);
			Delay_1ms(100);
		}
		Delay_1ms(800);
		//继电器闭合一段时间
		Ouput_P0(Buzzer_Relay_LE_ON,relay);//realy是宏定义的01000000,即P06
		Delay_1ms(300);
		Ouput_P0(Buzzer_Relay_LE_ON,0x00);
		Delay_1ms(800);
		//顺序熄灭
	
		for(i=0;i<=8;i++)
		{
			Ouput_P0(LED_LE_ON,~(0XFF<<i));
			Delay_1ms(100);
		}
		Delay_1ms(800);
		//蜂鸣器鸣叫一段时间
		Ouput_P0(Buzzer_Relay_LE_ON,buzzer);
		Delay_1ms(300);
		Ouput_P0(Buzzer_Relay_LE_ON,0x00);
		Delay_1ms(800);
		
		Ouput_P0(LE_OFF,0x00);
  }
}
/*
	输入变量:4-7
	输出变量:无
	功能:操作138译码器,4-7分别对应Y4-Y7,其余都会使译码器不起作用
*/
void HC138_Y(u8 num)
{
	 switch(num)
	 {
		 case 4:HC138_A2=1;HC138_A1=0;HC138_A0=0;break;
		 case 5:HC138_A2=1;HC138_A1=0;HC138_A0=1;break;
		 case 6:HC138_A2=1;HC138_A1=1;HC138_A0=0;break;
		 case 7:HC138_A2=1;HC138_A1=1;HC138_A0=1;break;
		 default:HC138_A2=0;HC138_A1=0;HC138_A0=0;
	 }
}

/*
	输入变量:
		channel:4-7,对应Y4-Y7
		dat:0-65535,P0口输出数据
	输出变量:无
	功能:操作138译码器,同时控制P0输出
*/
void Ouput_P0(u8 channel,u8 dat)
{
	HC138_Y(channel);
	P0=dat;
}

void Delay_1ms(u16 num)
{
  unsigned int i;
  while(num--)
    for(i=0; i<628; i++);
}

2.1.2 位操作

// 使用程序前,将J13调整为IO模式(2-3脚短接)
#include "reg52.h"
#define u8 unsigned char
#define u16 unsigned int

#define buzzer 0X01<<6//相当于二进制01000000,代表P06
#define relay  0X01<<4
#define LED_LE_ON 4//相当于Y4
#define Buzzer_Relay_LE_ON 5
#define LE_OFF 0

void Ouput_P0(u8 channel,u8 dat);
void Delay_1ms(u16 num);
void Close_All(void);
// 主函数
void main(void)
{
	u8 i;
  while(1)
  { 
		//关闭蜂鸣器和继电器
		Close_All();
		//全部连续闪三下
    for(i=0;i<3;i++)
		{
			Ouput_P0(LED_LE_ON,0x00);
			Delay_1ms(300);
			Ouput_P0(LED_LE_ON,0xff);
			Delay_1ms(300);
		}		
		Delay_1ms(800);
		//顺序点亮
		for(i=0;i<=8;i++)
		{
			Ouput_P0(LED_LE_ON,0XFF<<i);
			Delay_1ms(100);
		}
		Delay_1ms(800);
		//继电器闭合一段时间
		Ouput_P0(Buzzer_Relay_LE_ON,relay);//realy是宏定义的01000000,即P06
		Delay_1ms(300);
		Ouput_P0(Buzzer_Relay_LE_ON,0x00);
		Delay_1ms(800);
		//顺序熄灭
	
		for(i=0;i<=8;i++)
		{
			Ouput_P0(LED_LE_ON,~(0XFF<<i));
			Delay_1ms(100);
		}
		Delay_1ms(800);
		//蜂鸣器鸣叫一段时间
		Ouput_P0(Buzzer_Relay_LE_ON,buzzer);
		Delay_1ms(300);
		Ouput_P0(Buzzer_Relay_LE_ON,0x00);
		Delay_1ms(800);
		
		Ouput_P0(LE_OFF,0x00);
  }
}
/*
	输入变量:4-7
	输出变量:无
	功能:操作138译码器,4-7分别对应Y4-Y7,其余都会使译码器不起作用
*/
void HC138_Y(u8 num)
{
	 switch(num)
	 {
		 case 4:P2 = (P2 & 0x1f) | 0x80;break;
		 case 5:P2 = (P2 & 0x1f) | 0xA0;break;
		 case 6:P2 = (P2 & 0x1f) | 0xC0;break;
		 case 7:P2 = (P2 & 0x1f) | 0xE0;break;
		 default:P2 = (P2 & 0x1f) | 0x00;
	 }
}

/*
	输入变量:
		channel:4-7,对应Y4-Y7
		dat:0-65535,P0口输出数据
	输出变量:无
	功能:操作138译码器,同时控制P0输出
*/
void Ouput_P0(u8 channel,u8 dat)
{
	HC138_Y(channel);
	P0 = dat;
}

/*
	输入变量:无
	输出变量:无
	功能:关闭蜂鸣器和继电器
*/
void Close_All(void)
{
	P2 = (P2 & 0x1f) | 0xA0;
	P0 = 0x00;
}
void Delay_1ms(u16 num)
{
  unsigned int i;
  while(num--)
    for(i=0; i<628; i++);
}

2.3 RTX51代码

国赛必备,优点是可以在延时的时候畅通无阻的执行其他东西

#include <rtx51tny.h>
#include <STC15F2K60S2.H>
#define u8 unsigned char
#define u16 unsigned int	

u8 l_data=0,br_data=0;
void All_Close();
void Select(u8 cs,u8 s_data);
void LED_Show(u8 l_data);
void Buzzer_Relay_Reverve(u8 ds,u8 *br_data);
void Startup() _task_ 0
{
	All_Close();
	os_create_task(1);
	os_create_task(2);
	os_create_task(3);
	os_create_task(4);
	os_delete_task(0);
}


void Main_Task() _task_ 1
{
	u8 i;
	while(1)
	{
		for(i=0;i<3;i++)
		{
			l_data = 0xff;
			os_send_signal(2);
			os_wait2(K_IVL,200);
			l_data = 0x00;
			os_send_signal(2);
			os_wait2(K_IVL,200);
		}
		os_wait2(K_IVL,800);
		
		for(i=0;i<=8;i++)
		{
			l_data = ~(0xff<<i);
			os_send_signal(2);
			os_wait2(K_IVL,200);
		}
		os_wait2(K_IVL,800);
		
		os_send_signal(3);
		os_wait2(K_IVL,500);		
		os_send_signal(3);
		os_wait2(K_IVL,800);		
		
		for(i=0;i<=8;i++)
		{
			l_data = (0xff<<i);
			os_send_signal(2);
			os_wait2(K_IVL,200);
		}
		os_wait2(K_IVL,800);

		os_send_signal(4);
		os_wait2(K_IVL,500);		
		os_send_signal(4);
		os_wait2(K_IVL,800);	
	}
}


void LED_Task() _task_ 2
{
	while(1)
	{
		os_wait1(K_SIG);
		LED_Show(l_data);
	}
}

void Relay_Task() _task_ 3
{
	while(1)
	{
		os_wait1(K_SIG);
		Select(5,br_data ^= (0x01<<4));
	}
}
void Buzzer_Task() _task_ 4
{
	while(1)
	{
		os_wait1(K_SIG);
		Select(5,br_data ^= (0x01<<6));
	}
}
/******************************/

//选择锁存器,输出数据
void Select(u8 cs,u8 s_data)
{
	P0 = s_data;
	P2 = P2 & 0x1f | (cs<<5);
	P2 &= 0x1f;
}

//关闭外设
void All_Close()
{
	//关闭蜂鸣器
	Select(5,0x00);
	//关闭LED
	Select(4,0xff);	
	//关闭数码管
	Select(7,0xff);		
}

//输入8位数据,使相应的LED灯亮,1为亮
void LED_Show(u8 l_data)
{
	Select(4,~l_data);
}


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

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

相关文章

使用Spring初始化器创建Spring Boot项目

注&#xff1a;初始化向导需要联网创建Spring Boot项目 new project 项目创建完成 resources 文件夹中目录结构&#xff1a; static &#xff1a;保存所有的静态资文件&#xff0c; js css images templates &#xff1a;保存所有的模板页面&#xff08;Spring Boot默认j…

python3 爬虫相关学习1:安装requests模块

目录 1 安装前&#xff1a;避免python2 python3 引起的问题 2 如何安装python3 2.1 直接上python3 官网下载 2.2 或者windows的话&#xff0c;microsoft store 里也可以下载 2.3 查看python版本 3 安装requests模块 3.1 很可能安装requests模块之前会遇到报错&#xff…

linux0.12-8-11-vsprintf.c

[383页] 1、 这一小节可以不看代码如何实现&#xff0c;因为标准的C库函数&#xff1b; 2、 等自己看完的这本书&#xff0c;有兴趣过来研究研究也是可以的。 8-11 vsprintf.c程序 8-11-1 功能描述 该程序主要包括vsprintf(),用于对参数产生格式化的输出。由于该函数是C函数…

SOME/IP 草稿

SOME/IP 名词解释 SOME/IP 全称是 Scalable service-Oriented MiddlewarE over IP。也就是基于 IP 协议的面向服务的可扩展性通信中间件协议。 面向服务 SOA基于 IP 协议之上的通信协议中间件 SOME/IP 功能 服务发现 (Service Discovery)远程服务调用 &#xff08;RPC,rem…

React面试题汇总 --2

1. 何为 redux &#xff0c;解决什么问题 操作流程 使用场景 优缺点 &#xff1f; Redux使用详解(一) Redux的核心思想与基本使用__聪明勇敢有力气的博客-CSDN博客Redux使用详解(一) Redux的核心思想与基本使用https://blog.csdn.net/weixin_65402230/article/details/128193…

全免费开源-国内搭建ChatGPT个人镜像站与维护全攻略

全免费开源-国内搭建ChatGPT个人镜像站与维护全攻略 准备阶段部署网站腾讯云注册与解析添加API和密码更换域名的配置多密码管理密码更换密码批量生成 本教程收集于&#xff1a;AIGC从入门到精通教程汇总 全免费开源&#xff0c;仅需一个域名就可以部署国内的ChatGPT镜像版本。…

ConvTranspose2d 的简单例子理解

文章目录 参考基础概念简单例子&#xff1a; stride2step1step2step3 参考 逆卷积的详细解释ConvTranspose2d&#xff08;fractionally-strided convolutions)nn.ConvTranspose2d的参数output_padding的作用 基础概念 逆卷积&#xff0c;也叫反卷积或者转置卷积&#xff0c;…

故障分析 | OceanBase 频繁更新数据后读性能下降的排查

本文摘要 本文分析并复现了 OceanBase 频繁更新数据后读性能下降现象的原因&#xff0c;并给出了性能改善建议。 背景 测试在做 OceanBase 纯读性能压测的时候&#xff0c;发现对数据做过更新操作后&#xff0c;读性能会有较为明显的下降。具体复现步骤如下。 复现方式 环…

部门新来一00后,给我卷崩溃了...

2022年已经结束结束了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;相信很多小伙伴也在准备今年的金三银四的面试计划。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的…

NFT数字藏品平台

在 NFT &#xff08;非同质化代币&#xff09;发行和交易中&#xff0c;数字藏品交易平台&#xff08;以下简称“交易平台”&#xff09;的运营模式和法律地位至关重要。本文对数字藏品交易平台的运营方式进行梳理&#xff0c;并对其中可能存在的法律风险进行分析。 2021年以来…

NFS服务器搭建(案例)

目录标题 第一个问题1.安装软件包2.进入配置文件进行定义&#xff0c;并创建对应的资源文件3.客户端进行挂载&#xff0c;并查看挂载信息&#xff0c;修改挂载权限4.客户端查看挂载的信息 第二个问题1.服务端配置文件进行定义&#xff0c;并创建对应资源文件2.客户端进行挂载3.…

电子邮件是最有效的营销方式吗?解析邮件营销的优势和劣势

互联网的快速发展&#xff0c;使得新媒体营销、短视频营销、微信营销等新型营销方式渗入到大家的生活中。很多人会认为邮件营销已经落后。但事实上&#xff0c;邮件营销仍然有着广泛的市场需求&#xff0c;特别是对于出海或者做跨境电商的企业来讲&#xff0c;邮件营销仍然发挥…

深度学习笔记(续)——数值稳定性、模型初始化与激活函数

深度学习笔记[续]——数值稳定性、模型初始化与激活函数 引言回顾&#xff1a;没有激活函数参与&#xff0c;输入输出分布的变化情况 Xavier \text{Xavier} Xavier方法 存在激活函数的情况假设激活函数是线性函数激活函数的底层逻辑 总结 引言 继续上一节介绍激活函数在神经网…

Google IO 2023推出Android Studio官方AI工具Studio Bot

Google推出Android Studio官方AI工具Studio Bot Studio Bot 简介 在2023 Google I/O大会上&#xff0c;Google 宣布在 Android Studio 中推出了一款名为 Studio Bot 的新 AI 功能&#xff0c;它将为开发者提供更高效、智能的开发体验。Studio Bot 是一个基于机器学习的助手&a…

想要快速进入车载测试?这份车载面试题集锦送给你,建议收藏!

1.道路测试流程 测试场地 1.测试场地有哪些&#xff1f; 对于一些要求不太高/简单的测试场景可以找一些封闭的场地&#xff0c;如断头路或者是城市所在地当地政府提供的诸如智能网联专用道路之类的测试道路&#xff0c;对于复杂或相对要求高一些的测试场景可以到专业的国家智…

【运维杂谈】如何将ios镜像挂载到Linux系统中?

本期我们实现将CentOS7.9系统镜像挂载到Linux系统当中&#xff0c;首先明确什么是挂载&#xff0c;我理解的挂载就是把系统镜像与Linux操作系统建立直接的联系&#xff0c;将镜像的顶级目录连接到Linux根目录下的某一目录中&#xff0c;就好比我们Windows系统插入一张光盘&…

C++学习记录——이십삼 哈希表

文章目录 1、unordered_map unordered_set2、哈希表1、闭散列2、开散列&#xff08;拉链法/哈希桶&#xff09;继续优化 3、封装unordered和迭代器 1、unordered_map unordered_set C11提供&#xff0c;功能和map、set完全类似&#xff0c;不过它们底层实现是红黑树&#xff0…

JDBC~

文章目录 JDBCJDBC API详解DriverManagerConnectionStatementResultSetPreparedStatementPreparedStatement原理 JDBC JDBC就是使用JAVA语言操作关系型数据库的一套API JDBC是java处理数据库的接口 JDBC API详解 DriverManager 驱动管理类: 注册驱动&#xff0c;获取数据库连接…

Cplex的数据类型结构及基本语法功能

本序列将会重开一门新的序列----数学求解器cplex,文章不做简单介绍&#xff0c;不灌水&#xff0c;直接给大家进行讲述如何上手实操&#xff0c;并有针对性的给出相应案例分析。 OPL编程 OPL是ILOG团队为运筹学专家量身定制的一种优化建模语言&#xff0c;语法相对简单&#x…

C++系列之入门基础知识

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 命名空间 常见域的种类 常见的域的种类有&#xff1a;全局域&#xff0c;局部…