初始密码:12345678
单片机与存储器之间通过IIC 通讯来建立密码系统通讯
仿真启动开始设置密码
万能密码锁参考程序源代码:
#include #include"intrins.h" #include"key.h" #include"xsh.h" #include"24c02.h" #define ulong unsigned long bit BJCB=0;//报警标志 XG=0,//修改密码标志位 BJ=0,//报警标志位 SJ=0;//锁键盘标志位 // xg=0;//修改密码标志位 uchar PSWD0_0[16]={0};//密码输入缓存存储单元 //uchar code PSWD0_1[16]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};//用户初始密码存储单元 //uchar PSWD1_0[16]={0};//读出密码缓存存储单元 uchar PSWD1_1[16]={1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8};管理员初始密码存储单元 sbit OUT=P3^5;//输出端口 sbit L1=P0^2;//上电指示 sbit L2=P0^1;//开锁指示 sbit L3=P0^0;//报警指示 uint mg=0,//密码个数 KSC=0,//开锁次数 BJC=0,//报警次数 TCNTY=0,//用户按键定时次数累加 TCNTG=0,//管理员输入密码定时次数 yhsh,//用户输入标志位 glsh,//管理员输标志位 shw;//密码输完标志位 void yhmimaxig();//密码修改程序 void glmimaxig();//管理员修改程序 void bjyin(ulong t) { ulong c; uint n; for(c=0;c for(n=0;n<50;n++); //延时 BEEP=~BEEP; //取反输出到喇叭的信号 } } void delay_10ms(void) { uint i = 1000; while(i–); } //定时中断服务函数// void timer0() interrupt 1 { uint i; TH0=(65536-50000)/256; //对TH0 TL0赋值50MS定时 TL0=(65536-50000)%256; //重装计数初值 if(yhsh1) { TCNTY++;//用户定时计数 if(shw1) { TR0=0; TCNTY=0; } if(TCNTY400) { 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; } } else if(glsh1) { TCNTG++;//管理员定时计数 if(shw1) { TR0=0; TCNTG=0; } if(TCNTG400) { 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; } } } void main() { uint i; TMOD=0x01; //定时器工作在方式1 ET0=1; EA=1; TH0=(65536-50000)/256; //对TH0 TL0赋值 TL0=(65536-50000)%256; //使定时器0.05秒中断一次 //Read_page24c02(0x00,PSWD1_1,16);//向24c02里读用户初始密码 //i2cWrite24LC16B(0,0X20); /第一次向24c02里写入初始管理员密码、用户密码、开锁次数/ for(i=0;i<16;i++) //用一次写一个向24c02里写 { i2cWrite24LC16B(PSWD1_1[i],i); delay_10ms; } for(i=0;i<16;i++) //用一次写一个向24c02里写 { i2cWrite24LC16B(PSWD1_1[i],0x10+i); delay_10ms; } //proteus仿真时用,烧程序时,第一次用,第二次不用。 KSC=i2cRead24LC16B(0X20); loop: L1=0;//上电红灯亮 L2=1;//开锁成功后绿灯亮 L3=1;//输错时黄灯亮报警 OUT=0;//开信号关闭 display_0(KSC);//开锁前显示 ///密码输入/ if(SJ0)//锁键盘标志位为0 { do { flag=0;//键盘标志位 key(); if(flag1&&num12) //判断是否为管理员功能键按下 { goto gl; } if(flag1&&num<=9) { PSWD0_0[mg]=num; mg++;//密码个数 } if(flag1&&num14&&mg>=1)//输入错误删除 { mg=mg-1; } if(mg1) //有密码键按下开定时器限时 { TR0=1; yhsh=1; } } while(num!=15); if(mg!=16) { for(i=mg;i<16;i++) { PSWD0_0[i]=0; } } /密码比较电路 if(flag1&&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); } goto loop; } else if(BJC3) { 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); } goto loop; } } else if(BJCB0) { KSC++; display_1(KSC); i2cWrite24LC16B(KSC,0X20); if(KSC100) { SJ=1; } L2=0; L1=1; OUT=1; mg=0;//密码个数清零 loop1:do //键盘扫描等待功能键按下 { flag=0; key(); if(flag) { flag=0; switch(num) { case 13: { display_2(); do { flag=0;//键盘标志位 key(); if(flag1&&num<=9) { PSWD0_0[mg]=num; mg++;//密码个数 } if(flag1&&num14&&mg>=1)//输入错误删除 { mg=mg-1; } if(mg16) { do //键盘扫描等待功能键按下 { flag=0; key(); } while(num!=15); } } while(num!=15); if(mg!=16&&num15) { for(i=mg;i<16;i++) { PSWD0_0[i]=0; } } if(flag1&&num15) { 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); //按下返回键,锁锁返回 { goto loop; } } };break; case 11: { goto loop; //break; } } } } while(flag!=0);//如果设置密码键按下 goto loop1; // i2cWrite24c02_page(0x00,PSWD1_1,mg); } } else { do { flag=0; key(); } while(num!=12);//判断是否为管理员功能键按下 gl:do//管理员输入密码 { flag=0; key(); if(flag1&&num<=9) { PSWD0_0[mg]=num; mg++;//密码个数 } if(flag1&&num14&&mg>=1)//删除键按下 { mg=mg-1; } if(mg1) { TR0=1; }//开定时器TO限5秒开锁 } while(num!=15); if(mg!=16&&num15) { 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(flag1&&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); goto loop; } else { BJCB=0; display_5();//三次输入密码失败,自锁 mg=0;//密码个数清零 delay(10000); display_1(KSC); goto loop; } } else { SJ=0; display_4();//管理员开锁显示 mg=0; L2=0; L1=1; L3=0;//密码个数清零 do //键盘扫描等待功能键按下 { flag=0; key(); } while(flag0); //如果设置密码键按下 if(flag1&&num13) { flag=0; display_2(); do { flag=0;//键盘标志位 key(); if(flag1&&num<=9) { PSWD0_0[mg]=num; mg++;//密码个数 } if(flag1&&num14&&mg>=1)//输入错误删除 { mg=mg-1; } if(mg16) { do //键盘扫描等待功能键按下 { flag=0; key(); } while(num!=15); } } while(num!=15); if(mg!=16&&num15) { for(i=mg;i<16;i++) { PSWD0_0[i]=0; } } if(flag1&&num15) { 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); //按下返回键,锁锁返回 { goto loop; } } } if(flag1&&num10) { KSC=0; i2cWrite24LC16B(KSC,0X20); display_1(KSC); do //键盘扫描等待功能键按下 { flag=0; key(); } while(num!=11);//按下返回键,锁锁返回 goto loop; } if(flag1&&num11)//按下返回键,锁锁返回 { goto loop; } } } }
上一篇:51单片机控制的手机蓝牙遥控小车设计
下一篇:基于STC51单片机超声波测距
推荐阅读最新更新时间:2024-11-17 11:16
推荐帖子
- 【设计工具】Xilinx 常见问题及答案
- 问:我在ISE4.1中,用fpgaexpressverilog编译的某些文件,用modelsimxe只能前仿,不能后仿,不知5.1i是否有改进?问:和5.1结合比较好的验证工具除了Modelsim外,PC机上可运行的有什么?问:ISE在综合的时候,把很多中间信号、特别是组合逻信号都综合掉了(或改名了),这样在后仿的时候造成了很大的不便,请问如何避免这一问题?问:Data2BRAM可以简化哪些工序?问:毛刺有何比较好的消除方法。实现加法,利用ieee.std_logic_
- GONGHCU FPGA/CPLD
- HMC1022电子指南针模块51代码
- HMC1022电子指南针模块51代码HMC1022电子指南针模块51代码就不能免费下载么就不能免费下载么好东西,学习学习求免费下载啊
- saxmcu 51单片机
- 【NUCLEO-L552ZE测评】+HLK-V20语音识别模块的实验
- 通过语音控制家电是我本次评测项目的一个重点,这次实验使用的是从某宝购买的语音识别模块,这个模块具有较高的性价比,缺点就是无法改变识别的内容,只能使用其定制好的语音命令。下面是实验过程中的照片:下图是语音识别模块,模块通过串口与单片机进行通讯:为了方便测试,我使用了一块192*64的LCD显示屏来展现相关的信息:输出控制部分暂时使用了一块四路继电器模块,在各个继电器上标注了被控制的家电设备,并没有真正连接器对应的家电设备,在测试过程中可以通过观察对应的L
- hujj stm32/stm8
- STM32USBLIB里面的一点细节求证!!
- /********************************************************************************MacroName:SetEPDblBuffCount/SetEPDblBuf0Count/SetEPDblBuf1Count.*Description:Getsbuffer0/1addressofadoublebufferendpoint.*Input:bEpNum:endpo
- vviking stm32/stm8
- 如何编译这个cm7到u8500去
- 这个教程没写完善的,过于简陋,而且我还没有检查过,不过我要去写作业去了,先占个位子,下次补全,也许里面有什么错误哦,请及时指正我,毕竟我只是一个普通的linux开发爱好者,不够专业。希望能有懂linux的同学加入编译u8500rom的行列,其实很简单的啦下面主要讲的是如何编译这个cm7到u8500去,方法可能与tooken的不一样,貌似他的不是从源码编译的。。。汗ok,tooken发布了千金版,可能大家对cm7没有什么印象,我以前编译过cm6,不过没有成功移
- Wince.Android Linux与安卓
- #AI挑战营第一站#pytorch训练MNIST数据集实现手写数字识别
- 下载MNIST数据集#MNIST数据集,用于训练,一次抓60sizeself._train_loader=torch.utils.data.DataLoader(torchvision.datasets.MNIST('./data/',train=True,download=True,transform=torchvision.transforms.Compose()),batch_si
- LitchiCheng 嵌入式系统
设计资源 培训 开发板 精华推荐
- 具有外部偏置或同步功能的 CS51413 1.5 A、260 kHz 和 520 kHz 低压降压稳压器的典型应用电路
- LT3973HDD 12V 降压转换器的典型应用
- 使用 Analog Devices 的 LT1302CN8 的参考设计
- 具有SLLIMM™STGIPN3H60和MCU STM32F100C6T6B的低功率电机控制板
- AM6TW-2403DH35Z ±3.3V 6 瓦双输出 DC-DC 转换器的典型应用
- MPU6050-GY521姿态传感器模块
- AD8604DRZ-REEL 作为 DAC 输出缓冲器驱动重负载的典型应用
- 2013年F题:红外光通信装置
- AM1/4S-1207SH30Z 7.2V 0.25 瓦 DC/DC 转换器的典型应用
- 水滴门禁卡拼板
- TE 物联网专属平台齐上线,您值得拥有的专业全能助手
- 一起“充电”,DIY自己专属应急灯
- 泰克70周年庆 了解新品 参与掀盖有礼活动 最多可获得6次抽奖机会
- 下载有礼:看“智””造“热”侦探 FLIR ETS320 红外热像仪如何纠错!
- ADI有奖直播:基准电压源产品技术及应用选择 7月25日上午10:00-11:30 不容错过~
- 【西门逛中发】之初识中发
- 是德科技 DATA Center 资料,满足您的需求~下载有好礼!
- 【EE团】TI M4开发板超低价尝鲜体验,分享心得赢百元返现!
- 【EEWORLD中秋国庆专辑】你身边的电子牛人秀
- 泰克MDO3000系列示波器结合MDO3PWR功率分析模块 立即询价享春季好礼!