標題: 基于51單片機的自動存儲柜系統(tǒng)設計 by KIZAI [打印本頁]

作者: 小雞仔666    時間: 2019-6-25 20:36
標題: 基于51單片機的自動存儲柜系統(tǒng)設計 by KIZAI
本人是一名大二的高職院學生,這只是本人的一個練習設計,寫這個貼子主要是為了讓想學單片機的師兄可以做下參考,這只是一個比較簡單的案例,以下我把我的設計文檔分享給大家,主要是給你們參考,希望大家學電子專業(yè)不是為了渾水摸魚,有什么不懂的可以加我qq問我!大家互相學習。!阿里嘎多。!

摘要
    本設計以AT89C52為主控制器,來實現(xiàn)通過密碼的比對完成自動存取包過程的設計。整個系統(tǒng)由控制模塊、LCD1602顯示模塊和矩陣按鍵模塊組成。
    此自動存包柜系統(tǒng)能控制4個存包柜,它利用控制柜門的打開,當顧客按“存包”或“取包”鍵時,相應的空柜門會自動打開(本項目通過亮燈表示打開),并且能產(chǎn)生一組4位數(shù)的隨機密碼,密碼使用一次有效,且有三次容錯功能和解鎖功能,所以安全性能很高。由于隨機密碼是軟件產(chǎn)生,使得硬件更為經(jīng)濟實用、簡單且便于安裝。
第一節(jié)    控制系統(tǒng)的工作原理及技術要求

本系統(tǒng)采用AT89C52單片機為主控制器,可以同時管理4個存包柜。當顧客需要存包的時候,可以自行到存包柜前按“存”鍵,單片機接收到一脈沖信號,并通過系統(tǒng)I/O口發(fā)出相應的信號,控制鎖柜門的電磁閥將一空箱打開(用對應的燈表示),顧客即可存包。當顧客需要取包時,只要手動輸入密碼就會把信息輸出相應的高低電平信號傳給單片機,系統(tǒng)比較密碼一致后,打開相應的箱子,顧客可以取包。
本系統(tǒng)要求具有較高的自動化程度,以AT89C52單片機為核心,通過按鍵控制柜門(燈)的打開。關門后通過LCD1602顯示柜子的信息;實時顯示無物的箱體號。并具有斷電保護功能。
第二節(jié)  自動存包柜系統(tǒng)框圖

該系統(tǒng)MC51單片機為核心,還有空箱顯示,斷電保護等部分。



圖 1-1 自動存包柜系統(tǒng)框圖

第二節(jié)    電路設計一、  按鍵、矩陣輸入電路

按鍵、矩陣按鍵圖如圖1-2。該系統(tǒng)中鍵盤的主要功能是用于顧客選擇適當?shù)墓駚泶姘,這里我們用3x4矩陣式鍵盤和兩個獨立按鍵,用獨立按鍵來實現(xiàn)存取的功能,矩陣鍵盤實現(xiàn)密碼解鎖功能,矩陣鍵盤有一個確定按鍵,鍵盤是用AT89C52通過橫縱掃描方式實現(xiàn)矩陣鍵盤的功能,使用編程掃描方式可以很容易的實現(xiàn)鍵盤和顯示的功能及消抖功能。
file:///C:/Users/THIC-PC/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png
圖 1-2  按鍵和矩陣按鍵電路
二、  對應柜子燈設計

提示電路圖1-3。由于時間和耗材不足的問題,就沒有準備做機械開關,只能通過燈亮滅情況來說明柜子的情況,我采用低電平觸發(fā),由于單片機I/O的電壓過低,燈的功率過大都可能影響燈的高度,從而影響實際體驗,所以把燈采用共陽低電平觸發(fā),保證顯示效果。



圖 1-3  提示燈電路設計
三、  報警模塊電路設計

報警電路圖1-4。為了提醒顧客密碼輸入錯誤或提醒柜子全都被使用而設計的報警模塊。
報警電路使用到的是有源蜂鳴器,所以要有三極管來驅(qū)動提供足夠的電壓來驅(qū)使蜂鳴器發(fā)聲,所以我們把信號傳到三極管的基極讓三極管為蜂鳴器提供
動力。
圖 1-4  報警模塊設計
四、  主控制器電路設計

主控制器電路圖1-4。本項目采用的主控是89C52,基本的晶振設計和復位電路都必須要具備的,還有一個復位按鍵,可以在單片機卡BUG的時候可以進行復位。


圖 1-5  主控電路設計
程序主要源代碼
主函數(shù)部分
#include "LCD1602.h”
#include "TIME0.h"   
#include "Key_scan.h"
#include<stdlib.h>//數(shù)學運算的頭文件
uchar cabinet_1=0; //一號柜子空/滿的標志位
uchar cabinet_2=0; //二號柜子空/滿的標志位
uchar cabinet_3=0; //三號柜子空/滿的標志位
uchar cabinet_4=0; //四號柜子空/滿的標志位
uchar FULL_flag=1; //柜子全部是空標志

uint Cipher_1=0;    //一號柜子密碼緩存
uint Cipher_2=0;    //二號柜子密碼緩存
uint Cipher_3=0;    //三號柜子密碼緩存
uint Cipher_4=0;   //四號柜子密碼緩存

#define default_1 1111     //一號柜子的默認密碼1111
#define default_2 2222     //二號柜子的默認密碼2222
#define default_3 3333     //三號柜子的默認密碼3333
#define default_4 4444    //四號柜子的默認密碼4444

uchar lcd_The_first_line[16]={"1-NULL    2-NULL"};
uchar lcd_The_second_line[16]={"3-NULL    4-NULL"};
{
  if(cabinet_1){lcd_The_first_line[2]='F';}else{lcd_The_first_line[2]='N';}
  if(cabinet_2){lcd_The_first_line[12]='F';}else{lcd_The_first_line[12]='N';}
  if(cabinet_3){lcd_The_second_line[2]='F';}else{lcd_The_second_line[2]='N';}
   if(cabinet_4){lcd_The_second_line[12]='F';}else{lcd_The_second_line[12]='N';}
   WriteChar(1,0,16,lcd_The_first_line);   
   WriteChar(2,0,16,lcd_The_second_line);
}void System_init(void)
{
   LED_ALL_ON();
   Delay_ms(500);
   LED_ALL_OFF();
   Delay_ms(500);

   LED_ALL_ON();
   Delay_ms(500);
   LED_ALL_OFF();
   Delay_ms(500);

   LED_ALL_ON();
   Delay_ms(500);
   LED_ALL_OFF();
   Delay_ms(500);

   BUZZER_ON();
   LED_ALL_ON();
   Delay_ms(1000);
   BUZZER_OFF();
   LED_ALL_OFF();
   Delay_ms(1000);
}
//存東西函數(shù)
uint Random_Cipher(uchar CH)
{
   uint Cipher_val;
   ucharCipher_all[16]={"Cipher:     CH:"};
   if(CH==1)Cipher_all[15]='1';
   elseif(CH==2)Cipher_all[15]='2';
   elseif(CH==3)Cipher_all[15]='3';
   elseif(CH==4)Cipher_all[15]='4';
   srand(count);//設置隨機數(shù)種子
   Cipher_val=rand()%1000; //調(diào)用隨機函數(shù),產(chǎn)生一個1000以內(nèi)的函數(shù),用作隨機密碼。
   Cipher_all[7]=Cipher_val/1000+0x30;
   Cipher_all[8]=Cipher_val/100%10+0x30;
   Cipher_all[9]=Cipher_val/10%10+0x30;
   Cipher_all[10]=Cipher_val%10+0x30;   
   WriteChar(1,0,16,"Pleaseremember  ");
   WriteChar(2,0,16,Cipher_all);
   return Cipher_val;
}
void Storage(void)
{
   if(!cabinet_1){cabinet_1=1;FULL_flag=0;LED1=1;Cipher_1=Random_Cipher(1);}//第一個柜子是空的
  else if(!cabinet_2){cabinet_2=1;FULL_flag=0;LED2=1;Cipher_2=Random_Cipher(2);} //第二個柜子是空的
  elseif(!cabinet_3){cabinet_3=1;FULL_flag=0;LED3=1;Cipher_3=Random_Cipher(3);} //第三個柜子是空的
  elseif(!cabinet_4){cabinet_4=1;FULL_flag=0;LED4=1;Cipher_4=Random_Cipher(4);} //第四個柜子是空的
   else
   {
        //FULL_flag=1;
        WriteChar(1,0,16,"Sorry!Full load");
        WriteChar(2,0,16,"Thankyou....   ");
        BUZZER_ON();Delay_ms(2000);BUZZER_OFF();//蜂鳴器提醒
   }
   while((uchar)Key_scan()!=11);{LCD_DISP_ALL();/*LED_ALL_OFF;*/}
void Extract(void)
{
   uchar i=0,j=0;
   uint Cipher_val;
   ucharCipher_all[16]={"Cipher:        "};
   if(FULL_flag)
   {
        WriteChar(1,0,16,"Sorry!No-load  ");
        WriteChar(2,0,16,"Thankyou....   ");
        BUZZER_ON();Delay_ms(2000);BUZZER_OFF();
        Delay_ms(4000);
        LCD_DISP_ALL();
   }
   else
   {
        WriteChar(1,0,16,"Pleaseinput     ");
        WriteChar(2,0,16,Cipher_all);
        while(1)
        {
              i=Key_scan();//掃描函數(shù)0-9確認
              if(i!=11&&i!=12&&i!=13&&j<4)//4位密碼數(shù)
              {   
                   Cipher_all[8+j++]=(i+0x30);
                   WriteChar(2,0,16,Cipher_all);
              }
              if(i==11)//確認鍵,比較密碼是否正確
              {
                   Cipher_val=(Cipher_all[8]-0x30)*1000+(Cipher_all[9]-0x30)*100+(Cipher_all[10]-0x30)*10+(Cipher_all[11]-0x30);   
                  if(Cipher_val==Cipher_1||Cipher_val==default_1){cabinet_1=0;LED1=0;}
                  if(Cipher_val==Cipher_2||Cipher_val==default_2){cabinet_2=0;LED2=0;}
   if(Cipher_val==Cipher_3||Cipher_val==default_3){cabinet_3=0;LED3=0;}      if(Cipher_val==Cipher_4||Cipher_val==default_4){cabinet_4=0;LED4=0;}
   if(cabinet_1==0&&cabinet_2==0&&cabinet_3==0&&cabinet_4==0)FULL_flag=1;

               if(Cipher_val==Cipher_1||Cipher_val==Cipher_2||Cipher_val==Cipher_3||Cipher_val==Cipher_4||Cipher_val==default_1||Cipher_val==default_2||Cipher_val==default_3||Cipher_val==default_4)
                   {
                         WriteChar(1,0,16,"CipherCorrect ! ");
                         WriteChar(2,0,16,"Goodluck....    ");
                         BUZZER_ON();Delay_ms(2000);BUZZER_OFF();
                   }
                   else
                   {
                         WriteChar(1,0,16,"CipherError!   ");
                         WriteChar(2,0,16,"Reenter!!!     ");
                         BUZZER_ON();Delay_ms(6000);BUZZER_OFF();     
                   }
                   Delay_ms(4000);
                   LCD_DISP_ALL();
                   /*LED_ALL_OFF();*/
                   break;
              }
        }
   }   
}
void main(void)
{
   System_init();
   Time0_Init();

   LCD_Init();   
  LCD_DISP_ALL();
  while(1)
   {   
        if(!Save){Delay_ms(10);while(!Save);Storage();}//存鍵
        if(!Take){Delay_ms(10);while(!Take);Extract();}//取鍵
   }
}
比較難的部分都寫好注解了
其他代碼自己寫,不會就多看書,問度娘,只要你不是睿智的,只要花點時間就會寫,別給自己找太多借口,不然你永遠無法進步。

接下來是PCB的布局和成品的樣子



注意可調(diào)電阻二號腳的位置



這是成品的板子



具體效果樣圖



補充一句,如果你需要這塊板子可以私聊我,板子是白色的。

第一次發(fā)帖,請大家多多指教!



作者: in阿基諾    時間: 2020-4-9 13:24
頭文件可以發(fā)出來研究一下嗎
作者: in阿基諾    時間: 2020-4-9 13:25
本篇文章寫的特別好,可以把頭文件發(fā)出來研究一下嗎
作者: 敵敵歪    時間: 2021-4-3 19:46
您好!可以發(fā)下完整代碼嗎?小白想學習下 謝謝~
作者: liuben    時間: 2021-5-27 12:10
完整代碼可以分享一下嗎




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1