用单片机做电子密码锁,Electronic lock
关键字:ATmega8,密码锁电路图
电子密码锁按照输入密码方式的不同可分为好多种,其中最常用的一种是用数字键盘输入密码的电子密码锁。这一讲主要介绍用ATmega8和LCD1602液晶显示器等组成的电子密码锁,这个电子密码锁能够由用户自行修改密码,掉电后密码不丢失。通过实验和学习使大家掌握电子密码锁的工作原理和ATmega8中EEPROM存储器的使用方法。
一,EEPROM数据存储器简介ATmega8的存储器由可分别独立寻址的程序存储器Flash、片内数据存储器SRAM和EEPROM三部分组成。
ATmega8包含512字节的EEPROM数据存储器,可用于保存系统的设定参数、掉电后数据保存等。EEPROM可以按字节为单位进行读写,至少可进行100000次擦写操作。EEPROM的访问由地址寄存器、数据寄存器和控制寄存器决定。
在程序中EEPROM的访问是通过I/O空间的寄存器来实现的,EEPROM的编程时间典型值为8.5ms。
为了防止无意的EEPROM写入,必须遵照规范的写入顺序。当读取EEPROM时,单片机将暂停4个时钟周期再执行下一条指令;当写EEPROM时,单片机将暂停2个时钟周期再执行下一条指令。
下面介绍与EEPROM相关的几个寄存器。
1.EEPROM地址寄存器
EEARH、EEARL因为ATmega8有512(2的9次方)字节的EEPROM,所以要用两个8位寄存器来作地址寄存器,编址为0x0000~0x01FF。地址寄存器EEAR可读可写,EEAR的初始值没有定义,在访问EEPROM之前必须写入一个正确的地址值。
EEAR的定义见下表。
2.EEPROM数据寄存器
EEDR数据寄存器EEDR用来存放即将写入EEPROM或者从EEPROM读出的某个单元的数据,写入或读出的地址由地址寄存器EEAR给出。EEDR的初始值为0x00。
3.EEPROM控制寄存器EECREECR的定义见下表。
EERIE位为EEPROM中断准备好使能位,当EERIE置位而且SREG寄存器中的全局中断位I置位时,若EEWE为0,则单片机产生一个中断。
EEMWE位为EEPROM主机写入使能位,EEMWE决定了EEWE置位是否可以启动EEPROM写操作。当EEMWE为置位时,在4个时钟周期内EEWE置位将把数据写入EEPROM的指定地址;若EEMWE为0,则操作EEWE不起作用。EEMWE置位后4个周期,硬件对其清零。
EEWE位为EEPROM写使能位,当EEPROM数据和地址设置好之后,需置位EEWE以便将数据写入EEPROM。此时EEMWE必须置位,否则EEPROM写操作将不会发生。写时序如下:
(1)等待EEWE位变为零。
(2)将新的EEPROM地址写入EEAR(可选)。
(3)将新的EEPROM数据写入EEDR(可选)。
(4)置位EEMWE。
(5)在置位EEMWE的4个周期内,置位EEWE。
EERE位为EEPROM读使能位,当EEPROM地址设置好之后,需置位EERE以便将数据读入EEDR。
EEPROM数据的读取只需要一条指令。读取EEPROM后CPU要停止4个时钟周期才可以执行下一条指令。
二、电子密码锁实验
1.实验电路
电子密码锁主要由单片机ATmega8、液晶显示器LCD1602和电磁铁锁芯等部分组成。实验板上与电子密码锁有关的电路部分见下图。图中SB1、SB2、SB3为输入按键,用于输入数字密码。VD6、R7、VT4等组成电磁铁驱动电路,由ATmega8的PD7脚进行控制,实际使用时只要将VT4的负载由继电器换成电子密码锁的电磁铁吸合线圈即可,当然也可以用继电器的常开触点去控制电磁铁吸合线圈。
2.程序设计
程序有主函数、初始化函数、LCD显示函数、键盘扫描函数、密码设置函数、EEPROM读写函数和延时函数等部分组成。
程序中共使用了6个数组,其中数组Datal[]用来存储按键值,它存储在SRAM数据存储区,用来记录输入的。
按键值。其中数组a[]用来存储密码值,为了防止密码值掉电丢失,a[]存储在EEPROM数据存储区,a[]的初始值为a[]={0,0,0,0,0,0,0,0,0,0,0,0},即初始密码为000000000000。
实验板上的SB1、SB2两个按钮作数字输入键,SB1输入数字0,SB2输人数字1。SB3为确认键。由于只有两个数字输入按钮,因此密码只能采用二进制数,密码长度为12位。输入的12位密码存储在数组Datal口中,按一下确认键SB3后,程序将数组Datal口的各元素和数组a[]的对应元素进行比较,如果两个数组相等,说明密码正确,LCD显示屏显示:RIGHT,PD7输出高电平,由VT4推动电磁铁吸合打开电子密码锁;反之,如果密码错误,LCD显示屏显示:ERROR,打不开电子密码锁。输入密码时输入几个数字LCD显示屏就显示几个·号。
为了程序设计方便,引入了一个特征值Key,没有任何键按下时,令Key=0;当SB1、SB2有键按下时,令Key=1;当SB3按下时,令Key=2;当密码不正确时,令Key=3。特征值Key作为主函数和按键扫描函数之间联系的一条纽带。
输入密码由按键扫描函数完成,按键扫描函数的流程图见下图。
密码设置函数用来重新设置密码,新的密码仍然保存在EEPROM数据存储区,这样掉电后新设置的密码就不会丢失了。密码设置函数的流程图见下图。
在验证密码和重新设置密码时要对EEPROM进行读写,这可以用EEPROM读写函数来完成,两个函数的语句如下。
写EEPROM数据函数:
Void Write-EEPROM(ucharData,uintAddress)
(if(EECR&0x20)//判断写使能是否为0
Delay Ms(10);//延时10ms
EEARH=Address>>8;//送高地址
EEARL=Address&0x0000ff;//送低地址
EEDR=Data;//送数据
EECR=EECR|0x04;//主写使能置位
EECR=EECR|0x02;//写使能置位
Delay Ms(10);//延时10ms
}
读EEPROM数据函数:
UcharRead_EEPROM(uint Address)
{uchar i;
if(EECR&0x01)//判断读使能是否为0
Delay Ms(10);//延时10ms
EEARH=Address>>8;//送高地址
EEARL=Address&0x00ff;//送高地址
EECR=EECR|0x01;//读使能置位
Delay Ms(10);//延时10ms
i=EEDR;//读数据
return(i);//返回数据
}
上面只对几个主要的函数作了介绍,详细的源程序见本期配刊光盘。
3.电子密码锁实验首先将程序目标文件写入单片机,为了防止密码掉电后丢失,同时使密码能够重新修改,必须将密码写入EEPROM数据存储器。由于程序中使用了EEPROM数据存储器,因此程序在编译时除了生成HEX目标文件外,还会产生EEP目标文件。HEX目标文件写入Flash程序存储器,EEP目标文件写入EEPROM数据存储器。所以用PonyProg2000写芯片时,在打开目标文件时要分别打开目标文件Lock.hex和lock.eep,具体操作过程是:
(1)对芯片进行擦除;(2)用工具栏上的“Open Pro—gram Memory(FLASH)File按钮打开lock.hex文件;(3)用工具栏上的“Open Data Memory(EEPROM)File”按钮打开lock.eep文件;(4)单击工具栏中的“写器件”按钮即可把两个目标文件分别写入Flash程序存储器和EEPROM数据存储器。操作过程如下图(略)所示。
接下来接通实验板的电源,通过SB1、SB2输入12位密码,按一下确认键SB3,如果密码正确的话,LCD显示屏会显示“RIGHT”,同时PD7输出5秒钟的高电平,使发光二极管VD6点亮,电磁铁吸合,电子密码锁被打开,如下图(略)所示。如果密码不正确,LCD显示屏会显示“ERROR”,PD7输出仍为低电平,电子密码锁不能被打开。
如果要修改密码,必须先输入正确的密码,在VD7没有熄灭前按下SB3,并在VD7熄灭后再保持3秒钟,到时LCD显示屏会显示“SET_PASSWORD”,这时即可用SB1、SB2输入新的12位密码。下次使用时必须输入新的密码才能打开锁,这样经常变更密码可提高锁的安全性。
由于受按键数量的限制,密码采用了二进制,12位密码的组合也只有4096种,为了提高破解的难度,有两种方法:一种方法是修改程序使得连续输入几次密码错误后将电路锁定一段时间,延长破解的时间;另一种方法是密码采用十进制数,但这就要使用更多的按键,从而使用较多的I/0接口,电路必须进行调整。上述两种方法如何实施留给读者自己思考。
|