久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2124|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色综合99 | 精品一区二区三区中文字幕 | 国产美女在线观看 | 91久久久www播放日本观看 | 色黄网站| 久久出精品 | 日本一区二区三区在线观看 | 久草在线中文888 | 免费h在线 | 国产成人a亚洲精品 | 欧美日韩视频在线第一区 | 亚洲欧美激情精品一区二区 | 日韩av看片 | 高清欧美性猛交 | 一区二区影院 | 国产精品久久久爽爽爽麻豆色哟哟 | 日韩中文字幕 | 婷婷桃色网| 欧美电影在线观看网站 | 欧美在线免费 | 欧美区日韩区 | 国产精品久久国产愉拍 | 91小视频在线 | 成人激情免费视频 | 久草视频2 | 久久青草av | 国产在线精品一区二区三区 | 农夫在线精品视频免费观看 | 中文字幕精品一区二区三区在线 | 91久久久久久久久久久 | 久久久男人的天堂 | 久久久国产精品视频 | 国产精品视频一区二区三区四蜜臂 | 国产九九九 | 色999视频 | 伊人狠狠| 久久专区 | 亚洲丝袜天堂 | 国产综合在线视频 | 黄色大片网站 | 欧美激情视频一区二区三区免费 |