使用51單片機實現的跳一跳物理外掛,包含了proteus仿真與元器件清單
代碼不免有粗糙之處;關于跳一跳物理助手的實現方法有很多,從串口通信到舵機、步進電機,如果要以快速精準為目的,還可以使用攝像頭或者配合采樣電阻進行AD轉換來實現來采集信息。
一、材料準備: 單片機STC89C52RC、74HC138、74HC573、5V繼電器模塊、四腳輕觸開關、四位數碼管、晶振、電容、LED等。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (16 KB, 下載次數: 79)
下載附件
2019-3-11 01:34 上傳
- 數據分析,首先通過給定的延時時間,測出小棋子跳的距離,記錄十組左右升序排列,建表,畫出折線圖,如下圖右側:
得出的線性回歸方程為:
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;
- }
- }
復制代碼
0.png (47.15 KB, 下載次數: 64)
下載附件
2019-3-11 01:34 上傳
全部資料51hei下載地址:
微信跳一跳物理助手.zip
(2.84 MB, 下載次數: 65)
2019-3-10 12:50 上傳
點擊文件名下載附件
51單片機實現的跳一跳物理外掛,包含了proteus仿真與元器件清單 下載積分: 黑幣 -5
|