基于AT24C02的简易电子密码锁说明书
- 格式:doc
- 大小:585.87 KB
- 文档页数:35
基于51单片机的简易电子密码锁使用说明一、实现功能:1、设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。
2、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。
修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。
3、报警、锁定键盘功能。
密码输入错误显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。
4、AT24C02保存密码,支持复位保存,掉电保存功能。
二、按键说明按键定义图如图示:采用4X4键盘输入,键盘对应名称如下:1 2 3 A4 5 6 B7 8 9 C* 0 # D其中,【0—9】为数字键,用于输入相应的密码,【*】号键为取消当前操作【#】号键为确认【D】键为修改密码其它键无功能及定义三、作用说明:密码锁初始密码为:000000.1、开锁:插上电源后,程序自动调入初始密码,此时依次输入:000000,然后按【#】(确认)键,此时锁会打开,可以看到显示open,密码锁打开。
(如为自己焊接,请首次使用输入:131420,对密码进行初始化,当显示出现:initpassword,证明密码初始化完成,此时初始密码即为:000000)。
2、退出并关锁:按下【*】(取消)键,此时锁关闭,所有输入清除。
3、修改密码:在开锁状态下,再次输入正确的密码并按下【#】(确认)键,此时听到两声提示,输入新的六位密码并按【D】(重设)键,再重复输入一次新密码并按【D】,会听到两声提示音,表示重设密码成功,内部保存新密码并存储到AT24C02。
(如两次输入的新密码不一样,则重设密码失败)。
4、报警并锁定键盘:当输入密码错误后,报警并锁定键盘3秒,如3秒内又有按键,3秒再启动。
5、当重置新密码时,新密码会保存于AT24C02存储器里。
有任何问题请与我联系:QQ:331091810E_mail:331091810@旺旺ID:j_yongchao2008淘宝店址:/。
密码锁本设计以STC89C52RC单片机为核心,利用AT24C02存储密码,做到掉电存储密码的电子密码锁。
电路:程序:#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define N 7#define OP_READ 0xa1 // 器件地址以及读取操作#define OP_WRITE 0xa0 // 器件地址以及写入操作#define MAX_ADDR 0x7f // AT24C02最大地址sbit SCL=P2^0;sbit SDA=P2^1;sbit CSH=P3^0;sbit e=P3^4;sbit rs=P3^5;sbit sp=P3^6;sbit lock=P3^1;sfr duan=0x80;sfr key=0x90;uint ci;uchar kc,sc,sc2;int shu1,shu2,jh,jg;uchar code table[] =" LOCK "; uchar code table2[]="WELLCOME TO USE!"; uchar code table3[]="PASS WORD:";uchar code table4[]="ERRO!";uchar code table5[]="OPEN!";uchar code table6[]="NEW PASS WORD"; uchar code table7[]="SUCCESSFUL!";uchar code table8[]="FAIL!";uchar code cmm[6]={1,2,3,3,2,1};uchar mm[6];uchar tablesuan[N];void init();void writec(uint com);void writed(uint dat);void delay(uint shu);uchar keyscan();void xieshuzu(uchar a[],uchar add);void shuru();void kaiji();void bijiao();void xies(uchar a,uchar add);void delayms(unsigned char ms);void gmm();/***********************//***********************//***********************/void start()// 开始位{SDA = 1;SCL = 1;_nop_();_nop_();SDA = 0;_nop_();_nop_();_nop_();_nop_();SCL = 0;}void stop()// 停止位{SDA = 0;_nop_();_nop_();SCL = 1;_nop_();_nop_();_nop_();_nop_();SDA = 1;}unsigned char shin()// 从AT24Cxx移入数据到MCU{unsigned char i,read_data;for(i = 0; i < 8; i++){SCL = 1;read_data <<= 1;read_data |= (unsigned char)SDA;SCL = 0;}return(read_data);}bit shout(unsigned char write_data)// 从MCU移出数据到A T24Cxx{unsigned char i;bit ack_bit;for(i = 0; i < 8; i++) // 循环移入8个位{SDA = (bit)(write_data & 0x80);_nop_();SCL = 1;_nop_();_nop_();SCL = 0;write_data <<= 1;}SDA = 1; // 读取应答_nop_();_nop_();SCL = 1;_nop_();_nop_();_nop_();_nop_();ack_bit = SDA;SCL = 0;return ack_bit; // 返回A T24Cxx应答位}void write_byte(unsigned char addr, unsigned char write_data) // 在指定地址addr处写入数据write_data{start();shout(OP_WRITE);shout(addr);shout(write_data);stop();delayms(10); // 写入周期}unsigned char read_current()// 在当前地址读取{unsigned char read_data;start();shout(OP_READ);read_data = shin();stop();return read_data;}unsigned char read_random(unsigned char random_addr)// 在指定地址读取{start();shout(OP_WRITE);shout(random_addr);return(read_current());}void delayms(unsigned char ms)// 延时子程序{unsigned char i;while(ms--){for(i = 0; i < 120; i++);}}/***********************//***********************//***********************/ //主程序/void main(){ init();kaiji();delay(1000);writec(0x01);xieshuzu(table3,0x80);if(CSH==0){write_byte(2,cmm[0]); //在24c02的地址2中写入数据secdelayms(2);write_byte(3,cmm[1]); //在24c02的地址2中写入数据sec delayms(2);write_byte(4,cmm[2]); //在24c02的地址2中写入数据sec delayms(2);write_byte(5,cmm[3]); //在24c02的地址2中写入数据sec delayms(2);write_byte(6,cmm[4]); //在24c02的地址2中写入数据sec delayms(2);write_byte(7,cmm[5]); //在24c02的地址2中写入数据sec delayms(2);}mm[0]=read_random(2);delayms(2);mm[1]=read_random(3);delayms(2);mm[2]=read_random(4);delayms(2);mm[3]=read_random(5);delayms(2);mm[4]=read_random(6);delayms(2);mm[5]=read_random(7);while(1){lock=0;shuru();bijiao();}}/***********************/ //初始化/ void init(){lock=0;writec(0x01);writec(0x38);writec(0x0c);IT0=1;EX0=1;}/***********************/ //写开机画面/ void kaiji(){xieshuzu(table,0x80);xieshuzu(table2,0xc0);}/***********************/ //写数组/ void xieshuzu(uchar a[],uchar add){uchar cis;writec(add);for(cis=0;a[cis]!='\0';cis++){writed(a[cis]);delay(2);}}/***********************/ //写数字/ void xies(uchar a,uchar add){writec(add);writed(0x30+a);}/***********************/ //写指令/ void writec(uint com){e=0;rs=0;duan=com;delay(2);e=1;delay(2);e=0;}/***********************/ //写数据/void writed(uint dat){e=0;rs=1;duan=dat;delay(2);e=1;delay(2);e=0;}/***********************/ //延时/ void delay(uint shu){uint i,j;for(i=shu;i>0;i--)for(j=110;j>0;j--);}/***********************/ //现盘扫描/ uchar keyscan(){uchar k,skey;key=0xfe;skey=key;sp=1;if(skey!=0xfe){delay(10);skey=key;if(skey!=0xfe){switch(skey){case(0xee):k=7;kc++;break;case(0xde):k=8;kc++;break;case(0xbe):k=9;kc++;break;case(0x7e):k=0x0a;kc++;break;default:break;}while(skey!=0xfe)skey=key;sp=0;return k;}}key=0xfd;skey=key;if(skey!=0xfd){delay(10);skey=key;if(skey!=0xfd){switch(skey){case(0xed):k=4;kc++;break;case(0xdd):k=5;kc++;break;case(0xbd):k=6;kc++;break;case(0x7d):k=0x0b;kc++;break;default:break;}while(skey!=0xfd)skey=key;sp=0;return k;}}key=0xfb;skey=key;if(skey!=0xfb)delay(10);skey=key;if(skey!=0xfb){switch(skey){case(0xeb):k=1;kc++;break;case(0xdb):k=2;kc++;break;case(0xbb):k=3;kc++;break;case(0x7b):k=0x0c;kc++;break;default:break;}while(skey!=0xfb)skey=key;sp=0;return k;}key=0xf7;skey=key;if(skey!=0xf7){delay(10);skey=key;if(skey!=0xf7){switch(skey){case(0xe7):k=0x0d;kc++;break;case(0xd7):k=0; kc++;break;case(0xb7):k=0x0e;kc++;break;case(0x77):k=0x0f;kc++;break;default:break;}while(skey!=0xf7)skey=key;sp=0;return k;}}}/***********************/ //输入数据处理/ void shuru(){uchar k=0,xw=0x80;sc=0;kc=0;xieshuzu(table3,0x80);do{while(kc==sc)k=keyscan();if(kc==1)writec(0x01);tablesuan[sc]=k;//xies(tablesuan[sc],xw);xies(tablesuan[sc],0xc0);writec(xw);writed(0x2A);xw++;if(sc==5)goto out;}while((tablesuan[sc++]<=9)&&(sc<N));out:;if(sc>N){writec(0x01);xieshuzu(table4,0x80);}}void bijiao(){if((tablesuan[0]==mm[0])&&(tablesuan[1]==mm[1])&&(tablesuan[2]==mm[2])&&(tablesuan[3] ==mm[3])&&(tablesuan[4]==mm[4])&&(tablesuan[5]==mm[5])){EA=1;lock=1;writec(0x01);xieshuzu(table5,0x80);delay(6500);EA=0;}else{writec(0x01);xieshuzu(table3,0x80);}}void gmm(){uchar k=0,xw=0x80;sc2=0;kc=0;xieshuzu(table6,0x80);do{while(kc==sc2)k=keyscan();if(kc==1)writec(0x01);mm[sc2]=k;xies(mm[sc2],0xc0);writec(xw);writed(0x2A);xw++;if(sc2==5)goto out2;}while((mm[sc2++]<=9)&&(sc2<N));//out:;//if(sc>N)//{writec(0x01);xieshuzu(table8,0x80);goto out3;//}out2:;writec(0x01);xieshuzu(table7,0x80);write_byte(2,mm[0]); //在24c02的地址2中写入数据secdelayms(2);write_byte(3,mm[1]); //在24c02的地址2中写入数据secdelayms(2);write_byte(4,mm[2]); //在24c02的地址2中写入数据secdelayms(2);write_byte(5,mm[3]); //在24c02的地址2中写入数据secdelayms(2);write_byte(6,mm[4]); //在24c02的地址2中写入数据secdelayms(2);write_byte(7,mm[5]); //在24c02的地址2中写入数据secdelayms(2);out3:;}void INTT0() interrupt 0{EA=0;gmm();EA=1;}。
//rs----PD4//rw----PD5//en----PD6//data---PORTB//SDA---PC1//SCL---PC0//beep--PA6//开锁---PB7//开锁状态----PB5//如果把uchar const initpassword[6]={0,0,0,0,0,0};改为_flash uchar initpassword[6]={0,0,0,0,0,0}; //则出现这错误found `unsigned' expecting `;'可我没找到错误在哪???#include <iom16v.h>#include<macros.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define uchar unsigned char#define uint unsigned int#define w 6 //定义密码位数uchar operation=0; //操作标志位uchar pass=0; //密码正确标志uchar ReInputEn=0; //重置输入充许标志uchar s3_keydown=0; //3秒按键标志位uchar key_disable=0; //锁定键盘标志uchar countt0,second; //t1中断计数器,秒计数器//void Delay5Ms(void);uchar InputData[6]; //输入密码暂存区uchar CurrentPassword[6]={1,3,1,4,2,0}; //当前密码值uchar TempPassword[6];uchar N=0; //密码输入位数记数uchar ErrorCont; //错误次数计数uchar CorrectCont; //正确输入计数uchar ReInputCont; //重新输入计数#pragma data:codeuchar const a[]={0xFE,0xFD,0xFB,0xF7}; //控盘扫描控制表uchar const start_line[] = {"password: "};uchar const name[] = {"===Coded Lock==="}; //显示名称uchar const Correct[] = {" correct "}; //输入正确uchar const Error[] = {" error "}; //输入错误uchar const codepass[] = {" pass "};uchar const LockOpen[] = {" open "}; //OPENuchar const SetNew[] = {"SetNewWordEnable"};uchar const Input[] = {"input: "}; //INPUTuchar const ResetOK[] = {"ResetPasswordOK "};uchar const initword[] = {"Init password..."};uchar const Er_try[] = {"error,try again!"};uchar const again[] = {"input again "};uchar const initpassword[6]={0,0,0,0,0,0};/************************************************************************************************* **/void port_init(){DDRA|=BIT(6);PORTA|=BIT(6);DDRB=0xFF;PORTB=0xFF;DDRC=0xFF;PORTC=0xFF;}/***********************************************************************************************/ void segg()//关数码显示管函数{DDRA|=BIT(PA3); //PA3设置为输出状态DDRA|=BIT(PA4); //PA4设置为输出状态DDRB=0xff; //PB口设置为输出状态PORTB=0xff; //发送模码PORTA|=BIT(PA3); //PA3输出高电平,DU拉高PORTA&=~BIT(PA3); //PA3输出低电平,DU拉低,段选锁存PORTB=0xff; //发送为选关掉数码管显示PORTA|=BIT(PA4); //PA4输出高电平,WE拉高PORTA&=~BIT(PA4); //PA4输出低电平,WE拉低,位选锁存DDRA|=BIT(PA2); //PA2设置为输出状态用于LED流水灯控制IO口PORTA&=~BIT(PA2); //PA2输出低电平,DU拉低,段选LED流水灯锁存}/****************************************5ms延时*************************************/void Delay5Ms(void){uint TempCyc = 5552;while(TempCyc--);}/****************************************400ms延时*************************************/void Delay400Ms(void){uchar TempCycA = 5;uint TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);}}/****************************************24C02****************************************/void mDelay(uint t) //延时{uchar i;while(t--){for(i=0;i<125;i++){;}}}/*******************************************************************************************/ void Nop(void) //空操作{_nop_();_nop_();_nop_();_nop_();}/*****************************************起始条件*****************************************/ void Start(void){//Sda=1;PORTC|=BIT(1);////Scl=1;PORTC|=BIT(0);//Nop();//Sda=0;PORTC&=~BIT(1);//Nop();}/*****************************************停止条件*****************************************/ void Stop(void){//Sda=0;PORTC&=~BIT(1);////Scl=1;PORTC|=BIT(0);//Nop();//Sda=1;PORTC|=BIT(1);//Nop();}/*****************************************应答位*****************************************/ void Ack(void){//Sda=0;PORTC&=~BIT(1);//Nop();//Scl=1;PORTC|=BIT(0);//Nop();//Scl=0;PORTC&=~BIT(0);//}/*****************************************反向应答位*****************************************/ void NoAck(void){//Sda=1;PORTC|=BIT(1);//Nop();//Scl=1;PORTC|=BIT(0);//Nop();//Scl=0;PORTC&=~BIT(0);//}/****************************发送数据子程序,Data为要求发送的数据***********************/ void Send(uchar Data){uchar BitCounter=8;uchar temp;do{temp=Data;//Scl=0;PORTC&=~BIT(0);//Nop();if((temp&0x80)==0x80)//Sda=1;PORTC|=BIT(1);else//Sda=0;PORTC&=~BIT(1);////Scl=1;PORTC|=BIT(0);//temp=Data<<1;Data=temp;BitCounter--;}while(BitCounter);//Scl=0;PORTC&=~BIT(0);//}/********************读一字节的数据,并返回该字节值************************************/ uchar Read(void){uchar temp=0;uchar temp1=0;uchar BitCounter=8;//Sda=1;PORTC|=BIT(1);//do{//Scl=0;PORTC&=~BIT(0);//Nop();//Scl=1;PORTC|=BIT(0);//Nop();//if(Sda)if(PORTC&0xF2)/////////////temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}/****************************************************************************************/ void WrToROM(uchar Data[],uchar Address,uchar Num){uchar i;uchar *PData;PData=Data;for(i=0;i<Num;i++){Start();Send(0xa0);Ack();Send(Address+i);Ack();Send(*(PData+i));Ack();Stop();mDelay(20);}}/********************************************************************************/void RdFromROM(uchar Data[],uchar Address,uchar Num){uchar i;uchar *PData;PData=Data;for(i=0;i<Num;i++){Start();Send(0xa0);Ack();Send(Address+i);Ack();Start();Send(0xa1);Ack();*(PData+i)=Read();//Scl=0;PORTC&=~BIT(0);NoAck();Stop();}}//**********************************LCD1602*********************************************//#define yi 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)//*********************************************************************************************// void delay(uint xms)//延时函数,有参函数{uint x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}/**********************************写指令****************************************/ write_1602com(uchar com)//****液晶写入指令函数****{PORTD&=~BIT(4);////数据/指令选择置为指令PORTD&=~BIT(5);////读写选择置为写PORTB=com;//送入数据delay(1);PORTD|=BIT(6);//拉高使能端,为制造有效的下降沿做准备delay(1);PORTD&=~BIT(6);//en由高变低,产生下降沿,液晶执行命令}/**********************写数据*****************************************************/ write_1602dat(uchar dat)//***液晶写入数据函数****{PORTD|=BIT(4);//////数据/指令选择置为数据PORTD&=~BIT(5);////读写选择置为写PORTB=dat;//送入数据delay(1);PORTD|=BIT(6);////en置高电平,为制造下降沿做准备delay(1);PORTD&=~BIT(6);////en由高变低,产生下降沿,液晶执行命令}/************************************初始化***************************************/ void lcd_init(void){write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据write_1602com(0x0c);//开显示不显示光标write_1602com(0x06);//整屏不移动,光标自动右移write_1602com(0x01);//清显示}/*******************************************将按键值编码为数值*************************/ uchar coding(uchar m){uchar k;switch(m){case (0x18): k=1;break;case (0x28): k=2;break;case (0x48): k=3;break;case (0x88): k='A';break;case (0x14): k=4;break;case (0x24): k=5;break;case (0x44): k=6;break;case (0x84): k='B';break;case (0x12): k=7;break;case (0x22): k=8;break;case (0x42): k=9;break;case (0x82): k='C';break;case (0x11): k='*';break;case (0x21): k=0;break;case (0x41): k='#';break;case (0x81): k='D';break;}return(k);}/******************************按键检测并返回按键值*************************************/ uchar keynum(void){uchar row,col,i;DDRD=0x0F;PORTD=0xF0;//KeyRead=PIND; //读取键盘结果//KeyRead&=0x0f; //屏蔽高四位//if((P1&0xf0)!=0xf0)if((PIND&0xf0)!=0xf0){Delay5Ms();Delay5Ms();if((PIND&0xf0)!=0xf0){row=PIND^0xf0; //确定行线i=0;PORTD=a[i];////精确定位while(i<4){if((PIND&0xf0)!=0xf0){col=~(PIND&0xff); //确定列线break; //已定位后提前退出}else{i++;PORTD=a[i];}}}else{return 0;}while((PORTD&0xf0)!=0xf0);return (row|col); //行线与列线组合后返回}else return 0; //无键按下时返回0}/********************************一声提示音,表示有效输入*************************************/ void OneAlam(void){PORTA&=~BIT(6);//Delay5Ms();PORTA|=BIT(6);//}/*********************************二声提示音,表示操作成功*********************************/void TwoAlam(void){PORTA&=~BIT(6);//Delay5Ms();PORTA|=BIT(6);//Delay5Ms();PORTA&=~BIT(6);//Delay5Ms();PORTA|=BIT(6);//}/*******************************三声提示音,表示错误************************************/ void ThreeAlam(void){PORTA&=~BIT(6);//Delay5Ms();PORTA|=BIT(6);//Delay5Ms();PORTA&=~BIT(6);//Delay5Ms();PORTA|=BIT(6);//Delay5Ms();PORTA&=~BIT(6);//Delay5Ms();PORTA|=BIT(6);//}/*****************显示输入的N个数字,用H代替以便隐藏*************************************/ void DisplayOne(void){// DisplayOneChar(9+N,1,'*');write_1602com(yi+5+N);write_1602dat('*');}/***********************************显示提示输入**************************************/ void DisplayChar(void){unsigned char i;if(pass==1){//DisplayListChar(0,1,LockOpen);write_1602com(er);for(i=0;i<16;i++){write_1602dat(LockOpen[i]);}}else{if(N==0){//DisplayListChar(0,1,Error);write_1602com(er);for(i=0;i<16;i++){write_1602dat(Error[i]);}}else{//DisplayListChar(0,1,start_line);write_1602com(er);for(i=0;i<16;i++){write_1602dat(start_line[i]);}}}}/**************************************************************************************/ void DisplayInput(void){uchar i;if(CorrectCont==1){//DisplayListChar(0,0,Input);write_1602com(er);for(i=0;i<16;i++){write_1602dat(Input[i]);}}}/******************************************重置密码*******************************/ void ResetPassword(void){uchar i;uchar j;if(pass==0){pass=0;DisplayChar();ThreeAlam();}else{if(ReInputEn==1){if(N==6){ReInputCont++;if(ReInputCont==2){for(i=0;i<6;){if(TempPassword[i]==InputData[i]) //将两次输入的新密码作对比i++;else{//DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j<16;j++){write_1602dat(Error[j]);}ThreeAlam(); //错误提示pass=0;ReInputEn=0; //关闭重置功能,ReInputCont=0;DisplayChar();break;}}if(i==6){//DisplayListChar(0,1,ResetOK);write_1602com(er);for(j=0;j<16;j++){write_1602dat(ResetOK[j]);}TwoAlam(); //操作成功提示WrToROM(TempPassword,0,6); //将新密码写入24C02存储///////// ReInputEn=0;}ReInputCont=0;CorrectCont=0;}else{OneAlam();//DisplayListChar(0, 1, again); //显示再次输入一次write_1602com(er);for(j=0;j<16;j++){write_1602dat(again[j]);}for(i=0;i<6;i++){TempPassword[i]=InputData[i]; //将第一次输入的数据暂存起来}}N=0; //输入数据位数计数器清零}}}}/****************************输入密码错误超过三过,报警并锁死键盘********************************/ void Alam_KeyUnable(void){PORTD=0x00;//{PORTA^=BIT(6);//Delay5Ms();}}/*************************************取消所有操作***********************/void Cancel(void){uchar i;uchar j;//DisplayListChar(0, 1, start_line);write_1602com(er);for(j=0;j<16;j++){write_1602dat(start_line[j]);}TwoAlam(); //提示音for(i=0;i<6;i++){InputData[i]=0;}PORTB|=BIT(7);//关闭锁PORTA|=BIT(6);//报警关operation=0; //操作标志位清零pass=0; //密码正确标志清零ReInputEn=0; //重置输入充许标志清零ErrorCont=0; //密码错误输入次数清零CorrectCont=0; //密码正确输入次数清零ReInputCont=0; //重置密码输入次数清零PORTB|=BIT(5);s3_keydown=0;key_disable=0;N=0; //输入位数计数器清零}/*******************************确认键,并通过相应标志位执行相应功能************************/ void Ensure(void){uchar i,j;RdFromROM(CurrentPassword,0,6); //从24C02里读出存储密码if(N==6){if(ReInputEn==0) //重置密码功能未开启{for(i=0;i<6;){if(CurrentPassword[i]==InputData[i]){i++;}else{ErrorCont++;if(ErrorCont==3) //错误输入计数达三次时,报警并锁定键盘{write_1602com(er);for(i=0;i<16;i++){write_1602dat(Error[i]);}doAlam_KeyUnable();while(1);}else{TIMSK|=BIT(2); //开启定时key_disable=1; //锁定键盘pass=0;break;}}}if(i==6){CorrectCont++;if(CorrectCont==1) //正确输入计数,当只有一次正确输入时,开锁,{//DisplayListChar(0,1,LockOpen);write_1602com(er);for(j=0;j<16;j++){write_1602dat(LockOpen[j]);}TwoAlam(); //操作成功提示音PORTB&=~BIT(7);//开锁///////////////////////////////////pass=1; //置正确标志位TIMSK|=BIT(2); //开启定时/////////////////////////PORTB&=~BIT(5);//开锁指示灯亮//////////////////////////////for(j=0;j<6;j++) //将输入清除{InputData[i]=0;}}else//当两次正确输入时,开启重置密码功能{//DisplayListChar(0,1,SetNew);write_1602com(er);for(j=0;j<16;j++){write_1602dat(SetNew[j]);}TwoAlam(); //操作成功提示ReInputEn=1; //允许重置密码输入CorrectCont=0; //正确计数器清零}}else//============当第一次使用或忘记密码时可以用131420对其密码初始化{if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&& (InputData[5]==0)){WrToROM(initpassword,0,6); //强制将初始密码写入24C02存储//DisplayListChar(0,1,initword); //显示初始化密码write_1602com(er);for(j=0;j<16;j++){write_1602dat(initword[j]);}TwoAlam();Delay400Ms();TwoAlam();N=0;}else{//DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j<16;j++){write_1602dat(Error[j]);}ThreeAlam(); //错误提示音pass=0;}}}else//当已经开启重置密码功能时,而按下开锁键,{//DisplayListChar(0,1,Er_try);write_1602com(er);for(j=0;j<16;j++){write_1602dat(Er_try[j]);}ThreeAlam();}}else{//DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j<16;j++){write_1602dat(Error[j]);}ThreeAlam(); //错误提示音pass=0;}N=0; //将输入数据计数器清零,为下一次输入作准备operation=1;}/********************************************************************************************/ void main(void){uchar KEY,NUM;uchar i,j;segg();port_init();Delay400Ms(); //启动等待,等LCM讲入工作状态lcd_init(); //LCD初始化write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示PORTD=0xFF;TCCR1B=0X05;//1024分频//5msTCNT1H=0XFF;//TCNT1L=0XC5;//TIMSK|=BIT(2);SREG|=BIT(7);for(i=0;i<16;i++){write_1602dat(name[i]);//向液晶屏写日历显示的固定符号部分}write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示for(i=0;i<16;i++){write_1602dat(start_line[i]);//写显示时间固定符号,两个冒号}write_1602com(er+9); //设置光标位置write_1602com(0x0f); //设置光标为闪烁Delay5Ms(); //延时片刻(可不要)N=0; //初始化数据输入位数while(1){if(key_disable==1)Alam_KeyUnable();elsePORTA|=BIT(6); //关报警KEY=keynum();if(KEY!=0){if(key_disable==1){second=0;}else{NUM=coding(KEY);{switch(NUM){case ('A'): ; break;case ('B'): ; break;case ('C'): ; break;case ('D'): ResetPassword(); break; //重新设置密码case ('*'): Cancel(); break; //取消当前输入case ('#'): Ensure(); break; //确认键,default:{//DisplayListChar(0,1,Input);write_1602com(er);for(i=0;i<16;i++){write_1602dat(Input[i]);}operation=0;if(N<6) //当输入的密码少于6位时,接受输入并保存,大于6位时则无效。
密码锁说明书通用摘要:一、密码锁的简介二、密码锁的使用方法1.安装密码锁2.设置密码3.开锁与关锁三、密码锁的维护与注意事项1.维护方法2.注意事项四、密码锁的常见问题及解决方法1.无法开锁2.密码错误3.电池电量低正文:【密码锁的简介】密码锁是一种高科技的锁具,它采用数字密码作为开启方式,相较于传统钥匙锁,密码锁更安全、便捷。
用户只需正确输入设置好的密码,即可轻松开锁。
目前,密码锁已被广泛应用于家庭、办公室、酒店等场所。
【密码锁的使用方法】1.【安装密码锁】在购买密码锁后,首先需要将其安装在门上。
一般来说,密码锁的安装过程并不复杂,只需按照说明书上的指引,将锁具的螺丝孔与门上的螺丝孔对齐,然后用螺丝固定即可。
2.【设置密码】安装好密码锁后,需要设置一个密码。
通常,密码锁的设置步骤如下:a.确保电池电量充足;b.按住锁具上的“设置”键,直到指示灯闪烁;c.按照屏幕上的提示,输入初始密码,通常为“000”或“123”;d.输入新密码,确保密码长度在6-12 位之间,并牢记密码。
3.【开锁与关锁】在设置好密码后,即可通过输入密码来开锁与关锁。
开锁时,只需在锁具的数字键盘上输入正确密码,然后按下“开锁”键;关锁时,则在数字键盘上输入密码后,按下“关锁”键。
【密码锁的维护与注意事项】1.【维护方法】为了确保密码锁的正常使用,需要定期对其进行清洁与保养。
首先,用潮湿的布擦拭锁具表面,以保持其清洁;其次,检查电池电量,确保电池能够正常供电;最后,检查锁芯是否正常,如有异样,及时联系售后服务。
2.【注意事项】在使用密码锁的过程中,需注意以下几点:a.避免用硬物撞击锁具,以免损坏;b.请勿将密码告知他人,以防他人恶意使用;c.请勿将密码设置为过于简单的数字,如“123456”等,以防他人轻易猜到;d.若发现密码锁有异常,请及时联系售后服务。
【密码锁的常见问题及解决方法】1.【无法开锁】如果密码锁无法开锁,可能是以下原因:a.密码错误;b.电池电量低;c.锁芯故障。
一、题目:密码锁控制二、任务要求:1、密码锁由4x4键盘和LCD显示器组成。
2、其基本功能为:(1)使用LCD显示器来显示密码输入的相关信息(2)可以设置4位数字(0-9)密码;(3)内定另一组4位数字密码为‘1234’;(4)密码输入正确则继电器启动2s,密码输入错误则发出警报声。
程序执行后工作指示灯LED亮,表示程序开始执行,LCD 显示“PASSWORD A OR B KEY”,按下操作键A或B动作如下:操作键A:设置新的4位数字密码,操作键B:输入4位数字密码并做检查。
三、组内成员:绪论单片机自二十世纪七十年代问世以来,以其极高的性能价格比受到人们的重视和关注,应用广泛,发展快。
由于其的优点多而突出,所以其的应用领域极广,几乎到了无孔不入的地步。
在我国广泛的应用于工业自动化控制、自动检测、智能仪表、智能家用电器、航空航天系统和国防军事、尖端武器等各个方面。
可以采用软硬件结合的办法提高系统的性能的控制技术为微控技术。
LCD 液晶显示器是Liquid Crystal Display 的简称,是20世纪70年代初发展起来的一种液晶显示器。
随着技术的发展其的分辨率、屏幕发光颜色等进入批量化合实用化。
随着人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,电子锁由于其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲呢。
本系统由单片机系统、矩阵键盘、LCD显示和报警系统组成。
系统能完成开锁、报警、修改用户密码基本的密码锁的功能。
本文详细阐述了个模块的功能以及它们之间的联系。
一、单片机概述采用以8051为核心的单片机控制方案。
利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加调电存储、声光提示甚至添加遥控控制功能。
其原理如图所示。
图2-2单片机控制方案2、单片机80511>、芯片8051有40条引脚,共分为端口线、电源线和控制线三类·4并行I/O端口,每个端口有8条端口线,用于传送数据、地址。
湖南理工学院单片微机原理课程设计说明书设计题目:基于AT24C02的简易电子密码锁院部:机械学院专业:机械电子工程组长姓名: 学号:组员姓名:学号:学号:学号:起迄日期: 2016 年 6月19日 2016 年 6月 30日指导教师:教研室主任:目录1 引言 (4)1.1 电子密码锁简介 (4)1.2 电子密码锁的发展趋势 (4)1.3 本设计所要实现的目标 (5)2 设计方案的选择 (5)2.1 方案一:采用数字电路控制方案 (5)2.2 方案二:采用无线遥控方式控制方案 (5)2.3 方案三:采用以单片机为核心的控制方案 (5)3 主要元器件介绍 (6)3.1 主控芯片AT89S51 (6)3.1.1 AT89S51性能简介 (6)3.1.2 AT89S51引角功能说明 (7)3.2 存储芯片AT24C02 (9)3.3 LCD1602显示器 (10)3.3.1 接口信号说明 (10)3.3.2 主要技术参数 (11)3.3.3 基本操作程序 (11)3.4 晶体振荡器 (12)4 系统硬件构成 (12)4.1 设计原理 (12)4.2 电路总体构成 (13)4.3 键盘输入部分 (13)4.4 密码存储部分 (14)4.5 复位部位 (15)4.6 晶振部分 (15)4.7 显示部分 (15)4.8 报警部分.......................................17Error! Bookmark not defined.4.9 开锁部分.......................................18 Error! Bookmark not defined.5 系统软件设计.....................................19 Error! Bookmark not defined.6 总结.............................................22Error! Bookmark not defined.参考文献............................................23Error! Bookmark not defined.附录一..............................................23Error! Bookmark not defined.附录二 .............................................33 Error! Bookmark not defined.1 引言1.1 电子密码锁简介电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
电子密码锁使用说明一、开启准备:1.通电后密码自动扫描检测,显示屏出现(ALL READY)并进入待机状态,按“#”键开启液晶及线路板进入工作状态。
二、开启:1.插入门锁钥匙,转动至限位,按(#)键唤醒显示屏,输入正确的用户密码1234或管理密码123456,按“#”确认,屏显“OPEN”且屏幕点亮。
2.在6秒钟内向右转动手柄,往外拉开箱门即可,(注:无手柄顺时针旋转钥匙即可。
)(1)输入密码时间超过10秒钟,则显示屏将熄灭,此时重复上述程序重新输入。
(2)若密码输入错误在确认可用“*”键单个键除。
长按2秒可以全部删除以前输入数字。
(3)若输入错误密码,则显示屏显示“ERROR”,并重新切换到待输入状态,若连续三次输入错误,报警1分钟。
输入正确密码可解除报警。
三、密码设置:本产品可以同时设置用户密码和管理密码两组密码,本产品出厂时已经设置,为确安全,请您务必使用前重新设置两组密码。
1.个人密码设置(1)按换码开关一次,显示屏点亮并显示(---------),表示可设置个人密码。
(2)输入你所需要密码,1-8位任意数。
按“#”键确认,屏显示“INTO”,即个人密码输入成功。
2.管理密码设置(1)按“#”键显示屏点亮并显示(---------)。
(2)按“0”两次,再按换码开关一次,显示(---------),表示可设置管理密码。
(3)任意输入1-8位的密码后,按“#”键确认,屏显示“INTO”,即管理密码输入成功。
四、隐码功能:在使用时只显示“—”不出现数字,具体操作方法如下:1.先按“#”键启动电源后,再按“*”键一次,此时输入密码只显示“—”。
2.开启后,自动恢复数字显示。
五、报警功能:1.错误报警密码连续输入三次错误屏幕出现“---------”光标,并报警一分钟,如输入正确密码可解除警报。
2.震动报警在省电状态下,按“0”键一次,屏幕显示“BELL-ON”并进入报警状态,一旦箱体受到外力震动倾斜或冲击,即可马上报警,此时如输入密码即可解除报警,并出现“OPEN”六、更换电池:当显示屏左下方电池显示只剩下一格时,需尽快更换电池。
基于单片机的密码锁
------4位数码管+24C02+蜂鸣器
本系统是基于单片机的密码锁,用户可以通过按键输入4位密码,系统会把用户输入的密码跟之前储存在系统的密码进行比较(出厂默认密码“1234”),如果一致则蜂鸣器发出”滴滴“,数码管显示“YESS”,如果输入错误蜂鸣器发出”滴“,数码管显示“NO”,连续输入三次错误密码,系统自动锁定,数码管显示“dead”,蜂鸣器常鸣,需按复位键从新进入系统。
输入正确密码进入后,用户可以设置新的密码,设置完之后按“确定”键,进入输入密码状态。
上电后,显示“CODE”,等待输入密码:
密码输入正确后提示:
密码输入错误提示:
输入错误3次提示:
详情参照:
/item.htm?spm=a1z10.1.w8789017464.21 .catC8u&id=23157508996。
湖南理工学院单片微机原理课程设计说明书设计题目:基于AT24C02的简易电子密码锁院部:机械学院专业:机械电子工程组长姓名: 学号:组员姓名:学号:学号:学号:起迄日期: 2016 年 6月19日 2016 年 6月 30日指导教师:教研室主任:目录1 引言 (4)1.1 电子密码锁简介 (4)1.2 电子密码锁的发展趋势 (4)1.3 本设计所要实现的目标 (5)2 设计方案的选择 (5)2.1 方案一:采用数字电路控制方案 (5)2.2 方案二:采用无线遥控方式控制方案 (5)2.3 方案三:采用以单片机为核心的控制方案 (5)3 主要元器件介绍 (6)3.1 主控芯片AT89S51 (6)3.1.1 AT89S51性能简介 (6)3.1.2 AT89S51引角功能说明 (7)3.2 存储芯片AT24C02 (9)3.3 LCD1602显示器 (10)3.3.1 接口信号说明 (10)3.3.2 主要技术参数 (11)3.3.3 基本操作程序 (11)3.4 晶体振荡器 (12)4 系统硬件构成 (12)4.1 设计原理 (12)4.2 电路总体构成 (13)4.3 键盘输入部分 (13)4.4 密码存储部分 (14)4.5 复位部位 (15)4.6 晶振部分 (15)4.7 显示部分 (15)4.8 报警部分.......................................17错误!未定义书签。
4.9 开锁部分.......................................18 错误!未定义书签。
5 系统软件设计.....................................19 错误!未定义书签。
6 总结.............................................22错误!未定义书签。
参考文献............................................23错误!未定义书签。
附录一..............................................23错误!未定义书签。
附录二 .............................................33 错误!未定义书签。
1 引言1.1 电子密码锁简介电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。
它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。
现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。
其性能和安全性已大大超过了机械锁。
其特点如下:1) 保密性好,编码量多,远远大于弹子锁。
随机开锁成功率几乎为零。
2) 密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。
3) 误码输入保护,当输入密码多次错误时,报警系统自动启动。
4) 无活动零件,不会磨损,寿命长。
5) 使用灵活性好,不像机械锁必须佩带钥匙才能开锁。
6) 电子密码锁操作简单易行,一学即会。
1.2 电子密码锁的发展趋势在日常生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。
目前门锁主要用弹子锁,其钥匙容易丢失;保险箱主要用机械密码锁,其结构较为复杂,制造精度要求高,成本高,且易出现故障,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。
针对这些锁具给人们带来的不便若使用机械式钥匙开锁,为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。
它的出现为人们的生活带来了很大的方便,有很广阔的市场前景。
由于电子器件所限,以前开发的电子密码锁,其种类不多,保密性差,最基本的就是只依靠最简单的模拟电子开关来实现的,制作简单但很不安全,在后为多是基于EDA 来实现的,其电路结构复杂,电子元件繁多,也有使用早先的20引角的2051系列单片机来实现的,但密码简单,易破解。
随着电子元件的进一步发展,电子密码锁也出现了很多的种类,功能日益强大,使用更加方便,安全保密性更强,由以前的单密码输入发展到现在的,密码加感应元件,实现了真真的电子加密,用户只有密码或电子钥匙中的一样,是打不开锁的,随着电子元件的发展及人们对保密性需求的提高出现了越来越多的电子密码锁。
出于安全、方便等方面的需要许多电子密码锁已相继问世。
但这类产品的特点是针对特定有效卡、指纹或声音有效,且不能实现远程控制,只能适用于保密要求高且供个人使用的箱、柜、房间等。
由于数字、字符、图形图像、人体生物特征和时间等要素均可成为钥匙的电子信息,组合使用这些信息能够使电子防盗锁获得高度的保密性,如防范森严的金库,需要使用复合信息密码的电子防盗锁,这样对盗贼而言是“道高一尺、魔高一丈”。
组合使用信息也能够使电子防盗锁获得无穷扩展的可能,使产品多样化,对用户而言是“千挑百选、自得其所”。
可以看出组合使用电子信息是电子密码锁以后发展的趋势。
1.3 本设计所要实现的目标该密码锁初次使用时的原始密码为123456,用户输入正确的密码信息则能够发出开锁信号。
功能要求:1、能够修改密码。
只有输入原设定的正确密码后才能修改密码。
2、三次输入开锁密码错误,则启动报警。
3、显示按键信息,而且要有按键音。
4、系统设0~9十个数字键,一个密码修改键,一个确认键。
按下密码修改键,先输入原密码,解密正确后键入新密码,按确认键生效。
解密错误启动报警,5秒钟后报警自动解除。
技术要求:1、系统停电后,密码信息不会丢失,上电后仍能正常执行开锁操作。
2、系统安全可靠,不会出现死机现象。
3、密级<106。
2 设计方案的选择2.1 方案一:采用数字电路控制方案用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过10秒(一般情况下,用户不会超过10秒,若用户觉得不便,还可以修改)电路将报警20秒,若电路连续报警三次,电路将锁定键盘2分钟,防止他人的非法操作。
采用数字电路设计的方案好处就是设计简单但控制的准确性和灵活性差。
故不采用。
2.2 方案二:采用无线遥控方式控制方案采用无线电磁波发射模式,此方案的优点在于遥控距离更远,也无需要对准电子锁的位置,但是缺点就是由于本设计是要求设计成为一个一键式发射解锁方式,这样就容易造成无意识的解锁,比如说孩子,或者是自己在无意识的情况下进行了解锁,不利于电子锁的安全防盗。
2.3 方案三:采用以单片机为核心的控制方案由于单片机种类繁多,各种型号都有其一定的应用环境,因此在选用时要多加比较,合理选择,以期获得最佳的性价比。
一般来说在选取单片机时从下面几个方面考虑:性能、存储器、运行速度、I/O口、定时/计数器、串行接口、模拟电路功能、工作电压、功耗、封装形式、抗干扰性、保密性,除了以上的一些的还有一些最基本的比如:中断源的数量和优先级、工作温度范围、有没有低电压检测功能、单片机内有无时钟振荡器、有无上电复位功能等。
在开发过程中单片机还受到:开发工具、编程器、开发成本、开发人员的适应性、技术支持和服务等等因素。
基于以上因素本设计选用单片机AT89S51作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。
在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接AT24C02芯片用于密码的存储,外接LCD1602显示器用于显示作用。
当用户需要开锁时,先按键盘开锁键之后按键盘的数字键0-9输入密码。
密码输完后按下确认键,如果密码输入正确则开锁,不正确显示密码错误重新输入密码,当三次密码错误则发出报警;当用户需要修改密码时,先按下键盘设置键后输入原来的密码,只有当输入的原密码正确后才能设置新密码。
新密码输入无误后按确认键使新密码将得到存储,密码修改成功。
可以看出方案三控制灵活准确性好且保密性强还具有扩展功能,根据现实生活的需要此次设计采用此方案。
3 主要元器件介绍3.1 主控芯片AT89S51AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
3.1.1 AT89S51性能简介AT89S51具有如下特点:40个引脚,4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
图3-1 AT89S51PDIP封装引脚图其主要功能特性:兼容MCS-51指令系统4k可反复擦写(>1000次)ISP Flash ROM32个双向I/O口 4.5-5.5V工作电压2个16位可编程定时/计数器时钟频率0-33MHz全双工UART串行中断口线128x8 bit内部RAM2个外部中断源低功耗空闲和省电模式中断唤醒省电模式3级加密位看门狗(WDT)电路软件设置空闲和省电功能灵活的ISP字节和分页编程双数据寄存器指针可以看出AT89S51提供以下标准功能:4K字节Flash闪速存储器,128字节内部RAM,32个I/O口线,看门狗(WDT),两个数据指针,两个16位定时器/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟。
同时, AT89S51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU 的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式何在RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直接到一个硬件复位。