4☛基于STM32的电子打铃器√★☆

Posted 行走的皮卡丘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4☛基于STM32的电子打铃器√★☆相关的知识,希望对你有一定的参考价值。

4、💙💙☛基于STM32的电子打铃器√★☆💙💙

Introduction

As a tool, the answerer has been widely used in various intelligence and knowledge contest occasions. However, the frequency of use of answering devices is low, and some of them are either complicated to make or have low reliability. As a unit, if you buy a responder, although it is economically affordable, it is used very rarely every year, and the responder (electronic device) is often damaged due to long-term storage, and the trouble and timeliness of repurchasing will affect The development of the activity, therefore designed this answering device.

引言

抢答器作为一种工具,已广泛应用于各种智力和知识竞赛场合。但抢答器的使用频率较低,且有的要么制作复杂,要么可靠性低。作为一个单位,如果专门购一台抢答器虽然在经济上可以承受,但每年使用的次数极少,往往因长期存放使(电子器件的)抢答器损坏,再购置的麻烦和及时性就会影响活动的开展,因此设计了本抢答器。

1、系统概述

1.1、设计任务

用STM32设计8路比赛抢答器。

1.2、设计要求

  • (1)可使八位选手通过按键同时抢答;

  • (2)能够通过按键设置答题时间;

  • (3)能够显示倒计时时间,显示哪位选手抢到;

  • (4)裁判可以终止答题。

2 、方案设计与论证

2.1、芯片选择方案

该系统采用单片机STM32F103作为控制核心,该系统可以完成运算控制、信号识别以及显示功能的实现。由于用了单片机,使其技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩张和更改。

2.2、 系统概述

本设计是以八路抢答为基本理念。考虑到依需设定限时回答的功能,利用STM32F103单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间和回答问题的时间可在1-99s设定;可以显示是哪位选手有效抢答和无效抢答;抢答时间和回答问题时间倒记时显示,满时后系统计时自动复位及主控强制复位;按键锁定,在有效状态下,按键无效非法。

2.3、设计要求

  • ①可使八位选手通过按键同时抢答;

  • ②能够通过按键设置答题时间;

  • ③能够显示倒计时时间,显示哪位选手抢到。

  • ④裁判可以终止答题。

2.4、系统总体设计思路

  • (1)设计能正常工作的一个单片机最小硬件系统,外围电路包括设置键盘

  • (2)进行软件设计,利用单片机的系统时钟先设计一个高精度的内部时钟系统,最小精确时间为期1秒;

  • (3)在秒计数器的基础上设计一个时钟,并设计定时功能;

  • (4)设计中断功能。

2.5、各功能模块程序实现原理分析

该模块由显示器模块,LED模块和按钮控制模块组成。且都通过STM32来实现。

2.5.1、 显示器模块

显示器通过P0.0/A00,P0.1/A01,P0.2/A0…P0.7/A07;P2.0/A8,P2.1/A9,P2.2/A10这几个管脚连接到芯片上。结合按键模块,通过单片机扫描功能,确定系统所处于的状态,从而显示对应数据。

2.5.2 、按钮控制模块

八个按钮的一端分别接地,另一端接单片机一个端口的八个引脚,供选手抢答,另外还有两个按钮是开始和暂停,可供裁判选择开始暂停,当按钮按下,其对应的引脚就由高电平变成低电平,然后通过单片机扫描读取引脚的电平来判断按钮是否按下。另外还有两个按钮是开始和暂停,

2.5.3、 LED模块

在倒计时的最后3秒LED会闪烁提醒选手时间即将结束。

3、STM32性能介绍及硬件设计

3.1、STM32单片机性能介绍

STM32它拥有的资源包括:48KB SRAM、256KB FLASH、2 个基本定时器、4 个通用定时器、2个高级定时器、2个DMA 控制器(共 12 个通道)、3 个SPI、2个IIC、5个串口、1个USB、1个CAN、3个12位ADC、1个12位DAC、1个SDIO接口及51 个通用IO口,该芯片性价比极高。

各个引脚说明如下

  • PA0 作用1,按键 KEY_UP 2,可以做待机唤醒脚(WKUP) 3,可以接 DS18B20 传感器接口(P2 设置)

  • PA1作用1,NRF24L01 接口 IRQ 信号 2,接 HS0038 红外接收头(P2 设置)

  • PA2 作用 作为W25Q64 的片选信号

  • PA3 作用 作为SD 卡接口的片选脚

  • PA4 作用 作为NRF24L01 接口的 CE 信号

  • PA5 作用 作为W25Q64、SD 卡和 NRF24L01 接口的 SCK 信号

  • PA6 作用 作为 W25Q64、SD 卡和 NRF24L01 接口的 MISO 信号

  • PA7 作用 作为 W25Q64、SD 卡和 NRF24L01 接口的 MOSI 信号

  • PA8 作用 作为 接 DS0 LED 灯(红色)

  • PA9 作用 作为串口 1 TX 脚,默认连接 CH340 的 RX(P4 设置)

  • PA10 作用 作为串口 1 RX 脚,默认连接 CH340 的 TX(P4 设置)

  • PA11 作用 作为接 USB D-引脚

  • PA12 作用 作为接 USB D+引脚

  • PA13作用 作为JTAG/SWD 仿真接口,没接任何外设

  • PA14 作用 作为JTAG/SWD 仿真接口,没接任何外设

  • PA15 作用 作为1,JTAG 仿真口(JTDI) 2,PS/2 接口的 CLK 信号 3,接按键 KEY1

3.2、电子打铃系统硬件设计

该程序所需要的电路图如下

4、 系统程序

4.1、主程序设计如下

主程序流程设计图如下图:

4.2、 主程序内容

#include <stm32f10x_map.h>
#include <stm32f10x_type.h>
#include "lcd.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"		
#include "time.h"

u8 miao2;
u8 i;				
const u32  smg_du[]={0xffd7,0xff11,0xffcd,0xff5d,0xff1b,0xff5e,0xffde,0xff15,0xffdf,0xff5f}; 
const u32  smg_wei[]={0xfffe,0xf7ff,0xfbff,0xfffd};
u8 flag=0;
u8 miao=60;
u8 flagc=0;

//main函数
int main()
{
  Stm32_Clock_Init(9);
  delay_init(72);		
  uart_init(72,9600);
  LCD_Init();			
  Timerx_Init(1000,7199);
  AFIO->MAPR = 0x02000000;        
  while(1)
   {
     if(flag==0)
	 {
         GPIOA->ODR=0xff08;
         GPIOB->ODR=0xf3fc;
         if(PCin(14)==0) 
         {
             delay_ms(5);
             if(PCin(14)==0)
             {
                 flag=1;
                 i=0;
                 miao2=miao;
             }
         }
         if(PAin(13)==0)   
         {
             delay_ms(5);
             if(PAin(13)==0) 
             {
                 flag=2;
             }
             do
             {
                 while(PAin(13)==0);
                 delay_ms(10);
             }
             while(PAin(13)==0);
         }
     }
      if(flag==1)
      {
          GPIOB->ODR=smg_wei[0];
          GPIOA->ODR=smg_du[miao2%10];
          delay_ms(1);
          GPIOB->ODR=0xffff;

          GPIOB->ODR=smg_wei[1];
          GPIOA->ODR=smg_du[miao2/10];
          delay_ms(1);
          GPIOB->ODR=0xffff;
          if(PCin(15)==0) 
          {
              delay_ms(5);
              if(PCin(15)==0)
              {
                  flag=4;
                  miao=miao2;
              }
          }
          if(PAin(13)==0)   
          {
              delay_ms(5);
              if(PAin(13)==0)
              {
                  flag=5;
                  flagc=1;
                  i=0;
                  miao=miao2;
              }
          }
          if(PAin(15)==0)  
          {
              delay_ms(5);
              if(PAin(15)==0) 
              {
                  flag=5;
                  flagc=2;
                  i=0;
                  miao=miao2;
              }
          }
          if(PBin(4)==0) 
          {
              delay_ms(10);
              if(PBin(4)==0)
              {
                  flag=5;
                  flagc=3;
                  i=0;
                  miao=miao2;
              }
          }
          if(PBin(5)==0) 
          {
              delay_ms(10);
              if(PBin(5)==0)
              {
                  flag=5;
                  flagc=4;
                  i=0;
                  miao=miao2;
              }
          }
          if(PBin(6)==0) 
          {
              delay_ms(10);
              if(PBin(6)==0)
              {
                  flag=5;
                  flagc=5;
                  i=0;
                  miao=miao2;
              }
          }
          if(PBin(7)==0)
          {
              delay_ms(10);
              if(PBin(7)==0)
              {
                  flag=5;
                  flagc=6;
                  i=0;
                  miao=miao2;
              }
          }
          if(PBin(8)==0) 
          {
              delay_ms(10);
              if(PBin(8)==0)
              {
                  flag=5;
                  flagc=7;
                  i=0;
                  miao=miao2;
              }
          }
          if(PBin(9)==0) 
          {
              delay_ms(10);
              if(PBin(9)==0)
              {
                  flag=5;
                  flagc=8;
                  i=0;
                  miao=miao2;
              }
          }
      }
      if(flag==2)
      {
          GPIOB->ODR=smg_wei[0];
          GPIOA->ODR=smg_du[miao%10];
          delay_ms(1);
          GPIOB->ODR=0xffff;

          GPIOB->ODR=smg_wei[1];
          GPIOA->ODR=smg_du[miao/10];
          delay_ms(1);
          GPIOB->ODR=0xffff;
          if(PAin(15)==0)   
          {
              delay_ms(5);
              if(PAin(15)==0) 
              {
                  do
                  {
                      while(PAin(15)==0);
                      delay_ms(10);
                  }
                  while(PAin(15)==0);
                  miao++;
              }
          }
          if(PBin(4)==0) 
          {
              delay_ms(10);
              if(PBin(4)==0)
              {
                  do
                  {
                      while(PBin(4)==0);
                      delay_ms(10);
                  }
                  while(PBin(4)==0);
                  miao--;
              }
          } 
          if(PAin(13)==0)   
          {
              delay_ms(5);
              if(PAin(13)==0) 
              {
                  flag=0;
              }
              do
              {
                  while(PAin(13)==0);
                  delay_ms(10);
              }
              while(PAin(13)==0);
          }
      }
      if(flag==4)
      {
          GPIOB->ODR=smg_wei[0];
          GPIOA->ODR=smg_du[miao%10];
          delay_ms(1);
          GPIOB->ODR=0xffff;

          GPIOB->ODR=smg_wei[1];
          GPIOA->ODR=smg_du[miao/10];
          delay_ms(1);
          GPIOB->ODR=0xffff; 
          if(PCin(14)==0) 
          {
              delay_ms(5);
              if(PCin(14)==0)
              {
                  flag=1;
                  i=0;
                  miao2=miao;
              }
          }
      }
      if(flag==3) 
      {
          GPIOB->ODR=0xffff;
      }
      if(flag==5) 
      {
          GPIOB->ODR=smg_wei[0];
          GPIOA->ODR=smg_du[miao%10];
          delay_ms(1);
          GPIOB->ODR=0xffff;

          GPIOB->ODR=smg_wei[1];
          GPIOA->ODR=smg_du[miao/10];
          delay_ms(1);
          GPIOB->ODR=0xffff; 

          GPIOB->ODR=smg_wei[2];
          GPIOA->ODR=0xff08;
          delay_ms(1);
          GPIOB->ODR=0xffff;

          GPIOB->ODR=smg_wei[3];
          GPIOA->ODR=smg_du[flagc];
          delay_ms(1);
          GPIOB->ODR=0xffff;  
      }	
  }
}

4.3 、定时器中断函数以及按键程序

#include "time.h"
#include <stm32f10x_map.h>
#include <stm32f10x_nvic.h>   
void TIM3_IRQHandler(void)
{ 		    		  			    
    if(TIM3->SR&0X0001)
    {	if((i%10==5)&&(flag==1)&&(miao2<=5))
        GPIOC->ODR=0xdfff;
     else GPIOC->ODR=0xffff;

     if(i>=9)
     {
         if((miao2==0)&&(flag==1))
         {
             miao2=0;
             flag=3;
         }
         i=0;
         miao2--;

     }
     i++;			    				   				     	    	
    }				   
    TIM3->SR&=~(1<<0); 	    
}

void Timerx_Init(u16 arr,u16 psc)
{
    RCC->APB1ENR|=1<<1;  
    TIM3->ARR=arr;    
    TIM3->PSC=psc;  

    TIM3->DIER|=1<<0;   			
    TIM3->DIER|=1<<6;      
    TIM3->CR1|=0x01;    
    MY_NVIC_Init(1,3,TIM3_IRQChannel,2);					 
}

4.3、LCD程序

#include "lcd.h"
#include "delay.h"	 
#include "sys.h"

u16 POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;  
u16 DeviceCode;	 

void LCD_WR_REG(u16 data)
{ 
	LCD_RS_CLR;
 	LCD_CS_CLR; 
	DATAOUT(data); 
	LCD_WR_CLR;  
	LCD_WR_SET; 
 	LCD_CS_SET;   
}
	


void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{	
	LCD_WR_REG(LCD_Reg);  
	LCD_WR_DATA(LCD_RegValue);	    		 
}	   

u16 LCD_ReadReg(u8 LCD_Reg)
{										   
	u16 t;
	LCD_WR_REG(LCD_Reg);  
	GPIOE->CRL=0X88888888; 
	GPIOE->CRH=0X88888888; 
	GPIOE->ODR=0XFFFF;   

	LCD_RS_SET;
	LCD_CS_CLR;
	
	LCD_RD_CLR;
	delay_us(5);		   
	LCD_RD_SET;
	t=DATAIN;  
	LCD_CS_SET; 
    GPIOE->CRL=0X33333333以上是关于4☛基于STM32的电子打铃器√★☆的主要内容,如果未能解决你的问题,请参考以下文章

19基于STM32的电子打铃器

19基于STM32的电子打铃器

基于STM32单片机项目设计目录-加油吧√

基于STM32单片机项目设计目录-加油吧√

12基于STM32的电子密码器

基于STM32居家加湿器控制仿真系统设计-电子设计资料