【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://投币1
				sys_ctrl.coin+=1;	
				break;
			case 3://投币50
				sys_ctrl.coin+=50;	
				break;
			case 6://投币5
				sys_ctrl.coin+=5;	
				break;
			case 7://投币100
				sys_ctrl.coin+=100;	
				break;
			case 10://投币10
				sys_ctrl.coin+=10;	
				break;
			case 14://投币20
				sys_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设计,视频分享,技术交流。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java王者荣耀

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; im…

网络和Linux网络_5(应用层)HTTP协议(方法+报头+状态码)

目录 1. HTTP协议介绍 1.1 URL介绍 1.2 urlencode和urldecode 1.3 HTTP协议格式 1.4 HTTP的方法和报头和状态码 2. 代码验证HTTP协议格式 HttpServer.hpp 2.2 html正式测试 Util.hpp index.html 2.3 再看HTTP方法和报头和状态码 2.3.1 方法_GET和POST等 2.3.2 报头…

springboot函数式web

1.通常是路由(请求路径)业务 2.函数式web&#xff1a;路由和业务分离 一个configure类 配置bean 路由等 实现业务逻辑 这样实现了业务和路由的分离

代码常见问题

1. 前端页面出现404了&#xff1a; 1&#xff09;那说明你该页面里面有某个接口地址&#xff08;url&#xff09;写错了&#xff0c;后台没有这个接口 2&#xff09;你后台写了这个接口&#xff0c;但是后台忘了重启服务了&#xff0c;这样的话前端也映射不上的 所以404的时…

歌曲《兄弟情深》:歌手荆涛歌曲中的真挚情感

在人生的道路上&#xff0c;有时我们会遇到迷茫、失落、困惑等种种情境。而在这些时刻&#xff0c;身边有一个真挚的兄弟&#xff0c;其意义是无法估量的。歌手荆涛演唱的《兄弟情深》即是对这种深厚情感的美妙歌颂。 一、迷茫时的指引 “当我迷茫时&#xff0c;有你帮目标重新…

箱型图 Box Plot 数据分析的法宝

文章目录 一、箱形图的介绍二、六大因数三、Box plot的应用四、箱形图的优劣势五、图形拓展 一、箱形图的介绍 箱形图又称为盒须图、盒式图、盒状图或箱线图&#xff0c;是一种用作显示一组数据分散情况资料的统计图。因型状如箱子而得名。在各种领域也经常被使用&#xff0c;…

Sqlserver 在数据库‘master’中拒绝了Create Database的权限

解决方案 打开SqlServer Manament Studio软件&#xff0c;然后登陆 选择安全性->登录名->找到您当前的用户 在您的登陆名上&#xff0c;点击右键-属性&#xff0c;配置相应的服务器角色权限&#xff08;这块需要勾选dbcreator的权限&#xff0c;这块如果不清楚还需要啥…

c语言:模拟实现各种字符串函数(2)

strncpy函数&#xff1a; 功能&#xff1a;拷贝指定长度的字符串a到字符串b中 代码模拟实现&#xff1a; //strncpy char* my_strncpy(char* dest, char* str,size_t num) {char* ret dest;assert(dest && str);//断言&#xff0c;如果其中有一个为空指针&#xff…

Linux篇:文件系统

一、共识原理&#xff1a; 文件文件内容文件属性 磁盘上存储文件存文件的内容&#xff08;数据块&#xff09;存文件的属性&#xff08;inode&#xff09; Linux的文件在磁盘中存储是将属性和内容分开存储的。 二、硬件简述&#xff1a; 1. 认识硬件 磁盘&#xff1a;唯一的一…

4.一维数组——用数组处理求Fibonacci数列前20项

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 四、结果显示 前言 本系列为一维数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 用数组处理求Fibonacci数列前20项 二、题目分析 前两项&#xff1a;f[20]{1,1} 后18项&#xff1a;for(…

vue3+tsx的使用

<template><div><xiaoman on-click"getItem" name"似懂非懂"></xiaoman></div> </template><script setup langts>import xiaoman from "./App"const getItem(item:any)>{console.log(item,it…

王者小游戏作业

一、创建好文件、包、类、插入图片文件夹 二、beast包 1、Bear类 package beast; import sxt.GameFrame; public class Bear extends Beast {public Bear(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("C:\\Users\\陆先生\\Desktop\\王者荣耀图片…

C++学习之路(四)C++ 实现简单的待办事项列表命令行应用 - 示例代码拆分讲解

本期示例介绍: 本期示例《待办事项列表应用》展示了一个简单的任务管理系统&#xff0c;用户可以通过命令行界面执行添加任务、删除任务和显示任务列表等操作。 功能描述&#xff1a; 添加任务功能&#xff1a; 用户可以输入任务描述&#xff0c;将新的任务添加到任务列表中。…

设计模式—依赖倒置原则(DIP)

1.概念 依赖倒置原则&#xff08;Dependence Inversion Principle&#xff09;是程序要依赖于抽象接口&#xff0c;不要依赖于具体实现。简单的说就是要求对抽象进行编程&#xff0c;不要对实现进行编程&#xff0c;这样就降低了客户与实现模块间的耦合。 通俗的讲&#xff1…

【教学类-06-13】20231126 (55格版)趣味题(一)1-9加法题(10倍)(整十相加)

作品展示 背景需求&#xff1a; 1、会做加法题的孩子5分钟内完成题目&#xff0c;太快了&#xff0c;所以为了拉平差异&#xff0c;需要给这些会做另外的题目&#xff0c;比如提供一些他们没有做过的“趣味题形”。 2、好多次&#xff0c;听见大班孩子在互相“考试”——“老…

04_MySQL备份与恢复

任务背景 一、真实案例 某天&#xff0c;公司领导安排刚入职不久的小冯同学将生产环境中的数据(MySQL数据库)全部导入到测试环境给测试人员使用。当小冯去拿备份数据时发现&#xff0c;备份数据是1个礼拜之前的。原因是之前运维同事通过脚本每天对数据库进行备份&#xff0c;…

2023年程序设计迎新赛(第二届个人程序设计大赛)

7-1 找规律 请从所给的四个选项中&#xff0c;选择最合适的一个填入问号处&#xff0c;使之呈现一定的规律性。 输入格式: 无 输出格式: 大写字母 输入样例: 输出样例: #include<stdio.h> int main(){printf("D");return 0; }7-2 蜡烛燃烧时间 有粗细不同…

【MySQL】JDBC编程

&#x1f451;专栏内容&#xff1a;MySQL⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、JDBC工作原理二、JDBC 使用1、准备工作2、使用实例3、手动输入 一、JDBC工作原理 JDBC是Java语言中用于与数据库进行交互…

Vscode工具使用指南

通用 快捷键文件 / 编辑查找 / 替换窗口插件主题 连接linux 快捷键 文件 / 编辑 新建文件&#xff1a;CtrlN放大或缩小&#xff1a;Ctrl /-代码行缩进&#xff0c;展开&#xff1a;Ctrl[ 和 Ctrl]在当前行下方插入一行&#xff1a;CtrlEnter在当前行上方插入一行&#xff1a;…

【方块消消乐】方块消除游戏-微信小程序开发流程详解

有做过俄罗斯方块游戏小程序的经验&#xff0c;这次有做了一个消灭方块的游戏&#xff0c;实现过程很顺利&#xff0c;游戏看着和之前做的俄罗斯方块游戏很像&#xff0c;这里调整了玩法&#xff0c;试玩感觉还可以&#xff0c;接下来给大家讲一讲消灭方块游戏开发过程。 俄罗斯…