当前位置: 首页 >> 应用笔记 >>你选择的正文
 
单片机实现密码锁
                                                    
日期:12-04-2006  
 

 

by K.S.Sankar - Mostek Electronics ( www.mostek.biz )
Originaly published in ELECTRONICS FOR YOU magazine ( INDIA - W W W . E F Y M A G . C O M )

    密码锁可以由数字芯片和定时器组成,它可以判断正确的输入和非法的输入,实现密码锁需要很多的数字芯片。
    这里是一个基于ATMEL公司的89C2051芯片实现的密码锁,该芯片可以完成检测输入的四位密码的正确性,并且可以限定密码输入的时间。完成这些工作只需要再使用的缓冲器4050和三极管去驱动继电器。
    伴随着单片机的价格已下降到和4个逻辑门芯片差不多的价格。这使得使用单片机实现以上功能变的很有意义。
    本项目中使用了LCD显示部分,但该部分并不是必须的,可以从电路中移除LCD,而不需要修改任何的程序代码。
    LCD模块有16个引脚的和14个引脚的,16个引脚的具有背光功能可选。通过试验发现任何16×2的液晶(兼容HD44780)都可以使用。
   控制LCD对比度分压电阻,当调节到接近于GND时,显示效果最好。

   BASCOM-51的代码如下:
   '--------------------------------------------------------------
   ' 文件名: efy20LOC.BAS
   ' 以单片机为核心的4位密码锁
   ' 使用 bascom-51实现? www.mcselec.com
   ' ?by K.S.Sankar www.mostek.biz june 2006
   '--------------------------------------------------------------
   ' 密码为1324

   $crystal = 6000000
   $regfile = "89c2051.dat"

   Dim I As Byte
   Dim K(4) As Byte
   Dim Pass(4) As Byte
   Dim Key As Byte
   Dim Invalid_pass As Bit
   Dim Sec_count As Byte
   Dim Clock_word As Word
   Dim Passtime As Byte
   Dim Attempts As Byte
   Dim Maxattempts As Byte

   Ready_led Alias P1.0
   Relay_out Alias P1.1

   For I = 1 To 4
   K(i) = 0
   Next I

   Pass(1) = 1
   Pass(2) = 3
   Pass(3) = 2
   Pass(4) = 4

   Sec_count = 0
   Passtime = 5
   Attempts = 0
   Maxattempts = 3

   Config Lcd = 16 * 2
   Config Lcdpin = Pin , Db4 = P1.4 , Db5 = P1.5 , Db6 = P1.6 , Db7 = P1.7 , E = P1.3 , Rs = P1.2
' 端口 1

   P1 = 0
   P3 = 255

   Config Timer0 = Timer , Gate = Internal , Mode = 2
   '使用timer 0
   'Gate = 内部 无外部中断
   'Mode = 2 ?8位自动加载模式

   '设置timer0 1秒中断2000次
   On Timer0 Timer_0_overflow_int
   Load Timer0 , 250
   Priority Set Timer0
   Enable Interrupts
   Enable Timer0

 

   Begin:
   If Attempts >= Maxattempts Then
   Locate 0 , 0 : Lcd Maxattempts ; " attempts over"
   Locate 2 , 0 : Lcd "try after 10 seconds"
   Attempts = 0
   Gosub Trylater
   End If

   Sec_count = 0

   For I = 1 To 4
   K(i) = 0
   Next I

 

   Cls
   Cursor On Blink
   '清LCD显示
   Lcd "Enter Pass:"
   '在LCD第一行显示以下内容

   Ready_led = 1

   For I = 1 To 4

   While 1 = 1
   If Sec_count > Passtime Then
   Exit For
   End If

   If P3 <> 255 Then
   ' 有键按下

   If I = 1 Then
   ' 在第一个键被按下时,启动Timer0
   Sec_count = 0
   Start Timer0
   End If

   Key = P3
   ' 等待键抬起
   While Key = P3
   Wend
   K(i) = 255 - Key
   If K(i) = 1 Then
   Goto Lcd_out
   End If
   If K(i) = 2 Then
   Goto Lcd_out
   End If
   If K(i) = 4 Then
   K(i) = 3
   Goto Lcd_out
   End If
   If K(i) = 8 Then
   K(i) = 4
   Goto Lcd_out
   End If
   If K(i) = 16 Then
   K(i) = 5
   Goto Lcd_out
   End If
   If K(i) = 32 Then
   K(i) = 6
   Goto Lcd_out
   End If
   If K(i) = 128 Then
   K(i) = 8
   Goto Lcd_out
   End If

   ' 错误的输入
   Key(i) = 0

   Lcd_out:

   Lcd K(i)
   Waitms 30
   Exit While
   End If

   Wend

    

   Next I

   Ready_led = 0

   Stop Timer0

   ' 检查是否时间到
   If Sec_count > Passtime Then
   Locate 2 , 0 : Lcd "time over"
   Incr Attempts
   Gosub Error_flash
   Wait 1
   Goto Begin
   End If

   ' 校验输入是否正确
   Invalid_pass = 0
   For I = 1 To 4
   If K(i) <> Pass(i) Then
   Invalid_pass = 1
   End If
   Next I

 

   If Invalid_pass = 1 Then
   Goto Invalid
   End If

 

   Valid:
   Locate 2 , 0 : Lcd "valid password"
   Relay_out = 1
   Wait 1
   Relay_out = 0
   Goto Begin

 

   Invalid:
   Locate 2 , 0 : Lcd "invalid"
   Gosub Error_flash
   Incr Attempts
   Wait 1
   Goto Begin

 

   Trylater:
   ' 等待10秒
   For I = 1 To 10
   Wait 1
   Key = P3
   Key = 255 - Key
   If Key = 3 Then
   Exit For
   End If
   Next I

   Wait 2
   Return

   Error_flash:
   For I = 1 To 10
   Ready_led = Ready_led Xor 1
   Waitms 100
   Next I
   Ready_led = 0
   Return

 

 

   ' 中断服务程序 -----------------
   Timer_0_overflow_int:
   '使用6M晶振情况下,1秒中断2000次
   Incr Clock_word

   If Clock_word > 2000 Then
   Clock_word = 0
   Incr Sec_count
   End If
   Return

   End
   ' ==-=-=-=-=-=-=-=-=-=-=-=-==-==
   '程序结束

 

    以上程序编译后的烧录hex文件仅1.6K,2051芯片的容量为2K。
程序可以根据需要进行修改,烧录文件可以使用编程器写入到2051中。
    电路图如下:

1

    电路说明:
    单片机使用20个引脚、2K容量的ATMEL公司生成的AT89C2051。
    端口1使用10K上拉电阻驱动4位模式下的LCD。
    使用6M晶振。
    Timer0用作内部计数器,1秒钟使一个变量加1,这个用于限定密码的输入时间。
    程序点亮“准备好”发光二极管,等待4位密码的输入,正确的密码为1324。
    8个输入按键接到端口3。