八位抢答器【51单片机】

该博客主要介绍了基于51单片机的八路抢答器设计。设计目的是实现一个有30S抢答倒计时,抢到后有10S回答问题时间的抢答器。

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

设计目的:设计一个八路抢答器,抢答时间为30S倒计时,抢到后,有10S的回答问题时间
proteus8.6版本

#include <reg52.h>
#include <absacc.h>
unsigned char code SEG[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管的断码表,共阴级
unsigned char dispbuf[2]={0,0};  //显示缓冲区百十个位
unsigned char flag=0; //1s到标志位
sbit setting=P3^0;
sbit opening=P3^1;
sbit beep=P3^7;
unsigned char number;//存放按键抢答号
unsigned char m;
unsigned char mm=30;//存放答题30秒
/*
定时器初始化函数
@ 彭王冲
*/
void delay();
void display(unsigned char m);
unsigned char anjian();//函数声明
void Timer0_Init()		  
{  TMOD=0x01;  //定时器0方式1
   TH0=(65536-5000)/256;    //定时5ms
   TL0=(65536-5000)%256;
   ET0=1;	   //开中断
   EA=1;
   TR0=1; 	 //开定时器0
}
void Timer0_ISR()  interrupt 1 using 0
{  
   static unsigned char i=0,k=0;//其中m和mm分别为5秒倒数计时和30秒倒数计时
   
   TH0=(65536-5000)/256; //重赋初值
   TL0=(65536-5000)%256;
	 k++;
  if(k==200)  
  { 
      k=0;
		if(mm==0)
		   mm=0;
		else
	    mm--;
		 
		
  }
	if(mm==3)
	{for(m=3;m--;m>0)
		
		{beep=!beep;
		delay();}
	}
		
	P1=0xff;//关闭数码管
	if(i==2)
		P1=SEG[number];
	else
		P1=SEG[dispbuf[i]];
	  P3 = ~(0x08<<i);
	i++;
	if(i==3)
		i=0;
 display(mm);
 
}
void display(unsigned char m)
{
     dispbuf[1]= m/10      ;	//获取十位
	   dispbuf[0]= m%10       ;	//获取个位 
}
//盐水
void delay()
{  unsigned char i;
   for(i=0;i<120;i++);	   //延时1ms
}


void main()
{ 
	
	Timer0_Init();
		
	while(1)
	{  if(opening==0)
			mm=30;
		if(P2!=0xff)//如果有按键按下,则返回按键值
		{
			
			number=anjian();
			mm=10;
			while(1)
			{
				if(opening==0)
				{mm=30;number=0;break;}
			}
		
		}
		
	
	}
}
//案件处理函数
unsigned char anjian()
{
	switch(P2)
	{
		case 0xfe:return 1;break;
		case 0xfd:return 2;break;
		case 0xfb:return 3;break;
		case 0xf7:return 4;break;
		case 0xef:return 5;break;
		case 0xdf:return 6;break;
		case 0xbf:return 7;break;
		case 0x7f:return 8;break;
	   default:return 0;
	}
}
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

书中藏着宇宙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值