1054-基于51单片机的比赛评分器原理图、流程图、物料清单、仿真图、源代码
功能介绍:
比赛打分器
1、共有9位选手,4个评委
2、通过按键切换选手和评委,数字键用来打分。每个选手的分数是4个评委打分总和
3、计算前三名并显示选手编号
4、分数大于6分算及格,统计及格人数并显示
有哪些资料:
1、仿真工程文件
2、源代码工程文件
3、原理图工程文件
4、流程图
5、功能介绍
6、元件清单
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
uchar code smgduan0[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9,无小数点
uchar code smgduan1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//显示0~9,有小数点
uchar people=1;//选手
uchar pan=1;//裁判
uchar fen1[]={0,0,0,0,0,0,0,0,0};//分数
uchar fen2[]={0,0,0,0}; //打分
uchar a=0,b=0,c=0;//排名
uchar sum=0;//平均
uchar num=0;//通过人数
uchar key_scan()//按键检测
{
uchar i,j;
i=0;
j=0;
P1=0x0f;
if(P1!=0x0f) //检测有无按下
{
switch(P1)//检测行
{
case 0x0e:i=1;break;
case 0x0d:i=5;break;
case 0x0b:i=9;break;
case 0x07:i=13;
}
P1=0xf0;
switch(P1)//检测列
{
case 0xe0:j=0;break;
case 0xd0:j=1;break;
case 0xb0:j=2;break;
case 0x70:j=3;
}
while(P1!=0xf0);//等待按键松开
}
return i+j;
}
void delay(uint i)//延时
{
while(i--);
}
//主函数
void main()
{
uchar i,j,k;
while(1)
{
i=key_scan();
if(i==13)//下一个评委
{
if(pan<4)
pan++;
}
if(i==15)//复位
{
a=0;b=0;c=0;
people=1;
pan=1;
fen2[0]=0;
fen2[1]=0;
fen2[2]=0;
fen2[3]=0;
for(j=0;j<10;j++)
{
fen1[j]=0;
}
num=0;
}
if(i==14)//下一个选手
{
fen1[people-1]=sum;
if(people<9)
people++;
pan=1;
fen2[0]=0;
fen2[1]=0;
fen2[2]=0;
fen2[3]=0;
}
//计算排名,OK
if(i==16)
{
fen1[people-1]=sum;
a=0;b=0;c=0;k=0;
for(j=0;j<people;j++)
{
if(fen1[j]>k)//第一名
{
k=fen1[j];
a=j+1;
}
if(fen1[j]==k)
{
a=j+1;
}
}
k=0;
for(j=0;j<people;j++)
{
if((fen1[j]>k)&&(j!=(a-1)))//第二名
{
k=fen1[j];
b=j+1;
}
if((fen1[j]==k)&&(j!=(a-1)))
{
b=j+1;
}
}
k=0;
for(j=0;j<people;j++)
{
if((fen1[j]>k)&&(j!=(a-1))&&(j!=(b-1)))//第三名
{
k=fen1[j];
c=j+1;
}
if((fen1[j]==k)&&(j!=(a-1))&&(j!=(b-1)))
{
c=j+1;
}
}
if(sum>6)//通过人数
num++;
fen2[0]=0;
fen2[1]=0;
fen2[2]=0;
fen2[3]=0;
sum=0;
}
//打分
if((i>0)&&(i<12))
{
fen2[pan-1]=i-1;//记录分数
}
//计算平均分
sum=(fen2[0]+fen2[1]+fen2[2]+fen2[3])/4;