找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3032|回复: 2
收起左侧

篮球赛电子记分牌 C语言编程

[复制链接]
ID:725825 发表于 2020-4-9 20:47 | 显示全部楼层 |阅读模式
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uchar x);         //延时(时间较短)
void delay1(uchar x);        //延时(时间较长)
void Js_Jf_Scan(void);       //数码管动态扫描显示函数
void Key_if(void);          //A、B两队分值处理函数
void Js_50ms(void);        //定时50ms中断函数
void Key_Y(void);         //预置时间函数
void Ptime(uchar);         //时间处理函数
void sound(void);          //鸣笛警示函数
sbit CL1=P2^0;           //B队4位计分数码管位控线
sbit CL2=P2^1;
sbit CL3=P2^2;
sbit CL4=P2^3;
sbit KL1=P2^4;           // A队4位计分数码管位控线
sbit KL2=P2^5;
sbit KL3=P2^6;
sbit KL4=P2^7;
sbit S1=P1^3;            //驱动4位计时数码管位控线
sbit S2=P1^2;
sbit S3=P1^1;
sbit S4=P1^0;
sbit YK1=P1^6;          //预置分钟的十位
sbit YK2=P1^7;          //预置分钟的个位
sbit music=P1^4;         //P1.4接喇叭,发声,鸣笛
sbit Key1=P3^0;         //B队加分键
sbit Key2=P3^1;         //B队减分键
sbit Key3=P3^4;         //A队加分键
sbit Key4=P3^5;         //A队减分键
sbit Int_Key=P3^2;                    //鸣笛键
sbit Star=P3^6;                       //开始按钮
sbit Puse=P3^7;                      //停止按钮   
int ms=0,mg=0,fs=0;                  //秒钟的十位、个位以及秒钟的变量说明
int fg=0;m=0,f,fy,num=0;              //分钟的十位、个位以及分钟的变量说明
int g,s,b,q,sum=0;        //B队定义个十百位
int g1,s1,b1,q1,sum1=0;               // A队定义个十百位
int LED_Num[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,}; //段码
void main(void)
{
TMOD=0x01;                    //设置T0为工作方式1,作为16位计数器
TH0=(65535-50000)/256;           //设置T0的高8位,并且T0的计数值为50ms
TL0=(65535-50000)%256;          //设置T0的低8位
music=0;                        //初值喇叭不响
EA=1;                          //开放所有中断
ET0=1;                         //允许定时/计数器T0溢出中断
EX0=1;                         //允许外部中断0
IT0=1;                          //设置外部中断0为边沿触发方式(下降沿)
while(1)                        //无穷循环,程序一直运行
{
  Key_Y();                    //预置场次比赛时间
      if(Star==0&&f!=0&&Puse!=0)  //按下“开始键”,设置好比赛时间,并且未按“停止”键时,比赛正式开始
  {
   TR0=1;                 //启动定时器T0,开始计时
   Key_if();                //开始计分
  }
  else
  {
   TR0=0;               //比赛还未开始或比赛结束时间到,停止计时
  }
  Js_Jf_Scan();                //将相应的分数、时间同步进行显示
}
}
/*******************设置场次比赛时间********************/
void Key_Y(void)
{
if(YK1==0)                     //初始状态,分钟的十位为0
{
  delay(1);                    //延时去抖动
  fs=fs+1;                    //分十位加1分
    fy=fs*10+fg;                //求出预置时间的分钟值
  f=fy;                       //中间变量
}
if(YK2==0)                     //初始状态,分钟的个位为0
{
  delay(1);                    //延时去抖动
  fg=fg+1;                    //分个位加1分
  fy=fs*10+fg;                //求出预置时间的分钟值
  f=fy;                       //中间变量
}
Js_Jf_Scan();
}
/********T0中断服务函数,每隔50ms产生一次中断********/
void Js_50ms(void)interrupt 1 using 1   //定时器T0中断,用工作寄存器组1
{
TH0=(65535-50000)/256;         //定时器T0的高8位
TL0=(65535-50000)%256;        //定时器T0的低8位
     num++;                        //每50ms累加一次
  Ptime(num);                    //调用时间处理函数
}
/**********************时间处理函数********************/
void  Ptime(uchar time)
{
if(time==20)                   //如果为1s(50ms*20=1s)
{
  num=0;
  m++;                     //每到1s,计时器累加1次
  ms=m/10;                 //秒的十位
  mg=m%10;                //秒的个位
  if(m==60)                 //如果为1min
  {
   m=0;                  //秒钟置0
      mg=m%10;            //秒钟的个位置0
   ms=m/10;              //秒钟的十位置0
   f--;                   //分钟开始在预设的比赛时间基础上倒计时
   fs=f/10;               //分钟的十位
      fg=f%10;              //分钟的个位
   if(f==0)               //分钟数倒计时到0
   {
    TR0=0;            //时间到,停止计时
   }   
  }
}
}
/******************数码管动态扫描显示******************/
void Js_Jf_Scan(void)
{
uchar j;
for(j=0;j<=5;j++)
{
  KL4=0;P0=LED_Num[g1];delay(1);KL4=1;  /*将A队分数的个位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
  KL3=0;P0=LED_Num[s1];delay(1);KL3=1;  /*将A队分数的十位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
  KL2=0;P0=LED_Num[b1];delay(1);KL2=1;  /*将A队分数的百位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
  KL1=0;P0=LED_Num[q1];delay(1);KL1=1;  /*将A队分数的千位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
  CL4=0;P0=LED_Num[g];delay(1);CL4=1;   /*将B队分数的个位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
  CL3=0;P0=LED_Num[s];delay(1);CL3=1;    /*将B队分数的十位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
  CL2=0;P0=LED_Num[b];delay(1);CL2=1;    /*将B队分数的百位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
  CL1=0;P0=LED_Num[q];delay(1);CL1=1;   /*将B队分数的千位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
  S4=0;P0=LED_Num[mg];delay(1);S4=1; /*将秒钟的个位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
  S3=0;P0=LED_Num[ms];delay(1);S3=1;  /*将秒钟的十位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
  S2=0;P0=LED_Num[fg];delay(1);S2=1;  /*将分钟的个位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
  S1=0;P0=LED_Num[fs];delay(1);S1=1;    /*将分钟的十位传递给译码器,通过按键,实现边沿跳变,并把结果译成相应的段码显示出来*/
}
}
/*****************判断是哪个队加分或者减分*****************/
void Key_if(void)
{
if(Key1==0)                      //当按键按下时
{
  delay(1);                     //延时去抖动
  sum=sum+1;                   //B队加1分
}
if(Key2==0 && sum>=1)           //减分按键按下并且中得分不得少于1分
{
  delay(1);                     //延时去抖动
  sum=sum-1;                   //B队减1分
}
if(Key3==0)                      //当按键按下时
{
  delay(1);                     //延时去抖动
  sum1=sum1+1;               //A队加1分
}
    if(Key4==0 && sum1>=1)         //减分按键按下并且中得分不得少于1分
{
  delay(1);                     //延时去抖动
  sum1=sum1-1;               //A队减1分
}
q=0;                            // A队分值的千位默认为0
b=sum/100;                      //求出A队分值的百位
  s=sum/10-b*10;                   //求出A队分值的十位
g=sum%10;                      //求出A队分值的个位
q1=0;                           // B队分值的千位默认为0
b1=sum1/100;                    //求出B队分值的百位
s1=sum1/10-b1*10;                //求出B队分值的十位
g1=sum1%10;                    //求出B队分值的个位
}
/***********************鸣笛处理***********************/
void sound(void) interrupt 0 using 0  //外部中断0(),用工作寄存器组0
{
uchar i,j;
if(Int_key==0)                    //判断鸣笛键是否按下,有按下就鸣笛
{
  for(i=0;i<8;i++)               //控制一种发音的时间
  {
   for(j=0;j<250;j++)          //控制发音的频率,延时长,频率低,音低
   {
    music=~music;         //取反
    delay1(1);             //延时去抖动
   }
          Js_Jf_Scan();
  }
  for(i=0;i<16;i++)              //控制另一种发音的时间
  {
     for(j=0;j<250;j++)          //控制发音的频率,延时短,频率高,音高
   {   
    music=~music;         //取反
    delay(1);              //延时去抖动
   }
          Js_Jf_Scan();
}
}
else
  music=0;                     //喇叭不响
}
/*******************延时1.8ms的子程序*******************/
void delay1(uchar x)
{
uchar k;
while(x--)
      sbit music=P1^4;         //P1.4接喇叭,发声,鸣笛
      for(k=0;k<215;k++);     //延时长
}
/*******************延时1.0ms的子程序*******************/
void delay(uchar x)
  {
uchar k;
while(x--)
  for(k=0;k<120;k++);     //延时短
}
回复

使用道具 举报

ID:1 发表于 2020-4-11 13:51 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:626287 发表于 2021-3-17 17:01 | 显示全部楼层
额!不带原理图没什么用啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表