51单片机抢答器代码
时间: 2023-07-02 08:22:13 浏览: 118
以下是基于51单片机的抢答器代码示例:
```
#include <reg51.h>
sbit LED1=P2^0; //定义LED1引脚
sbit LED2=P2^1; //定义LED2引脚
sbit LED3=P2^2; //定义LED3引脚
sbit LED4=P2^3; //定义LED4引脚
sbit KEY1=P3^0; //定义KEY1引脚
sbit KEY2=P3^1; //定义KEY2引脚
sbit KEY3=P3^2; //定义KEY3引脚
sbit KEY4=P3^3; //定义KEY4引脚
unsigned char code LEDtable[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //数码管显示表,共阴数码管
unsigned char code KEYtable[] = {0xfe,0xfd,0xfb,0xf7}; //按键扫描表
unsigned char LEDnum = 0; //当前亮灯的编号,从0开始
unsigned char KEYflag = 0; //按键标志位,0表示未按下,1表示按下
void delay(unsigned int time) //延时函数
{
unsigned int i,j;
for(i = time; i > 0; i--)
for(j = 110; j > 0; j--);
}
void main()
{
unsigned char i;
while(1)
{
if(KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0) //按键检测
{
delay(5); //消除按键抖动
if(KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0) //再次检测按键是否按下
{
for(i = 0; i < 4; i++)
{
if(KEYtable[i] == P3) //找到按下的按键
{
if(LEDnum == i) //回答正确
{
LEDnum++; //亮下一个灯
if(LEDnum > 3) //已经全部回答正确
LEDnum = 0; //重新开始
P1 = LEDtable[LEDnum]; //在数码管上显示当前亮灯的编号
KEYflag = 1; //按键标志位置1
break;
}
else //回答错误
{
LEDnum = 0; //重新开始
P1 = LEDtable[LEDnum]; //在数码管上显示当前亮灯的编号
KEYflag = 1; //按键标志位置1
break;
}
}
}
}
}
if(KEYflag == 1) //按键已经按下
{
LED1 = LED2 = LED3 = LED4 = 0; //关闭所有LED
switch(LEDnum) //亮相应的LED
{
case 0: LED1 = 1; break;
case 1: LED2 = 1; break;
case 2: LED3 = 1; break;
case 3: LED4 = 1; break;
}
KEYflag = 0; //按键标志位复位
}
}
}
```
这个抢答器代码可以实现4个按键和4个LED的控制,当按下某个按键时,如果对应的LED亮起来,则回答正确,亮下一个LED;否则回答错误,重新开始,亮第一个LED。数码管显示当前亮的LED的编号。
阅读全文