蜂鸣器控制框架

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

相关文章

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放