找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 30992|回复: 56
打印 上一主题 下一主题
收起左侧

基于51单片机的篮球计分器设计(实物+仿真+PCB+源程序)

  [复制链接]
跳转到指定楼层
楼主
ID:375972 发表于 2018-7-21 15:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我以前做的51单片机篮球计分器设计,
花了一个星期时间,
附件里面包括源代码;PCB原理图,
和proteus的仿真文件
都是自己原创的,大家多多指教

制作出来的篮球计分器实物图如下:


电路原理图如下:


篮球计分器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


Altium Designer画的篮球计分器原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机篮球计分器程序源码:
  1. #include<reg51.h>//51单片机头文件
  2. typedef unsigned char uchar;
  3. typedef unsigned int  uint;
  4. sbit K1=P3^2;//比赛倒计时开始/暂停
  5. sbit K2=P3^3;//24s倒计时重新开始
  6. sbit P20=P2^0;//乙队+1按键
  7. sbit P21=P2^1;//乙队+2按键
  8. sbit P22=P2^2;//甲队+1按键
  9. sbit P23=P2^3;//甲队+2按键
  10. sbit P24=P2^4;//甲队+3按键
  11. sbit P25=P2^5;//乙队+3按键
  12. sbit P26=P2^6;//预留按键
  13. sbit P27=P2^7;
  14. sbit beep=P3^6;//蜂鸣器接口  
  15. sbit RS=P1^0;
  16. sbit RW=P1^1;
  17. sbit E=P1^2;
  18. char second,minute,num,time,aa;
  19. uchar dd,bb,cc;
  20. uchar code table1[]={"H.T 000:000 T.H "};
  21. uchar code table2[]={"12:00  SEC-1  24"};

  22. //延时子函数
  23. void delay(uint z)  
  24. {
  25.         uint x;
  26.         uchar y;
  27.         for(x=z;x>0;x--)
  28.                   for(y=110;y>0;y--);
  29. }
  30. //LCD1602液晶写指令子函数
  31. void write_com(uchar com)
  32. {        
  33.     RW=0;
  34.     RS=0;
  35.         P0=com;
  36.         delay(5);
  37.         E=1;
  38.         delay(5);
  39.         E=0;
  40. }
  41. //LCD1602液晶写数据子函数
  42. void write_date(uchar date)
  43. {
  44.         RW=0;
  45.         RS=1;
  46.         P0=date;
  47.         delay(5);
  48.         E=1;
  49.         delay(5);
  50.         E=0;
  51. }
  52. //LCD1602液晶初始化子函数
  53. void LCD1602_init()
  54. {
  55.         uchar i;
  56.         bb=0;         //H.T分数初始化
  57.         cc=0;         //T.H分数初始化
  58.         time=0;
  59.         TMOD=0x10;    //定时器1初始化
  60.         TL1=0x00;
  61.         TH1=0x4c;
  62.         EA=1;         //开总中断
  63.         ET1=1;        //开定时器1
  64.         TR1=0;        //开中断0
  65.         EX1=1;        //开中断1
  66.         IT0=1;        //中断0为边沿触发
  67.         IT1=1;        //中断1为边沿触发
  68.         E=0;
  69.         beep=0;
  70.         second=0;
  71.         minute=12;
  72.         num=1;
  73.         aa=24;
  74.         write_com(0x38);  //LCD设置初始化
  75.         write_com(0x0c);
  76.         write_com(0x06);
  77.         write_com(0x01);
  78.         write_com(0x80);  //LCD显示初始化
  79.         for(i=0;i<16;i++)
  80.         {
  81.                   write_date(table1[i]);
  82.         }
  83.         write_com(0x80+0x40);
  84.         for(i=0;i<16;i++)
  85.         {
  86.                   write_date(table2[i]);
  87.         }
  88. }
  89. //分数更新子函数
  90. void point_lcd(uchar add,uchar dat)
  91. {
  92.         write_com(0x80+add);
  93.         write_date(0x30+dat/100);
  94.         write_date(0x30+(dat%100)/10);
  95.         write_date(0x30+dat%10);
  96.         write_com(0x80+add);
  97. }
  98. //按键扫描子函数
  99. void keyscan()
  100. {
  101.         P2=0xf0;
  102.         if((P2&0xf0)!=0xf0)
  103.         {
  104.                 delay(20);
  105.         }
  106.         if((P2&0xf0)!=0xf0)
  107.         {
  108.                 P2=0xf7;
  109.                         if(P24==0)
  110.                         {
  111.                                 while(P24==0);         //P24按下H.T分数加1
  112.                         bb++;
  113.                           point_lcd(0x04,bb);  
  114.                           if(P24==0)        
  115.                                 {
  116.                                    while(P24==0);
  117.                                     delay(20);
  118.                                 }
  119.                         }
  120.                         else if(P25==0)           //P25按下H.T分数加2
  121.                         {
  122.                                 while(P25==0);
  123.                                 bb=bb+2;
  124.                           point_lcd(0x04,bb);
  125.                           if(P25==0)
  126.                                 {
  127.                                  while(P25==0);
  128.                                  delay(20);
  129.                                 }
  130.                         }
  131.                         else if(P26==0)       //P26按下H.T分数加3
  132.                         {
  133.                           while(P26==0);
  134.                         bb=bb+3;
  135.                           point_lcd(0x04,bb);
  136.                            if(P26==0)
  137.                                 {
  138.                                    while(P26==0);
  139.                                    delay(20);
  140.                                 }

  141.                         else if(P27==0)         //P27按下T.H分数加一
  142.                         {
  143.                          while(P27==0);
  144.                        cc++;
  145.                          point_lcd(0x08,cc);
  146.                          if(P27==0)
  147.                                  while(P27==0);
  148.                                  delay(20);
  149.                            }
  150.                         }
  151.                 P2=0xfb;
  152.               if(P24==0)           //P24按下T.H分数加2
  153.                           {
  154.                          while(P24==0);
  155.                    cc=cc+2;
  156.                          point_lcd(0x08,cc);
  157.                          if(P24==0)
  158.                            {
  159.                                 while(P24==0);
  160.                                 delay(20);
  161.                            }
  162.                          }
  163.                           else if(P25==0)      //P25按下T.H分数加3
  164.                           {
  165.                             while(P25==0);
  166.                         cc=cc+3;
  167.                           point_lcd(0x08,cc);
  168.                            if(P25==0)
  169.                                 {
  170.                                   while(P25==0);
  171.                                   delay(20);
  172.                                 }
  173.                           }
  174.                           else if(P26==0)       //P26按下交换比分
  175.                           {
  176.                                   while(P26==0);
  177.                                   dd=bb;
  178.                                   bb=cc;
  179.                                   cc=dd;
  180.                                   point_lcd(0x08,cc);
  181.                                   point_lcd(0x04,bb);
  182.                                   if(P26==0)
  183.                                 {
  184.                                   while(P26==0);
  185.                                   delay(20);
  186.                                 }
  187.                           }


  188.         }
  189. //比赛倒计时/24s倒计时
  190. void counter_down()
  191. {         
  192.         uchar i;
  193.         if(time>=20)     //每1s倒计时做减一操作
  194.         {
  195.                   second--;
  196.                   aa--;
  197.                   write_com(0x80+0x4e);  //24s倒计时显示
  198.                   write_date(0x30+aa/10);
  199.                   write_date(0x30+aa%10);
  200.                 write_com(0x80+0x4e);
  201.                 beep=1;
  202.                   if(aa==0)    //24s结束发出连续报警
  203.                   {
  204.                            beep=0;
  205.                            delay(3000);
  206.                            beep=1;
  207.                            aa=24;
  208.                   }
  209.                   if((second==0)&&(minute==0))  //检测一节比赛是否结束
  210.                   {
  211.                            TR1=0;     //定时器1暂停
  212.                            write_com(0x80+0x44);
  213.                            write_date(0x30);
  214.                            num++;
  215.                            aa=24;    //24s计时复位
  216.                            write_com(0x80+0x4e);  //24s倒计时显示
  217.                            write_date(0x30+aa/10);
  218.                            write_date(0x30+aa%10);
  219.                         write_com(0x80+0x4e);
  220.                            if(num<5)    //每节结束蜂鸣器发出间断报警
  221.                            {
  222.                             for(i=80;i>0;i--)
  223.                             {
  224.                                      beep=0;
  225.                                      delay(500);
  226.                                      beep=1;
  227.                                      delay(500);
  228.                             }
  229.                            }
  230.                            if(num==5)    //终场结束,蜂鸣器发出连续警报声
  231.                            {
  232.                              beep=0;
  233.                              delay(10000);
  234.                              num=0;
  235.                            }        
  236.                            beep=1;     //蜂鸣器关闭
  237.                         write_com(0x80+0x4b); //更新"SEC-?"
  238.                         write_date(0x30+num);
  239.                         write_com(0x80+0x4b);
  240.                         second=0;     //倒计时复位
  241.                         minute=12;
  242.                   }
  243.                   if(second==-1)
  244.                   {
  245.                            second=59;
  246.                            minute--;
  247.                   }
  248.                   write_com(0x80+0x40);  //更新倒计时显示
  249.                   write_date(0x30+minute/10);
  250.                   write_date(0x30+minute%10);
  251.                   write_com(0x80+0x43);
  252.                   write_date(0x30+second/10);
  253.                   write_date(0x30+second%10);
  254.                 write_com(0x80+0x43);
  255.                   time=0;
  256.         }
  257. }
复制代码



全部资料51hei下载地址:
源程序和原理图.rar (299.14 KB, 下载次数: 884)



评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏28 分享淘帖 顶12 踩
回复

使用道具 举报

沙发
ID:253275 发表于 2018-8-24 17:37 | 只看该作者
厉害了
回复

使用道具 举报

板凳
ID:375573 发表于 2018-11-14 12:24 | 只看该作者
楼主,按键那里的功能怎么实现不了,程序都是对的吗
回复

使用道具 举报

地板
ID:372200 发表于 2018-11-15 12:42 | 只看该作者
厉害了 怎么用
回复

使用道具 举报

5#
ID:426991 发表于 2018-11-15 12:45 | 只看该作者
好东西怎么下载
回复

使用道具 举报

6#
ID:433914 发表于 2018-11-27 10:28 | 只看该作者
楼主proteus仿真原理图最上面的那个RP1是什么
回复

使用道具 举报

7#
ID:434157 发表于 2018-11-27 15:42 | 只看该作者
作者,可否给个QQ,借一步说话
回复

使用道具 举报

8#
ID:434788 发表于 2018-11-29 16:50 | 只看该作者
我想把1602改成12864怎么改,请教大神啊
回复

使用道具 举报

9#
ID:436994 发表于 2018-12-3 09:47 | 只看该作者
怎么将液晶显示屏改成共阴极数码管
回复

使用道具 举报

10#
ID:440529 发表于 2018-12-5 23:16 | 只看该作者
有没有组成的电子元器件清单
回复

使用道具 举报

11#
ID:440520 发表于 2018-12-6 22:06 来自手机 | 只看该作者
下载了这个,源程序打不开,仿真图也有错误
回复

使用道具 举报

12#
ID:426241 发表于 2018-12-17 21:57 来自手机 | 只看该作者
想问改成12864要怎么改
回复

使用道具 举报

13#
ID:453195 发表于 2018-12-24 11:15 | 只看该作者
楼主 我这两天在实训  你这个源程序没有问题  但是仿真出来液晶显示屏没有东西是怎么回事啊   能告诉我吗 谢谢啦
回复

使用道具 举报

14#
ID:262642 发表于 2019-3-6 17:52 | 只看该作者
非常好,感谢楼主分享
回复

使用道具 举报

15#
ID:497801 发表于 2019-3-25 12:27 来自手机 | 只看该作者
不错,很实用了
回复

使用道具 举报

16#
ID:524220 发表于 2019-5-6 07:05 来自手机 | 只看该作者
可以可以,厉害厉害
回复

使用道具 举报

17#
ID:352449 发表于 2019-5-11 15:23 | 只看该作者

楼主,按键那里的功能怎么实现不了,程序都是对的吗
回复

使用道具 举报

18#
ID:352449 发表于 2019-5-11 15:34 | 只看该作者
zbwwbz 发表于 2018-11-27 10:28
楼主proteus仿真原理图最上面的那个RP1是什么

上拉电阻
回复

使用道具 举报

19#
ID:469368 发表于 2019-5-26 14:22 | 只看该作者
谢谢分享,受益匪浅呐
回复

使用道具 举报

20#
ID:549278 发表于 2019-5-28 14:51 | 只看该作者
17361608945 发表于 2018-12-6 22:06
下载了这个,源程序打不开,仿真图也有错误

真的程序也打不开,仿真图也有错吗
回复

使用道具 举报

21#
ID:262632 发表于 2019-5-29 11:00 | 只看该作者
仿真图里C51的引脚和芯片实际引脚不一样,代码会有影响吗
回复

使用道具 举报

22#
ID:262632 发表于 2019-5-29 11:00 | 只看该作者
代码下载到芯片里,显示屏没有显示是什么原因啊
回复

使用道具 举报

23#
ID:555401 发表于 2019-6-7 15:40 | 只看该作者
您好,楼主,我试了一下,按键换比分位置不行啊,而且24s一直倒,这俩问题如何解决,求指教。
回复

使用道具 举报

24#
ID:558696 发表于 2019-6-11 11:10 | 只看该作者
楼主 P26互换比分如何实现啊?要修改程序吗?
回复

使用道具 举报

25#
ID:560305 发表于 2019-6-11 20:46 | 只看该作者
楼主我们有黑币,可以分享到百度云吗
回复

使用道具 举报

26#
ID:560918 发表于 2019-6-12 14:55 | 只看该作者
楼主,今天刚注册,没有黑币,过几天领登陆奖励补行吗?现在急着用
回复

使用道具 举报

27#
ID:563720 发表于 2019-6-16 16:27 | 只看该作者
正好解了我的燃眉之急哈哈i谢谢了
回复

使用道具 举报

28#
ID:563781 发表于 2019-6-16 17:39 | 只看该作者
谢谢楼主分享,受益匪浅啊
回复

使用道具 举报

29#
ID:545738 发表于 2019-6-17 16:35 | 只看该作者
12345555900000 发表于 2018-12-24 11:15
楼主 我这两天在实训  你这个源程序没有问题  但是仿真出来液晶显示屏没有东西是怎么回事啊   能告诉我吗  ...

我是也是 LCD就只是亮了而已 不关按什么都没什么反应 楼主能解决一下吗?

回复

使用道具 举报

30#
ID:575287 发表于 2019-7-1 23:39 | 只看该作者
如何交换场地,程序你好像有交换场地,但是仿真图你怎么没有交换场地按钮
回复

使用道具 举报

31#
ID:575287 发表于 2019-7-2 14:02 来自手机 | 只看该作者
qingxiu 发表于 2018-11-14 12:24
楼主,按键那里的功能怎么实现不了,程序都是对的吗

都是对的,程序重新装入单片机
回复

使用道具 举报

32#
ID:579836 发表于 2019-7-8 11:26 来自手机 | 只看该作者
楼主 能否发一份呀谢谢了1257594783@qq.com
回复

使用道具 举报

33#
ID:626287 发表于 2019-10-18 22:25 | 只看该作者
建议时间显示还是用LED显示啊!!这样可以做大点场上队员才看得见啊!!
回复

使用道具 举报

34#
ID:632472 发表于 2019-10-30 09:29 | 只看该作者
LCD 显示屏没有反应啊
回复

使用道具 举报

35#
ID:640442 发表于 2019-11-12 15:28 | 只看该作者
好强啊,楼主
回复

使用道具 举报

36#
ID:542039 发表于 2019-11-20 21:03 | 只看该作者
很好 谢谢
回复

使用道具 举报

37#
ID:652339 发表于 2019-11-29 16:53 | 只看该作者
没黑币的我,自己画仿真图好难啊,元件都找不到啊呜呜
回复

使用道具 举报

38#
ID:652339 发表于 2019-11-30 10:04 | 只看该作者
vvyu 发表于 2019-10-30 09:29
LCD 显示屏没有反应啊

我的也没有反应.....
回复

使用道具 举报

39#
ID:649990 发表于 2019-12-2 16:12 来自手机 | 只看该作者
能不能请教下怎么插线 谢谢qq1004189543
回复

使用道具 举报

40#
ID:655468 发表于 2019-12-3 21:08 来自手机 | 只看该作者
楼主可以发一份给我吗?刚刚注册的号码,没有黑币。麻烦了。2920137008@qq.com
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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