自动化课程设计总结_第1页
自动化课程设计总结_第2页
自动化课程设计总结_第3页
自动化课程设计总结_第4页
自动化课程设计总结_第5页
已阅读5页,还剩17页未读, 继续免费阅读

下载本文档

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

文档简介

设计任务与要求1、能够实现密码开关锁功能。2、能更改原密码。3、系统有报警功能。4、24C02能存储密码。5、采用12864液晶显示。硬件框图于说明ATAT89C51单片机12864液晶显示模块报警模块储存器模块矩阵键盘控制设计的目的是开发一种功能多,电路简单,性能稳定可靠的电子密码锁,该密码锁系统通过AT89C51系列单片机对各个模块电路进行控制,并对输入信号进行分析、运算、处理,从而控制继电器开锁与12864准确的显示。该系统主要分5大模块:密码存储模块、矩阵键盘控制模块、报警模块、12864液晶显示模块,如图所示。信号输入模块:利用矩阵键盘按键电平的变化实现密码输入和密码更改。电路原理图与说明AT89C51模块如图所示,使用的是AT89C51密码存储模块AT24C02是美国ATEML公司生产的低功耗COMS型,I2C总线接口的E2PROM存储器,其内含256x8为存储空间,具有工作电压宽(1.8V~5.5V)、擦写次数多(大于1000次)、写入速度快(小于10mS)、抗干扰能力强、数据不易丢失、体积小等特点。采用了I2C总线进行数据读写的串行器件,占用很少的资源和I/O线,而且支持在线编程,实时存取数据十分方便,如图所示。3.矩阵键盘控制模块键盘可以分为独立连接式和行列式(矩阵式)两类。根据设计要求,本电路设计采用4×4行列式键盘,同时也能减少键盘与单片机接口时所占用的I/O线的数目。矩阵式键盘又叫行列式键盘。用I/O口线组成行列结构,按键设置在行列的交叉点上。本电路采用4条行线和4条列线,即可组成具有4×4个按键的键盘。其电路图如下图2.4所示。对键的识别通常用逐行扫描查询法。首先判别键盘中有无按键按下,由单片机I/O口向键盘送(输出)全扫描字,然后读入(输入)列线状态来判断。方法是:向行线输出全扫描字00H,把全部行线置为低电平,然后将列线的电平状态读入累加器A中。如果有键按下,总会有一根列线电平拉至低电平,从而使列输入不全为1。键盘中哪一个键按下,是由行线逐行置低电平后,检查列输入状态实现的,其方法是:依次给行线送低电平,然后查所有列线状态,如果全为1,则所按下的键不在此行,如果不全为1,则所按下的键必在此行,而且是在与零电平列线相交的交点上的那个键。矩阵键盘实物如图。3.报警模块报警部分由蜂鸣器发声装置及外围电路组成,高电平发声,当输入6次密码错误时,单片机的P2.5引脚为高电平,蜂鸣器发声报警,如图所示。当锁处于上锁状态时,P2.3为高电平,LED导通发光,表示锁是闭合的。220上拉电阻是起到限流作用,主要是能让LED达到导通电压。5.12864液晶显示模块本系统采用LCD12864液晶显示,用于直观地提示用户输入开锁密码、密码信息的正误提示、开锁信息的显示等,显示整个电子密码锁的工作状态,如下图所示。表一12864液晶显示引脚功能表管脚号管脚名称电平管教功能描述1GND0地2VDD+5V±%10电源电压+5V3VO0~-10液晶显示驱动电压4RSHLRS=“H”表示DB7~DB0为显示数据RS=“L”表示DB7~DB0为指令数据5R/WHLRW=“H”数据被读到DB77~DB0RW=“L”DB7~DB0的数据写到IR或DR6EHL数据线7DB0HL数据线8DB1HL数据线9DB2HL数据线10DB3HL数据线11DB4HL数据线12DB5HL数据线13DB6HL数据线14DB7HL数据线15FSBHL并串/行接口选择H并行L串行16N.CHL空脚17RSTHL复位信号18VEE-10LCD驱动负电压输入19LEDK+5背光电源20LEDA0背光软件设计主要模块流程图存储键值是否数字键有键摁下键盘扫描调用显示初始化开始存储键值是否数字键有键摁下键盘扫描调用显示初始化开始 NNYYNNNY是否修改键NY是否修改键YY回删一位数回删一位数调用显示功能开锁开锁记录次数警告声密码错误显示密码正确是否确定调用显示功能开锁开锁记录次数警告声密码错误显示密码正确是否确定NNYYNNYY>6次>6次NNYY报警报警键盘扫描键盘扫描显示上锁显示上锁是否返回上锁是否返回上锁是否上锁键是否上锁键N是否修改密码键N是否修改密码键YYYY提示显示输入旧密码提示显示输入旧密码YNNNYYYN提示显示输入新密码密码正确是否确定键回删一位数是否修改键存储键值有键摁下是否数字键键盘扫描

YNNNYYYN提示显示输入新密码密码正确是否确定键回删一位数是否修改键存储键值有键摁下是否数字键键盘扫描YNYNNNYU回删一位数是否修改键是否数字键键盘扫描提示输入确认密码是否确认键存储键值有键摁下键盘扫描

NYYNNYN提示确认音提示显示两次输入不同存入新密码验证成功上锁新密码是否相同是否确定键回删一位数是否修改键存储键值有键摁下是否数字键

2.原程序清单与注释YNYNNNYU回删一位数是否修改键是否数字键键盘扫描提示输入确认密码是否确认键存储键值有键摁下键盘扫描NYYNNYN提示确认音提示显示两次输入不同存入新密码验证成功上锁新密码是否相同是否确定键回删一位数是否修改键存储键值有键摁下是否数字键主模块:Main.c#include<reg51.h>#include"display.h"#include"24c02.h"#include"password.h"#include"delay.h"#include"keyscan.h"#include"12864.h"#defineucharunsignedchar#defineuintunsignedintexternucharflag; //键盘标志位#defineGPIO_DIGP0 //uchardatamima[7]={1,2,3,4,5,6,0};uchardatamima1[7]={'\0','\0','\0','\0','\0','\0',0};uchardatamima2[7]={'\0','\0','\0','\0','\0','\0',0};uchardatamima_write[7]={'\0','\0','\0','\0','\0','\0',0};uchardatamima_read[7]={'\0','\0','\0','\0','\0','\0',0};sbitlock=P2^3;sbitspeaker=P2^5;unsignedcharcodeDIG_CODE[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71};/*********************************初始密码123456,第一次下载程序后先修改密码,但不能按返回键,把uchardatamima[7]={1,2,3,4,5,6,0};for(k=0;k<6;k++){write_add(23+k,mima[k]);Delay10ms(1);}去掉,再次下载即可 *********************************/voidmain(){ ucharj,k,q,counter1,counter2,counter3,counter4,warn; while(1){ speaker=0; counter1=0;counter2=0; counter3=0;counter4=0; lock=1; system_init(); i2cinit(); display_enterpassword();/* for(k=0;k<6;k++) { write_add(23+k,mima[k]); Delay10ms(1); } */ for(k=0;k<6;k++) { mima_read[k]=read_add(23+k); Delay10ms(1); } clear_mima(mima_write);//将数组中的密码清空 for(;j!=10;) //确认键10 { j=keyscan1(); if(j>=0&&j<=9&&counter1<6&&flag==1) //开始输入 0~9 { mima_write[counter1]=j;counter1++; display_data(counter1,2,j); delay_1ms(100); LCD_PutString(counter1,2,"*"); } if(j==11&&flag==1) //修改输入 11键修改键 { if(counter1>0) { LCD_PutString(counter1,2,""); mima_write[counter1]='\0';counter1--; } } } j=0;flag=0; if(compare_mima(mima_read,mima_write)==1) //输入完毕,比较密码 { display_open_door(); delay_1ms(100); display_welcome();lock=0; for(;j!=14;) //上锁后或刚开锁和改完密码后,返回输入密码界面,返回键14键 { j=keyscan1(); if(j==12&&flag==1)//改密码键 12 { display_old_password(); clear_mima(mima_write); j=0; for(;j!=10;) { j=keyscan1(); if(j>=0&&j<=9&&counter2<6&&flag==1) { mima_write[counter2]=j;counter2++; display_data(counter2,2,j); delay_1ms(100); LCD_PutString(counter2,2,"*"); } if(j==11&&flag==1) //修改输入11键 { if(counter2>0) { LCD_PutString(counter2,2,""); mima_write[counter2]='\0';counter2--; } } } if(compare_mima(mima_read,mima_write)==1) //比较密码 { display_new_password(); clear_mima(mima1);delay_1ms(50); clear_mima(mima2);delay_1ms(50); j=0; for(;j!=10;) { j=keyscan1(); //开始输入新的密码 if(j>=0&&j<=9&&counter3<6&&flag==1) { mima1[counter3]=j;counter3++; display_data(counter3,2,j); delay_1ms(100); LCD_PutString(counter3,2,"*"); } if(j==11&&flag==1) //修改输入 { if(counter3>0) { LCD_PutString(counter3,2,""); mima_write[counter3]='\0';counter3--; } } } display_enter_again(); j=0; for(;j!=10;) //确认输入新密码 { j=keyscan1(); if(j>=0&&j<=9&&counter4<6&&flag==1) { mima2[counter4]=j;counter4++; display_data(counter4,2,j); delay_1ms(100); LCD_PutString(counter4,2,"*"); } if(j==11&&flag==1) //修改输入 { if(counter4>0) { LCD_PutString(counter4,2,""); mima_write[counter4]='\0';counter4--; } } } j=0; delay_1ms(100); if(compare_mima(mima1,mima2)==1) //比较新密码 { display_modify_success(); delay_1ms(1000); for(k=0;k<6;k++) { write_add(23+k,mima1[k]); Delay10ms(1); } speaker=1;delay_1ms(500);speaker=0; } else { display_isdifferent(); //新密码错误 lock=1; } } } if(j==13){lock=1;display_close_door();} //上锁键13 } } else { display_passworderror(); warn++; speaker=1;delay_1ms(500);speaker=0; if(warn>5) { for(q=0;q<5;q++) { speaker=1; Delay10ms(50); speaker=0; Delay10ms(50); } } } }}液晶显示模块:12864.c#include<reg51.h>#include"12864.h"#include"delay.h"sbitRW=P2^6;sbitE=P2^7; /*************************************///函数功能:延时函数/*************************************/voidDelay(uinttt){ while(tt--);}/*************************************///函数功能:写入命令/*************************************/voidLcd_WriteCmd(uchar LData){ uchar i; E=0;RW=1; for(i=0;i<5;i++) { E=1;E=0; } RW=0;E=1;E=0;RW=0; E=1;E=0;RW=0;E=1;E=0; for(i=0;i<4;i++) { RW=(bit)(LData&(0x80)); E=1;E=0;LData=LData<<1; }RW=0; for(i=0;i<4;i++) { E=1;E=0; } Delay(80); for(i=0;i<4;i++) { RW=(bit)(LData&(0x80)); E=1;E=0;LData=LData<<1; } RW=0; for(i=0;i<4;i++) { E=1;E=0; }}/*************************************///函数功能:将数据写入液晶模块//入口参数:y(为字符常量)/**************************************/voidLcd_WriteData(ucharLData){ uchari; E=0;RW=1; for(i=0;i<5;i++) { E=1;E=0; } RW=0;E=1;E=0;RW=1;E=1;E=0;RW=0;E=1;E=0; for(i=0;i<4;i++) { RW=(bit)(LData&(0x80)); E=1;E=0;LData=LData<<1; } RW=0; for(i=0;i<4;i++) { E=1;E=0; } Delay(50); for(i=0;i<4;i++) { RW=(bit)(LData&(0x80)); E=1;E=0;LData=LData<<1; } RW=0; for(i=0;i<4;i++) { E=1;E=0; } }/**************************************///函数功能:对LCD的显示模式进行初始化设置/**************************************/voidsystem_init()//系统初始化{ Lcd_WriteCmd(0x30); Lcd_WriteCmd(0x30); Lcd_WriteCmd(0x30); Delay(50); Lcd_WriteCmd(0x08); Lcd_WriteCmd(0x01); Lcd_WriteCmd(0x02); Lcd_WriteCmd(0x10); Lcd_WriteCmd(0x38); Lcd_WriteCmd(0x0c); Lcd_WriteCmd(0x80); Lcd_WriteCmd(0x01); }voidLCD_PutString(ucharx,uchary,uchar*s)//显示字符串x列y行{switch(y){ case1:Lcd_WriteCmd(0x80+x);break; case2:Lcd_WriteCmd(0x90+x);break; case3:Lcd_WriteCmd(0x88+x);break; case4:Lcd_WriteCmd(0x98+x);break;default:break; }while(*s>0){Lcd_WriteData(*s);s++;delay_50us(10);}}voiddisplay_data(ucharx,uchary,uintnum)//显示数字{uchara;switch(y){ case1:Lcd_WriteCmd(0x80+x);break; case2:Lcd_WriteCmd(0x90+x);break; case3:Lcd_WriteCmd(0x88+x);break; case4:Lcd_WriteCmd(0x98+x);break;default:break; } a=num%10;//个位Lcd_WriteData(a+0x30);}存储器模块:24c02.c#include<reg51.h>#include"24c02.h"sbitsda=P2^0;sbitscl=P2^1;voidi2cdelay(){;;}/*i2c开始信号*/voidstart()//开始信号{ sda=1; i2cdelay();scl=1; i2cdelay(); sda=0; i2cdelay();}/*i2c停止信号*/voidstop()//停止{ sda=0; i2cdelay(); scl=1; i2cdelay(); sda=1; i2cdelay();}/*i2c应答函数*/voidrespons()//应答{ uchari; scl=1; i2cdelay(); while((sda==1)&&(i<250))i++; scl=0; i2cdelay();}/*i2c初始化函数*/voidi2cinit(){ sda=1; i2cdelay(); scl=1; i2cdelay();}/*存储字节函数传递参数:uchar型数据*/voidwrite_byte(uchardate){ uchari,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; scl=0; i2cdelay(); sda=CY; i2cdelay(); scl=1; i2cdelay(); // scl=0;//delay(); } scl=0; i2cdelay(); sda=1; i2cdelay();}/*读取字节函数传递参数:无*/ucharread_byte(){ uchari,k; scl=0; i2cdelay(); sda=1; i2cdelay(); for(i=0;i<8;i++) { scl=1; i2cdelay(); k=(k<<1)|sda; scl=0; i2cdelay(); } returnk;}/*存储数据函数传递参数:地址,uchar型数据*/voidwrite_add(ucharaddress,uchardate){ start(); write_byte(0xa0); respons(); write_byte(address); respons(); write_byte(date); respons(); stop();}/*读取数据函数传递参数:地址*/ucharread_add(ucharaddress){ uchardate; start(); write_byte(0xa0); respons(); write_byte(address); respons(); start(); write_byte(0xa1); respons(); date=read_byte(); stop(); returndate;}#include<reg51.h>#include"Delay.h"#include"keyscan.h"#defineGPIOP0ucharflag;矩阵键盘扫描keyscan.cucharkeyscan1(){ uchartemp,key1; flag=0; GPIO=0xfe; temp=GPIO; temp=temp&0xf0; if(temp!=0xf0) { delay_1ms(10); //去抖动 temp=GPIO; temp=temp&0xf0; if(temp!=0xf0) { flag=1; temp=GPIO; switch(temp) { case0xee:key1=0;break; case0xde:key1=1;break; case0xbe:key1=2;break; case0x7e:key1=3;break; } while(temp!=0xf0) { temp=GPIO; temp=temp&0xf0; } } } GPIO=0xfd; temp=GPIO; temp=temp&0xf0; if(temp!=0xf0) { delay_1ms(10); temp=GPIO; temp=temp&0xf0; if(temp!=0xf0) { flag=1; temp=GPIO; switch(temp) { case0xed:key1=4;break; case0xdd:key1=5;break; case0xbd:key1=6;break; case0x7d:key1=7;break; } while(temp!=0xf0) { temp=GPIO; temp=temp&

温馨提示

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

最新文档

评论

0/150

提交评论