找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4058|回复: 3
收起左侧

单片机乒乓球比赛Proteus仿真+PCB原理图+源程序

[复制链接]
ID:495792 发表于 2019-6-11 09:15 | 显示全部楼层 |阅读模式
这是一个乒乓球的程序,分享一下。
用protues画的仿真图,keil5编的程序,有很多不足的地方望大家指出。

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png 0.png

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
0.png
单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define SEG P2
  5. sbit KEY_A_START = P1^4;
  6. sbit KEY_A_HIT = P1^5;
  7. sbit KEY_B_START = P1^6;
  8. sbit KEY_B_HIT = P1^7;
  9. sbit SCAN1 = P3^4;
  10. sbit SCAN2 = P3^5;
  11. sbit SCAN3 = P3^6;
  12. sbit SCAN4 = P3^7;
  13. sbit LED1 = P0^0;
  14. sbit LED2 = P0^1;
  15. sbit LED3 = P0^2;
  16. sbit LED4 = P0^3;
  17. sbit LED5 = P0^4;
  18. sbit LED6 = P0^5;
  19. sbit LED7 = P0^6;
  20. sbit LED8 = P0^7;
  21. sbit LED9 = P1^0;
  22. sbit LED10 = P1^1;
  23. sbit LED11 = P1^2;
  24. sbit LED12 = P1^3;

  25. uchar A_num = 0;
  26. uchar B_num = 0;
  27. uchar number=0;
  28. uchar display=0;//数码管刷新
  29. uchar ball_time = 300;
  30. uchar ball_num = 0;
  31. uchar flag_ball = 0;
  32. uchar ball_state = 0;
  33. uchar flag_A_B = 0;
  34. uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  35. void scan_ball();
  36. void delay(uint j) //1ms
  37. {
  38.         uchar i=250;
  39.         for(;j>0;j--)
  40. {
  41.                 while(--i);
  42.                 i=249;
  43.                 while(--i);
  44.                 i=250;
  45.         }
  46. }

  47. void None_LED()
  48. {
  49.           LED1=1;
  50.                 LED2=1;
  51.           LED3=1;
  52.                 LED4=1;
  53.                 LED5=1;
  54.                 LED6=1;
  55.                 LED7=1;
  56.                 LED8=1;
  57.                 LED9=1;
  58.                 LED10=1;
  59.                 LED11=1;
  60.                 LED12=1;               
  61.         
  62. }
  63. void Key_scan()
  64. {
  65.         if(KEY_A_START==0)//按下甲开始按键
  66.         {
  67.                 delay(10);
  68.                 if(KEY_A_START==0)
  69.                 {
  70.                         while(KEY_A_START==0);
  71.      flag_A_B=1;
  72.                  flag_ball=1;
  73.                         
  74.                 }
  75.                
  76.         }else if(KEY_A_HIT==0)//按下甲击球按键
  77.         {
  78.           delay(10);
  79.                 if(KEY_A_HIT==0)
  80.                 {
  81.                         flag_A_B=0;
  82.                         scan_ball();
  83.                         while(KEY_A_HIT==0);
  84.                   if(ball_state==2)
  85.                         {
  86.                                 A_num++;
  87.                                 None_LED();
  88.                                 flag_ball=0;
  89.                         }else
  90.                         {
  91.                                 flag_A_B=1;
  92.                         }
  93.                         
  94.                 }
  95.   }else if(KEY_B_START==0)//按下乙开始按键
  96.         {
  97.           delay(10);
  98.                 if(KEY_B_START==0)
  99.                 {
  100.                         while(KEY_B_START==0);
  101.      flag_A_B=2;
  102.                  flag_ball=12;
  103.                 }
  104.   }else if(KEY_B_HIT==0)//按下乙击球按键
  105.         {
  106.           delay(10);
  107.                 if(KEY_B_HIT==0)
  108.                 {
  109.                         flag_A_B=0;
  110.                         scan_ball();
  111.                         while(KEY_B_HIT==0);
  112.                   if(ball_state==1)
  113.                         {
  114.                                 B_num++;
  115.                                 None_LED();
  116.                                 flag_ball=0;
  117.                         }else
  118.                         {
  119.                                 flag_A_B=2;
  120.                         }

  121.                 }
  122.   }
  123.         
  124. }

  125. void scan_ball()//返回当前球的位置 0 未发球   1在A球区   2 在B球区
  126. {
  127.         if((LED9 & LED10 & LED11 & LED12)==1)
  128.         {
  129.                 ball_state=1;
  130.         }else
  131.         {
  132.         ball_state=2;
  133.         }
  134. }


  135. void main()
  136. {
  137.         TMOD |= 0x01;
  138.         TH0=0XFC;
  139.         TL0=0X18;
  140.         TR0=1;
  141.         ET0=1;
  142.         EA=1;         
  143.         while(1)
  144.         {
  145.                
  146.                  Key_scan();
  147.         }
  148.         
  149. }



  150. void t0isr() interrupt 1//定时器0函数
  151. {
  152.         TH0=0XFC;
  153.         TL0=0X18;
  154.   display++;                  
  155.         ball_num++;
  156.         if(display==2)
  157.         {
  158.                 display=0;
  159.                 SEG=0xff;

  160.                         switch(number)
  161.                 {

  162.      case 0:SCAN4=1;SCAN3=0;SCAN2=0;SCAN1=0;SEG=distab[A_num%10];break;
  163.         
  164.      case 1:SCAN4=0;SCAN3=1;SCAN2=0;SCAN1=0;;SEG=distab[A_num/10];break;

  165.      case 2:SCAN4=0;SCAN3=0;SCAN2=1;SCAN1=0;SEG=distab[B_num%10];break;

  166.      case 3:SCAN4=0;SCAN3=0;SCAN2=0;SCAN1=1;;SEG=distab[B_num/10];break;

  167.      default:break;
  168.                         
  169.     }
  170.                 number++;
  171.     if(number>3)number=0;
  172.         }
  173.         
  174.         
  175.                 if(ball_num==ball_time)
  176.                 {
  177.                         ball_num=0;

  178.                         None_LED();
  179.                         switch(flag_ball)
  180.                         {
  181.                                 case 1:LED1=0;break;
  182.                                 case 2:LED2=0;break;
  183.                                 case 3:LED3=0;break;
  184.                                 case 4:LED4=0;break;
  185.                                 case 5:LED5=0;break;
  186.                                 case 6:LED6=0;break;
  187.                                 case 7:LED7=0;break;
  188.                                 case 8:LED8=0;break;
  189.                                 case 9:LED9=0;break;
  190.                                 case 10:LED10=0;break;
  191.                                 case 11:LED11=0;break;
  192.                                 case 12:LED12=0;break;                                
  193.                         }
  194.                                 if(flag_A_B==1)
  195.                         {
  196.                                 flag_ball++;
  197.                         }else if(flag_A_B==2)
  198.                         {
  199.                                 flag_ball--;
  200.                         }
  201.                         if(flag_ball==13 && flag_A_B==1)
  202.                         {
  203.                                 if(B_num!=20)
  204.                                 {
  205.                                 B_num++;
  206.                                 flag_A_B=0;
  207.                                 }
  208.                                 else if(B_num==20)
  209.                                 {
  210.                                         flag_A_B=0;
  211.                                         A_num=0;
  212.                                         B_num=0;
  213.                                 }
  214.                                 None_LED();
  215.                                 flag_ball=0;
  216.                         }else if(flag_ball==0 && flag_A_B==2)
  217.                         {
  218.                                 if(A_num!=20)
  219.                                 {
  220.                                 A_num++;
  221.                                 flag_A_B=0;
  222.                                 }
  223.                                 else if(A_num==20)
  224.                                 {
  225.                                         flag_A_B=0;
  226.                                         A_num=0;
  227.                                         B_num=0;
  228.                                 }
  229.                                                 None_LED();
  230.                                                 flag_ball=0;
  231.                         }
  232.                         
  233.                 }
  234.         

  235.         
  236.         
  237. }
复制代码
0.png
所有资料51hei提供下载:
资料.7z (15.05 MB, 下载次数: 98)

评分

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

查看全部评分

回复

使用道具 举报

ID:755651 发表于 2020-5-19 14:03 | 显示全部楼层
你这个题目要求是啥?
回复

使用道具 举报

ID:964648 发表于 2021-10-13 13:35 | 显示全部楼层
左下角的三个孔的方块是什么錒
回复

使用道具 举报

ID:972523 发表于 2021-10-16 13:52 | 显示全部楼层
下角的两个孔的方块是什么錒
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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