STM32单片机自动售货机系统设计

发布者:Changfeng520最新更新时间:2024-09-03 来源: elecfans关键字:STM32  单片机 手机看文章 扫描二维码
随时随地手机看文章

一、功能简介

本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602显示模块、矩阵按键模块、LED和蜂鸣器、继电器模块等。


主要功能:


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


二、软件设计


//系统参数初始化


void sys_parm_init(void)


{


sys_ctrl.pric=0;


sys_ctrl.num=1;


sys_ctrl.coin=0;


sys_ctrl.runflag=0;


sys_ctrl.change=0;


}


//系统开机界面显示


void sys_open_show(void)


{


lcd1602_clear();


lcd1602_show_string(0,0,' -->Welcome<-- ');


lcd1602_show_string(0,1,'Select an Item..');


}


//系统功能控制


void sys_fun_ctrl(void)


{


u8 key=0;


static u8 sta=0;


//扫描按键


key=key_matrix_flip_scan();


//商品选择和数量显示


if((key==1 || key==5) && sta==0)


{


sta=1;//仅显示一次


lcd1602_clear();


lcd1602_show_string(0,0,'Money:');


lcd1602_show_string(10,0,'Num:');


lcd1602_show_string(0,1,'OK');


lcd1602_show_string(14,1,'NO');


}


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指示灯


ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=1;


ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=1;ITEM_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)


{


//商品价格显示


lcd1602_show_nums(6,0,sys_ctrl.pric,1,0);


//商品数量显示


lcd1602_show_nums(14,0,sys_ctrl.num,1,0);


//商品LED指示


switch(sys_ctrl.pric)


{


case 1: 


 ITEM_LED1=0;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=1;


 ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=1;


 break;


case 2: 


 ITEM_LED1=1;ITEM_LED2=0;ITEM_LED3=1;ITEM_LED4=1;


 ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=1;


 break;


case 3: 


 ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=0;ITEM_LED4=1;


 ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=1;


 break;


case 4: 


 ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=0;


 ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=1;


 break;


case 5: 


 ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=1;


 ITEM_LED5=0;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=1;


 break;


case 6: 


 ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=1;


 ITEM_LED5=1;ITEM_LED6=0;ITEM_LED7=1;ITEM_LED8=1;


 break;


case 7: 


 ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=1;


 ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=0;ITEM_LED8=1;


 break;


case 8: 


 ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=1;


 ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=0;


 break;

}


}


//OK,商品选择完成


if(key==12)


{


lcd1602_clear();


lcd1602_show_string(0,0,'SUM:');


lcd1602_show_string(7,0,'Input:');


lcd1602_show_string(0,1,'OK');


lcd1602_show_string(14,1,'NO');


//商品总价显示


lcd1602_show_nums(4,0,sys_ctrl.pric,2,0);


sys_ctrl.runflag=1;//商品选择完成标记


}


}


//投币显示


if((key==2 || key==3 || key==6 || key==7 || key==10 || key==14)&& sys_ctrl.runflag==1)


{


lcd1602_show_nums(13,0,sys_ctrl.coin,3,0);


delay_ms(1500);//能显示一下投币数


}


if(sys_ctrl.coin!=0 && sys_ctrl.runflag==1)


{


//如果投币数大于商品价格累计总和,则启动继电器出货和找零


if(sys_ctrl.coin>=sys_ctrl.pric)


{


lcd1602_clear();


lcd1602_show_string(0,0,'Shipment...');


lcd1602_show_string(0,1,'Change:');


//显示找零数据


sys_ctrl.change=sys_ctrl.coin-sys_ctrl.pric;


lcd1602_show_nums(7,1,sys_ctrl.change,3,0);


RELAY=0;//打开商品输出


BEEP=0;//打开蜂鸣器


delay_ms(2000);


BEEP=1;//关闭蜂鸣器


RELAY=1;//关闭商品输出


//关闭LED指示灯


ITEM_LED1=1;ITEM_LED2=1;ITEM_LED3=1;ITEM_LED4=1;


ITEM_LED5=1;ITEM_LED6=1;ITEM_LED7=1;ITEM_LED8=1;


sys_parm_init();


sys_open_show();


sta=0;


sys_ctrl.runflag=0;


}


//如果投币数小于商品价格累计总和,则显示继续投币提示信息


else


{


lcd1602_show_string(0,0,'Please continue to coin... ');


}


}


}


//应用控制系统


void appdemo_show(void)


{


sys_parm_init();//系统参数初始化


ctrl_pin_init();


key_matrix_init();


BEEP_Init();


lcd1602_init();//LCD1602初始化


sys_open_show();//系统开机界面显示


while(1)


{


sys_fun_ctrl();//系统功能控制


}


}


三、实验现象

图片


关键字:STM32  单片机 引用地址:STM32单片机自动售货机系统设计

上一篇:STM32单片机步进电机控制系统设计案例
下一篇:利用STM32CubeMX解读时钟树

推荐阅读最新更新时间:2024-11-17 11:09

STM32之串口通信
串口通信原理 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹
[单片机]
<font color='red'>STM32</font>之串口通信
STM8L151C8单片机学习例程(8)——内部参考电压ADC_Vrefint采集电源电压
STM8L_8_ADC_Vrefint: 1.User:工程及main文件 2.Hardware:ADC,USART,CLK,LED,Delay 3.STM8L15x_StdPeriph_Driver:STM8自带库文件 4.Debug:hex文件存放于EXE文件夹 5.Function: ADC_Vrefint采集,串口发送电源电压值 /** ****************************************************************************** * @file main.c * @author Alex——小白 * @version V1.0 * @da
[单片机]
STM8L151C8<font color='red'>单片机</font>学习例程(8)——内部参考电压ADC_Vrefint采集电源电压
esp32能取代stm32吗?哪个好?
在学生群体或许能替代,因为超高性价比。 站在产品的角度替代不了,产品选型考虑的因素很多。 ESP32和STM32都是广泛使用的微控制器,它们都有自己的优缺点。 如果简单地说一个完全可以取代另一个,其实并不现实。 下面列举几个ESP32无法完全取代STM32的理由: 1. 应用场景 STM32的应用场景更加广阔,能做的产品更多。 ESP32通常用于物联网设备,家庭自动化,Wi-Fi控制,而STM32更适合用于消费类、工业控制、机器人、医疗设备、汽车等应用程序。 通常情况,ESP32更多是作为一个蓝牙、WiFi的中继功能。 如果考虑到产品后续的功能升级,比较好的方式是STM32或者其它MCU+ESP32,这样后面扩展更加灵活。 如
[单片机]
STM32实现电机的正反转
2019年7月22日 今天是做小车过程中的第二天,今天写一下单纯的实现电机的正反转。(但是还是不会实现PWM调速)代码如下: /***********************************************/ .H 代码 #ifndef __MOTOR1_H #define __MOTOR1_H #include “stm32f10x.h” //#include “stm32f10x_gpio.h” #define High 1 //宏定义 高为1 #define Low 0 //宏定义 低为0 #define IN1(a) if (a) GPIO_SetBits(GPIOA,GPIO_Pin_4); //如果真
[单片机]
分时操作系统思想在单片机中的具体应用
随着单片机技术的发展,单片机开发的理念也在不断更新:逐步采用高性能的16/32位单片机,采用C、JAVA等高级语言编程,采用RTOS及其平台进行开发已经成为一种趋势。 分时操作系统概述 分时操作系统把CPU的时间划分成长短基本相同的时间区间,即"时间片",操作系统轮流分配给各个作业使用。某个作业在时间片结束完成,该作业将被挂起,等待下一轮循环再继续做。分时操作系统主要具有以下3个特点:多路性,用户通过各自的终端,可以同时使用一个系统。及时性,用户提出的各种要求,能在较短或可容忍的时间内得到响应和处理。独占性,在分时系统中,虽然允许多个用户同时使用一个 CPU,但用户之间操作独立,互不干涉。 分时操作系统主要是针对小型机以上的
[单片机]
分时操作<font color='red'>系统</font>思想在<font color='red'>单片机</font>中的具体应用
ATMega16单片机外部中断的使用
// Crystal: 7.3728M Hz ,功能:学习外部中断0的程序 #include iom16v.h #include macros.h #define LED _COM PORTA ^= (1 PA6) // void port_init(void) { PORTA = 0x40; DDRA = 0x40; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x04; DDRD = 0x00;
[单片机]
开关电源的抗干扰分析
  引言    开关电源 产生的干扰,按噪声干扰源种类来分,可以分为尖锋干扰和谐波干扰;若按耦合通路来分,可分为传导干扰和辐射干扰,开关电路框图如图1。   2 开关电源的主要干扰   2.1 一次整流回路的干扰   开关电源中的主要噪声干扰之一是由二极管断开时的反向恢复现象引起的,一次整流回路中的整流二极管正向导通时有较大的正向电流流过,它受反偏电压而转向截止时,由于PN结中有较多的载流子积累,因而在载流子消失前的一段时间,电流会反向流动,从而导致很大的电流变化。即一次整流回路的干扰。   2.2 开关回路的干扰   电源工作时,开关处于高频通断状态,在高频电流环路中,可能会产生较大的空间辐射噪声。   2.
[单片机]
开关电源的抗干扰分析
基于GD32A503车规级MCU的车窗纹波防夹解决方案
随着现代汽车技术的不断发展,人们追求更加舒适和便于操作的驾驶环境。因此,越来越多的汽车上安装了电动车窗,从而实现车窗的自动升降。然而,由于电动车窗上升速度较快且驱动力较大(最强可达52.6公斤),在电动车窗接近顶端时,如果没有保护措施,很容易夹伤乘客,尤其是对儿童乘坐形成较大安全隐患。因此,基于乘客安全和乘坐舒适度考虑,电动车窗需要有防夹功能。电动车窗防夹可用于汽车电动车窗、电动天窗玻璃的防夹伤控制以及升降电机的过载保护。 防夹功能主要是指当车窗上升的过程中遇到障碍物(如手、头等)时,可以识别出车窗处于夹持状态,并令其立即停止上升并反向下降,从而避免事故的发生。防夹玻璃升降器按防夹形式可分为接触式防夹和非接触式防夹。接触式防夹
[嵌入式]
基于GD32A503车规级<font color='red'>MCU</font>的车窗纹波防夹解决方案
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved