找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2503|回复: 2
收起左侧

51单片机8*8点阵贪吃蛇程序

[复制链接]
ID:382699 发表于 2020-11-1 12:33 | 显示全部楼层 |阅读模式
6ceae980bfcfc4d0ddd3ef5ee4cbce3.jpg

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<stdlib.h>
  4. typedef unsigned int u16;
  5. typedef unsigned char u8;
  6. sbit SER=P2^4;
  7. sbit up=P2^2;          //上
  8. sbit down=P2^1;          //下
  9. sbit lt=P2^3;          //左
  10. sbit rt=P2^0;          //右
  11. u8 code Hc595_Coordx[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
  12. u8 code Hc595_Coordy[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  13. u8  foodx;
  14. u8   foody;
  15. u8   snake_x[20]={0};
  16. u8   snake_y[20]={0};
  17. u8 length;
  18. u8 direction;
  19. void initSnake();
  20. void delay(u16 i);
  21. void Hc595SendByte(u8 dat);
  22. void move();
  23. void Keypros();
  24. void creatFood();
  25. void snake_Grow(void);
  26. void drawsnake();

  27. void initSnake()
  28. {
  29.    snake_x[0]=0;
  30. snake_y[0]=0;
  31. length=1;
  32. direction=2;
  33. }
  34. void delay(u16 i)
  35. {
  36.   while(i--);
  37. }

  38. void move()
  39. {

  40.     u8 len = length- 1;
  41.     for(len; len > 0; len--)
  42.     {
  43.         snake_x[len] = snake_x[len - 1];
  44.         snake_y[len] = snake_y[len - 1]; //一直到蛇头
  45.     }
  46.     switch(direction)
  47.     {
  48.     case 1:
  49.         snake_y[0]--;
  50.         break;
  51.     case 2:
  52.         snake_y[0]++;       //再利用蛇头转变方向
  53.         break;
  54.     case 3:
  55.         snake_x[0]--;
  56.         break;
  57.     case 4:
  58.         snake_x[0]++;
  59.         break;
  60.     default:
  61.         break;
  62.     }
  63. }

  64. //贪吃蛇的上下左右行动控制
  65. void Keypros()
  66. {
  67. if(up==0)
  68. {
  69.   delay(1000);  //消抖处理
  70.   if(up==0)
  71.   {
  72.     if(direction==3|direction==4)
  73.     direction=1;             //在地址1内写入数据num
  74.   }
  75.   while(!up);
  76. }
  77. if(down==0)
  78. {
  79.   delay(1000);  //消抖处理
  80.   if(down==0)
  81.   { if(direction==3|direction==4)
  82.    direction=2;   
  83.   }
  84.   while(!down);
  85. }
  86. if(lt==0)
  87. {
  88.   delay(100);  //消抖处理
  89.   if(lt==0)
  90.   {
  91.       if(direction==1|direction==2)
  92.    direction=3;
  93.   }
  94.   while(!lt);
  95. }
  96. if(rt==0)
  97. {
  98.   delay(1000);  //消抖处理
  99.   if(rt==0)
  100.   {
  101.      if(direction==1|direction==2)
  102.      direction=4;
  103.   }
  104.   while(!rt);
  105. }  
  106. }
  107. void creatFood()  //随机创造食物
  108. {
  109.     u8 i;
  110.     foodx=rand()%8;
  111.     foody=rand()%8;
  112.     for(i=0; i<length; i++)
  113.     {
  114.         if((foodx==snake_x[i])&&(foody==snake_y[i])) //如果食物与蛇的身体重叠,要重新创建
  115.                 {
  116.                     creatFood();
  117.                 }      
  118.     }
  119. }
  120. void snake_Grow(void)
  121. {
  122.     if(snake_x[0] == foodx && snake_y[0] == foody)
  123.     {
  124.         creatFood();
  125.         snake_x[length] = snake_x[length - 1];
  126.         snake_y[length] = snake_y[length - 1];
  127.         length++;
  128.     }
  129. }

  130. void drawsnake()   //点亮蛇和食物
  131. {
  132.      u8 i;
  133.      for(i=0;i<length;i++)
  134. {
  135.     P1=Hc595_Coordy[snake_y[i]];
  136.     P0=Hc595_Coordx[snake_x[i]];
  137.         delay(20);
  138.   P0=0xff;
  139.      P1=Hc595_Coordy[foody];   
  140.      P0=Hc595_Coordx[foodx];
  141.         delay(20);
  142.      P0=0xff;  
  143. }
  144. }
  145. void JudgeDeath(void)
  146. {
  147.     u8 i;
  148.     // 判断蛇撞墙死亡
  149.     if((snake_x[0]>7)||(snake_y[0]>7))
  150.     {
  151.          Hc595SendByte(0x00);
  152.         while(1);
  153.     }
  154.     // 判断蛇撞到自己身体死亡
  155.     for(i=4; i<length; i++)
  156.     {
  157.         if((snake_x[0]==snake_x[i])&&(snake_y[0]==snake_y[i]))
  158.         {
  159.             P0=0xFF;
  160.             while(1);
  161.         }
  162.     }
  163. }

  164. void Timer0Init()
  165. {
  166. TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
  167. TH0=0XD8; //给定时器赋初值,定时10ms
  168. TL0=0XF0;
  169. ET0=1;//打开定时器0中断允许
  170. EA=1;//打开总中断
  171. TR0=1;//打开定时器   
  172. }
  173. void main()
  174. {   

  175. Timer0Init();
  176. initSnake();
  177. while(1)
  178. {
  179.   drawsnake();
  180.   JudgeDeath();
  181.   snake_Grow();
  182.   Keypros();
  183. }
  184. }
  185. void Timer0() interrupt 1
  186. {
  187. static u16 i;
  188. TH0=0XD8; //给定时器赋初值,定时10ms
  189. TL0=0XF0;
  190. i++;
  191. if(i==50)
  192. {
  193.   i=0;
  194.      move();

  195. }
  196. }
复制代码


回复

使用道具 举报

ID:328014 发表于 2020-11-1 16:33 | 显示全部楼层
有使用573等接口芯片吗?要是能介绍下原理图就好了
回复

使用道具 举报

ID:382699 发表于 2020-11-1 16:53 来自手机 | 显示全部楼层
51hei团团 发表于 2020-11-1 16:33
有使用573等接口芯片吗?要是能介绍下原理图就好了

什么芯片都不用,直接P0和P1口控制点阵
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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