基于51单片机的八路抢答器设计

一.硬件方案

本设计 利用STC89C52单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,扬声器发生提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间为60秒,倒计时为5秒时蜂鸣器报警,选手抢答成功后显示选手编号以及剩余时间。电路主要由51单片机+最小系统+数码管+蜂鸣器+按键模块;

二.设计功能

(1)采用4位数码管设计;下排按键一一对应八位选手。
(2)竖排三个按键,从上到下依次为:开始、暂停、复位。
(3)操作流程:上电后数码管显示“----”当主持人按下“开始”键后,60秒,开始计时,此时,八位选手就可以抢答,如有紧急情况需要停止的话,主持人按“暂停”键就可以,如果有选手抢答成功,数码管显示“1 25”,1表示是1号选手,25表示剩余还25秒,小于5秒时,蜂鸣器响,提示时间快要结束,当为0秒时,此题结束,表示没有任何选手抢答成功,主持人按“复位”键后从新开始。
(4)可以设定时间,在上电后,数码管显示“----”,此时按下1号选手对应的按键,进入时间设定状态,2号选手对应的按键为时间加,3号选手对应的按键为时间减,设定完成后再按1号选手键退出。

三.设计原理图

(1)原理图主要采用AD软件进行设计,如图:
在这里插入图片描述
(2)Protues仿真图如下:
在这里插入图片描述

四.软件设计

主程序源码

void main()
{
int djs1=60;
Timer0_init();	 //初始化定时器中断
spk=1;			  //蜂鸣器不响
        djs=60;		//倒计时赋值
while(1)
{

LOOP1:   djs=djs1;
djsxs22();	//LOOP1是标号,显示 -  --

if(key1==0)		 //在定时器运行状态下,key1==0 则说明1号选手按下按键
{
	delayms(3);
	if(key1==0)
	{ 
		while(!key1);	  //去除按键抖动后,重新在判断,是否确实按下
		djs=60;
		while(1)
		{
			TR0=0;		  //定时器停止
			djsxs();	  
			if(key2==0)	  //复位按下按下
			{	
			   delayms(8);		   //去除抖动
			   if(key2==0)	   //再次判断是否按下复位按键
			   {
					do
					{ 
			   			while(!key2); //如果按下复位键,则回到- --状态
						delayms(5);
					}
					while(key2!=1);
					djs++;
					djs1=djs;
				}
			}
			if(key3==0)	  //复位按下按下
			{	
			   	delayms(8);		   //去除抖动
			   	if(key3==0)	   //再次判断是否按下复位按键
			   	{ 
					do
					{
			   			while(!key3); //如果按下复位键,则回到- --状态
						delayms(5);	
					}
					while(key3!=1);
					djs--;
					djs1=djs;
				}
			}
			if(key1==0)	  //复位按下按下
			{	
			   delayms(3);		   //去除抖动
			   if(key1==0)	   //再次判断是否按下复位按键
			   { 
			   		while(!key1); //如果按下复位键,则回到- --状态
					goto LOOP1;		  //goto语句,回到loop1表号处
				}
			}										   
		}
	}
}
if(keyks==0)
{		   
	//spk=0;
	delayms(3);		 //去除按键抖动
	if(keyks==0)
	{ 
		while(!keyks);	  //以上表示按下开始按键 
		//spk=1;			   //蜂鸣器不响
		TR0=1;			   //启动定时器 开始倒计时
		while(1)
		{
			djsxs();
			if(keytz==0)
			{
			   	delayms(3);			 //此处表示出去抖动, 以后不一一标出
			   	if(keytz==0)
			   	{ 
			   		 while(!keytz)	   //以上表示按下停止按键后 
					{
						TR0=0;		   //定时器停止
						flag=0;//
						spk=1;
					}

				}
			}
			if(keyks==0)
			{
				//spk=0;
			   	delayms(3);
			   if(keyks==0)
			   	{ 
			   		while(!keyks);	   //以上表示按下清楚按键后 
					//spk=1;			   //蜂鸣器不响
					TR0=1;		   //定时器启动

				}
			}
			.......
		} 

	}

	}
}
 }
}

资料链接:https://pan.baidu.com/s/1SQIbDdgJVKVdl6tlzw6_2A?pwd=dian

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值