AT89C51系列单片机做的推箱子小游戏,Proteus仿真。 可显示二维码。 联系后发您: 1、keil工程源码; 2、Proteus源码 3、Proteus 8.12及和谐文件。 再送串口调试助手、汉字取模工具、图片取模三合一工具

"推箱子这玩意儿算是嵌入式开发的经典练手项目了。今天咱们要唠的这个版本有点意思——AT89C51单片机驱动,Proteus仿真环境下跑得溜溜的,最骚的是还能在LCD上显示关卡二维码。老规矩,先把开发板接线图甩出来(此处应有Proteus截图),矩阵键盘+12864液晶的经典组合,外加蜂鸣器给操作音效加点料。

硬件设计有个坑得注意:51的IO口驱动能力实在感人。这里用了74HC245做总线驱动,不然LCD显示会像老电视雪花屏似的闪瞎眼。看这段端口初始化代码:

void LCD_Init()
{
    P2 = 0x00;  // 先给总线喂个零
    delay_ms(15);
    write_cmd(0x30); // 基础指令集
    write_cmd(0x0C); // 显示开,光标关
}

初始化时序必须卡准,特别是12864这种古董屏,delay_ms(15)少一毫秒都可能翻车。实测发现,用Proteus自带的延时函数会抽风,得自己用定时器搓个精准延时。

地图数据存储是个技术活。直接上二维数组太占内存,这里用了位压缩大法:

uchar code map1[] = {
    0b11111110,
    0b10000010,
    0b10111011,
    0b10100010,
    //...其他行数据
};

每个字节存7个格子状态(墙/空地/箱子),最高位留着做校验。取数据时用查表位移大法:

bit get_map(uchar row, uchar col)
{
    return (map1[row] >> (7 - col)) & 0x01;
}

这操作省下了近40%的ROM空间,51的4K Flash终于不用抠抠搜搜了。

AT89C51系列单片机做的推箱子小游戏,Proteus仿真。 可显示二维码。 联系后发您: 1、keil工程源码; 2、Proteus源码 3、Proteus 8.12及和谐文件。 再送串口调试助手、汉字取模工具、图片取模三合一工具

二维码生成是重头戏。基于LiquidCrystal库魔改的显示驱动里,藏着个硬核算法——把字符串转成QR码点阵。核心算法截取一段:

void generateQR(uchar *str)
{
    // 省略前戏...
    for(uchar i=0; i<version; i++){
        for(uchar j=0; j<ecc_level; j++){
            // 这里有一堆异或操作
            data_byte ^= mask_pattern;
        }
    }
    // 后续纠错码生成...
}

实际测试发现,51跑完整个编码得300ms左右,期间必须关中断,不然屏幕会鬼畜。后来用查表法预存格式信息才把时间压到100ms内。

开发工具链也有讲究:Keil的优化等级开到O2时,某些变量会被莫名优化掉。解决办法是在变量前加volatile,或者局部变量改全局。Proteus 8.12有个祖传bug——断电仿真后元件状态不重置,解决方法是在单片机属性里勾选"Reset on startup"。

资源包里那个三合一取模工具是真香,特别是图片转C数组的功能,直接省去手搓点阵的麻烦。比如角色造型:

// 推箱子小人 16x16
const uchar worker[] = {
0x00,0x00,0x03,0xE0,0x04,0x10,0x08,0x08,
0x10,0x04,0x20,0x02,0x20,0x02,0x43,0xE1,
//...剩余数据
};

最后说个骚操作:用串口调试助手伪造按键信号,直接发特定指令就能跳关。这比老老实实推箱子通关快多了,适合演示时装X用。

需要源码和工具包的铁汁,后台踹我拿密码。下期可能整个更野的——用51驱动WS2812搞光污染,想看的老铁扣个1。"

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐