找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5475|回復(fù): 5
收起左側(cè)

單片機(jī)16x16點(diǎn)陣貪食蛇proteus仿真制作 含程序 原理圖 仿真工程文件

[復(fù)制鏈接]
ID:137190 發(fā)表于 2016-9-25 12:44 | 顯示全部樓層 |閱讀模式
以前看到的點(diǎn)陣貪食蛇都是8*8的,這次我用16*16的led點(diǎn)陣做了一個(gè)效果也還可以,速度可自己調(diào)節(jié),可穿墻。
0.png

proteus仿真工程文件及程序下載地址:
16x16 Snake.zip (81.78 KB, 下載次數(shù): 78)


源程序:
  1. #include<reg52.h>
  2. #include<stdlib.h>
  3. #include "74HC595.h"
  4. #include "74HC154.h"

  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. //上   下   左   右
  8. //1           2        3         4
  9. sbit k1=P0^0;
  10. sbit k2=P0^1;
  11. sbit k3=P0^2;
  12. sbit k4=P0^3;

  13. uint a[8]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
  14. uint x[16];
  15. uint y[16];
  16. uchar D;                 //方向參數(shù)
  17. uchar n;                 //蛇身長度
  18. uchar k;         //速度參量

  19. /**************************

  20.        重啟程序

  21. **************************/
  22. void restart()
  23. {
  24. D=0;
  25. n=3;
  26. x[0]=1;x[1]=1;x[2]=1;
  27. y[0]=2;y[1]=1;y[2]=0;
  28. }

  29. /******************************

  30.                 基本延時(shí)程序

  31. ******************************/

  32. void yanshi(uint t)                 
  33. {
  34. unsigned char j;
  35. while(t--)
  36. {
  37. for(j=0;j<125;j++)
  38. {}
  39. }
  40. }

  41. /*****************************

  42.         碰撞掃描子程序

  43. *****************************/
  44. bit check_error(uchar X,uchar Y)
  45. {

  46. uchar i;
  47. for(i=1;i<n;i++)
  48. {
  49. if((x[i]==X)&&(y[i]==Y))
  50. {return 1;}
  51. }
  52.   return 0;
  53. }
  54. /*****************************

  55.       食物隨機(jī)點(diǎn)產(chǎn)生程序

  56. *****************************/

  57. void food()
  58. {
  59. uchar tempx,tempy;
  60. //隨機(jī)函數(shù)rand,頭文件<stdlib.h>
  61. tempx=rand()%16;                                          
  62. tempy=rand()%16;
  63. while(check_error(tempx,tempy))
  64. {
  65. tempx=rand()%16;                                          
  66. tempy=rand()%16;
  67. }
  68. x[n]=tempx;
  69. y[n]=tempy;
  70. }

  71. /*********************************
  72.   
  73.          顯示程序
  74.   
  75. **********************************/
  76. void display()                                                         
  77. {
  78. uchar i;
  79. uchar t;
  80. //多掃描幾遍,穩(wěn)定顯示
  81. OE1=0;
  82. OE2=0;
  83. for(t=0;t<=40*k;t++)  
  84. {
  85.   //掃描一遍
  86.    
  87. for(i=0;i<=n;i++)  
  88. {
  89.   if(x[i]<8)
  90.   {
  91.   OE2=1;
  92.   OE1=0;
  93.   Ser_IN1(a[x[i]]);
  94.   Par_OUT1();
  95.   writ_154(y[i]);
  96.   yanshi(1);
  97.   E1=1;
  98.   }
  99.   else
  100.   {
  101.   OE1=1;
  102.   OE2=0;
  103.   Ser_IN2(a[x[i]-8]);
  104.   Par_OUT2();
  105.   writ_154(y[i]);
  106.   yanshi(1);
  107.   E1=1;
  108.   }  

  109. }
  110.    
  111. }
  112. }

  113. /*******************************

  114.        獎(jiǎng)勵(lì)程序

  115. *******************************/
  116. void victory()
  117. {
  118. uchar i;
  119. for(i=0;i<16;i++)
  120. x[0]=x[1]=0;
  121. x[2]=x[3]=1;
  122. x[4]=x[5]=2;
  123. x[6]=x[7]=3;
  124. x[8]=x[9]=4;
  125. x[10]=x[11]=5;
  126. x[12]=x[13]=6;
  127. x[14]=x[15]=7;
  128. y[0]=3;y[1]=4;
  129. y[2]=4;y[3]=5;
  130. y[4]=5;y[5]=6;
  131. y[6]=5;y[7]=4;
  132. y[8]=4;y[9]=3;
  133. y[10]=3;y[11]=2;
  134. y[12]=2;y[13]=1;
  135. y[14]=1;y[15]=0;
  136. n=15;
  137. while(1)
  138. display();
  139. }
  140. /********************************

  141.     核心程序(計(jì)算蛇身下一步的顯示)

  142. ********************************/
  143. void display_next(uchar D)                  
  144. {
  145. uchar i;
  146.   if((x[0]==x[n])&&(y[0]==y[n]))  //判斷是否吃到食物
  147. {
  148. n++;
  149. if(n==15)
  150. {
  151. k--;
  152. if(k==0)
  153. {victory();}
  154. else
  155. food();
  156. }
  157. }
  158. if(D==1)                        //上
  159. {

  160.   for(i=n-1;i>=1;i--)
  161.   {
  162.    x[i]=x[i-1];
  163.    y[i]=y[i-1];
  164.   }
  165.   y[0]-=1;
  166.   if(y[0]==-1)
  167.   y[0]=15;
  168. }

  169. else if(D==2)
  170.     //下
  171. {
  172.   for(i=n-1;i>=1;i--)
  173.   {
  174.    x[i]=x[i-1];
  175.    y[i]=y[i-1];
  176.   }
  177.   y[0]+=1;
  178.   if(y[0]==16)
  179.   y[0]=0;
  180.   }


  181. else if(D==3)                 //左
  182. {
  183. for(i=n-1;i>=1;i--)
  184.   {
  185.    x[i]=x[i-1];
  186.    y[i]=y[i-1];
  187.   }
  188.   x[0]-=1;
  189.   if(x[0]==-1)
  190.   x[0]=15;
  191. }

  192. else if(D==4)         //右
  193. {

  194. for(i=n-1;i>=1;i--)
  195.   {
  196.    x[i]=x[i-1];
  197.    y[i]=y[i-1];
  198.   }
  199.   x[0]+=1;
  200.   if(x[0]==16)
  201.   x[0]=0;
  202. }
  203. if(check_error(x[0],y[0]))
  204. {
  205. restart();
  206. k=3;
  207. }
  208. }

  209. //檢查是否有方向變化
  210. void check_D()                                                           
  211. {
  212. P0=0xff;
  213. if(k1==0)
  214. {if(D!=2)D=1;}
  215. else if(k2==0){if(D!=1)D=2;}
  216. else if(k3==0){if(D!=4)D=3;}
  217. else if(k4==0){if(D!=3)D=4;}

  218. }

  219. /**********************************

  220. //主程序

  221. **********************************/
  222. void main()
  223. {
  224. k=2;
  225. restart();
  226. food();
  227. while(1)
  228. {                           
  229. check_D();
  230. display_next(D);
  231. display();
  232. }
  233. }
復(fù)制代碼




相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:238802 發(fā)表于 2017-10-20 08:19 | 顯示全部樓層
請(qǐng)問一下,51的腳本在實(shí)物連接中怎么處理?
回復(fù)

使用道具 舉報(bào)

ID:737919 發(fā)表于 2020-5-3 10:19 來自手機(jī) | 顯示全部樓層
你這個(gè)數(shù)他不隨機(jī)啊
回復(fù)

使用道具 舉報(bào)

ID:1125904 發(fā)表于 2024-6-18 21:33 | 顯示全部樓層
發(fā)表于 2020-5-3 10:19
你這個(gè)數(shù)他不隨機(jī)啊

怎么打開文件啊
回復(fù)

使用道具 舉報(bào)

ID:262 發(fā)表于 2024-6-18 22:30 | 顯示全部樓層
發(fā)表于 2024-6-18 21:33
怎么打開文件啊

百度下載Proteus7.8然后打開  dsn文件 即可
回復(fù)

使用道具 舉報(bào)

ID:612920 發(fā)表于 2024-10-8 18:49 | 顯示全部樓層
百度下載Proteus7.8然后打開  dsn文件 即可
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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