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

下载本文档

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

文档简介

.PAGE3..---可修编.单片机技术及应用综合训练〔设计报告〕..--可修编.前言随着人们生活水平的提高,如何实现家庭防盗这一问题也变得尤为突出。在科学技术不断开展的今天,电子密码防盗锁作为防盗卫士的作用显得日趋重要。本文从经济实用的角度出发,系统由STC89C52与低功耗CMOS型E²PROMAT24C02作为主控芯片与数据存储器单元,结合外围的键盘输入、LCD显示、报警、开锁等电路模块。它能完成以下功能:正确输入密码前提下,开锁;错误输入密码情况下,报警;密码可以根据用户需要更改。用C语言编写的主控芯片控制程序与EEPROMAT24C02读写程序相结合,并用Keil软件进展编译,设计了一款可以屡次更改密码,具有报警功能的电子密码控制系统。本密码锁具有设计方法合理,简单易行,本钱低,平安实用,性强,灵活性高等特点,具有一定的推广价值。关键词:电子密码锁、报警、液晶显示..目录选题要求·····································1硬件电路设计·································12.151单片机································22.2键盘电路·································22.3液晶显示电路·····························22.4警报电路·································32.5密码储存电路·····························32.6晶振、复位及关锁·························3软件设计·····································4软硬件调试结果·······························94.1电路总原理图·····························94.2调试结果································10总结········································11..一、选题要求本文从经济实用的角度出发,设计采用单片机为主控芯片,结合外围电路,组成电子密码控制系统,密码锁共6位密码,每位的取值围为0~9,用户可以自行设定和修改密码。用户想要翻开锁,必先通过提供的键盘输入正确的密码才可以,密码输入错误有提示,为了提高平安性,当密码输入错误三次将报警,期间输入密码无效,以防窃贼屡次试探密码。6位密码同时输入正确,锁才能翻开。锁有备用电池,只有部上电复位时才能设置或修改密码,因此,仅在门外按键是不能修改或设置密码的,因此性强、灵活性高。其特点如下:1)性好,编码量多,远远大于弹子锁。随机开锁成功率几乎为零。

2)密码可变,用户可以随时更改密码,防止密码被盗,同时也可以防止因人员的更替而使锁的密级下降。

3)误码输入保护,当输入密码屡次错误时,报警系统自动启动。4)无活动零件,不会磨损,寿命长。5)使用灵活性好,不像机械锁必须佩带钥匙才能开锁。6)电子密码锁操作简单易行,一学即会。硬件电路设计下面是整个设计的流程图:开开场开场始初始化次数加1输入密码密码正确?返返回回NYY开锁程序开锁?开开场开场始初始化次数加1输入密码密码正确?返返回回NYY开锁程序开锁?N修改密码?次数>3?报警程序修改程序YNNY开场返回2.151单片机这次课程设计采用的是5系列单片机AT89C52。其外部封装如下列图所示:AT89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位〔8根引脚〕,共32根[8]。P0口〔Pin39~Pin32〕:8位双向I/O口线,名称为P0.0~P0.7P1口〔Pin1~Pin8〕:8位准双向I/O口线,名称为P1.0~P1.7P2口〔Pin21~Pin28〕:8位准双向I/O口线,名称为P2.0~P2.7P3口〔Pin10~Pin17〕:8位准双向I/O口线,名称为P3.0~P3.72.2键盘电路本次试验采用的是行列键盘,C语言程序中有相应的驱动程序,其硬件电路如下所示,下右对应的为各个按键所对应的数字及功能。0123456789确认重输改密2.3液晶显示电路实验中采用的是LM016L液晶显示,其数据端口采集数据通过单片机的P0口,接法如下列图所示。不同情况下会有不同的显示,显示容包括:Wele、HelloBoss、Wrong、OK等容。2.4警报电路下列图是警报电路连接图,警报触发为:连续三次输错密码,警报触发后会有一个时间延迟,延迟时间任何操作都是无效的,过后通过关锁按钮可解除。2.5密码储存电路实验中考虑到实用性方面时,就想到了密码储存及修改的问题,于是采用了FM24C02F作为面膜储存模块,电路连接如下所示:2.6晶振、复位及关锁晶振、复位及关锁电路如下所示(作图所示按钮为复位按钮):三、软件设计C语言源程序:..#include<reg52.h>#include<stdio.h>#include<intrins.h>#defineCHECK_BUSY#defineDataPortP0#defineKeyPortP1sbitRS=P2^4;//液晶显示的定义端口sbitRW=P2^5;sbitEN=P2^6; sbitscl=P3^0;//24c02端口定义sbitsda=P3^1; sbitbaojing=P2^1;//报警器sbitjdq=P2^0;//继电器sbit=P2^3;//警报灯sbitclose=P2^2;unsignedcharold1,old2,old3,old4,old5,old6;//原始密码000000unsignedcharnew1,new2,new3,new4,new5,new6;//代表新密码voiddelay1(unsignedintm){unsignedintn;for(n=0;n<m;n++);}voiddelay(unsignedintm){unsignedinta;unsignedcharb;for(a=0;a<m;a++){for(b=0;b<125;b++);}}voidDelayUs2x(unsignedchart){while(--t);}voidDelayMs(unsignedchart){while(t--){DelayUs2x(256);DelayUs2x(256);}}voidbaojingqi(){baojing=0;DelayUs2x(256);if(baojing==0) { baojing=0; DelayUs2x(256); }}bitLCD_Check_Busy(void)//判忙函数{#ifdefCHECK_BUSYDataPort=0xFF;RS=0;RW=1;EN=0;_nop_();EN=1;return(bit)(DataPort&0x80);#elsereturn0;#endif}voidLCD_Write_(unsignedchar)//写入命令函数{//while(LCD_Check_Busy());//忙那么等待DelayMs(5);RS=0;RW=0;EN=1;DataPort=;_nop_();EN=0;}voidLCD_Write_Data(unsignedcharData)//写入数据函数{//while(LCD_Check_Busy());//忙那么等待DelayMs(5);RS=1;RW=0;EN=1;DataPort=Data;_nop_();EN=0;}voidLCD_Clear(void)//清屏函数{LCD_Write_(0x01);DelayMs(5);}voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)//写入字符函数{if(y==0){LCD_Write_(0x80+x);}else{LCD_Write_(0xC0+x);}LCD_Write_Data(Data);}voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)//写入字符串函数{while(*s){LCD_Write_Char(x,y,*s);s++;x++;}}voidLCD_Init(void) //液晶显示的初始化函数{LCD_Write_(0x38);//显示模式设置DelayMs(5);LCD_Write_(0x38);DelayMs(5);LCD_Write_(0x38);DelayMs(5);LCD_Write_(0x38);LCD_Write_(0x08);//显示关闭LCD_Write_(0x01);//显示清屏LCD_Write_(0x06);//显示光标移动设置DelayMs(5);LCD_Write_(0x0C);//显示开及光标设置}unsignedcharKeyScan(void)//键盘扫描函数,使用行列反转扫描法{unsignedcharcord_h,cord_l;//行列值中间变量KeyPort=0x0f;//行线输出全为0cord_h=KeyPort&0x0f;//读入列线值if(cord_h!=0x0f)//先检测有无按键按下{DelayMs(10);//去抖if((KeyPort&0x0f)!=0x0f){cord_h=KeyPort&0x0f;//读入列线值KeyPort=cord_h|0xf0;//输出当前列线值cord_l=KeyPort&0xf0;//读入行线值while((KeyPort&0xf0)!=0xf0);//等待松开并输出return(cord_h+cord_l);//键盘最后组合码值}}return(0xff);//返回该值}unsignedcharKeyPro(void){switch(KeyScan()){case0x7e:return0;break;//0按下相应的键显示相对应的码值case0x7d:return1;break;//1case0x7b:return2;break;//2case0x77:return3;break;//3case0xbe:return4;break;//4case0xbd:return5;break;//5case0xbb:return6;break;//6case0xb7:return7;break;//7case0xde:return8;break;//8case0xdd:return9;break;//9case0xdb:return10;break;//10case0xd7:return11;break;//11case0xee:return12;break;//12case0xed:return13;break;//13case0xeb:return14;break;//14case0xe7:return15;break;//15default:return0xff;break;}}voidinit()//24c02初始化子程序{ scl=1; _nop_();_nop_(); sda=1; _nop_();_nop_();}voidrespons() //应答{ unsignedchari; scl=1; _nop_();_nop_(); while((sda==1)&&(i<250)) i++; scl=0;_nop_();_nop_();}voidclock()//I2C总线时钟{unsignedchari=0;scl=1;_nop_();_nop_();while((sda==1)&&(i<255))i++;scl=0;_nop_();_nop_();}voidstart()//启动I2C总线{ sda=1; _nop_();_nop_(); scl=1; _nop_();_nop_(); sda=0; _nop_();_nop_(); scl=0; _nop_();_nop_();}voidstop()//停顿I2C总线{ sda=0; _nop_();_nop_(); scl=1; _nop_();_nop_(); sda=1; _nop_();_nop_();}voidwritebyte(unsignedchara)//写一个字节{ unsignedcharb,tem; tem=a; for(b=0;b<8;b++){ tem=tem<<1; scl=0; _nop_();_nop_(); sda=CY; //temp左移时,移出的值放入了CY中 _nop_();_nop_(); scl=1; //待sda线上的数据稳定后,将scl拉高 _nop_();_nop_();}scl=0;_nop_();_nop_();sda=1;_nop_();nop_();}unsignedcharreadbyte()//读一个字节{unsignedchari,j,k=0;scl=0;_nop_();_nop_();sda=1;for(i=0;i<8;i++){ _nop_(); _nop_(); scl=1;_nop_(); _nop_();if(sda==1)j=1;elsej=0;k=(k<<1)|j; scl=0; } _nop_(); _nop_(); return(k);}unsignedcharread24c02(unsignedcharaddress)//从24c02的地址address中读取一个字节数据{unsignedchardate;start();writebyte(0xa0);clock();writebyte(address);clock();start();writebyte(0xa1);clock();date=readbyte();stop();delay1(100);return(date);}voidwrite24c02(unsignedcharaddress,unsignedcharinfo)//向24c02的address地址中写入一字节数据info{start();writebyte(0xa0);clock();writebyte(address);clock();writebyte(info);clock();stop();delay1(5000);//这个延时一定要足够长,否那么会出错。因为24c02在从sda上取得数据后,还需要一定时间的烧录过程。}main(){unsignedcharnum,i,bj,c=0;unsignedchartemp[6];bitFlag;init();//初始化24C02LCD_Init();//初始化液晶屏DelayMs(10);//延时用于稳定,可以去掉LCD_Clear();//清屏LCD_Write_String(0,0,"wele");//写入第一行信息old1=read24c02(110);old2=read24c02(111);old3=read24c02(112);old4=read24c02(113);old5=read24c02(114);old6=read24c02(115);while(1)//主循环{num=KeyPro();//扫描键盘if(num!=0xff)//如果扫描是按键有效值那么进展处理{if(i==0)//输入是第一个字符的时候需要把改行清空,方便观看密码LCD_Write_String(0,1,"");//去除该行if(i<6)//密码是6位,大于6位时不再输入按键值{ temp[i]=num;LCD_Write_Char(i,1,'*');} i++;//输入数值累加if(num==11) //重试键{i=0;LCD_Write_String(0,1,"");}}if(num==12){i=0;LCD_Write_String(0,1,"");if(bj==0){while(i<=6){num=KeyPro();//扫描键盘if(num!=0xff)//如果扫描是按键有效值那么进展处理{if(i==0)//输入是第一个字符的时候需要把改行清空,方便观看密码LCD_Write_String(0,1,"");//去除该行if(i<6)//密码是6位,大于6位时不再输入按键值{ temp[i]=num;LCD_Write_Char(i,1,'*');} i++;//输入数值累加 if(num==11) //重试键{i=0;LCD_Write_String(0,1,"");}}if(num==10){num=0;new1=temp[0];new2=temp[1];new3=temp[2];new4=temp[3];new5=temp[4];new6=temp[5];old1=new1;old2=new2;old3=new3;old4=new4;old5=new5;old6=new6;//新密码代替旧密码write24c02(110,old1);write24c02(111,old2);write24c02(112,old3);write24c02(113,old4);write24c02(114,old5);write24c02(115,old6);LCD_Write_String(0,1,"ok");bj=1;DelayMs(220);DelayMs(220);DelayMs(220);}if(close==0){bj=1;i=0;LCD_Write_String(0,1,"");}}}i=0;}if(num==10) //数字10为确认键{new1=temp[0];new2=temp[1];new3=temp[2];new4=temp[3];new5=temp[4];new6=temp[5];if(i==7)//6位后的按键输入数值,相当于确认按键〔任意按键即可〕{i=0;//计数器复位Flag=1;//先把比拟位置1old1=read24c02(110);old2=read24c02(111);old3=read24c02(112);old4=read24c02(113);old5=read24c02(114);old6=read24c02(115);Flag=Flag&(new1==old1)&(new2==old2)&(new3==old3)&(new4==old4)&(new5==old5)&(new6==old6);//比拟输入值和已有密码if

温馨提示

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

评论

0/150

提交评论