OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 使用51单片机实现【微信跳一跳】的演示系统

共6条 1/1 1 跳转至

使用51单片机实现【微信跳一跳】的演示系统

工程师
2020-06-11 21:55:19    评分

使用51单片机实现的跳一跳物理外挂,包含了proteus仿真与元器件清单
代码不免有粗糙之处;关于跳一跳物理助手的实现方法有很多,从串口通信到舵机、步进电机,如果要以快速精准为目的,还可以使用摄像头或者配合采样电阻进行AD转换来实现来采集信息。

一、材料准备:单片机STC89C52RC、74HC138、74HC573、5V继电器模块、四脚轻触开关、四位数码管、晶振、电容、LED等。
  • 硬件搭设

  • 原理图(见下图

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


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

    得出的线性回归方程为:
    T = 22.26 * L + 56.44 (T是延时时间,L是棋子跳的距离)
    若要得到更准确的方程,可再多测量几次数据,再求方程。
    (折线的原因是游戏本身是3D的,所以每次用尺子测量的距离误差很大)

  • 总结

代码不免有粗糙之处;关于跳一跳物理助手的实现方法有很多,从串口通信到舵机、步进电机,如果要以快速精准为目的,还可以使用摄像头或者配合采样电阻进行AD转换来实现来采集信息。注:仅以学习为目的,本人不建议使用外挂,以维护游戏的公平性。

软件及数据调试:

1、软件(主要的源码如下:)

#include<reg52.h>

#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<n;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;

              }             






关键词: 微信     跳一跳     演示     demo    

助工
2020-06-11 22:07:37    评分
2楼

好像挺有难度和挑战,膜拜大佬!


助工
2020-06-11 22:15:31    评分
3楼

这个数码管是共阴的吗?


助工
2020-06-11 22:22:02    评分
4楼

挺好,这些可以学习一下微信这个功能的原理了!


助工
2020-06-11 23:14:17    评分
5楼

演示的不错


助工
2020-06-22 23:47:48    评分
6楼

我觉得还是软件实现起来更加靠谱吧


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]