LCD1602密码锁设计

发布者:JoyfulExplorer最新更新时间:2016-07-18 来源: eefocus关键字:LCD1602  密码锁 手机看文章 扫描二维码
随时随地手机看文章
密码锁说明:(KT实验板调试成功)

 
    本密码锁是利用8051单片机的控制结合1602LCD,设计的一个微电脑LCD密码锁,可以用在需要密码输入的场合中,例如要当门禁用时,需要实际配合电子门锁。也可以设计在保险中做密码锁控制中。本密码锁应用的知识主要有:
   1. 8051 4x4矩阵键盘扫描输入
   2. 1602 LCD显示
   3. 密码比较处理的设计方法
   4. 定时器的使用
   5. 24cxxx的应用等

功能说明:

   1. 使用LCD显示器来显示密码输入的相关消息及提示
   2. 可以设置6位数字(0-9)密码
   3. 内定另一组数字密码为:000000
   4. 密码输入正确则继电器启动2s
   5. 密码输入正确或错误都有相应的声音提示
   6. 密码输入3次错误,系统将自动锁定,30分钟内不准使用,30分钟后自动开启
   7. 密码输入时,如果在10秒内没有按键,表示放弃本次输入,则自动跳出密码输入状态,进入欢迎界面
   8. 可以修改密码或用原始密码
   9. 断电后密码仍然存在(保存在24c02中)
   10.具有按键复位功能

硬件连接:

/*1602 LCD连接线图: 
---------------------------------------------------
| LCM-----51  | LCM-----51  | LCM------51     |
| ----------------------------------------------- |
| DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0     |
| DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1     |
| DB2-----P0.2 | DB6-----P0.6 | E--------P2.2     |
| DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |
---------------------------------------------------

接口说明:1. P1口: 4x4矩阵键盘
          2. P2.4  工作指示灯
          3. P2.5  继电器控制端
          4. P3.7  蜂鸣器控制端 
          5. P3.3  24c02时钟端
          6. P3.4  24c02数据端
/*接盘按键说明:
--------------------------------------------------
            |  1  |  2  |  3  |  A  |
            - - - - - - - - - - - - -
            |  4  |  5  |  6  |  B  |
            - - - - - - - - - - - - -
            |  7  |  8  |  9  |  C  |
            - - - - - - - - - - - - -
            |  *  |  0  |  #  |  D  |
--------------------------------------------------
注:A--表示输入密码
    B--表示设置新密码
    C--复位端口

附加说明:
  
    1. LCD1602驱动-----------明皓 
    2. 4x4键盘扫描-----------KT学习综合实验源程序
    3. 密码比较原理----------8051单片机课程设计实训教材
    4. 24C02的读写操作-------伟纳电子ME300B单片机开发系统演示程序

                                            zhaojun   2007/10/1

                                                      zhaojun_xf@163.com

 

 

 

部分代码:

//========================================== 主函数部分 ==================================================

/***************************************************** 
 函 数 名:void clearmen(void)
 功    能:系统初始化
 说    明:对系统用的标志位和定时器进行初始化
 入口参数:无
 返 回 值:无 
 *****************************************************/
void clearmen(void)
{
  flag1= 1;            // Choice_menu()调用标志
  signx= 1;            // 循环标志
  flag = 1;            // 调用输入新密码提示标志位            
  mark = 1;            // 循环标志位
  num  = 0;            // 按键错误计数器
  TH0=0x3C;TL0=0xB0;   // 50ms定时初值
  TH1=0x3C;TL1=0xB0;   // 50ms定时初值
  TMOD=0x11;ET0=1;TR0=0;ET1=1;TR1=0;EA=1;
}

/***************************************************** 
 函 数 名:main()
 功    能:主函数
 说    明:对按键和显示进行控制
 入口参数:无
 返 回 值:无 
 *****************************************************/
void main(void)

  uchar Key_value;
  Delay400Ms();                                                    // 启动等待,等LCM讲入工作状态
  LCMInit();                                                       // LCM初始化
  Delay400Ms();   
  clearmen();                                                      // 系统初始化
  while(1)
  {
     P1=0xf0;
     if(((P1&0xf0)!=0xf0)&(flag1==1)&(num<3))                      // 有键按下
    {
       Key_value=Key_switch();                                  // 按键扫描
       if(Key_value!=0)                                         // 的确有键按下
         {
     Choice_menu();                                       // 调用选择程序
     flag1=0;                                             // Choice_menu()调用标志
     signx=1;                                            // 循环标志
   }
     while(signx==1)
    {
                   TR0=0;                                          // 定时器0关,从先开始计时
          TR0=1;                                          // 定时器0开
       P1=0xf0;                                        // P1口赋值,从而判断有无按键
       if((P1&0xf0)!=0xf0)
           {
              Key_value=Key_switch();                     // 按键扫描
              if(Key_value==65)                           // 如果按键是"A",则输入密码
                {       
           while(mark==1)
                 { 
           Password_importation();         // 密码输入
                 }
        flag1=1;                              // Choice_menu()调用标志
                       signx=0;                              // 循环标志 
          }
                 if(Key_value==66)                           // 如果按键是"B",则输入新密码  
                   {                
                       while(mark==1)                        // 输入前比较秘密,密码正确进入新密码设置
                 {                                  // 密码错误退出密码设置
           Password_importation();         // 密码输入
                 }                                
              //-------------------------------                            
                             if(mark0!=0)                          // mark0=1:密码比较正确可以输入新密码
                                {                                  // mark0=0:密码比较错误不能输入新密码
            mark=1;                        // 进入循环标志
               while(mark==1)
                  { 
                     NewPassword_set();          // 新密码设置函数
                  }
         mark=1;                        // 进入循环标志  
                              while(mark==1)
               {
            NewPassword_set_again();    // 再次输入密码
         }
        }
          flag1=1;                               // Choice_menu()调用标志
                         signx=0;                               // 循环标志 
          }
            }
           }
    }
     else
      {
         Welcome_face();                                        // 欢迎界面
   mark = 1;                                              // 循环标志
   mark0= 0;                                              // 是否输入新密码标志位
            flag1=1;                                               // Choice_menu()调用标志
   WriteCommandLCM(0x0C,1);                               // 关光标显示
   sign=(bit)ReadCurrent(10);                             // 密码比较标志位
   }
 if(num==3)                                                     // 3次输入错误密码,系统锁定30min
   {
         ET1=1;TR1=1;                                            // 开定时器T1,定时30分钟  
   }
  }
}

//========================================== 密码控制部分 ==================================================

/***************************************************** 
 函 数 名:void NewPassword_set_again(void)
 功    能:第二次输入密码
 说    明:第二次输入密码并存入暂存器,再调用比较程序
 入口参数:无
 返 回 值:无 
 *****************************************************/
void NewPassword_set_again(void)
{
  bit sign1;
  uchar key_data;
  P1=0xf0;                             // 判断是否有键按下           
  if(flag==1)      
    {
      NewPassword_again();             // 显示密码输入界面
      Delay400Ms();
      flag=0;                          // 调用输入新密码提示标志位
      Count=0;                         // 按键次数计数器置0 
      Delay400Ms();
    }
  if((P1&0xf0)!=0xf0)                  // 判断是否有键按下
    { 
      key_data=Key_switch();           // 调用按键转换程序
   if((key_data!=0)&(key_data!=65)&(key_data!=66)&(key_data!=67)&(key_data!=68)&(key_data!=35)&(key_data!=42))
     {//按键不能为数字(0~9)以外.A             B               C              D              #              *
       Count++;                     // 按键次数器加1
    Led_hint();                  // 按键指示
    Beep();                      // 按一下键发一音
       sign1=1;                     // 有键按下标志位
     } 
    }
  if((sign1==1)&(flag==0))             // 有键按下
    {
      Scan_starnumber();               // 在密码显示区显示" ****** "
   sign1=0;                         // 按键标志位清0
      T_Password[Count-1]=key_data;    // 按键值放入密码暂存器          
    }
  if(Count==6)                         // 6次按键则进行密码比较
    {
      Count=0;                         // 计算清0,从先计数
      flag =1;                         // 调用输入新密码提示标志位
      mark =0;                         // 循环标志位
      WriteCommandLCM(0x0C,1);         // 关光标显示
      Newpassword_comparison();        // 新密码设置比较
    }
}

/***************************************************** 
 函 数 名:void Newpassword_comparison(void)
 功    能:第二次输入密码比较
 说    明:对第一次输入的密码与第二次输入的密码进行比较
 入口参数:无
 返 回 值:无 
 *****************************************************/
void Newpassword_comparison(void)
{
   uchar Number=0;  
   while((T_Password[Number]==N_Password[Number])&(Number<6))// 密码比较
   {
      Number++;                       // 计数值加1
   }
   if(Number>=6)                         // 密码正确
     {
        Newpassword_OK();                // 新密码设置成功提示
        WriteToROM(T_Password,0,6);      // 密码设置成功,则把密码存入24c02中
  sign =1;                         // 比较新密码标志
  WriteCurrent((uchar)sign,10);    // 存入标志位
     Delay400Ms();
     Beep();                          // 正确提示音
     Delay400Ms();
        Beep();
        mark=0;
     }         
  else                                   // 密码错误,报警
     {
        Newpassword_ERROR();             // 新密码设置失败提示
        num=0;
     sign =0;                         // 比较旧密码标志
     Delay400Ms();
        Beep();Beep();Beep();            // 错误提示音
     Delay400Ms();
     Beep();Beep();Beep();
     Delay1s();                       // 延时1s
        mark=0;
    }
}

/***************************************************** 
 函 数 名:void NewPassword_set(void)
 功    能:新密码设置
 说    明:修改密码
 入口参数:无
 返 回 值:无 
 *****************************************************/
void NewPassword_set(void)
{
  bit sign1;
  uchar key_data;
  P1=0xf0;                             // 判断是否有键按下           
  if(flag==1) 
    {
    NewPassword_face();             // 显示密码输入界面
    Delay400Ms();  
    flag=0;                         // 调用输入新密码提示标志位
    Count=0;                        // 按键次数计数器置0 
    Delay400Ms();
    }
  if((P1&0xf0)!=0xf0)                  // 判断是否有键按下
    { 
      key_data=Key_switch();           // 调用按键转换程序
   if((key_data!=0)&(key_data!=65)&(key_data!=66)&(key_data!=67)&(key_data!=68)&(key_data!=35)&(key_data!=42))
     {//按键不能为数字(0~9)以外.A             B               C              D              #              *
       Count++;                     // 按键次数器加1
    Led_hint();                  // 按键指示
    Beep();                      // 按一下键发一音
       sign1=1;                     // 有键按下标志位
     } 
    }
  if((sign1==1)&(flag==0))             // 有键按下
    {
      Scan_starnumber();               // 在密码显示区显示" ****** "
   sign1=0;                         // 按键标志位清0
      N_Password[Count-1]=key_data;    // 按键值放入密码暂存器          
    }
  if(Count==6)                         // 6次按键则进行密码比较
    {
      Count=0;                         // 计算清0,从先计数
      flag =1;                         // 调用输入新密码提示标志位
      mark =0;                         // 循环标志位
      WriteCommandLCM(0x0C,1);         // 关光标显示
    }

/***************************************************** 
 函 数 名:void Password_importation(void)
 功    能:密码输入
 说    明:输入密码并调用密码比较函数进行比较
 入口参数:无
 返 回 值:无 
 *****************************************************/
void Password_importation(void)
{
  bit sign1;
  uchar key_data;
  P1=0xf0;                             // 判断是否有键按下           
  if(((P1&0xf0)!=0xf0)&(flag==1))      // 有键按下,且是第一次
    {
      key_data=Key_switch();
   if(key_data!=0)
        {
       Pass_face();                 // 显示密码输入界面
       Delay400Ms();
       flag=0;                      // 调用密码输入提示标志位
       Count=0;                     // 输入密码个数计数器置0
       Delay400Ms();
     }
    }
  if((P1&0xf0)!=0xf0)                  // 判断是否有键按下
    { 
      key_data=Key_switch();           // 调用按键转换程序
   if((key_data!=0)&(key_data!=65)&(key_data!=66)&(key_data!=67)&(key_data!=68)&(key_data!=35)&(key_data!=42))
     {//按键不能为数字(0~9)以外.A             B               C              D              #              *
       Count++;                     // 按键次数器加1
    Led_hint();                  // 按键指示
    Beep();                      // 按一下键发一音
       sign1=1;                     // 有键按下标志位
     } 
    }
  if((sign1==1)&(flag==0))             // 有键按下
    {
      Scan_starnumber();               // 在密码显示区显示" ****** "
   sign1=0;                         // 按键标准位清0
      T_Password[Count-1]=key_data;    // 按键值放入密码暂存器          
    }
  if(Count==6)                         // 6次按键则进行密码比较
    {
      Count=0;                         // 计算清0,从先计数
      flag =1;                         // 调用密码输入提示标志位
      mark =0;                         // 循环标志位
      WriteCommandLCM(0x0C,1);         // 关光标显示

   if(sign==0)
           PasswordComparison(0);      // 输入按键与原始密码比较
   else PasswordComparison(1);      // 输入按键与新密码比较
    }
}

/***************************************************** 
 函 数 名:void Scan_starnumber(void)
 功    能:显示密码位为星号
 说    明:在密码显示区显示 " ****** "
 入口参数:无
 返 回 值:无 
 *****************************************************/
void Scan_starnumber(void)
{
    switch(Count)                           // 在相应的地方显示"*"
 {
      case 1:DisplayOneChar(5,1,42);break;  //-----*-----------//
   case 2:DisplayOneChar(6,1,42);break;  //------*----------//
      case 3:DisplayOneChar(7,1,42);break;  //-------*---------//
   case 4:DisplayOneChar(8,1,42);break;  //--------*--------//
   case 5:DisplayOneChar(9,1,42);break;  //---------*-------//
   case 6:DisplayOneChar(10,1,42);break; //----------*------//
    }                                       //-----*******-----//
}

/***************************************************** 
 函 数 名:void PasswordComparison(bit mark)
 功    能:密码比较程序
 说    明:对输入密码进行比较
 入口参数:mark:当mark=1时,对原始密码进行比较;当mark=0时,对原始密码进行比较
 返 回 值:无 
 *****************************************************/
void PasswordComparison(bit mark1)
{
   uchar Number=0;
      if(mark1==0)                    // 输入按键与原始密码比较
   {
    while((T_Password[Number]==O_Password[Number])&(Number<6)) // 密码比较
    {
      Number++;                 // 计数值加1
    }
   }
   else                            // 输入按键与新密码比较
      { 
    ReadFromROM(N_Password,0,6);
       while((T_Password[Number]==N_Password[Number])&(Number<6)) // 密码比较
    {
      Number++;                 // 计数值加1
    }
   }
   if(Number>=6)                   // 密码正确
   {
      mark0=1;                     // 进入新密码设置
      Password_OK();               // 调用密码输入正确提示函数
   REL=0;                       // 继电器开启,即密码锁开启 
   Delay400Ms();
   Beep();Beep();               // 正确提示音
   Delay400Ms();
         Beep();Beep();
         Delay1s();                   // 延时2s
   Delay1s();
   REL=1;                       // 继电器关闭,即密码锁开启
      mark=0;                      // 退出循环
   num=0;
   }         
   else                            // 密码错误,报警
   {
   mark0=0;                   // 新密码输入控制位
      Password_ERROR();            // 调用密码输入错误提示函数
   Delay400Ms();
      Beep();Beep();Beep();Beep(); // 错误提示音
   Delay400Ms();
   Beep();Beep();Beep();Beep();
   Delay1s();                   // 延时1s
      mark=0;                      // 退出循环
   num++;                       // 密码错误输入计数器
   }
}

关键字:LCD1602  密码锁 引用地址:LCD1602密码锁设计

上一篇:内藏T6963C控制器的液晶模块的显示
下一篇:单片机能力测试

推荐阅读最新更新时间:2024-03-16 15:00

单片机LM75温度报警LCD1602显示实验
一个由lm75构成的温度报警器例程 LM75数字温度传感器报警测试程序 1、程序说明: 该例程演示了接在单片机端口上的数字温度传感器LM75测试实验。 并在1602液晶上显示当前温度。同时判断是否超过了温度上限和下限, 如果超过,液晶屏将有提示闪烁。 2、实验操作 1、将跳线插座J4的跳线帽调至1602端 2、将LCD1602液晶屏插入J3插座中,注液管脚方向。 3、通过调节电位器VR1可以改变显示的对比度。 单片机源程序如下: /************************************************ * 文件描述 : LM75数字温度传感器报警测试程序 * 程序文件 : main.
[单片机]
33. 4×4键盘及8位数码管显示构成的电子密码锁
1. 实验任务 用4 4组成0-9数字键及确认键。 用8位数码管组成显示电路提示信息,当输入密码时,只显示 8. ,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用LED发光二极管亮一秒钟做为提示,同时发出 叮咚 声;若密码不正确,禁止按键输入3秒,同时发出 嘀、嘀 报警声;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。 2. 电路原理图 图4.33.1 3. 系统板上硬件连线 (1). 把 单片机系统 区域中的P0.0-P0.7用8芯排线连接到 动态数码显示 区域中的ABCDEFGH端子上。 (2). 把 单片机系统 区
[单片机]
33. 4×4键盘及8位数码管显示构成的电子<font color='red'>密码锁</font>
51单片机教程(七):LCD1602液晶显示模块
一、原理简介 液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在嵌入式应用系统中得到越来越广泛的应用,这讲中向大家介绍的LCD1602 液晶显示模块(其内部控制器为HD44780 芯片),它可以显示两行,每行16 个字符,因此可相当于32 个LED数码管,而且比数码管显示的信息还多。采用单+5V 电源供电,外围电路配置简单,价格便宜,具有很高的性价比。 LCD1602 外观如图1(a) 所示。1602 字符型LCD 模块的管脚分布如图1(b) 所示, 其管脚各功能如表1 所示。 图1 (a) LCD1602外观图 (b) LCD1602管脚分布图 值得提出的是,各种液晶厂家均有提供几乎都是同样规格的160
[单片机]
51单片机教程(七):<font color='red'>LCD1602</font>液晶显示模块
基于MSP430单片机的智能防夹电子密码锁
传统的锁具由于其构造简单,被强行破坏导致用户财产被盗的事件屡见不鲜,电子密码锁安全系数高,使用方便,性价比高,受到了广大用户的喜爱。锁具发展至今已有数千年的历史了,但是传统锁具都有不同程度上的缺点:传统锁具制作工艺在技术上已经明显落后,其制造材料无法抵抗强力破坏,无法阻止技术手段的开启,并且很多密码锁存在着夹手的问题。随着电子技术和人工智能技术的不断发展,电 子类产品的发展更趋向智能化和自动化。针对目前 市面上密码锁存在的问题,设计了一款基于MSP430 单片机的智能防夹电子密码锁,可以满足大多数用 户对于家庭防盗的需求。 1电子锁设计特点本设计从经济实用、防夹手的角度出发,采用MSP430 单片机作为主控系统,设计了一款具有
[单片机]
基于MSP430单片机的智能防夹电子<font color='red'>密码锁</font>
基于单片机的智能计算器(AT89C51、LCD1602、矩阵键盘)
一、简介 此电路由AT89C51最小系统、LCD1602液晶显示模块和矩阵键盘模块组成。 二、执行效果 三、部分代码 /* S16 S12 S8 S4分别是123+ S15 S11 S7 S3分别是456- S14 S10 S6 S2分别是789* S13 S9 S5 S1分别是0 CLR = / */ /*想要更多项目私wo!!!*/ /* 实现两个数的运算,每个数的位数至少可以八位 */ #include reg52.h #include lcd.h typedef unsigned char uint8; typedef unsigned int uint16; sbit led=P3^
[单片机]
基于单片机的智能计算器(AT89C51、<font color='red'>LCD1602</font>、矩阵键盘)
单片机DS18B20温度检测LCD1602显示程序+电路PCB设计
制作出来的实物图如下: Altium Designer画的原理图和PCB图如下: 单片机源程序如下: /*********************************************** 该程序为温度测量 用到DS18B20、LCD1602 备注:程序的许多地方也是理解了他人的程序才写出来的如果有理解错误、书写错误的地方望大家留言指导 ********************************
[单片机]
单片机DS18B20温度检测<font color='red'>LCD1602</font>显示程序+电路PCB设计
8051单片机的LCD1602使用
LCD:液晶显示器。 1602:16个字符×2行。 首先来看一下LCD1602在proteus8中的模型,在proteus8中,它叫做LM016L。我们从仿真元器件上可以看到它和实物图的区别,带有背光的LCD实物图上有16个引脚,分别是15号引脚BLA(正),16号引脚BLK(负),仿真元件省去了15,16引脚。 仿真电路图如下: 需要说明的是,3好引脚被称作是液晶驱动电压,作用是调整对比度,可以通过电位器改变阻值的大小来改变对比度。在此处,我将对比度设置为不可以调节的。(直接接一个5KΩ的不可变电阻)我使用了P3.4,P3.5,P3.6作为控制信号来操作1602。 对外部硬件的操作需要知道外部设备的时
[单片机]
8051单片机的<font color='red'>LCD1602</font>使用
基于单片机的金库门电子密码锁系统设计
摘要:针对金库门高保密性与安全性的要求,设计了一种新型金库门电子密码锁,能预防密码泄露,增加金库安全性。系统由金库门密码锁控制器和密码生成器组成,密码生成器提供开锁密码,密码重复概率低于1/1 000 000。当输入开锁密码错误超过三次则启动报警系统。论文介绍金库门电子密码锁系统硬件和软件的实现思路,给出了硬件原理图和程序流程图。 关键词:金库门电子密码锁系统;可变密码;密码锁控制器;密码生成器 0 引言 随着社会经济的快速增长,安全防盗已成为一个社会问题。特别是对于各金融机构以及许多企事业单位,为了资金周转方便,一般设有金库。然而近年来发生许多重大盗库案,如河北邯郸农行金库5 100万元被盗案,金库的安全管理已成为一个不可忽视
[工业控制]
基于单片机的金库门电子<font color='red'>密码锁</font>系统设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved