写一个51单片机的四路数码管抢答器程序
时间: 2023-05-24 13:07:09 浏览: 122
本程序使用51单片机和四个数码管,实现四路抢答器功能。
程序思路:每个数码管使用一个引脚作为数码管位选(选择哪个数码管显示),其他引脚作为段选(显示数字)。每个抢答按键按下时,判断是否已有人按下,若没有,则该按键胜出,该数码管显示对应数字,并将该按键胜出标志置1;若已有人按下,则不操作。当四个按键都被按下后,清除所有按键的胜出标志,等待下一轮抢答。
代码如下:
```
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit dig1 = P1^0; // 数码管1的位选引脚
sbit dig2 = P1^1; // 数码管2的位选引脚
sbit dig3 = P1^2; // 数码管3的位选引脚
sbit dig4 = P1^3; // 数码管4的位选引脚
sbit led0 = P2^4; // 抢答器0的LED指示灯
sbit led1 = P2^5; // 抢答器1的LED指示灯
sbit led2 = P2^6; // 抢答器2的LED指示灯
sbit led3 = P2^7; // 抢答器3的LED指示灯
sbit key0 = P3^0; // 抢答器0的按键
sbit key1 = P3^1; // 抢答器1的按键
sbit key2 = P3^2; // 抢答器2的按键
sbit key3 = P3^3; // 抢答器3的按键
uchar code numTable[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; //0~9的数码管段选值
void delay(uint x) //延时函数
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar num, uchar dig) //显示指定数字在指定数码管上
{
switch(dig) //选择要显示的数码管
{
case 1:
dig1 = 0;
P0 = numTable[num];
delay(1);
dig1 = 1;
break;
case 2:
dig2 = 0;
P0 = numTable[num];
delay(1);
dig2 = 1;
break;
case 3:
dig3 = 0;
P0 = numTable[num];
delay(1);
dig3 = 1;
break;
case 4:
dig4 = 0;
P0 = numTable[num];
delay(1);
dig4 = 1;
break;
}
}
uchar getWinner(void) //获取获胜的抢答器编号
{
if(key0 == 0) //抢答器0按键按下了
{
if(led0 == 0) //未有人按下,胜出
{
led0 = 1; //指示灯亮
return 0;
}
}
if(key1 == 0) //抢答器1按键按下了
{
if(led1 == 0) //未有人按下,胜出
{
led1 = 1; //指示灯亮
return 1;
}
}
if(key2 == 0) //抢答器2按键按下了
{
if(led2 == 0) //未有人按下,胜出
{
led2 = 1; //指示灯亮
return 2;
}
}
if(key3 == 0) //抢答器3按键按下了
{
if(led3 == 0) //未有人按下,胜出
{
led3 = 1; //指示灯亮
return 3;
}
}
return 0xff; //没有人获胜,返回0xff
}
void clearWinner(void) //清除所有获胜者
{
led0 = 0;
led1 = 0;
led2 = 0;
led3 = 0;
}
void main(void)
{
uchar winner = 0xff; //初始化赢家标志
while(1)
{
clearWinner(); //清除所有获胜者
while(winner == 0xff) //等待有人按下按键
{
winner = getWinner(); //获取获胜的抢答器编号
}
display(winner, 1); //在第一位数码管上显示获胜抢答器编号
while(key0 == 0 || key1 == 0 || key2 == 0 || key3 == 0); //等待所有按键松开
winner = 0xff; //重置获胜者标志
}
}
```
该程序需要按键按下后松开,才能继续下一轮抢答。如果需要能够连续抢答(不用松开按键),需要增加按键消抖功能。另外,数码管显示的数字范围为0~3,可以根据需要调整。
阅读全文