【STM32物联网】基于单片机的智能快递柜设计与实现

文章目录

  • 1 简介
  • 2 绪论
  • 2.1 课题背景与目的
  • 3 系统设计
  • 3.1 系统架构
  • 3.2 硬件部分
  • 3.2.1 GMS模块
  • 3.2.2 按键模块
  • 3.2.3 显示模块
  • 3.2.4 继电器模块
  • 3.2.5 蜂鸣器模块
  • 3.3 软件部分
  • 3.3.1 主程序设计
  • 3.3.2 GMS程序设计
  • 3.4 实现效果
  • 3.5 部分相关代码
  • 4 最后

  • 1 简介

    Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目

    基于单片机的智能快递柜设计与实现

    大家可用于 课程设计 或 毕业设计

    单片机-嵌入式毕设选题大全及项目分享:

    https://blog.csdn.net/m0_71572576/article/details/125409052

    2 绪论

    2.1 课题背景与目的

    一般来说,传统快递服务方式是人对人,即快递员进行揽件派送,与签收人进行面对面签收,确认无误后服务终止。这种传统快递方式虽然保证了包裹的一定安全,但效率低下,花费了双方大量的时间成本。而智能快递箱的诞生使得快递服务变得高效,它不再是门对门,或者是人对人的服务方式,智能快递箱就好比是中介,使得配送方和接收方的时间成本大大减少,更加自由。现在智能快递箱的应用在国内逐渐广泛。

    智能快递箱是基于GSM与单片机系统下的一款全天24小时自助服务的服务设备。智能快递箱以单片机STC89C52作为最小控制系统,GSM模块能够插入手机卡,快递人员输入密码进行解锁放柜处理,然后通过矩阵键盘输入手机号进行短信发送,完成将物品投递入柜的功能。取件人通过手机收到的短信,输入对应验证码能够解锁快递箱门,拿取对应快递,完成取件功能。

    3 系统设计

    智能快递箱设计是以单片机作为最小的控制系统,由GSM模块插入的手机移动通信卡辅助实现整个系统运行。在矩阵键盘上输入手机号发送短信,输入对应验证码可以解锁对应柜子编号,成功取得快递。

    该设计的技术难点有以下几个:

    (1)矩阵键盘是否能够完成对11位手机号码和6位验证码的正确输入。
    (2)取件人的手机号码输入完成后,GSM模块是否能够自动向取件人对应的手机发送取件码。
    (3)输入正确的取件码后,单片机需要对电控锁进行正确打开。成功的依据是显示屏能够显示之前的编号。
    (4)二次开发时,设计能力有限可能无法发挥产品的全部功能。

    3.1 系统架构

    (1) 该项目主要分为硬件系统与软件系统两个部分组成。 硬件系统由控制平台、 显示模块、 GSM 模块等组成。 软件系统则有 KEIL 软件上编译 C 程序以及刻录软件构成。

    (2) 在掌握单片机工作原理的基础上, 还需要雄厚的 C 语言编译技术作为知识基底, 利用 KEIL 程序, 在其上面编写 C 语言, 以实现本次设计所需要的功能。

    3.2 硬件部分

    3.2.1 GMS模块

    GSM 模块是将 GSM 射频芯片、 基带处理芯片、 存储器、 功放器件等集成在一块线路板上, 具有独立的操作系统、 GSM 射频处理、 基带处理并提供标准接口的功能模块, 包括发送短信, 语音通话以及数据传输的基本通信功能。

    3.2.2 按键模块

    3.2.3 显示模块

    3.2.4 继电器模块

    3.2.5 蜂鸣器模块

    3.3 软件部分

    3.3.1 主程序设计

    主程序主要要解决两部分问题, 一是快递员存储快递, 二是取件人拿去快递。

    快递员存储快递后需输入命令, 即输入用户11 位手机号码。 GSM 模块接收到 AT 指令后, 生成验证码并将指令转化成信号发送至单片机上。

    单片机接收到信号, 生成信息发送至取件人的手机上。 取件人可以依据收到的短信中的验证码进行取件步骤, 如若输入正确的验证码, 快递箱门将会成功打开, 继续等下一个指令; 否则, LED 显示灯将会显示警告并且蜂鸣器电路会工作进行报警。

    3.3.2 GMS程序设计

    GSM 程序设计主要解决的问题就是收到 AT 指令时, 能够成功生成验证码及发送验证码到对应收件人的手机上。 在设置短息的号码时, 因为手机号码为11 位, 所以我在编写程序时, 将两位数字位置颠倒, 确保了取件人可以接收到消息。

    3.4 实现效果


    3.5 部分相关代码

    
    /************************************************
     
     作者:丹成学长,Q746876041
    ************************************************/
    
    // 键盘部分代码
    void KeyDown()
    {
    char a = 0;
    GPIO_KEY=0x0f;
    while(1)
    {
    if(GPIO_KEY!=0x0f)//读取按键是否按下
    {
    Delay10ms(1);//延时 10ms 进行消抖
    if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
    {
    //测试列
    GPIO_KEY=0X0F;
    switch(GPIO_KEY)
    {
    case(0X07): KeyValue=0;break;
    case(0X0b): KeyValue=4;break;
    case(0X0d): KeyValue=8;break;
    case(0X0e): KeyValue=12;break;
    }
    //测试行
    GPIO_KEY=0XF0;
    switch(GPIO_KEY)
    {
    case(0X70): KeyValue=KeyValue+3;break;
    case(0Xb0): KeyValue=KeyValue+2;break;
    case(0Xd0): KeyValue=KeyValue+1;break;
    case(0Xe0):KeyValue=KeyValue;break;
    }
    ……
    显示模块部分源代码
    void get_rand(void)
    {
    bit_0 = rand(); //获取随机数
    user_pass[0] = (bit_0 % 10000)/1000;
    user_pass[1] = (bit_0 % 1000)/100;
    user_pass[2] = (bit_0 % 100)/10;
    user_pass[3] = bit_0 % 10;
    bit_1 = rand(); //获取随机数
    user_pass[4] = (bit_1 % 10000)/1000;
    user_pass[5] = (bit_1 % 1000)/100;
    // password[6] = (bit_1 % 100)/10;
    // password[7] = bit_1 % 10;
    /*
    LcdWriteCom(0x01); //清屏
    data_clean();
    PuZh_2[0] = user_pass[0]+0x30;
    PuZh_2[1] = user_pass[1]+0x30;
    PuZh_2[2] = user_pass[2]+0x30;
    PuZh_2[3] = user_pass[3]+0x30;
    PuZh_2[4] = user_pass[4]+0x30;
    PuZh_2[5] = user_pass[5]+0x30;
    display(); //显示
    */
    }
    void one_data(uchar *str) //显示第一行数据
    {
    unsigned char y;
    for(y=0;y<16;y++)
    {
    PuZh_1[y]=*str;
    str++;
    }
    }
    void two_data(uchar *str)//显示第一行数据
    {
    unsigned char y;
    for(y=0;y<16;y++)
    {
    PuZh_2[y]=*str;
    str++;
    }
    }
    void interface_dist()
    {
    one_data(" WELCOME ");
    two_data(" ");
    }
    void input_pass()
    {
    unsigned char j=0,z=0,x=0,y=0;
    LcdWriteCom(0x01); //清屏
    one_data(" EMS INPUT ");
    two_data(" ");
    display(); //显示
    j=6;
    z=0;
    // x=0;
    for(;;)
    …
    GSM 模块部分源代码
    void UsartConfiguration()
    {
    SCON=0X50; //设置为工作方式 1
    TMOD=0X20; //设置计数器工作方式 2
    TH1=0XFd; //计数器初始值设置, 注意波特率是 9600 的
    TL1=0XFd; //11.0592 晶振
    // PCON=0X80; //波特率加倍
    // TH1=0XF3; //计数器初始值设置, 注意波特率是 4800 的
    // TL1=0XF3; //12.0000 晶振
    ES=1; //打开接收中断
    EA=1; //打开总中断
    TR1=1; //打开计数器
    }
    //串行口连续发送 char 型数组, 遇到终止号/0 将停止
    void Uart1Sends(uchar *str)
    {
    while(*str!='\0')
    {
    SBUF=*str;
    while(!TI);//等待发送完成信号(TI=1) 出现
    TI=0;
    str++;
    }
    }
    void Uart1Send(uchar c)
    {
    SBUF=c;
    while(!TI);//等待发送完成信号(TI=1) 出现
    TI=0;
    }
    void pass_word()
    {
    char i;
    for(i=0;i<6;i++)
    {
    SBUF=0x30;
    while(!TI);//等待发送完成信号(TI=1) 出现
    TI=0;
    SBUF=0x30;
    while(!TI);//等待发送完成信号(TI=1) 出现
    TI=0;
    SBUF=0x33;
    while(!TI);//等待发送完成信号(TI=1) 出现
    TI=0;
    SBUF=0x30+user_pass[i];
    while(!TI);//等待发送完成信号(TI=1) 出现
    TI=0;
    }
    }
    void send_code()
    {
    get_rand();
    Uart1Sends("AT+CMGF=1\r\n");
    Delay10ms(200);//延时 2 秒
    Uart1Sends("AT+CSCS=\"UCS2\"\r\n");
    Delay10ms(200);//延时 2 秒
    Uart1Sends("AT+CSCA?\r\n");
    Delay10ms(200);//延时 2 秒
    Uart1Sends("AT+CSMP=\"17,167,0,24\"\r\n");
    Delay10ms(200);//延时 2 秒
    //15813366585
    Uart1Sends("AT+CMGS=\"00310035003800310033003300360036003500380035\"\r\n");//
    此处修改为对
    Delay10ms(200);//延时 2 秒
    Uart1Sends("8BF753D65FEB90129A8C8BC17801");
    pass_word();
    // Uart1Sends("9A8C8BC17801");//修改短信内容
    // Uart1Sends("00310033003300330033003300330039003200340033");//修改短信内容
    Delay10ms(200);//延时 2 秒
    Uart1Send(0x1a);
    Delay10ms(200);//延时 2 秒
    }
    void main(void)
    {
    unsigned char j=0,z=0,x=0;
    UsartConfiguration();
    // TMOD = 0X01; //设置定时器 T0 16 位
    // EA = 1; //打开中断
    // ET0 = 1; //打开 TO 定时器
    // TR0 = 1; //开启中断
    // TH0 = (65536-5000)/256;
    // TL0 = (65536-5000)%256;
    time = 0;
    BELL = 0;
    power = 0;
    LcdInit();
    error = 0;
    Delay10ms(50);
    i=0;
    LcdWriteCom(0x01); //清屏
    interface_dist(); //友好界面显示
    Delay10ms(50);
    display(); //显示
    while(1)
    {
    KeyDown();
    if(num == 10)
    {
    input_pass(); //输入密码
    if(error == 0)
    {
    LcdWriteCom(0x01); //清屏
    one_data(" WELCOME ");
    two_data(" SEND MESSAGE ");
    display(); //显示
    send_code();
    LcdWriteCom(0x01); //清屏
    one_data(" WELCOME ");
    two_data(" SEND SUCCESS ");
    display(); //显示
    Delay10ms(200);
    }
    }
    LcdWriteCom(0x01); //清屏
    interface_dist(); //友好界面显示
    Delay10ms(50);
    display(); //显示
    if(num==12)
    {
    user_input();
    }
    }
    }
    
    
    
    
    /*******************************************************************
    篇幅有限,只展示部分代码
    作者:丹成学长,Q532036360
    ********************************************************************/
    
    
    
    

    单片机-嵌入式毕设选题大全及项目分享:

    https://blog.csdn.net/m0_71572576/article/details/125409052

    4 最后

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【STM32物联网】基于单片机的智能快递柜设计与实现

    发表评论