【STM32单片机】自动售货机控制系统设计

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用STM32F103C8T6单片机控制器,使用OLED显示模块、矩阵按键模块、LED和蜂鸣器、继电器模块等。
主要功能:
系统运行后,OLED显示系统初始界面,可通过矩阵按键S1和S5选择商品,OLED液晶显示商品价格,共有8种价格商品可供选择,且选择的商品对应LED会有指示。可通过S9和S13选择商品数量,当需要返回时可按下S16键,选择好商品和数量后可按下S12键,此时OLED显示累计商品总价,此时可通过键盘输入投币数,OLED显示投币值,若投币数值大于等于商品累计总价,则驱动继电器出货,且蜂鸣器报警提示,OLED显示找零数。若投币数小于商品累计总价,则OLED显示继续投币。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)*///系统功能控制
void sys_fun_ctrl(void)
{u8 key=0;static u8 sta=0;//扫描按键key=KEY_Matrix_Scan();//商品选择和数量显示if((key==1 || key==5) && sta==0){sta=1;//仅显示一次OLED_Clear();OLED_ShowString(0,0,"Money:",16);OLED_ShowString(10*8,0,"Num:",16);OLED_ShowString(0,30,"OK",16);OLED_ShowString(14*8,30,"NO",16);	}if(sta){switch(key){case 1://商品价格+sys_ctrl.pric++;if(sys_ctrl.pric>8)sys_ctrl.pric=1;break;case 5://商品价格-sys_ctrl.pric--;if(sys_ctrl.pric<1)sys_ctrl.pric=8;	break;case 9://商品数量+sys_ctrl.num++;if(sys_ctrl.num>9)sys_ctrl.num=1;break;case 13://商品数量-sys_ctrl.num--;if(sys_ctrl.num<1)sys_ctrl.num=9;	break;case 12://OK,商品选择完成//总计商品价格sys_ctrl.pric=sys_ctrl.pric*sys_ctrl.num;	break;case 16://NO,返回/取消sta=0;sys_ctrl.runflag=0;//关闭LED指示灯LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;sys_parm_init();sys_open_show();	break;case 2://投币1sys_ctrl.coin+=1;	break;case 3://投币50sys_ctrl.coin+=50;	break;case 6://投币5sys_ctrl.coin+=5;	break;case 7://投币100sys_ctrl.coin+=100;	break;case 10://投币10sys_ctrl.coin+=10;	break;case 14://投币20sys_ctrl.coin+=20;	break;}//商品价格和数量显示if(key==1 || key==5 || key==9 || key==13){//商品价格显示OLED_ShowxNum(6*8,0,sys_ctrl.pric,1,16,0,1);//商品数量显示OLED_ShowxNum(14*8,0,sys_ctrl.num,1,16,0,1);//商品LED指示switch(sys_ctrl.pric){case 1: LED1=0;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;break;case 2: LED1=1;LED2=0;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;break;case 3: LED1=1;LED2=1;LED3=0;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;break;case 4: LED1=1;LED2=1;LED3=1;LED4=0;LED5=1;LED6=1;LED7=1;LED8=1;break;case 5: LED1=1;LED2=1;LED3=1;LED4=1;LED5=0;LED6=1;LED7=1;LED8=1;break;case 6: LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=0;LED7=1;LED8=1;break;case 7: LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=0;LED8=1;break;case 8: LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=0;break;}}//OK,商品选择完成if(key==12){OLED_Clear();OLED_ShowString(0,0,"SUM:",16);OLED_ShowString(7*8,0,"Input:",16);OLED_ShowString(0,30,"OK",16);OLED_ShowString(14*8,30,"NO",16);//商品总价显示OLED_ShowxNum(4*8,0,sys_ctrl.pric,2,16,0,1);sys_ctrl.runflag=1;//商品选择完成标记}	}	//投币显示if((key==2 || key==3 || key==6 || key==7 || key==10 || key==14)&& sys_ctrl.runflag==1){OLED_ShowxNum(13*8,0,sys_ctrl.coin,3,16,0,1);OLED_Refresh_Gram();//刷新显示缓存delay_ms(1500);//能显示一下投币数	}if(sys_ctrl.coin!=0 && sys_ctrl.runflag==1){//如果投币数大于商品价格累计总和,则启动继电器出货和找零if(sys_ctrl.coin>=sys_ctrl.pric){OLED_Clear();OLED_ShowString(0,0,"Shipment...",16);OLED_ShowString(0,30,"Change:",16);//显示找零数据sys_ctrl.change=sys_ctrl.coin-sys_ctrl.pric;OLED_ShowxNum(7*8,30,sys_ctrl.change,3,16,0,1);OLED_Refresh_Gram();//刷新显示缓存			LED0=0;//打开商品输出BEEP_Alarm(1000,100);//打开蜂鸣器delay_ms(1000);delay_ms(1000);LED0=1;//关闭商品输出//关闭LED指示灯LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;LED7=1;LED8=1;sys_parm_init();sys_open_show();sta=0;sys_ctrl.runflag=0;}//如果投币数小于商品价格累计总和,则显示继续投币提示信息else{OLED_ShowString(0,0,"Please continue to coin...",16);}	}OLED_Refresh_Gram();//刷新显示缓存
}

三、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/172070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaEE进阶学习:读取和存储对象

到了学习 JavaEE 这块要有一个思想,实现一个功能的时候,先考虑下有没有实现对应功能的注解. 在 Spring 中想要更简单的存储和读取对象的核心是使用注解&#xff0c;也就是我们接下来要学习 Spring 中的相关注解&#xff0c;来存储和读取 Bean 对象 1.存储 Bean 对象 之前我们…

跟着chatgpt一起学|1.spark入门之MLLib

chatgpt在这一章表现的不好&#xff0c;所以我主要用它来帮我翻译文章提炼信息 1.前言 首先找到spark官网里关于MLLib的链接 spark内一共有2种支持机器学习的包&#xff0c; 一种是spark.ml,基于DataFrame的&#xff0c;也是目前主流的 另一种则是spark.mllib,是基于RDD的…

王者荣耀java版

主要功能 键盘W,A,S,D键&#xff1a;控制玩家上下左右移动。按钮一&#xff1a;控制英雄发射一个矩形攻击红方小兵。按钮二&#xff1a;控制英雄发射魅惑技能&#xff0c;伤害小兵并让小兵停止移动。技能三&#xff1a;攻击多个敌人并让小兵停止移动。普攻&#xff1a;对小兵造…

乘法原理 LeetCode 828. 统计子串中的唯一字符

我们定义了一个函数 countUniqueChars(s) 来统计字符串 s 中的唯一字符&#xff0c;并返回唯一字符的个数。 例如&#xff1a;s "LEETCODE" &#xff0c;则其中 "L", "T","C","O","D" 都是唯一字符&#xff0c;…

坚鹏:广州银行清华大学消费金融发展趋势与创新培训圆满结束

广州银行自1996年9月成立以来&#xff0c;依托中国经济腾飞的大好形势&#xff0c;成为国内具有一定知名度与地方特色的商业银行。截至2022年12月末&#xff0c;已开业机构174家&#xff0c;包括总行1家&#xff0c;分行级机构15家(含信用卡中心)、支行152家、信用卡分中心6家&…

通达信视频教程的下载地址

百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/12yNV62ROERRzmyqm9u22aQ?pwdgmdx

2023-11-26 事业-代号s-跨境物流-记录

摘要: 2023-11-26 事业-代号s-跨境物流-记录 跨境物流: 【结论】 中小卖家&#xff08;最低适合1个人经营的卖家&#xff09;首选以下两种物流&#xff0c;目前已知的是以下两种&#xff0c;后续有新的发现再更新。 1、云途物流&#xff08;YunExpress&#xff09;&#xff…

【GPT-3.5】通过python调用ChatGPT API与ChatGPT对话交流

文章目录 一、引言二、AIGC简介三、OpenAI介绍四、GPT-3.5介绍五、获得OpenAI API Key六、调用ChatGPT API实现与ChatGPT对话七、参考链接 一、引言 ChatGPT 的火爆&#xff0c;成功带火了AIGC&#xff0c;让它进入大众的视野。 ChatGPT 和Whisper API 开发者现在可以通过API将…

线性模型加上正则化

使用弹性网络回归&#xff08;Elastic Net Regression&#xff09;算法来预测波士顿房屋价格。弹性网络回归是一种结合了L1和L2正则化惩罚的线性回归模型&#xff0c;能够处理高维数据和具有多重共线性的特征。弹性网络回归的目标函数包括数据拟合损失和正则化项&#xff1a; m…

torch.nn.batchnorm1d,torch.nn.batchnorm2d,torch.nn.LayerNorm解释:

批量归一化是一种加速神经网络训练和提升模型泛化能力的技术。它对每个特征维度进行标准化处理&#xff0c;即调整每个特征的均值和标准差&#xff0c;使得它们的分布更加稳定。 Batch Norm主要是为了让输入在激活函数的敏感区。所以BatchNorm层要加在激活函数前面。 1.torch.…

如何用低代码的思路设计文字描边渐变组件

前言 文字特效设计一直是困扰 Web 前端 Css 世界多年的问题, 比如如何用纯 Css 实现文字描边, 渐变, 阴影等, 由于受限于浏览器兼容性的问题, 我们不得不使用其他替代方案来实现. 平时工作中我们使用 PS 等设计工具能很容易的实现文字渐变等特效, 但是随着可视化技术的成熟, 我…

Swagger在php和java项目中的应用

Swagger在php和java项目中的应用 Swagger简介Swagger在java项目中的应用步骤常用注解 Swagger在php项目中的应用 Swagger简介 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 总体目标是使客户端和文件系统作为服务器以…

MyBatis的功能架构,MyBatis的框架架构设计,Mybatis都有哪些Executor执行器,Mybatis中如何指定使用哪一种Executor执行器

文章目录 MyBatis的功能架构是怎样的把Mybatis的功能架构分为三层&#xff1a; **MyBatis的框架架构设计**是怎么样的架构图如下Mybatis都有哪些Executor执行器&#xff1f;它们之间的区别是什么&#xff1f;Mybatis中如何指定使用哪一种Executor执行器&#xff1f; MyBatis的功…

SASS的导入文件详细教程

文章目录 前言导入SASS文件使用SASS部分文件默认变量值嵌套导入原生的CSS导入后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Sass和Less &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努…

人工智能入门教学——AI代理(AI Agent)

目录 一、简介 二、特征 三、结构 四、工作流程 五、类型 六、应用 一、简介 AI代理 (Artificial Intelligence Agent)是指使用人工智能技术和算法来执行特定任务、解决问题或实现目标的程序或系统。这些代理可以是简单的程序&#xff0c;也可以是复杂的系统&#xff0c…

面向对象编程:Rust的面向对象特性

欢迎关注我的公众号lincyang新自媒体&#xff0c;回复关键字【程序员经典书单】&#xff0c;领取程序员的100本经典书单 大家好&#xff01;我是lincyang。 今天我们将深入探讨Rust语言中的面向对象编程&#xff08;OOP&#xff09;特性&#xff0c;并将其与其他流行编程语言进…

基于U-Net的视网膜血管分割(Pytorch完整版)

基于 U-Net 的视网膜血管分割是一种应用深度学习的方法&#xff0c;特别是 U-Net 结构&#xff0c;用于从眼底图像中分割出视网膜血管。U-Net 是一种全卷积神经网络&#xff08;FCN&#xff09;&#xff0c;通常用于图像分割任务。以下是基于 U-Net 的视网膜血管分割的内容&…

mysql高级知识点

一、mysql架构 连接层&#xff1a;负责接收客户端的连接请求&#xff0c;可以进行授权、认证(验证账号密码)。服务层&#xff1a;负责调用sql接口&#xff0c;对sql语法进行解析&#xff0c;对查询进行优化&#xff0c;缓存。引擎层&#xff1a;是真正进行执行sql的地方&#x…

Linux面试题(二)

目录 17、怎么使一个命令在后台运行? 18、利用 ps 怎么显示所有的进程? 怎么利用 ps 查看指定进程的信息&#xff1f; 19、哪个命令专门用来查看后台任务? 20、把后台任务调到前台执行使用什么命令?把停下的后台任务在后台执行起来用什么命令? 21、终止进程用什么命令…

Vue框架学习笔记——事件修饰符

文章目录 前文提要事件修饰符prevent&#xff08;常用&#xff09;stop&#xff08;不常用&#xff09;事件冒泡stop使用方法三层嵌套下的stop三层嵌套看出的stop&#xff1a; once&#xff08;常用&#xff09;capture&#xff08;不常用&#xff09;self&#xff08;不常用&a…