基于51单片机的智能四人抢答器Protues仿真设计

目录

一、设计背景

二、实现功能

三、仿真演示

四、源程序(部分)


一、设计背景

        近年来随着科技的飞速发展,单片机的应用正在不断的走向深入。本文阐述了基于51单片机的四路抢答器设计。本设计中,51单片机充当了核心控制器的角色,通过IO口与各个功能模块相连接。按键模块负责检测参与者的抢答动作,当有人按下抢答按钮时,会通过IO口电平的变化通知单片机,单片机会记录按键的次序,并通过数码管显示当前的抢答结果。

        为了保证抢答过程的准确性和公平性,设计中还需要考虑到以下因素。首先,按键模块需要具备快速响应和高可靠性,以确保抢答者的动作能够被准确地捕捉到。其次,显示屏模块需要能够实时更新抢答结果,并显示相应的信息,比如参与者的编号和抢答时间。最后,在电路连接方面,需要注意各个模块之间的线路布局,以避免信号干扰和电气问题。

       软件系统采用C语言编写程序,包括显示程序,定时中断服务,延时程序等,并在KEIL5中调试运行,硬件系统利用PROTEUS8.11强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。

二、实现功能

        以51单片机为控制核心,设计一种四路抢答器。整个系统包括MCU、晶振电路、时钟电路、LED指示电路、功能按键以及数码管显示等。该系统利用共阳数码管显示选手得分、回答时间和主持人评分分数,通过独立按键设计控制抢答器的启动和不同选手的抢答。可具体实现以下功能:

        (1)一个按键供主持人使用,在支持人按下按键后,四名选手可以按键抢答。
        (2)四个按键供四名选手进行抢答。
        (3)四个LED灯指示哪位选手按键抢答成功。
        (4)主持人先按抢答键,然后开始抢答,抢答成功后开始30s倒计时答题。每个选手有一个抢答键,四位数码管在答题时就倒计时,不答题时就正常显示选手分数。
        (5)主持人只有一个按键,按下抢答后,后面加分或减分用同一个按键,可以再短按一次加分,短按两次减分。

三、仿真演示

未运行仿真时,数码管不显示。

运行仿真后,数码管显示四位抢答选手的得分情况,开始均为0分,主持人第一次按下开始抢答按键,此时抢答指示灯亮起,开始抢答。

选手抢答时间持续10s,在这10s内,若有选手抢答成功,其对应的抢答成功指示灯亮起,数码管开始显示30s回答时间倒计时。

30s回答时间结束,进入主持人评分阶段,此时通过按动开始抢答按键次数,来对抢答选手评分,即若按下一次开始抢答按键,则该选手加一分,若按下两次则减一分,数码管此时显示按下开始按键的次数。

主持人评分阶段结束后,这一轮抢答结束,数码管会显示一轮过后四位选手的得分情况,此时再次按动开始按钮,可以进行下一轮的抢答,过程与上述类似。

四、源程序(部分)

#include "reg52.h"
#include "delay.h"
#include "smg.h"
#include "timer.h"

sbit key1 = P1^0;	//四位选手
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;

sbit Led1 = P1^4;	//四位选手
sbit Led2 = P1^5;
sbit Led3 = P1^6;
sbit Led4 = P1^7;

sbit start_stop = P3^6;	//抢答按钮
sbit AnswerLed = P3^7;

_bool action = 0;
_bool key1_flag = 0;
_bool key2_flag = 0;
_bool key3_flag = 0;
_bool key4_flag = 0;


int second = 10;	//时间
uint8 timer0_count = 0;	//定时器1计数值
uint8 number = 0; //队号
uint8 number_display = 0;	//队号显示

int SlectScore1 = 0;	//选手1分数
int SlectScore2 = 0;	//选手2分数
int SlectScore3 = 0;	//选手3分数
int SlectScore4 = 0;	//选手4分数

uint8 AddCnt = 0;	
uint16 HstCnt = 0;	
uint8 key_scan8(void);
void start_stop_keyscan(void);
void SelectLed(channel);
void SelectSlector(channel);
/*-----------------------------------------------------------
主函数
------------------------------------------------------------*/
void main()
{
	ConfigTimer0();//定时器初始化
	while(1)
	{
		start_stop_keyscan();//开始按键
		while(action)//按下开始键为1,抢答结束为0
		{
			while(!key_scan8())	//无队抢答
			{
				display(SlectScore1*10+SlectScore2,SlectScore3*10+SlectScore4);
        AnswerLed=0;//抢答指示灯				
				if(second == 0)
				{
					AnswerLed=1;
					break;
				}
			}
			if(number_display)//有队抢答
			{
				AnswerLed=1;
				SelectLed(number_display);
				second=30;
			}
			while(1)
			{
				display(0,second);
				if(second == 0)
				{
					TR0 = 0;//时间到
					Led1=1;Led2=1;Led3=1;Led4=1;
					break;
					
				}
			}
			while(1)
			{	
				display(0,AddCnt);
				if(start_stop == 0)
				{
					Delay_ms(8);
					if(start_stop == 0)
					{
              AddCnt++;
						  if(AddCnt>=3)
							{
							  break;
							}					
							while(start_stop == 0)
							{
								display(0,AddCnt);		
							}
					}
				 }		
				 HstCnt++;
				 if(HstCnt>=800)
				 {
				   HstCnt=0;
					 break;
				 }						
			}
			SelectSlector(number_display);
			display(SlectScore1*10+SlectScore2,SlectScore3*10+SlectScore4);
			number_display = 0;
			action=0;
			AddCnt=0;
			second = 10;
			break;
		}
		display(SlectScore1*10+SlectScore2,SlectScore3*10+SlectScore4);	
	}
}

/*-----------------------------------------------------------
中断服务函数
------------------------------------------------------------*/
void timer0() interrupt 1
{
	TH0 = (65536-50000)/256; //50ms
	TL0 = (65536-50000)%256;	
	timer0_count ++;
	if(timer0_count == 20)//1s
	{
		timer0_count = 0;
		second--;	//10s倒计时
		if(second == 0)//计时结束
		{
			TR0 = 0;
			action=0;
		}
	}	
}

/*-----------------------------------------------------------
开始键扫描函数
------------------------------------------------------------*/
void start_stop_keyscan(void)
{
	if(start_stop == 0)
	{
		Delay_ms(8);
		if(start_stop == 0)
		{
			action = 1;
			TR0 = 1;
		}
		while(start_stop == 0)
		{
      display(SlectScore1*10+SlectScore2,SlectScore3*10+SlectScore4);		
		}
	}
}

/*-----------------------------------------------------------
四位抢答键扫描函数
------------------------------------------------------------*/
uint8 key_scan8(void)
{
	if(key1 == 0)
	{
		Delay_ms(8);
		if(key1 == 0)
		{
			number_display = 1;
		}
	}
	
	if(key2 == 0)
	{
		Delay_ms(8);
		if(key2 == 0)
		{
			number_display = 2;
		}
	}

	
	if(key3 == 0)
	{
		Delay_ms(8);
		if(key3 == 0)
		{
			number_display = 3;
		}
	}
	
	if(key4 == 0)
	{
		Delay_ms(8);
		if(key4 == 0)
		{
			number_display = 4;
		}
	}
							
	if(number_display != 0)	
	{
		return 1;
	}
	else
	{
		return 0;
	}	
}

void SelectLed(channel)
{
   switch(channel)
	 {
			case 1:Led1=0;Led2=1;Led3=1;Led4=1;break;
			case 2:Led1=1;Led2=0;Led3=1;Led4=1;break;
			case 3:Led1=1;Led2=1;Led3=0;Led4=1;break;
			case 4:Led1=1;Led2=1;Led3=1;Led4=0;break;
   } 
}

void SelectSlector(channel)
{
   switch(channel)
	 {
			case 1:
				if(AddCnt==1)
				{
				  SlectScore1++;
				}
				else if(AddCnt==2)
				{
				  SlectScore1--;
					if(SlectScore1<=0)
					{ 
					  SlectScore1 = 0;
					}
				}
				break;
			case 2:
				if(AddCnt==1)
				{
				  SlectScore2++;
				}
				else if(AddCnt==2)
				{
					SlectScore2--;
					if(SlectScore2<=0)
					{ 
					  SlectScore2 = 0;
					}
				}
				break;
			case 3:
				if(AddCnt==1)
				{
				  SlectScore3++;
				}
				else if(AddCnt==2)
				{
					SlectScore3--;
					if(SlectScore3<=0)
					{ 
					  SlectScore3 = 0;
					}
				}
				break;
			case 4:
				if(AddCnt==1)
				{
				  SlectScore4++;
				}
				else if(AddCnt==2)
				{
					SlectScore4--;
					if(SlectScore4<=0)
					{ 
					  SlectScore4 = 0;
					}
				}
				break;
   } 
}

仿真源文件、源程序、演示视频以及相关资料百度网盘链接: https://pan.baidu.com/s/166Y96ZzcT0DTVX45csJt-A?pwd=iqz3 
提取码: iqz3 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薄情书生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值