蜂鸣器控制框架

2024-05-10 08:32
文章标签 框架 控制 蜂鸣器

本文主要是介绍蜂鸣器控制框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该框架主要工作4中模式

  1. 鸣叫1声
  2. 鸣叫2声
  3. 鸣叫3声
  4. 一直叫

核心代码

H头文件

#ifndef __BEEP_H__
#define __BEEP_H__
#include <stdint.h>#define TIME 100
typedef enum
{MD_NULL,MD_CLOSE,    //关闭蜂鸣器模式MD_ONE,      //响1声MD_TWO,      //响2声MD_THREE,    //响3声MD_CONTINUE, //一直响
} mode_t;typedef void (*control_beep)(uint8_t lvt);typedef struct _beep
{//蜂鸣器激活电平uint8_t active_lev;//最后一次蜂鸣器状态,程序内部使用uint8_t last_sta;//蜂鸣器打开时间uint32_t start_time;//蜂鸣器工作模式 见 mode_tmode_t mode;// 蜂鸣器控制回调函数control_beep ctrl;// 形成蜂鸣器链表内部使用struct _beep *next;
} beep_t;
/*
打开蜂鸣器
pbeep   被打开的蜂鸣器
md      打开方式
tick    当前时间戳
*/
void beep_open(beep_t *pbeep, mode_t md, uint32_t tick);
/*
关闭蜂鸣器
pbeep   被关闭的蜂鸣器
*/
void beep_cloe(beep_t *pbeep);
/*
注册一个蜂鸣器
pbeep   代注册的蜂鸣器指针句柄
ctrl    蜂鸣器控制回调函数
acive   蜂鸣器的激活电平
*/
void beep_register(beep_t *pbeep,control_beep ctrl,uint8_t acive);
/*
需要被循环调用的事件循环
tick    传入当前最新时间戳
*/
void beep_process(uint32_t tick);
#endif

C实现代码

#include "beep.h"
#include "main.h"
#include <stdio.h>
#include <stdint.h>
static beep_t *head = NULL;
/*
注册一个蜂鸣器
pbeep   代注册的蜂鸣器指针句柄
ctrl    蜂鸣器控制回调函数
acive   蜂鸣器的激活电平
*/
void beep_register(beep_t *pbeep, control_beep ctrl, uint8_t active)
{if (pbeep == NULL){printf("%s %d beep is nullptr\r\n", __FILE__, __LINE__);}pbeep->active_lev = active;pbeep->ctrl = ctrl;pbeep->next = head;pbeep->mode = MD_CLOSE;head = pbeep;printf("%s %d  register beep\r\n", __FILE__, __LINE__);
}
/*
打开蜂鸣器
pbeep   被打开的蜂鸣器
md      打开方式
tick    当前时间戳
*/
void beep_open(beep_t *pbeep, mode_t md, uint32_t tick)
{beep_t *cur = head;while (cur){if (cur == pbeep){break;}cur = cur->next;}if (cur){cur->start_time = tick;cur->last_sta = !cur->active_lev;cur->mode = md;}printf("%s %d open mode %d\r\n", __FILE__, __LINE__, md);
}
/*
关闭蜂鸣器
pbeep   被关闭的蜂鸣器
*/
void beep_cloe(beep_t *pbeep)
{beep_t *cur = head;while (cur){if (cur == pbeep){break;}cur = cur->next;}if (cur){cur->ctrl(!cur->active_lev);}
}
/*控制蜂鸣器鸣叫一次cur 被控蜂鸣器指针tick 当前时间戳
*/
static uint32_t exec_beep_once(beep_t *cur, uint32_t tick)
{volatile uint32_t sub = 0;uint8_t dest_sta;uint8_t flag = 0;sub = tick - cur->start_time;if (sub < TIME){dest_sta = cur->active_lev;flag = 1;}else if (sub >= TIME){dest_sta = !cur->active_lev;flag = 1;}if (dest_sta != cur->last_sta && flag){flag = 0;cur->ctrl(dest_sta);cur->last_sta = dest_sta;}if (sub > 2 * TIME){return 1;}else{return 0;}
}
/*
需要被循环调用的事件循环
tick    传入当前最新时间戳
*/void beep_process(uint32_t tick)
{beep_t *cur = head;while (cur){switch (cur->mode){case MD_CLOSE:cur->ctrl(!cur->active_lev);cur->mode = MD_NULL;break;case MD_ONE:if (exec_beep_once(cur, tick)){cur->mode = MD_CLOSE;}break;case MD_TWO:if (exec_beep_once(cur, tick)){cur->mode = MD_ONE;cur->start_time = tick;}break;case MD_THREE:if (exec_beep_once(cur, tick)){cur->mode = MD_TWO;cur->start_time = tick;}break;case MD_CONTINUE:cur->ctrl(cur->active_lev);cur->mode = MD_NULL;break;default:break;}cur = cur->next;}
}

使用框架示例代码

H文件

#ifndef __HB_BEEP_H__
#define __HB_BEEP_H__
#include "beep.h"
#include "main.h"
#include "sys.h"#define BEEP PCout(3)
/*
初始化蜂鸣器
*/
void init_beep(void);
/*
蜂鸣器循环调用的进程
*/
void process_beep(uint32_t tick);/*
打开蜂鸣器 开发方式有 1,2,3 种方式
*/
void open_beep(uint32_t tick, mode_t mode);/*
打开蜂鸣器 开发方式有 1,2,3 种方式
*/
void close_beep(void);
#endif

C文件

#include "hb_beep.h"
#include "stdio.h"
static beep_t s_beep;
static void control_beep_status(uint8_t lvt)
{BEEP = lvt;//HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin);
}
/*
初始化蜂鸣器
*/
void init_beep(void)
{beep_register(&s_beep, control_beep_status, 1);
}
/*
蜂鸣器循环调用的进程
*/
void process_beep(uint32_t tick)
{beep_process(tick);
}/*
打开蜂鸣器 开发方式有 1,2,3 种方式
*/
void open_beep(uint32_t tick, mode_t mode)
{beep_open(&s_beep, mode, tick);
}/*
打开蜂鸣器 开发方式有 1,2,3 种方式
*/
void close_beep()
{beep_cloe(&s_beep);
}

使用方法

  1. 主函数调用
init_beep();
  1. 定时器调用
process_beep(时间戳);
  1. 需要使用时打开定时器
open_beep(开启模式,时间戳)

这篇关于蜂鸣器控制框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975953

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简