找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9164|回复: 5
收起左侧

C51单片机篮球比赛计分器原理图与单片机代码

[复制链接]
ID:360851 发表于 2018-6-28 11:51 | 显示全部楼层 |阅读模式
QQ图片20180628114810.jpg

代码部分

  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code tab[] ={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,
  5.                      0x82,0xf8,0x80,0x90,0xff};        //0,12,3,4,5,6,7,8,9,关显示
  6. uchar b,d,t;                                   //定义变量
  7. uchar fen=10,miao=0;                       //定时初始时间变量
  8. uchar flag;                                    //标志位
  9. uchar temp;                                   //矩形键盘键值
  10. sbit beep =P1^7 ;                             //蜂鸣器
  11. void delay(uint z)                             //延时函数
  12. {
  13.           uint x,y;
  14.     for(x=z;x>0;x--)
  15.     for( y= 110;y>0;y--);
  16. }
  17. void dispaly()                             //定时时间显示
  18. {
  19.      uchar miaoge,fenge,miaoshi,fenshi;
  20.      miaoge = miao%10;
  21.      P2 = 0x80;;
  22.      P0 =tab[miaoge];
  23.      delay(1);
  24.      miaoshi = miao/10;
  25.      P2 =0x40;
  26.      P0 =tab[miaoshi];
  27.      delay(1);
  28.      fenge = fen%10;
  29.      P2=0x20;
  30.      P0 =tab[fenge];
  31.      delay(1);
  32.      fenshi =fen/10;
  33.      P2 =0x10;
  34.      P0 =tab[fenshi];
  35.      delay(1);
  36.      P2 =0x00;
  37. }
  38. void dispaly1(char a)                                //甲队比分显示
  39. {
  40.            uchar ge1,shi1;
  41.            b=a;
  42.            ge1=b%10;
  43.            P2=0x02;
  44.            P0=tab[ge1];
  45.            delay(1);
  46.            shi1=b/10;
  47.            P2=0x01;
  48.            P0=tab[shi1];
  49.            delay(1);
  50.            P2=0x00;
  51.   
  52. }
  53. void dispaly2(char c)                               //乙队比分显示
  54. {
  55.      uchar ge2,shi2;
  56.      d=c;
  57.      ge2 =d%10;
  58.      P2=0x08;
  59.      P0=tab[ge2];
  60.      delay(1);
  61.      shi2 =d/10;
  62.      P2 = 0x04;
  63.      P0 =tab[shi2];
  64.      delay(1);
  65.      P2 =0x80;
  66. }
  67. void keyscan()                                    //矩阵键盘扫描控制
  68. {
  69.      char a,c,e,f;
  70.      dispaly1(a);
  71.      dispaly2(c);
  72.      P3 =0xfe;
  73.            temp=P3;
  74.      temp =temp&0xf0;
  75.      while(temp!=0xf0)
  76.      {
  77.           delay(5);
  78.           temp =P3;
  79.           temp =temp&0xf0;
  80.                             while(temp!=0xf0)
  81.                             {
  82.                temp =P3;
  83.            if(temp==0xee)
  84.                {
  85.                    delay(5);
  86.                    if(temp == 0xee)
  87.                    {
  88.                         a++;                              //甲队比分加1
  89.                         if(a>=100)
  90.                         a=99;
  91.                         dispaly1(a);
  92.                    }
  93.                 }
  94.            if(temp==0xde)
  95.                {
  96.                    delay(5);
  97.                    if(temp==0xde)
  98.                    {
  99.                         a=a+2;                       //甲队比分加2
  100.                         if(a>=100)
  101.                         a=99;
  102.                         dispaly1(a);
  103.                     }
  104.                 }
  105.            if(temp==0xbe)
  106.                {
  107.                    delay(5);
  108.                    if(temp==0xbe)
  109.                    {
  110.                         a=a+3;             //甲队比分加3
  111.                         if(a>=100)
  112.                         a=99;
  113.                         dispaly1(a);
  114.                    }
  115.                }
  116.            if(temp ==0x7e)
  117.                {
  118.                      delay(5);
  119.                      if(temp ==0x7e)
  120.                      {
  121.                           a--;                      //甲队比分减1
  122.                           if(a<= -1)
  123.                           a=0;
  124.                           dispaly1(a);
  125.                       }
  126.                 }
  127.            while(temp!= 0xf0)         //松手检测
  128.            {
  129.                 temp =P3;
  130.                 temp=temp&0xf0;
  131.                 dispaly1(a);
  132.            }
  133.         }
  134.      }
  135.      P3=0xfd;
  136.      temp=P3;
  137.      temp=temp&0xf0;
  138.      while(temp!=0xf0)
  139.      {
  140.           delay(5);
  141.           temp =P3;
  142.           temp=temp&0xf0;
  143.           while(temp!=0xf0)
  144.           {
  145.                temp =P3;
  146.                if(temp==0xed)
  147.                     {
  148.                        delay(5);
  149.                        if(temp ==0xed)
  150.                        {
  151.                             c++;                      //乙队比分加1
  152.                             if(c>=100)
  153.                             c=99;
  154.                             dispaly2(c);
  155.                        }
  156.                     }
  157.                if(temp==0xdd)
  158.                     {
  159.                        delay(5);
  160.                        if(temp==0xdd)
  161.                        {
  162.                             c= c+2;          //乙队比分加2
  163.                             if(c>=100)
  164.                             c=99;
  165.                             dispaly2(c);
  166.                        }
  167.                     }
  168.                if(temp==0xbd)
  169.                     {
  170.                        delay(5);
  171.                        if(temp ==0xbd)
  172.                        {
  173.                             c=c+3;           //乙队比分3
  174.                             if(c>=100)
  175.                             c=99;
  176.                             dispaly2(c);
  177.                        }
  178.                     }
  179.                if(temp ==0x7d)
  180.                     {
  181.                         delay(5);
  182.                         if(temp ==0x7d)
  183.                         {
  184.                              c--;       //乙队比分减1
  185.                              if(c <= -1)
  186.                              c=0;
  187.                              dispaly2(c);
  188.                         }
  189.                     }
  190.                 while(temp!=0xf0)
  191.                 {  
  192.                      temp=P3;
  193.                      temp=temp&0xf0;
  194.                      dispaly2(c);
  195.                 }
  196.           }
  197.      }
  198.      P3=0xfb;
  199.      temp=P3;
  200.      temp =temp&0xf0;
  201.      while(temp!=0xf0)
  202.      {
  203.           delay(5);
  204.           temp =P3;
  205.           temp=temp&0xf0;
  206.           while(temp!=0xf0)
  207.           {
  208.               temp =P3;
  209.               if(temp==0xeb)
  210.                   {
  211.                       delay(5);
  212.                       if(temp ==0xeb)
  213.                       {
  214.                            a=0;       //双方比分清零
  215.                            dispaly1(a);
  216.                            c=0;
  217.                            dispaly2(c);
  218.                       }
  219.                   }
  220.               if(temp == 0xdb)
  221.                   {
  222.                        delay(5);
  223.                        if(temp ==0xdb)
  224.                        {
  225.                             e=a;
  226.                             f=c;
  227.                             a=f;
  228.                             dispaly1(a);          //双方比分切换
  229.                             c=e;
  230.                             dispaly2(c);
  231.                        }
  232.                   }
  233.                   if(flag!=1)                //避免误操作,只有在时间停止的情况下才能加/减定时时间
  234.                   {
  235.                   if(temp==0xbb)
  236.                       {
  237.                           delay(5);
  238.                           if(temp==0xbb)
  239.                           {
  240.                                fen++;             // 定时时间加1
  241.                                if(fen==99)
  242.                                fen=0;
  243.                           }
  244.                       }
  245.                   if(temp ==0x7b)
  246.                       {
  247.                            delay(5);
  248.                            if(temp==0x7b)
  249.                            {
  250.                                fen--;            //定时时间减1
  251.                                if(fen== -1)
  252.                                fen=99;
  253.                            }
  254.                       }
  255.                   }
  256.               while(temp!=0xf0)
  257.               {
  258.                    temp=P3;
  259.                    temp =temp&0xf0;
  260.                    dispaly2(c);
  261.               }
  262.           }
  263.      }
  264.      P3=0xf7;
  265.      temp =P3;
  266.      temp=temp&0xf0;
  267.      while(temp!=0xf0)
  268.      {
  269.           delay(5);
  270.           temp=P3;
  271.           temp =temp&0xf0;
  272.           while(temp!=0xf0)
  273.           {
  274.                temp=P3;
  275.                if(temp==0xe7)
  276.                    {
  277.                        delay(5);
  278.                        if(temp==0xe7)
  279.                        {
  280.                            TR0=1;          //比赛开始计时按键
  281.                            flag=1;
  282.                        }
  283.                    }
  284.                if(temp==0xd7)
  285.                    {
  286.                        delay(5);
  287.                        if(temp==0xd7)
  288.                        {
  289.                            TR0=0;        //比赛暂停计时按键
  290.                            flag=0;
  291.                        }
  292.                    }
  293.                if(temp==0xb7)
  294.                    {
  295.                        delay(5);
  296.                        if(temp==0xb7)
  297.                        {
  298.                            fen=0;          //比赛时间清零
  299.                            miao=0;
  300.                        }
  301.                    }
  302.                while(temp!=0xf0)
  303.                {
  304.                     temp=P3;
  305.                     temp=temp&0xf0;
  306.                     dispaly2(c);
  307.                }
  308.           }
  309.      }
  310. }
  311. void timer0(void)interrupt 1               //T0中断服务
  312. {
  313.      TH0=0x4c;                             //50ms延时初值
  314.      TL0=0x00;
  315.      t++;
  316.      if(t==20)                              //50ms走20次刚好1S,1s时间到,减1操作
  317.      {
  318.                       t=0;
  319.           miao--;
  320.           if(miao == -1)
  321.           {
  322.                 fen--;
  323.                 miao=59;                     //当59s减完,分减1
  324.           }
  325.           if(fen == -1)
  326.           {
  327.                fen=0;                    //分清零
  328.                miao=0;
  329.                beep=0;                   //时间停止蜂鸣器响
  330.           }
  331.      }
  332. }
  333. void init()                               //T0中断初始化
  334. {
  335.      TMOD=0x01;
  336.      TH0= (65536-50000)/256;
  337.      TL0= (65536-50000)%256;
  338.      ET0=1;
  339.      EA=1;
  340.      TR0=0;
  341. }
  342. void main()                           //主程序
  343. {
  344.      P2=0xfe;
  345.      init();
  346.      while(1)
  347.           {
  348.               dispaly();
  349.               keyscan();
  350.           }
  351. }
复制代码

回复

使用道具 举报

ID:313328 发表于 2018-6-28 17:42 | 显示全部楼层
好知识,学习学习
回复

使用道具 举报

ID:361675 发表于 2018-6-29 19:09 | 显示全部楼层
请问一下按图接好线,编号程序,Proteus仿真时数码管不亮,是什么原因导致的呀
回复

使用道具 举报

ID:361675 发表于 2018-6-29 20:23 | 显示全部楼层
楼主,求解,程序无误,接线无误,仿真时为啥数码管不亮呀
回复

使用道具 举报

ID:679695 发表于 2020-6-24 17:01 | 显示全部楼层
感谢分享!
回复

使用道具 举报

ID:790347 发表于 2020-6-26 16:51 | 显示全部楼层
请问这是在哪本书上的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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