文章目錄
- 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 語言, 以實作本次設計所需要的功能,

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();
}
}
}
/*******************************************************************
篇幅有限,只展示部分代碼
作者:丹成學長,Q746876041
********************************************************************/
4 最后
技術解答、畢設幫助、開題指導
print("Q 746876041")

單片機畢設專案大全:
https://blog.csdn.net/huawei123444/article/details/119822845
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/317664.html
標籤:其他
上一篇:基于ESP8266 HX711 克級單位稱重式壓力傳感器(接入阿里云物聯網平臺)—— 看到有點意思,所以我也照著做了一個
