找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2142|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)籃球計(jì)分程序設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主

#include<reg51.h>
typedef unsigned char uchar;
typedef unsigned int  uint;
//uchar code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  
//對應(yīng)數(shù)碼管顯示數(shù)字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表示甲乙兩隊(duì)分?jǐn)?shù)
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)//定義延時(shí)程序,通過設(shè)置參數(shù)x,改變延時(shí)時(shí)間長度
{
        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是甲乙兩隊(duì)的分?jǐn)?shù)  
{               
        P2=0xfe;                                 
        //數(shù)碼管刷新顯示時(shí)間的分鐘十位,調(diào)用延時(shí)程序
        if(x1>=1)P0=(seg[i/10]|0x80);
        else P0=seg[i/10];
        delay(1);                                        //延時(shí)數(shù)碼管點(diǎn)亮
        P2=0xff;
        P0=0xff;
        
        P2=0xfd;                                        //同上,刷新數(shù)碼管的分鐘位的個(gè)位
        if(x1>=2)P0=(seg[i%10]|0x80);
        else P0=seg[i%10];
        delay(1);
        P2=0xff;
        P0=0xff;
        
        P2=0xfb;                                        //同上。刷新數(shù)碼管秒位的十位
        if(x1>=3)P0=(seg[j/10]|0x80);
        else P0=seg[j/10];
        delay(1);
        P2=0xff;
        P0=0xff;
        P2=0xf7;                                        //同上,刷新數(shù)碼管秒位的個(gè)位
        if(x1>=4)P0=(seg[j%10]|0x80);
        else P0=seg[j%10];
        delay(1);
        P2=0xff;
        P0=0xff;
        
        P2=0xef;                                        //同上。刷新數(shù)碼管甲隊(duì)分?jǐn)?shù)的十位
        if(y1>=1)P0=(seg[x/10]|0x80);
        else P0=seg[x/10];
        delay(1);
        P2=0xff;
        P0=0xff;
        
        P2=0xdf;                                        //同上。刷新數(shù)碼管甲隊(duì)分?jǐn)?shù)的個(gè)位
        if(y1>=2)P0=(seg[x%10]|0x80);
        else P0=seg[x%10];
        delay(1);
        P2=0xff;
        P0=0xff;
        
        P2=0xbf;                                        //同上。刷新數(shù)碼管乙隊(duì)分?jǐn)?shù)的十位
        if(y1>=3)P0=(seg[y/10]|0x80);
        else P0=seg[y/10];
        delay(1);
        P2=0xff;
        P0=0xff;
        
        P2=0x7f;                                        //同上。刷新數(shù)碼管乙隊(duì)分?jǐn)?shù)的個(gè)位
        if(y1>=4)P0=(seg[y%10]|0x80);
        else P0=(seg[ y%10]);
        delay(1);
        P2=0xff;
        P0=0xff;
}
void t0() interrupt 1 //定義中斷程序,調(diào)用定時(shí)器TO
{  
        TH0=0xb1;                                   //對定時(shí)器T0送入初值,THO=0xb1
        TL0=0x10;                                        //TL0=0X10 故定時(shí)器定時(shí)為20毫秒,
        if(n==0)                                        //即每20毫秒調(diào)用一次
        {
                n=60;
                m--;
        }
        i++;
        if(i==50)                        //定義i的值為50,即50*20毫秒=1秒
        {
                n--;
                i=0;
        }
        display(m,n,x,y,x1,y1);//調(diào)用數(shù)碼管顯示程序,即每20毫秒刷
}
void jiafen()                                                                //定義加分程序
{
        if(P1_1==0)//當(dāng)按下P1_1的時(shí)候
        {
                delay(1);//延時(shí)去抖
                while(P1_1==0);
                x++;//甲隊(duì)加一分
        }            
        if(P1_2==0)//當(dāng)按下P1_2的時(shí)候
        {
                delay(1);
                while(P1_2==0);
                x+=2;//甲隊(duì)加兩分
        }
        if(P1_3==0)        //當(dāng)按下P1_3的時(shí)候
        {
                delay(1);
                while(P1_3==0);                        
                x+=3;//甲隊(duì)加三分
        }        
        if(P1_4==0)        //當(dāng)按下P1_4的時(shí)候
        {
                delay(1);                                    //延時(shí)去抖
                while(P1_4==0);
                y++;                                                  //乙隊(duì)加一分
        }         
        if(P1_5==0)        //當(dāng)按下P1_5的時(shí)候
        {
                delay(1);
                while(P1_5==0);
                y+=2;          //乙隊(duì)加兩分
        }           
        if(P1_6==0)        //當(dāng)按下P1_6的時(shí)候
        {
                delay(1);
                while(P1_6==0);
                y+=3;  //乙隊(duì)加三分
        }
}
void jianfen()                                                        //定義減分程序
{
        if(P3_0==0&&x>0)        //當(dāng)按下P3_0并且甲隊(duì)分?jǐn)?shù)大于0的時(shí)候
        {
                delay(1);                                        //延時(shí)去抖
                while(P3_0==0);
                x--;                                           //甲隊(duì)減1分
        }         
        if(P3_1==0&&x>0)        //當(dāng)按下P3_1并且乙隊(duì)分?jǐn)?shù)大于0的時(shí)候
        {
                delay(1);
                while(P3_1==0);
                y--;                                           //乙隊(duì)減1分
        }
}
void tiaoshi()                                                        //定義調(diào)時(shí)程序
{
        if(P3_2==0)                                                //當(dāng)按下P3_2的時(shí)候
        {
                delay(1);                                        //延時(shí)去抖
                if(P3_2==0)
                {
                        n++;                                        //秒位加1
                        if(n==60)//當(dāng)秒位到60的時(shí)候
                        {
                                m++;//分位加1,并且秒位變1
                                n=1;
                        }
                }
        }
        if(P3_3==0)                                                //當(dāng)按下P3_3的時(shí)候
        {
                delay(1);        
                if(P3_3==0)
                {
                        n--;//秒位減一
                        if(n==0)                  
                                        //當(dāng)秒位減到0的時(shí)候,分位減一,并且秒位變59
                        {
                                m--;        
                                n=59;
                        }
                }
        }
}
void jiaohuan()                                                  //定義比分交換程序
{
        int t;                                                          //定義中間變量t
        if(P1_7==0)                                                  //當(dāng)P1_7按下的時(shí)候
        {
                delay(1);                                          //延時(shí)去抖
                while(P1_7==0);
                t=x;                                        //利用中間變量t,將甲乙兩隊(duì)比分交換
                x=y;
                y=t;
                t=x1;
                x1=y1;
                y1=t;
                display(m,n,x,y,x1,y1);                        //刷新數(shù)碼管
        }
}
void zanting()                                                        //定義暫停程序
{
        if(P1_0==0)                                                                //當(dāng)P1_0按下的時(shí)候
        {
                delay(1);                                                  //延時(shí)去抖
                while(P1_0==0);
                EA=0;                                                          //關(guān)中斷,進(jìn)入死循環(huán)
                while(1)
                {
                        display(m,n,x,y,x1,y1);
                        if(P1_0==0)                //當(dāng)P1_0再次按下的時(shí)候,跳出死循環(huán)
                        {        
                                delay(1);
                                while(P1_0==0)
                                EA=1;
                                break;        
                        }
                }
        }
}
void baojing()                                                 //定義報(bào)警程序
{  
        if((m==0)&&(n<=10)&&(n>1))        //判斷當(dāng)?shù)褂?jì)時(shí)只剩下10秒的時(shí)候
        {
                P3_7=1;                        
                P3_6=1;             //使P3_7和P3_6同時(shí)間隔輸出高低電平,點(diǎn)亮發(fā)光二極管和使蜂鳴器蜂鳴
                delay(20);
                P3_7=0;
                P3_6=0;
                delay(20);
        }
}
void jieshu()                                                //定義結(jié)束子程序
{
        M:        if(h==1)                        
                //當(dāng)時(shí)間條件滿足時(shí),關(guān)閉中斷,使數(shù)碼管保持狀態(tài)顯示
                {
                        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)                        //當(dāng)P1_0再次按下的時(shí)候,跳出循環(huán)
                            {                     
                                        delay(1);
                                        while(P1_0==0)  
                                        {
                                                EA=1;
                                                m=10;    //重新賦予時(shí)間初始值開始下半場比賽
                                                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,單片機(jī)啟動(dòng),并顯示初始值
        {                                                          //由于調(diào)用了一次暫停功能,會(huì)顯示初始值
                TH0=0xb1;
                TL0=0x10;
                TR0=1;                                                                //啟動(dòng)定時(shí)器
                P3=0xff;         
                P1=0x7f;
                P3_7=1;
                P1_7=1;

                while(1)
                {           
                        jiafen();                           //加分子程序
                        jianfen();                       //減分子程序
                        tiaoshi();                            //調(diào)時(shí)子程序
                        jiaohuan();                       //比分交換子程序
                        zanting();                           //暫停子程序
                        baojing();                           //報(bào)警子程序
                        if((m==0)&&(n==1))           //判斷結(jié)束子程序的調(diào)用條件
                        {
                                h=1;
                        }
                        jieshu();                              //結(jié)束子程序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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:725825 發(fā)表于 2020-4-9 22:09 | 只看該作者
請問RP1的那個(gè)元件英文代碼是什么啊
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表