標題: 單片機籃球計分程序設(shè)計 [打印本頁]

作者: 51設(shè)計    時間: 2020-2-27 10:30
標題: 單片機籃球計分程序設(shè)計

#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表示甲乙兩隊分數(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ù)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是甲乙兩隊的分數(shù)  
{               
        P2=0xfe;                                 
        //數(shù)碼管刷新顯示時間的分鐘十位,調(diào)用延時程序
        if(x1>=1)P0=(seg[i/10]|0x80);
        else P0=seg[i/10];
        delay(1);                                        //延時數(shù)碼管點亮
        P2=0xff;
        P0=0xff;
        
        P2=0xfd;                                        //同上,刷新數(shù)碼管的分鐘位的個位
        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ù)碼管秒位的個位
        if(x1>=4)P0=(seg[j%10]|0x80);
        else P0=seg[j%10];
        delay(1);
        P2=0xff;
        P0=0xff;
        
        P2=0xef;                                        //同上。刷新數(shù)碼管甲隊分數(shù)的十位
        if(y1>=1)P0=(seg[x/10]|0x80);
        else P0=seg[x/10];
        delay(1);
        P2=0xff;
        P0=0xff;
        
        P2=0xdf;                                        //同上。刷新數(shù)碼管甲隊分數(shù)的個位
        if(y1>=2)P0=(seg[x%10]|0x80);
        else P0=seg[x%10];
        delay(1);
        P2=0xff;
        P0=0xff;
        
        P2=0xbf;                                        //同上。刷新數(shù)碼管乙隊分數(shù)的十位
        if(y1>=3)P0=(seg[y/10]|0x80);
        else P0=seg[y/10];
        delay(1);
        P2=0xff;
        P0=0xff;
        
        P2=0x7f;                                        //同上。刷新數(shù)碼管乙隊分數(shù)的個位
        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)用定時器TO
{  
        TH0=0xb1;                                   //對定時器T0送入初值,THO=0xb1
        TL0=0x10;                                        //TL0=0X10 故定時器定時為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)//當按下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并且甲隊分數(shù)大于0的時候
        {
                delay(1);                                        //延時去抖
                while(P3_0==0);
                x--;                                           //甲隊減1分
        }         
        if(P3_1==0&&x>0)        //當按下P3_1并且乙隊分數(shù)大于0的時候
        {
                delay(1);
                while(P3_1==0);
                y--;                                           //乙隊減1分
        }
}
void tiaoshi()                                                        //定義調(diào)時程序
{
        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);                        //刷新數(shù)碼管
        }
}
void zanting()                                                        //定義暫停程序
{
        if(P1_0==0)                                                                //當P1_0按下的時候
        {
                delay(1);                                                  //延時去抖
                while(P1_0==0);
                EA=0;                                                          //關(guān)中斷,進入死循環(huán)
                while(1)
                {
                        display(m,n,x,y,x1,y1);
                        if(P1_0==0)                //當P1_0再次按下的時候,跳出死循環(huán)
                        {        
                                delay(1);
                                while(P1_0==0)
                                EA=1;
                                break;        
                        }
                }
        }
}
void baojing()                                                 //定義報警程序
{  
        if((m==0)&&(n<=10)&&(n>1))        //判斷當?shù)褂嫊r只剩下10秒的時候
        {
                P3_7=1;                        
                P3_6=1;             //使P3_7和P3_6同時間隔輸出高低電平,點亮發(fā)光二極管和使蜂鳴器蜂鳴
                delay(20);
                P3_7=0;
                P3_6=0;
                delay(20);
        }
}
void jieshu()                                                //定義結(jié)束子程序
{
        M:        if(h==1)                        
                //當時間條件滿足時,關(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)                        //當P1_0再次按下的時候,跳出循環(huán)
                            {                     
                                        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,單片機啟動,并顯示初始值
        {                                                          //由于調(diào)用了一次暫停功能,會顯示初始值
                TH0=0xb1;
                TL0=0x10;
                TR0=1;                                                                //啟動定時器
                P3=0xff;         
                P1=0x7f;
                P3_7=1;
                P1_7=1;

                while(1)
                {           
                        jiafen();                           //加分子程序
                        jianfen();                       //減分子程序
                        tiaoshi();                            //調(diào)時子程序
                        jiaohuan();                       //比分交換子程序
                        zanting();                           //暫停子程序
                        baojing();                           //報警子程序
                        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);}
                }
               
        }
}



作者: 煙嵐    時間: 2020-4-9 22:09
請問RP1的那個元件英文代碼是什么啊





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1