找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2453|回复: 1
打印 上一主题 下一主题
收起左侧

基于单片机的篮球计分器程序

[复制链接]
跳转到指定楼层
楼主
ID:355915 发表于 2018-6-21 12:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#define uchar unsigned char
uchar code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF}/*1~9、空格和-的字型码*/
                        ,display[8]={1,2,4,8,16,32,64,128};//动态显示数码管
uchar score[2]={0,0},time[2]={12,0},byte[8]={0},j=0,h=0;//score数组记录A、B两队份数time
//数组记录倒计时分、秒时间,byte
//数组记录八个数码管的显示字,j记
//录按键s0按下的次数,h记录时间
//中断1的次数;
bit start=0;                                                                //start为12分倒计时是否开始时的标志位;
sbit alrm=P3^0;                                                        //alrm为响铃脉冲输出端
unsigned int t=0;                                                        //响铃脉冲个数
void delay1(uchar t)                                                //延时程序,最短5ms
{
        unsigned char m,n,k;
        for(m=t;m>0;m--)
        for(n=10;n>0;n--)
        for(k=250;k>0;k--);
}

void jishi()                                        //倒计时程序
{
  if(start==1)                                                //如果倒计时标志有效,则开始倒计时
  {
  if(time[1]==0)                                       
  {
  if(time[0]==0)                        //如果分秒位都为0时,开启时间中断0,输出响铃脉冲
  {
  start=0;
  ET0=1;
  TR0=1;
  }
  else                                        //如果秒位为0,分位不为0,则秒位跳为59,分位减1
  {
  time[0]--;
  time[1]=59;
  }
  }
  else time[1]--;                        //如果分秒位都不为0,则秒位减1
  }
}
void TIMER0() interrupt 1 using 0                        //时间中断0;用于产生响铃脉冲
{         
        TH0=0xfc;                                                //1ms的计数初始状态
        TL0=0x18;
        t++;
        alrm=!alrm;
        if(t==5000)                                                //如果输出5000个脉冲,则停止响铃
        {
        t=0;
        ET0=0;
        TR0=0;
        }
}
void TIMER1() interrupt 3 using 1
{
        TH1=0x63;
        TL1=0xc0;                        //50ms初始值;
        if((h++)==20)
        {                            // 一秒是否到,如果到,则进行倒计时程序
        h=0;
        jishi();
        }
}
void INT_0() interrupt 0 using 2                //外部中断0,记录按键按下次数
{        
        ET0=0;
        delay1(1);                        //延时消抖
        j++;
        if(j==5)                                //如果按键s0按下五次,则归零
        j=0;
        ET0=1;
}

void jiaohuan()                        //分数交换,AB两队换场程序
{
        uchar temp;
        temp=score[0];
        score[0]=score[1];
        score[1]=temp;
}

void INT_1() interrupt 2 using 3                //外部中断1
{        
        ET1=0;                                                //延时消抖
        delay1(1);
        if(j==1)                                                //如果s0按下的次数为1次,则score[1]加1
        {
                score[1]++;
                if(score[1]==100)                        //分数到100后归零
                score[1]=0;
        }
        else if(j==2)
                {
                score[0]++;                                //如果s0按下的次数为2次,则score[0]加1
                if(score[0]==100)                        //分数到100后归零
                score[0]=0;
                }
        else if(j==3)                                //如果s0按下的次数为3次,则两队分数交换
                jiaohuan();
        else  if(j==4)                 //如果s0按下的次数为4次        ,则打开倒计时或关闭倒计时        
start=!start;
        else;
        ET1=1;        

}
void by(void)
{        
                byte[5]=11;                        //第五个数码管一直显示为"-"
                if(j==4)                                //如果s0按下的次数为4,则显示倒计时
                {
                         byte[3]=time[0]/10;
                        byte[4]=time[0]%10;
                        byte[6]=time[1]/10;
                        byte[7]=time[1]%10;

                }
                else                         //否则显示比分
                {        
                        byte[3]=score[0]/10;
                        byte[4]=score[0]%10;
                        byte[6]=score[1]/10;
                        byte[7]=score[1]%10;        
                }

}
void blank()
{
        if(j==1)                //如果s0按下1次;第7、8个数码管闪烁跳动
        {
                byte[7]=10,byte[6]=10;
        }
        else if(j==2)        //如果s0按下2次;第4、5个数码管闪烁跳动
        {
                byte[3]=10,byte[4]=10;
        }
        else if(j==3)        //如果s0按下3次;第4、5、7、8个数码管闪烁跳动
        {
        byte[7]=10,byte[6]=10;
        byte[4]=10,byte[3]=10;
        }
        else;

}
void bitshow()
{        if(h<=10)                //前半秒正常显示,后半秒根据s0按下的次数相应的数码管闪烁
                by();        
        else
                blank();
}
void dis()
{        uchar  i;
           while(1)                        //        死循环显示
        {        
                bitshow();                        //求每一位的显示
                for(i=3;i<=7;i++)
                {
                P0=~display[i];                //P0口控制扫描显示的数码管
                P1=tab[byte[i]];                //P1口输出字型码
                delay1(1);                        //延时5ms,增加显示亮度
                }
        }

}        
void main(void)
{        
        TMOD=0x11;
        EA=1;
        EX0=1;
        EX1=1;
        ET1=1;
        IT1=1;
        IT0=1;
        TR1=1;                                        //开启时间中断1,两个外部中断
        IP=5;                                        //中断优先级控制
        dis();                                        //显示子程序

}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:334984 发表于 2018-6-24 17:48 | 只看该作者
有仿真图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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