您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于51单片机密码锁课程设计报告
一.设计目的在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需要携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为了满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少,安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的只能密码锁,它除了具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。本设计采用单片机为主控芯片,结合外围电路,组成电子密码锁,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误就有提示,为了提高安全性,当密码输入错误次将报警。密码可以由用户自己修改设定,锁开后才能修改密码。修改密码前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。二.设计要求和方案选择1、方案:用AT89C52设计的多功能密码锁。以单片机作为微控制器,可以实现基于以上优点,按键有效指示、输入错误、控制开锁、错误报警、密码修改等功能,工作稳定可靠,保密性高,实用性强。2、电子密码锁总体设计三.硬件部分AT89C52键盘输入复位电路密码存储晶振电路电源输入显示电路报警电路开锁电路AT89C52简介:单片机AT89C52简介AT89C52是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4Kbytes的可反复擦写的只读程序存储器(EPROM)和128bytes的随机存取数据序存器(RAM),器件采用ATMEL公司的高密度/非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和FLASH存储单元,AT89C52单片机为许多嵌入式控制系统提供了一种灵活行高且价廉的方案。主要特性:•与MCS-51兼容•4K字节可编程FLASH存储器(寿命:1000写/擦循环)•全静态工作:0Hz-24KHz•三级程序存储器保密锁定•128*8位内部RAM•32条可编程I/O线•两个16位定时器/计数器•5个中断源•可编程串行通道•低功耗的闲置和掉电模式•片内振荡器和时钟电路1.总电路图2.键盘电路AT89C52按键与家庭电话式的按键方式3.复位电路4.晶振电路5.显示电路显示容量芯片工作电压工作电流字符尺寸16*2个字符4.5~5.5V2.0mA(5v)3.95*4.35mm时刻显示输入输出的内容以及操作过程。6.报警电路当输入密码错误次数大于等于3次时,会发出声响报警。7.开锁电路四.软件设计1.程序设计流程图开始输入密码正开锁判断按上锁键上锁修改密码键输入新密码修改密码结束2.程序代码#includeREG52.h#includeintrins.h#defineLCM_DataP0#defineucharunsignedchar#defineuintunsignedint#definew6//定义密码位数sbitlcd1602_rs=P2^5;sbitlcd1602_rw=P2^6;sbitlcd1602_en=P2^7;sbitScl=P3^4;//24C02串行时钟sbitSda=P3^5;//24C02串行数据sbitALAM=P2^1;//报警sbitKEY=P2^0;//开锁sbitopen_led=P2^2;//开锁指示灯bitoperation=0;//操作标志位bitpass=0;//密码正确标志bitReInputEn=0;//重置输入充许标志bits3_keydown=0;//3秒按键标志位bitkey_disable=0;//锁定键盘标志unsignedcharcountt0,second;//t0中断计数器,秒计数器voidDelay5Ms(void);unsignedcharcodea[]={0xFE,0xFD,0xFB,0xF7};//控盘扫描控制表unsignedcharcodeb[]={0123456789};unsignedcharcodestart_line[]={password:};unsignedcharcodename[]={===CodedLock===};//显示名称unsignedcharcodeCorrect[]={correct};//输入正确unsignedcharcodeError[]={error};//输入错误unsignedcharcodecodepass[]={pass};unsignedcharcodeLockOpen[]={open};//OPENunsignedcharcodeSetNew[]={SetNewWordEnable};unsignedcharcodeInput[]={input:};//INPUTunsignedcharcodeResetOK[]={ResetPasswordOK};unsignedcharcodeinitword[]={Initpassword...};unsignedcharcodeEr_try[]={error,tryagain!};unsignedcharcodeagain[]={inputagain};unsignedcharInputData[6];//输入密码暂存区unsignedcharCurrentPassword[6]={1,3,1,4,2,0};//当前密码值unsignedcharTempPassword[6];unsignedcharN=0;//密码输入位数记数unsignedcharErrorCont;//错误次数计数unsignedcharCorrectCont;//正确输入计数unsignedcharReInputCont;//重新输入计数unsignedcharcodeinitpassword[6]={0,0,0,0,0,0};//=====================5ms延时==============================voidDelay5Ms(void){unsignedintTempCyc=5552;while(TempCyc--);}//===================400ms延时==============================voidDelay400Ms(void){unsignedcharTempCycA=5;unsignedintTempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);}}//================================24C02======================================voidmDelay(uintt)//延时{uchari;while(t--){for(i=0;i125;i++){;}}}voidNop(void)//空操作{_nop_();_nop_();_nop_();_nop_();}/*起始条件*/voidStart(void){Sda=1;Scl=1;Nop();Sda=0;Nop();}/*停止条件*/voidStop(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为要求发送的数据*/voidSend(ucharData){ucharBitCounter=8;uchartemp;do{temp=Data;Scl=0;Nop();if((temp&0x80)==0x80)Sda=1;elseSda=0;Scl=1;temp=Data1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}/*读一字节的数据,并返回该字节值*/ucharRead(void){uchartemp=0;uchartemp1=0;ucharBitCounter=8;Sda=1;do{Scl=0;Nop();Scl=1;Nop();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){temp1=temp1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}voidWrToROM(ucharData[],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(ucharData[],ucharAddress,ucharNum){uchari;uchar*PData;PData=Data;for(i=0;iNum;i++){Start();Send(0xa0);Ack();Send(Address+i);Ack();Start();Send(0xa1);Ack();*(PData+i)=Read();Scl=0;NoAck();Stop();}}//=======================================LCD1602=============================#defineyi0x80//LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#defineer0x80+0x40//LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)//----------------延时函数,后面经常调用----------------------voiddelay(uintxms)//延时函数,有参函数{uintx,y;for(x=xms;x0;x--)for(y=110;y0;y--);}//--------------------------写指令---------------------------write_1602com(ucharcom)//****液晶写入指令函数****{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置高电平,为制造下降沿做准备delay(1);lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令}//-------------------------初始化-------------
本文标题:基于51单片机密码锁课程设计报告
链接地址:https://www.777doc.com/doc-3834600 .html