基于STM32单片机多路无线射频抢答器

目录

前言

一、本设计主要实现哪些很“开门”功能?

二、电路设计原理图

1.电路图采用Altium Designer进行设计:

三、实物设计图

四、程序源代码设计 

五、资料内容


前言

随着科技的不断进步和各类竞赛活动的日益增多,抢答器作为一种重要的竞赛辅助设备,其性能和功能的优化显得尤为重要。抢答器不仅需要准确、公平地判断抢答者的身份,还需要具备稳定性和易用性,以满足各种竞赛场合的需求。

传统的抢答器大多采用有线连接方式,存在线路复杂、安装困难、性能不可靠等问题。同时,这些抢答器在数据传输过程中往往缺乏校验机制,容易导致数据出错或乱码。此外,传统的抢答器功能相对单一,无法满足现代竞赛活动对多样化和智能化功能的需求。

为了解决上述问题,本研究设计了一种基于STM32单片机的多路无线射频抢答器。STM32单片机以其高性能、低功耗和丰富的外设接口,为抢答器的设计提供了强大的技术支持。通过采用无线射频技术,实现了抢答器和接收器之间的数据通信,从而避免了传统有线连接的弊端。同时,本研究还在数据传输中添加了校验码,以确保数据的准确性和完整性。

本研究设计的抢答器不仅具备基本的抢答功能,还支持多路抢答、实时显示抢答结果、声音提示等多种功能。其中,多路抢答功能可以满足多个参赛者或团队同时参与竞赛的需求;实时显示抢答结果功能可以让观众和裁判清晰地看到抢答者的身份和抢答时间;声音提示功能则可以在抢答成功或抢答时间结束时发出声音提醒,进一步增强了抢答器的实用性和互动性。

一、本设计主要实现哪些很“开门”功能?

        1)4个手持抢答器/发射器,锂电池或干电池供电,低功耗处功能
        2)一个接收器主控,主控DC5V供电,低功耗处功能
        3)无线通讯采用射频通讯,NRF2401/433MHZ通讯
        4)主控接收器具备待倒计时数据显示
        5)主控接收器具备语音播报提示功能,可播报哪路抢答器最先抢答成功
        6)接收器具备可调制开关,设置抢答时间等
        7)整套系统设计规划合理,PCB排版布线合理完善

二、电路设计原理图

1.电路图采用Altium Designer进行设计:


1、通过STM32F103C8T6单片机作为系统主控,最小系统电路是整个电路的核心。

2、设计了无线抢答器发射系统和接收系统,两套系统

3、 使用无线433HZ射频/NRF2401无线遥控,模块与单片机进行数据引脚协议解析。

4、通过数码管显示抢答器位号以及抢答倒计时,模块数码管驱动芯片单进行单总线连接。

5、使用智能语音播报模块播报信息,模块与单片机使用串口连接。

6、通过锂电池或干电池供电,单片机设置为低功耗模式。

7、使用无线按键发射,将报文压缩加防错掩码,发送出去,模块与单片机采用FACK总线通讯

8、使用无线接收,将报文解压加检验模块与单片机采用FACK/ACK加码总线通讯。

三、实物设计图

实物程序PCB资料:

通过百度网盘分享的文件:资料获取
链接:https://pan.baidu.com/s/1hv8MSqt4AmWzFdYzM_D7Eg 
提取码:u2n9


四、程序源代码设计 

void HostDecoding(void)
{
    u8 bit_const = 0;//数据位数计算
    u16 Time = 0;
    u32 RxDate = 0;
    /******引导码:600uS的‘H’+600us的‘L’*****/
    Guide_Code:
    //引导码“H”
    while(Data == 0);                 //等待引导码高电平到来...
    TIM_SetCounter(TIM3,0);  //计数清零        
    TIM_Cmd(TIM3, ENABLE);   //引导码高电平到来,定时器开始计时引导码高电平时间

    Guide_Code_H:
  bit_const = 0;RxDate = 0;
    while(Data == 1);//引导码高电平结束,等待引导码低电平到来
    TIM_Cmd(TIM3, DISABLE);             
    Time = TIM_GetCounter(TIM3);//关闭定时器,计算引导码高电平时间 us
    TIM_SetCounter(TIM3,0);     //计数清零        
    TIM_Cmd(TIM3, ENABLE);      //定时器开始计时

    if((Time<480)||(Time>720))    //如果引导码高电平时间在这区间,则不符合
    {                                                        //600*(1+20%)误差范围
        while(Data == 0);
        TIM_Cmd(TIM3, DISABLE);        //关闭定时器
        TIM_SetCounter(TIM3,0);      //计数清零        
        TIM_Cmd(TIM3, ENABLE);    //重新计算引导码高电平时间
        goto Guide_Code_H;              //引导码高电平不符合,重新识别
    }    
    //引导码 “L”
    while(Data == 0);//引导码低电平结束,等待ID码高电平到来...
    TIM_Cmd(TIM3,DISABLE);                
    Time = TIM_GetCounter(TIM3);//关闭定时器,计算引导码低电平时间 us
    TIM_SetCounter(TIM3,0);     //计数清零        
    TIM_Cmd(TIM3, ENABLE);      //定时器开始计时
    if((Time<480)||(Time>720))    //如果引导码低电平时间在这区间,则不符合    
    {                                                        //600*(1+20%)误差范围
        goto Guide_Code_H;                //引导码低电平不符合,重新识别
    }
    /*符和:往下识别数据码
    bit=1:400uS的‘H’+ 200uS的‘L’
    bit=0:200uS的‘H’+ 400uS的‘L’*/    
    TIM_Cmd(TIM3, DISABLE);        //关闭定时器
    Date_Code:
    if(Data == 0) 
    {
        goto Guide_Code;
    }    
  else
    {
        delay_us(300);
        bit_const++;
        RxDate<<=1;    
        if(Data == 1) 
        {
            RxDate++;    
        }
        delay_us(200);
        if(Data == 1)      
        {
            TIM_SetCounter(TIM3,0);     //计数清零        
            TIM_Cmd(TIM3, ENABLE);      //定时器开始计时
            goto Guide_Code_H;            
        }
        if (bit_const == 8)                    
        {
      goto Stop_Code;
        }

}
int main(void)
{
//    u8 F_answer = 0; 
    delay_init();        //延时函数初始化    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 
    uart_init(9600);    //串口初始化为9600
    LED_Init();
    RadioFrequencyRx_Init();
    CMS1650_Init();
    TIM2_Int_Init(0xFFFF,72-1);
    TIM3_Int_Init(0xFFFF,72-1);
    TIM4_Int_Init(0xFFFF,72-1);
    delay_ms(300);    //延时一段时间,否则开显示无响应
    //关显示是都关闭,开显示的话,位选不去操作的话,它会默认都亮起来
    CMS1650_WriteByte(0x48,0x51);//开显示:3级亮度
    CMS1650_WriteByte(0x68,0x7f);
    CMS1650_WriteByte(0x6A,0x7f);
    CMS1650_WriteByte(0x6C,0x7f);
    CMS1650_WriteByte(0x6E,0x7f);//开机8888
    delay_ms(500);    
    CMS1650_WriteByte(0x68,0x00);
    CMS1650_WriteByte(0x6A,0x00);
    CMS1650_WriteByte(0x6C,0x00);
    CMS1650_WriteByte(0x6E,0x3f);//显示倒计时时间界面    0
    while(1)
    {        
        while(F_control)
        {
            HostDecoding();
        }
        if(Time2_Number == 0)//计时0s到
        {
            F_answer = 1;//抢答解码
            LEDREAD = 0;LEDGREAN = 1;
            Time4_Number = 0;
            TIM_SetCounter(TIM4,0);     //计数清零        
            TIM_Cmd(TIM4, ENABLE);      //定时器开始计时
        }
        Display_Time(Time2_Number);//显示倒计时
        while(F_answer)
        {
            AnswerDecoding();
        }
        
    }

五、资料内容

实物程序PCB资料:

通过百度网盘分享的文件:资料获取
链接:https://pan.baidu.com/s/1hv8MSqt4AmWzFdYzM_D7Eg 
提取码:u2n9

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

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

相关文章

【Linux】多线程(中)

目录 一、线程互斥 1.1 互斥概念 1.2 互斥量mutex 1.3 互斥量相关API &#xff08;1&#xff09;初始化互斥量 &#xff08;2&#xff09;销毁互斥量 &#xff08;3&#xff09;互斥量加锁和解锁 1.4 互斥量原理 1.5 重入和线程安全 二、死锁 2.1 概念 2.2 造成死锁…

光控资本:什么是庄家洗盘和出货?各有什么特征?

什么是庄家洗盘和出货&#xff1f; 庄家洗盘&#xff1a;庄家洗盘是指庄家使用其筹码优势来作出一些K线图形&#xff0c;进而引起市场上的散户投资者的惊惧&#xff0c;然后洗掉散户手中的起浮筹码&#xff0c;使盘面更加安稳&#xff0c;减轻股票后期拉升压力的行为。 庄家洗…

【Vue3】知识汇总,附详细定义和源码详解,后续出微信小程序项目(5)

快速跳转&#xff1a; 我的个人博客主页&#x1f449;&#xff1a;Reuuse博客 新开专栏&#x1f449;&#xff1a;Vue3专栏 参考文献&#x1f449;&#xff1a;uniapp官网 免费图标&#x1f449;&#xff1a;阿里巴巴矢量图标库 ❀ 感谢支持&#xff01;☀ 前情提要 &#x…

5ire:开源AI工具的新纪元

抖知书老师推荐&#xff1a; 在AI技术飞速发展的今天&#xff0c;5ire作为一款开源的AI工具&#xff0c;已经悄然改变了我们对传统AI工具的认知。那些曾对AI技术抱有疑虑的人们&#xff0c;现在可以更加自信地拥抱这一变革。原本担心工作会被AI取代的忧虑逐渐平息&#xff0c;…

Unity图形学之Shader2.0矩阵变换

1.将物体坐标系 变换 到世界坐标系&#xff1a; Unity3D里面矩阵是左乘的 P(世界) M(物体到世界的变换矩阵) * P(物体) 规律&#xff1a;3D变换 首先将物体坐标系变换到世界 2.将 世界坐标 变换 到相机坐标 P(相机) M(世界到相机的变换矩阵) * P(世界) using System.Col…

网上商城系统设计与Spring Boot框架

3 系统分析 当用户确定开发一款程序时&#xff0c;是需要遵循下面的顺序进行工作&#xff0c;概括为&#xff1a;系统分析–>系统设计–>系统开发–>系统测试&#xff0c;无论这个过程是否有变更或者迭代&#xff0c;都是按照这样的顺序开展工作的。系统分析就是分析系…

JavaWeb-JSP

可以写java代码也前端代码 jsp本来就是Serclet jsp脚本 EL表达式 要将jsp获取的东西放到域中 转发到/el-demo.jsp中 jsp中用&#xffe5;{}获取域中的信息 JSTL标签 c&#xff1a;if标签 jsp中 c:forEach标签 MVC 查询所有 在service层实现 Servlet代码&#xff1a;1.创建Br…

Area-Composition模型部署指南

一、介绍 本模型可以通过输入不同的提示词&#xff0c;然后根据各部分提示词进行融合生成图片。如下图&#xff1a; 此图像包含 4 个不同的区域&#xff1a;夜晚、傍晚、白天、早晨 二、部署 环境要求&#xff1a; 最低显存&#xff1a;10G 1. 部署ComfyUI 本篇的模型部署…

经典文献阅读之--DROID-SLAM(完美的深度学习slam框架)

0. 简介 深度学习和SLAM现在结合越来越紧密了&#xff0c;但是实际上很多时候深度学习只会作为一个block放在slam系统中。而很多深度学习slam算法&#xff0c;在slam这边的性能都不是太好&#xff0c;尤其是回环和全局优化这块。因为有一些深度学习的工作就不太适合做回环检测…

【windows 下使用 tree】

windows git bash 下使用 tree 下载tree二进制文件 https://gnuwin32.sourceforge.net/packages/tree.htm 解压缩找到 tree.exe 扔进git bash的命令目录 C:\Program Files\Git\usr\bin 打开测试

GxtWaitCursor:Qt下基于RAII的鼠标等待光标类

有时我们需要以阻塞的方式执行一点耗时的操作&#xff0c;这时需要主窗口光标呈现忙状态&#xff0c;GxtWaitCursor正是为此设计&#xff1b;重载的构造函数&#xff0c;可以让光标呈现忙状态一定时间后自动恢复。 GxtWaitCursor.h #pragma once#include <QObject>// // …

通过Python,Tkinter,文本文件,Openpyxl。实现【图书馆管理系统实现技术】

图书馆管理系统 目录 项目概述类定义 -Book类 -Library类书籍管理功能 -添加书籍 -查找书籍 -借阅书籍 -归还书籍 -列出所有书籍数据持久化 -保存书籍 -加载书籍操作日志记录图形用户界面(GUI) -界面设计 -功能实现代码原理总结实现界面 ![](https://i-blog.csdnimg.cn/dire…

飞牛私有云访问外网

飞牛私有云 fnOS NAS 是一款有着卓越的性能以及强大的兼容性和智能化的管理界面&#xff0c;它之所以能在 NAS 市场中脱颖而出&#xff0c;是因为 fnOS 基于最新的 Linux 内核&#xff08;Debian发行版&#xff09;深度开发&#xff0c;不仅兼容主流 x86 硬件&#xff0c;还支持…

HTML之表单学习记录

如果一个页面仅仅供用户浏览&#xff0c;那就是静态页面。如果这个页面还能实现与服务器进行数据交互&#xff08;像注册登录、话费充值、评论交流&#xff09;​&#xff0c;那就是动态页面。表单是我们接触动态页面的第一步。其中表单最重要的作用就是&#xff1a;在浏览器端…

redis 原理篇 30 redis内存回收 过期key处理

三十分&#xff0c;又是一个长视频&#xff0c;挺好&#xff0c;但是从标题来看&#xff0c;内容应该很简单&#xff0c;或者说&#xff0c;是他能讲简单的类型&#xff0c;本来还想再搞一篇&#xff0c;但是三十分钟的话&#xff0c;五点五十了&#xff0c;算了&#xff0c;下…

【STM32F1】——无线收发模块RF200与串口通信

【STM32F1】——无线收发模块RF200与串口通信 一、简介 本篇主要对调试无线收发模块RF200的过程进行总结,实现了以下功能。 串口普通收发:使用STM32F103C8T6的USART2串口接收中断,实现两个无线收发模块RF200间的通信。二、RF200介绍 电压:3.4-5.5V工作频率:418~455MHz发…

【MySQL从入门到放弃】InnoDB磁盘结构(二)

前言 前面我们解析了InnoDB磁盘结构中的表空间、数据字典、双写缓冲区。 本文我们继续探究磁盘结构中剩余的几个核心组件:重做日志(redo log)、撤销日志(undo log)、二进制日志(binlog) 一、重做日志 ( redo log ) WAL(Write-Ahead Logging)机制 WAL 的全称是…

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

用vscode编写verilog时,如何有信号定义提示、信号定义跳转(go to definition)、模块跳转这些功能

&#xff08;一&#xff09;安装插件SystemVerilog - Language Support 安装一个vscode插件即可&#xff0c;插件叫SystemVerilog - Language Support。虽然说另一个插件“Verilog-HDL/SystemVerilog/Bluespec SystemVerilog”也有信号提示及定义跳转功能&#xff0c;但它只能提…

LLM RAG系列:一文详解RAG,看完这篇你必会(文末福利)

RAG系列 本文介绍了RAG以及RAG pipeline的整个流程&#xff0c;包括请求转换、路由和请求构造、索引和检索、生成和评估等&#xff0c;其中引用了大量有价值的论文。 参考Advanced RAG Series: Generation and Evaluation中的5篇文章&#xff0c;并丰富了相关内容。 请求转换…