当前位置: 首页 > article >正文

基于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.kler.cn/a/392990.html

相关文章:

  • 06-标准库开发-STM32-SPI通信协议软件实现
  • Linux下C++代码实现字符集转换
  • 深入浅出云计算 ---笔记
  • 多级IIR滤波效果(BIQUAD),system verilog验证
  • 2.linux中调度kettle
  • Debian11(pve) 使用.deb包 安装内核头文件
  • 算法笔记/USACO Guide GOLD金组Graphs并查集Disjoint Set Union
  • dolphinscheduler
  • Rust编写的贪吃蛇小游戏源代码解读
  • docker pull 网络不通
  • 01.Linux网络设置、FTP
  • 数据驱动的智能决策:民锋科技的量化分析方案
  • golang项目三层依赖架构,自底向上;依赖注入trpc\grpc
  • ES6进阶知识一
  • 【启程Golang之旅】一站式理解Go语言中的gRPC
  • 无人机反制技术与方法:主动防御,被动防御技术原理详解
  • Spring Boot编程训练系统:技术实现与案例分析
  • Linux服务器下oracle自动rman备份的实现
  • 从“大吼”到“轻触”,防爆手机如何改变危险油气环境通信?
  • 【JavaScript】
  • CentOS下如何安装Nginx
  • 音频采样数据格式
  • YOLOv7-0.1部分代码阅读笔记-general.py
  • 服务器集群的作用有什么?
  • vue2使用 <component> 标签动态渲染不同的表单组件
  • HarmonyOS Next星河版笔记--界面开发(4)