前言:
硬件设备:迪文DMG32240C028_03WTC屏
开发方式:DGUS界面开发+基于迪文T5L屏8051内核嵌入式C开发
开发说明:迪文 T5L 是双核架构智能屏:内置GUI 核(DGUS II) 负责界面渲染、触摸处理;独立 8051 内核(OS CPU) 运行用户 C 代码,双核通过变量指针(VP) 交互,开发模式为 “DGUS 组态界面 + 8051 C 逻辑”,开发高效、界面美观、逻辑可控。
T5L屏双核架构介绍:
GUI 核(DGUS II):独立 CPU,硬件 2D 加速、JPEG 解码、显存驱动,不占 8051 资源,负责显示、触摸、控件刷新。
OS 核(8051):1T 高速 8051,最高300MHz。64KB Code Flash、32KB RAM。独立运行用户 C 程序,与 DGUS 并行、互不干扰。
正文:
迪文T5L屏内置蜂鸣器报警程序
1. 程序概述
迪文T5L屏内置的按键音蜂鸣器,可以单独控制,我们把按键音功能禁用,改为一个报警用的蜂鸣器。该程序基于迪文屏8051内核开发,依托T5LLib库实现屏内置蜂鸣器多模式的精准控制,采用100ms周期的任务调度机制,支持蜂鸣器关闭、单次鸣响、快速间歇鸣响、慢速间歇鸣响四种核心工作模式,适用于迪文T5L屏声光提示场景,整体逻辑简洁,可直接集成到各类迪文屏相关嵌入式项目中。工程文章末尾提供下载链接。
2. 头文件(buzzer.h)
2.1 枚举类型定义
定义枚举类型BuzzerMode_t,明确蜂鸣器的4种工作模式:
| 枚举值 | 功能说明 | 实际频率/周期 |
|---|---|---|
| BUZZER_OFF | 蜂鸣器关闭模式(程序默认模式) | - |
| BUZZER_SINGLE | 单次鸣响模式,触发后持续鸣响1秒,仅执行1次 | - |
| BUZZER_FAST | 快速间歇鸣响模式(频率为2Hz) | 周期500ms(鸣响250ms,停止250ms,循环执行) |
| BUZZER_SLOW | 慢速间歇鸣响模式(频率为1Hz) | 周期1000ms(鸣响500ms,停止500ms,循环执行) |
2.2 函数接口声明
对外核心函数,供迪文屏8051内核上层程序调用,无需关注底层实现细节,接口简洁易懂,适配嵌入式报警场景,具体声明如下:
// 蜂鸣器初始化函数:完成硬件使能关闭、模式和计数器重置
void buzzer_init(void);
// 蜂鸣器模式设置函数:切换蜂鸣器工作模式,避免重复操作
void buzzer_set_mode(BuzzerMode_t mode);
// 100ms周期任务函数:需由系统定时器调度,实现不同模式的时序控制
void buzzer_task_100ms(void);
3. 源文件(buzzer.c)
3.1 静态全局变量
定义两个静态全局变量,适配迪文屏8051内核资源特点,用于存储当前工作状态和时序计数,仅在源文件内部可见,避免对外暴露造成误操作:
static BuzzerMode_t buzzer_mode = BUZZER_OFF; // 存储当前蜂鸣器工作模式,默认关闭
static u16 buzzer_cnt = 0; // 100ms单位的计数器,用于时序控制
3.2 核心函数实现
3.2.1 初始化函数 buzzer_init
void buzzer_init(void)
{
t5l_keyBuzzer_enable(0); // 禁止按键音,防止干扰报警声音
buzzer_mode = BUZZER_OFF; // 重置工作模式为关闭状态
buzzer_cnt = 0; // 重置计数器,确保时序准确
}
功能说明:初始化阶段关闭按键音,重置工作模式和计数器,为后续模式切换和时序控制奠定基础,确保迪文屏设备启动后蜂鸣器处于稳定的关闭状态。
3.2.2 模式设置函数 buzzer_set_mode功能说明:实现蜂鸣器工作模式的切换,增加模式判断逻辑,避免重复设置相同模式造成的资源浪费;切换模式时重置计数器,确保每种模式的时序从初始状态开始计算,提升控制精度。
void buzzer_set_mode(BuzzerMode_t mode)
{
if(buzzer_mode == mode) return; // 若目标模式与当前模式一致,直接返回,避免无效操作
buzzer_mode = mode; // 更新当前工作模式
buzzer_cnt = 0; // 切换模式时重置计数器,避免时序混乱
}
3.2.3 周期任务函数 buzzer_task_100ms
该函数为程序核心逻辑,需由系统定时器按100ms周期调度执行,根据当前工作模式,通过计数器控制蜂鸣器的鸣响和停止时序,具体逻辑如下:
void buzzer_task_100ms(void)
{
if(buzzer_mode == BUZZER_OFF)
{
buzzer_cnt = 0;
return;
}
buzzer_cnt++; // 每100ms +1
// ======================
// 提示音:响1秒(只响一次)
// ======================
if(buzzer_mode == BUZZER_SINGLE)
{
if(buzzer_cnt == 1)
{
t5l_buzzer_on(1000); // 响1000ms = 1秒
}
// 响完自动关闭,避免重复触发
if(buzzer_cnt >= 10) // 预留一点时间防止重复
{
buzzer_set_mode(BUZZER_OFF);
}
}
// ======================
// 快速报警 2Hz
// 周期:500ms
// 响250ms → 停250ms
// ======================
else if(buzzer_mode == BUZZER_FAST)
{
// 周期开始时响 2000ms
if(buzzer_cnt == 1)
{
t5l_buzzer_on(250);
}
// 500ms = 5个100ms → 重置周期
if(buzzer_cnt >= 5)
{
buzzer_cnt = 0;
}
}
// ======================
// 慢速报警 1Hz
// 周期:1000ms
// 响500ms → 停500ms
// ======================
else if(buzzer_mode == BUZZER_SLOW)
{
// 周期开始时响 1000ms
if(buzzer_cnt == 1)
{
t5l_buzzer_on(500);
}
// 1000ms = 10个100ms → 重置周期
if(buzzer_cnt >= 10)
{
buzzer_cnt = 0;
}
}
}
4、迪文T5L屏8051内核开发_内置蜂鸣器报警例子:


5、下载链接:完整工程,包括DGUS界面工程“t5l_dgus”及Keil的C代码工程“t5l_code”。

4280

被折叠的 条评论
为什么被折叠?



