找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2544|回复: 8
收起左侧

单片机篮球计分器keil源代码Proteus仿真

[复制链接]
ID:1029353 发表于 2022-5-25 13:40 | 显示全部楼层 |阅读模式
可以实现篮球计分基本功能
仿真原理图如下(大家自行画一下图)
运行图片.png

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

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

  5. sbit A8=P2^0;  
  6. sbit A9=P2^1;
  7. sbit A10=P2^2;
  8. sbit A11=P2^3;
  9. sfr P00=0x80;


  10. uchar code wei_1[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
  11. uchar code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0x77,0x7c,0x39,0x5e,0x79,0x71,0X00,0X40};

  12. uchar minute=12;  //分
  13. uchar second=0;   //秒
  14. uchar key_status=0;                //按键状态值
  15. uchar scoreA=0;                //A队得分
  16. uchar scoreB=0;                //B队得分
  17. uchar count1=20;        //记录定时器时间
  18. uchar match=1;                //比赛节数
  19. uchar rule_time=24;        //记录24秒规则
  20. uchar rule_flag=0;                        //记录24秒规则是否启用


  21. /*
  22. 初始化IO口
  23. */
  24. void IO_init(){
  25.         A8=0;
  26.         A9=0;
  27. }
  28. /*
  29. 初始化时间
  30. */

  31. void time_init(){
  32.         TMOD = 0x01;
  33.         TH0 = (65536-50000)/256;
  34.         TL0 = (65536-50000)%256;
  35.         EA = 1;
  36.         ET0 = 1;
  37. }
  38. /*
  39. 延时函数
  40. */
  41. void delay_ms(uint z){
  42.   uint i;
  43.         uchar j;
  44.         for(i=0;i<z;i++){
  45.                
  46.                 for(j=0;j<100;j++);
  47.         }
  48. }

  49. /*
  50. 计时函数
  51. */
  52. void T0_Time() interrupt 1 using 1{
  53.         if (count1-- == 0)
  54.         {
  55.                 second--;
  56.                 rule_time--;
  57.                 count1 = 20;
  58.         }
  59.         TH0 = (65536-50000)/256;
  60.         TL0 = (65536-50000)%256;
  61. }

  62. /*
  63. 时间显示函数
  64. */
  65. void time_display(uchar w2,uchar d2){
  66.         uchar shi1,ge1;
  67.         shi1=d2/10;
  68.         ge1=d2%10;
  69.         
  70.         P00=wei_1[w2];
  71.         A10=1;
  72.         A10=0;
  73.         P00=table[shi1];;
  74.         A8=1;
  75.         A8=0;
  76.         delay_ms(5);
  77.         P00=0;
  78.         A10=1;
  79.         A10=0;
  80.         A8=1;
  81.         A8=0;
  82.         
  83.         P00=wei_1[w2+1];
  84.         A10=1;
  85.         A10=0;
  86.         P00=table[ge1];
  87.         A8=1;
  88.         A8=0;
  89.         delay_ms(5);
  90.         P00=0;
  91.         A10=1;
  92.         A10=0;
  93.         A8=1;
  94.         A8=0;        
  95. }

  96. /*
  97. 分数显示函数
  98. */
  99. void score_dispaly(uchar w2,uchar d2){
  100.         uchar qian2,shi2,ge2;
  101.         qian2=d2/100;
  102.         shi2=d2%100/10;
  103.         ge2=d2%100%10;
  104.         
  105.         P00=wei_1[w2];
  106.         A9=1;
  107.         A9=0;
  108.         P00=table[qian2];;
  109.         A8=1;
  110.         A8=0;
  111.         delay_ms(10);
  112.         P00=0;
  113.         A9=1;
  114.         A9=0;
  115.         A8=1;
  116.         A8=0;
  117.         
  118.         P00=wei_1[w2+1];
  119.         A9=1;
  120.         A9=0;
  121.         P00=table[shi2];
  122.         A8=1;
  123.         A8=0;
  124.         delay_ms(10);
  125.         P00=0;
  126.         A9=1;
  127.         A9=0;
  128.         A8=1;
  129.         A8=0;        
  130.         
  131.         P00=wei_1[w2+2];
  132.         A9=1;
  133.         A9=0;
  134.         P00=table[ge2];
  135.         A8=1;
  136.         A8=0;
  137.         delay_ms(10);
  138.         P00=0;
  139.         A9=1;
  140.         A9=0;
  141.         A8=1;
  142.         A8=0;
  143. }

  144. /*
  145. 键盘输入函数
  146. */
  147. void key(){
  148.         static uchar key_new = 0, key_l,temp;
  149.         key_status = 0;                  
  150.         P1 = 0x0f;
  151.         if((P1 & 0x0f) != 0x0f)               
  152.         {
  153.                 delay_ms(1);                     
  154.                 if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
  155.                 {                                                
  156.                         key_new = 0;
  157.                         /*
  158.                         矩阵键盘扫描
  159.                         */
  160.                         key_l = (P1 | 0xf0);   
  161.                         P1 = key_l;
  162.                         switch(P1)
  163.                         {
  164.                                 /*
  165.                                 开始计时/比赛继续        
  166.                                 */
  167.                                 case 0x7e:  
  168.                                         TR0=1;  
  169.                                         rule_flag=1;
  170.                                         time_display(6,rule_time);
  171.                                         break;         
  172.                                 /*
  173.                                 暂停比赛
  174.                                 */
  175.                                 case 0x7d:
  176.                                         TR0=0;
  177.                                         break;  
  178.                                 
  179.                                 /*
  180.                                 加分,同时24秒清零和总计时器停止计时
  181.                                 */
  182.                                 case 0xee:
  183.                                         TR0=0;
  184.                                         scoreA +=3;
  185.                                         rule_time=24;   
  186.                                         rule_flag=0;
  187.                                         break;
  188.                                 case 0xed:
  189.                                         TR0=0;                                         
  190.                                         scoreA +=2;
  191.                                         rule_time=24;   
  192.                                         rule_flag=0;
  193.                                         break;
  194.                                 case 0xeb:  
  195.                                         TR0=0;
  196.                                         scoreA +=1;
  197.                                         rule_time=24;   
  198.                                         rule_flag=0;
  199.                                         break;
  200.                                 case 0xde:  
  201.                                         TR0=0;
  202.                                         scoreB +=3;
  203.                                         rule_time=24;   
  204.                                         rule_flag=0;
  205.                                    break;
  206.                                 case 0xdd:  
  207.                                         TR0=0;
  208.                                         scoreB +=2;
  209.                                         rule_time=24;   
  210.                                         rule_flag=0;
  211.                                         break;
  212.                                 case 0xdb:  
  213.                                         TR0=0;
  214.                                         scoreB +=1;
  215.                                         rule_time=24;   
  216.                                         rule_flag=0;
  217.                                         break;
  218.                                 /*
  219.                                 增加比赛节数,同时24秒复位和总计时器复位
  220.                                 */
  221.                                 case 0xbd:
  222.                                         match++;
  223.                                         minute=12;
  224.                                         second=0;
  225.                                         TR0=0;
  226.                                         rule_time=24;   
  227.                                         rule_flag=0;
  228.                                         break;
  229.                                 /*
  230.                                 手动24秒复位
  231.                                 */
  232.                                 case 0xbe:
  233.                                         if(TR0==1){
  234.                                                         rule_time=0;   
  235.                                                         rule_flag=0;
  236.                                         }else{
  237.                                                         rule_flag=0;  
  238.                                         }
  239.                                         break;
  240.                         }        
  241.                 }                        
  242.         }
  243.         else
  244.         {
  245.                 key_new = 1;
  246.         }
  247. }

  248. void main()
  249. {
  250.         IO_init();
  251.         time_init();
  252.         while(1){
  253.                 key();
  254.                
  255.                 if(second==0){
  256.                         /*
  257.                                 判断某节比赛是否结束
  258.                         */
  259.                         if(minute==0){
  260.                                 /*
  261.                                 判断是否为最后一节比赛
  262.                                 */
  263.                                 if(match<4){
  264.                                         /*
  265.                                         计时系统恢复为默认值,比赛节数加一
  266.                                         */
  267.                                         second=60;
  268.                                         minute=11;
  269.                                         match++;
  270.                                         rule_time=24;   
  271.                                         rule_flag=0;
  272.                                 }        
  273.                                 TR0=0;
  274.                         }
  275.                         /*
  276.                         比赛分钟数减一
  277.                         */
  278.                         else {        
  279.                                 second=60;
  280.                                 minute--;
  281.                         }                                
  282.                 }
  283.                 /*
  284.                 24秒结束,计时器暂停和24秒复位
  285.                 */
  286.                 if(rule_time<=0){
  287.                         TR0=0;
  288.                         rule_time=24;        
  289.                 }
  290.                
  291.                 /*
  292.                 显示
  293.                 */
  294.                 time_display(0,minute);
  295.                 time_display(2,second);
  296.                 time_display(4,match);
  297.                 time_display(6,rule_time);
  298.                 score_dispaly(1,scoreA);
  299.                 score_dispaly(5,scoreB);
  300.         }
  301. }
复制代码


评分

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

查看全部评分

回复

使用道具 举报

ID:1034506 发表于 2022-6-14 13:55 | 显示全部楼层
这 代码分别什么意思可以讲一下吗
回复

使用道具 举报

ID:997874 发表于 2022-6-29 20:48 | 显示全部楼层
这个代码运行成功后功能都能运行,但是数字一直闪,怎么修改让数字不闪呢
回复

使用道具 举报

ID:1055989 发表于 2022-12-16 22:12 | 显示全部楼层
有哪些模块可以说说吗
回复

使用道具 举报

ID:579397 发表于 2022-12-17 01:19 | 显示全部楼层
spider1 发表于 2022-6-29 20:48
这个代码运行成功后功能都能运行,但是数字一直闪,怎么修改让数字不闪呢

Proteus里面单片机的频率改大一点
回复

使用道具 举报

ID:579397 发表于 2022-12-17 01:19 | 显示全部楼层
fuckpose 发表于 2022-12-16 22:12
有哪些模块可以说说吗

单片机,573,数码管
回复

使用道具 举报

ID:579397 发表于 2022-12-17 01:46 | 显示全部楼层
程序有问题,table的是共阴的,但wei的是共阳的,需要修改

uchar code wei_1[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
uchar code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0x77,0x7c,0x39,0x5e,0x79,0x71,0X00,0X40};
回复

使用道具 举报

ID:1058273 发表于 2022-12-19 14:54 来自手机 | 显示全部楼层
代码打进去,但只有比赛开始和暂停比赛和增加比赛节数有用,得分加分都加不上
回复

使用道具 举报

ID:1068458 发表于 2023-5-2 23:28 | 显示全部楼层
不设计减分功能吗,加错分了还能减
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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