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

发布时间:2024-09-03  

一、功能简介

本项目使用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();//系统功能控制


}


}


三、实验现象

图片


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>