您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 单片机密码锁C程序完整代码
单片机密码锁C程序完整代码2009-08-1814:39#includeAT89x51.h#includeintrins.h#includekey.h#includexsh.h#include24c02.h#defineulongunsignedlongbitBJCB=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;//报警指示uintmg=0,//密码个数KSC=0,//开锁次数BJC=0,//报警次数TCNTY=0,//用户按键定时次数累加TCNTG=0,//管理员输入密码定时次数yhsh,//用户输入标志位glsh,//管理员输标志位shw;//密码输完标志位voidyhmimaxig();//密码修改程序voidglmimaxig();//管理员修改程序voidbjyin(ulongt){ulongc;uintn;for(c=0;ct;c++){for(n=0;n50;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;i2;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;i2;i++)//声光报警电路{L3=0;bjyin(1000);L3=1;delay(1000);}L1=0;}}}voidmain(){uinti;TMOD=0x01;//定时器工作在方式1ET0=1;EA=1;TH0=(65536-50000)/256;//对TH0TL0赋值TL0=(65536-50000)%256;//使定时器0.05秒中断一次//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;i16;i++){PSWD0_0[i]=0;}}/////////////////密码比较电路////////////////////////////if(flag==1&&num==15){flag=0;yhsh=0;shw=1;num=0;for(i=0;i16;i++)//从24c02里读出16个密码{PSWD1_1[i]=i2cRead24LC16B(i);delay_10ms;}for(i=0;i16;i++){if(PSWD1_1[i]!=PSWD0_0[i]){BJCB=1;break;}elseBJCB=0;}}if(BJCB!=0){BJC++;if(BJC!=3){BJCB=0;//第一次和第二次报警delay(500);mg=0;//密码个数清零L1=1;for(i=0;i3;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;i2;i++)//声光报警电路{L3=0;bjyin(1000);L3=1;delay(1000);}gotoloop;}}elseif(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;i16;i++){PSWD0_0[i]=0;}}if(flag==1&&num==15){flag=0;mg=0;for(i=0;i16;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;i16;i++){PSWD0_0[i]=0;}}//////////管理员密码比较/////////////////////////Read_page24c02(0x10,PSWD0_1,16)for(i=0;i16;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;img;i++){if(PSWD1_1[i]!=PSWD0_0[i]){BJCB=1;break;}elseBJCB=0;}}if(BJCB!=0){BJC++;if(BJC!=3){BJCB=0;//第一次和第二次报警mg=0;//密码个数清零L1=1;for(i=0;i2;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;i16;i++){PSWD0_0[i]=0;}}if(flag==1&&num==15){flag=0;mg=0;for(i=0;i16;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#includeAT89x51.h#defineucharunsignedchar#defineuintunsignedintbitflag=0;//按键按下标志位sbitBEEP=P3^7;//蜂鸣器端口delay(intz)//延时1ms{intx,
本文标题:单片机密码锁C程序完整代码
链接地址:https://www.777doc.com/doc-4848643 .html