毕业设计 - 题目:基于单片机的智能快递柜设计与实现

文章目录

  • 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,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目

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

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

技术解答、毕设帮助、开题指导
print("Q 746876041") 

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 语言, 以实现本次设计所需要的功能。

毕业设计 - 题目:基于单片机的智能快递柜设计与实现_第1张图片

3.2 硬件部分

3.2.1 GMS模块

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

毕业设计 - 题目:基于单片机的智能快递柜设计与实现_第2张图片

毕业设计 - 题目:基于单片机的智能快递柜设计与实现_第3张图片

3.2.2 按键模块

毕业设计 - 题目:基于单片机的智能快递柜设计与实现_第4张图片

3.2.3 显示模块

毕业设计 - 题目:基于单片机的智能快递柜设计与实现_第5张图片

3.2.4 继电器模块

毕业设计 - 题目:基于单片机的智能快递柜设计与实现_第6张图片

3.2.5 蜂鸣器模块

毕业设计 - 题目:基于单片机的智能快递柜设计与实现_第7张图片

3.3 软件部分

3.3.1 主程序设计

毕业设计 - 题目:基于单片机的智能快递柜设计与实现_第8张图片

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

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

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

3.3.2 GMS程序设计

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

毕业设计 - 题目:基于单片机的智能快递柜设计与实现_第9张图片

3.4 实现效果

毕业设计 - 题目:基于单片机的智能快递柜设计与实现_第10张图片
毕业设计 - 题目:基于单片机的智能快递柜设计与实现_第11张图片

毕业设计 - 题目:基于单片机的智能快递柜设计与实现_第12张图片

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();
}
}
}




/*******************************************************************
篇幅有限,只展示部分代码
作者:丹成学长,Q746876041
********************************************************************/



4 最后

技术解答、毕设帮助、开题指导
print("Q 746876041") 

请添加图片描述

单片机毕设项目大全:
https://blog.csdn.net/huawei123444/article/details/119822845

你可能感兴趣的:(单片机设计,毕业设计,单片机,智能快递柜,智能快递箱,毕业设计,物联网毕设)