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

QQ登錄

只需一步,快速開始

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

單片機(jī)貪吃蛇小游戲制作 原理圖+程序+元件清單

  [復(fù)制鏈接]
ID:387592 發(fā)表于 2019-2-3 21:27 | 顯示全部樓層 |閱讀模式
內(nèi)含完整程序和元件清單等資料            

Altium Designer畫的電路原理圖如下:(51hei附件中可下載工程文件)

貪吃蛇PCB

貪吃蛇PCB
0.png

貪吃蛇元件清單
序號(hào)    元件    數(shù)量    備注
1    STC89C52    1   
2    IC座    4    40腳1個(gè),16腳2個(gè),20腳1個(gè)
3    按鍵    5   
4    自鎖開關(guān)    1   
5    晶振    1    12MHz
6    瓷片電容    5    33pF 2個(gè),104電容3個(gè)
7    電解電容    2    10uF/25V需 1個(gè),100uF/50V需1個(gè)
8    排阻    1    10K-9P(可用單個(gè)電阻代替,需8個(gè))
9    電阻    9    100歐8個(gè),10K需1個(gè)
10    八位數(shù)碼管    1    (可用四位,需2個(gè))
11    74HC245    1   
12    74HC595    1   
13    74LS138譯碼器    1   
14    8*8點(diǎn)陣    1   
15    萬能板    1    18*30CM
16    排針    4P   
17    CH340下載器    1    USB接口

單片機(jī)源程序如下:
  1. /**************************************************************************************
  2. *                                              貪吃蛇參考程序                                                                                        *
  3. 實(shí)現(xiàn)現(xiàn)象:下載程序后數(shù)碼管無顯示,按下獨(dú)立按鍵實(shí)現(xiàn)對(duì)應(yīng)的功能
  4.                         K1        :        向上
  5.                         K2        :        向下
  6.                         K3        :        向左
  7.                         K4        :        向右

  8. 注:       初始點(diǎn)陣顯示貪吃蛇(三個(gè)連續(xù)的點(diǎn)表示)在左上角向右移動(dòng),按下按鍵K1控制貪吃蛇向上移動(dòng);
  9.        按下K2控制貪吃蛇向下移動(dòng);按下K3控制貪吃蛇向左移動(dòng);按下K4控制貪吃蛇向右移動(dòng)。吃到食物后
  10.        等待2s會(huì)再次出現(xiàn)食物;食物出現(xiàn)后8S內(nèi)必須吃到食物,否則游戲結(jié)束,同時(shí)數(shù)碼管顯示得分。食物
  11.        出現(xiàn)后2s內(nèi)吃到食物得6分、4s秒內(nèi)吃到食物得4分、6s內(nèi)吃到食物得2分、8s內(nèi)吃到食物得1分。每吃
  12.        到一個(gè)食物貪吃蛇的速度會(huì)加快一次,加到一定的程度并且分?jǐn)?shù)小于100時(shí)會(huì)恢復(fù)初始速度、分?jǐn)?shù)大于
  13.        等與100小于200時(shí)速度恢復(fù)為初始速度的5/3倍、分?jǐn)?shù)大于400時(shí)速度幾乎不恢復(fù)!


  14.        部分端口未更改,端口配置需與實(shí)際電路相對(duì)應(yīng)
  15.        本程序僅供參考,未經(jīng)作者允許不可用于商業(yè)用途!

  16.         所使用開發(fā)板為普中科技單片機(jī)CH6800-ES V2.0開發(fā)板

  17. 作者:        魏        賽        東
  18. *                                                                                                                                                                  
  19. ***************************************************************************************/

  20. #include <reg52.h>
  21. #include <intrins.h>
  22. #define io0 P0
  23. #define io2 P1

  24. typedef unsigned int u1;
  25. typedef unsigned char u2;

  26. sbit ser=P2^4;                                                                                                        //輸入端
  27. sbit rclk=P2^5;                                                                                                        //保存所有輸出數(shù)據(jù)
  28. sbit srclk=P2^6;                                                                                                  //移位
  29. sbit k1=P3^1;
  30. sbit k2=P3^0;
  31. sbit k3=P3^2;
  32. sbit k4=P3^3;
  33. sbit LSC=P3^4;
  34. sbit LSB=P3^5;
  35. sbit LSA=P3^6;                                                                                            

  36. int k[3]={0,0,0},l[3]={0,1,2},m[2]={0,0},n[2]={1,2},j1=0;
  37. u1 code smg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  38. u2 act=4,a=0,time1=50;
  39. u1 a1,a2,scor=0;
  40. static u1 s30;
  41. static u1 ms2000;
  42. u2 code liexuan[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};        //用code不能重新賦值
  43. u2 heng[8][8]=  {
  44.                                 {0,0,0,0,0,0,0,0},
  45.                                 {0,0,0,0,0,0,0,0},
  46.                                 {0,0,0,0,0,0,0,0},
  47.                                 {0,0,0,0,0,0,0,0},
  48.                                 {0,0,0,0,0,0,0,0},
  49.                                 {0,0,0,0,0,0,0,0},
  50.                                 {0,0,0,0,0,0,0,0},
  51.                                 {0,0,0,0,0,0,0,0}
  52.                                 };                                               

  53. void delay(u1 i)
  54. {
  55.         while(i--);                                                                          
  56. }

  57. void Timer0Init()
  58. {
  59.         TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開啟動(dòng)。

  60.         TH0=0Xe0;        //給定時(shí)器賦初值,定時(shí)8ms
  61.         TL0=0Xc0;       
  62.         ET0=0;//關(guān)閉定時(shí)器0中斷允許
  63.         EA=1;//打開總中斷
  64.         TR0=1;//打開定時(shí)器                       
  65. }

  66. void Timer1Init()
  67. {
  68.         TMOD|=0X10;//選擇為定時(shí)器1模式,工作方式1,僅用TR1打開啟動(dòng)。

  69.         TH1=0XFC;        //給定時(shí)器賦初值,定時(shí)1ms
  70.         TL1=0X18;       
  71.         ET1=1;//打開定時(shí)器1中斷允許
  72.         EA=1;//打開總中斷
  73.         TR1=1;//打開定時(shí)器                       
  74. }

  75. void ank1()                                                                                         //橫選
  76. {
  77.         static u2 ank1_flag;
  78.         if(k1)
  79.                 ank1_flag = 1;                                                                                                  
  80.         if(!k1 && ank1_flag)
  81.         {
  82.                 delay(1000);
  83.                 if(!k1)
  84.                 {
  85.                         act=1;
  86.                         ank1_flag = 0;                                               
  87.                 }
  88.         }
  89. }

  90. void ank2()                                                                                         //列選
  91. {
  92.         static u2 ank2_flag;
  93.         if(k2)
  94.                 ank2_flag = 1;                                                                                                  
  95.         if(!k2 && ank2_flag)
  96.         {
  97.                 delay(1000);
  98.                 if(!k2)
  99.                 {
  100.                         act=2;
  101.                         ank2_flag = 0;
  102.                 }
  103.         }
  104. }

  105. void ank3()
  106. {
  107.         static u2 ank3_flag;
  108.         if(k3)
  109.                 ank3_flag = 1;                                                                                                  
  110.         if(!k3 && ank3_flag)
  111.         {
  112.                 delay(1000);
  113.                 if(!k3)
  114.                 {
  115.                         act=3;
  116.                         ank3_flag = 0;
  117.                 }
  118.         }
  119. }

  120. void ank4()                                                                                           //點(diǎn)陣亮滅
  121. {       
  122.         static u2 ank4_flag;
  123.         if(k4)
  124.                 ank4_flag = 1;                                                                                                  
  125.         if(!k4 && ank4_flag)
  126.         {
  127.                 delay(1000);
  128.                 if(!k4)
  129.                 {
  130.                         act=4;
  131.                         ank4_flag = 0;
  132.                 }
  133.         }
  134. }

  135. void fanzhuan()
  136. {
  137.         heng[l[0]][k[0]]=~heng[l[0]][k[0]];
  138.         heng[l[1]][k[1]]=~heng[l[1]][k[1]];
  139.         heng[l[2]][k[2]]=~heng[l[2]][k[2]];
  140. }

  141. void yidong(u2 x)
  142. {
  143.         switch(x)
  144.         {
  145.                 case 1: k[2]--;
  146.                                 if(k[2]==-1)
  147.                                         k[2]=7;break;
  148.                 case 2:        k[2]++;
  149.                                 if(k[2]==8)
  150.                                         k[2]=0;break;
  151.                 case 3:        l[2]--;
  152.                                 if(l[2]==-1)
  153.                                         l[2]=7;break;
  154.                 case 4:        l[2]++;
  155.                                 if(l[2]==8)
  156.                                         l[2]=0;break;
  157.         }
  158. }

  159. void dianzhen()
  160. {
  161.         u2 i,j,time;
  162.         fanzhuan();
  163.         for(time=0;time<time1;time++)
  164.         {
  165.                 ank1();ank2();ank3();ank4();
  166.                 for(i=0;i<8;i++)
  167.                 {
  168.                         srclk=0;
  169.                         rclk=0;
  170.                         for(j=0;j<8;j++)
  171.                         {
  172.                                 ser=heng[i][j];
  173.                                 srclk=1;
  174.                                 delay(2);
  175.                                 srclk=0;       
  176.                         }
  177.                         rclk=1;
  178.                         delay(2);
  179.                         rclk=0;
  180.                         io0=liexuan[i];
  181.                         delay(100);
  182.                         io0=0xff;
  183.                 }
  184.         }
  185.         fanzhuan();
  186.          
  187.         yidong(act);
  188.         k[1]=m[1];l[1]=n[1];
  189.         k[0]=m[0];l[0]=n[0];
  190.         m[1]=k[2];n[1]=l[2];
  191.         m[0]=k[1];n[0]=l[1];
  192.         if(k[2]==a1&&l[2]==a2&&j1)
  193.         {
  194.                 ET0=0;
  195.                 heng[a2][a1]=~heng[a2][a1];
  196.                 ET1=1;
  197.                 if(s30<250)
  198.                         scor+=6;
  199.                 else if(s30<500)
  200.                         scor+=4;
  201.                 else if(s30<750)
  202.                         scor+=2;
  203.                 else
  204.                         scor++;
  205.                 s30=0;
  206.                 TH0=0xe0;
  207.                 TL0=0xc0;
  208.                 if(time1>2)
  209.                         time1-=5;
  210.                 if(time1<5&&scor<100)
  211.                         time1=50;
  212.                 else if(time1<5&&scor<200)
  213.                         time1=30;
  214.                 else if(time1<5&&scor>400)
  215.                         time1=2;
  216.                 j1=0;
  217.         }
  218. }

  219. void main()
  220. {
  221.         Timer1Init();
  222.         Timer0Init();
  223.         while(1)
  224.         {
  225.                 dianzhen();       
  226.         }
  227. }

  228. void Timer1() interrupt 3
  229. {
  230.         TH1=0XFC;        //給定時(shí)器賦初值,定時(shí)1ms
  231.         TL1=0X18;
  232.         ms2000++;
  233.         a+=(l[2]+k[1]);
  234.         if((a%10)>7)
  235.                 a+=2;
  236.         if((a/10%10)>7)
  237.                 a+=20;
  238.         if(a>2000)
  239.         {
  240.                 a=l[1]+k[2];
  241.                 if(a%10>7)
  242.                         a-=2;
  243.         }
  244.         if(ms2000==2000)
  245.         {
  246.                 ms2000=0;
  247.                 a1=a%10;
  248.                 a2=a/10%10;
  249.                 if(a1==k[0]||a1==k[1]||a1==k[2])
  250.                         if(k[2]<5)
  251.                                 a1+=2;
  252.                         else
  253.                                 a1-=2;
  254.                 if(a2==l[0]||a2==l[1]||a2==l[2])
  255.                         if(l[2]<5)
  256.                                 a2+=2;
  257.                         else
  258. ……………………

  259. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
貪吃蛇小游戲.zip (51.52 KB, 下載次數(shù): 66)

評(píng)分

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

查看全部評(píng)分

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:491110 發(fā)表于 2019-3-14 22:17 | 顯示全部樓層
非常謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:511814 發(fā)表于 2019-4-14 13:54 | 顯示全部樓層
學(xué)到了
回復(fù)

使用道具 舉報(bào)

ID:479749 發(fā)表于 2019-4-22 19:56 | 顯示全部樓層
樓主能不能分享一下實(shí)物圖呀
回復(fù)

使用道具 舉報(bào)

ID:481163 發(fā)表于 2019-5-29 10:06 | 顯示全部樓層
在普中開發(fā)板上試了之后為什么不行呢
回復(fù)

使用道具 舉報(bào)

ID:481163 發(fā)表于 2019-6-11 22:14 | 顯示全部樓層
普中的這個(gè)開發(fā)板實(shí)現(xiàn)不了啊
回復(fù)

使用道具 舉報(bào)

ID:525687 發(fā)表于 2019-12-10 12:30 | 顯示全部樓層
這個(gè)有問題  大家都不要下載   我下載了  原理圖都有問題

回復(fù)

使用道具 舉報(bào)

ID:665725 發(fā)表于 2019-12-16 23:04 | 顯示全部樓層
非常感謝樓主分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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