找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6026|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)的自動(dòng)存儲(chǔ)柜系統(tǒng)設(shè)計(jì) by KIZAI

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本人是一名大二的高職院學(xué)生,這只是本人的一個(gè)練習(xí)設(shè)計(jì),寫這個(gè)貼子主要是為了讓想學(xué)單片機(jī)的師兄可以做下參考,這只是一個(gè)比較簡單的案例,以下我把我的設(shè)計(jì)文檔分享給大家,主要是給你們參考,希望大家學(xué)電子專業(yè)不是為了渾水摸魚,有什么不懂的可以加我qq問我!大家互相學(xué)習(xí)。!阿里嘎多。!

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

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

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



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

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

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

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



圖 1-3  提示燈電路設(shè)計(jì)
三、  報(bào)警模塊電路設(shè)計(jì)

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

主控制器電路圖1-4。本項(xiàng)目采用的主控是89C52,基本的晶振設(shè)計(jì)和復(fù)位電路都必須要具備的,還有一個(gè)復(fù)位按鍵,可以在單片機(jī)卡BUG的時(shí)候可以進(jìn)行復(fù)位。


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

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

#define default_1 1111     //一號(hào)柜子的默認(rèn)密碼1111
#define default_2 2222     //二號(hào)柜子的默認(rèn)密碼2222
#define default_3 3333     //三號(hào)柜子的默認(rèn)密碼3333
#define default_4 4444    //四號(hào)柜子的默認(rèn)密碼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è)置隨機(jī)數(shù)種子
   Cipher_val=rand()%1000; //調(diào)用隨機(jī)函數(shù),產(chǎn)生一個(gè)1000以內(nèi)的函數(shù),用作隨機(jī)密碼。
   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);}//第一個(gè)柜子是空的
  else if(!cabinet_2){cabinet_2=1;FULL_flag=0;LED2=1;Cipher_2=Random_Cipher(2);} //第二個(gè)柜子是空的
  elseif(!cabinet_3){cabinet_3=1;FULL_flag=0;LED3=1;Cipher_3=Random_Cipher(3);} //第三個(gè)柜子是空的
  elseif(!cabinet_4){cabinet_4=1;FULL_flag=0;LED4=1;Cipher_4=Random_Cipher(4);} //第四個(gè)柜子是空的
   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確認(rèn)
              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)//確認(rèn)鍵,比較密碼是否正確
              {
                   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();}//取鍵
   }
}
比較難的部分都寫好注解了
其他代碼自己寫,不會(huì)就多看書,問度娘,只要你不是睿智的,只要花點(diǎn)時(shí)間就會(huì)寫,別給自己找太多借口,不然你永遠(yuǎn)無法進(jìn)步。

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



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



這是成品的板子



具體效果樣圖



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

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


評分

參與人數(shù) 2黑幣 +65 收起 理由
彬Lsl + 15 很給力!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:718110 發(fā)表于 2020-4-9 13:24 | 只看該作者
頭文件可以發(fā)出來研究一下嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:718110 發(fā)表于 2020-4-9 13:25 | 只看該作者
本篇文章寫的特別好,可以把頭文件發(fā)出來研究一下嗎
回復(fù)

使用道具 舉報(bào)

地板
ID:621446 發(fā)表于 2021-4-3 19:46 | 只看該作者
您好!可以發(fā)下完整代碼嗎?小白想學(xué)習(xí)下 謝謝~
回復(fù)

使用道具 舉報(bào)

5#
ID:672473 發(fā)表于 2021-5-27 12:10 | 只看該作者
完整代碼可以分享一下嗎
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表