电子技术综合设计总结报告基于51单片机的电子密码锁.doc

上传人:仙人指路1688 文档编号:4150069 上传时间:2023-04-07 格式:DOC 页数:32 大小:2.23MB
返回 下载 相关 举报
电子技术综合设计总结报告基于51单片机的电子密码锁.doc_第1页
第1页 / 共32页
电子技术综合设计总结报告基于51单片机的电子密码锁.doc_第2页
第2页 / 共32页
电子技术综合设计总结报告基于51单片机的电子密码锁.doc_第3页
第3页 / 共32页
电子技术综合设计总结报告基于51单片机的电子密码锁.doc_第4页
第4页 / 共32页
电子技术综合设计总结报告基于51单片机的电子密码锁.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《电子技术综合设计总结报告基于51单片机的电子密码锁.doc》由会员分享,可在线阅读,更多相关《电子技术综合设计总结报告基于51单片机的电子密码锁.doc(32页珍藏版)》请在三一办公上搜索。

1、电子技术综合设计总结报告基于51单片机的电子密码锁姓 名: 学 号: 专业与班级: 设计题目: 基于51单片机的电子密码锁 时 间: 2011 2012 学年第(1)学期 指导教师: 成 绩: 日 期: 第一章 课题任务基于51单片机的简易电子密码锁一、 实现功能:1、设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。2、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。3、报警、锁定键盘功能。密码输入错误显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。4、AT24C02

2、保存密码,支持复位保存,掉电保存功能。1、第2章 系统总体方案设计方案一:采用数字电路控制。其原理方框图如图21所示。图21 数字密码锁电路方案采用数字密码锁电路的好处就是设计简单。用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过40秒(一般情况下,用户不会超过40秒,若用户觉得不便,还可以修改)电路将报警80秒,若电路连续报警三次,电路将锁定键盘5分钟,防止他人的非法操作。电路由两大部分组成:密码锁电路和

3、备用电源(UPS),其中设置UPS电源是为了防止因为停电造成的密码锁电路失效,使用户免遭麻烦。密码锁电路包含:键盘输入、密码修改、密码检测、开锁电路、执行电路、报警电路、键盘输入次数锁定电路。方案二:采用一种是用以AT89S51为核心的单片机控制方案。利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加调电存储、声光提示甚至添加遥控控制功能。其原理如图22所示。显示模块键盘输入模块 AT89C51报警电路复位电路开锁电路密码存储模块图22单片机控制方案通过比较以上两种方案,单片机方案有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能

4、,而且还可以方便的对系统进行升级,所以我们采用后一种方案。本方案采用一种是用以89c51为核心的单片机控制方案。利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。作用说明:开锁: 插上电源后,输入正确密码,然后按【#】(确认)键,此时锁会打开,可以看到显示open,密码锁打开。1、 退出并关锁:按下【*】(取消)键,此时锁关闭,所有输入清除。2、 修改密码:在开锁状态下,再次输入正确的密码并按下【#】(确认)键,此时听到两声提示,输入新的六位密码并按【D】(重设)键,再重复输入一次新密码并按【D】,会听到报警并锁定键盘:当输入密码错误后,报警并锁定键盘3秒,如

5、3秒内又有按键,3秒再启动。当重置新密码时,新密码会保存于AT24C02存储器里。第3章 硬件电路设计3.1 键盘电路设计使用矩阵键盘,所以本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的I/O线的数目,在按键比较多的时候,通常采用这样方法。其原理如图3.1。图3.1 矩阵键盘每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有NM个按键的键盘。在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就要识别哪一个按键按下。对键

6、的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。对照图3.1所示的44键盘,说明线反转个工作原理。首先辨别键盘中有无键按下,有单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。方法是:向行线输出全扫描字00H,把全部列线置为低电平,然后将列线的电平状态读入累加器A中。如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为1。判断键盘中哪一个键被按下使通过将列线逐列置低电平后,检查行输入状态来实现的。方法是:依次给列线送低电平,然后查所有行线状态,如果全为1,则所按下的键不在此列;如果不全为1,则所按下的键必在此列,而且是在与零电平行线相交的交点上的那

7、个键。具体的功能设计如下按键说明采用4X4键盘输入,键盘对应名称如下:4 2 3 A4 5 6 B7 8 9 C* 0 # D其中,【09】为数字键,用于输入相应的密码, 【*】号键为取消当前操作【#】号键为确认其它键无功能及定义3.2开关电路当输入正确密码时,二极管导通发光。输入错误密码时,二极管不能导通3.3报警电路当输入错误密码时,电路中蜂鸣器开始报警。当输入密码错误三次时,蜂鸣器持续报警34,密码存储模块密码经过修改后,存储在AT24C02中,从而实现掉电保护3.5复位电路第四章 软件设计主程序设计流程图如图5-1所示。 开始 初始化 修改开锁密码正确 输入旧密码N原密码相同 Y开锁出

8、错报警 N N Y设新密码 返回 图5-1主程序流程图键功能程序流程图如图5-2所示。 键功能程序键值=09?键值=开锁?键值=确认?键值=设置? 返回密码输入程序确认程序设置程序开锁程序YNYNYN YN 图5-2 键功能流程图开锁程序流程图如图5-3所示。LCD初始化按开锁键输入密码确认程序开锁N输入密码正确?报警程序开锁成功返回Y 图5-3 开锁流程图程序如下:#include #include#define LCM_Data P0#define uchar unsigned char #define uint unsigned int#define w 6/定义密码位数sbit lcd

9、1602_rs=P25;sbit lcd1602_rw=P26;sbit lcd1602_en=P27;sbit Scl=P34;/24C02串行时钟sbit Sda=P35;/24C02串行数据sbit ALAM = P21;/报警sbit KEY = P20;/开锁sbit open_led=P22;/开锁指示灯bit operation=0;/操作标志位bit pass=0;/密码正确标志bit ReInputEn=0;/重置输入充许标志bit s3_keydown=0;/3秒按键标志位bit key_disable=0;/锁定键盘标志unsigned char countt0,seco

10、nd;/t0中断计数器,秒计数器void Delay5Ms(void);unsigned char code a=0xFE,0xFD,0xFB,0xF7; /控盘扫描控制表unsigned char code start_line= “password: “;unsigned char code name = “=Coded Lock=”;/显示名称unsigned char code Correct = “ correct “; /输入正确unsigned char code Error = “ error “; /输入错误unsigned char code codepass= “ pas

11、s “; unsigned char code LockOpen= “ open “;/OPENunsigned char code SetNew = “SetNewWordEnable”;unsigned char code Input = “input: “;/INPUTunsigned char code ResetOK = “ResetPasswordOK “;unsigned char code initword= “Init password.”;unsigned char code Er_try= “error,try again!”;unsigned char code aga

12、in= “input again “;unsigned char InputData6;/输入密码暂存区unsigned char CurrentPassword6=1,3,1,4,2,0; /当前密码值unsigned char TempPassword6;unsigned char N=0;/密码输入位数记数unsigned char ErrorCont;/错误次数计数unsigned char CorrectCont;/正确输入计数unsigned char ReInputCont; /重新输入计数unsigned char code initpassword6=0,0,0,0,0,0;

13、/=5ms延时=void Delay5Ms(void)unsigned int TempCyc = 5552;while(TempCyc-);/=400ms延时=void Delay400Ms(void) unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA-) TempCycB=7269; while(TempCycB-); /=/=24C02=/=void mDelay(uint t) /延时 uchar I; while(t-) for(i=0;i125;i+) ; void Nop(void) /空操作 _n

14、op_(); _nop_(); _nop_(); _nop_();/*起始条件*/void Start(void) Sda=1; Scl=1; Nop(); Sda=0; Nop(); /*停止条件*/void Stop(void) Sda=0; Scl=1; Nop(); Sda=1; Nop();/*应答位*/void Ack(void)Sda=0;Nop();Scl=1;Nop();Scl=0;/*反向应答位*/void NoAck(void) Sda=1; Nop(); Scl=1; Nop(); Scl=0; /*发送数据子程序,Data为要求发送的数据*/void Send(uch

15、ar Data) uchar BitCounter=8; uchar temp; do temp=Data; Scl=0; Nop(); if(temp&0x80)=0x80) Sda=1; else Sda=0; Scl=1; temp=Data1; Data=temp; BitCounter-; while(BitCounter); Scl=0;/*读一字节的数据,并返回该字节值*/uchar Read(void)uchar temp=0;uchar temp1=0;uchar BitCounter=8;Sda=1;doScl=0;Nop();Scl=1;Nop();if(Sda)temp

16、=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1)temp1=temp1;temp=temp1;BitCounter-;while(BitCounter);return(temp);void WrToROM(uchar Data,uchar Address,uchar Num) uchar I; uchar *Pdata; Pdata=Data; for(i=0;iNum;i+) Start(); Send(0xa0); Ack(); Send(Address+i); Ack(); Send(*(Pdata+i); Ack(); Stop(); mDe

17、lay(20); void RdFromROM(uchar Data,uchar Address,uchar Num) uchar I; uchar *Pdata; Pdata=Data; for(i=0;i0;x-) for(y=110;y0;y-);/-写指令-write_1602com(uchar com)/*液晶写入指令函数*lcd1602_rs=0;/数据/指令选择置为指令lcd1602_rw=0; /读写选择置为写P0=com;/送入数据delay(1);lcd1602_en=1;/拉高使能端,为制造有效的下降沿做准备delay(1);lcd1602_en=0;/en由高变低,产生

18、下降沿,液晶执行命令/-写数据-write_1602dat(uchar dat)/*液晶写入数据函数*lcd1602_rs=1;/数据/指令选择置为数据lcd1602_rw=0; /读写选择置为写P0=dat;/送入数据delay(1);lcd1602_en=1; /en置高电平,为制造下降沿做准备delay(1);lcd1602_en=0; /en由高变低,产生下降沿,液晶执行命令/-初始化-void lcd_init(void)write_1602com(0x38);/设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据write_1602com(0x0c);/开显示不显示光标wr

19、ite_1602com(0x06);/整屏不移动,光标自动右移write_1602com(0x01);/清显示/=/=/=将按键值编码为数值=unsigned char coding(unsigned char m) unsigned char 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

20、(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);/=按键检测并返回按键值=unsigned char keynum(void) unsigned char row,col,I; P1=0xf0; if(P1&0xf0)!=0

21、xf0) Delay5Ms(); Delay5Ms(); if(P1&0xf0)!=0xf0) row=P10xf0; /确定行线i=0;P1=ai; /精确定位while(i4) if(P1&0xf0)!=0xf0) col=(P1&0xff); /确定列线 break; /已定位后提前退出 else i+; P1=ai; else return 0;while(P1&0xf0)!=0xf0);return (row|col); /行线与列线组合后返回 else return 0; /无键按下时返回0/=一声提示音,表示有效输入=void OneAlam(void)ALAM=0;Delay5

22、Ms();ALAM=1;/=二声提示音,表示操作成功=void TwoAlam(void)ALAM=0;Delay5Ms();ALAM=1;Delay5Ms();ALAM=0;Delay5Ms();ALAM=1;/=三声提示音,表示错误=void ThreeAlam(void)ALAM=0;Delay5Ms();ALAM=1;Delay5Ms();ALAM=0;Delay5Ms();ALAM=1;Delay5Ms();ALAM=0;Delay5Ms();ALAM=1;/=显示输入的N个数字,用H代替以便隐藏=void DisplayOne(void)/DisplayOneChar(9+N,1,

23、*);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;i16;i+)write_1602dat(LockOpeni);elseif(N=0)/DisplayListChar(0,1,Error);write_1602com(er);for(i=0;i16;i+)write_1602dat(Errori);else/DisplayListCh

24、ar(0,1,start_line);write_1602com(er);for(i=0;i16;i+)write_1602dat(start_linei);void DisplayInput(void)unsigned char I;if(CorrectCont=1)/DisplayListChar(0,0,Input);write_1602com(er);for(i=0;i16;i+)write_1602dat(Inputi);/=重置密码=/=void ResetPassword(void)unsigned char I;unsigned char j;if(pass=0)pass=0;

25、DisplayChar();ThreeAlam();else if(ReInputEn=1)if(N=6)ReInputCont+;if(ReInputCont=2)for(i=0;i6;)if(TempPasswordi=InputDatai)/将两次输入的新密码作对比i+;else/DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j16;j+)write_1602dat(Errorj);ThreeAlam();/错误提示pass=0;ReInputEn=0;/关闭重置功能,ReInputCont=0;DisplayChar();br

26、eak; if(i=6)/DisplayListChar(0,1,ResetOK);write_1602com(er);for(j=0;j16;j+)write_1602dat(ResetOKj);TwoAlam();/操作成功提示 WrToROM(TempPassword,0,6);/将新密码写入24C02存储ReInputEn=0;ReInputCont=0;CorrectCont=0;elseOneAlam();/DisplayListChar(0, 1, again); /显示再次输入一次write_1602com(er);for(j=0;j16;j+)write_1602dat(ag

27、ainj);for(i=0;i6;i+)TempPasswordi=InputDatai;/将第一次输入的数据暂存起来N=0;/输入数据位数计数器清零 /=输入密码错误超过三过,报警并锁死键盘=void Alam_KeyUnable(void)P1=0x00;ALAM=ALAM;Delay5Ms();/=取消所有操作=void Cancel(void)unsigned char I;unsigned char j;/DisplayListChar(0, 1, start_line); write_1602com(er);for(j=0;j16;j+)write_1602dat(start_li

28、nej);TwoAlam();/提示音for(i=0;i6;i+)InputDatai=0;KEY=1;/关闭锁ALAM=1;/报警关operation=0;/操作标志位清零pass=0;/密码正确标志清零ReInputEn=0;/重置输入充许标志清零ErrorCont=0;/密码错误输入次数清零CorrectCont=0;/密码正确输入次数清零ReInputCont=0;/重置密码输入次数清零 open_led=1;s3_keydown=0;key_disable=0;N=0;/输入位数计数器清零/=确认键,并通过相应标志位执行相应功能=void Ensure(void)unsigned c

29、har I,j;RdFromROM(CurrentPassword,0,6); /从24C02里读出存储密码if(N=6) if(ReInputEn=0)/重置密码功能未开启for(i=0;i6;) if(CurrentPasswordi=InputDatai)i+;else ErrorCont+;if(ErrorCont=3)/错误输入计数达三次时,报警并锁定键盘write_1602com(er);for(i=0;i16;i+)write_1602dat(Errori);doAlam_KeyUnable();while(1);elseTR0=1;/开启定时key_disable=1;/锁定键盘pass=0;break;if(i=6)CorrectCont+;if(CorrectCont=1)/正确输入计数,当只有一次正确输入时,开锁,/DisplayListChar(0,1,LockOpen);write_1602com(er);for(j=0;j16;j+)write_1602dat(LockOpenj);TwoAlam();/操作成功提示音KEY=0;/开锁pass=1;/置正确标志位TR0=1;/开启定时open_led=0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号