久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11739|回復: 7
打印 上一主題 下一主題
收起左側(cè)

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

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:387592 發(fā)表于 2019-2-3 21:27 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
內(nèi)含完整程序和元件清單等資料            

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



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

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

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


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

  16.         所使用開發(fā)板為普中科技單片機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;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。

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

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

  69.         TH1=0XFC;        //給定時器賦初值,定時1ms
  70.         TL1=0X18;       
  71.         ET1=1;//打開定時器1中斷允許
  72.         EA=1;//打開總中斷
  73.         TR1=1;//打開定時器                       
  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()                                                                                           //點陣亮滅
  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;        //給定時器賦初值,定時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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:491110 發(fā)表于 2019-3-14 22:17 | 只看該作者
非常謝謝樓主分享
回復

使用道具 舉報

板凳
ID:511814 發(fā)表于 2019-4-14 13:54 | 只看該作者
學到了
回復

使用道具 舉報

地板
ID:479749 發(fā)表于 2019-4-22 19:56 | 只看該作者
樓主能不能分享一下實物圖呀
回復

使用道具 舉報

5#
ID:481163 發(fā)表于 2019-5-29 10:06 | 只看該作者
在普中開發(fā)板上試了之后為什么不行呢
回復

使用道具 舉報

6#
ID:481163 發(fā)表于 2019-6-11 22:14 | 只看該作者
普中的這個開發(fā)板實現(xiàn)不了啊
回復

使用道具 舉報

7#
ID:525687 發(fā)表于 2019-12-10 12:30 | 只看該作者
這個有問題  大家都不要下載   我下載了  原理圖都有問題

回復

使用道具 舉報

8#
ID:665725 發(fā)表于 2019-12-16 23:04 | 只看該作者
非常感謝樓主分享
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜免费在线观看 | 成人二区 | 伊人伊人伊人 | 成人av一区 | 久在线视频 | 欧美日韩国产精品 | 一区二区三区在线电影 | 午夜影院在线观看免费 | 日本一区二区三区在线观看 | 91精品国产91久久久久久吃药 | 日批的视频 | 国产精品揄拍一区二区久久国内亚洲精 | 中文字幕亚洲视频 | 亚洲视频 欧美视频 | 人成久久| 久久久一区二区三区四区 | 91视频进入 | 亚洲精品久久国产高清情趣图文 | 久久国产精品亚洲 | 国产高清在线 | 国产在线一区二区三区 | 精品国产一级 | 久久综合一区二区 | av一区二区三区四区 | 成人免费观看男女羞羞视频 | 精品久久久一区 | 久久伊| 欧洲视频一区 | 日日淫 | 女同videos另类| 免费看淫片| 欧美日韩国产精品一区 | 国产精品久久免费观看 | 99久久精品国产麻豆演员表 | 一区二区三区四区国产 | 国产成人在线免费 | 久久国产一区 | 在线色网址| 欧美日韩成人影院 | 欧美毛片免费观看 | 久久亚洲视频网 |