找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机篮球计分程序设计

[复制链接]
跳转到指定楼层
楼主

#include<reg51.h>
typedef unsigned char uchar;
typedef unsigned int  uint;
//uchar code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  
//对应数码管显示数字0-9
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int m=1,n=0,x=0,y=0,x1,y1,i=0,h=0,k;
//定义全局变量并初始化,m,n表示分钟与秒,x,y表示甲乙两队分数
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
sbit k1=P3^4;
sbit k2=P3^5;
sbit dian=P0^7;
void delay(uint x)//定义延时程序,通过设置参数x,改变延时时间长度
{
        while(x--)
        {
                uint y;
                for(y=0;y<200;y++);
        }
}
void display(int i,int j,int x,int y,int x1,int y1)//显示子程序 变量i,j分别是分秒,变量x,y是甲乙两队的分数  
{               
        P2=0xfe;                                 
        //数码管刷新显示时间的分钟十位,调用延时程序
        if(x1>=1)P0=(seg[i/10]|0x80);
        else P0=seg[i/10];
        delay(1);                                        //延时数码管点亮
        P2=0xff;
        P0=0xff;
        
        P2=0xfd;                                        //同上,刷新数码管的分钟位的个位
        if(x1>=2)P0=(seg[i%10]|0x80);
        else P0=seg[i%10];
        delay(1);
        P2=0xff;
        P0=0xff;
        
        P2=0xfb;                                        //同上。刷新数码管秒位的十位
        if(x1>=3)P0=(seg[j/10]|0x80);
        else P0=seg[j/10];
        delay(1);
        P2=0xff;
        P0=0xff;
        P2=0xf7;                                        //同上,刷新数码管秒位的个位
        if(x1>=4)P0=(seg[j%10]|0x80);
        else P0=seg[j%10];
        delay(1);
        P2=0xff;
        P0=0xff;
        
        P2=0xef;                                        //同上。刷新数码管甲队分数的十位
        if(y1>=1)P0=(seg[x/10]|0x80);
        else P0=seg[x/10];
        delay(1);
        P2=0xff;
        P0=0xff;
        
        P2=0xdf;                                        //同上。刷新数码管甲队分数的个位
        if(y1>=2)P0=(seg[x%10]|0x80);
        else P0=seg[x%10];
        delay(1);
        P2=0xff;
        P0=0xff;
        
        P2=0xbf;                                        //同上。刷新数码管乙队分数的十位
        if(y1>=3)P0=(seg[y/10]|0x80);
        else P0=seg[y/10];
        delay(1);
        P2=0xff;
        P0=0xff;
        
        P2=0x7f;                                        //同上。刷新数码管乙队分数的个位
        if(y1>=4)P0=(seg[y%10]|0x80);
        else P0=(seg[ y%10]);
        delay(1);
        P2=0xff;
        P0=0xff;
}
void t0() interrupt 1 //定义中断程序,调用定时器TO
{  
        TH0=0xb1;                                   //对定时器T0送入初值,THO=0xb1
        TL0=0x10;                                        //TL0=0X10 故定时器定时为20毫秒,
        if(n==0)                                        //即每20毫秒调用一次
        {
                n=60;
                m--;
        }
        i++;
        if(i==50)                        //定义i的值为50,即50*20毫秒=1秒
        {
                n--;
                i=0;
        }
        display(m,n,x,y,x1,y1);//调用数码管显示程序,即每20毫秒刷
}
void jiafen()                                                                //定义加分程序
{
        if(P1_1==0)//当按下P1_1的时候
        {
                delay(1);//延时去抖
                while(P1_1==0);
                x++;//甲队加一分
        }            
        if(P1_2==0)//当按下P1_2的时候
        {
                delay(1);
                while(P1_2==0);
                x+=2;//甲队加两分
        }
        if(P1_3==0)        //当按下P1_3的时候
        {
                delay(1);
                while(P1_3==0);                        
                x+=3;//甲队加三分
        }        
        if(P1_4==0)        //当按下P1_4的时候
        {
                delay(1);                                    //延时去抖
                while(P1_4==0);
                y++;                                                  //乙队加一分
        }         
        if(P1_5==0)        //当按下P1_5的时候
        {
                delay(1);
                while(P1_5==0);
                y+=2;          //乙队加两分
        }           
        if(P1_6==0)        //当按下P1_6的时候
        {
                delay(1);
                while(P1_6==0);
                y+=3;  //乙队加三分
        }
}
void jianfen()                                                        //定义减分程序
{
        if(P3_0==0&&x>0)        //当按下P3_0并且甲队分数大于0的时候
        {
                delay(1);                                        //延时去抖
                while(P3_0==0);
                x--;                                           //甲队减1分
        }         
        if(P3_1==0&&x>0)        //当按下P3_1并且乙队分数大于0的时候
        {
                delay(1);
                while(P3_1==0);
                y--;                                           //乙队减1分
        }
}
void tiaoshi()                                                        //定义调时程序
{
        if(P3_2==0)                                                //当按下P3_2的时候
        {
                delay(1);                                        //延时去抖
                if(P3_2==0)
                {
                        n++;                                        //秒位加1
                        if(n==60)//当秒位到60的时候
                        {
                                m++;//分位加1,并且秒位变1
                                n=1;
                        }
                }
        }
        if(P3_3==0)                                                //当按下P3_3的时候
        {
                delay(1);        
                if(P3_3==0)
                {
                        n--;//秒位减一
                        if(n==0)                  
                                        //当秒位减到0的时候,分位减一,并且秒位变59
                        {
                                m--;        
                                n=59;
                        }
                }
        }
}
void jiaohuan()                                                  //定义比分交换程序
{
        int t;                                                          //定义中间变量t
        if(P1_7==0)                                                  //当P1_7按下的时候
        {
                delay(1);                                          //延时去抖
                while(P1_7==0);
                t=x;                                        //利用中间变量t,将甲乙两队比分交换
                x=y;
                y=t;
                t=x1;
                x1=y1;
                y1=t;
                display(m,n,x,y,x1,y1);                        //刷新数码管
        }
}
void zanting()                                                        //定义暂停程序
{
        if(P1_0==0)                                                                //当P1_0按下的时候
        {
                delay(1);                                                  //延时去抖
                while(P1_0==0);
                EA=0;                                                          //关中断,进入死循环
                while(1)
                {
                        display(m,n,x,y,x1,y1);
                        if(P1_0==0)                //当P1_0再次按下的时候,跳出死循环
                        {        
                                delay(1);
                                while(P1_0==0)
                                EA=1;
                                break;        
                        }
                }
        }
}
void baojing()                                                 //定义报警程序
{  
        if((m==0)&&(n<=10)&&(n>1))        //判断当倒计时只剩下10秒的时候
        {
                P3_7=1;                        
                P3_6=1;             //使P3_7和P3_6同时间隔输出高低电平,点亮发光二极管和使蜂鸣器蜂鸣
                delay(20);
                P3_7=0;
                P3_6=0;
                delay(20);
        }
}
void jieshu()                                                //定义结束子程序
{
        M:        if(h==1)                        
                //当时间条件满足时,关闭中断,使数码管保持状态显示
                {
                        EA=0;
                        delay(20);
            m=0;
                    n=0;
                    P3_6=1;
                    P3_7=1;
                    delay(200);
                        P3_7=0;
                        P3_6=0;
                    while(1)
                    {
                                display(m,n,x,y,x1,y1);
                                  jiafen();
                                  jianfen();
                                  jiaohuan();
                                  if(P1_0==0)                        //当P1_0再次按下的时候,跳出循环
                            {                     
                                        delay(1);
                                        while(P1_0==0)  
                                        {
                                                EA=1;
                                                m=10;    //重新赋予时间初始值开始下半场比赛
                                                n=0;
                                                h=0;
                                                goto M ;
                                        }               
                                }
                        }
                }
}
void main()                                                                //定义主程序
{
        TMOD=0x01;                                                         //初始化程序
        EA=1;                                 
        ET0=1;
        P3_7=1;
        P0=0xff;
        P2=0xff;
        k1=k2=1;
        if(P1_0==0)                //第一次按下P1_0,单片机启动,并显示初始值
        {                                                          //由于调用了一次暂停功能,会显示初始值
                TH0=0xb1;
                TL0=0x10;
                TR0=1;                                                                //启动定时器
                P3=0xff;         
                P1=0x7f;
                P3_7=1;
                P1_7=1;

                while(1)
                {           
                        jiafen();                           //加分子程序
                        jianfen();                       //减分子程序
                        tiaoshi();                            //调时子程序
                        jiaohuan();                       //比分交换子程序
                        zanting();                           //暂停子程序
                        baojing();                           //报警子程序
                        if((m==0)&&(n==1))           //判断结束子程序的调用条件
                        {
                                h=1;
                        }
                        jieshu();                              //结束子程序dian=0;P2=0xf0;
            if(k1==0){delay(20);if(x1<4)x1++;if(x1==4){P3_6=1;P3_7=1;while(k1==1);P3_6=0;P3_7=0;x1=1;dian=0;P2=0xf0;}while(!k1);delay(20);}
                   if(k2==0){delay(20);if(y1<4)y1++;if(y1==4){P3_6=1;P3_7=1;while(k2==1);P3_6=0;P3_7=0;y1=1;dian=0;P2=0x0f;}while(!k2);delay(20);}
                }
               
        }
}


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

使用道具 举报

沙发
ID:725825 发表于 2020-4-9 22:09 | 只看该作者
请问RP1的那个元件英文代码是什么啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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