51单片机四路抢答器程序
时间: 2023-08-12 14:03:21 浏览: 183
51单片机抢答器程序
下面是一个简单的51单片机四路抢答器程序,供参考:
```c
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SR1=P3^0; //定义抢答按钮1
sbit SR2=P3^1; //定义抢答按钮2
sbit SR3=P3^2; //定义抢答按钮3
sbit SR4=P3^3; //定义抢答按钮4
sbit LED1=P2^4; //定义LED1
sbit LED2=P2^5; //定义LED2
sbit LED3=P2^6; //定义LED3
sbit LED4=P2^7; //定义LED4
sbit Beep=P1^5; //定义蜂鸣器
uchar code table[]="1.2.3.4.5.6.7.8.9.0"; //定义数码管显示字符
uchar num[4]; //定义数码管显示数值
uchar score[4]; //定义抢答得分
void delay(uint n) //延时函数
{
uint i,j;
for(i=0;i<n;i++)
{
for(j=0;j<125;j++);
}
}
void Init_Timer0() //定时器0初始化
{
TMOD|=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
EA=1;
TR0=1;
}
void Disp(uchar n) //数码管显示
{
uchar i;
P0=0x7f;
for(i=0;i<4;i++)
{
P2=(P2&0x0f)|0x10;
P0=table[num[i]];
delay(1);
P0=0xbf;
delay(1);
}
if(n>0) //显示抢答得分
{
P2=(P2&0x0f)|0x10;
P0=table[score[n-1]];
delay(1);
P0=0xdf;
delay(1);
}
}
void main()
{
uchar flag=0; //标志位,用于记录哪个按钮最先按下
uchar i,max=0; //i为循环计数器,max为记录最先按下的按钮编号
Init_Timer0(); //初始化定时器0
while(1)
{
if(!SR1&&!SR2&&!SR3&&!SR4) //检测是否有按钮按下
{
flag=0;
Beep=1;
delay(10);
Beep=0;
delay(100);
for(i=0;i<4;i++) //按下按钮的编号赋值给标志位
{
if(!SR1) flag=1;
else if(!SR2) flag=2;
else if(!SR3) flag=3;
else if(!SR4) flag=4;
}
if(flag>0&&flag<=4) //记录最先按下的按钮编号
{
if(flag>max) max=flag;
}
}
if(max>0) //显示最先按下的按钮编号和得分
{
num[0]=max/10; //将数值分解为个位和十位
num[1]=max%10;
num[2]=0;
num[3]=0;
score[max-1]++; //对应按钮得分加1
Disp(max); //显示数码管
delay(1000); //延时1秒
max=0; //重置最先按下的按钮编号
}
}
}
void Timer0_ISR() interrupt 1 //定时器0中断服务程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
Disp(0); //数码管显示清零
}
```
以上程序实现了四路抢答器的基本功能,包括按键扫描、最先按下按钮的记录、抢答得分的计算和数码管显示等。需要注意的是,该程序只是一个简单的示例,实际应用中还需要考虑更多的情况和细节。
阅读全文