电子密码锁完整代码_第1页
电子密码锁完整代码_第2页
电子密码锁完整代码_第3页
电子密码锁完整代码_第4页
电子密码锁完整代码_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

#include<reg51.h>#include<intrins.h>#include<absacc.h>#include"VIIC_C51.h"#defineucharunsignedchar#defineuintunsignedint#define CSI24WC02 0XA0#define ucharunsignedcharsbitlcdrs=P2^0;sbitlcdrw=P2^1;sbitlcden=P2^2;sbitalarm=P2^3;sbitred=P2^7;sbitgreen=P2^6;sbitKEY_INT=P3^2;//ledtestsbitLED1=P3^5;sbitLED2=P3^1;ucharhour,min,sec,us;ucharflag=1,canscan=0,lock=0;ucharpassword[8]={0,0,0,0,0,0,0,0};ucharinput[8]={0,1,2,3,4,5,6,7};ucharcodea[]={0xF7,0xFB,0xFD,0xFE};unsignedcharDelayNS(unsignedcharno){ unsignedchari,j; for(;no>0;no--) { for(i=0;i<100;i++) for(j=0;j<100;j++); } return0;}unsignedchardelay_eep(unsignedcharj){ unsignedchark,l; for(l=0;l<=j;l++) for(k=0;k<=250;k++); return0;}voidt0_init(){TMOD=0x01;TL0=0xb0;TH0=0x3c;TR0=0;EA=1;ET0=1;}voiddelay(ucharn){uchari;while(n--)for(i=125;i>0;i--);}//lcd写命令voidwrite_com(ucharcom){lcdrs=0;lcdrw=0;P0=com;delay(2);lcden=1;delay(2);lcden=0;}//lcd写数据voidwrite_data(uchardate){lcdrs=1;lcdrw=0;P0=date;delay(2);lcden=1;delay(2);lcden=0;}//lcd的初始化voidinit_lcd(){write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);}//lcd清屏voidclearscn(){ write_com(0x06); write_com(0x01);}//lcd显示坐标voidgotoxy(ucharx,uchary){if(x==1) write_com(0x80+y);if(x==2) write_com(0xc0+y);}//写lcd字符串voidwrite_str(uchar*str){ while(*str!='\0') { write_data(*str); delay(2); str++; }}//写一位数字voidwrite_num(ucharnum){write_data(0x30+num);}//写两位数voidwrite_num2(ucharnum){ucharx,y;x=num/10;y=num%10;write_num(x);write_num(y);}//矩阵键盘扫描函数ucharscan(void){ucharrow,col;ucharj,m;P1=0xF0; if((P1&0xF0)!=0xF0) { delay(1); if((P1&0xF0)!=0xF0) col=~(P1|0x0F); j=0; P1=a[j]; while(j<=3) { if((P1&0xF0)!=0xF0) { row=~a[j]; break; } else {j++;P1=a[j];} } m=row+col; return(m); }elsereturn(0);}ucharcoding(ucharm){uchark;switch(m){case(0x08+0x80):k=0;break;case(0x08+0x40):k=1;break;case(0x08+0x20):k=2;break;case(0x08+0x10):k=3;break;case(0x04+0x80):k=4;break;case(0x04+0x40):k=5;break;case(0x04+0x20):k=6;break;case(0x04+0x10):k=7;break;case(0x02+0x80):k=8;break;case(0x02+0x40):k=9;break;case(0x02+0x20):k=10;break;case(0x02+0x10):k=11;break;case(0x01+0x80):k=12;break;case(0x01+0x40):k=13;break;case(0x01+0x20):k=14;break;case(0x01+0x10):k=15;break;}return(k);}//c重新设置密码voidsetpassword(){uchartmp,key,i=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01);gotoxy(1,0);write_str("");gotoxy(1,10);write_str("SET");while(1){tmp=scan();if(tmp!=0){key=coding(tmp);if(key<=9&&i<8){if(i<8){password[i]=key;gotoxy(1,i);write_data(0x2a);}i++;alarm=0;delay(250);alarm=1;}if(i>=8&&(key==11)){gotoxy(1,10);write_str("SETOK");gotoxy(1,0);write_str("");break;}delay(250);}}}//蜂鸣器报警voidbuzzeralarm(){ alarm=0; delay(250); alarm=1; delay(250); alarm=0; delay(250); alarm=1; delay(250); alarm=0; delay(250); alarm=1; delay(250);}//定时器0中断服务函数//作用给输入三次错误倒计时用voidtime0()interrupt1{TL0=0xb0;TH0=0x3c;if(++us==20){us=0;gotoxy(1,6);write_num2(sec);gotoxy(1,3);write_num2(min);gotoxy(1,0);write_num2(hour);if(++sec==60){sec=0;if(++min==60){min=0;if(++hour==1){hour=0;TR0=0;lock=0;gotoxy(2,10);write_str("UNLOCKED");}}}}}//主函数voidmain(void){ uchartmp,key,i=0,j,scannum=0; uchartd[8]={0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1}; //eepromsendbuff ucharrd[8]={0x00,0x01,0x02,0x03,0x04};//eepromreadbuff green=0; red=0; t0_init(); init_lcd(); LED1=0; LED2=0; while(1) { tmp=scan(); //读入键值 if(tmp!=0) { key=coding(tmp); if((key<=9)&&(i<8)&&(lock==0)&&(green!=1))//判断输入次数(i),和锁定情况(lock)和有效输入(key) { red=0; gotoxy(1,10); write_str(""); gotoxy(1,i); input[i]=key; i++; alarm=0; write_data(0x2a); delay(250); alarm=1; } if(key==10)// { gotoxy(1,i-1); write_data(0x20); if(i>0)i--; delay(250); } if(i==8&&key==11)//确认键 { i=0; #if1 IRcvStr(CSI24WC02,0,rd,0x8); //?EEPROM delay_eep(200); for(i=0;i<8;i++) //?password { password[i]=rd[i]; } i=0; #endif for(j=0;j<=7;j++) { if(input[j]!=password[j]) flag=1; elseflag=0; } if(lock==0) { if(flag) { flag=0; scannum++; gotoxy(2,10); write_str("ERR!"); write_num(scannum); red=1; buzzeralarm(); if(scannum==3){lock=1;TR0=1;} else{ clearscn(); gotoxy(2,10); write_str("again"); continue; } } else { gotoxy(2,10); write_str("OK!"); green=1; } } if(lock) { gotoxy(2,10); write_str("LOCKED"); } gotoxy(1,0); write_str(""); canscan=0; delay(250); } if((green==1)&&(key==13)) { LED1=1; green=0; delay(200); LED1=0; } if((key==12)&&(green==1))// { setpassword(); ISendStr(CSI24WC02,0,password,0x8); // } } }}/********************************************************************VIIC_C51.C此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的与用户程序连接并扩展.....注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作一定的修改....(本例是1us机器周期,即晶振频率要小于12MHZ)********************************************************************/#include<reg51.h>/*头文件的包含*/#include<intrins.h>#defineucharunsignedchar/*宏定义*/#defineuintunsignedint#define_Nop()_nop_()/*定义空指令*//*常,变量定义区*//*端口位定义*/sbitSDA=P3^7;/*模拟I2C数据传送位*/sbitSCL=P3^6;/*模拟I2C时钟控制位*//*状态标志*/bitack; /*应答标志位*//*******************************************************************起动总线函数函数原型:voidStart_I2c();功能:启动I2C总线,即发送I2C起始条件.********************************************************************/voidStart_I2c(){SDA=1;/*发送起始条件的数据信号*/_Nop();SCL=1;_Nop();/*起始条件建立时间大于4.7us,延时*/_Nop();_Nop();_Nop();_Nop();SDA=0;/*发送起始信号*/_Nop();/*起始条件锁定时间大于4μs*/_Nop();_Nop();_Nop();_Nop();SCL=0;/*钳住I2C总线,准备发送或接收数据*/_Nop();_Nop();}/*******************************************************************结束总线函数函数原型:voidStop_I2c();功能:结束I2C总线,即发送I2C结束条件.********************************************************************/voidStop_I2c(){SDA=0;/*发送结束条件的数据信号*/_Nop();/*发送结束条件的时钟信号*/SCL=1;/*结束条件建立时间大于4μs*/_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1;/*发送I2C总线结束信号*/_Nop();_Nop();_Nop();_Nop();}/*******************************************************************字节数据传送函数函数原型:voidSendByte(ucharc);功能:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0假)发送数据正常,ack=1;ack=0表示被控器无应答或损坏。********************************************************************/voidSendByte(ucharc){ucharBitCnt;for(BitCnt=0;BitCnt<8;BitCnt++)/*要传送的数据长度为8位*/{if((c<<BitCnt)&0x80)SDA=1;/*判断发送位*/elseSDA=0;_Nop();SCL=1;/*置时钟线为高,通知被控器开始接收数据位*/_Nop();_Nop();/*保证时钟高电平周期大于4μs*/_Nop();_Nop();_Nop();SCL=0;}_Nop();_Nop();SDA=1;/*8位发送完后释放数据线,准备接收应答位*/_Nop();_Nop();SCL=1;_Nop();_Nop();_Nop();if(SDA==1)ack=0;elseack=1;/*判断是否接收到应答信号*/SCL=0;_Nop();_Nop();}/*******************************************************************字节数据传送函数函数原型:ucharRcvByte();功能:用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数。********************************************************************/ ucharRcvByte(){ucharretc;ucharBitCnt;retc=0;SDA=1;/*置数据线为输入方式*/for(BitCnt=0;BitCnt<8;BitCnt++){_Nop();SCL=0;/*置时钟线为低,准备接收数据位*/_Nop();_Nop();/*时钟低电平周期大于4.7μs*/_Nop();_Nop();_Nop();SCL=1;/*置时钟线为高使数据线上数据有效*/_Nop();_Nop();retc=retc<<1;if(SDA==1)retc=retc+1;/*读数据位,接收的数据位放入retc中*/_Nop();_Nop();}SCL=0;_Nop();_Nop();return(retc);}/********************************************************************应答子函数原型:voidAck_I2c(bita);功能:主控器进行应答信号,(可以是应答或非应答信号)********************************************************************/voidAck_I2c(bita){if(a==0)SDA=0;/*在此发出应答或非应答信号*/elseSDA=1;_Nop();_Nop();_Nop();SCL=1;_Nop();_Nop();/*时钟低电平周期大于4μs*/_Nop();_Nop();_Nop();SCL=0;/*清时钟线,钳住I2C总线以便继续接收*/_Nop();_Nop();}/*******************************************************************向无子地址器件发送字节数据函数函数原型:bitISendByte(ucharsla,ucahrc);功能:从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.如果返回1表示操作成功,否则操作有误。注意:使用前必须已结束总线。********************************************************************/bitISendByte(ucharsla,ucharc){Start_I2c();/*启动总线*/SendByte(sla);/*发送器件地址*/if(ack==0)return(0);SendByte(c);/*发送数据*/if(ack==0)return(0);Stop_I2c();/*结束总线*/return(1);}/*******************************************************************向有子地址器件发送多字节数据函数函数原型:bitISendStr(ucharsla,ucharsuba,ucahr*s,ucharno);功能:从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。如果返回1表示操作成功,否则操作有误。注意:使用前必须已结束总线。********************************************************************/bitISendStr(ucharsla,ucharsuba,uchar*s,ucharno){uchari;Start_I2c();/*启动总线*/SendByte(sla);/*发送器件地址*/if(ack==0)return(0);SendByte(suba);/*发送器件子地址*/if(ack==0)return(0);for(i=0;i<no;i++){SendByte(*s);/*发送数据*/if(ack==0)return(0);s++;}Stop_I2c();/*结束总线*/return(1);}/*******************************************************************向无子地址器件读字节数据函数函数原型:bitIRcvByte(ucharsla,ucahr*c);功能:从启动总线到发送地址,读数据,结束总线的全过程,从器件地址sla,返回值在c.如果返回1表示操作成功,否则操作有误。注意:使用前必须已结束总线。********************************************************************/bitIRcvByte(ucharsla,uchar*c){Start_I2c();/*启动总线*/SendByte(sla+1);/*发送器件地址*/if(ack==0)return(0);*c=RcvByte();/*读取数据*/Ack_I2c(1);/*发送非就答位*/Stop_I2c();/*结束总线*/return(1);}/*******************************************************************向有子地址器件读取多字节数据函数函数原型:bitISendStr(ucharsla,ucharsuba,ucahr*s,ucharno);功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。如果返回1表示操作成功,否则操作有误。注意:使用前必须已结束总线。********************************************************************/bitIRcvStr(ucharsla,ucharsuba,uchar*s,ucharno){uchari;Start_I2c();/*启动总线*/SendByte(sla);/*发送器件地址*/if(ack==0)return(0);SendByte(suba);/*发送器件子地址*/if(ack==0)return(0);Start_I2c();SendByte(sla+1);if(ack==0)return(0);for(i=0;i<no-1;i++){*s=RcvByte();/*发送数据*/Ack_I2c(0);/*发送就答位*/s++;}*s=RcvByte();Ack_I2c(1);/*发送非应位*/Stop_I2c();/*结束总线*/return(1);}/*****************************************************************头文件名VIIC_C51.H这个头文件对应的库是VIIC_C51.LIB,库中有几个模拟I2C的函数,加入此文件即可使用I2C平台(主方式的软件平台),函数是对LPC764的I2C的I/O口实现,即其P1.3(SDA),P1.2(SCL),51系列机型可以通用.注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作一定的修改....(本例是1us机器周期,即晶振频率要小于12MHZ).(函数的使用可参考给出的事例程序.)*****************************************************************/#ifdefuchar#defineREADYDEF1/*宏uc

温馨提示

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

评论

0/150

提交评论