迪文科技论坛

 找回密码
 立即注册
搜索
查看: 10|回复: 0

【分享】2026智能工程学院张雨晴&李坦 自动售货机

[复制链接]

1

主题

0

回帖

24

积分

新手上路

Rank: 1

积分
24
发表于 前天 16:31 | 显示全部楼层 |阅读模式
一、作品简介
本作品是一台以 HelloKitty 为主题的自动售货机交互与出料控制系统,由迪文 DGUS 串口智能屏界面工程与51 单片机 C51 控制程序两部分组成。屏幕承担商品展示、数量增减、总价显示、出货图标联动与待机动画;单片机通过读写屏幕的 VP 变量完成计价、按键识别与 PWM 出料控制。两端只以一张变量地址表约定交互,界面改版不需要同步改动控制逻辑。
图1 作品基本信息表
作品的几个特点:
主题化视觉与状态映射:10 张商品图与 1 张 Kitty 待机图共用一个图标变量控件,用变量值直接表达「该商品是否有货在手」。
屏机解耦:界面元素只认识 VP 地址,业务判断全部落在单片机,界面调整不影响程序结构。
两条独立按键通道:出货键与结算键分属不同地址,出货只驱动 PWM,结算只做清零,互不干扰。
屏端自循环动画:待机动画由动画图标控件在屏内循环,单片机只需写一次启动值。
二、工作原理
整套系统按「屏做界面、机做逻辑」分工运行。用户在屏幕上点按加减、结算与出货按键时,DGUS 控件把结果写进约定好的 VP 变量;单片机在主循环里周期性读取这些变量,完成累加计价、键值判断与 PWM 输出,再把需要显示的结果写回 VP,屏幕控件随即自动重绘。
1. 系统组成:系统自下而上分为四层:交互层是三个功能页面,数据层是屏幕的 VP 变量区,控制层是单片机的三个功能模块,执行层是 PWM 与出料机构。下图中标出各层承担的角色与它们之间的连接关系。
                         图 2 系统组成
层次划分的意义在于故障定位:按下按键没有反应,先查交互层到数据层的写入是否成功;数据变化了但显示不刷新,查控件配置;显示正常但机构不动,查控制层的 PWM 与执行层接线。三层之间不会互相掩盖问题。
2.数据交互流程
一次完整的操作在屏与机之间往返六步,回到起点后进入下一次循环,形成右图所示的主循环结构。关键在于每一步只做一件事:屏幕不参与计算,单片机不直接绘图。

                图3 数据交互流程

由于屏幕侧的图标控件和数值控件会持续读取自己的 VP,单片机把结果写入后无需再下发布局指令,屏幕自动完成重绘。因此主循环里只有「读—算—写」三件事,没有逐帧刷新的开销。
3.变量地址与数据约定
地址表是两端唯一的技术契约,界面搭建与程序编写都以它为准,任何一方不得私自改动。
        图 4 变量地址与数据约定
4.计价与图标联动算法
计价循环把「读数、算价、换图」三件事合并在一趟遍历里完成:读出一类商品的数量,按数量是否为零决定写商品图还是 Kitty 图,同时把「数量 × 单价」累加进 32 位总价,最后只写一次总价变量,避免刷新过程中出现闪烁的中间值。单价按商品编号顺序存放,与地址偏移一一对应。
控制器主程序的核心代码如下,计价、出货与清零三个模块都在同一个主循环里按顺序执行。
5.出货与结算的状态迁移
出货与结算是两条互不干扰的通道,各自用不同地址和键值触发。出货按下后不会立刻清零,也不影响计价结果;结算按下只负责把购物车复位,不驱动机构。
空闲态:pwm_set_duty(0),CHUHUO_FLG = 0,主循环正常计价与刷新。
出货态:读到 0x1040 的键值 0x0022,输出 pwm_set_duty(0xB4) 并置标志位,随即回写 0 清除键值,防止长按重复触发。
定时复位:延时 3000ms 后输出 0,标志位清零,回到空闲态等待下一次按键。
结算分支:读到 0x1010 的键值 0x000b,调用清零函数把 0x1000~0x1009、0x1050~0x1059 与 0x2000 全部写 0,下一轮计价立即显示总价 0、全部图标回到 Kitty。
6.动画图标与待机演示
出货页的待机动画由 DGUS 的动画图标控件实现,控件绑定 0x1070,停止值 1、开始值 2,图标序列从 0 号播到 10 号,单帧显示时间 17,显示模式为循环播放。变量等于开始值时控件在序列内自行循环,等于停止值时定格在停止图标,其余值不显示。因此单片机既不需要逐帧下发,也无需为动画单独开定时器;屏幕上电后的默认值让它保持静止,由按键向 0x1070 写入 2 才开始演示。
三、设计思路
整个作品按「先定契约、再搭界面、最后写逻辑」的顺序推进。因为屏与机是两个独立开发环境,最怕的是双方对同一个变量的理解不一致,所以把地址表提前固定下来,后续所有工作都围绕这张表展开。
                       图5 开机界面
                      图6 商品选择
1.设计过程
1.需求拆解与页面规划:先把功能拆成「看商品、选数量、算总价、出货、待机演示」五件事,再据此划分页面。商品选择、购物车总价、出货与动画三页各自职责单一,避免在同一页混放操作与结果。
2.变量地址规划:按用途成段分配地址——数量从 0x1000 连续排十位,图标紧接其后从 0x1050 排十位,总价单独占 0x2000,两条按键各占一个字节地址,动画单独占 0x1070。连续排列使程序可以用「基址 + 偏移」循环访问,不必写十次重复代码。
3.界面搭建:制作 Kitty 主题背景与商品图,导入 40图标.icl;出货页放十个图标变量控件逐一绑定 0x1050~0x1059;总价用数据变量显示控件,设为整数 2 字节、0 位小数;再把按键配置为向对应地址写入键值。
4.程序编写:程序分成计价、出货、清零三个函数,主循环按固定顺序调用。VP 读写统一按 2 字节处理,配合小端排列手工拆高低位,避免依赖编译器类型长度。
5.联调与排错:屏幕与单片机分开验证——先确认界面能正确写变量、控件能正确显示,再接入主循环联调。下表记录了过程中最有代表性的几类问题。
2. 联调中的典型问题与处理
        图7 联调中的典型问题与处理
3.创新点
以 VP 变量表为核心的屏机契约:界面元素只认识地址、不认识业务,两份程序因此可以并行开发和独立调试;换主题、换图片只需改界面工程。
用图标变量做状态映射:一个 2 字节变量承载 11 种显示状态(十类商品图加 Kitty 待机图),把「有没有选这件商品」这类逻辑状态转换为用户一眼可读的图形,省掉了额外的文字提示控件。
按键通道分离:出货与结算使用不同地址与键值,出货只置位 PWM,结算只复位数据,读后立即回写 0 清除,从结构上避免长按连触和功能串扰。
动画交给屏端自循环:待机演示由动画图标控件在屏幕内部完成,单片机只写一次启动值,不占用主循环时间,也为后续加入更多演示序列留出空间。
可复用的排错方法:把「界面配置—变量数值—程序读写」三者分开验证,先确认变量监视器中数值正确,再判断是控件问题还是代码问题,显著缩短定位时间。
四、演示视频
【自动售货机-哔哩哔哩】 [url=https://b23.tv/MRWulhu]https://b23.tv/MRWulhu[/url]
五、附件上传





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2026-11-9 12:41 , Processed in 0.053179 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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