模块说明:
- STC89C52:主控芯片
- LCD12864(带字库版本):用于显示商品价格以及数量状态
- SIM800L短信模块:用于向管理员发送短信 提示无货信息
- 蜂鸣器:用于按键提示以及状态提示
- 电机马达:用于模拟物品出库
- 矩阵键盘:用于选择商品以及模拟充值
功能介绍:
- 选择一个商品,确认后,电机转动,将物品推出。后台界面需要输入密码进入,进入后查看库存,以及补货。结算界面,结算时,显示结算中,差不多停留显示3~5秒,商品购买完成可以进行退款或继续购物选择。
- 商品确认选择后,界面显示商品出库中 5~10秒
- 后台界面,按一个按键切换显示库存或价格,可以修改库存或者选择修改价格
- 无货的情况,商品选择界面价格替换为无货两个字
- 在购买结束后,如果货品数量为1或者0则发送短信至代码中写好的电话号码提醒补货
- 后台界面密码:123456
硬件框图:
软件流程图:
原理图:
使用立创EDA格式打开,打开方式为将文件夹内 .json 后缀文件拖入嘉立创EDA(标准版) - 免费、易用、强大的在线电路设计软件 立创EDA编辑网站中即可
本次原理图使用立创EDA画出的,对于新手较为方便,全中文易上手,不需要安装任何软件。另,Altium Designer 格式打开后标注会有所丢失,建议使用立创EDA
Proteus仿真图:
实物正反图:
元器件清单:
主要代码展示:
/********************* 函数声明 *******************/
//显示界面 每个菜单的结构
void Dis_menu();
//按键扫描
void Key_Scan();
//定时器0初始化
void timer0_init();
//短信发送
void SIM800_send(uchar Select_Num, uchar Inventory_Num);
//使用串口需要你的芯片晶振是11.0592M hz 的 记住!!!
//注意 定时器1 和 串口 都是使用同一个计数器,所以不能同时使用!!!
//串口初始化---9600bps
void Uart_init();
//发送一个字节的数据 也就是一个单词或者数字
void UartSendByte(uchar byte);
//发送字符串
void UartSendString(uchar* string);
void main()
{
DelayMs(100);//等待系统稳定
LcmInit();
Dis_menu();
timer0_init();//定时器0初始化
Uart_init();//串口初始化---9600bps
while (1)
{
Key_Scan();//按键扫描
}
}
//按键扫描
void Key_Scan()
{
uchar Key_Value;
Key_Value = Getkeyboard(0);
if (Key_Value != 0xff)
{
Beep_Cnt += 2;
if (menu == 0 || menu == 6)
{
menu = 1;
Dis_menu();
return;
}
}
switch (Key_Value)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
{
if (menu == 1)
{
if (Key_Value < 10 && Input_Pw_Cnt < 6)
{
Input_PassWord[Input_Pw_Cnt] = Key_Value;
Input_Pw_Cnt++;
}
}
else if (menu == 2)
{
if (Input_Money + Key_Value * 10 < 1000)
{
if (Key_Value == 0)
{
if (Input_Money + 5 < 1000)
Input_Money += 5;//加0.5元
}
else
{
Input_Money += Key_Value * 10;
}
}
Dis_menu();
}
else if (menu == 5)//选择继续购物还是退钱
{
if (Key_Value == 1)
{
menu = 1;
Dis_menu();
}
else if (Key_Value == 2)
{
menu = 6;
Dis_menu();
Input_Money = 0;
All_Price = 0;
Select_Menu = 0;
}
}
break;
}
case 14://密码清零
{
if (menu == 1)
{
memset(Input_PassWord, 0, 6);
Input_Pw_Cnt = 0;
}
else if (menu == 8)
{
Flag_Inv_Dis = !Flag_Inv_Dis;
Dis_menu();
}
break;
}
case 15://验证密码
{
if (menu == 1)
{
if (Input_Pw_Cnt == 6 && memcmp(Input_PassWord, PassWord, 6) == 0)
{
//验证成功
menu = 7;
Dis_menu();
Input_Pw_Cnt = 0;
memset(Input_PassWord, 0, 6);
DelayMs(1500);
menu = 8;
Dis_menu();
}
else
{
memset(Input_PassWord, 0, 6);
Input_Pw_Cnt = 0;
}
}
else if (menu == 8)
{
menu = 0;
Dis_menu();
}
break;
}
case 10://确认按键
{
if (menu == 1)
{
if (Goods_Dat[Select_Menu].Inventory > 0)
menu = 2;
}
else if (menu == 2)//确认商品
{
if (Input_Money >= Goods_Dat[Select_Menu].Price)
{
menu = 4;
//扣掉充值的钱
Input_Money = Input_Money - Goods_Dat[Select_Menu].Price;
Dis_menu();
//电机转动
Moto = 0;
DelayMs(3000);
//电机停止
Moto = 1;
All_Price = All_Price + Goods_Dat[Select_Menu].Price;
if (Goods_Dat[Select_Menu].Inventory > 0)
Goods_Dat[Select_Menu].Inventory--;//交易成功,减少库存
if (Goods_Dat[Select_Menu].Inventory < 2)//库存少于2则发送短信
{
menu = 9;
Dis_menu();
SIM800_send(Select_Menu + 1, Goods_Dat[Select_Menu].Inventory);
}
menu = 5;
//记录累计价格
}
else
{
menu = 3;
Dis_menu();
DelayMs(2000);
menu = 2;
}
}
else if (menu == 8)
{
if (Flag_Inv_Dis == 0)
{
if (Goods_Dat[Select_Menu].Price < 995)
Goods_Dat[Select_Menu].Price += 5;
}
else
{
if (Goods_Dat[Select_Menu].Inventory < 99)
Goods_Dat[Select_Menu].Inventory++;
}
}
Dis_menu();
break;
}
case 12://箭头下移
{
if (menu == 1 || menu == 8)
{
if (Select_Menu < GOODS_NUM_MAX - 1)
Select_Menu++;
Dis_menu();
}
break;
}
case 11://箭头上移
{
if (menu == 1 || menu == 8)
{
if (Select_Menu > 0)
Select_Menu--;
Dis_menu();
}
break;
}
case 13:
{
if (menu == 2)
{
menu = 5;
Dis_menu();
break;
}
else if (menu < 2)
{
menu--;
}
else if (menu == 8)
{
if (Flag_Inv_Dis == 0)
{
if (Goods_Dat[Select_Menu].Price > 5)
Goods_Dat[Select_Menu].Price -= 5;
}
else
{
if (Goods_Dat[Select_Menu].Inventory > 3)
Goods_Dat[Select_Menu].Inventory--;
}
}
Dis_menu();
}
default:
break;
}
}
工程管理展示:
下载内容展示:
更多详细功能与代码视频讲解请B站搜索:易佳电子设计 主页搜索该设计编号,视频置顶评论有资料下载链接!