基于51单片机密码锁课程设计报告(18页).docx

上传人:1595****071 文档编号:37047247 上传时间:2022-08-29 格式:DOCX 页数:18 大小:308.19KB
返回 下载 相关 举报
基于51单片机密码锁课程设计报告(18页).docx_第1页
第1页 / 共18页
基于51单片机密码锁课程设计报告(18页).docx_第2页
第2页 / 共18页
点击查看更多>>
资源描述

《基于51单片机密码锁课程设计报告(18页).docx》由会员分享,可在线阅读,更多相关《基于51单片机密码锁课程设计报告(18页).docx(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、-基于51单片机密码锁课程设计报告-第 18 页单片机课程设计报告题目:简易电子密码锁设计专业: 自动化 班级: 2013届1班 姓名: 梁小龙 同组队员:陈文杰、王珏文、陈绮雯、吴秀玲、何佳炽 学号: 201330087109 日期: 2015 年 3月 一.设计目的在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需要携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为了满足人们对锁的使用要求,增加其安全性,用密码代替

2、钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少,安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的只能密码锁,它除了具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。本设计采用单片机为主控芯片,结合外围电路,组成电子密码锁,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误就有提示,为了提高安全性

3、,当密码输入错误次将报警。密码可以由用户自己修改设定,锁开后才能修改密码。修改密码前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。二设计要求和方案选择1、 方案:用AT89C52设计的多功能密码锁。以单片机作为微控制器,可以实现基于以上优点,按键有效指示、输入错误、控制开锁、错误报警、密码修改等功能,工作稳定可靠,保密性高,实用性强。AT89C52晶振电路密码存储复位电路键盘输入开锁电路报警电路显示电路电源输入2、 电子密码锁总体设计三硬件部分AT89C52简介:单片机AT89C52简介AT89C52是美国ATMEL公司生产的低电压,高性能CMOS 8位单片机,片内含4K by

4、tes的可反复擦写的只读程序存储器(EPROM)和128bytes的随机存取数据序存器(RAM),器件采用ATMEL公司的高密度/非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和FLASH存储单元,AT89C52单片机为许多嵌入式控制系统提供了一种灵活行高且价廉的方案。主要特性: 与MCS-51 兼容 4K字节可编程FLASH存储器(寿命:1000写/擦循环) 全静态工作:0Hz-24KHz 三级程序存储器保密锁定 128*8位内部RAM 32条可编程I/O线AT89C52 两个16位定时器/计数器 5个中断源 可编程串行通道 低功耗的闲置和掉电模式 片

5、内振荡器和时钟电路1. 总电路图 2. 键盘电路按键与家庭电话式的按键方式3. 复位电路4. 晶振电路5. 显示电路显示容量芯片工作电压工作电流字符尺寸16*2个字符4.55.5V2.0mA(5v)3.95*4.35mm时刻显示输入输出的内容以及操作过程。6. 报警电路当输入密码错误次数大于等于3次时,会发出声响报警。7. 开锁电路四软件设计1.程序设计流程图修改密码输入新密码修改密码键上锁上锁键判断按键结束开锁正确?输入密码开始2.程序代码#include #include#define LCM_Data P0#define uchar unsigned char #define uint

6、unsignedint#define w 6/定义密码位数sbit lcd1602_rs=P25;sbit lcd1602_rw=P26;sbit lcd1602_en=P27;sbitScl=P34;/24C02串行时钟sbitSda=P35;/24C02串行数据sbit ALAM = P21;/报警sbit KEY = P20;/开锁sbitopen_led=P22;/开锁指示灯bit operation=0;/操作标志位bit pass=0;/密码正确标志bit ReInputEn=0;/重置输入充许标志bit s3_keydown=0;/3秒按键标志位bit key_disable=0

7、;/锁定键盘标志unsigned char countt0,second;/t0中断计数器,秒计数器void Delay5Ms(void);unsigned char code a=0xFE,0xFD,0xFB,0xF7; /控盘扫描控制表unsigned char code b=0123456789;unsigned char code start_line= password: ;unsigned char code name = =Coded Lock=; /显示名称unsigned char code Correct = correct ;/输入正确unsigned char code

8、 Error = error ; /输入错误unsigned char code codepass= pass ; 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=

9、 error,try again!;unsigned char code again= 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; /重新输入计数unsigne

10、d char code initpassword6=0,0,0,0,0,0;/=5ms延时=void Delay5Ms(void)unsignedintTempCyc = 5552;while(TempCyc-);/=400ms延时=void Delay400Ms(void)unsigned char TempCycA = 5;unsignedintTempCycB;while(TempCycA-)TempCycB=7269;while(TempCycB-);/=24C02=void mDelay(uint t) /延时uchari;while(t-)for(i=0;i125;i+)void

11、Nop(void) /空操作_nop_();_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();/*应答位*/voidAck(void)Sda=0;Nop();Scl=1;Nop();Scl=0;/*反向应答位*/voidNoAck(void)Sda=1;Nop();Scl=1;Nop();Scl=0; /*发送数据子程序,Data为要求发送的数据*/void Send(uchar D

12、ata)ucharBitCounter=8;uchar temp;dotemp=Data;Scl=0;Nop();if(temp&0x80)=0x80)Sda=1;elseSda=0;Scl=1;temp=Data1;Data=temp;BitCounter-;while(BitCounter);Scl=0;/*读一字节的数据,并返回该字节值*/uchar Read(void)uchar temp=0;uchar temp1=0;ucharBitCounter=8;Sda=1;doScl=0;Nop();Scl=1;Nop();if(Sda)temp=temp|0x01;elsetemp=te

13、mp&0xfe;if(BitCounter-1)temp1=temp1;temp=temp1;BitCounter-;while(BitCounter);return(temp);voidWrToROM(uchar Data,ucharAddress,ucharNum)uchari;uchar *PData;PData=Data;for(i=0;iNum;i+)Start();Send(0xa0);Ack();Send(Address+i);Ack();Send(*(PData+i);Ack();Stop();mDelay(20);voidRdFromROM(uchar Data,ucharA

14、ddress,ucharNum)uchari;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由高变低,产生下降沿,液晶执行命令/-写数据-write_1602dat(uchardat)/*液晶写入数据

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

16、);/清显示/=将按键值编码为数值=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 (0x84): k=B;break;case (0x12): k=7;break;case (0x22):

17、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)!=0xf0)Delay5Ms();Delay5Ms();if(P1&0xf0)!=0xf0)row=P10xf0; /

18、确定行线i=0;P1=ai;/精确定位while(i4)if(P1&0xf0)!=0xf0)col=(P1&0xff); /确定列线break; /已定位后提前退出 elsei+;P1=ai;elsereturn 0;while(P1&0xf0)!=0xf0);return (row|col);/行线与列线组合后返回else return 0;/无键按下时返回0/=一声提示音,表示有效输入=voidOneAlam(void)ALAM=0;Delay5Ms(); ALAM=1;/=二声提示音,表示操作成功=voidTwoAlam(void)ALAM=0;Delay5Ms(); ALAM=1;De

19、lay5Ms();ALAM=0;Delay5Ms(); ALAM=1;/=三声提示音,表示错误=voidThreeAlam(void)ALAM=0;Delay5Ms(); ALAM=1;Delay5Ms();ALAM=0;Delay5Ms(); ALAM=1;Delay5Ms();ALAM=0;Delay5Ms(); ALAM=1;/=显示输入的N个数字,用H代替以便隐藏=voidDisplayOne(void)/DisplayOneChar(9+N,1,*);write_1602com(yi+5+N);write_1602dat(*);/=显示提示输入=voidDisplayChar(voi

20、d)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/DisplayListChar(0,1,start_line);write_1602com(er);for(i=0;i16;i+)write_1602dat(start

21、_linei);voidDisplayInput(void)unsigned char i;if(CorrectCont=1)/DisplayListChar(0,0,Input);write_1602com(er);for(i=0;i16;i+)write_1602dat(Inputi);/=重置密码=voidResetPassword(void)unsigned char i;unsigned char j;if(pass=0)pass=0;DisplayChar();ThreeAlam();elseif(ReInputEn=1)if(N=6)ReInputCont+;if(ReInput

22、Cont=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();break;if(i=6)/DisplayListChar(0,1,ResetOK);write_1602com(er);for(j=0;j16;j+)wr

23、ite_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(againj);for(i=0;i6;i+)TempPasswordi=InputDatai;/将第一次输入的数据暂存起来N=0;/输入数据位数计数器清零/=输

24、入密码错误超过三过,报警并锁死键盘=voidAlam_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_linej);TwoAlam();/提示音for(i=0;i6;i+)InputDatai=0;KEY=1;/关闭锁ALAM=1;/报警关operation=0;/

25、操作标志位清零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 char i,j;RdFromROM(CurrentPassword,0,6); /从24C02里读出存储密码if(N=6) if(ReInputEn=0)/重置

26、密码功能未开启for(i=0;i6;)if(CurrentPasswordi=InputDatai)i+;elseErrorCont+;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)/正确输入计数,当只有一次正确输入时,开锁,/DisplayL

27、istChar(0,1,LockOpen);write_1602com(er);for(j=0;j16;j+)write_1602dat(LockOpenj);TwoAlam(); /操作成功提示音KEY=0;/开锁pass=1;/置正确标志位TR0=1;/开启定时open_led=0;/开锁指示灯亮for(j=0;j6;j+)/将输入清除InputDatai=0;else/当两次正确输入时,开启重置密码功能/DisplayListChar(0,1,SetNew);write_1602com(er);for(j=0;j16;j+)write_1602dat(SetNewj);TwoAlam()

28、;/操作成功提示ReInputEn=1;/允许重置密码输入CorrectCont=0;/正确计数器清零else/=当第一次使用或忘记密码时可以用131420对其密码初始化=if(InputData0=1)&(InputData1=3)&(InputData2=1)&(InputData3=4)&(InputData4=2)&(InputData5=0)WrToROM(initpassword,0,6); /强制将初始密码写入24C02存储/DisplayListChar(0,1,initword);/显示初始化密码write_1602com(er);for(j=0;j16;j+)write_1

29、602dat(initwordj);TwoAlam();Delay400Ms();TwoAlam();N=0;else/DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j16;j+)write_1602dat(Errorj);ThreeAlam();/错误提示音pass=0;else/当已经开启重置密码功能时,而按下开锁键,/DisplayListChar(0,1,Er_try);write_1602com(er);for(j=0;j16;j+)write_1602dat(Er_tryj);ThreeAlam();else/Displa

30、yListChar(0,1,Error);write_1602com(er);for(j=0;j16;j+)write_1602dat(Errorj);ThreeAlam();/错误提示音pass=0;N=0;/将输入数据计数器清零,为下一次输入作准备operation=1;/=主函数=void main(void)unsigned char KEY2,NUM,M;unsigned char i,j;P1=0xFF; TMOD=0x11;TL0=0xB0;TH0=0x3C;EA=1;ET0=1;TR0=0;Delay400Ms(); /启动等待,等LCM讲入工作状态lcd_init(); /L

31、CD初始化write_1602com(yi);/日历显示固定符号从第一行第0个位置之后开始显示for(i=0;i16;i+)write_1602dat(namei);/向液晶屏写日历显示的固定符号部分write_1602com(er);/时间显示固定符号写入位置,从第2个位置后开始显示for(i=0;i16;i+)write_1602dat(start_linei);/写显示时间固定符号,两个冒号write_1602com(er+9);/设置光标位置write_1602com(0x0f);/设置光标为闪烁Delay5Ms(); /延时片刻(可不要)N=0;/初始化数据输入位数while(1)i

32、f(key_disable=1)Alam_KeyUnable();elseALAM=1;/关报警KEY2=keynum();if(KEY2!=0)if(key_disable=1)second=0;elseNUM=coding(KEY2);switch(NUM)case (A): ; break;case (B):; break;case (C): ; break;case (D): ResetPassword();break; /重新设置密码case (*): Cancel();break; /取消当前输入case (#): Ensure(); break; /确认键,default: /D

33、isplayListChar(0,1,Input);write_1602com(er);for(i=0;i16;i+)write_1602dat(Inputi);operation=0;if(N6) /当输入的密码少于6位时,接受输入并保存,大于6位时则无效。OneAlam();/按键提示音/DisplayOneChar(6+N,1,*);for(j=0;j=N;j+)write_1602com(er+6+j);write_1602dat(bNUM);Delay5Ms();Delay5Ms();write_1602com(er+6+j); write_1602dat(*);InputDataN=NUM;N+;else/输入数据位数大于6后,忽略输入OneAlam();for(j=0;j=N;j+)write_1602com(er+6+j); write_1602dat(*);N=6;break;/*

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁