单片机密码锁C程序完整代码.docx
- 文档编号:11176793
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:32
- 大小:18.92KB
单片机密码锁C程序完整代码.docx
《单片机密码锁C程序完整代码.docx》由会员分享,可在线阅读,更多相关《单片机密码锁C程序完整代码.docx(32页珍藏版)》请在冰豆网上搜索。
单片机密码锁C程序完整代码
单片机密码锁C程序完整代码
2009-08-1814:
39
#include<>
#include""
#include""
#include""
#include""
#defineulongunsignedlong
bitBJCB=0;//报警标志
XG=0,//修改密码标志位
BJ=0,//报警标志位
SJ=0;//锁键盘标志位
//xg=0;//修改密码标志位
ucharPSWD0_0[16]={0};//密码输入缓存存储单元
//ucharcodePSWD0_1[16]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};//用户初始密码存储单元
//ucharPSWD1_0[16]={0};//读出密码缓存存储单元
ucharPSWD1_1[16]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};//管理员初始密码存储单元
sbitOUT=P3^5;//输出端口
sbitL1=P0^2;//上电指示
sbitL2=P0^1;//开锁指示
sbitL3=P0^0;//报警指示
uint mg=0,//密码个数
KSC=0,//开锁次数
BJC=0,//报警次数
TCNTY=0,//用户按键定时次数累加
TCNTG=0,//管理员输入密码定时次数
yhsh,//用户输入标志位
glsh,//管理员输标志位
shw;//密码输完标志位
voidyhmimaxig();//密码修改程序
voidglmimaxig();//管理员修改程序
voidbjyin(ulongt)
{
ulongc;
uintn;
for(c=0;c { for(n=0;n<50;n++);//延时 BEEP=~BEEP;//取反输出到喇叭的信号 } } voiddelay_10ms(void) { uinti=1000; while(i--); } //////////////定时中断服务函数////////////////////////////////////// voidtimer0()interrupt1 { uinti; TH0=(65536-50000)/256;//对TH0TL0赋值50MS定时 TL0=(65536-50000)%256;//重装计数初值 if(yhsh==1) { TCNTY++;//用户定时计数 if(shw==1) { TR0=0; TCNTY=0; } if(TCNTY==200) { TR0=0;//关闭T0定时器 TCNTY=0; mg=0;//密码个数清零 L1=1; for(i=0;i<2;i++)//声光报警电路 { L3=0; bjyin(1000); L3=1; delay(1000); } L1=0; } } elseif(glsh==1) { TCNTG++;//管理员定时计数 if(shw==1) { TR0=0; TCNTG=0; } if(TCNTG==160) { TR0=0;//关闭T0定时器 TCNTG=0; mg=0;//密码个数清零 L1=1; for(i=0;i<2;i++)//声光报警电路 { L3=0; bjyin(1000); L3=1; delay(1000); } L1=0; } } } voidmain() { uinti; TMOD=0x01;//定时器工作在方式1 ET0=1; EA=1; TH0=(65536-50000)/256;//对TH0TL0赋值 TL0=(65536-50000)%256;//使定时器秒中断一次 //Read_page24c02(0x00,PSWD1_1,16);//向24c02里读用户初始密码 //i2cWrite24LC16B(0,0X20); /////////////第一次向24c02里写入初始管理员密码、用户密码、开锁次数///////////////////// KSC=i2cRead24LC16B(0X20); loop: L1=0;//上电红灯亮 L2=1;//开锁成功后绿灯亮 L3=1;//输错时黄灯亮报警 OUT=0;//开信号关闭 display_0(KSC);//开锁前显示 ///////////密码输入///////////////// if(SJ==0)//锁键盘标志位为0 { do { flag=0;//键盘标志位 key(); if(flag==1&&num==12)//判断是否为管理员功能键按下 { gotogl; } if(flag==1&&num<=9) { PSWD0_0[mg]=num; mg++;//密码个数 } if(flag==1&&num==14&&mg>=1)//输入错误删除 { mg=mg-1; } if(mg==1)//有密码键按下开定时器限时 { TR0=1; yhsh=1; } } while(num! =15); if(mg! =16) { for(i=mg;i<16;i++) { PSWD0_0[i]=0; } } /////////////////密码比较电路//////////////////////////// if(flag==1&&num==15) {flag=0; yhsh=0; shw=1; num=0; for(i=0;i<16;i++)//从24c02里读出16个密码 { PSWD1_1[i]=i2cRead24LC16B(i); delay_10ms; } for(i=0;i<16;i++) { if(PSWD1_1[i]! =PSWD0_0[i]) { BJCB=1; break; } else BJCB=0; } } if(BJCB! =0) { BJC++; if(BJC! =3) { BJCB=0;//第一次和第二次报警 delay(500); mg=0;//密码个数清零 L1=1; for(i=0;i<3;i++)//声光报警电路 { L3=0; display_3(); bjyin(1000); L3=1; delay(1000); } gotoloop; } elseif(BJC==3) { BJC=0; BJCB=0; display_5();//三次输入密码失败,自锁 SJ=1;//锁键盘标志位 mg=0;//密码个数清零 L1=1; for(i=0;i<2;i++)//声光报警电路 { L3=0; bjyin(1000); L3=1; delay(1000); } gotoloop; } } else if(BJCB==0) { KSC++; display_1(KSC); i2cWrite24LC16B(KSC,0X20); if(KSC==100) { SJ=1; } L2=0; L1=1; OUT=1; mg=0;//密码个数清零 loop1: do //键盘扫描等待功能键按下 { flag=0; key(); if(flag) { flag=0; switch(num) { case13: { display_2(); do { flag=0;//键盘标志位 key(); if(flag==1&&num<=9) { PSWD0_0[mg]=num; mg++;//密码个数 } if(flag==1&&num==14&&mg>=1)//输入错误删除 { mg=mg-1; } if(mg==16) { do //键盘扫描等待功能键按下 { flag=0; key(); } while(num! =15); } } while(num! =15); if(mg! =16&&num==15) { for(i=mg;i<16;i++) { PSWD0_0[i]=0; } } if(flag==1&&num==15) { flag=0; mg=0; for(i=0;i<16;i++)//用一次写一个向24c02里写 { i2cWrite24LC16B(PSWD0_0[i],i); delay_10ms; } display_1(KSC); do //键盘扫描等待功能键按下 { flag=0; key(); } while(num! =11);//按下返回键,锁锁返回 { gotoloop; } } };break; case11: { gotoloop; //break; } } } } while(flag! =0);//如果设置密码键按下 gotoloop1; //i2cWrite24c02_page(0x00,PSWD1_1,mg); } } else { do { flag=0; key(); } while(num! =12);//判断是否为管理员功能键按下 gl: do//管理员输入密码 { flag=0; key(); if(flag==1&&num<=9) { PSWD0_0[mg]=num; mg++;//密码个数 } if(flag==1&&num==14&&mg>=1)//删除键按下 { mg=mg-1; } if(mg==1) { TR0=1; }//开定时器TO限5秒开锁 } while(num! =15); if(mg! =16&&num==15) { for(i=mg;i<16;i++) { PSWD0_0[i]=0; } } //////////管理员密码比较/////////////////////// //Read_page24c02(0x10,PSWD0_1,16) for(i=0;i<16;i++)//从24c02里读出16个密码 { PSWD1_1[i]=i2cRead24LC16B((0x10+i)); delay_10ms; } if(flag==1&&num==15) {flag=0; shw=1; num=0; for(i=0;i { if(PSWD1_1[i]! =PSWD0_0[i]) {BJCB=1; break; } else BJCB=0; } } if(BJCB! =0) { BJC++; if(BJC! =3) { BJCB=0;//第一次和第二次报警 mg=0;//密码个数清零 L1=1; for(i=0;i<2;i++)//声光报警电路 { L3=0; display_3(); bjyin(1000); L3=1; delay(1000); } display_1(KSC); gotoloop; } else { BJCB=0; display_5();//三次输入密码失败,自锁 mg=0;//密码个数清零 delay(10000); display_1(KSC); gotoloop; } } else { SJ=0; display_4();//管理员开锁显示 mg=0; L2=0; L1=1; L3=0;//密码个数清零 do //键盘扫描等待功能键按下 { flag=0; key(); } while(flag==0);//如果设置密码键按下 if(flag==1&&num==13) { flag=0; display_2(); do { flag=0;//键盘标志位 key(); if(flag==1&&num<=9) { PSWD0_0[mg]=num; mg++;//密码个数 } if(flag==1&&num==14&&mg>=1)//输入错误删除 { mg=mg-1; } if(mg==16) { do //键盘扫描等待功能键按下 { flag=0; key(); } while(num! =15); } } while(num! =15); if(mg! =16&&num==15) { for(i=mg;i<16;i++) { PSWD0_0[i]=0; } } if(flag==1&&num==15) { flag=0; mg=0; for(i=0;i<16;i++)//用一次写一个向24c02里写 { i2cWrite24LC16B(PSWD0_0[i],(0x10+i)); delay_10ms; } display_4(); do //键盘扫描等待功能键按下 { flag=0; key(); } while(num! =11);//按下返回键,锁锁返回 { gotoloop; } } } if(flag==1&&num==10) { KSC=0; i2cWrite24LC16B(KSC,0X20); display_1(KSC); do //键盘扫描等待功能键按下 { flag=0; key(); } while(num! =11);//按下返回键,锁锁返回 gotoloop; } if(flag==1&&num==11)//按下返回键,锁锁返回 { gotoloop; } } } } #ifndef_key_h #define_key_h #include<> #defineucharunsignedchar #defineuintunsignedint bitflag=0;//按键按下标志位 sbitBEEP=P3^7;//蜂鸣器端口 delay(intz)//延时1ms {intx,y; for(x=z;x>0;x--) for(y=140;y>0;y--); } ucharnum;//按键返回值 ////////按键音程序////////////////// voidyin() { intc,n; if(flag==1) { for(c=0;c<80;c++) { for(n=0;n<50;n++);//延时 BEEP=~BEEP;//取反输出到喇叭的信号 } } } ////////////键盘程序/////////////////// intkey() {uchartemp; P2=0X7f; temp=P2&0x0f; if(temp! =0x0f) { delay(5); if(temp! =0x0f) {temp=P2; switch(temp) { case0x77: num=0; break; case0x7b: num=1; break; case0x7d: num=2; break; case0x7e: num=3; break; } do{ //等待按键抬起 temp=P2; temp=temp&0x0f; } while(temp! =0x0f); flag=1; yin(); } } P2=0Xbf; temp=P2&0x0f; if(temp! =0x0f) {delay(5); if(temp! =0x0f) {temp=P2; switch(temp) { case0xb7: num=4; break; case0xbb: num=5; break; case0xbd: num=6; break; case0xbe: num=7; break; } do{ temp=P2; temp=temp&0x0f; } while(temp! =0x0f); flag=1; yin(); } } P2=0Xdf; temp=P2&0x0f; if(temp! =0x0f) {delay(5); if(temp! =0x0f) {temp=P2; switch(temp) { case0xd7: num=8; break; case0xdb: num=9; break; case0xdd: num=10; break; case0xde: num=11; break; } do{ temp=P2; temp=temp&0x0f; } while(temp! =0x0f); flag=1; yin(); } } P2=0Xef; temp=P2&0x0f; if(temp! =0x0f) {delay(5); if(temp! =0x0f) {temp=P2; switch(temp) { case0xe7: num=12; break; case0xeb: num=13; break; case0xed: num=14; break; case0xee: num=15; break; } do{ temp=P2; temp=temp&0x0f; } while(temp! =0x0f); flag=1; yin(); } } return(num); } #endif #ifndef_xsh_h #define_xsh_h #include<> #defineucharunsignedchar #defineuintunsignedint sbitshj=P1^0;//串口数据口 sbitsck=P1^1;//串口时钟 ucharcodetab[20]={ 0x88,/*0*/ 0xBE,/*1*/ 0xC4,/*2*/ 0x94,/*3*/ 0xB2,/*4*/ 0x91,/*5*/ 0x81,/*6*/ 0xBC,/*7*/ 0x80,/*8*/ 0x90,/*9*/ 0xA0,/*A*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 密码锁 程序 完整 代码