找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6226|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

關(guān)于微信跳一跳物理助手的實(shí)現(xiàn)(單片機(jī)源碼+Proteus仿真)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
使用51單片機(jī)實(shí)現(xiàn)的跳一跳物理外掛,包含了proteus仿真與元器件清單
代碼不免有粗糙之處;關(guān)于跳一跳物理助手的實(shí)現(xiàn)方法有很多,從串口通信到舵機(jī)、步進(jìn)電機(jī),如果要以快速精準(zhǔn)為目的,還可以使用攝像頭或者配合采樣電阻進(jìn)行AD轉(zhuǎn)換來(lái)實(shí)現(xiàn)來(lái)采集信息。
一、材料準(zhǔn)備:
單片機(jī)STC89C52RC、74HC138、74HC573、5V繼電器模塊、四腳輕觸開(kāi)關(guān)、四位數(shù)碼管、晶振、電容、LED等。
  • 硬件搭設(shè)
  • 原理圖(見(jiàn)FDF
  • 實(shí)物圖

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


  • 數(shù)據(jù)分析,首先通過(guò)給定的延時(shí)時(shí)間,測(cè)出小棋子跳的距離,記錄十組左右升序排列,建表,畫出折線圖,如下圖右側(cè):

    得出的線性回歸方程為:
    T = 22.26 * L + 56.44 (T是延時(shí)時(shí)間,L是棋子跳的距離)
    若要得到更準(zhǔn)確的方程,可再多測(cè)量幾次數(shù)據(jù),再求方程。
    (折線的原因是游戲本身是3D的,所以每次用尺子測(cè)量的距離誤差很大)
  • 總結(jié)
代碼不免有粗糙之處;關(guān)于跳一跳物理助手的實(shí)現(xiàn)方法有很多,從串口通信到舵機(jī)、步進(jìn)電機(jī),如果要以快速精準(zhǔn)為目的,還可以使用攝像頭或者配合采樣電阻進(jìn)行AD轉(zhuǎn)換來(lái)實(shí)現(xiàn)來(lái)采集信息。
注:僅以學(xué)習(xí)為目的,本人不建議使用外掛,以維護(hù)游戲的公平性。

軟件及數(shù)據(jù)調(diào)試:
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. }
復(fù)制代碼



全部資料51hei下載地址:
微信跳一跳物理助手.zip (2.84 MB, 下載次數(shù): 65)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:591295 發(fā)表于 2019-7-27 14:35 | 只看該作者
膜拜大佬
回復(fù)

使用道具 舉報(bào)

板凳
ID:709636 發(fā)表于 2020-4-15 21:03 | 只看該作者
這個(gè)數(shù)碼管是共陰的嗎?
回復(fù)

使用道具 舉報(bào)

地板
ID:770080 發(fā)表于 2020-6-5 10:56 | 只看該作者
能不能弄個(gè)電腦識(shí)別距離教程
回復(fù)

使用道具 舉報(bào)

5#
ID:884988 發(fā)表于 2022-1-28 22:57 | 只看該作者
謝謝,認(rèn)真學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表