折腾来折腾去

pikipity的blog

贪吃蛇(8051)

简介

使用 AT89C52 制作的贪吃蛇游戏。练习在 8051 上使用实时多任务系统。你可以到这里下载源码

一开始的构想是利用 LCD12864 来作为显示屏,于是选择了自己比较熟悉的 ST7920 作为控制器的 LCD12864,毕竟之前也使用同样的显示屏用 Arduino 做过尔罗斯方块,虽然图像显示处理缓慢,但是应该还是可以使用的,测试之后的结果大失所望,由于过于过于缓慢的图像显示导致屏幕闪烁现象过于严重,并且导致任务堵塞,程序堵死,于是放弃。改儿使用 4 块 8*8 LED 矩阵来做显示屏,由于要自己撰写显示函数和游戏函数,程序量徒然增加,还出现了单片机内存不足的现象,经过调试,最终结果还算不错,以下基本功能都已经实现:

  1. 蛇和食物的显示。
  2. 蛇的移动,包括碰撞边界和自身之后的死亡判定和碰撞食物的判定。
  3. 蛇在吃掉食物之后的增长效果。

由于 8051 单片机本身内存与机能的限制,还有很多预想功能未能实现:

  1. 食物位置不是随机的,永远固定。
  2. 食物数量固定,就是开始游戏之后的那几个食物,不会再增加了,吃完就获胜。
  3. 蛇的最大长度是固定的。
  4. 蛇的初试长度与位置都不是随机的,永远固定。

文件说明:

  1. lcd12864 文件夹中是使用 lcd12864 制作的初版游戏。仅实现了蛇的移动和边界碰撞判定。闪烁现象严重
  2. LCD_array 文件夹中是最终成品。使用 4 个 8*8 的 LED 点阵来作为显示,4个按钮控制上下左右,还有一个 Reset 键用来重启单片机(也就是重启游戏)。此文件夹中包括以下文件

    • circuit 文件夹:Proteus 仿真电路图,如下

      仿真电路图

    • program 文件夹:烧录入单片机中的程序文档,包括

      • Main.h, Sch51.h, Sch51.c, 2_01_12g.h, 2_01_12g.c: 实时多任务系统所需的文件,由《PATTERNS FOR TIME-TRIGGERED EMBEDDED SYSTEMS》一书提供。
      • main.c: 主程序。main 函数所在。
      • ledarray.h, ledarray.c: LED 点阵显示函数:

        • LED 点阵初始化函数:led_init()
        • 绘制第一块与第二块 LED 点阵的函数:draw1()
        • 绘制第三块与第四块 LED 点阵的函数:draw2()
        • 清空显示的函数:first_page()
        • 向某个坐标写入一个点的函数(左上角为原点,x轴正方向向右延伸,y轴正方向向下延伸,下同):set_dot()
        • 读取某个坐标是否有点存在的函数:read_dot()
      • game.h, game.c: 游戏控制及显示函数:

        • 根据蛇和食物的控制矩阵,向屏幕内绘制点的函数:draw()
        • 控制蛇移动的函数:move()
        • 检查按键的函数:button()

最终效果:

  1. 胜利

  2. 失败



Comments