STM32普中F103抢答器与抢答器的延时控制

本文介绍了一种基于STM32的抢答器设计,包括简单原理、程序实现及创新改进,通过按键输入来判断谁先按下并点亮相应指示灯。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简单原理

两人进行按键抢答,两人在听到口令后同时按下,先按下的的对应的灯亮了,后按下的对应的灯始终不会亮,按下复位键进行下一轮比拼,从而实现抢答的功能。

二、抢答器的简单程序

可以打开stm32跑马灯的例程进行相关操作

main.c

#include "stm32f10x.h"
GPIO_InitTypeDef GPIO_InitStructure;

uint32_t i,j;
void KEYInit(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOA, GPIO_Pin_0);
	GPIO_SetBits(GPIOE, GPIO_Pin_3);
	GPIO_SetBits(GPIOE, GPIO_Pin_4);
	
	}


int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOB, GPIO_Pin_5);
	GPIO_SetBits(GPIOE, GPIO_Pin_5);

	KEYInit();
	while(1)
		{
			if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
			{

			GPIO_ResetBits(GPIOB, GPIO_Pin_5);
			GPIO_ResetBits(GPIOE, GPIO_Pin_5);
				for(i=0;i<1000;i++)	
			{
				for(j=0;j<10000;j++);
			}
			break;
			}
			if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)==0)
			{

			GPIO_SetBits(GPIOB, GPIO_Pin_5);
			GPIO_ResetBits(GPIOE, GPIO_Pin_5);
				for(i=0;i<1000;i++)	
			{
				for(j=0;j<10000;j++);
			}
			break;
			}
			if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
			{

			GPIO_ResetBits(GPIOB, GPIO_Pin_5);
			GPIO_SetBits(GPIOE, GPIO_Pin_5);
				for(i=0;i<1000;i++)	
			{
				for(j=0;j<10000;j++);
			}
			break;
			}
	
}


}

三、简易创新

按下后不用按复位键熄灯,我们可以自动延时几秒让其熄灯(可以根据自己的需要进行延时长短)

下面例子是延时5秒后自动熄灯

main.c

#include "stm32f10x.h"
GPIO_InitTypeDef GPIO_InitStructure;

uint32_t i,j;
void KEYInit(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_ResetBits(GPIOA, GPIO_Pin_0);
	GPIO_SetBits(GPIOE, GPIO_Pin_3);
	GPIO_SetBits(GPIOE, GPIO_Pin_4);
	
	}


int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOB, GPIO_Pin_5);
	GPIO_SetBits(GPIOE, GPIO_Pin_5);

	KEYInit();
	while(1)
		{
			if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)==0)
			{

			GPIO_ResetBits(GPIOB, GPIO_Pin_5);
			GPIO_ResetBits(GPIOE, GPIO_Pin_5);
				for(i=0;i<1000;i++)	
			{
				for(j=0;j<10000;j++);
			}
	                                  GPIO_SetBits(GPIOB, GPIO_Pin_5);
			GPIO_SetBits(GPIOE, GPIO_Pin_5);
			}
			if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)==0)
			{

			GPIO_SetBits(GPIOB, GPIO_Pin_5);
			GPIO_ResetBits(GPIOE, GPIO_Pin_5);
				for(i=0;i<1000;i++)	
			{
				for(j=0;j<10000;j++);
			}
			GPIO_SetBits(GPIOB, GPIO_Pin_5);
			GPIO_SetBits(GPIOE, GPIO_Pin_5);
			}
			if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
			{

			GPIO_ResetBits(GPIOB, GPIO_Pin_5);
			GPIO_SetBits(GPIOE, GPIO_Pin_5);
				for(i=0;i<1000;i++)	
			{
				for(j=0;j<10000;j++);
			}
			GPIO_SetBits(GPIOB, GPIO_Pin_5);
			GPIO_SetBits(GPIOE, GPIO_Pin_5);
			}
	 
			
}

四、创新后的结果图片显示

5s后:

 

今日的分享完毕了,预知后文是什么?见下回分解

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值