开始
送位控码
刚启动? 否 是
送全1段码 送正常段码
缓冲区地址加1
用for循环通过变量是
i来判断
是否到最高位
否 是
返回
图6
4、 核对密码程序 代码如下: void open_lock() {
uint i,i1; uchar j;
if((y==2&&w==1)&&v<8) {
mima[v]=keyvalue; //开锁模式下把输入的密码逐个存入输入缓冲单元 jm_disp[v]=0x40;//界面显示‘-’ w=0; v=v+1; //指向下一位数码管 }
if((ent==1)&&((lock==6)||(lock==8)))//进行密码的核对 {
for(i=0;i 11 { j=0x00; tmima[i]=At24c02Read(j); //从24C02读取用户密码存入读取缓冲单 //元 } else { j=0x06; tmima[i]=At24c02Read(j); //从24C02读取管理员密码存入读取缓冲 //单元 } j=j+1; } for(i=0;i 12 mima[i]=0x00; } } lock=0; } ent=0;//密码没输完,确认标志重新清零 } 程序流程如图: 否 是 否 密码存入缓冲单元 是 否 错误提示 是 否 是 开始 密码输入完成? 是用户密码? 读取正确用户密码 读取正确管理员密码 核对用户密码 核对管理员密码 密码正确? 继电器工作(开门) 错误提示 密码正确? 进入管理员模式 返回 13 图7 核对密码程序先判断密码是否输入完成,用户密码6位,管理员密码8位,若输入完成则判断是用户密码还是管理员密码,然后从24C02读取所存的正确密码进行核对,若密码是6位则进行用户密码的核对,若是8位则进行管理员密码的核对,用户密码正确则继电器工作开门,管理员密码正确则进入管理员模式,管理员模式下可进行用户密码和管理员密码的修改,若密码输入错误则数码管提示错误信息‘E’,3s后返回常态。 5、 中断服务程序 代码如下: void time0() interrupt 1 { n1=n1-1; if(n1==0) //是否满1s? { n1=16; //n1重装初值 clk_value[2]=clk_value[2]+1; //秒单元加1 if(y==2) //开锁模式下长时间不输密码则开始计数 count=count+1; if(clk_value[2]==60) //满1分? { clk_value[2]=0; //秒单元清零 clk_value[1]=clk_value[1]+1; //分单元加1 if(clk_value[1]==60) //满1小时? { clk_value[1]=0; //分单元清零 clk_value[0]=clk_value[0]+1; //时单元加1 if(clk_value[0]==24) //满一天? { clk_value[0]=0; //时单元清零 } } } } } T0计数中断一次时间还达不到1s,通过n1变量循环控制达到1s后再执行中断服务程序,秒单元加1,满60s后分单元又加1,满60小时时单元加1,满24小时时单元清零。 程序流程如图: 开始 14 否 是 否 是 否 否 图8 五、 系统资源分配 表1: 硬件资源分配 名称 P0口 P1口 P2.4口 P2.5、P2.6、P2.7口 P2.0口 P2.1口 表2: 满1秒? 秒单元加1 满1分? 分单元加1 满1小时? 是 时单元加1 满1天? 是 时单元清零 返回 功能 数码管段码控制 键盘接口 驱动继电器 138译码器输入端,输出端控制数码管位选 I2C通信24C02时钟线(SCL) I2C通信24C02数据线(SDA) 15