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

QQ登錄

只需一步,快速開始

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

基于51單片機(jī)的電子密碼鎖設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
主程序:
#include<reg52.h>
#include<intrins.h>
#include"LCD1602.h"
#include"key.h"
#include"delay.h"
#include"eeprom.h"
sbit P3_6=P3^6;
sbit P3_7=P3^7;
void int0(void);
unsigned char password[6]/*={0x01,0x01,0x01,0x01,0x01,0x01}*/;
unsigned char password1[6];
unsigned char code aa[]="Password    ";
unsigned char code gg[]="New";
unsigned char code bb[]="ERROR   ";
unsigned char code cc[]="OK      ";
unsigned char code dd[]="        ";
unsigned char code ee[]="Next    ";
unsigned char code ff[]="success ";
unsigned char keydata;
void main()
{
unsigned char i,j,k,l,m,n,o,a1;
unsigned int aaaa=65536;
init();//LCD初始化
int0();
P3_6=0;
P3_7=0;
P1=0x0f;
LCD_Write_String(0,0,aa);
LCD_Write_String(1,1,dd);
write_com(0xc0+1);
while(1)
{
start: LCD_Write_String(0,0,aa);
  LCD_Write_String(1,1,dd);
  write_com(0xc0+1);  
  while(1)
  {
   if((0<keydata)&&(4>keydata)||(4<keydata)&&(8>keydata)||(8<keydata)&&(12>keydata)||keydata==14)
   //在0-9之間的數(shù)字通過(guò)
   {
    password[i]=keydata;//鍵盤值進(jìn)行保存
    keydata=0;   //把鍵盤值置其它值,不被其它利用,以一樣
    i++;
    write_data('*'); //在LCD上顯示*這字符代表輸入了一個(gè)密碼  
    if(i==6)   //這里限制了六位密碼
    {
     i=0;
     goto panduan;
    }   
   }
   if(keydata==13)   //重新輸入改密
     {
        m=0;
      n=0;
      LCD_Write_String(1,1,dd);
      write_com(0xc0+1);
     }
   if(keydata==33)    //確定進(jìn)入密碼比較
   {
    keydata=0;
panduan:  i=0;
    for(j=0;j<6;j++)
    {
     l+=password[j];
     k+=Random_Read(j);
    }
    if(l!=k)  //密碼不同進(jìn)行處理
    {
     l=0;
     k=0;
     LCD_Write_String(0,0,bb);
     DelayMs(1000);
     a1+=1;
     if(a1==2)
     {
      while(1)
      {
      // aaaa--;
       P3_7=1;
       P3_6=0;
      // if(aaaa==0)
       {
      //  P3_7=0;   
        a1=0;
        //aaaa=65536;
        //goto start;
       }
      }
     }//兩次錯(cuò)誤發(fā)出報(bào)警
     goto start;      //第二次輸入密碼
    }
    if(l==k)  //密碼對(duì)了,進(jìn)入運(yùn)行狀態(tài),這里綠燈代表該狀態(tài)
    {
     l=0;
     k=0;
     a1=0;
     P3_6=1;
     P3_7=0;
     LCD_Write_String(0,0,cc);
     LCD_Write_String(1,1,dd);
     if(o==1)
     {
      o=0;
        LCD_Write_String(0,0,gg);
        LCD_Write_String(4,0,aa);
        LCD_Write_String(1,1,dd);
        write_com(0xc0+1);
        goto text2;
     }
     goto yingxing;    //跳到下面函數(shù)中,yingxing里
    }
   }     
  }
yingxing:while(1)
  {
   if(keydata==4) //鎖定功能
   {
    P3_6=0;
    goto start;
   }
   if(keydata==15)    //修改密碼
   {
    o++;
    if(o==1)
     goto start;
text2:   keydata=0;
    while(1)
    {
     if((0<keydata)&&(4>keydata)||(4<keydata)&&(8>keydata)||(8<keydata)&&(12>keydata)||keydata==14)
       //上面表達(dá)式0-9之間的數(shù)字通過(guò)
     {
      password[m]=keydata;  //讀取鍵盤值
      keydata=0;
      m++;
      write_data('*');   
      if(m==6)    //到密碼輸入到六位的時(shí)候進(jìn)行判斷是否再輸入,或者判斷前后兩次密碼是否一致
      {
       m=0;
       n++;
       if(n==2)
        goto panduan1; //輸入第二次的時(shí)候進(jìn)行前后兩次密碼進(jìn)判斷
       for(i=0;i<6;i++)     //儲(chǔ)存前一次密碼
       {
        password1[i]=password[i];
       }
       LCD_Write_String(1,1,dd);
       LCD_Write_String(0,0,ee);
       DelayMs(1000);
       LCD_Write_String(0,0,aa);
       write_com(0xc0+1);  
      }
     }
     if(keydata==13)   //重新輸入改密
     {
text:      m=0;
      n=0;
      LCD_Write_String(1,1,dd);
      write_com(0xc0+1);
     }
     if(keydata==16)  //退出不改密碼
     {
out:     m=0;
      n=0;
      o=0;
      LCD_Write_String(0,0,cc);
      LCD_Write_String(1,1,dd);
      goto yingxing;
     }
     if(keydata==33)
     {
      keydata=0;
panduan1:    for(j=0;j<6;j++)//第一次與第二次密碼比較
      {
       l+=password[j];
       k+=password1[j];
      }
      if(l!=k)    //第一次與第二次密碼輸入錯(cuò)誤
      {
       l=0;
       k=0;
       LCD_Write_String(0,0,bb);
       DelayMs(1000);
       LCD_Write_String(0,0,aa);
       goto text;
      }
       else
      {
       for(i=0;i<6;i++)
       {
        Write_IIC(i,password[i]);
       }
       LCD_Write_String(0,0,ff);
       DelayMs(1000);
       goto out;  
      }      
     }     
    }
   }
  }
}  
}
void int0(void)
{
EA=1;
EX0=1;
IT0=1;
}
void wb0(void) interrupt 0
{
keydata=key_scan();  
}


仿真圖.png (34.09 KB, 下載次數(shù): 33)

原理圖

原理圖

1、源程序.rar

75.26 KB, 下載次數(shù): 32, 下載積分: 黑幣 -5

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

使用道具 舉報(bào)

沙發(fā)
ID:654666 發(fā)表于 2019-12-2 21:33 | 只看該作者
LCD_Write_String(0,0,aa);樓主為什么這個(gè)是錯(cuò)誤的?謝謝告訴
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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