找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1968|回复: 1
打印 上一主题 下一主题
收起左侧

基于51单片机的电子密码锁设计

[复制链接]
跳转到指定楼层
楼主
主程序:
#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之间的数字通过
   {
    password[i]=keydata;//键盘值进行保存
    keydata=0;   //把键盘值置其它值,不被其它利用,以一样
    i++;
    write_data('*'); //在LCD上显示*这字符代表输入了一个密码  
    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)    //确定进入密码比较
   {
    keydata=0;
panduan:  i=0;
    for(j=0;j<6;j++)
    {
     l+=password[j];
     k+=Random_Read(j);
    }
    if(l!=k)  //密码不同进行处理
    {
     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;
       }
      }
     }//两次错误发出报警
     goto start;      //第二次输入密码
    }
    if(l==k)  //密码对了,进入运行状态,这里绿灯代表该状态
    {
     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;    //跳到下面函数中,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)
       //上面表达式0-9之间的数字通过
     {
      password[m]=keydata;  //读取键盘值
      keydata=0;
      m++;
      write_data('*');   
      if(m==6)    //到密码输入到六位的时候进行判断是否再输入,或者判断前后两次密码是否一致
      {
       m=0;
       n++;
       if(n==2)
        goto panduan1; //输入第二次的时候进行前后两次密码进判断
       for(i=0;i<6;i++)     //储存前一次密码
       {
        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)    //第一次与第二次密码输入错误
      {
       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, 下载次数: 21)

原理图

原理图

1、源程序.rar

75.26 KB, 下载次数: 32, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:654666 发表于 2019-12-2 21:33 | 只看该作者
LCD_Write_String(0,0,aa);楼主为什么这个是错误的?谢谢告诉
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表