51单片机流式混合运算计算器

本项目是一个基于 STC89C516 的流式混合运算计算器,在资源受限的 51 单片机上实现了带括号的浮点数四则运算。核心算法借鉴编译原理,使用流式有限状态机进行词法分析,并用算符优先分析完成语法归约,解决了负号二义性与运算优先级问题。

GitHub项目链接

项目特性

  • 支持浮点数四则混合运算与括号
  • 负号与减号歧义消解,输入更稳定
  • 矩阵键盘 + 独立按键输入,LCD1602 显示
  • 蜂鸣器按键反馈与彩蛋功能
  • 模块化架构,算法层与驱动层分离

硬件与开发环境

硬件配置

  • 开发板:普中51-单核-A5
  • 主控:STC89C516(兼容 STC89C52/54/58 系列)
  • 显示:LCD1602
  • 输入:矩阵按键(P1 口)与独立按键(P3 口)
  • 蜂鸣器:无源蜂鸣器(P2.4)

软件环境

  • 编辑器:VSCode
  • 编译工具:Keil uVision 5(C51)
  • 烧录工具:AiCube-ISP

编译与运行

1. 打开工程

在 Keil uVision 5 中打开项目根目录的 MyCalculator.uvproj

2. 编译生成固件

点击 Rebuild(或按 F7),确认输出 0 Error(s), 0 Warning(s),生成 Objects/MyCalculator.hex

3. 烧录到开发板

在 AiCube-ISP 中选择芯片型号 STC89C516,加载 Objects/MyCalculator.hex,选择正确串口并下载。

目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
├── Docs/                 # 架构与算法图解
├── Drivers/ # 硬件驱动层
│ ├── LCD1602.c/h
│ ├── MatrixKey.c/h
│ ├── IndependentKey.c/h
│ └── Buzzer.c/h
├── Middleware/ # 核心算法层
│ ├── Lexer.c/h
│ ├── Parser.c/h
│ └── Double2Str.c/h
├── main.c # 主控逻辑
├── MyCalculator.uvproj # Keil 工程文件
└── ...

核心算法说明

  • 词法分析:流式有限状态机(FSM)实时解析按键流,识别数字、小数点与负号逻辑。
  • 语法分析:算符优先分析(双栈)完成括号与运算优先级处理。
  • 显示优化:针对 LCD1602 的浮点转字符串算法,自动去除尾零。

许可证

本项目采用 MIT License 开源,详见 LICENSE 文件。


如有问题或建议,欢迎在评论区留言交流!


51单片机流式混合运算计算器
https://blog.yanjz.top/c51-stream-calculator/
作者
严嘉哲
发布于
2026年1月29日
许可协议