单片机课设(8人抢答器)

设计要求:

该抢答器上电或按键复位后能自动显示系统提示符“P.”, 进入准备工作状态。主持人按下开始按钮后,抢答开始并限定时间30S;10S内无人抢答,蜂鸣器发出音响;主持人按下开始按钮之前有人按下抢答器,抢答违规,显示器显示违规台号,违规指示灯亮,其它按钮不起作用;正常抢答,显示器显示台号,蜂鸣器发出音响,其它抢答按钮无效;正常抢答下,从按下抢答按钮开始30S内,答完按钮没按下,则作超时处理,超时处理时,违规指示灯亮,显示器显示违规台号。蜂鸣器发出音响;各台数字显示的消除,蜂鸣器音响及违规指示灯的关断,都要通过主持人按复位按钮

功能实现代码:

#include "Race_Device.h"


void main()
{	
	//定时器0初始化
	init_Timer0();
	//显示'P.'
	display(~weizhi[0] , shuzhi[11]);
	while(1)
	{
		//按键初始化
		keynumber=0;
		//选手人摁键扫描,判断是否有人提前摁下
		number=keyscan();
		switch(number)
		{
			case ON:	
					while(1)
					{
						//打开计数器
						TR0=1;
						//让数码管在不同情况下动态显示
						dongtaixianshi();
						number=keyscan();
						//只有当主持人摁下键才可以离开显示抢答者信息
						if(number==OFF)
						{
							//显示'P.'
							display(~weizhi[0] , shuzhi[11]);
							//关闭定时器0
							TR0=0;
							//计时清零
							s=0;
							cnt0=0;
							Flag_Timer=0;
							//违规指示灯关闭
							led=1;
							//关闭蜂鸣器
							beep=1;
							break;
						}			
					}
			break;
			case OFF:
						//显示'P.'
						display(~weizhi[0] , shuzhi[11]);
			break;
			default:
					while((number>=1)&&(number<=7))
					{
						if(!Flag_number)
						{
							Flag_number=1;
							Value=number;
						}	
						//在显示违规者信息的时候违规灯一同打开了
						display(~weizhi_LED[0] , shuzhi[Value]);
						delayms(10);
						display(~weizhi_LED[1] , shuzhi[12]);
						delayms(10);
						display(~weizhi_LED[2] , shuzhi[13]);	
						number=keyscan();
						//只有当主持人摁下键才可以离开显示违规者信息
						if(number==OFF)
						{
							//为下一次做准备
							Flag_number=0;
							Value=0;
							//违规指示灯关闭
							led=1;
							//显示'P.',同时关闭违规灯
							display(~weizhi[0] , shuzhi[11]);
							break;
						}
						if(number==ON)
						{
							number=Value;
							keynumber=Value;
						}
					}	
			break;
		}					
	}
}

void timer0() interrupt 1
{
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	cnt0++;
	//10秒内
	if((cnt0<=200)&&(!Flag_Timer))
	{	
		number=keyscan();
		//判断是否有选手在10秒内摁下
		if((number>=1)&&(number<=7))
		{
			//记录第一次按下抢答选手信息
			if(!Flag_HuiDa)
			{
				Value_Player=number;
				//让抢答选手准备第二次回答,重新开始计时
				cnt0=0;
				keynumber=0;
				number=0;
				Flag_HuiDa=1;				
			}
			if(Flag_HuiDa&&Value_Player==number)
			{
				TR0=0;
				shuchuxinxi();
			}
		}
		//当时间到了10秒让蜂鸣器响2秒
		if(cnt0==200)
		{
			beep=0;
			Flag_Timer=1;
			Flag_Beep=1;
		}
	}
	//判断30秒内是否有被摁下
	if((cnt0<=600)&&(Flag_Timer))
	{
		//让蜂鸣器响1秒后关闭
		if(cnt0==240)
		{
			Flag_Beep=0;
			beep=1;
		}
		keynumber=0;
		number=keyscan();
		//30秒内被摁下
		if((number>=1)&&(number<=7))
		{
			//记录第一次按下抢答选手信息
			if(!Flag_HuiDa)
			{
				Value_Player=number;
				//让抢答选手准备第二次回答,重新开始计时
				cnt0=0;
				keynumber=0;
				number=0;	
				Flag_HuiDa=1;				
			}
			if(Flag_HuiDa&&Value_Player==number)
			{
				TR0=0;
				shuchuxinxi();
			}
		}
	}
	//当30秒内无人摁下抢答器
	if(s==31)
	{
		if(!Flag_HuiDa)
			chaoshichuli();
		else
			chaoshichuli_HuiDa();
	}
	if(!Flag_HuiDa)
	{
		//为了让在10s内无人抢答蜂鸣器响2秒
		if(Flag_Beep)
		{
			//每隔1秒让s++
			if(cnt0%20==0)
			{
				s=cnt0/20;
				//关闭选手信息
				display(~weizhi_Beep[0] , shuzhi[10]);
				display(~weizhi_Beep[1] , shuzhi[10]);
				//显示倒计时
				display(~weizhi_Beep[2] , shuzhi[jishi[s]/10]);
				display(~weizhi_Beep[3] , shuzhi[jishi[s]%10]);
			}	
		}
		else
		{
			//每隔1秒让s++
			if(cnt0%20==0)
			{
				s=cnt0/20;
				//关闭选手信息
				display(~weizhi[0] , shuzhi[10]);
				display(~weizhi[1] , shuzhi[10]);
				//显示倒计时
				display(~weizhi[2] , shuzhi[jishi[s]/10]);
				display(~weizhi[3] , shuzhi[jishi[s]%10]);
			}		
		}	
	}
	else
	{
		//为了让在10s内无人抢答蜂鸣器响2秒
		if(Flag_Beep)
		{
			//每隔1秒让s++
			if(cnt0%20==0)
			{
				s=cnt0/20;
				//显示第一次按下抢答器选手信息
				display(~weizhi_Beep[0] , shuzhi[Value_Player]);
				display(~weizhi_Beep[1] , shuzhi[12]);
				//显示倒计时
				display(~weizhi_Beep[2] , shuzhi[jishi[s]/10]);
				display(~weizhi_Beep[3] , shuzhi[jishi[s]%10]);
			}	
		}
		else
		{
			//每隔1秒让s++
			if(cnt0%20==0)
			{
				s=cnt0/20;
				//显示第一次按下抢答器选手信息
				display(~weizhi[0] , shuzhi[Value_Player]);
				display(~weizhi[1] , shuzhi[12]);
				//显示倒计时
				display(~weizhi[2] , shuzhi[jishi[s]/10]);
				display(~weizhi[3] , shuzhi[jishi[s]%10]);
			}		
		}			
	}
}

实现效果:

上电效果图

 提前抢答效果图

一个小白写的代码,欢迎各位大佬指点

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值