最近设计了一个项目基于单片机的RFID餐饮自助控制系统设计,与大家分享一下:
一、基本介绍
项目名:基于单片机的RFID餐饮自助的设计
项目编号:mcuclub-dz-004
单片机:STC89C52
功能简介:
1、通过三个纽扣标签识别不同菜品和单价(青椒土豆丝 12元/千克 | 木须肉 20元/kg | 鱼香肉丝 22元/kg)
2、通过称重模块测量重量(*.*kg),按下“A”键确认称重完成,则显示该菜品价格(**.*元)
3、通过“B”键按下,显示总价(**.*元),并通过语音播报总价
4、通过LCD12864显示数据
二、51实物图
单片机型号:STC89C52
板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。
供电接口:TYPE-C
三、51仿真图
仿真软件版本:proteus8.9
电路连线方式:网络标号连线方式
注意:部分实物元器件仿真中没有,仿真中会用其他工作原理相似的元件代替,这样可能导致实物程序和仿真程序不一样
四、原理图
软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图
五、PCB图
由原理图导出,封装很大一部分都是作者自己绘制,不提供封装库,只提供连接好的源文件。中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。
六、系统框图
本设计以STC89C52单片机为核心控制器,加上其他的模块一起组成RFID刷卡的整个系统,其中包含中控部分、输入部分和输出部分。中控部分采用了STC89C52单片机,其主要作用是获取输入部分数据,经过内部处理,控制输出部分。输入由四部分组成,第一部分是RFID刷卡模块,通过该模块检测当前用户需要购买的商品;第二部分是称重模块,通过该模块可以检测当前顾客购买该商品的重量;第三部分是独立按键,通过独立按键完成称重和语音播报;第四部分是供电电路,给整个系统进行供电。输出由两部分组成,第一部分是LCD12864显示模块,通过该模块可以显示当前总重量、当前购买的物品、总价格等;第二部分是语音播报当前购买的总价格。
七、软件设计流程
系统的主流程图如图4-2所示;在主程序中:首先对各个模块进行初始化,随后进入while主循环,在主循环中,首先进入第一个函数按键函数,该函数主要分为两部分,第一部分为调用按键扫描函数获取按键键值,第二部分通过键值进行相应的处理操作,比如切换界面、调整温度湿度阈值等;接着进入第二个函数监测函数,该函数主要通过温湿度检测模块检测当前的环境温度和湿度;之后进入第三个函数显示函数,该函数通过不同的显示标志位显示不同的界面,包括主界面显示当前的温度和湿度值,其他界面显示温度阈值、湿度阈值等;最后进入第四个函数处理函数,该函数主要判断当前温度和湿度是否在设置的阈值之内,如果温度不在阈值内,则进行制冷或加热,并且蜂鸣器进行报警处理;如果湿度不在阈值内,则进行加湿或者除湿,蜂鸣器进行报警处理。最后,通过一个延时函数和计数公式,限制各函数扫描时间。
八、部分程序展示
软件版本:keil5
逻辑程序和驱动程序分开,分布于main.c和其他.c文件
*******显示函数
*****/
void Display_function(void)
{
if(flag_display == 0)
{
flag_xss = 0;
switch(flag_menu) //显示菜品名
{
case 0:
LCD12864_Display_Hanzi(1,3," 欢迎光临");
break;
case 1:
LCD12864_Display_Hanzi(1,3,"青椒土豆丝");
break;
case 2:
LCD12864_Display_Hanzi(1,3," 木须肉 ");
break;
case 3:
LCD12864_Display_Hanzi(1,3," 鱼香肉丝");
break;
default:
break;
}
memset(display_buf,' ',16);
sprintf(display_buf,"单价:%d元/千克",(int)flag_price); //显示单价
LCD12864_Display_Hanzi(2,1,display_buf);
memset(display_buf,' ',16);
sprintf(display_buf,"重量:%ld.%ldkg ",weight_value/1000,(weight_value%1000)/100); //显示重量
LCD12864_Display_Hanzi(3,1,display_buf);
memset(display_buf,' ',16);
sprintf(display_buf,"价格:%02d.%d元 ",price/10,price%10); //显示单次价格
LCD12864_Display_Hanzi(4,1,display_buf);
}
else
{
if(flag_xss == 0)
{
flag_xss = 1;
if(price_qjtds > 0)
{
flag_xs++;
memset(display_buf,' ',16);
sprintf(display_buf,"土豆丝:%02d.%d元 ",price_qjtds/10,price_qjtds%10); //显示青椒土豆丝价格
LCD12864_Display_Hanzi(flag_xs,1,display_buf);
}
if(price_mxr > 0)
{
flag_xs++;
memset(display_buf,' ',16);
sprintf(display_buf,"木须肉:%02d.%d元 ",price_mxr/10,price_mxr%10); //显示木须肉价格
LCD12864_Display_Hanzi(flag_xs,1,display_buf);
}
if(price_yxrs > 0)
{
flag_xs++;
memset(display_buf,' ',16);
sprintf(display_buf,"鱼香肉丝:%02d.%d元 ",price_yxrs/10,price_yxrs%10); //显示鱼香肉丝价格
LCD12864_Display_Hanzi(flag_xs,1,display_buf);
}
}
flag_xs = 0;
memset(display_buf,' ',16);
sprintf(display_buf,"总价:%02d.%d元 ",total_price/10,total_price%10); //显示总价
LCD12864_Display_Hanzi(4,1,display_buf);
}
}
/****
*******处理函数
*****/
void Manage_function(void)
{
if(flag_5s) //5s后回到点餐界面
{
flag_price = 0;
flag_5s = 0;
flag_timer_begin = 0;
flag_menu = 0;
flag_display = 0;
total_price = 0;
price_qjtds = 0;
price_mxr = 0;
price_yxrs = 0;
flag_display = 0;
LCD12864_Clean_All();
}
if(weight_value <= 50)
{
price_value = 0;
price = 0;
}
else
{
price_value = flag_price*(weight_value/100); //单次价格,角
}
}