基于51单片机密码锁课程设计报告_第1页
基于51单片机密码锁课程设计报告_第2页
基于51单片机密码锁课程设计报告_第3页
基于51单片机密码锁课程设计报告_第4页
基于51单片机密码锁课程设计报告_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一. 设计目的在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。 若使用传统的机械式钥匙开锁,人们常需要携带多把钥匙, 使用极不方便,且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为了满足人们对锁的使用要求, 增加其安全性, 用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。在安全技术防范领域, 具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少, 安全性能差的缺点, 使密码锁无论在技术上还是在性能上都大大提高一步。

2、 随着大规模集成电路技术的发展, 特别是单片机的问世, 出现了带微处理器的只能密码锁, 它除了具有电子密码锁的功能外,还引入了智能化管理、 专家分析系统等功能, 从而使密码锁具有很高的安全性、可靠性,应用日益广泛。本设计采用单片机为主控芯片,结合外围电路,组成电子密码锁,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误就有提示,为了提高安全性, 当密码输入错误次将报警。密码可以由用户自己修改设定,锁开后才能修改密码。 修改密码前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。二 设计要求和方案选择1、方案:用 AT89C52设计的多功能密码锁。以单片机作

3、为微控制器,可以实现基于以上优点,按键有效指示、输入错误、控制开锁、错误报警、密码修改等功能,工作稳定可靠,保密性高,实用性强。2、电子密码锁总体设计电源输入键盘输入显示电路复位电路AT89C52报警电路密码存储开锁电路晶振电路三硬件部分AT89C52简介:单片机 AT89C52简介AT89C52是美国 ATMEL公司生产的低电压,高性能 CMOS 8位单片机,片内含 4K bytes 的可反复擦写的只读程序存储器( EPROM)和 128bytes 的随机存取数据序存器( RAM),器件采用 ATMEL公司的高密度 / 非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用 8 位中

4、央处理器(CPU)和 FLASH存储单元,AT89C52单片机为许多嵌入式控制系统提供了一种灵活行高且价廉的方案。主要特性 :? 与 MCS-51 兼容? 4K 字节可编程 FLASH存储器 ( 寿命: 1000 写 /擦循环 )? 全静态工作: 0Hz-24KHz? 三级程序存储器保密锁定? 128*8 位内部 RAM? 32 条可编程 I/O 线? 两个 16 位定时器 / 计数器? 5 个中断源AT89C52? 可编程串行通道? 低功耗的闲置和掉电模式? 片内振荡器和时钟电路1. 总电路图2. 键盘电路按键与家庭电话式的按键方式3. 复位电路4. 晶振电路5. 显示电路显示容量芯片工作电

5、压工作电流字符尺寸16*2 个字符4.55.5V2.0mA(5v)3.95*4.35mm时刻显示输入输出的内容以及操作过程。6. 报警电路当输入密码错误次数大于等于3 次时,会发出声响报警。7. 开锁电路四软件设计1. 程序设计流程图开始输入密码正确?开锁判断按键上锁键上锁修改密码键输入新密码修改密码结束2. 程序代码#include <REG52.h> #include<intrins.h> #define LCM_Data P0 #define uchar unsigned char #define uint unsignedint#define w 6/定义密码位

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;/锁定键盘标志unsigned char

7、 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"/输

8、入 正确unsigned char code 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= "ResetPasswor

9、dOK "unsigned char code initword= "Init password."unsigned char code Er_try= "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;/

10、 密码输入位数记数unsigned char ErrorCont;/ 错误次数计数unsigned char CorrectCont;/ 正确输入计数unsigned char ReInputCont;/ 重新输入计数unsigned 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;unsignedintTempC

11、ycB;while(TempCycA-)TempCycB=7269;while(TempCycB-);/=24C02=void mDelay(uint t) /延时uchari;while(t-)for(i=0;i<125;i+);void 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(voi

12、d)Sda=0;Nop();Scl=1;Nop();Scl=0;/* 反向应答位 */voidNoAck(void)Sda=1;Nop();Scl=1;Nop();Scl=0;/* 发送数据子程序, Data 为要求发送的数据 */void Send(uchar Data)ucharBitCounter=8;uchar temp;dotemp=Data;Scl=0;Nop();if(temp&0x80)=0x80)Sda=1;elseSda=0;Scl=1;temp=Data<<1;Data=temp;BitCounter-;while(BitCounter);Scl=0;

13、/* 读一字节的数据,并返回该字节值*/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=temp&0xfe;if(BitCounter-1)temp1=temp<<1;temp=temp1;BitCounter-;while(BitCounter);return(temp);voidWrToROM(uchar Data,ucharAddress,ucharNum)uchari;

14、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);voidRdFromROM(uchar Data,ucharAddress,ucharNum)uchari;uchar *PData;PData=Data;for(i=0;i<Num;i+)Start();Send(0xa0);Ack();Send(Address+i);Ack();Start();Send(0xa1);Ack()

15、;*(PData+i)=Read();Scl=0;NoAck();Stop();/=LCD1602=#define yi 0x80/LCD 第一行的初始位置 , 因为 LCD1602字符地址首位 D7恒定为 (1 100000000=80) #define er 0x80+0x40/LCD 第二行初始位置(因为第二行第一个字符位置地址是0x40)/-延时函数,后面经常调用 -void delay(uintxms)/延时函数,有参函数uintx,y;for(x=xms;x>0;x-)for(y=110;y>0;y-);/-write_1602com(uchar com)/*写指令 -

16、液晶写入指令函数 *lcd1602_rs=0;/数据 / 指令选择置为指令.lcd1602_rw=0; /读写选择置为写P0=com;/ 送入数据delay(1);lcd1602_en=1;/拉高使能端,为制造有效的下降沿做准备delay(1);lcd1602_en=0;/en由高变低,产生下降沿,液晶执行命令/-write_1602dat(uchardat)/*写数据 -液晶写入数据函数 *lcd1602_rs=1;/数据 / 指令选择置为数据lcd1602_rw=0; /读写选择置为写P0=dat;/ 送入数据delay(1);lcd1602_en=1; /en 置高电平,为制造下降沿做准

17、备 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);/ 清显示/=将按键值编码为数值 =unsigned char coding(unsigned char m)unsigned char k;switch(m)case (0x18):

18、 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 (0x1

19、1): 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;/ 确定行线i=0;P1=ai;/ 精确定位while(i<

20、;4)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;Delay5Ms();ALAM=

21、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('*');/=显示提

22、示输入 =voidDisplayChar(void)unsigned char i;if(pass=1)/DisplayListChar(0,1,LockOpen);write_1602com(er);for(i=0;i<16;i+)write_1602dat(LockOpeni);elseif(N=0)/DisplayListChar(0,1,Error);write_1602com(er);for(i=0;i<16;i+)write_1602dat(Errori);else/DisplayListChar(0,1,start_line);write_1602com(er);fo

23、r(i=0;i<16;i+)write_1602dat(start_linei);voidDisplayInput(void)unsigned char i;if(CorrectCont=1)/DisplayListChar(0,0,Input);write_1602com(er);for(i=0;i<16;i+)write_1602dat(Inputi);/=重置密码=/=voidResetPassword(void)unsigned char i;unsigned char j;if(pass=0)pass=0;DisplayChar();ThreeAlam();elseif(

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

25、Char(0,1,ResetOK);write_1602com(er);for(j=0;j<16;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;j<16;j+)write_1602dat(againj);for(i=

26、0;i<6;i+)TempPasswordi=InputDatai;/将第一次输入的数据暂存起来N=0;/ 输入数据位数计数器清零/=输 入 密 码 错 误 超 过 三 过 , 报 警 并 锁 死 键 盘=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;j<16;j+)write_1602d

27、at(start_linej);TwoAlam();for(i=0;i<6;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;/ 输入位数计数器清零/=确认键,并通 过相 应标 志位执行相应 功能

28、=void Ensure(void)unsigned char i,j;RdFromROM(CurrentPassword,0,6);/ 从 24C02里读出存储密码if(N=6)if(ReInputEn=0)/ 重置密码功能未开启for(i=0;i<6;)if(CurrentPasswordi=InputDatai)i+;elseErrorCont+;if(ErrorCont=3)/ 错误输入计数达三次时,报警并锁定键盘write_1602com(er);for(i=0;i<16;i+)write_1602dat(Errori);doAlam_KeyUnable();while(

29、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;j<16;j+)write_1602dat(LockOpenj);TwoAlam();/操作成功提示音KEY=0;/ 开锁pass=1;/ 置正确标志位TR0=1;/ 开启定时open_led=0;/ 开锁指示灯亮for(j=0;j<6;j+)/ 将

30、输入清除InputDatai=0;else/ 当两次正确输入时,开启重置密码功能/DisplayListChar(0,1,SetNew);write_1602com(er);for(j=0;j<16;j+)write_1602dat(SetNewj);TwoAlam();/ 操作成功提示ReInputEn=1;/ 允许重置密码输入CorrectCont=0;/ 正确计数器清零else/=当第一次使用或忘记密码时可以用 131420 对其密码初始化 =if(InputData0=1)&&(InputData1=3)&&(InputData2=1)&&

31、amp;(InputData3=4)&&(InputData4=2)&&(InputData5=0)WrToROM(initpassword,0,6);/ 强制将初始密码写入24C02存储/DisplayListChar(0,1,initword);/ 显示初始化密码write_1602com(er);for(j=0;j<16;j+)write_1602dat(initwordj);TwoAlam();Delay400Ms();TwoAlam();N=0;else/DisplayListChar(0,1,Error);write_1602com(er);f

32、or(j=0;j<16;j+)write_1602dat(Errorj);ThreeAlam(); / 错误提示音 pass=0;else / 当已经开启重置密码功能时,而按下开锁键,/DisplayListChar(0,1,Er_try);write_1602com(er);for(j=0;j<16;j+)write_1602dat(Er_tryj);ThreeAlam();else/DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j<16;j+)write_1602dat(Errorj);ThreeAlam();

33、/ 错误提示音 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();/LCD 初始化write_1602com(yi);/日历显示固定符号从第一行第0 个位置之后开始显示for(i=0;i<16;i+)write_1602dat(n

34、amei);/向液晶屏写日历显示的固定符号部分write_1602com(er);/时间显示固定符号写入位置,从第2 个位置后开始显示for(i=0;i<16;i+)write_1602dat(start_linei);/写显示时间固定符号,两个冒号write_1602com(er+9); /设置光标位置write_1602com(0x0f); /设置光标为闪烁Delay5Ms(); /延时片刻 ( 可不要 )N=0;/ 初始化数据输入位数while(1)if(key_disable=1)Alam_KeyUnable();elseALAM=1;/ 关报警KEY2=keynum();if(

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

36、r(0,1,Input);write_1602com(er);for(i=0;i<16;i+)write_1602dat(Inputi);operation=0;if(N<6)/ 当输入的密码少于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(&#

37、39;*');InputDataN=NUM;N+;else/ 输入数据位数大于 6 后,忽略输入OneAlam();for(j=0;j<=N;j+)write_1602com(er+6+j);write_1602dat('*');N=6;break;/*中断服务函数*void time0_int(void) interrupt 1TL0=0xB0;TH0=0x3C;/TR0=1;countt0+;if(countt0=20)countt0=0;second+;if(pass=1)if(second=1)open_led=1;/ 关指示灯TR0=0;/ 关定时器TL0=0xB0;TH0=0x3C;second=0;elseif(second=3)TR0=0;second=0;key_disable=0;s3_keydown=0;TL0=0xB0;TH0=0x3C;elseTR0=1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论