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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機貪食蛇源程序 帶proteus仿真

[復制鏈接]
跳轉到指定樓層
樓主
一個貪食蛇的程序,下面是仿真原理圖,以及程序運行效果:


貪食蛇的仿真工程文件和所有源碼下載:
貪吃蛇.rar (221.89 KB, 下載次數: 20)


部分源程序預覽:

  1. #include "t6963c.h"
  2. #include "at89x51.h"
  3. #include "MoveDeal.h"
  4. #include "160128_driver.h"
  5.                                                         /*+-----------------------+
  6.                                                           | 注意:晶振為22.1184MHz |
  7.                                                           +-----------------------+*/
  8. /*---------------------------------------------------------------*/
  9. //按鍵端口宏定義
  10. #define                         KEY_UP_MOVE                                P1_0                        //上移鍵端口
  11. #define                         KEY_LEFT_MOVE                        P1_1                        //左移鍵端口
  12. #define                         KEY_RIGHT_MOVE                        P1_2                        //右移鍵端口
  13. #define                         KEY_DOWN_MOVE                        P1_3                        //下移鍵端口
  14. #define                         KEY_OK                                        P1_4                        //確定鍵端口
  15. #define                         KEY_SPEED_MOVE                        P3_2                        //加速鍵端口
  16. #define                         KEY_CUSTOMS                                P3_3                        //選關鍵端口
  17. #define                         KEY_RESTORAL                        P3_4                        //復位鍵端口
  18. /*----------------------------------------------------------------------------*/
  19. //全局變量定義
  20. //游戲速度,初始值為GRADE_1(1秒移動一次蛇頭)
  21. unsigned char           m_Speed = GRADE_1;
  22. //更新顯示標志,當m_Flag為1時要刷新界面
  23. bit                                 m_Flag = 0;
  24. //更新時間標志,當m_TimeFlag為1時要刷新時間
  25. bit                                 m_TimeFlag = 0;
  26. //選關按鈕是否被按下標志位
  27. bit                                 m_IsChoose = 0;
  28. //時間變量
  29. unsigned int            m_Time = 0;
  30. //蛇頭運動方向,初始值為MOVE_DOWN(默認向下運動)
  31. unsigned char                 m_MoveState = MOVE_DOWN;
  32. /*----------------------------------------------------------------------------*/
  33. //延時10ms子程序(為鍵盤消抖服務)
  34. void Delay_10ms()
  35. {
  36.         unsigned char a, b, c;
  37.         for (a = 0; a < 10;  a++)
  38.         for (b = 0; b < 3;   b++)
  39.         for (c = 0; c < 220; c++);
  40. }

  41. /*----------------------------------------------------------------------------*/
  42. /*清除字符函數*/
  43. void ClearChar()                                       
  44. {
  45.         Set_xy(7,9);
  46.         Write_8_Data(0,NOC_WR);//G
  47.         Set_xy(7,10);
  48.         Write_8_Data(0,NOC_WR);//A
  49.         Set_xy(7,11);
  50.         Write_8_Data(0,NOC_WR);//M
  51.         Set_xy(7,12);
  52.         Write_8_Data(0,NOC_WR);//E

  53.         Set_xy(7,15);
  54.         Write_8_Data(0,NOC_WR);//O
  55.         Set_xy(7,16);
  56.         Write_8_Data(0,NOC_WR);//V
  57.         Set_xy(7,17);
  58.         Write_8_Data(0,NOC_WR);//E
  59.         Set_xy(7,18);
  60.         Write_8_Data(0,NOC_WR);//R
  61. }
  62. /*----------------------------------------------------------------------------*/
  63. //游戲結束或復位時的while循環
  64. void Loop()
  65. {
  66.         while (1)                                                                                /*判斷確定建是否按下,屏蔽其他鍵的功能*/
  67.     {
  68.             if (!KEY_OK)
  69.             {
  70.                  Delay_10ms();
  71.                  if(!KEY_OK)
  72.                      while(!KEY_OK);                                                        /*等待確定鍵被按下*/
  73.                         m_Time = 0;                                                                /*初始時間*/
  74.                         ClearChar();                                                        /*清除字符*/
  75.                         RandFood();                                                                /*隨機食物生成*/
  76.                         break;
  77.                 }
  78.         }
  79. }
  80. /*-----------------------------主程序開始---------------------------------*/
  81. void main()                                                                                       
  82. {
  83.         TMOD = 0x01;                                                                        /*定時器設置(只用到了定時器1)*/
  84.     InitializeSeries();                             /*串口初始化*/
  85.         TH0 = 0x4C;TL0 = 0x00;                                                        /*定時器0初始值設定(25ms中斷一次)*/
  86.         EA = TR0 = 1;                                                                        /*開啟定時器0定時*/
  87.         Init_disply(0);                                                                        /*初始化開機界面顯示*/

  88.     SendString("Relive childhood popularity.");          /*虛擬終端顯示*/
  89.     SendString("Challenge the limits of intellectual.");
  90.     SendString("GreedySnaker based on single-chip design.\r");
  91.     SendString("Game instructions:");
  92.     SendString("[0] key is Choice_Customs.");
  93.     SendString("[1] key is Left_Move.");
  94.     SendString("[2] key is Down_Move.");
  95.     SendString("[3] key is Right_Move.");   
  96.     SendString("[5] key is On_Move.");   
  97.     SendString("[Enter] key is pause.");  
  98.     SendString("[SpaceBar] key is SpeedUp_Move.");

  99.         while(1)                                                                                /*判斷確定建是否按下,屏蔽其他鍵的功能*/
  100.     {
  101.             if(!KEY_OK)
  102.             {
  103.                  Delay_10ms();
  104.                  if(!KEY_OK)
  105.                      while(!KEY_OK);
  106.                         break;
  107.                 }
  108.         }
  109.         Circle(63, 79, 60, 0);                                                        /*清除圓*/
  110.         Clear_LCD();                                                                        /*清屏顯示*/
  111.         Line(63, 0, 63, 127, 1);                                                /*畫分隔線*/
  112.         InitStruct();                                                                        /*初始化結構體數組*/
  113.         Init_disply(1);                                                                        /*初始化游戲開始界面顯示*/
  114.         RandFood();                                                                                /*隨機食物生成*/
  115.         ET0=1;                                                                                        /*開啟定時器0中斷*/
  116.         while(1)                                                                                /*進入主循環,鍵盤掃描開始,響應按鍵事件*/
  117.         {
  118.                 if(!KEY_LEFT_MOVE)                                                        /*響應向左運動事件*/
  119.                   {
  120.                       Delay_10ms();
  121.                       if(!KEY_LEFT_MOVE)
  122.                  {
  123.                              while(!KEY_LEFT_MOVE);
  124.                                 if (m_MoveState != MOVE_RIGHT)                /*如果蛇頭運動方向向右,直接跳過*/
  125.                                 m_MoveState = MOVE_LEFT;                        /*刷新蛇頭運動方向(向左)*/
  126.                  }
  127.                   }

  128.                 if(!KEY_RIGHT_MOVE)                                                        /*響應向右運動事件*/
  129.                   {
  130.                       Delay_10ms();
  131.                       if(!KEY_RIGHT_MOVE)
  132.                  {
  133.                              while(!KEY_RIGHT_MOVE);
  134.                                 if (m_MoveState != MOVE_LEFT)                /*如果蛇頭運動方向向左,直接跳過*/
  135.                                 m_MoveState = MOVE_RIGHT;                        /*刷新蛇頭運動方向(向右)*/
  136.                  }
  137.                   }

  138.                 if(!KEY_UP_MOVE)                                                        /*響應向上運動事件*/
  139.                   {
  140.                       Delay_10ms();
  141.                       if(!KEY_UP_MOVE)
  142.                  {
  143.                              while(!KEY_UP_MOVE);
  144.                                 if (m_MoveState != MOVE_DOWN)                /*如果蛇頭運動方向向下,直接跳過*/
  145.                          m_MoveState = MOVE_UP;                                /*刷新蛇頭運動方向(向上)*/
  146.                  }
  147.                   }

  148.                 if (!KEY_DOWN_MOVE)                                                        /*響應向下運動事件*/
  149.                   {
  150.                       Delay_10ms();
  151.                       if (!KEY_DOWN_MOVE)
  152.                  {
  153.                              while (!KEY_DOWN_MOVE);
  154.                                 if (m_MoveState != MOVE_UP)                        /*如果蛇頭運動方向向上,直接跳過*/
  155.                                 m_MoveState = MOVE_DOWN;                        /*刷新蛇頭運動方向(向下)*/
  156.                  }
  157.                   }

  158.                 if(!KEY_CUSTOMS)                                                        /*響應選關事件*/
  159.                   {
  160.                       Delay_10ms();
  161.                       if(!KEY_CUSTOMS)
  162.                  {
  163.                              while(!KEY_CUSTOMS);
  164.                                 TR0 = 0;
  165.                                 m_IsChoose = 1;
  166.                          Choice_Customs();                                       
  167.                  }
  168.                   }
  169. /*******************為選關服務*********************/
  170. /**/        if(!KEY_OK && m_IsChoose)                                /**/
  171. /**/        {                                                                                /**/
  172. /**/             Delay_10ms();                                                /**/
  173. /**/               if(!KEY_OK)                                                        /**/
  174. /**/            while(!KEY_OK);                                                /**/
  175. /**/                m_IsChoose = 0;                                                /**/
  176. /**/                TR0 = 1;                                                                /**/
  177. /**/        }//只有選關后確定鍵才有效                                /**/
  178. /**************************************************/
  179.                 if(!KEY_RESTORAL)                                                        /*響應復位事件*/
  180.                   {
  181.                       Delay_10ms();
  182.                       if(!KEY_RESTORAL)
  183.                  {
  184.                              while(!KEY_RESTORAL);
  185.                                 Restoral();                                                        /*游戲復位處理*/
  186.                  }
  187.                   }

  188.                 if(!KEY_SPEED_MOVE)                                                        /*響應加速事件*/
  189.                   {
  190.                       Delay_10ms();
  191.                       if(!KEY_SPEED_MOVE)
  192.                  {
  193.                                 TR0 = 0;
  194.                              while(!KEY_SPEED_MOVE)
  195.                                 {
  196.                                         MoveProcess();                                        /*一直調用移動處理*/
  197.                                         Delay_100ms();                                        /*延時100毫秒,也就是加速速度*/
  198.                                 }
  199.                                 TR0 = 1;                                                                                               
  200.                  }
  201.                   }

  202.                 if (m_Flag)                                                                        /*響應正常的移動事件*/
  203.                 {
  204.                         m_Flag = 0;
  205.                         MoveProcess();                                                        /*移動處理*/
  206.                 }

  207.                 if (m_TimeFlag)                                                                /*刷新時間顯示*/
  208.                 {
  209.                         m_TimeFlag = 0;
  210.                         TimeDisplay();
  211.                 }

  212.         Terminal();                                 /*響應鍵盤消息*/
  213.           }
  214. }
  215. /*---------------------------主程序結束-----------------------------------*/

  216. //定時器0控制方塊下移速度及時間程序
  217. void Time_0_Int() interrupt 1 using 1
  218. {
  219.         static unsigned char Speed = 0;
  220.         static unsigned char Time = 0;
  221.         TH0 = 0x4C; TL0 = 0x00;
  222.         Speed++;
  223.         Time++;
  224.         if (Time >= 40)
  225.         {
  226.                 Time = 0;
  227.                 m_Time++;
  228.                 m_TimeFlag = 1;
  229.         }
  230.         if (Speed >= m_Speed)
  231.         {
  232.                 Speed = 0;
  233.                 m_Flag = 1;
  234.         }
  235. }

復制代碼


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

使用道具 舉報

沙發
ID:1 發表于 2017-1-7 00:16 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品亚洲精品国产欧美 | 高清一区二区 | 精品国产一区一区二区三亚瑟 | 国产成人精品一区二区三区网站观看 | 国产成人精品一区二区三区在线 | 日韩三区 | 欧美性久久久 | 九九爱这里只有精品 | 亚洲精品久久久久中文字幕欢迎你 | 久久久久久亚洲精品不卡 | 国产一区二区三区免费 | 亚洲精选一区二区 | 一区二区中文字幕 | www.婷婷 | 亚洲欧美一区二区三区国产精品 | 日韩三区在线 | 天天操天天怕 | 天天操天天拍 | 日本三级网 | 国产精品视频免费看 | 精品日韩 | 欧美精品国产一区二区 | 精品国产一区二区三区久久狼黑人 | 日韩黄色免费 | 亚洲国产视频一区 | 天天天天操 | 在线视频a | 成人精品久久日伦片大全免费 | 欧美日一区 | www国产成人免费观看视频,深夜成人网 | 国产精品久久久久久福利一牛影视 | 国产在线不卡视频 | 日韩成人在线视频 | 国产精品成人一区二区三区夜夜夜 | 国产精品久久久久久妇女 | 欧美男人亚洲天堂 | 中文字幕精品一区二区三区精品 | 久久精品青青大伊人av | 欧美亚洲国产一区二区三区 | 精品视频免费 | 九九av|