• 大小: 90KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-10
  • 语言: 其他
  • 标签: C51计分器  

资源简介

基于C51单片机的篮球计分器,资源中包含完整源代码、已编译的hex文件以及proteus仿真图。 可通过按钮设置A、B队加减分,可通过按键暂停倒计时,可以调快时间或调慢时间。支持换场分数互换

资源截图

代码片段和文件信息

 #include
code unsigned seg[]={0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f};
 // 分别对应数码管显示字形0-9
int m=15n=00x=0y=0jie=2bujin=1zanting=0chuzanting=0;  
 //初始化,m、n为分、秒计时 x、y为A、B两队分数 ,其余为中间变量
 
sbit A_add = P3^0; // A队加分按钮
sbit B_add = P3^1; // B队加分按钮
sbit Time_add = P3^2; // 时间加按钮
sbit Time_sub = P3^3; // 时间减按钮
sbit A_sub = P3^4; // A队减分按钮
sbit B_sub = P3^5; // B队减分按钮
sbit pause = P3^6; // 暂停、启动按钮
sbit change = P3^7; // 换场地按钮

void keyScan(); //按键扫描函数

void delay(int t) //延时子程序,通过参数t,可以调整暂停时间
{
while(t--)
{
unsigned int i;
for(i=0;i<200;i++);    //设置变量i的变化范围,能调整延时的单位时间长度,i越小,延时单位时间越短,精度越高
}
}

void display(int mint nint xint y)//数码管动态刷新显示程序
{
if(jie==1&&bujin!=2)  //中间变量jie=1时,为上半场,对p1赋值
P1=0xbf;    //p1=0xbf即p1=1011111B,点亮上半场对应指示灯

P2=0xfe; //数码管动态刷新显示程序p2=11111110,i为分钟
P0=seg[m/10];    //刷新显示时间显示分钟十位,调用延时程序
delay(1); //延时数码管的点亮
P2=0xff;
P0=0;

P2=0xfd; //同理, 分钟个位并延时点亮
P0=seg[m%10];
delay(1);
P2=0xff;
P0=0;

P2=0xfb;             //秒钟十位
P0=seg[n/10];
delay(1);
P0=0;
P2=0xff;

P2=0xf7;      //秒钟个位
P0=seg[n%10];
delay(1);
P0=0;
P2=0xff;

P2=0xef;   //  A队分数十位
P0=seg[x/10];
delay(1);
P2=0xff;
P0=0;

P2=0xdf;         //A队分数个位
P0=seg[x%10];
delay(10);
P2=0xff;
P0=0;

P2=0xbf;   //B队分数十位
P0=seg[y/10];
delay(1);
P0=0;
P2=0xff;

P2=0x7f;    //B队分数个位
P0=seg[y%10];
delay(1);
P0=0;
P2=0xff;
}

void t0(void) interrupt 1  //调用定时器T0  基本计时单位秒  中断
{
int i;
TH0=0xb1;  //利用定时器T0送入计数初值TH0TL0
TL0=0x10;            //定时器定时单位为20ms

i++;
if(i==50)  //利用中间变量i,令i的值为50 50*20ms=1秒
{
if(n==0)   //分钟与秒时间的调整  当秒减到0后分钟减1
{
n=60;
if(m > 0) m--;
}
n--;   //实现1秒计时
i=0;
}

}




void main()    //主程序
{
TMOD=0x01; //设置定时器工作方式
EA=1;
ET0=1;
TH0=0xb1;    //定时计送计数初值,EA=1,开中断p3口电平拉高
TL0=0x10;  //p1-0x7f,上半场指示灯点亮
TR0=1;
P3=0xff;
P1=0x7f;
while(1)  //通过while(1),反复调用循环体内子程序
{
display(mnxy);  //调用动态刷新显示程序
keyScan(); //按键处理函数

if(m <=0 && n<=0) //时间结束了
{
ET0=0; //关闭中断,停止计时
TR0 = 0;
}
}
}

void keyScan() //按键扫描函数
{
int temp;    //中间变量temp,检测到有按键按下时交换AB两队分数

if(A_add==0) //当检测到A队加分按键按下,对应加分
{
delay(1);   //调用延时子程序,实现按键抖动功能,即当检测到按键按下时,延时,按键仍按下,说明非抖动,A队对应加分
if(A_add==0)
{
x++;
}
}

if(B_add==0)   //B队加分键被按下
{
delay(1);
if(B_add==0)
{
y++;
}
}

if(A_sub==0) //A队减分
{
delay(1);
if(A_sub==0)
{
if(x>=1) x--;
}
}

if(B_sub==0) //B队减分
{
delay(1);
if(B_sub==0)
{
if(y>=1)y--;
}
}

if(Time_add==0) //时间增加按钮
{
delay(10);
if(Time_add==0)
{
n++;
if(n==60)
{
m++;
n=1;
}
}
}

if(Time_sub==0) //时间减少
{
delay(10);
if(Time_sub==0)
{
if(!(m == 0 && n == 0)) //防止被减成了负数
{
if(n <= 0)
{
n = 60;
m--;
}
n--;
}
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件       90360  2016-12-21 11:06  ISIS.dmp
     文件      108751  2016-12-21 18:58  lanqiu.DSN
     文件         742  2016-12-23 16:04  lanqiu.PWI
     文件        9039  2016-12-21 19:24  lanqiu1
     文件        4034  2016-12-21 19:24  lanqiu1.c
     文件        3115  2016-12-21 19:24  lanqiu1.hex
     文件          62  2016-12-21 19:24  lanqiu1.lnp
     文件       11311  2016-12-21 19:24  lanqiu1.LST
     文件       14440  2016-12-21 19:24  lanqiu1.M51
     文件        9957  2016-12-21 19:24  lanqiu1.OBJ
     文件         754  2016-12-21 14:46  lanqiu1.plg
     文件        5046  2016-12-21 17:33  lanqiu1.uvopt
     文件       14041  2016-12-21 17:33  lanqiu1.uvproj
     文件       55324  2016-12-21 12:37  lanqiu1_uvopt.bak
     文件           0  2016-12-20 21:23  lanqiu1_uvproj.bak
     文件      113387  2016-12-21 18:58  Last Loaded lanqiu.DBK
     文件        6376  2009-05-07 14:37  STARTUP.A51
     文件       14052  2016-12-21 19:24  STARTUP.LST
     文件         749  2016-12-21 19:24  STARTUP.OBJ

评论

共有 条评论

相关资源