找回密码
 立即注册

QQ登录

只需一步,快速开始

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

篮球比赛计分器51单片机程序,前段时间帮别人搞毕设用普中的开发板

  [复制链接]
跳转到指定楼层
楼主
前段时间帮别人搞毕设用普中的开发板进行了验证,下面是按键说明与接线图:




单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. //uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};

  6. //这三个引脚参考资料
  7. sbit E=P2^7;                //1602使能引脚
  8. sbit RW=P2^5;                //1602读写引脚        
  9. sbit RS=P2^6;                //1602数据/命令选择引脚
  10. sbit beep=P1^5; //蜂鸣器
  11. bit beep_flag;

  12. sbit start_game=P3^7;
  13. sbit pause=P3^6;
  14. bit run_off;
  15. uchar game_time_min=12;
  16. uchar game_time_sec=0;
  17. uchar game_num=1;

  18. sbit P24=P2^4;
  19. sbit P23=P2^3;
  20. sbit P22=P2^2;
  21. sbit P21=P2^1;
  22. sbit P20=P2^0;

  23. #define FOSC 11059200L

  24. #define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode
  25. uint count,count1,count2;

  26. uchar r_b,r_s,r_g,b_s,b_b,b_g;        //红分和黑分的百十个
  27. bit h_h;        //红黑方加减分标志
  28. uchar second_s,second_g;       //倒计时的十和个
  29. bit updata=0;
  30. #define left 15
  31. #define right  3
  32. #define add_score 7
  33. #define sub_score 11
  34. #define start 14
  35. #define stop 2
  36. bit start_24sec=0;
  37. bit game_over;

  38. void add_score_function();
  39. void sub_score_function();
  40. void redisplay();

  41. /********************************************************************
  42. * 名称 : Delay_1ms()
  43. * 功能 : 延时子程序,延时时间为 1ms * x
  44. * 输入 : x (延时一毫秒的个数)
  45. * 输出 : 无
  46. ***********************************************************************/
  47. void Delay_1ms(uint i)//1ms延时
  48. {
  49.         uchar x;
  50.         uint j;
  51.         for(j=0;j<i;j++)
  52.         for(x=0;x<=148;x++)
  53.         ;        
  54. }

  55. /********************************************************************
  56. * 名称 : delay()
  57. * 功能 : 延时,延时时间大概为140US。
  58. * 输入 : 无
  59. * 输出 : 无
  60. ***********************************************************************/

  61. void delay()
  62. {
  63.         int i,j;
  64.         for(i=0; i<=10; i++)
  65.         for(j=0; j<=2; j++)
  66.   ;
  67. }


  68. /********************************************************************
  69. * 名称 : enable(uchar del)
  70. * 功能 : 1602命令函数
  71. * 输入 : 输入的命令值
  72. * 输出 : 无
  73. ***********************************************************************/

  74. void enable(uchar del)
  75. {
  76.         P0 = del;
  77.         RS = 0;
  78.         RW = 0;
  79.         E = 0;
  80.         delay();
  81.         E = 1;
  82.         delay();
  83. }

  84. /********************************************************************
  85. * 名称 : write(uchar del)
  86. * 功能 : 1602写数据函数
  87. * 输入 : 需要写入1602的数据
  88. * 输出 : 无
  89. ***********************************************************************/

  90. void write(uchar del)
  91. {
  92.         P0 = del;
  93.         RS = 1;
  94.         RW = 0;
  95.         E = 0;
  96.         delay();
  97.         E = 1;
  98.         delay();
  99. }

  100. /********************************************************************
  101. * 名称 : L1602_init()
  102. * 功能 : 1602初始化,请参考1602的资料
  103. * 输入 : 无
  104. * 输出 : 无
  105. ***********************************************************************/
  106. void L1602_init(void)
  107. {
  108.         enable(0x01);
  109.         enable(0x38);
  110.         enable(0x0c);
  111.         enable(0x06);
  112.         enable(0xd0);
  113. }

  114. /********************************************************************
  115. * 名称 : L1602_char(uchar hang,uchar lie,char sign)
  116. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
  117.                  L1602_char(1,5,'b')
  118. * 输入 : 行,列,需要输入1602的数据
  119. * 输出 : 无
  120. ***********************************************************************/
  121. void L1602_char(uchar hang,uchar lie,char sign)
  122. {
  123.         uchar a;
  124.         if(hang == 1) a = 0x80;
  125.         if(hang == 2) a = 0xc0;
  126.         a = a + lie - 1;
  127.         enable(a);
  128.         write(sign);
  129. }

  130. /********************************************************************
  131. * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
  132. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
  133.                   L1602_string(1,5,"ab cd ef;")
  134. * 输入 : 行,列,需要输入1602的数据
  135. * 输出 : 无
  136. ***********************************************************************/
  137. void L1602_string(uchar hang,uchar lie,uchar *p)
  138. {
  139.         uchar a;
  140.         if(hang == 1) a = 0x80;
  141.         if(hang == 2) a = 0xc0;
  142.         a = a + lie - 1;
  143.         enable(a);
  144.         while(1)
  145.         {
  146.                 if(*p == '\0') break;
  147.                 write(*p);
  148.                 p++;
  149.         }
  150. }


  151. /********************************************************************
  152. * 名称 : Keyscan()
  153. * 功能 : 实现按键的读取。下面这个子程序是按处理 矩阵键盘 的基本方法处理的。
  154. * 输入 : 无
  155. * 输出 : 按键值
  156. ***********************************************************************/
  157. uchar keyscan(void)
  158. {
  159.          uchar temp;
  160.   P21=1;
  161.         if(P24==0) {temp=right; goto next;}
  162.         if(P23==0) {temp=sub_score; goto next;}
  163.         if(P22==0) {temp=stop; goto next;}
  164.         
  165.         P20=1; P21=0;
  166.         if(P24==0) {temp=left; goto next;}
  167.         if(P23==0) {temp=add_score; goto next;}
  168.         if(P22==0) {temp=start; goto next;}
  169.         temp=0xff;
  170. next:
  171.         while((P2&0x1c)!=0x1c); //等待按键释放
  172.         return temp;
  173. }

  174. /********************************************************************
  175. * 名称 : Main()
  176. * 功能 : 主函数
  177. * 输入 : 无
  178. * 输出 : 无
  179. ***********************************************************************/
  180. void Main(void)
  181. {
  182.         uchar Key_Value,temp;  //读出的键值
  183.         
  184.           TMOD = 0x01;                    //set timer0 as mode1 (16-bit)
  185.     TL0 = T1MS;                     //initial timer0 low byte
  186.     TH0 = T1MS >> 8;                //initial timer0 high byte
  187.     //TR0 = 1;                        //timer0 start running
  188.     ET0 = 1;                        //enable timer0 interrupt
  189.     EA = 1;                         //open global interrupt switch
  190.           start_game=1;                  //pull high
  191.           pause=1;                        //pull high
  192.         
  193.         L1602_init();
  194.         //draw some picturs
  195.         for(temp=1; temp<17; temp++)
  196.         {
  197.                 L1602_string(1,temp,"O");
  198.                 if((temp-1)!=0)
  199.      {L1602_string(1,temp-1," ");}
  200.                 Delay_1ms(200);
  201.         }
  202.         L1602_string(1,1,"Basketball score");
  203.         L1602_string(2,5,"Recorder");
  204.         Delay_1ms(4000);        
  205.         //end draw some pictures
  206. begin:
  207.         L1602_string(2,1,"Fir 12:00 24 Sec");
  208.         second_s=2; second_g=4;
  209.         L1602_char(1,11,second_s+48);
  210.         L1602_char(1,12,second_g+48);
  211.         h_h=1;
  212.         L1602_string(1,1,"->R:000    B:000");
  213.         while(1)
  214.         {
  215.                 if(updata)
  216.                 {
  217.                         updata=0;
  218.                         redisplay();
  219.                         L1602_char(2,11,second_s+48);
  220.                         L1602_char(2,12,second_g+48);
  221.                 }
  222.                 if((second_s==0)&&(second_g<=3))
  223.                 {beep_flag=1;}
  224.                 if((game_time_min==0)&&(game_time_sec<=2))
  225.                 {beep_flag=1;}
  226.                
  227.                 if(start_game==0)
  228.                 {
  229.                         Delay_1ms(15);
  230.                         if(start_game==0)
  231.                         {
  232.                                 while(start_game==0);
  233.                                 if(game_over)
  234.                                 {
  235.                                         game_over=0; game_num=1;
  236.                                         game_time_min=12; game_time_sec=0;
  237.                                         ET0=1; EA=1;
  238.                                  goto begin;
  239.                                 }
  240.                                 run_off=1;
  241.                         }
  242.                 }
  243.                
  244.                 if(pause==0)
  245.                 {
  246.                         Delay_1ms(15);
  247.                         if(pause==0)
  248.                         {
  249.                                 while(pause==0);
  250.                                 run_off=0;
  251.                         }
  252.                 }
  253.                 if(run_off) {TR0=1;}
  254.                
  255.                 P2&=0xfc;
  256.                 P2|=0x1c;
  257.                 temp=P2&0x1c;
  258.                 if(temp!= 0x1c)
  259.                 {
  260.                         Delay_1ms(15);        //按键消抖
  261.                         P2&=0xfc;
  262.                   P2|=0x1c;
  263.                   temp=P2&0x1c;
  264.                         if(temp != 0x1c)
  265.                         {
  266.                                 Key_Value = keyscan();
  267.         switch(Key_Value)
  268.                                 {
  269.                                         case left:                                        //
  270.            {
  271.                                                 h_h=1;
  272.                                                  redisplay();
  273.                                           L1602_string(1,1,"->");
  274.                                                 L1602_string(1,10,"  ");
  275.                                                 break;
  276.                                          }
  277.                                         case right:
  278.            {
  279.                                                 h_h=0;
  280.                                                  redisplay();
  281.                                           L1602_string(1,1,"  ");
  282.                                                 L1602_string(1,10,"->");
  283.                                                 break;
  284.                                          }
  285.                                         case add_score:
  286.                                         {
  287.            add_score_function();
  288.                                          break;
  289.                                         }
  290.                                         case sub_score:
  291.                                         {
  292.                                                 sub_score_function();
  293.            break;
  294.           }
  295.                                         case start:
  296.                                         {
  297.                                                 start_24sec=1;
  298.                                                 break;
  299.                                         }
  300.                                         case stop:
  301.                                         {
  302.                                                 start_24sec=0;
  303.                                                 second_s=2;
  304.                                                 second_g=4;
  305.                                                 updata=1;
  306.                                                 beep=0;
  307.                                                 break;
  308.                                         }
  309.           default: break;                                       
  310.                                 }
  311.                         }
  312.                 }
  313.   }               
  314. }
  315. //*******************************************
  316. void add_score_function()
  317. {
  318.                                                 if(h_h==0)
  319.                                                 {
  320.                                                         if(++b_g==10)
  321.                                                         {
  322.                                                                 b_g=0;
  323.                                                                 if(++b_s==10)
  324.                                                                 {
  325.                                                                         b_s=0;
  326.                                                                         if(++b_b==10)
  327.                                                                                 b_b=0;
  328.                                                                 }
  329.                                                         }
  330.                                                         redisplay();
  331.                                                 L1602_char(1,14,b_b+48);
  332.                                                 L1602_char(1,15,b_s+48);
  333.                                                 L1602_char(1,16,b_g+48);                                                        
  334.                                                 }
  335.            else
  336.                                                 {
  337.                                                         if(++r_g==10)
  338.                                                         {
  339.                                                                 r_g=0;
  340.                                                                 if(++r_s==10)
  341.                                                                 {
  342.                                                                         r_s=0;
  343.                                                                         if(++r_b==10)
  344.                                                                                 r_b=0;
  345.                                                                 }
  346.                                                         }
  347.                                                         redisplay();
  348.                                                 L1602_char(1,5,r_b+48);
  349.                                                 L1602_char(1,6,r_s+48);
  350.                                                 L1602_char(1,7,r_g+48);                                                
  351.                                                 }        
  352. }

  353. //*********************************************
  354. void sub_score_function()
  355. {
  356.                                                 if(h_h==0)
  357.                                                 {
  358.                                                         if(b_g!=0)
  359.                                                         {b_g--;}
  360.                                                         else
  361.                                                         {
  362.                                                                 if(b_s!=0)
  363.                                                                 {
  364.                                                                         b_s--; b_g=9;
  365.                                                                 }
  366.                                                                 else
  367.                                                                 {
  368.                                                                         if(b_b!=0)
  369.                                                                         {b_b--; b_s=9; b_g=9;}
  370.                                                                 }
  371.                                                         }
  372.                                                         redisplay();
  373.                                                 L1602_char(1,14,b_b+48);
  374.                                                 L1602_char(1,15,b_s+48);
  375.                                                 L1602_char(1,16,b_g+48);                                                
  376.                                                 }
  377.                                                 else
  378.                                                 {
  379.                                                         if(r_g!=0)
  380.                                                         {r_g--;}
  381.                                                         else
  382.                                                         {
  383.                                                                 if(r_s!=0)
  384.                                                                 {
  385.                                                                         r_s--; r_g=9;
  386.                                                                 }
  387.                                                                 else
  388.                                                                 {
  389.                                                                         if(r_b!=0)
  390.                                                                         {r_b--; r_s=9; r_g=0;}
  391.                                                                 }
  392.                                                         }
  393.                                                         redisplay();
  394.                                                 L1602_char(1,5,r_b+48);
  395.                                                 L1602_char(1,6,r_s+48);
  396.                                                 L1602_char(1,7,r_g+48);        
  397.                                                 }        
  398. }
  399. //***************************************************
  400. void redisplay()
  401. {
  402.   uchar temp,temp1;
  403.         temp=game_time_min/10;
  404.         temp1=game_time_min%10;
  405.         L1602_char(2,5,temp+48); L1602_char(2,6,temp1+48);
  406.         temp=game_time_sec/10;
  407.         temp1=game_time_sec%10;
  408.         L1602_char(2,8,temp+48); L1602_char(2,9,temp1+48);        
  409. }
  410. //-----------------------------------------------

  411. /* Timer0 interrupt routine */
  412. void tm0_isr() interrupt 1 using 1
  413. {
  414.     TL0 = T1MS;                     //reload timer0 low byte
  415.     TH0 = T1MS >> 8;                //reload timer0 high byte
  416.           if(beep_flag)
  417.                 {
  418.                         if(++count1==4)
  419.                         {
  420.                                 count1=0;
  421.                                 beep=!beep;
  422.                         }
  423.                 }
  424.                 else
  425.                 {beep=0;}
  426.         
  427.     if (++count== 1000)               //1ms * 1000 -> 1s
  428.     {
  429.        count = 0;               //reset counter
  430.                          updata=1;
  431.                         
  432.                         if(start_24sec)                        //24秒到计时
  433.                         {
  434.                         if(second_g!=0)
  435.                         {second_g--;}
  436.                         else
  437.                         {
  438.                                 if(second_s!=0)
  439.                                 {
  440.                                   second_s--;
  441.                                         second_g=9;
  442.                                 }
  443.                                 else
  444.         {
  445.                                  start_24sec=0;
  446.                                  second_s=2;second_g=4;
  447.                                         beep=0; beep_flag=0;
  448.                                 }
  449.                         }
  450.                  }
  451.                         
  452.                  if(run_off)            //正常计时
  453.                  {
  454.                          if(game_time_sec!=0)
  455.                          {game_time_sec--;}
  456.                          else
  457.                          {
  458.                                  if(game_time_min!=0)
  459.                                  {
  460. ……………………

  461. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
篮球比赛计分器.rar (159.04 KB, 下载次数: 75)



评分

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

查看全部评分

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

使用道具 举报

沙发
ID:347913 发表于 2018-6-10 13:00 | 只看该作者
我想问下我用普中学习板运行这个程序,端口也改了,计时开始和停止都正常,但矩阵键盘没反应,怎么办
回复

使用道具 举报

板凳
ID:287575 发表于 2018-6-12 23:30 | 只看该作者
默默的注意 发表于 2018-6-10 13:00
我想问下我用普中学习板运行这个程序,端口也改了,计时开始和停止都正常,但矩阵键盘没反应,怎么办

矩阵接线正确吗?正确应该没问题,我是反复试过的,你把接线拍个图发来,我看一下
回复

使用道具 举报

地板
ID:372149 发表于 2018-7-21 20:52 | 只看该作者
*** WARNING L15: MULTIPLE CALL TO SEGMENT
楼主有错误哇
回复

使用道具 举报

5#
ID:287575 发表于 2018-8-4 12:17 | 只看该作者
anshenghhhhh 发表于 2018-7-21 20:52
*** WARNING L15: MULTIPLE CALL TO SEGMENT
楼主有错误哇

不可能有错误的,已经烧到板子正常工作的
回复

使用道具 举报

6#
ID:426562 发表于 2018-11-17 18:21 | 只看该作者
楼主请问我用的2.2的板子,但是计时程序一直没反应咋回事啊?其他功能是好的
回复

使用道具 举报

7#
ID:426241 发表于 2018-12-6 15:02 来自手机 | 只看该作者
请问楼主这是需要多少个按键
回复

使用道具 举报

8#
ID:428761 发表于 2018-12-7 19:35 | 只看该作者
老哥,为什么我的1602显示器显示的比分很奇怪???
回复

使用道具 举报

9#
ID:537660 发表于 2019-5-21 10:11 | 只看该作者
你好~想问一下如果想中场比分交换的话,要怎么加代码
回复

使用道具 举报

10#
ID:403027 发表于 2019-5-21 17:05 | 只看该作者

正想学习ESP8266,谢谢楼主
回复

使用道具 举报

11#
ID:543123 发表于 2019-6-4 08:25 | 只看该作者
有电路图吗楼主
回复

使用道具 举报

12#
ID:693873 发表于 2020-2-22 19:15 | 只看该作者
默默的注意 发表于 2018-6-10 13:00
我想问下我用普中学习板运行这个程序,端口也改了,计时开始和停止都正常,但矩阵键盘没反应,怎么办

我也是哎
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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