找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6370|回复: 2
收起左侧

基于单片机的篮球记分牌电路原理图与源码

[复制链接]
ID:318695 发表于 2018-4-29 11:12 | 显示全部楼层 |阅读模式
篮球记分牌主要分为两大部分:一部分是实现倒计时功能,和实验课所做的60S倒计时类似。另一部分是实现计分功能,其基本功能和计数器类似。同时外加两部分切换显示功能。

需要注意的是程序中的管脚与原理图中管脚必须一致,在画原理图时也一样应当注意复位电路、晶振、电源、数码管接在芯片正确的管脚。复位电路中REST接的是芯片第9脚,晶振电路中XTAL2和XTAL1分别接18、19脚,将晶振产生的时钟信号作为定时信号。芯片20脚接GND,40脚和31脚接VCC,数码管是共阴数码管。

0.png
图片8.png 0.jpg

程序源码如下:
  1. #include<reg52.H>        //*****头文件*****//
  2. #define uchar unsigned char         //*定义变量*//
  3. #define uint  unsigned int         //*定义uint为无符号整形变量*//
  4. unsigned t = 0x3cb0;
  5. uchar CZ=24; //*计时初值*//
  6. uchar key=0;
  7. uchar score;
  8. uchar mode=1;//*模式变量*//
  9. uchar score1=0;          //*甲队得分变量*//
  10. uchar score2=0;  //*乙队得分变量*//  
  11. uchar bittime=0,bitdisplay=0;   //*定义变量*//
  12. uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //*段码0,1,2,3,4,5,6,7,8,9*//
  13. sbit J0=P3^0;      //*独立按键 *//
  14. sbit J1=P3^1;
  15. sbit J2=P3^2;
  16. sbit J3=P3^3;
  17. sbit J4=P3^4;
  18. sbit J5=P3^5;
  19. sbit J6=P3^6;

  20. sbit LED1 = P1^0;
  21. sbit LED2 = P1^1;
  22. sbit LED3 = P1^2;
  23. sbit LED4 = P1^3;
  24. sbit SPK=P1^7;

  25. /********延时函数******/
  26. void delay(uchar z)
  27. {
  28.         uchar x,y;
  29.          for(x=z;x>0;x--)
  30.                  for(y=110;y>0;y--);
  31. }
  32. /* 服务程序*/
  33. void timer0 (void) interrupt 1 using 0
  34. {
  35.         TH0=0x3c; //*50ms*//
  36.         TL0=0xb0;
  37.         bittime++; //每来一次中断,中断次数bittime自加1
  38.         while(bittime==20)
  39.          {
  40.                   bittime=0;  //每经一秒调用一次显示程序
  41.                   bitdisplay=1;
  42.                 if(bitdisplay)
  43.                 {
  44.                         bitdisplay = 0;
  45.                         CZ--;
  46.                         if(-1 == CZ) CZ=24;        
  47.                 }
  48.          }
  49. }
  50. /* 甲队分数显示函数*/
  51. void display_1(uint z)
  52. {
  53.         P2 = 0XFE; /*11111101甲队个位分数显示*/
  54.         P0 = tab[z%10];
  55.         delay(10);
  56.         P2 = 0XFD; /*11111110甲队十位分数显示*/
  57.         P0 = tab[z/10];
  58.         delay(10);
  59. }
  60. /* 乙队分数显示函数*/
  61. void display_2(uint z)
  62. {
  63.         P2 = 0Xfb; /*11110111乙队个位分数显示*/
  64.         P0 = tab[z%10];
  65.         delay(10);
  66.         P2 = 0Xf7; /*11111011乙队十位分数显示*/
  67.         P0 = tab[z/10];
  68.         delay(10);
  69. }
  70. /* 甲分数处理函数*/
  71. int inc1()
  72. {
  73.                
  74.                         if(~J3)
  75.                         {
  76.                                 delay(10);
  77.                                 score1= score1+1;
  78.                         }while(~J3);        
  79.                
  80.                 if(~J4)
  81.                 {
  82.                         delay(10);
  83.                         score1= score1+2;
  84.                         }while(~J4);
  85.                         if(~J5)
  86.                         {
  87.                                 delay(10);
  88.                                 score1= score1+3;
  89.                         }while(~J5);        
  90.                   
  91.                 return score1;
  92. }

  93. /* 乙分数处理函数*/
  94. int inc2()
  95. {

  96.                                 if(~J3)
  97.                         {
  98.                                 delay(10);
  99.                                 score2= score2+1;
  100.                         }while(~J3);        
  101.                
  102.                 if(~J4)
  103.                 {
  104.                         delay(10);
  105.                         score2= score2+2;
  106.                         }while(~J4);
  107.                         if(~J5)
  108.                         {
  109.                                 delay(10);
  110.                                 score2= score2+3;
  111.                         }while(~J5);        
  112.                   
  113.                 return score1;
  114. }
  115. /* 甲乙队切加分换处理函数*/
  116. uchar turn()
  117. {
  118.         if(~J2)
  119.         {
  120.                 delay(10);
  121.                 if(~J2)
  122.                 {
  123.                         delay(10);
  124.                         LED1 = 1;
  125.                         LED2 = 1;
  126.                         LED3 = 0;
  127.                         LED4 = 1;
  128.                         key = 1;
  129.                 }while(~J2);        
  130.         }
  131.         if(~J6)
  132.         {
  133.                 delay(10);
  134.                 if(~J6)
  135.                 {
  136.                         delay(10);
  137.                         LED1 = 1;
  138.                         LED2 = 1;
  139.                         LED3 = 1;
  140.                         LED4 = 0;
  141.                         key = 2;
  142.                 }while(~J6);        
  143.         }
  144.         return key;        
  145. }
  146. /* 加分显示函数*/
  147. void marks()
  148. {
  149.         turn();
  150.                 if(key == 1)
  151.                 {
  152.                         inc1();
  153.                         if(score1<100)
  154.                         {
  155.                                 display_1(score1);
  156.                                 display_2(score2);
  157.                         }        
  158.                         else score1 =score1-100;                        
  159.                 }
  160.                 else if(key == 2)
  161.                 {
  162.                         inc2();
  163.                         if(score2<100)
  164.                         {
  165.                                 display_1(score1);
  166.                                 display_2(score2);        
  167.                         }
  168.                         else score2 = score2-100;                        
  169.                 }
  170. }
  171. /*模式选择函数*/
  172. uchar mode_select()
  173. {
  174.         if(~J0)
  175.         {
  176.                 delay(10);
  177.                 if(~J0)
  178.                 {
  179.                         delay(10);
  180.                         mode = 1;
  181.                         LED1 = 0;
  182.                         LED2 = 1;
  183.                         LED3 = 1;
  184.                         LED4 = 1;
  185.                 } while(~J0);
  186.         }
  187.         if(~J1)
  188.         {
  189.                 delay(10);
  190.                 if(~J1)
  191.                 {
  192.                         delay(10);
  193.                         mode = 2;
  194.                         LED1 = 1;
  195.                         LED2 = 0;
  196.                         LED3 = 1;
  197.                         LED4 = 1;
  198.                 } while(~J1);
  199.         }

  200.         return mode;        
  201. }
  202.   
  203. /*倒计时处理*/
  204. void time_count()
  205. {
  206.         TR0 = 1;
  207.         P2 = 0XFB; /*11111010甲乙十位显示*/
  208.         P0 = tab[CZ/10];
  209.         delay(10);
  210.         P2 = 0XFD; /*11110101甲乙个位显示*/
  211.         P0 = tab[CZ%10];
  212.         delay(10);        
  213. }
  214. /* 主函数*/
  215. int main()
  216. {
  217.         TMOD= 0x01;
  218.         TH0=0x3c;
  219.     TL0=0xb0;
  220.         EA = 1; //cpu允许所有中断
  221.         ET0 =1;//定时器T0中断允许
  222.         TR0 = 0;//关闭定时器T0
  223.         P2 = 0XF0;
  224.         P0 = 0x3f;
  225.         SPK=0;
  226.         while(1)
  227.         {         
  228.                 mode_select();
  229.                 if(1 == mode)                //加分功能
  230.                 {         
  231.                         TR0 = 0;//关闭定时器
  232.                         CZ = 24;  //重新赋初值24秒
  233.                         display_1(score1);
  234.                         delay(10);
  235.                         display_2(score2);
  236.                         marks();
  237.                 }
  238.                 if(2 == mode)          //计时功能
  239.                 {         
  240.                         if(CZ == 0){TR0 = 0,SPK=1;delay(30);SPK = 0;
  241.                                                          foul_sever();
  242.                                                           }
  243.                         time_count();}        
  244.          
  245.         }
  246.         return 0;
  247. }
复制代码



全部资料51hei下载地址:
篮球计分牌.rar (101.49 KB, 下载次数: 64)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:318695 发表于 2018-4-29 11:14 | 显示全部楼层
新人发帖,求奖励币
回复

使用道具 举报

ID:299889 发表于 2018-6-28 21:29 | 显示全部楼层
管脚定义跟自己的原理图都不对
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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