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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5203|回復: 8
打印 上一主題 下一主題
收起左側

51單片機8*8點陣做貪吃蛇游戲代碼

[復制鏈接]
跳轉到指定樓層
樓主
51單片機8*8點陣做貪吃蛇游戲,這個蛇所吃的食物是完全隨機的!注意!不是偽隨機數,是完全隨機的。注意::我是用搖桿控制蛇的移動!





開始我是用摁鍵來控制的,都可以,只需改一小部分就行了!
在原程序里我保留了一點摁鍵的程序,實在不知道可以問我(評論就行了,看見了就會回復的。
大家應該都會建多文件格式吧……就是  .c    .h  這樣的(不會可以問我)
大概如下:








我的這個程序(貪吃蛇)里有4個文件。




我再說一遍哈!我是用搖桿控制蛇的,所以我采用12芯片。這個程序可以改成用摁鍵來控制(用摁鍵控制的話就用51就行了,兩芯片相差不大,程序只用改一點!。
就這樣吧,有問題盡管問吧。!

全部資料51hei下載地址:
貪吃蛇.rar (4.43 KB, 下載次數: 35)

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:290266 發表于 2019-4-29 16:22 | 只看該作者
樓主的代碼:
  1. #include "reg52.h"
  2. #include "stdlib.h"
  3. #include "intrins.h"
  4. #include "12.h"
  5. typedef unsigned char u8;
  6. typedef unsigned int u16;       
  7. //*******函數聲明***********//
  8. void T0_Init(void);          // 定時器初始化函數
  9. void snake_Move(void);       // 蛇前行函數
  10. void delay(u16 i);
  11.            // 軟件延時函數,不精確
  12. void creatFood();            // 創建食物
  13. void snake_Grow(void);       // 蛇成長函數
  14. void Send_Byte(u8 dat);  // 595發送數據函數
  15. void JudgeDeath(void);       // 判斷是否死亡函數
  16. void TurnDirection(void);
  17. // 改變方向函數
  18. /*sbit UP = P3 ^ 1;
  19. sbit DOWN = P3 ^ 0;   
  20. sbit LEFT = P3 ^ 2;
  21. sbit RIGHT = P3 ^ 3;*/
  22. sbit LEDARRAY_LAT = P3^6;
  23. sbit LEDARRAY_CLK = P3^5;
  24. sbit LEDARRAY_DI = P3^4;
  25. sbit sw=P1^2;
  26. u16 i,j,n,temp,w,heng,shu;
  27. unsigned char code Display_word[5][8] = {
  28. 0x0C,0x1E,0x3E,0x7C,0x7C,0x3E,0x1E,0x0C, //心
  29. 0x18,0x3C,0x7C,0xF8,0xF8,0x7C,0x3C,0x18,//心
  30. 0x00,0x44,0x86,0x92,0x92,0x9E,0x6C,0x00,//3
  31. 0x00,0xC4,0xC6,0xA2,0xA2,0x92,0x8C,0x00,//2
  32. 0x00,0x80,0x82,0xFF,0xFF,0x80,0x80,0x00,//1
  33. };

  34. //畫桃心的碼表
  35. unsigned char code Display_xin[16][8] = {
  36. 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,//未命名文件0
  37. 0x00,0x00,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
  38. 0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
  39. 0x04,0x02,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
  40. 0x0C,0x02,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
  41. 0x0C,0x12,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
  42. 0x0C,0x12,0x22,0x04,0x00,0x00,0x00,0x00,//未命名文件0
  43. 0x0C,0x12,0x22,0x44,0x00,0x00,0x00,0x00,//未命名文件0
  44. 0x0C,0x12,0x22,0x44,0x40,0x00,0x00,0x00,//未命名文件0
  45. 0x0C,0x12,0x22,0x44,0x40,0x20,0x00,0x00,//未命名文件0
  46. 0x0C,0x12,0x22,0x44,0x40,0x20,0x10,0x00,//未命名文件0
  47. 0x0C,0x12,0x22,0x44,0x40,0x20,0x10,0x08,//未命名文件0
  48. 0x0C,0x12,0x22,0x44,0x40,0x20,0x10,0x0C,//未命名文件0
  49. 0x0C,0x12,0x22,0x44,0x40,0x20,0x12,0x0C,//未命名文件0
  50. 0x0C,0x12,0x22,0x44,0x40,0x22,0x12,0x0C,//未命名文件0
  51. 0x0C,0x12,0x22,0x44,0x44,0x22,0x12,0x0C,//未命名文件0
  52. };
  53. u8 count;        // 移動速度
  54. u8 foodx,foody;  // 食物坐標
  55. u8 snake_Len=4;  // 蛇的總長度
  56. u8 direction=1;
  57. // 蛇的移動方向  1, 向上;2, 向下;3, 向左; 4, 向右
  58. // 設置開發板上8*8點陣 右下角為坐標原點
  59. // 向上為Y軸,向左為X軸
  60. u8 code Hc595_Coordx[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  61. // 0111 1111
  62. u8 code Hc595_Coordy[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  63. // 1000 0000
  64. ///////////////////////////////////////////////////////////
  65. // 51內核單片機內存較小,蛇的總長度暫定最大40
  66. // 可予以忽略,重點是效果
  67. // 初始化蛇長為4,如下數組中定義
  68. u8 snake_Coordx[40]= {1, 1, 1, 1}; // 蛇的每一點的橫坐標
  69. u8 snake_Coordy[40]= {3, 2, 1, 0}; // 蛇的每一點的縱坐標

  70. /*******************************************************************************
  71. * 函 數 名      : T0_Init(void)
  72. * 函數功能                  : 定時器T0初始化函數
  73. * 輸    入      : None
  74. * 輸    出      : None
  75. * 相關說明                        :None
  76. *******************************************************************************/
  77. void T0_Init(void)
  78. {
  79.     TMOD = 0X01;
  80.     TL0 = (65535-50000)%256;
  81.     TH0 = (65535-50000)/256;
  82.     ET0 = 1;
  83.     TR0 = 1;
  84.     EA = 1;
  85. }

  86. /*******************************************************************************
  87. * 函 數 名      : interrupt_T0(void)
  88. * 函數功能                  : 定時器T0中斷服務函數
  89. * 輸    入      : None
  90. * 輸    出      : None
  91. * 相關說明                        :None
  92. *******************************************************************************/
  93. void interrupt_T0() interrupt 1
  94. {

  95.     TL0 = (65535-50000)%256;  // 50ms定時
  96.     TH0 = (65535-50000)/256;
  97.     count++;
  98.     if(count == 15)  //15
  99.     {
  100.         count = 0;
  101.         snake_Move();
  102.     }
  103. }

  104. /*******************************************************************************
  105. * 函 數 名      : delay(u16 i)
  106. * 函數功能                  : 軟件延時函數
  107. * 輸    入      : u16 i
  108. * 輸    出      : None
  109. * 相關說明                        :軟件延時,不精確
  110. *******************************************************************************/
  111. void delay (u16 i)
  112. {
  113.     while(i--);
  114. }

  115. void Send_Byte(u8 dat)
  116. {
  117.         unsigned char i;
  118.         LEDARRAY_CLK = 0;
  119.         _nop_();       
  120.         LEDARRAY_LAT = 0;
  121.         _nop_();

  122.         for( i = 0 ; i < 8 ; i++ )
  123.         {
  124.                 if( dat&0x01 )
  125.                 {
  126.                         LEDARRAY_DI = 1;       
  127.                 }
  128.                 else
  129.                 {
  130.                         LEDARRAY_DI = 0;
  131.                 }
  132.                
  133.                 LEDARRAY_CLK = 1;                                //上升沿發送數據
  134.                 //                                _nop_();
  135.                 LEDARRAY_CLK = 0;
  136.                 //                                _nop_();
  137.                                
  138.                 dat >>= 1;                       
  139.         }               
  140. }



  141.        
  142. void xin(void)
  143. {
  144.        
  145.         for(j = 0 ; j < 16 ; j++)
  146.         {
  147.                 for(i = 0 ; i < 10 ; i++)
  148.                 {
  149.                         temp = 0x7f;
  150.                         for(w = 0 ; w < 8 ; w++)                //一個字母8BYTE
  151.                         {
  152.                                 Send_Byte(temp);                        //列選擇
  153.                                 Send_Byte(Display_xin[j][w]);                        //行數據
  154.                                 LEDARRAY_LAT = 1;                                        //鎖存數據
  155.                                 _nop_();
  156.                                 LEDARRAY_LAT = 0;
  157.                                 _nop_();
  158.                                 temp = (temp>>1)|0x80;
  159.                         }
  160.                 }
  161.         }
  162. while(1)
  163.         {
  164.                 //H心
  165.                 for(i = 0 ; i < 900 ; i++)
  166.                 {
  167.                         temp = 0x7f;
  168.                         for(w = 0 ; w < 8 ; w++)                //一個字母8BYTE
  169.                         {
  170.                                 Send_Byte(temp);                        //列選擇
  171.                                 Send_Byte(Display_word[0][w]);                        //行數據
  172.                                 LEDARRAY_LAT = 1;                                        //鎖存數據
  173.                                 _nop_();
  174.                        
  175.                                 LEDARRAY_LAT = 0;
  176.                                 _nop_();
  177.                                 temp = (temp>>1)|0x80;
  178.                         }
  179.                 }
  180.                 //L心
  181.                 for(i = 0 ; i < 400 ; i++)
  182.                 {
  183.                         temp = 0x7f;
  184.                         for(w = 0 ; w < 8 ; w++)                //一個字母8BYTE
  185.                         {
  186.                                 Send_Byte(temp);                        //列選擇
  187.                                 Send_Byte(Display_word[1][w]);                        //行數據
  188.                                 LEDARRAY_LAT = 1;                                        //鎖存數據
  189.                                 _nop_();
  190.                        
  191.                                 LEDARRAY_LAT = 0;
  192.                                 _nop_();
  193.                                 temp = (temp>>1)|0x80;
  194.                         }
  195.                 }
  196.                                                        
  197.         }}
  198. /*******************************************************************************
  199. * 函 數 名      : snake_Move(void)
  200. * 函數功能                  : 蛇前進函數
  201. * 輸    入      : None
  202. * 輸    出      : None
  203. * 相關說明                        :None
  204. *******************************************************************************/
  205. void snake_Move(void)
  206. {
  207.     u8 len = snake_Len - 1;
  208.     for(len; len > 0; len--)
  209.     {
  210.         snake_Coordx[len] = snake_Coordx[len - 1];
  211.         snake_Coordy[len] = snake_Coordy[len - 1];
  212.     }
  213.     switch(direction)
  214.     {
  215.     case 1:
  216.         snake_Coordy[0]++;
  217.         break;
  218.     case 2:
  219.         snake_Coordy[0]--;
  220.         break;
  221.     case 3:
  222.         snake_Coordx[0]++;
  223.         break;
  224.     case 4:
  225.         snake_Coordx[0]--;
  226.         break;
  227.     default:
  228.         break;
  229.     }
  230. }

  231. /*******************************************************************************
  232. * 函 數 名      : Hc595SendByte(u8 dat)
  233. * 函數功能                  : 74HC595發送數據函數
  234. * 輸    入      : dat 8位數據
  235. * 輸    出      : None
  236. * 相關說明                        :None
  237. *******************************************************************************/


  238. void Clear_LEDmatrix()
  239. {               
  240.         char i,temp;
  241.         temp = 0x7f;
  242.         for(i = 0 ; i < 8 ; i++)                //一個字母8BYTE
  243.         {
  244.                 Send_Byte(temp);                        //列選擇
  245.                 Send_Byte(0);                        //行數據
  246.                 LEDARRAY_LAT = 1;                                        //鎖存數據
  247.                 _nop_();
  248.        
  249.                 LEDARRAY_LAT = 0;
  250.                 _nop_();
  251.                 temp = (temp>>1)|0x80;
  252.         }       
  253. }
  254. /*******************************************************************************
  255. * 函 數 名      : creatFood()
  256. * 函數功能                  : 創建食物函數
  257. * 輸    入      : None
  258. * 輸    出      : None
  259. * 相關說明                        :None
  260. *******************************************************************************/
  261. void creatFood()
  262. {
  263.     u8 i;
  264.     foodx=rand()%8;
  265.     foody=rand()%8;
  266.        
  267.        
  268.        
  269.     for(i=0; i<snake_Len; i++)
  270.     {
  271.         if((foodx==snake_Coordx[i])&&(foody==snake_Coordy[i]))
  272.                                 {
  273.                                     creatFood();
  274.                                 }      
  275.     }
  276. }

  277. /*******************************************************************************
  278. * 函 數 名      : JudgeDeath()
  279. * 函數功能                  : 判斷死亡函數
  280. * 輸    入      : None
  281. * 輸    出      : None
  282. * 相關說明                        :None
  283. *******************************************************************************/
  284. void JudgeDeath(void)
  285. {
  286.     u8 i;

  287.     // 判斷蛇撞墻死亡
  288.     if((snake_Coordx[0]>7)||(snake_Coordy[0]>7))
  289.     {
  290.         xin();
  291.     }

  292.     // 判斷蛇撞到自身死亡
  293.     for(i=4; i<snake_Len; i++)
  294.     {
  295.         if((snake_Coordx[0]==snake_Coordx[i])&&(snake_Coordy[0]==snake_Coordy[i]))
  296.         {
  297.             xin();
  298.         }
  299.     }
  300. }

  301. /*******************************************************************************
  302. * 函 數 名      : void TurnDirection(void)
  303. * 函數功能                  : 方向改變函數
  304. * 輸    入      : None
  305. * 輸    出      : None
  306. * 相關說明                        :None
  307. *******************************************************************************/
  308. void TurnDirection(void)
  309. {
  310.                    initadc();
  311.                 //inituart();
  312.                 heng=getadcresult(0);
  313.                 shu=getadcresult(1);
  314.         if(shu<70)
  315.         {
  316.             if(direction==3||direction==4)
  317.             {
  318.                 direction=2;
  319.             }
  320.         }
  321.    
  322.    
  323.         if(shu>225)
  324.         {
  325.             if(direction==3||direction==4)
  326.             {
  327.                 direction=1;
  328.             }
  329.         }
  330.    
  331.    
  332.         if(heng>225)
  333.         {
  334.             if(direction==1||direction==2)
  335.             {
  336.                 direction=3;
  337.             }
  338.         }
  339.    
  340.    
  341.         if(heng<70)
  342.         {
  343.             if(direction==1||direction==2)
  344.             {
  345.                 direction=4;
  346.             }
  347.         }
  348.    
  349. }

  350. /*******************************************************************************
  351. * 函 數 名      : void snake_Grow(void)
  352. * 函數功能                  : 蛇成長函數
  353. * 輸    入      : None
  354. * 輸    出      : None
  355. * 相關說明                        :None
  356. *******************************************************************************/
  357. void snake_Grow(void)
  358. {
  359.     if(snake_Coordx[0] == foodx && snake_Coordy[0] == foody)
  360.     {
  361.         creatFood();
  362.         snake_Coordx[snake_Len] = snake_Coordx[snake_Len - 1];
  363.         snake_Coordy[snake_Len] = snake_Coordy[snake_Len - 1];
  364.         snake_Len++;
  365.     }
  366. }







  367.        


  368. /*******************************************************************************
  369. * 函 數 名      : main(void)
  370. * 函數功能                  : 主程序
  371. * 輸    入      : None
  372. * 輸    出      : None
  373. * 相關說明                        :None
  374. *******************************************************************************/
  375. void main()
  376. {
  377.     u16 q,k;
  378.         Clear_LEDmatrix();
  379. for(q = 0 ; q < 2000 ; q++)
  380.         {
  381.                 temp = 0x7f;
  382.                 for(k = 0 ; k < 8 ; k++)                //一個字母8BYTE
  383.                 {
  384.                         Send_Byte(temp);                        //列選擇
  385.                         Send_Byte(Display_word[2][k]);                        //行數據
  386.                         LEDARRAY_LAT = 1;                                        //鎖存數據
  387.                         _nop_();
  388.                
  389.                         LEDARRAY_LAT = 0;
  390.                         _nop_();
  391.                         temp = (temp>>1)|0x80;
  392.                 }
  393.         }
  394.                 //2
  395.         for(q = 0 ; q < 2000 ; q++)
  396.         {
  397.                 temp = 0x7f;
  398.                 for(k = 0 ; k < 8 ; k++)                //一個字母8BYTE
  399.                 {
  400.                         Send_Byte(temp);                        //列選擇
  401.                         Send_Byte(Display_word[3][k]);                        //行數據
  402.                         LEDARRAY_LAT = 1;                                        //鎖存數據
  403.                         _nop_();
  404.                
  405.                         LEDARRAY_LAT = 0;
  406.                         _nop_();
  407.                         temp = (temp>>1)|0x80;
  408.                 }
  409.         }
  410.                 //1
  411.         for(q = 0 ; q < 2000 ; q++)
  412.         {
  413.                 temp = 0x7f;
  414.                 for(k = 0 ; k < 8 ; k++)                //一個字母8BYTE
  415.                 {
  416.                         Send_Byte(temp);                        //列選擇
  417.                         Send_Byte(Display_word[4][k]);                        //行數據
  418.                         LEDARRAY_LAT = 1;                                        //鎖存數據
  419.                         _nop_();
  420.                
  421.                         LEDARRAY_LAT = 0;
  422.                         _nop_();
  423.                         temp = (temp>>1)|0x80;
  424.                 }
  425.         }

  426.         Clear_LEDmatrix();
  427.     T0_Init();
  428.     creatFood();
  429. while(1)
  430. {

  431.         if(sw==0)
  432.         {
  433.         for(i=10;i>0;i--)
  434.         for(j=110;j>0;j--);
  435.         if(sw==0)
  436.         TR0=~TR0;
  437.         while(!sw);
  438.         }

  439.         for(i=0; i<snake_Len; i++)
  440.         {
  441.             // 在點陣屏幕上顯示蛇的位置
  442.                     Send_Byte(Hc595_Coordx[snake_Coordx[i]]);
  443.                     Send_Byte(Hc595_Coordy[snake_Coordy[i]]);
  444.                                 LEDARRAY_LAT = 1;                                        //鎖存數據
  445.                         _nop_();
  446.                
  447.                         LEDARRAY_LAT = 0;
  448.                         _nop_();
  449.                 }
  450.             delay(20);            
  451.                    Send_Byte(Hc595_Coordx[foodx]);
  452.             Send_Byte(Hc595_Coordy[foody]);
  453.                         LEDARRAY_LAT = 1;                                        //鎖存數據
  454.                         _nop_();
  455.                
  456.                         LEDARRAY_LAT = 0;
  457.                         _nop_();
  458.             delay(20);            
  459.          
  460.          
  461.         
  462.         TurnDirection();  // 是否改變方向
  463.         JudgeDeath();     // 判斷是否死亡
  464.         snake_Grow();     // 判斷是否成長

  465.     }
  466. }
復制代碼
回復

使用道具 舉報

板凳
ID:500421 發表于 2019-4-29 21:34 | 只看該作者
大家有問題可以問哈!
回復

使用道具 舉報

地板
ID:500421 發表于 2019-5-1 08:53 | 只看該作者
那個oledmain.h是我不小心加進去的。。。。。
大家可以把那個刪了。
回復

使用道具 舉報

5#
ID:526100 發表于 2019-5-4 15:13 | 只看該作者
可以給我一下按鍵的代碼嗎?我不知道這么改
回復

使用道具 舉報

6#
ID:526100 發表于 2019-5-4 15:27 | 只看該作者
怎么才能修改成按鍵控制的?
回復

使用道具 舉報

7#
ID:526100 發表于 2019-5-4 15:33 | 只看該作者
怎么修改成按鍵控制?
回復

使用道具 舉報

8#
ID:500421 發表于 2019-5-5 14:05 | 只看該作者
wyl004 發表于 2019-5-4 15:33
怎么修改成按鍵控制?

你現在有沒有建成多文件格式.c  .h這樣的, 先把TurnDirection函數中heng=getadcresult(0);
                shu=getadcresult(1);去掉,再把4個if改成摁鍵的模式(if(key1=0))這樣的。
然后把有關12芯片的函數,定義刪了就行了,就像getadcresult函數。
回復

使用道具 舉報

9#
ID:526100 發表于 2019-5-18 11:37 | 只看該作者
可以給我一份完整的代碼嗎?我改了幾次不成功,謝謝!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av在线一区二区三区 | 蜜桃在线视频 | 羞羞视频免费在线 | av免费成人 | 国产一区二区免费电影 | 成人在线观看网站 | 亚洲一级av毛片 | 中国美女撒尿txxxxx视频 | 在线欧美亚洲 | 日本三级全黄三级a | 国产亚洲一区二区三区在线观看 | 精品久久久久国产免费第一页 | 亚洲网址在线观看 | 日韩欧美视频在线 | 精品久久久久久久久久久久 | 尤物视频在线免费观看 | 户外露出一区二区三区 | 久久成人亚洲 | 中文在线а√在线8 | 综合久久久 | 久久综合成人精品亚洲另类欧美 | 亚洲黄色网址视频 | 日本黄色的视频 | 99tv成人影院 | 91精品中文字幕一区二区三区 | 亚洲精品乱码久久久久久9色 | 久久精品色欧美aⅴ一区二区 | 国产小u女发育末成年 | 亚洲毛片在线观看 | 精品欧美一区二区精品久久 | 日韩在线观看网站 | 青娱乐av | 亚洲精品一区二三区不卡 | 亚洲欧美在线观看 | 日韩在线视频免费观看 | 国产在线观看一区二区三区 | 亚洲三级在线观看 | 久久综合久久综合久久综合 | 成人福利在线 | 97人人澡人人爽91综合色 | 99精品在线 |