找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1995|回复: 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 单片机教程网

快速回复 返回顶部 返回列表