找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于微信跳一跳物理助手的实现(单片机源码+Proteus仿真)

  [复制链接]
跳转到指定楼层
楼主
使用51单片机实现的跳一跳物理外挂,包含了proteus仿真与元器件清单
代码不免有粗糙之处;关于跳一跳物理助手的实现方法有很多,从串口通信到舵机、步进电机,如果要以快速精准为目的,还可以使用摄像头或者配合采样电阻进行AD转换来实现来采集信息。
一、材料准备:
单片机STC89C52RC、74HC138、74HC573、5V继电器模块、四脚轻触开关、四位数码管、晶振、电容、LED等。
  • 硬件搭设
  • 原理图(见FDF
  • 实物图

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


  • 数据分析,首先通过给定的延时时间,测出小棋子跳的距离,记录十组左右升序排列,建表,画出折线图,如下图右侧:

    得出的线性回归方程为:
    T = 22.26 * L + 56.44 (T是延时时间,L是棋子跳的距离)
    若要得到更准确的方程,可再多测量几次数据,再求方程。
    (折线的原因是游戏本身是3D的,所以每次用尺子测量的距离误差很大)
  • 总结
代码不免有粗糙之处;关于跳一跳物理助手的实现方法有很多,从串口通信到舵机、步进电机,如果要以快速精准为目的,还可以使用摄像头或者配合采样电阻进行AD转换来实现来采集信息。
注:仅以学习为目的,本人不建议使用外挂,以维护游戏的公平性。

软件及数据调试:
1、软件
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define GPIO_SEG1 P0
  5. sbit LsA=P2^2;
  6. sbit LsB=P2^3;
  7. sbit LsC=P2^4;
  8. sbit K1=P2^0;
  9. sbit Kt=P3^2;
  10. sbit RELAY=P2^1;
  11. float m=22.26,n=56.44,L;
  12. uint T;
  13. uchar num=0;
  14. uchar code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
  15. void delay_ms(uint n);
  16. void DigDisplay();
  17. uchar dig[4];
  18. void DisplayData(uchar c);
  19. void Rela();
  20. void keyscan();
  21. void Init0();
  22. void main()
  23. {
  24.               Init0();
  25.               while(1)
  26.               {
  27.                                keyscan();
  28.                                T=m*L+n;
  29.                                DisplayData(L);
  30.                   DigDisplay();
  31.                      Rela();                           
  32.               }
  33. }

  34. void Rela()
  35. {
  36.                             if(K1==0)
  37.                             {
  38.                                           delay_ms(10);
  39.                                           if(K1==0)
  40.                                           {
  41.                                                         RELAY=0;
  42.                                                         delay_ms(T);
  43.                                                         RELAY=1;
  44.                                                         while(!K1);
  45.                                                         num=0;
  46.                                                         L=0;
  47.                                           }
  48.                             }
  49.                             else
  50.                             {
  51.                                           RELAY=1;
  52.                             }            
  53. }
  54. void delay_ms(unsigned int n)
  55. {
  56.     unsigned int i=0,j=0;
  57.     for(i=0;i<n;i++)
  58.         for(j=0;j<123;j++);
  59. }
  60. void DigDisplay()
  61. {
  62.                             uchar i;
  63.                             for(i=0;i<4;i++)
  64.                             {
  65.                                           switch(i)
  66.                                           {
  67.                                                         case 0:
  68.                                                         LsC=0;LsB=0;LsA=0;break;
  69.                                                         case 1:
  70.                                                         LsC=0;LsB=0;LsA=1;break;
  71.                                                         case 2:
  72.                                                         LsC=0;LsB=1;LsA=0;break;
  73.                                                         case 3:
  74.                                                         LsC=0;LsB=1;LsA=1;break;
  75.                                          
  76.                                           }
  77.                                           P1=dig[i];
  78.                                           delay_ms(1);
  79.                                           P1=0x00;
  80.                             }
  81.             
  82. }
  83. void DisplayData(uchar c)
  84. {
  85.               dig[0]=smgduan[c/1000];
  86.               dig[1]=smgduan[(c-(c/1000)*1000)/100];
  87.               dig[2]=smgduan[(c%100)/10];
  88.               dig[3]=smgduan[c%10];
  89. }
  90. void keyscan()
  91. {
  92.               uint a=0;
  93.               uchar KeyValue;
  94.               GPIO_SEG1=0x0f;
  95.               if(GPIO_SEG1!=0x0f)
  96.               {
  97.                             delay_ms(10);
  98.                             if(GPIO_SEG1!=0x0f)
  99.                             {            
  100.                                           GPIO_SEG1=0x0f;
  101.                                           switch(GPIO_SEG1)
  102.                                           {
  103.                                                         case(0x07):
  104.                                                         KeyValue=0;break;
  105.                                                         case(0x0b):
  106.                                                         KeyValue=1;break;
  107.                                                         case(0x0d):
  108.                                                         KeyValue=2;break;
  109.                                                         case(0x0e):
  110.                                                         KeyValue=3;break;
  111.                                           }
  112.                                                         GPIO_SEG1=0xf0;
  113.                                           switch(GPIO_SEG1)
  114.                                           {
  115.                                                         case(0x70):
  116.                                                         KeyValue=KeyValue;break;
  117.                                                         case(0xb0):
  118.                                                         KeyValue=KeyValue+4;break;
  119.                                                         case(0xd0):
  120.                                                         KeyValue=KeyValue+8;break;
  121.                                                         case(0xe0):
  122.                                                         KeyValue=KeyValue+12;break;
  123.                                           }
  124.                                           while(a<500&&(GPIO_SEG1!=0xf0))
  125.                                           {
  126.                                                         delay_ms(1);
  127.                                                         a++;
  128.                                           }
  129.                                           num++;
  130.                                           if(num==1)
  131.                                           {
  132.                                                         L=KeyValue*10.0;
  133.                                           }
  134.                                           if(num==2)
  135.                                           {
  136.                                                         L=L+KeyValue*1.0;
  137.                                                         num=0;
  138.                                           }
  139.                             }
  140.               }
  141. }
  142. void Init0()
  143. {
  144.               EA=1;
  145.               EX0=1;
  146.               IT0=0;
  147. }
  148. void Int0() interrupt 0
  149. {
  150.               delay_ms(10);
  151.               if(Kt==0)
  152.               {
  153.                             L=0;
  154.                             num=0;
  155.               }            
  156. }
复制代码



全部资料51hei下载地址:
微信跳一跳物理助手.zip (2.84 MB, 下载次数: 64)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:591295 发表于 2019-7-27 14:35 | 只看该作者
膜拜大佬
回复

使用道具 举报

板凳
ID:709636 发表于 2020-4-15 21:03 | 只看该作者
这个数码管是共阴的吗?
回复

使用道具 举报

地板
ID:770080 发表于 2020-6-5 10:56 | 只看该作者
能不能弄个电脑识别距离教程
回复

使用道具 举报

5#
ID:884988 发表于 2022-1-28 22:57 | 只看该作者
谢谢,认真学习一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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