基于STM32单片机抢答器时间显示设计
1 功能介绍
本设计基于STM32F103C8T6单片机,结合LCD1602液晶显示模块和5路独立按键电路,构建了一个简单实用的电子抢答器系统。该系统的核心功能是实现多人抢答过程中对最先按下按键的选手进行识别和显示,并且能够在液晶屏上实时显示结果。其主要功能特点如下:
- 系统上电后进入待机状态,LCD1602液晶屏幕清空显示。
- 当有按键被按下时,系统识别第一个动作,LCD1602液晶会显示按键的编号,例如第1个按键先按下则显示“1”,第2个按键先按下则显示“2”,以此类推。
- 液晶屏幕一次只能显示一个数字,即对应第一个抢答者的编号。
- 系统不响应后续的按键输入,确保公平性,保证只记录第一次抢答者的信息。
- 除非系统重新上电或者按下复位按键,系统才会进入下一轮抢答。
这种设计应用于课堂互动、知识竞赛、娱乐活动等场景,可以提高互动性和公平性。由于使用了STM32单片机,系统具备响应速度快、可靠性高的特点,LCD1602液晶显示模块使得结果显示直观明了。
2 系统电路设计
系统电路设计由STM32最小系统电路、LCD1602液晶显示电路、5路按键输入电路以及电源电路构成。各模块之间通过总线或GPIO引脚连接,保证了数据传输和功能实现的可靠性。
2.1 STM32最小系统电路
STM32F103C8T6是本系统的主控芯片,具备强大的处理能力和丰富的外设资源。最小系统电路包括以下部分:
- 电源电路:为芯片提供稳定的3.3V电压,常用AMS1117-3.3稳压芯片。
- 时钟电路:采用8MHz外部晶振,为系统运行提供准确时序。
- 复位电路:由上拉电阻和复位按键构成,当按下复位键时,芯片复位并重新进入待机状态。
2.2 LCD1602液晶显示电路
LCD1602是一种常见的字符型液晶显示模块,能显示两行16个字符。在本设计中,LCD1602用于显示第一个抢答者的编号。
- 通过并行接口与STM32相连,通常使用8位或4位数据线加上控制线(RS、RW、EN)。
- 程序中通过驱动函数对LCD1602进行初始化和数据写入,实现编号显示。
2.3 按键输入电路
系统共设计了5个独立按键,对应5个抢答者。
- 每个按键一端接STM32的GPIO输入口,另一端接地,并通过上拉电阻保证按键未按下时保持高电平。
- 当按键按下时,GPIO检测到低电平信号,从而识别抢答者的编号。
- 复位按键作为单独输入,按下后将STM32复位,从而重新进入抢答准备状态。
2.4 电源电路
系统由5V直流电源供电,通过稳压芯片转换为3.3V供STM32和LCD1602使用。电路中还需要电容滤波以保证电源稳定,避免干扰引起误触发。
3 程序设计
程序设计是系统的核心,主要实现按键检测、抢答者编号判断、LCD1602显示和复位逻辑。程序采用C语言编写,使用STM32标准外设库进行开发。
3.1 主程序框架
主程序完成系统初始化,包括时钟、GPIO、LCD初始化,然后进入循环检测按键输入。当检测到某个按键第一次被按下时,立即锁定并显示对应编号。
#include "stm32f10x.h"
#include "lcd1602.h"
#include "delay.h"
#include "key.h"
int main(void)
{
SystemInit(); // 系统初始化
LCD1602_Init(); // LCD初始化
Key_Init(); // 按键初始化
LCD1602_Clear();
LCD1602_ShowString(0, 0, "Waiting...");
while(1)
{
int keyVal = Key_Scan();
if(keyVal != 0)
{
LCD1602_Clear();
LCD1602_ShowNum(0, 0, keyVal, 1);
while(1); // 锁定,等待复位
}
}
}
3.2 按键检测程序
按键扫描函数用于检测第一个被按下的按键编号。由于系统只响应第一个按键,因此一旦检测到有效输入,就返回该按键编号。
int Key_Scan(void)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) return 1;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0) return 2;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2) == 0) return 3;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3) == 0) return 4;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == 0) return 5;
return 0;
}
3.3 LCD1602显示程序
LCD显示模块负责将抢答结果直观呈现给用户。只显示抢答编号,不做其他字符输出,保证信息清晰简洁。
void LCD1602_ShowNum(u8 x, u8 y, u8 num, u8 len)
{
LCD1602_SetCursor(x, y);
LCD1602_WriteData(num + '0'); // 将数字转换为字符显示
}
3.4 复位逻辑
由于系统必须保证只有一次有效抢答,因此程序在显示编号后进入死循环,直到用户手动按下复位键或重新上电。复位后系统会重新进入待机状态。
4 总结
本文设计并实现了一个基于STM32单片机的抢答器时间显示系统。系统通过5路按键输入识别第一个抢答者,并利用LCD1602液晶模块显示编号结果。程序逻辑保证了公平性,只记录第一次按键操作,且后续按键无效,直到系统重新复位后才开启新一轮抢答。
在硬件设计方面,系统由STM32最小系统、LCD1602液晶显示电路、按键输入电路和电源电路构成,结构清晰,易于实现。在软件设计方面,程序模块化清晰,按键检测、LCD显示和复位逻辑相互独立,具有较好的可维护性。
该抢答器系统具备实时性强、显示直观和操作简单等特点,非常适合在课堂互动、知识竞赛及娱乐活动中应用,具有良好的实用价值。