找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

在家無(wú)聊自己給家里做個(gè)門(mén)禁

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:3721 發(fā)表于 2015-1-5 14:08 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
由于上個(gè)月丟了家鑰匙,今天無(wú)聊中沒(méi)啥事兒,就想自己動(dòng)手設(shè)計(jì)個(gè)自己用的門(mén)禁來(lái)玩,至少鑰匙丟了也不愁了,還可以一卡通。由于基本上目前沒(méi)硬件來(lái)設(shè)計(jì),那就先用軟件來(lái)模擬一下吧,到時(shí)感覺(jué)不錯(cuò)再買(mǎi)元器件。
    今天估計(jì)也做不了什么,就大概分析下機(jī)器的一些東東吧。
    首先考慮使用的卡的類型,是使用id卡還是ic卡還是二代身份證呢?身份證嘛怕丟,不能老是隨身帶。id卡和ic卡都行,不過(guò)ic卡的讀頭要貴很多又不方便自做,所以最后決定用id卡吧,就算自己做也沒(méi)什么,大不了買(mǎi)個(gè)芯片讀曼徹斯特*碼也應(yīng)該容易,況且讀卡器,卡片也便宜嘛。
    id讀卡器到時(shí)買(mǎi)最便宜的就行了,不用多想什么了,只要記得到時(shí)搞清楚到手的參數(shù)就行,不要拿個(gè)維根32的當(dāng)成維根26的來(lái)用,就可能走很多彎路了。
    主控芯片就用89s52吧,二個(gè)外部中斷,二個(gè)定時(shí)中斷,32個(gè)I/O應(yīng)該夠用了。
    存儲(chǔ)器的話只存開(kāi)門(mén)卡號(hào)和密碼等數(shù)據(jù),不用太大,就用24c02夠了,幾十個(gè)用戶容量夠家里用了。
    其他的配件都是小件散件,用到時(shí)再考慮吧。
    用電腦做上位機(jī)進(jìn)行聯(lián)網(wǎng)遠(yuǎn)程開(kāi)門(mén),加卡刪卡等操作,電腦軟件以后做好下位機(jī)后再寫(xiě)了,唉,英語(yǔ)不行,VB,DP等流行軟件都不能用,看來(lái)只能用易語(yǔ)言了。
    現(xiàn)在到晚上了,今天白天已經(jīng)畫(huà)好了proteus圖,大概說(shuō)一一分布:1,電源12v輸入12v/5v輸出。2,主控P3口控制繼電器蜂鳴器LED輸出和曼碼,IIC,中斷(讀卡器輸入)輸入和串口通訊。P2,P1口留做讀卡器輸入(用查詢法來(lái)讀數(shù)據(jù))和信號(hào)輸出。P0口做鍵盤(pán)輸入了。主控就暫時(shí)就樣分布到時(shí)需要時(shí)再改吧。
今天就先做到就里,任務(wù)才剛剛開(kāi)始,單片機(jī)程序估計(jì)要幾天才能寫(xiě)好吧。

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

使用道具 舉報(bào)

沙發(fā)
ID:3721 發(fā)表于 2015-1-5 14:08 | 只看該作者
今天開(kāi)始寫(xiě)下位機(jī)也就是89s52的程序。一個(gè)早上才搞定鍵盤(pán)掃描程序,程序基本上正確,只是明明加了松開(kāi)檢測(cè)了,怎么有時(shí)在按下時(shí)會(huì)發(fā)送呢。實(shí)在是檢查不出哪兒的問(wèn)題,也許是模擬軟件的問(wèn)題吧。
    現(xiàn)在突然想到怎么先寫(xiě)鍵盤(pán)程序呢,應(yīng)該寫(xiě)重要的先才對(duì)啊,不然到最后重要的部分沒(méi)寫(xiě)成那不是浪費(fèi)很多精力?但是沒(méi)有實(shí)際硬件做起來(lái)費(fèi)勁,串口通訊不知怎么用軟件模擬,也就是因?yàn)檫@樣早上的鍵盤(pán)程序都是靠軟件調(diào)試和蜂鳴器來(lái)提示來(lái)叛斷是否正確,所以做起來(lái)很慢。如果有終端來(lái)顯示那就方便多了。不想買(mǎi)液晶顯示,雖然1602液晶應(yīng)該沒(méi)多少錢(qián)但是怕以后用不到還是用電腦來(lái)做顯示吧,接上串口來(lái)通訊就行。但問(wèn)題是現(xiàn)在要有芯片,數(shù)據(jù)線,基本外圍元件和洞洞板等等才行。家里街上和工業(yè)城市不一樣,東西應(yīng)該不好買(mǎi),到市區(qū)里去看看吧,不行再淘寶了,馬上去了……
   貼上我的鍵盤(pán)程序:
/*////////////////////////////////////
函數(shù)原型: uchar key(void)
函數(shù)說(shuō)明:鍵盤(pán)掃描
版本:V1.0.0        
程序員:LIY12586
////////////////////////////////////*/
uchar key(void)
{
   uchar temp,number;
   P0=0x0f;
  
   if(P0!=0x0f)
   {
      P0=0xfe;
      if(P0!=0xfe)
       {      
         temp=P0;
         switch (temp)
         {             //11110000
            case 0xee:    //01111110
               number=4;
              
               break;
            case 0xde:
               number=3;
            
               break;
            case 0xbe:
               number=2;
              
               break;
            case 0x7e:
               number=1;
              
               break;
         }
      
         while(P0!=0xfe);
         sound(1);
         return number;
       }
      P0=0xfd;
      if(P0!=0xfd)
       {      
         temp=P0;
         switch (temp)
         {
            case 0xed:
               number=8;
               break;
            case 0xdd:
               number=7;
               break;
            case 0xbd:
               number=6;
               break;
            case 0x7d:
               number=5;
               break;
         }
         while(P0!=0xfd);
         sound(1);
         return number;
       }
      P0=0xfb;
       //temp=P0;
      //temp=temp|0xf0;
      if(P0!=0xfb)
       {      
         temp=P0;
         switch (temp)
         {
            case 0xeb:
               number=12;
               break;
            case 0xdb:
               number=11;
               break;
            case 0xbb:
               number=10;
               break;
            case 0x7b:
               number=9;
               break;
         }
         while(P0!=0xfb);
         sound(1);
         return number;
       }
      P0=0xf7;
       //temp=P0;
      //temp=temp|0xf0;
      if(P0!=0xf7)
       {      
         temp=P0;
         switch (temp)
         {
            case 0xe7:
               number=16;
               break;
            case 0xd7:
               number=15;
               break;
            case 0xb7:
               number=14;
               break;
            case 0x77:
               number=13;
               break;
         }
         while(P0!=0xf7);
         sound(1);
         return number;
       }      
   }return 0;
}
回復(fù)

使用道具 舉報(bào)

板凳
ID:3721 發(fā)表于 2015-1-5 14:09 | 只看該作者
終于完成了韋根26查詢法的程序了,IIC和串口通詢昨天改好,因?yàn)楝F(xiàn)在沒(méi)做到聯(lián)網(wǎng)部分,所以沒(méi)做聯(lián)網(wǎng)方面的通訊協(xié)議和程序。
串口通訊程序
void Init(void)
{
  
   TMOD|=0x21;//定時(shí)器1為方式2,定時(shí)器0方式1
   TL1=0xfd;  //初始值設(shè)置波特率為9600    //
   TH1=0xfd;
   ET0=1;
   TR1=1;     //開(kāi)定時(shí)器1
   REN=1;   //允許接收數(shù)據(jù)//
   SM0=0;
   SM1=1;
   EA=1;      //開(kāi)所有中斷
   ES=1;

        
}
void SEND(unsigned char *a)
{
      uchar b;
      for(b=0;b<8;b++)
      {
        
         SBUF=*a;
          while(TI==0);
         TI=0;
         a=a+1;
        
      }
}
IIC總線24cxx讀寫(xiě)通用程序
#include<config.h>
//#include<delay.h>
#ifndef MCU_MODEL
   #define  MCU_MODEL 51   //<----在此設(shè)定mcu類型, 51代表51系列; avr代表avr系列
#endif

//-----------------------51類MCU-------------------------------------------
#if MCU_MODEL==51  

//   #include<reg51.h>      //在此設(shè)定51類MCU的頭文件
//   #include<intrins.h>     //_nop_()函數(shù)需要
//   #include"xd.h"
//   #include"xdprj.h"
  
   //---------定義I2總線端口, 可根據(jù)實(shí)際使用改變-----------
   sbit SCL=P2^0;      //I2總線時(shí)鐘線
   sbit SDA=P2^1;      //I2總線數(shù)據(jù)線
  
   #define SCL_L SCL=0
   #define SCL_H SCL=1
   #define SDA_L SDA=0
   #define SDA_H SDA=1
  
   #define SDA_TO_IN      //為配合avr共用次程序而空定義的宏
   #define SDA_TO_OUT      //為配合avr共用次程序而空定義的宏
  
   #define SDA_IF_L SDA==0   //如果sda為低
   #define SDA_IF_H SDA==1   //如果sda為高
  
   //------------------------------------------------------
   #define DELAY_us _nop_(); _nop_(); _nop_(); _nop_(); _nop_()   //延時(shí)用,如果要加長(zhǎng)延時(shí),可增加或減少 _nop_();
  
//------------------------avr類MCU-----------------------------------------
#elif MCU_MODEL==avr  

   #include<iom16v.h>      //在此設(shè)定avr類MCU的頭文件
   #include<macros.h>
//   #include"xd.h"
//   #include"xdprj.h"
  
   //-----定義I2總線端口, 可根據(jù)實(shí)際使用改變----
   #define SCL_L PORTC&=~BIT(0)   //I2總線時(shí)鐘線
   #define SCL_H PORTC|=BIT(0)
   #define SDA_L PORTC&=~BIT(1)   //I2總線數(shù)據(jù)線
   #define SDA_H PORTC|=BIT(1)
  
   #define SDA_TO_IN DDRC&=~BIT(1); _NOP()   //設(shè)數(shù)據(jù)線位輸入
   #define SDA_TO_OUT DDRC|=BIT(1); _NOP()   //設(shè)數(shù)據(jù)線位輸出
  
   #define SDA_IF_L (PINC&BIT(1))==0      //如果sda為低
   #define SDA_IF_H (PINC&BIT(1))==BIT(1)   //如果sda為高
   //-------------------------------------------

   #define DELAY_us tus(7)   //avr單片機(jī)在晶振為8MHz時(shí),延時(shí)5us, 可根據(jù)實(shí)際情況改變
  
#endif
//---------------------------------------------------------------------------



//------在此設(shè)定芯片型號(hào)------
#define e2prom 2      // <---在此設(shè)定芯片型號(hào), 1代表24C01; 16代表24C16; 512代表24C512

#if e2prom==1
   #define PAGE_SIZE 8       //芯片頁(yè)寫(xiě)緩沖器大小,單位:字節(jié)/
   #define SIZE 0x007f       //   芯片內(nèi)含有多少個(gè)8位的字節(jié)/
#elif e2prom==2
   #define PAGE_SIZE 8
   #define SIZE 0x00ff
#elif e2prom==4
   #define PAGE_SIZE 16
   #define SIZE 0x01ff
#elif e2prom==8
   #define PAGE_SIZE 16
   #define SIZE 0x03ff
#elif e2prom==16
   #define PAGE_SIZE 16
   #define SIZE 0x07ff
#elif e2prom==32
   #define PAGE_SIZE 32
   #define SIZE 0x0fff
#elif e2prom==64
   #define PAGE_SIZE 32
   #define SIZE 0x1fff
#elif e2prom==128
   #define PAGE_SIZE 64
   #define SIZE 0x3fff
#elif e2prom==256
   #define PAGE_SIZE 64
   #define SIZE 0x7fff
#elif e2prom==512
   #define PAGE_SIZE 128
   #define SIZE 0xffff
#endif
//--------------------------

//--------在此設(shè)定芯片地址-------
#define W_ADD_COM 0xa0   //寫(xiě)字節(jié)命令及器件地址(根據(jù)地址實(shí)際情況改變), 1010 A2 A1 A0 0
#define R_ADD_COM 0xa1   //讀命令字節(jié)及器件地址(根據(jù)地址實(shí)際情況改變), 1010 A2 A1 A0 1
//-------------------------------


//-----在此改變預(yù)置錯(cuò)誤號(hào)-----
//#define I2C_ERR   ERR_10   //寫(xiě)字節(jié)命令及器件地址錯(cuò), 在此也就是讀寫(xiě)器件錯(cuò)!!
//---------------------------

//-------------------------------以下為其它I2總線器件可調(diào)用的函數(shù)--------------------------
//起始信號(hào)
void i2cstart(void)
{  
   //SCL_L;
   //DELAY_us;
    SDA_H;        //發(fā)送起始條件的數(shù)據(jù)信號(hào)*/
   DELAY_us;
    SCL_H;
   DELAY_us;   //起始條件建立時(shí)間大于4.7us,延時(shí)*/
    SDA_L;       //發(fā)送起始信號(hào)*/
   DELAY_us;  //起始條件鎖定時(shí)間大于4μs*
    SCL_L;       //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)/
   DELAY_us;
}  

//停止信號(hào) /
void i2cstop(void)
{  
   //SCL_L;
   //DELAY_us;
    SDA_L;        //發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)*
   DELAY_us;   
    SCL_H;        
   DELAY_us;     //    結(jié)束條件建立時(shí)間大于4μs
   SDA_H;        //   發(fā)送I2C總線結(jié)束信號(hào)*
   DELAY_us;
}
//等待從器件應(yīng)答/
void i2cask()  
{
   uchar i;
   SCL_H;
   DELAY_us;
   while((SDA==1)&&(i<250))i++;
   SCL_L;
   DELAY_us;
}
/*/MCU應(yīng)答信號(hào)/
void i2cack()
{
  
   SDA_L;
   DELAY_us;
   SCL_H;
   DELAY_us;
   SCL_L;
   DELAY_us;
}              */
//i2c讀要調(diào)用的函數(shù)
//從器件讀出一個(gè)字節(jié)
uchar i2crd(void)
{   uchar i,temp;
//i2c讀要調(diào)用的函數(shù)
//從器件讀出一個(gè)字節(jié)
uchar i2crd(void)
{   uchar i,temp;
  
     SCL_L; DELAY_us;     // 準(zhǔn)備接收數(shù)據(jù)位*時(shí)鐘低電平周期大于4.7μs
     SDA_H; DELAY_us;    //置數(shù)據(jù)線接上內(nèi)部上拉(數(shù)據(jù)輸入方式),此為必須/
              
    for(i=0;i<8;i++)
    {   
      SCL_H;           //   置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效/
      DELAY_us;
        temp<<=1;
        
        SDA_TO_IN;         //如果是avr單片機(jī),就設(shè)SDA引腳位輸入狀態(tài)
        
      if(SDA_IF_H)
      temp=temp+1; //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入temp中;
      SCL_L;
        DELAY_us;
        
        SDA_TO_OUT;         //如果是avr單片機(jī),就設(shè)SDA引腳位輸出狀態(tài)
   }
//    SCL_L;
//   DELAY_us;      //主器件應(yīng)答脈沖
//   SDA_L; DELAY_us;
//   SCL_H; DELAY_us;
    return(temp);
}//把一個(gè)字節(jié)數(shù)據(jù)輸入器件,并以收到應(yīng)答信號(hào)為止/
//寫(xiě)入成功返回1,失敗返回0
uchar i2cwt(uchar a)
{ uchar i;

for(i=0;i<8;i++) //要寫(xiě)入的數(shù)據(jù)長(zhǎng)度為8位*
{
SCL_L;
DELAY_us;
if((a<<i)&0x80) // 判斷發(fā)送位(按位與,只要最高位為1則真)
SDA_H;
else
SDA_L;
DELAY_us;
SCL_H; //置時(shí)鐘線為高,通知被控器開(kāi)始接收數(shù)據(jù)位*
DELAY_us; //保證時(shí)鐘高電平周期大于4μs*
}
SCL_L;
DELAY_us;
SDA_H; // 8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*
DELAY_us;
SCL_H;
DELAY_us;

SDA_TO_IN; //如果是avr單片機(jī),就設(shè)SDA引腳位輸入狀態(tài)/

if(SDA_IF_L) //測(cè)試有無(wú)應(yīng)答/
{ SDA_TO_OUT;
return(1); //有應(yīng)答返回1
}
else
{ SDA_TO_OUT;
return(0); //無(wú)應(yīng)答
}
}
void wt24c(uchar address,uchar date)
{

i2cstart();
i2cwt(0xa0);
i2cask();
i2cwt(address);
i2cask();
i2cwt(date);
i2cask();
i2cstop();
}
uchar rd24c(uchar address)
{
uchar temp;
i2cstart();
i2cwt(0xa0);
i2cask();
i2cwt(address);
i2cask();
i2cstart();
i2cwt(0xa1);
i2cask();
temp=i2crd();
return temp;
i2cstop();
}
查詢法讀韋根26程序
idata unsigned char WGDATA[26]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//接收韋根數(shù)據(jù)26位
idata unsigned char WG[8]={0xaa,0xbb,0,0,0,0,0xcc,0xdd};//存韋根ID卡卡號(hào)的HID和PID碼,其中HID碼為8位即一字節(jié),PID碼16位兩字節(jié)
uchar a,x,j,LL,II,YY;

void ys100us(uint u)
{ uint y;
uchar x;
for(y=u;y>0;y--)
{

for(x=20;x>0;x--)
_nop_();

}


}





void DATA(void)
{
if(DATA0!=DATA1)
{
if(DATA0==0)
{
WGDATA[Cnt]=0;

if(Cnt==25)
a=1;
Cnt++;
ys100us(15);
}
if(DATA1==0)
{
WGDATA[Cnt]=1;

if(Cnt==25)
a=1;
Cnt++;
ys100us(15);
}


}

}
bit re(void)
{
if(Read_Card())
{
WG[3]=WGDATA[1];
WG[4]=WGDATA[2];
WG[5]=WGDATA[3];
return 1;
// SEND(&WG[0]);
}
DATA();
if(a==1)
{

EA=0; //關(guān)中斷以免外部中斷的干擾
a=0;
Cnt=0;
// rd24c(ptr,0,10);
// WG[0]=*ptr;
for(x=1;x<9;x++)
LL=(LL<<1)|WGDATA[x];
for(x=9;x<17;x++)
II=(II<<1)|WGDATA[x];
for(x=17;x<25;x++)
YY=(YY<<1)|WGDATA[x];
//WG[0]=rd24c(0);
//ysms(100);
WG[3]=LL;
WG[4]=II;
WG[5]=YY;
EA=1;
// SEND(&WG[0]);
return 1;
}
return 0;
}
回復(fù)

使用道具 舉報(bào)

地板
ID:3721 發(fā)表于 2015-1-5 14:10 | 只看該作者
寫(xiě)好的部分程序
累。∧X力勞動(dòng)比體力勞動(dòng)要累多了!寫(xiě)得并調(diào)式好幾個(gè)程序花了我不少精力,打字都嫌累了,貼上幾個(gè)程序:
/*////////////////////////////////////
函數(shù)原型:
函數(shù)說(shuō)明:串口接收中斷
版本:V1.0.0
程序員:LIY12586
////////////////////////////////////*/
void ser() interrupt 4
{
   RI=0;
   z=SBUF;
   ai=1;
  
}
/*////////////////////////////////////
函數(shù)原型:void sound(uchar a)
函數(shù)說(shuō)明:蜂鳴器發(fā)聲,a為需要發(fā)出多少次DIDI音
版本:V1.0.0
程序員:LIY12586
////////////////////////////////////*/
void sound(uchar a)
{
    uchar x,y;
   for(;a>0;a--)
   {
      for(x=255;x>0;x--)
      {
         beep=0;
         for(y=150;y>0;y--)
         beep=1;
         beep=0;
       }
       ysms(500);
    }  
}
void ysms(unsigned int x)
{
   unsigned int a;
   unsigned int b;
   for(a=x;a>0;a--)
   {
       for(b=50;b>0;b--);
   }
}
/*////////////////////////////////////
函數(shù)原型:void inscard(void)
函數(shù)說(shuō)明:存入卡號(hào)到EEPROM
版本:V1.0.0
程序員:LIY12586
////////////////////////////////////*/
void inscard(void)
{
    while(1)
   {
       if(re())
      {
          if(iscard()==0)//如果沒(méi)有這卡號(hào)/
         {
            uchar a,b;
        
            b=ckdz();     //查找空置/
            for(a=3;a<6;a++)
            {
               wt24c(b,WG[a]);
               ys100us(1000);
               b++;
                        
            }
         //   wt24c(0,b);
            ys100us(1000);
            sound(1);
            break;
         }
         sound(2);
         break;
      }
      if(key()==12)
      {
         sound(1);
         break;
      }
  
   }
}

/*////////////////////////////////////
函數(shù)原型:void delcard(void)
函數(shù)說(shuō)明:從EEPROM中刪除卡號(hào)
版本:V1.0.0
程序員:LIY12586
////////////////////////////////////*/
void delcard(void)
{
    while(1)
   {
       if(re())
      {
          if(iscard()!=0)   //如果有這張卡號(hào)/
         {
            uchar a,b;
        
            b=iscard();     //查找空置/
            for(a=0;a<3;a++)
            {
               wt24c(b,0xff);
               ys100us(1000);
               b=b+1;
                  
            }
         //   wt24c(0,b);
            ys100us(1000);      
            sound(1);
            break;
         }
         sound(2);
         break;
      }
      if(key()==12)
      {
         sound(2);
         break;
      }
   }
}
/*////////////////////////////////////
函數(shù)原型:uchar iscard(void)
函數(shù)說(shuō)明:查找是否有此卡
版本:V1.0.0
程序員:LIY12586
////////////////////////////////////*/
uchar iscard(void)
{
   
       uchar a,b;
      for(a=8;a<128;a++)
      {
         if(rd24c(a)==WG[3])
         {
            a++;
            if(rd24c(a)==WG[4])
            {
               a++;
               if(rd24c(a)==WG[5])
               {
                  b=a-2;
                  return b;
               }
            }      
         }
         if(a==127)return 0;
       }
  
}
/*////////////////////////////////////
函數(shù)原型:uchar ckdz(void)
函數(shù)說(shuō)明:查找EEPROM的空白位置地址
版本:V1.0.0
程序員:LIY12586
////////////////////////////////////*/
uchar ckdz(void)//查空地址/
{
    uchar a,b,c;
   for(a=2;a<126;a++)
   {
      c=a;
      c++;
      if(rd24c(a)==0xff)
      {
         a++;
         if(rd24c(a)==0xff)
         {
            a++;
            if(rd24c(a)==0xff)
            {
               b=a-2;
               return b;
            }
         }      
      }
      if(c==126)return 0xff;
    }
}
/*////////////////////////////////////
函數(shù)原型:void readcard(void)
函數(shù)說(shuō)明:讀卡正確
版本:V1.0.0
程序員:LIY12586
////////////////////////////////////*/
void readcard(void)
{
   if(re())
   {
      
        if(iscard()!=0)
      {
         SEND(&WG[0]);
         open();

      }sound(2);
    }
}
/*////////////////////////////////////
函數(shù)原型:void open(void)
函數(shù)說(shuō)明:打開(kāi)
版本:V1.0.0
程序員:LIY12586
////////////////////////////////////*/
void open(void)
{
   
       //out=0;
      SEND(&WG[0]);
      sound(1);
      ysms(10000);
      //out=1;
      
   
}
回復(fù)

使用道具 舉報(bào)

5#
ID:3721 發(fā)表于 2015-1-5 14:10 | 只看該作者
完成按鍵操作
  1. 昨天晚上終于完成了按鍵操作,由于太晚沒(méi)上傳,大部分功能已經(jīng)完成,一個(gè)簡(jiǎn)單(功能相對(duì)于專業(yè)門(mén)禁來(lái)說(shuō)簡(jiǎn)單,制作對(duì)我來(lái)說(shuō)相當(dāng)復(fù)雜,但也是體現(xiàn)我的單片機(jī)和電子技術(shù)水平又有提高)的門(mén)禁可以使用了,目前的功能有:讀卡開(kāi)門(mén),密碼開(kāi)門(mén),加卡,刪卡,更改密碼,系統(tǒng)初始化。后期要加上:遠(yuǎn)程控制開(kāi)門(mén),加卡,刪卡,監(jiān)控等。下面是程序:
  2. /*////////////////////////////////////
  3. 函數(shù)原型:void psw(void)
  4. 函數(shù)說(shuō)明:密碼寫(xiě)入EEPROM中
  5. 版本:V1.0.0
  6. 程序員:LIY12586
  7. ////////////////////////////////////*/
  8. void psw(void)
  9. {
  10.    uchar a=0,b=2,c,d,x=0;
  11.    timer=0;
  12.    while(1)
  13.    {      
  14.         
  15.          c=key();
  16.          if(c==12)
  17.             {            
  18.                sound(1);
  19.                break;
  20.             }
  21.          if(ex==1)
  22.          {
  23.             
  24.             sound(1);
  25.             ex=0;
  26.              break;
  27.          }  
  28.             if(c!=0)
  29.             {
  30.                if(a<6)
  31.                {
  32.                   keybuff[a]=c;
  33.                   a++;
  34.                   if(a==6)sound(2);
  35.                }
  36.                else if(a>6,a<13)
  37.                {
  38.                   if(c!=keybuff[x])
  39.                   {
  40.                   
  41.                      sound(20);
  42.                      x=0;
  43.                      a=0;
  44.                      break;
  45.                   }
  46.                      a++;
  47.                      x++;
  48.               
  49.                   if(a==12)
  50.                   {
  51.                      a=0;
  52.                      x=0;
  53.                      b=2;
  54.                      for(d=0;d<6;d++)
  55.                      {
  56.                         wt24c(b,keybuff[d]);
  57.                         ys100us(1000);
  58.                         b++;
  59.                      }
  60.                      SEND(&keybuff[0]);
  61.                      break;
  62.                   }
  63.               
  64.                 }
  65.               
  66.              }
  67.       
  68.         
  69.       
  70.       
  71.    }
  72. }
  73. /*////////////////////////////////////
  74. 函數(shù)原型:bit keyscan(void)
  75. 函數(shù)說(shuō)明:鍵盤(pán)操作掃描
  76. 版本:V1.0.0
  77. 程序員:LIY12586
  78. ////////////////////////////////////*/
  79. bit keyscan(void)
  80. {
  81.    uchar a=1,c,d;
  82.    scan=key();
  83.    if(scan!=0)
  84.    {
  85.       
  86.       if(scan!=11)
  87.       {
  88.          d=scan;
  89.          timer=0;
  90.          keybuff[0]=scan;
  91.          scan=0;
  92.         
  93.          while(1)
  94.          {
  95.             if(d==12)
  96.             {            
  97.                sound(1);
  98.                break;
  99.             }
  100.             
  101.             c=key();
  102.             if(c==12)
  103.             {            
  104.                sound(1);
  105.                break;
  106.             }
  107.             else if(ex==1)
  108.             {
  109.               
  110.                sound(1);
  111.                ex=0;
  112.                 break;
  113.             }  
  114.             else if(c!=0)
  115.             {
  116.                keybuff[a]=c;
  117.                a++;
  118.                if(a==6)
  119.                {
  120.                   a=0;
  121.                   SEND(&keybuff[0]);
  122.                   return 1;
  123.                   break;
  124.                }
  125.             }
  126.   
  127.          }
  128.       }
  129.       
  130.    }
  131.   
  132.    return 0;
  133. }
  134. /*////////////////////////////////////
  135. 函數(shù)原型:void password(void)
  136. 函數(shù)說(shuō)明:確認(rèn)密碼
  137. 版本:V1.0.0
  138. 程序員:LIY12586
  139. ////////////////////////////////////*/
  140. bit password(void)
  141. {
  142.    uchar a,b;
  143.    if(keyscan())
  144.    {
  145.          b=2;
  146.          for(a=0;a<6;a++)
  147.          {
  148.             if(keybuff[a]!=rd24c(b))
  149.             {
  150.             break;
  151.             }
  152.             b++;
  153.             if(b==8)return 1;
  154.          }
  155.          if(b!=8)
  156.          {  

  157.             sound(5);
  158. //            LED=0;
  159.             return 0;
  160.          }
  161.       
  162.         
  163.    }
  164. }

  165. /*////////////////////////////////////
  166. 函數(shù)原型:void systeminit(void)
  167. 函數(shù)說(shuō)明:系統(tǒng)初始化
  168. 版本:V1.0.0
  169. 程序員:LIY12586
  170. ////////////////////////////////////*/
  171. void systeminit(void)
  172. {
  173.     uchar a;
  174.       wt24c(0,0x02);
  175.       ys100us(1000);
  176.       wt24c(1,0xab);
  177.       ys100us(1000);
  178.       wt24c(2,0x01);
  179.       ys100us(1000);
  180.       wt24c(3,0x02);
  181.       ys100us(1000);
  182.       wt24c(4,0x03);
  183.       ys100us(1000);
  184.       wt24c(5,0x04);
  185.       ys100us(1000);
  186.       wt24c(6,0x05);
  187.       ys100us(1000);
  188.       wt24c(7,0x06);
  189.       ys100us(1000);
  190.       
  191.    for(a=8;a<128;a++)
  192.    {
  193.       if(rd24c(a)!=0xff)
  194.       {
  195.          //ysms(100)
  196.          wt24c(a,0xff);
  197.          ys100us(1000);
  198.       }
  199.       
  200.    }
  201.    sound(5);
  202. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

6#
ID:70266 發(fā)表于 2015-1-20 22:42 | 只看該作者
xuexixia ding
回復(fù)

使用道具 舉報(bào)

7#
ID:80021 發(fā)表于 2015-5-14 21:45 | 只看該作者
樓主你好!!做畢業(yè)設(shè)計(jì),,,需要這樣的,,,系統(tǒng),,,求分享,,,proteus圖等,,,謝謝。1138279190@QQ.com
回復(fù)

使用道具 舉報(bào)

8#
ID:73815 發(fā)表于 2015-6-10 06:34 | 只看該作者
單片機(jī)是怎樣看門(mén)把關(guān)的能教教別人嗎
回復(fù)

使用道具 舉報(bào)

9#
ID:91104 發(fā)表于 2015-9-26 14:04 | 只看該作者
樓主你好 求分享proteus圖 硬軟件設(shè)計(jì) 萬(wàn)分感謝   謝謝,謝謝364640663@qq.com
回復(fù)

使用道具 舉報(bào)

10#
ID:205941 發(fā)表于 2017-5-29 22:27 | 只看該作者
你好!能不能把門(mén)禁的代碼給我參考一下?
回復(fù)

使用道具 舉報(bào)

11#
ID:205941 發(fā)表于 2017-5-29 22:28 | 只看該作者
你好!能不能把門(mén)禁的代碼給我參考一下?
liuwei058@163.com
回復(fù)

使用道具 舉報(bào)

12#
ID:106211 發(fā)表于 2017-12-17 23:58 | 只看該作者
做個(gè)記號(hào),以后學(xué)習(xí)使用 謝謝樓主
回復(fù)

使用道具 舉報(bào)

13#
ID:253767 發(fā)表于 2017-12-19 15:05 | 只看該作者
等待分享樓主的成果
回復(fù)

使用道具 舉報(bào)

14#
ID:23303 發(fā)表于 2018-10-6 20:00 | 只看該作者
想學(xué)習(xí)一下,請(qǐng)多幫助,謝謝!
回復(fù)

使用道具 舉報(bào)

15#
ID:406598 發(fā)表于 2018-11-30 22:59 | 只看該作者
好強(qiáng)呀,有實(shí)物圖嗎樓主?
回復(fù)

使用道具 舉報(bào)

16#
ID:685488 發(fā)表于 2020-1-12 23:54 | 只看該作者
大師就是牛x
回復(fù)

使用道具 舉報(bào)

17#
ID:715507 發(fā)表于 2020-4-5 22:11 | 只看該作者
樓主你好 求分享軟、硬件設(shè)計(jì) 萬(wàn)分感謝   謝謝,謝謝739004020@qq.com
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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