这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» 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

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

}

}






关键词: 微信 跳一跳 演示 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 跳转至

回复

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