【51毕业设计案例】【012】自动售货机设计-基于51单片机

模块说明:

  1. STC89C52:主控芯片
  2. LCD12864(带字库版本):用于显示商品价格以及数量状态
  3. SIM800L短信模块:用于向管理员发送短信 提示无货信息
  4. 蜂鸣器:用于按键提示以及状态提示
  5. 电机马达:用于模拟物品出库
  6. 矩阵键盘:用于选择商品以及模拟充值

功能介绍:

  1. 选择一个商品,确认后,电机转动,将物品推出。后台界面需要输入密码进入,进入后查看库存,以及补货。结算界面,结算时,显示结算中,差不多停留显示3~5秒,商品购买完成可以进行退款或继续购物选择。
  2. 商品确认选择后,界面显示商品出库中 5~10秒
  3. 后台界面,按一个按键切换显示库存或价格,可以修改库存或者选择修改价格
  4. 无货的情况,商品选择界面价格替换为无货两个字
  5. 在购买结束后,如果货品数量为1或者0则发送短信至代码中写好的电话号码提醒补货
  6. 后台界面密码: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站搜索:易佳电子设计 主页搜索该设计编号视频置顶评论有资料下载链接!

视频链接:【51毕业设计案例】【012】自动售货机设计-基于51单片机_哔哩哔哩_bilibili

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值