找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10456|回复: 7
打印 上一主题 下一主题
收起左侧

单片机贪吃蛇小游戏制作 原理图+程序+元件清单

  [复制链接]
跳转到指定楼层
楼主
内含完整程序和元件清单等资料            

Altium Designer画的电路原理图如下:(51hei附件中可下载工程文件)



贪吃蛇元件清单
序号    元件    数量    备注
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    八位数码管    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. 实现现象:下载程序后数码管无显示,按下独立按键实现对应的功能
  4.                         K1        :        向上
  5.                         K2        :        向下
  6.                         K3        :        向左
  7.                         K4        :        向右

  8. 注:       初始点阵显示贪吃蛇(三个连续的点表示)在左上角向右移动,按下按键K1控制贪吃蛇向上移动;
  9.        按下K2控制贪吃蛇向下移动;按下K3控制贪吃蛇向左移动;按下K4控制贪吃蛇向右移动。吃到食物后
  10.        等待2s会再次出现食物;食物出现后8S内必须吃到食物,否则游戏结束,同时数码管显示得分。食物
  11.        出现后2s内吃到食物得6分、4s秒内吃到食物得4分、6s内吃到食物得2分、8s内吃到食物得1分。每吃
  12.        到一个食物贪吃蛇的速度会加快一次,加到一定的程度并且分数小于100时会恢复初始速度、分数大于
  13.        等与100小于200时速度恢复为初始速度的5/3倍、分数大于400时速度几乎不恢复!


  14.        部分端口未更改,端口配置需与实际电路相对应
  15.        本程序仅供参考,未经作者允许不可用于商业用途!

  16.         所使用开发板为普中科技单片机CH6800-ES V2.0开发板

  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;                                                                                                        //保存所有输出数据
  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, 下载次数: 66)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:491110 发表于 2019-3-14 22:17 | 只看该作者
非常谢谢楼主分享
回复

使用道具 举报

板凳
ID:511814 发表于 2019-4-14 13:54 | 只看该作者
学到了
回复

使用道具 举报

地板
ID:479749 发表于 2019-4-22 19:56 | 只看该作者
楼主能不能分享一下实物图呀
回复

使用道具 举报

5#
ID:481163 发表于 2019-5-29 10:06 | 只看该作者
在普中开发板上试了之后为什么不行呢
回复

使用道具 举报

6#
ID:481163 发表于 2019-6-11 22:14 | 只看该作者
普中的这个开发板实现不了啊
回复

使用道具 举报

7#
ID:525687 发表于 2019-12-10 12:30 | 只看该作者
这个有问题  大家都不要下载   我下载了  原理图都有问题

回复

使用道具 举报

8#
ID:665725 发表于 2019-12-16 23:04 | 只看该作者
非常感谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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