单片机课程设计报告电子密码锁.docx
- 文档编号:27708504
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:27
- 大小:230.51KB
单片机课程设计报告电子密码锁.docx
《单片机课程设计报告电子密码锁.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告电子密码锁.docx(27页珍藏版)》请在冰豆网上搜索。
单片机课程设计报告电子密码锁
目录
1绪论………………………………………………………………………………2
1.1本设计所要实现的目标………………………………………………………2
1.2设计方案简介…………………………………………………………………2
2系统总体方案设计………………………………………………………………2
设计框图………………………………………………………………………2
3硬件系统构成……………………………………………………………………3
3.1电源输入电路…………………………………………………………………3
3.2键盘输入电路…………………………………………………………………3
3.3密码存储电路…………………………………………………………………4
3.4复位电路……………………………………………………………………4
3.5晶振电路……………………………………………………………………5
3.6显示电路……………………………………………………………………5
3.7报警电路……………………………………………………………………6
3.8开锁电路……………………………………………………………………6
4软件系统设计……………………………………………………………………7
4.1主程序流程图………………………………………………………………8
结论…………………………………………………………………………………8
附录1硬件原理图…………………………………………………………………8
附录2C语言程序…………………………………………………………………9
1绪论
1.1本设计所要实现的目标
本设计采用单片机为主控芯片,结合外围电路,组成电子密码锁,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误有提示,为了提高安全性,当密码输入错误三次将报警。
密码可以有用户自己修改设定,锁打开后才能修改密码。
修改密码之前必须再次输入旧的密码,在输入新密码的时候要二次确认,以防止误操作。
1.2设计方案简介
采用以单片机为核心的控制方案
一般来说在选取单片机时从下面几个方面考虑:
性能、存储器、运行速度、I/O口、定时/计数器、串行接口、模拟电路功能、工作电压、功耗、封装形式、抗干扰性、保密性,除了以上的一些的还有一些最基本的比如:
中断源的数量和优先级、工作温度范围、有没有低电压检测功能、单片机内有无时钟振荡器、有无上电复位功能等。
在开发过程中单片机还受到:
开发工具、编程器、开发成本、开发人员的适应性、技术支持和服务等等因素。
基于以上因素本设计选用单片机80C51作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。
在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接AT24C02芯片用于密码的存储,外接LCD1602显示器用于显示作用。
当用户需要开锁时,先按键盘开锁键之后按键盘的数字键0-9输入密码。
密码输完后按下确认键,如果密码输入正确则开锁,不正确显示密码错误重新输入密码,当三次密码错误则发出报警;当用户需要修改密码时,先按下键盘设置键后输入原来的密码,只有当输入的原密码正确后才能设置新密码。
新密码输入无误后按确认键使新密码将得到存储,密码修改成功。
2系统总体方案设计
设计框图
设计框图见图2-1。
图2-1系统设计框图
3硬件系统设计
3.1电源输入电路
密码锁主要控制部分电源需要用5V直流电源供电,其电路如图3-1所示,而5V电源输入时往往伴有杂波,所以加一个2.2uF的电容滤波。
这样输出的电压一般能满足要求。
图3-1电源输入电路原理图
3.2键盘输入电路
由于本设计所用到的按键数量较多而不适合用独立按键式键盘。
采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。
本设计中使用的这个4*4键盘不但能完成密码的输入还能作特别功能键使用,比如清空显示功能等。
键盘的每个按键功能在程序设计中设置。
其大体功能(看键盘按键上的标记)及与单片机引脚接法见图3-2。
图3-2键盘输入原理图
3.3密码存储电路
AT24C02是ATMEL公司的2KB字节的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10Ua(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8脚的DIP封装,使用方便。
其电路见图3-3。
图3-3AT24C02引脚图
图中1、2、3脚是三条地址线,用于确定芯片的硬件地址,在80C51上它们都能接地,第5脚和第8脚分别为正、负电源。
AT24C02中带有片内地址寄存器,每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个储存单元的读写,所有字节均以单一操作方式读取。
3.4复位电路
单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。
无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。
在复位期间(即RST为高电平期间),P0口为高组态,P1-P3口输出高电平;外部程序存储器读选通信号PSEN无效。
地址锁存信号ALE也为高电平。
该电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容C1上的电压很小,复位下拉电阻上的电压接近电源电压,即RST为高电平,在电容充电的过程中RST端电压逐渐下降,当RST端的电压小于某一数值后,CPU脱离复位状态,由于电容C1足够大,可以保证RST高电平有效时间大于24个振荡周期,CPU能够可靠复位。
增加手动复位按键是为了避免死机时无法可靠复位。
当复位按键按下后电容C1通过R5放电。
当电容C1放电结束后,RST端的电位由R11与R15分压比决定。
由于R11< R11的作用在于限制按键按下瞬间电容C1的放电电流,避免产生火花,以保护按键触电。 复位电路原理图见图3-4。 图3-4复位电路原理图 3.5晶振电路 AT89C51引脚XTAL1和XTAL2与晶体振荡器及电容C2、C1按图3-5所示方式连接。 晶振、电容C2/C3及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容C1、C2的容量有关,但主要由晶振频率决定,范围在0~33MHz之间,电容C2、C3取值范围在5~30pF之间。 根据实际情况,本设计中采用12MHZ做系统的外部晶振。 电容取值为20pF。 图3-5晶振电路原理图 3.6显示电路 为了提高密码锁的密码显示效果能力。 本设计的显示部分由液晶显示器LCD1602取代普通的数码管来完成。 只有按下键盘上的开启按键后,显示器才处于开启状态。 同理只有按下关闭按键后显示器才处于关闭状态。 否则显示器将一直处于初始状态,当需要对密码锁进行开锁时,按下键盘上的开锁按键后利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个*。 当密码输入完成时,按下确认键,如果输入的密码正确的话,LCD子显示“RIGHT”,单片机其中P2.0引角会输出低电平,使三极管T2导通,电磁铁吸合,电子密码锁被打开,如果密码不正确,LCD显示屏会显示“ERROR”,P2.0输出的是高电平,电子密码锁不能被打开。 通过LCD显示屏,可以清楚的判断出密码锁所处的状态。 其显示部分引脚接口见图3-6。 图3-6显示电路原理图 3.7报警电路 报警部分由陶瓷压电发声装置及外围电路组成,加电后不发声,当有键按下时,“叮”声,每按一下,发声一次,密码正确时,不发声直接开锁,当密码输入错误时,单片机的P2.1引脚为低电平,三极管T3导喇叭发出噪鸣声报警。 见图3-7。 图3-7报警电路原理图 3.8开锁电路 通过单片机开锁执行机构,电路驱动电磁锁吸合,从而达到开锁的目的。 其原理见图3-8。 图3-8密码锁开锁机构示意图 当用户输入的密码正确时,单片机便输出开门信号,送到开锁驱动电路,然后驱动电磁锁,达到开门的目的。 其实际电路见图3-9。 电路由驱动和开锁两级组成。 由D1、R12、Q1组成驱动电路,其中Q1可以选择普通的小功率三极管如8050、9018都可以满足要求。 D1是开锁指示灯;由D2、C5组成开锁。 其中D2、C5是为了消除电磁锁可能产生的反向高电压以及可能产生的电磁干扰。 电磁锁的选用要视情况而定,但是吸合力要足够且有一定的余量。 在设计中,暂时用发光二极管代替电磁锁,发光管亮,表示开锁;灭,表示没有开锁。 图3-9开锁电路原理图 4系统软件设计 4.1主程序流程图 如图4-1为主程序流程图,开始接上电源,程序进行初始化设置,然后在键盘上输入密码,此系统进行键盘扫描,密码正确,开锁成功,密码错误3次出错报警,选择是否修改密码,若要修改密码,先输入旧密码,密码正确后设置新密码,错误时报警,需要两次确认新密码,确认后,密码修改成功,否则结束最终返回。 然后启动程序,进行保护,再次在键盘上输入密码,系统进行扫描,如果和之前一样,则执行相同程序,如不是,则执行另一种程序。 图4-1主程序流程图 结论 通过这次课程设计,无论从选题到定稿,从理论到实践都使我学到了很多东西,它不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。 同时也明白了理论与实践相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。 附录1硬件原理图 附录2C语言程序 #include #include #include #defineucharunsignedchar #defineuintunsignedint #defineLCDIOP0 #definedelay4us()_nop_();_nop_();_nop_();_nop_(); ucharbuffer[6]={0}; sbitsda=P3^4; sbitscl=P3^3; sbitbeep=P3^7; sbitrelay=P2^3; sbithuifu=P2^6; bitflag=0,aa; ucharDSY_BUFFER[16]=""; ucharDSY_BUFFER1[16]=""; ucharUserpassword[6]={0}; ucharMem[6]={0}; sbitrs=P2^0; sbitrd=P2^1; sbitlcden=P2^2; sbitled=P2^4; sbitled1=P2^7; ucharcodetable2[]="123456"; ucharcodetable[]="Inputyourcode: "; voiddelayms(uintz) { uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } voiddelay() {;;} voidwrite_com(ucharcom) { rs=0; rd=0; lcden=0; P0=com; delayms(3); lcden=1; delayms(3); lcden=0; } voidwrite_date(uchardate) { rs=1; rd=0; lcden=0; P0=date; delayms(3); lcden=1; delayms(3); lcden=0; } voidDisplay_String(uchar*p,ucharcom) {uchari; write_com(com); for(i=0;i<16;i++) { write_date(p[i]); } } voidinit_lcd() { lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); Display_String(table,0x80); Display_String("===LockOK! ======",0xc0); } voidstart() { sda=1; scl=1; delay4us(); sda=0; delay4us(); scl=0; } voidstop() { sda=0; scl=1; delay4us(); sda=1; delay4us(); scl=0; } voidinit() { sda=1; delay(); scl=1; delay(); } voidack() { sda=0; scl=1; delay4us(); scl=0; sda=1; } voidnoack() { sda=1; scl=1; delay4us(); scl=0; sda=0; } ucharrecbyte() { uchari,rd; rd=0x00; sda=1; for(i=0;i<8;i++) { scl=1; rd<<=1; rd|=sda; delay4us(); scl=0; delay4us(); } scl=0; delay4us(); returnrd; } ucharsendbyte(ucharwd) { uchari; bitack0; for(i=0;i<8;i++) { sda=(bit)(wd&0x80); _nop_(); _nop_(); scl=1; delay4us(); scl=0; wd<<=1; } delay4us(); sda=1; scl=1; delay4us(); ack0=! sda; scl=0; delay4us(); returnack0; } ucharRecstring(ucharslave,ucharsubaddr,uchar*buffer,ucharn) { uchari; start(); if(! sendbyte(slave))return0; if(! sendbyte(subaddr))return0; start(); if(! sendbyte(slave+1))return0; for(i=0;i { buffer[i]=recbyte(); ack(); } buffer[n-1]=recbyte(); noack(); stop(); return1; } ucharSendstring(ucharslave,ucharsubaddr,uchar*buffer,ucharn) { uchari; start(); if(! sendbyte(slave))return0; if(! sendbyte(subaddr))return0; for(i=0;i { if(! sendbyte(buffer[i]))return0; } stop(); return1; } voidclear_password() {uchari; for(i=0;i<6;i++) { Userpassword[i]=''; } for(i=0;i<16;i++) { DSY_BUFFER[i]=''; } } ucharKeys_Scan() { uchartemp,keynum; P1=0x0F; delayms(5); temp=P1^0x0F; switch(temp) { case1: keynum=1;break; case2: keynum=4;break; case4: keynum=7;break; case8: keynum=10;break; break; } P1=0xF0; delayms(5); temp=P1>>4^0x0f; switch(temp) { case8: keynum+=0;break; case4: keynum+=1;break; case2: keynum+=2;break; case1: keynum+=12;break; break; } delayms(600); returnkeynum; } voidmain() {uchartemp,i=0,j=0,k=0,n,m=0,flay,error,ne=1; ucharIS_valid_user; relay=1; init(); init_lcd(); delayms(5); P1=0x0f; while (1) {if(! huifu==1) {aa=Sendstring(0xa0,1,table2,6); delayms(10); aa=Recstring(0xa0,1,buffer,6); } else aa=Recstring(0xa0,1,buffer,6); if(P1! =0x0f) {delayms(10); if(P1! =0x0f) { temp=Keys_Scan(); switch(temp) { case11: temp=0;case1: case2: case3: case4: case5: case6: case7: case8: case9: if(i<=5) { Userpassword[i]=temp; DSY_BUFFER[i]='*'; Display_String(DSY_BUFFER,0xc0); i++; } break; case19: if(i! =0) {i--; for(n=0;n { DSY_BUFFER1[n]=temp+'*'; } } Display_String(DSY_BUFFER1,0xc0); break; case12: for(k=0;k<6;k++) { if(buffer[k]==(Userpassword[k]+48)) flag=1; else flag=0; } if(flag==1) {flag=0; i=0; led=0; relay=0; clear_password(); Display_String("OPENOK! ",0xc0); IS_valid_user=1; j=0; error=0; } else { j++; error++; led=1;clear_password(); Display_String("ERROR! Retry: ",0xc0); write_com(0xcf); write_date(0x30+j); IS_valid_user=0; } i=0; break; case10: led=1; relay=1; clear_password(); Display_String(table,0x80); Display_String("===LockOK! =====",0xc0); i=0; IS_valid_user=0; break; case13: if(! IS_valid_user) { i=0; Display_String("==Norights! ==",0xc0); delayms(1000); Display_String("YourPassword...",0x80); Display_String("===LockOK! ====",0xc0); } else { i=0; newcode: Display_String("NewPassword: ",0x80); Display_String("",0xc0); } break; case16: if(! IS_valid_user) {i=0; Display_String("==Norights! ==",0xc0); delayms(1000); Display_String("YourPassword...",0x80); Display_String("===LockOK! ====",0xc0); } else {i=0; init(); flay=1;delayms(5); if(m>0){ for(k=0;k<6;k++) { flay=flay&&(Mem[k]==(Userpassword[k]+48));} } if(flay){ for(k=0;k<6;k++) { Userpassword[k]=Userpassword[k]+48; } for(k=0;k<6;k++) {Mem[k]=User
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 报告 电子 密码锁