跳一跳j算法ava代码_会玩!大神用51单片机自制微信跳一跳物理助手

使用51单片机实现的跳一跳物理外挂,包含了proteus仿真与元器件清单。代码不免有粗糙之处。

关于跳一跳物理助手的实现方法有很多,从串口通信到舵机、步进电机,如果要以快速精准为目的,还可以使用摄像头或者配合采样电阻进行AD转换来实现来采集信息。

注:仅以学习为目的,笔者不建议使用外挂,以维护游戏的公平性。

1

硬件电路

(1)材料清单:单片机STC89C52RC、74HC138、74HC573、5V继电器模块、四脚轻触开关、四位数码管、晶振、电容、LED等。

(2)硬件搭设:

82cbb8136044db99028feb9fb8c0f2f8.png

(3)仿真原理图如下:

de6799a66addca5a6174a08fe0452fd0.png

2

数据分析

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

ee76b9fca79f57e5fb8e95e58c15121a.png

得出的线性回归方程为:

T = 22.26 * L + 56.44

T是延时时间,L是棋子跳的距离

若要得到更准确的方程,可再多测量几次数据,再求方程。

折线的原因是游戏本身是3D的,所以每次用尺子测量的距离误差很大。

3

源代码

←左右滑动,查看代码→

#include

#define uint unsigned int

#define uchar unsigned char

#define GPIO_SEG1 P0

sbit LsA=P2^2;

sbit LsB=P2^3;

sbit LsC=P2^4;

sbit K1=P2^0;

sbit Kt=P3^2;

sbit RELAY=P2^1;

float m=22.26,n=56.44,L;

uint T;

uchar num=0;

uchar code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};

void delay_ms(uint n);

void DigDisplay();

uchar dig[4];

void DisplayData(uchar c);

void Rela();

void keyscan();

void Init0();

void main()

{

    Init0();

    while(1)

    {

         keyscan();

         T=m*L+n;

         DisplayData(L);

         DigDisplay();

         Rela();

    }

}

void Rela()

{

   if(K1==0)

   {

        delay_ms(10);

        if(K1==0)

        {

             RELAY=0;

             delay_ms(T);

             RELAY=1;

             while(!K1);

             num=0;

             L=0;

        }

   }

   else

   {

        RELAY=1;

   }

}

void delay_ms(unsigned int n)

{

   unsigned int i=0,j=0;

   for(i=0;i

      for(j=0;j<123;j++);

}

void DigDisplay()

{

   uchar i;

   for(i=0;i<4;i++)

   {

       switch(i)

       {

           case 0:

           LsC=0;LsB=0;LsA=0;break;

           case 1:

           LsC=0;LsB=0;LsA=1;break;

           case 2:

           LsC=0;LsB=1;LsA=0;break;

           case 3:

           LsC=0;LsB=1;LsA=1;break;

       }

       P1=dig[i];

       delay_ms(1);

       P1=0x00;

   }

}

void DisplayData(uchar c)

{

   dig[0]=smgduan[c/1000];

   dig[1]=smgduan[(c-(c/1000)*1000)/100];

   dig[2]=smgduan[(c%100)/10];

   dig[3]=smgduan[c%10];

}

void keyscan()

{

   uint a=0;

   uchar KeyValue;

   GPIO_SEG1=0x0f;

   if(GPIO_SEG1!=0x0f)

   {

        delay_ms(10);

        if(GPIO_SEG1!=0x0f)

        {

             GPIO_SEG1=0x0f;

             switch(GPIO_SEG1)

             {

                  case(0x07):

                  KeyValue=0;break;

                  case(0x0b):

                  KeyValue=1;break;

                  case(0x0d):

                  KeyValue=2;break;

                  case(0x0e):

                  KeyValue=3;break;

             }

             GPIO_SEG1=0xf0;

             switch(GPIO_SEG1)

             {

                  case(0x70):

                  KeyValue=KeyValue;break;

                  case(0xb0):

                  KeyValue=KeyValue+4;break;

                  case(0xd0):

                  KeyValue=KeyValue+8;break;

                  case(0xe0):

                  KeyValue=KeyValue+12;break;

             }

             while(a<500&&(GPIO_SEG1!=0xf0))

             {

                  delay_ms(1);

                  a++;

             }

             num++;

             if(num==1)

             {

                  L=KeyValue*10.0;

             }

             if(num==2)

             {

                  L=L+KeyValue*1.0;

                  num=0;

             }

        }

   }

}

void Init0()

{

   EA=1;

   EX0=1;

   IT0=0;

}

void Int0() interrupt 0

{

   delay_ms(10);

   if(Kt==0)

   {

        L=0;

        num=0;

   }

}

*本文系网络转载,版权归原作者所有,如有侵权请联系删除

0754966a31598891e2ce543337f9a2aa.gif efed3c4b1ea1ac62f15058cf7ab4951e.png 扫码入群 扫码添加管理员微信

加入“电子产品世界”粉丝交流群

↓↓↓↓点击,查看更多新闻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值