电子密码锁程序

合集下载

Digital_lock(电子密码锁程序——完整版)

Digital_lock(电子密码锁程序——完整版)

Digital_lock(电子密码锁程序——完整版)/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include#include#include#include"KEY_4x4.h"#include"LCD_1602.h"#include"I2C.h"#define uint unsigned int#define uchar unsigned charuchar code table0[]=" ";uchar code table1[]="PLESSE ID";uchar code table2[]="WELCOME";uchar code table3[]="HAPPY";uchar code table4[]="ERROR";uchar code table5[]="****";uchar code table6[]="ERROR AGAIN";uchar code table8[]="SUCCEED";uchar code table9[]="OK";uchar code table10[]="Change Password";uchar code table11[]="Y/N";uchar code table12[]="New Password";uchar code table13[]="Succeed";uchar code table14[]="NOT FORGET";uchar code table15[]="Keyboard Locked";uchar code table16[]="S_users Y/N";uchar code table17[]="YOU NOT S_user"; uchar code table18[]="S_user Password"; uchar code table19[]="S_user Password"; uchar code table20[]="S_user ID";uchar code table21[]="Remember:";uchar code table22[]="Init Password";sbit yellow=P2^5; // 上锁指示灯sbit red=P2^6; //密码错误信号sbit green=P2^7; //已开锁指示信号sbit blue=P2^4; //修改密码指示信号bit keyscan_flag;//键盘有键按下标志bit BJCB=0; //密码正确错误标志bit BJ=0; //报警标志位bit SJ=0; //锁键盘标志位bit super_flag=0;//超级用户密码是否正确标志bit come_flag=0; //用户输入标志位bit finish_flag=0; //密码输完标志位bit error_alarm_flag=0;// 密码错误报警标志bit right_alarm_flag=0;//密码正确报警标志uchar PSWD0[10]=0; //密码输入缓存存储单元uchar PSWD1[10]=0; //读出密码缓存存储单元uchar PSWD2[4]={8,8,8,8};//用户初始密码存储单元uchar PSWD3[4]={1,1,1,1};//超级用户密码存储单元uchar m,num,wo,count=0;void delay1(uint x){uchar i;for(;x>0;x--)for(i=200;i>0;i--);}/************************************************************** *函数功能:第一次烧片时将初始密码烧到24c02*************************************************************** */void burn_frist(void) //{uchar i;for(i=0;i<4;i++){I2C_write_data(i,PSWD2[i]);delay1(20);}delay1(20);for(i=0;i<4;i++){I2C_write_data(i+10,PSWD3[i]);delay1(20);}}/************************************************************** *函数功能:报警声音*************************************************************** /void alarm_error(uint t){uint n;for(;t>0;t--){for(n=0;n<300;n++);BEEP=~BEEP; //取反输出到喇叭的信号}}void alarm_right(uint t){uint n;for(;t>0;t--){for(n=0;n<500;n++);BEEP=~BEEP; //取反输出到喇叭的信号}}/************************************************************** 函数功能:显示各个提示**************************************************************/ void display0(void)/* 显示输入的数字 */{write_1602_com(0x80+0x45+wo);write_1602_data(num+48);delay1(1800);write_1602_com(0x80+0x45+ wo++);write_1602_data('*');void display1(void) /* 上电时显示 */{uchar length=0;length=strlen(table0);write_1602_com(0x80);display(table0,length); // PLESSE IDlength=strlen(table0);write_1602_com(0x80+0x40);display(table0,length);length=strlen(table1);write_1602_com(0x83);display(table1,length);}void display2(void) /* 第1、2次密码错误显示 */ {uchar length=0;length=strlen(table0);write_1602_com(0x80);display(table0,length);length=strlen(table6); //ERROR AGAINwrite_1602_com(0x82);display(table6,length);// length=strlen(table5); // ****// write_1602_com(0x80+0x45);// display(table5,length);}void display3(void) /* 第3次密码输入错误显示 */uchar length=0;length=strlen(table0);write_1602_com(0x80);display(table0,length);length=strlen(table4); // ERRORwrite_1602_com(0x85);display(table4,length);//length=strlen(table5); //****//write_1602_com(0x80+0x45);//display(table5,length);}void display4(void) /* 密码输入正确显示 */ {uchar length=0;length=strlen(table0);write_1602_com(0x80);display(table0,length);length=strlen(table2); //WELCOME write_1602_com(0x84);display(table2,length);length=strlen(table3); //HAPPYwrite_1602_com(0x80+0x45);display(table3,length);}void display5(void) /*提示修改密码显示 */ {uchar length=0;write_1602_com(0x80);display(table0,length);length=strlen(table10);// change password write_1602_com(0x80);display(table10,length);length=strlen(table0);write_1602_com(0x80+0x40);display(table0,length);length=strlen(table11);// Y/Nwrite_1602_com(0x80+0x46);display(table11,length);}void display6(void) /*提示新密码输入显示 */ {uchar length=0;length=strlen(table0);write_1602_com(0x80);display(table0,length);length=strlen(table12);// new password write_1602_com(0x82);display(table12,length);length=strlen(table0);write_1602_com(0x80+0x40);display(table0,length);}void display7(void)/* 提示密码修改正确显示 */ {uchar length=0;write_1602_com(0x80);display(table0,length);length=strlen(table13);//succeedwrite_1602_com(0x84);display(table13,length);length=strlen(table0);write_1602_com(0x80+0x40);display(table0,length);length=strlen(table14);//NOT FORGETwrite_1602_com(0x80+0x42);display(table14,length);}void display8(void)/* 3次输入密码错误后,进入超级用户提示显示 */{uchar length=0;length=strlen(table0);write_1602_com(0x80);display(table0,length);length=strlen(table15); //Keyboard Lockedwrite_1602_com(0x80);display(table15,length);length=strlen(table16); //S_users Y/Nwrite_1602_com(0x80+0x41);display(table16,length);}void display9(void) /* 非法超级用户 */{uchar length=0;length=strlen(table0);write_1602_com(0x80);display(table0,length);length=strlen(table17); //YOU NOT S_user write_1602_com(0x80);display(table17,length);length=strlen(table0);write_1602_com(0x80);display(table0,length);length=strlen(table15); //Keyboard Locked write_1602_com(0x80);display(table15,length);}void display10(void) /* 正确超级用户进入显示 */ {uchar length=0;length=strlen(table0);write_1602_com(0x80);display(table0,length);length=strlen(table18); //S_user Password write_1602_com(0x80);display(table18,length);length=strlen(table0);write_1602_com(0x80+0x40);display(table0,length);}void display11(void) /* 超级用户密码输入提示 */{uchar length=0;length=strlen(table0);write_1602_com(0x80);display(table0,length); // S_user IDlength=strlen(table20);write_1602_com(0x82);display(table20,length);length=strlen(table0);write_1602_com(0x80+0x40);display(table0,length);}void display12(void) /* 显示初始密码提示用户记住密码*/ {uchar i,length;length=strlen(table0);write_1602_com(0x80);display(table0,length); //Init Passwordlength=strlen(table22);write_1602_com(0x80);display(table22,length);length=strlen(table21);write_1602_com(0x80+0x40);//Remember:display(table21,length);length=strlen(PSWD2);write_1602_com(0x80+0x4c);for(i=0;i<length;i++){write_1602_data(PSWD2[i]+48);}}/************************************************************* 函数功能:从键盘扫描密码**************************************************************/ void key(void){if(keyscan_flag==1 && num<=9){write_1602_com(0x80+0x45+wo);write_1602_data(num+48);delay1(1800);write_1602_com(0x80+0x45+ wo++);write_1602_data('*');PSWD0[m++]=num;//*password=num;//password++;}}/************************************************************** *******函数功能:密码判断*************************************************************** ******/void judge_password(void){uchar i;if(keyscan_flag==1 && num==15) {keyscan_flag=0;m=0;for(i=0;i<4;i++) //从24c02里读出密码{PSWD1[i]=I2C_read_data(i);delay1(10);}for(i=0;i<4;i++){if(PSWD1[i]!=PSWD0[i]){BJCB=1;break;}elseBJCB=0;}wo=0;}}void super_judge_password(void) {uchar i;if(keyscan_flag==1 && num==15) </length;i++){keyscan_flag=0;for(i=0;i<4;i++) //从24c02里读出密码{PSWD1[i]=I2C_read_data(i+10);delay1(10);}for(i=0;i<4;i++){if(PSWD1[i]!=PSWD0[i]){super_flag=1;break;}elsesuper_flag=0;}wo=0;}}/************************************************************** ********函数功能:判断密码是否正确以及修改密码*************************************************************** ********/void pass_word(void){uchar i;uchar m=0,length=0;//uchar *password;//password=PSWD0;loop: yellow=0;green=1;red=1;display1();if(SJ==0){m=0;do{// key();keyscan_flag=0; //键盘标志位num=keyscan();if(keyscan_flag==1 && num<=9){display0();PSWD0[m++]=num;}if(keyscan_flag==1 && num==10||num==11||num==12||num==13){red=0;delay1(2000);red=1;goto loop;}}while(num!=15);if(m!=4){for(i=m;i<4;i++){PSWD0[i]=0;}}judge_password(); //密码判断/* 密码错误相关处理 */if(BJCB){count++;if(count!=3){yellow=1;red=0;BJCB=0; //清第一次和第二次报警error_alarm_flag=1;display2();/* 密码错误报警声 */for(i=0;i<3;i++){alarm_error(200);delay1(2000);}red=1;goto loop;}else if(count==3){red=0;count=0;BJCB=0;yellow=1;error_alarm_flag=1;display3(); //第3次密码输入错误显示/* 密码错误报警声 */for(i=0;i<5;i++){alarm_error(200);delay1(2000);}display8();//进入超级用户提示显示do{keyscan_flag=0;num=keyscan();if(num==14){ // 15表示 Ybreak; // 14表示 N}}while(num!=15);/* Y 进入超级密码设置 N 跳出超级密码设置但键盘被锁 */ if(keyscan_flag && num==15){display11();// 超级用户密码输入提示m=0;do{keyscan_flag=0;num=keyscan();if(keyscan_flag==1 && num<=9){display0();PSWD0[m++]=num;}}while(num!=15);super_judge_password(); //密码判断if(super_flag){display9(); //非法超级用户SJ=1; //锁键盘delay1(4000);}else //是超级用户{display10(); //显示超级用户display12(); // 显示初始密码提示用户记住密码/* 再次将初始密码写入 */delay1(50);for(i=0;i<4;i++){I2C_write_data(i,PSWD2[i]);delay1(20);}delay1(50);do{keyscan_flag=0;num=keyscan();}while(num!=15);num=0;}}if(keyscan_flag && num==14) {SJ=1; //锁键盘}red=1;m=0;delay1(4000);goto loop;}}/* 密码正确处理 */else{red=1;green=0; //表示密码正确yellow=1;right_alarm_flag=1;m=0; //密码个数清零display4();alarm_right(700);}LOOP1: do{keyscan_flag=0;num=keyscan();if(keyscan_flag){keyscan_flag=0;switch(num){case 11:{blue=0; //修改密码标记green=1;display5(); //提示修改密码do{keyscan_flag=0;num=keyscan();if(num==14){ // 14表示 Nbreak; // 15表示 Y}}while(num!=15);/* Y 从新向24c02写新密码 N跳出 */ if(keyscan_flag==1 && num==15){display6();m=0;wo=0;do{keyscan_flag=0;num=keyscan();if(keyscan_flag==1 && num<=9) {PSWD0[m++]=num;display0();}if(m==10){goto LOOP1; //超出10位密码范围}}while(num!=15);if(m!=10 && num==15) //{for(i=m;i<10;i++){PSWD0[i]=0;}}if(keyscan_flag && num==15) {keyscan_flag=0;for(i=0;i<4;i++) //一个向24c02里写{I2C_write_data(i,PSWD0[i]);delay1(20);}display7();//提示修改密码成功}do{keyscan_flag=0;num=keyscan();}while(num!=15); //锁锁返回wo=0;blue=1;goto loop;}/* 不修改密码跳到初始界面 */else if(keyscan_flag && num==14) {blue=1;wo=0;goto loop;}}break;case 14:{goto loop;}break;default: goto loop;}}}while(keyscan_flag!=0);//如果设置密码键按下goto LOOP1;}}void init_timer(void){TMOD=0x01; //定时器工作在方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;EA=1;}void main(){//uchar i;//uchar m=0,length=0;//uchar *password;//password=PSWD0;m=0;num=0;wo=0;count=0;init_timer();I2C_init();init_1602();// burn_frist(); //第一次烧片时用// while(1)// {pass_word();// }for(;;);}void timer0() interrupt 1{uint i;TL0=(65536-50000)%256; // 重装计数初值TH0=(65536-50000)/256; // 对TH0 TL0赋值5MS定时if(error_alarm_flag){for(i=0;i<3;i++){alarm_error(200);}}if(right_alarm_flag){//for(i=0;i<3;i++)//{alarm_right(1000);// }} }。

简易电子密码锁(基于51单片机)报告

简易电子密码锁(基于51单片机)报告

简易电子密码锁设计&我的设计思想联想到日前在安全技术防范领域,具有防盗报警功能的电子密码控制系统逐渐代替传统的机械式密码控制系统,并结合近期的学习过程和一些参考书籍,完成了简易的电子密码锁设计学习。

电子密码控制是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。

电子密码控制不论性能还是安全性都已大大超过了机械类结,具有良好的应用前景。

一、设计目的与内容设计了一个简易电子密码锁,可按要求从矩阵键盘输入6位数密码如“080874”,输入过程中有按键音提示。

当密码输入正确并按下确认键(“OK”键)后,发光二极管被点亮。

二、工作原理与基本操作过程介绍采用80C51为核心的单片机控制。

利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,进行电子密码锁的设计。

(1)键盘的人工编码给每个按键指定一个按键值,报告设定按键S1~S9对应的按键值分别为“1~9”,S10为数字“0”,S11为“OK”,S12~S16对应的按键值分别为12~16。

(2)根据按键值,指定每个按键对应的输入数字和信息。

如下表为每个按键代表的数字和输入信息。

当键盘扫描程序扫描到S10键被按下时,将其代表的按键值“0”通知CPU,CPU根据事先的规定,就会知道输入的数字是“0”。

矩阵键盘中每个按键所代表的数字和输入信息(3)输入数字和密码对比。

先将设定的密码用一个数组保存,报告中用的密码“080874”和“OK”确认信息可以用如下数组保存:Unsigned char D[ ]={0,8,0,8,7,4,11};在主程序接收到数字和信息后,通过逐位对比的方法进行判断。

输入的数字经对比正确时,程序才会继续顺序执行,否则,程序拒绝继续执行。

(4)执行预期功能。

如果输入密码正确,执行预期功能,报告设计为点亮P3.0口引脚LED。

三、电路图设计(Proteus绘制)四、程序设计(C语言)矩阵式键盘实现的电子密码锁程序#include<reg51.h> //包含51单片机寄存器定义的头文件sbit P14=P1^4; //将P14位定义为P1.4引脚sbit P15=P1^5; //将P15位定义为P1.5引脚sbit P16=P1^6; //将P16位定义为P1.6引脚sbit P17=P1^7; //将P17位定义为P1.7引脚sbit sound=P3^7; //将sound位定义为P3.7unsigned char keyval; //储存按键值/************************************************************** 函数功能:延时输出音频**************************************************************/ void delay(void){unsigned char i;for(i=0;i<200;i++);}/************************************************************** 函数功能:软件延时子程序**************************************************************/ void delay20ms(void){unsigned char i,j;for(i=0;i<100;i++)for(j=0;j<60;j++);}/************************************************************** 函数功能:主函数**************************************************************/ void main(void){unsigned char D[ ]={0,8,0,8,7,4,11}; //设定密码EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x01; //使用定时器T0的模式1TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%256; //定时器T0的高8位赋初值TR0=1; //启动定时器T0keyval=0xff; //按键值初始化while(keyval!=D[0]) //第一位密码输入不正确,等待;while(keyval!=D[1]) //第二位密码输入不正确,等待;while(keyval!=D[2]) //第三位密码输入不正确,等待;while(keyval!=D[3]) //第四位密码输入不正确,等待;while(keyval!=D[4]) //第五位密码输入不正确,等待;while(keyval!=D[5]) //第六位密码输入不正确,等待;while(keyval!=D[6]) //没有输入“OK”,等待;P3=0xfe; //P3.0引脚输出低电平,点亮LED}/**************************************************************函数功能:定时器0的中断服务子程序,进行键盘扫描,判断键位**************************************************************/void time0_interserve(void) interrupt 1 using 1 //定时器T0的中断编号为1,使用第一组寄存器{unsigned char i;TR0=0; //关闭定时器T0P1=0xf0; //所有行线置为低电平“0”,所有列线置为高电平“1”if((P1&0xf0)!=0xf0) //列线中有一位为低电平“0”,说明有键按下delay20ms(); //延时一段时间、软件消抖if((P1&0xf0)!=0xf0) //确实有键按下{P1=0xfe; //第一行置为低电平“0”(P1.0输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=1; //可判断是S1键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=2; //可判断是S2键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=3; //可判断是S3键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=4; //可判断是S4键被按下P1=0xfd; //第二行置为低电平“0”(P1.1输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=5; //可判断是S5键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=6; //可判断是S6键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=7; //可判断是S7键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=8; //可判断是S8键被按下P1=0xfb; //第三行置为低电平“0”(P1.2输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=9; //可判断是S9键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=0; //可判断是S10键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=11; //可判断是S11键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=12; //可判断是S12键被按下P1=0xf7; //第四行置为低电平“0”(P1.3输出低电平“0”)if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”keyval=13; //可判断是S13键被按下if(P15==0) //如果检测到接P1.5引脚的列线为低电平“0”keyval=14; //可判断是S14键被按下if(P16==0) //如果检测到接P1.6引脚的列线为低电平“0”keyval=15; //可判断是S15键被按下if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”keyval=16; //可判断是S16键被按下for(i=0;i<200;i++) //让P3.7引脚电平不断取反输出音频{sound=0;delay();sound=1;delay();}}TR0=1; //开启定时器T0TH0=(65536-500)/256; //定时器T0的高8位赋初值TL0=(65536-500)%256; //定时器T0的高8位赋初值}五、用Proteus软件进行仿真利用Keil软件进行编译通过后,生成hex文件。

电子密码锁程序代码

电子密码锁程序代码

#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define lint long intsbit sda=P0^0;sbit scl=P0^1;sbit L1=P0^4;sbit L2=P0^6;void write_date(uchar,uchar);uchar code tab1[]={0,1,2,3,4,5,6,7,8,9};uchar code tab2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar code wela[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选编码uchar code Error[]={0x71,0x77,0x38,0x6d,0x79};uchar mima[8];uchar mima1[8];uchar num=20,temp,i=0,k=0,flag=0,flag1=2,flag2=2,flag3=0,flag4=0,a=0,b=0; //定义存储器,实现掉电保存void delay(){ ; ; }void start() //开始信号{sda=1;delay();scl=1;delay();sda=0;delay();}void stop() //停止{sda=0;delay();scl=1;delay();sda=1;delay();}void respons() //应答{uchar i;scl=1;delay();while((sda==1)&&(i<250))i++;scl=0;delay();}//显示函数//写入一字节数据void write_byte(uchar dat){uchar i,temp;temp=dat;for(i=0;i<8;i++){temp=temp<<1;scl=0;delay();sda=CY;delay();scl=1;delay();}scl=0;delay();sda=1;delay();}//读取一字节数据uchar read_byte(){uchar i,k;scl=0;delay();sda=1;delay();for(i=0;i<8;i++){scl=1;delay();k=(k<<1)|sda;scl=0;delay();}return k;}//大延时void delay1(uchar x){uchar y,z;for(y=x;y>0;y--)for(z=100;z>0;z--);}void write_date(uchar date,uchar add) {start();write_byte(0xa0);respons();write_byte(add);respons();write_byte(date);respons();stop();}//各种显示函数void display1(){for(i=0;i<5;i++){P2=wela[i];P1=Error[i];delay1(3);}}void display2(){P2=0xfe;P1=0x3f;delay1(3);}void display(uchar k){uchar j;for(j=0;j<=k;j++){P2=wela[j];P1=0xff;delay1(3);}}uchar read_add(uchar address) {uchar date;start();write_byte(0xa0);respons();write_byte(address);respons();start();write_byte(0xa1);respons();date=read_byte();stop();return date;}void init(){sda=1;delay();scl=1;delay();TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=0;TR0=0;ET1=0;TR1=0;for(i=0;i<8;i++){uchar add;add=i+2;mima[i]=read_add(add);}}uchar keyscan(){P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay1(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee:num=0;break;case 0xde:num=1;break;case 0xbe:num=2;break;case 0x7e:num=3;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay1(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=4;break;case 0xdd:num=5;break;case 0xbd:num=6;break;case 0x7d:num=7;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay1(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=8;break;case 0xdb:num=9;break;case 0xbb:num=10;break;case 0x7b:num=11;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay1(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=12;break;case 0xd7:num=13;break;case 0xb7:num=14;break;case 0x77:num=15;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}if(num==11){flag++;num=20;k=0;}//修改密码if(flag==1){if(flag2==2){P2=0x00;P1=0x31;}else if(flag4==0)display(k-1);if(num>=0&&num<=9&&flag3==0){flag2=1;if(k<8){mima1[k]=num;k++;}num=20;}//删除键if(num==12&&flag3==0){mima1[k]=0;k--;num=20;}//第一次判断if(num==10&&flag3==0){for(i=0;i<8;i++){if(mima[i]==mima1[i]){flag1=1;// flag2=1;}else{flag1=0;// flag2=0;i=8;}}num=20;k=0;}if(flag1==1) //输入新密码并保存{if(flag2==1){flag3=1;flag4=1;P2=0x00;P1=0x3f;}if(num>=0&&num<=9){flag2=0;flag4=0;if(k<8){mima1[k]=num;k++;}num=20;}if(num==12){mima1[k]=0;k--;num=20;}if(num==10){for(i=0;i<8;i++){uchar add;add=i+2;write_date(mima1[i],add);delay1(100);mima[i]=read_add(add);}num=20;k=0;flag2=2;}}if(flag1==0){flag3=1;display1();flag4=1;ET0=1;TR0=1;}}//输入密码开锁if(flag==0){if(flag2==2){P2=0x00;P1=0xff;}else if(flag3==0)display(k-1);if(num>=0&&num<=9&&flag3==0){flag2=0;mima1[k]=num;k++;num=20;}if(num==12&&flag3==0){mima1[k]=0;k--;num=20;}if(num==10&&flag3==0){for(i=0;i<8;i++){if(mima[i]==mima1[i]){flag1=1;}else{flag1=0;i=8;}}num=20;k=0;}if(flag1==1){flag3=1;TR1=1;}if(flag1==0){ display1();if(num!=20){display1();a=0;num=20;}flag3=1;ET0=1;TR0=1;}}if(flag==2){flag=0;}return num;}void main(){init();while(1){keyscan();}}void time0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256 ;a++;if(flag1==0){L1=0;display1();}if(a>=60){a=0;flag1=2;flag2=2;flag3=0;flag4=0;TR0=0;ET0=0;}}void time1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%256 ;b++;if(flag1==1){L2=0;display2();}if(b>=40){b=0;L2=1;flag1=2;flag2=2;flag3=0;ET1=0;TR1=0;}}。

电子密码锁C程序流程图

电子密码锁C程序流程图

主程序流程图
开始
初始化
键盘扫描
键功能程序
液晶显示程序
声光报警程序
结束
键功能流程图
键功能程序
清除程序
设置程序
开锁程序
键值=‘设置’?
键值=‘清除’?
键值=‘开锁’?
返回
密码设置流程图
设置成功
Y
两次新密码输入 是否相同?
锁死
N
Y
Y
再次输新密码
次数等于3?
N
输新密码
输入次数加一
设置程序
按下设置键 输旧密码 输入旧密码 是否正确?
N
声光报警
输入密码程序按下输入键
输入密码是否正确?
开锁
声光报警
次数加一次数等于3?
锁死
开锁
键盘输入
报警次数
检测密码校验电路执行电路
开锁电路
密码修改电路




锁定
市电供电电路电子切换开关


池断电检测
充电电路
开始
计时
消除
报警

正确
锁定
脉冲
220V
电源
V CC 6V
键盘扫描流程图
键盘扫描
有键闭合
延时去抖
计算键值
建立有效标志
建立无效标志
返回
闭合键释放
Y
Y
N
Y
N。

电子密码锁课程设计

电子密码锁课程设计

电子密码锁设计1.1 设计要求利用单片机作为控制核心,完成一个电子密码锁可以修改密码设计具体要求如下:1、密码的设定,此密码是固定在程序存储器ROM中,假设预设的密码为“12345共6位密码;2、密码的输入:采用两个按键来完成密码的输入,其中一个按键为功能键,另一个按键为数字键。

输入确认功能键之后,才能完成密码的输入过程。

进入密码的判断比较处理状态并给出相应的处理过程;3、密码输入正确按确认键,绿灯亮,输入密码错误、红灯亮蜂鸣器响。

1.2 设计内容:1、设计合理、正确的方案;2、系统硬件设计及焊接制作;3、系统软件设计及调试;4、系统联调。

1.3 主要设计条件:1、MCS-51单片机实验操作台1台;2、PC机及单片机调试软件;3、单片机应用系统板1套;4、系统设计所需的元器件。

2 方案论证与对比2.1 方案一采用数字电路控制,其原理方框图如1-1所示。

键盘输入开锁电路密码校验电路执行电路限时报警消除报警信号正确开锁市电供电电路电子切换开关充电电路蓄电池断电检测220V 6V 电源Vcc图1-1 数字电路控制图采用数字密码锁电路的好处就是设计简单。

用74LS112双JK 触发器构成的数字逻辑电路做为密码锁的核心控制,共设了9用户输入键,其中只有5个是有效的密码按键,其它的都是干扰按键,如果按下干扰按键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入,。

电路有两大部分组成:密码锁电路和备用电源,其中备用电源是防止停电造成的密码锁电路失效,是用户免遭麻烦。

密码锁电路包含:键盘输入,密码检测,开锁电路,执行电路,报警电路。

2.2.1单片机系统:此次课程设计采用一种是用以STC98C52为核心的单片机控制方案。

利用单片机灵活编程设计和丰富的I/O 端口,及其控制的准确性,进行电子密码锁的设计。

此次课题用8255课编程芯片的PC 口与键盘相连,做输入口,PA,PB 口与数码管相连,做显示。

2.2.2矩阵键盘接口电路:此次课程设计采用4*4矩阵键盘,与PC 相连,采用扫描法。

电子锁开启操作流程

电子锁开启操作流程

电子锁开启操作流程电子锁是一种便捷且安全的开锁设备,广泛应用于各种场所,如办公室、学校、宾馆等。

本文将为大家介绍电子锁的开启操作流程,以帮助使用者正确、快速地开启电子锁。

一、操作前准备在开启电子锁之前,需要做好以下准备工作:1. 确保手持设备(如智能手机或IC卡)已经安装了相应的开锁应用程序或者配置了相应的开锁信息。

2. 确认自己具备开锁权限,如拥有正确的密码、指纹或者IC卡等。

3. 如果需要,确认电子锁附近有足够的光线,以便于操作时能够清晰地看到电子锁的按键或者显示屏。

二、开启电子锁根据具体型号的电子锁可能存在差异,下面是一般的电子锁开启操作流程:1. 首先,将手持设备(如智能手机或IC卡)靠近电子锁的感应区,或者将手指放在电子锁的指纹识别区域上。

2. 若是使用智能手机进行开锁操作,打开相应的开锁应用程序,并选择“开锁”选项。

3. 若是使用IC卡进行开锁操作,直接将IC卡靠近电子锁的感应区,等待电子锁读取IC卡信息。

4. 若是使用指纹进行开锁操作,轻轻按压电子锁的指纹识别区域,等待电子锁读取指纹信息。

5. 等待片刻后,电子锁会对手持设备或者IC卡、指纹等信息进行验证。

6. 验证通过后,电子锁会发出开锁信号,并将锁舌(或电子锁具)释放,门可以顺利打开。

7. 若是使用电子锁具(如电子密码锁),在验证通过后,需要输入正确的密码,然后操作开锁按钮。

三、操作注意事项使用电子锁开启时,需要注意以下几点:1. 保持设备或IC卡、指纹等的干净和干燥,以确保电子锁能够正常读取信息。

2. 在操作电子锁时,应注意保证周围的安全,防止他人窥视密码、指纹等信息,并确保电子锁周围没有其他人员。

3. 若是使用智能手机进行开锁操作,应注意手机电量,以免电量耗尽导致无法开锁。

4. 若是忘记了密码、丢失了IC卡等情况,应及时联系相关管理人员或服务商进行处理。

结语:电子锁的开启操作流程相对简单,只需准备好相关设备或IC卡、指纹等信息,按照正确的操作步骤进行操作即可。

单片机程序设计—电子密码锁

目录目录 (1)中文摘要 (2)第一章概述 (5)第二章系统总体方案设计 (6)第三章硬件电路设计 (10)3.1键盘电路设计 (10)3.2 LED显示电路 (12)3.3 开锁警电路 (15)第四章软件设计 (17)4.1 软件设计思路 (17)4.2各子程序设计 (17)第五章系统调试 (22)第六章心得体会 (23)第七章参考文献 (24)附录 (25)源程序清单 (25)中文摘要摘要:在日常生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。

若使用传统的机械式钥匙开锁,人们常需携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣,随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。

为满足人们对锁得使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。

密码锁具有安全性高、成本低、功耗低、易操作等优点。

在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐替代传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。

随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的只能密码锁,它除了具有电子密码锁的功能外,还引进了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。

随着人们对安全的重视和科技的发展,许多电子智能锁(指纹识别、IC卡辨认)已在国内外相继面世。

但是,这些产品的特点是针对特定的指纹和有效卡,只能适用于保密要求的箱、柜、门等。

而且指纹识别器若在公共场所使用存在容易机械损坏,IC卡还存在容易丢失、损坏等特点。

加上其成本较高,一定程度上限制了这类产品的普及和推广。

鉴于目前的技术水平与市场的接收程度,电子密码锁是这类电子防盗产品的主流。

基于以上思路,本次设计使用ATMEL公司的AT89C51实现—基于单片机的电子密码锁的设计,其主要具有如下功能:密码通过键盘输入,若密码正确,则将锁打开。

单片机电子密码锁LCD1602显示

单片机电子密码锁其电路图连接如下:本人已经用硬件实验,程序可用。

正确~~本程序特点:装载后读者可以自改密码,然后需要再次载入程序时:可以把主程序aa=Sendstring(0xa0,1,table2,6);这一句去掉。

然后程序的电子锁密码就是你个人设置的密码。

程序代码为:#include<reg51.h>#include<string.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define LCDIO P2#define delay4us() _nop_();_nop_();_nop_();_nop_();uchar buffer[6]={0};sbit sda=P3^7;sbit scl=P3^6;sbit beep=P3^5;bit flag=0,aa; //用户蹲渊义定时溢出标志位uchar DSY_BUFFER[16]=" ";uchar DSY_BUFFER1[16]=" ";uchar Userpassword[6]={0};sbit rs=P0^4;sbit rd=P0^3;sbit lcden=P0^2;sbit led=P3^0;uchar code table2[]="";uchar code table[]="Your Password...";void delayms(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delay() //短延时,两个机器周期,做总线的延时用{;;}void write_com(uchar com){rs=0;rd=0;lcden=0;P2=com;delayms(3);lcden=1;delayms(3);lcden=0;}void write_date(uchar date){rs=1;rd=0;lcden=0;P2=date;delayms(3);lcden=1;delayms(3);lcden=0;}void Display_String(uchar *p,uchar com){ uchar i;write_com(com);for(i=0;i<16;i++){write_date(p[i]);}}void init_lcd(){lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);Display_String(table,0x80);Display_String("Lock OK! ",0xc0); }void start(){sda=1;scl=1;delay4us();sda=0;delay4us();scl=0;}void stop(){sda=0;scl=1;delay4us();sda=1;delay4us();scl=0;}void init() //初始化{sda=1;delay();scl=1;delay();}void ack(){sda=0;scl=1;scl=0;sda=1;}void noack(){sda=1;scl=1;delay4us();scl=0;sda=0;}uchar recbyte(){uchar i,rd;rd=0x00;sda=1;for(i=0;i<8;i++){scl=1;rd<<=1;rd|=sda;delay4us();scl=0;delay4us();}scl=0;delay4us();return rd;}uchar sendbyte(uchar wd) {uchar i;bit ack0;for(i=0;i<8;i++){sda=(bit)(wd&0x80);_nop_();_nop_();scl=1;delay4us();scl=0;wd<<=1;}sda=1;scl=1;delay4us();ack0=!sda;scl=0;delay4us();return ack0;}uchar Recstring(uchar slave,uchar subaddr,uchar *buffer,uchar n) {uchar i;start();if(!sendbyte(slave)) return 0;if(!sendbyte(subaddr)) return 0;start();if(!sendbyte(slave+1)) return 0;for(i=0;i<n-1;i++){buffer[i]=recbyte();ack();}buffer[n-1]=recbyte();noack();stop();return 1;}uchar Sendstring(uchar slave,uchar subaddr,uchar *buffer,uchar n) {uchar i;start();if(!sendbyte(slave)) return 0;if(!sendbyte(subaddr)) return 0;for(i=0;i<n;i++){if(!sendbyte(buffer[i])) return 0;}stop();return 1;}void clear_password( ){ uchar i;for(i=0;i<6;i++){Userpassword[i]=' ';}for(i=0;i<16;i++){DSY_BUFFER[i]=' ';}}uchar Keys_Scan(){uchar temp,keynum;P1=0x0F;delayms(5);temp=P1^0x0F;switch(temp){case 1:keynum=0;break;case 2:keynum=1;break;case 4:keynum=2;break;case 8:keynum=3;break;break;}P1=0xF0;delayms(5);temp=P1>>4^0x0F;switch(temp){case 1:keynum+=0;break;case 2:keynum+=4;break;case 4:keynum+=8;break;case 8:keynum+=12;break;break;}delayms(600);return keynum;}void main(){ uchar temp,i=0,j=0,k=0,n;uchar IS_valid_user;beep=1;init();init_lcd();delayms(5);aa=Sendstring(0xa0,1,table2,6);delayms(5);aa=Recstring(0xa0,1,buffer,6);delayms(10);P1=0x0f;while(1){if(P1!=0x0f){temp=Keys_Scan();switch(temp){case 0: case 1: case 2: case 3: case 4:case 5: case 6: case 7: case 8: case 9:if (i<=5) //密码限制在6位以内{Userpassword[i]=temp;DSY_BUFFER[i]='*';Display_String(DSY_BUFFER,0xc0);i++;}break;case 10: //按A键开锁for(k=0;k<6;k++){if(buffer[k]==(Userpassword[k]+48))flag=1;elseflag=0;}if (flag==1){ flag=0;i=0;led=0; //点亮LEDclear_password();Display_String("OPEN OK! ",0xc0);IS_valid_user = 1;j=0;}else{j++;led=1; //关闭LEDclear_password();Display_String("ERROR!Have try ",0xc0);write_com(0xcf);write_date(0x30+j);IS_valid_user=0;}i=0;break;case 11: //按B键上锁led=1;clear_password();Display_String(table,0x80);Display_String("Lock OK! ",0xc0);i=0;IS_valid_user=0;break;case 12: //按C键设置新密码//如果是合法用户则提示输入新密码if ( !IS_valid_user){i=0;Display_String("No rights ! ",0xc0); delayms(1000);Display_String("Your Password...",0x80); Display_String("Lock OK! ",0xc0); }else{i=0;Display_String("New Password: ",0x80);Display_String(" ",0xc0);}break;case 13: //按D键保存新密码if ( !IS_valid_user){ i=0;Display_String("No rights ! ",0xc0);delayms(1000);Display_String("Your Password...",0x80);Display_String("Lock OK! ",0xc0);}else{i = 0;init();delayms(5);for(k=0;k<6;k++){Userpassword[k]=Userpassword[k]+48;}aa=Sendstring(0xa0,1,Userpassword,6);delayms(5);aa=Recstring(0xa0,1,buffer,6);delayms(5);clear_password();Display_String(table,0x00);Display_String("Password Saved! ",0xc0);delayms(1000);Display_String("Do lock agian ? ",0xc0);}break;case 14: //按E键消除所有输入i=0;clear_password();Display_String(" ",0xc0);break;case 15: //清除一位if(i!=0)i--;for(n=0;n<i;n++){DSY_BUFFER1[n]='*';}Display_String(DSY_BUFFER1,0xc0);}P1=0x0f;}if(j==3){ Display_String("THIEFTHIEF",0xc0);j=0;beep=0;}} }。

矩阵式键盘实现的电子密码锁C程序

void delay20ms(void)
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
}
/**************************************************************
函数功能:开锁延时子程序
break;
}
}
/**************************************************************
函数功能:延时输出音频
**************************************************************/
void delay(void)
{
while(P16==0)
;
keyval=3; //可判断是S3键被按下
}
if(P17==0) //如果检测到接P1.7引脚的列线为低电平“0”
{
while(P17==0)
;
keyval=4; //可判断是S4键被按下
}
P1=0xfd; //第二行置为低电平“0”(P1.1输出低电平“0”)
if(P14==0) //如果检测到接P1.4引脚的列线为低电平“0”
{
unsigned char D[ ]={5,8,4,5,1,2,11}; //设定密码
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TMOD=0x01; //使用定时器T0的模式1
TH0=(65536-500)/256; //定时器T0的高8位赋初值

电子密码锁AT24C02C驱动程序

void start()// 开始位{SDA = 1; //SDA初始化为高电平“1”SCL = 1; //开始数据传送时,要求SCL为高电平“1”_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SDA = 0; //SDA的下降沿被认为是开始信号_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)}/***************************************************函数功能:结束数据传送***************************************************/void stop()// 停止位{SDA = 0; //SDA初始化为低电平“0”_nSCL = 1; //结束数据传送时,要求SCL为高电平“1”_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SDA = 1; //SDA的上升沿被认为是结束信号_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SDA=0;SCL=0;}/***************************************************函数功能:从A T24Cxx读取数据出口参数:x***************************************************/unsigned char ReadData()// 从A T24Cxx移入数据到MCU{unsigned char i;unsigned char x; //储存从A T24Cxx中读出的数据for(i = 0; i < 8; i++){SCL = 1; //SCL置为高电平x<<=1; //将x中的各二进位向左移一位x|=(unsigned char)SDA; //将SDA上的数据通过按位“或“运算存入x中SCL = 0; //在SCL的下降沿读出数据}return(x); //将读取的数据返回}/***************************************************函数功能:向A T24Cxx的当前地址写入数据入口参数:y (储存待写入的数据)***************************************************///在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0bit WriteCurrent(unsigned char y){unsigned char i;bit ack_bit; //储存应答位for(i = 0; i < 8; i++) // 循环移入8个位{SDA = (bit)(y&0x80); //通过按位“与”运算将最高位数据送到S//因为传送时高位在前,低位在后_nop_(); //等待一个机器周期SCL = 1; //在SCL的上升沿将数据写入A T24Cxx_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SCL = 0; //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲y <<= 1; //将y中的各二进位向左移一位}SDA = 1; // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,//以让SDA线转由接收设备(A T24Cxx)控制_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SCL = 1; //根据上述规定,SCL应为高电平_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期ack_bit = SDA; //接受设备(A T24Cxx)向SDA送低电平,表示已经接收到一个字节//若送高电平,表示没有接收到,传送异常SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)return ack_bit; // 返回A T24Cxx应答位}/***************************************************函数功能:向A T24Cxx中的指定地址写入数据入口参数:add (储存指定的地址);dat(储存待写入的数据)***************************************************/void WriteSet(unsigned char add, unsigned char dat)// 在指定地址addr处写入数据WriteCurrent{start(); //开始数据传递WriteCurrent(OP_WRITE); //选择要操作的A T24Cxx芯片,并告知要对其写入数据WriteCurrent(add); //写入指定地址WriteCurrent(dat); //向当前地址(上面指定的地址)写入数据stop(); //停止数据传递delay(4); //1个字节的写入周期为1ms, 最好延时1ms以上}/***************************************************函数功能:从A T24Cxx中的当前地址读取数据出口参数:x (储存读出的数据)***************************************************/unsigned char ReadCurrent(){unsigned char x;start(); //开始数据传递WriteCurrent(OP_READ); //选择要操作的A T24Cxx芯片,并告知要读其数据x=ReadData(); //将读取的数据存入xstop(); //停止数据传递return x; //返回读取的数据}/***************************************************函数功能:从A T24Cxx中的指定地址读取数据入口参数:set_addr出口参数:x***************************************************/unsigned char ReadSet(unsigned char set_addr)// 在指定地址读取{start(); //开始数据传递WriteCurrent(OP_WRITE); //选择要操作的A T24Cxx芯片,并告知要对其写入数据WriteCurrent(set_addr); //写入指定地址return(ReadCurrent()); //从指定地址读出数据并返回}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

定义状态灯L1 BIT P1.0L2 BIT P1.1L3 BIT P1.2 ;p1.3串口坏L4 BIT P1.4L5 BIT P1.5l6 BIT P1.6Buzzer BIT P1.7;蜂鸣器状态位定义20H~30HLOG_IN BIT 20H;进入系统MODI_Password BIT 21H;修改密码MODI1 BIT 23H;修改密码第二次输入MODI2 BIT 24HMODI_Success BIT 25H;密码修改成功Correct_Password BIT 26H;功能键,0进入系统,1修改密码密码缓存区PW1 EQU 30H;1~6位密码PW2 EQU 31HPW3 EQU 32HPW4 EQU 33HPW5 EQU 34HPW6 EQU 35HLED数码管显示缓存区SHOW1EQU36HSHOW2EQU37HSHOW3EQU38HSHOW4EQU39HSHOW5EQU3AHSHOW6EQU3BH键盘输入密码暂时缓存区PW_TEMP1 EQU 3DHPW_TEMP2 EQU 3EHPW_TEMP3 EQU 3FHPW_TEMP4 EQU 40HPW_TEMP5 EQU 41HPW_TEMP6 EQU 42H修改密码时,原密码暂时缓存区MODI_PW1 EQU 43HMODI_PW2 EQU 44HMODI_PW3 EQU 45HMODI_PW4 EQU 46HMODI_PW5 EQU 47HMODI_PW6 EQU 48H计数Password_NUM EQU 3CH ;输入密码的位数主程序ORG 0000HAJMP MAINORG 000BHAJMP TIMERORG 0013HAJMP INT1PORG 0030HMAIN MOV SP,#60H;开中断SETB EX1SETB L1SETB L2SETB L3SETB L4SETB L5SETB L6;初始化清零CLR LOG_INCLR MODI_PasswordCLR MODI1CLR MODI2CLR MODI_SuccessCLR Correct_Password;初始化密码112211MOV PW1,#01HMOV PW2,#01HMOV PW3,#02HMOV PW4,#02HMOV PW5,#01HMOV PW6,#01H;初始化显示CHOOSEMOV SHOW1,#0EHMOV SHOW2,#05HMOV SHOW3,#00HMOV SHOW4,#00HMOV SHOW5,#12HMOV SHOW6,#0CH;计数初始化MOV Password_NUM,#00H;初始化8279LCALL INIT_8279SJMP $8279键盘INIT_8279MOV DPTR,#5FFFHMOV A,#0DCHMOVX @DPTR,AJUMP1 MOVX A,@DPTRJB ACC.7,JUMP1MOV A,#00HMOVX @DPTR,AMOV A,#34HMOVX @DPTR,ACLR IT1NOPSETB EANOPLCALL DSYRET外部中断1INT1P PUSH ACCPUSH DPHPUSH DPLMOV A,#40HMOV DPTR,#5FFFHMOVX @DPTR,AMOV DPTR,#5EFFHMOVX A,@DPTR显示缓存MOV 3BH,3AHMOV 3AH,39HMOV 39H,38HMOV 38H,37HMOV 37H,36HMOV 36H,A键盘输入密码缓存;检查当前选择的功能输入原密码进入系统CLR CMOV C,LOG_IN;进入系统状态为1,选择功能A,输入密码进入系统JNC JUMP3;不是功能A,跳转,是功能A顺序执行,对密码缓存改变指示灯110001,1:亮,0不亮CLR L1CLR L2SETB L3SETB L4SETB L5CLR L6保存键盘输入的密码MOV PW_TEMP1,PW_TEMP2MOV PW_TEMP2,PW_TEMP3MOV PW_TEMP3,PW_TEMP4MOV PW_TEMP4,PW_TEMP5MOV PW_TEMP5,PW_TEMP6MOV PW_TEMP6,AAJMP JUMP4;跳过功能B修改密码的操作,a.验证原密码,b.输入要修改的新密码,c.验证要修改的新密码JUMP3CLR CMOV C,MODI_Password;修改密码状态为1,选择修改密码,输入原密码即可修改密码JNC JUMP12;不是功能A,不是修改密码验证原密码改变指示灯110100,1:亮,0不亮CLR L1CLR L2SETB L3CLR L4SETB L5SETB L6保存键盘输入的密码MOV PW_TEMP1,PW_TEMP2MOV PW_TEMP2,PW_TEMP3MOV PW_TEMP3,PW_TEMP4MOV PW_TEMP4,PW_TEMP5MOV PW_TEMP5,PW_TEMP6MOV PW_TEMP6,AAJMP JUMP4;跳过修改密码时的原密码验证缓存JUMP12CLR C;输入要修改的新密码状态为1,选择输入修改密码MOV C,MODI1JNC JUMP13改变指示灯110001,1:亮,0不亮CLR L1SETB L2SETB L3SETB L4CLR L5SETB L6保存键盘输入的密码MOV PW_TEMP1,PW_TEMP2MOV PW_TEMP2,PW_TEMP3MOV PW_TEMP3,PW_TEMP4MOV PW_TEMP4,PW_TEMP5MOV PW_TEMP5,PW_TEMP6MOV PW_TEMP6,AAJMP JUMP4;跳过修改密码时的原密码验证缓存JUMP13CLR CMOV C,MODI2JNC JUMP4改变指示灯110101,1:亮,0不亮CLR L1CLR L2SETB L3CLR L4SETB L5CLR L6保存键盘输入的密码MOV PW_TEMP1,PW_TEMP2MOV PW_TEMP2,PW_TEMP3MOV PW_TEMP3,PW_TEMP4MOV PW_TEMP4,PW_TEMP5MOV PW_TEMP5,PW_TEMP6MOV PW_TEMP6,AAJMP JUMP4;跳过修改密码时的原密码验证缓存JUMP4LCALL Key_Check密码检验,检查密码是否为0~9NOPLCALL DSY设置定时器MOV R5,#60MOV TMOD,#01HMOV TH0,#3CHMOV TL0,#0B0HSETB ET0SETB TR0POP DPLPOP DPHPOP ACCRETI时延1sDELAY1s MOV R3,#0FHDL13MOV R4,#0FAHDL12MOV R5,#0F6H;DL11DJNZ R5,DL11;时延246usDJNZ R4,DL12;(246+4)250=62500usDJNZ R3,DL13;6250016=1sRET时延3sDELAY3s MOV R3,#2FHDL33MOV R4,#0FAHDL32MOV R5,#0F6H;DL31DJNZ R5,DL31;时延246usDJNZ R4,DL32;(246+4)250=62500usDJNZ R3,DL33;6250016=1sRETLED数码管显示程序DSY MOV R2,#06HMOV A,#92HMOV DPTR,#5FFFHMOVX @DPTR,AMOV R0,#36HTY11 MOV A,@R0MOV DPTR,#TABLMOVC A,@A+DPTRMOV DPTR,#5EFFHMOVX @DPTR,AINC R0DJNZ R2,TY11RET密码检验0~9Key_Check;检查当前选择的功能CLR CMOV C,LOG_IN;进入系统状态为1,选择功能A,输入密码进入系统JNC FBNOPFUNC_A功能A,进入系统;计数,密码输入位数MOV A,Password_NUMINC AMOV Password_NUM,ANOPCJNE A,#06H,JUMP5CLR LOG_INLCALL Password_VerityCLR CMOV C,Correct_PasswordJC CorrectAJMP JUMP16Correct改变指示灯110010,1:亮,0不亮CLR L1CLR L2SETB L3SETB L4CLR L5SETB L6LED数码管显示MOV SHOW1,#0EHMOV SHOW2,#05HMOV SHOW3,#00HMOV SHOW4,#00HMOV SHOW5,#12HMOV SHOW6,#0CHLCALL DSY状态位清零CLR LOG_INCLR MODI_PasswordCLR MODI1CLR MODI2CLR MODI_SuccessCLR Correct_PasswordAJMP JUMP7JUMP16LCALL Long_Buzzer改变指示灯110110,1:亮,0不亮CLR L1CLR L2CLR L3SETB L4CLR L5SETB L6LED显示ERR002MOV SHOW1,#02HMOV SHOW2,#00HMOV SHOW3,#00HMOV SHOW4,#0AHMOV SHOW5,#0AHMOV SHOW6,#0EHLCALL DSYJUMP5 AJMP JUMP7FB CLR CMOV C,MODI_Password;修改密码状态为1,选择功能B,输入密码修改密码JNC FUNC_MODI1NOPFUNC_B功能B,修改密码MOV A,Password_NUMINC AMOV Password_NUM,ANOPCJNE A,#06H,JUMP6LCALL Password_VerityCLR CMOV C,Correct_PasswordJNC again1LCALL Short_Buzzer改变指示灯110110,1:亮,0不亮CLR L1CLR L2SETB L3CLR L4CLR L5SETB L6CLR MODI_PasswordSETB MODI1;密码正确,进行第一次输入修改密码JUMP6AJMP JUMP7again1密码错误重新输入密码MOV Password_NUM,#00HSETB MODI_Password改变指示灯110110,1:亮,0不亮CLR L1CLR L2CLR L3SETB L4SETB L5CLR L6LED显示ERR002MOV SHOW1,#02HMOV SHOW2,#00HMOV SHOW3,#00HMOV SHOW4,#0AHMOV SHOW5,#0AHMOV SHOW6,#0EHLCALL DSYAJMP JUMP7FUNC_MODI1CLR CMOV C,MODI1;第一次输入修改密码状态,选择功能B2,第二次输入修改密码JNC FUNC_MODI2NOP第一次输入新密码LCALL ModifyAJMP JUMP7FUNC_MODI2CLR CMOV C,MODI2;第一次输入修改密码状态,选择功能B2,第二次输入修改密码JNC NEXT_ANOP第二次输入新密码LCALL Modi_VerityAJMP JUMP7功能选择NEXT_A CJNE A,#0AH,NEXT_BSETB LOG_IN;选择进入系统AJMP JUMP7NEXT_B CJNE A,#0BH,NEXT_CSETB MODI_Password;选择修改密码AJMP JUMP7NEXT_C CJNE A,#0CH,NEXT_DAJMP RESET未定义的功能,选择会出现警告NEXT_D CJNE A,#0DH,NEXT_EAJMP WARN1NEXT_E CJNE A,#0EH,NEXT_FAJMP WARN1NEXT_F CJNE A,#0FH,WARN1AJMP WARN1RESET 复位,密码初始化呢,状态位初始化,显示初始化;初始化清零CLR LOG_INCLR MODI_PasswordCLR MODI1CLR MODI2CLR MODI_SuccessCLR Correct_Password;初始化密码112211MOV PW1,#01HMOV PW2,#01HMOV PW3,#02HMOV PW4,#02HMOV PW5,#01HMOV PW6,#01H;初始化显示CHOOSEMOV SHOW1,#0EHMOV SHOW2,#05HMOV SHOW3,#00HMOV SHOW4,#00HMOV SHOW5,#12HMOV SHOW6,#0CH;计数初始化MOV Password_NUM,#00HAJMP JUMP7WARN1数码管显示ERR001MOV SHOW1,#01HMOV SHOW2,#00HMOV SHOW3,#00HMOV SHOW4,#0AHMOV SHOW5,#0AHMOV SHOW6,#0EHLCALL DSY蜂鸣器响,重新选择功能LCALL Long_BuzzerMOV SHOW1,#0EHMOV SHOW2,#05HMOV SHOW3,#00HMOV SHOW4,#00HMOV SHOW5,#12HMOV SHOW6,#0CH状态位清零CLR LOG_INCLR MODI_PasswordCLR MODI1CLR MODI2CLR MODI_SuccessCLR Correct_PasswordJUMP7RET密码校验,与原密码是否一样Password_Verity计数清零MOV Password_NUM,#00H密码校验CLR CMOV A,PW_TEMP1SUBB A,PW1JNZ JUMP8CLR CMOV A,PW_TEMP2SUBB A,PW2JNZ JUMP8CLR CMOV A,PW_TEMP3SUBB A,PW3JNZ JUMP8CLR CSUBB A,PW4JNZ JUMP8CLR CMOV A,PW_TEMP5SUBB A,PW5JNZ JUMP8CLR CMOV A,PW_TEMP6SUBB A,PW6JNZ JUMP8SETB Correct_Password;密码全对JUMP8RETModify保存修改的密码MOV A,Password_NUMINC AMOV Password_NUM,ANOPCJNE A,#06H,JUMP9完成6位密码输入改变指示灯101010,1:亮,0不亮CLR L1SETB L2CLR L3SETB L4CLR L5SETB L6CLR MODI1;第一次修改密码输入完成SETB MODI2;第二次输入修改密码MOV Password_NUM,#00H暂时保存原密码,修改密码出现错误,为系统回复原密码MOV MODI_PW1,PW1MOV MODI_PW2,PW2MOV MODI_PW3,PW3MOV MODI_PW4,PW4MOV MODI_PW5,PW5MOV MODI_PW6,PW6为新密码送入密码缓存区MOV PW1,PW_TEMP1MOV PW2,PW_TEMP2MOV PW4,PW_TEMP4MOV PW5,PW_TEMP5MOV PW6,PW_TEMP6JUMP9RETModi_VerityMOV A,Password_NUMINC AMOV Password_NUM,ANOPCJNE A,#06H,JUMP14校验两次输入的新密码是否一样CLR Correct_PasswordLCALL Password_VerityAJMP JUMP15JUMP14 AJMP JUMP11;结束子程序JUMP15CLR CMOV C,Correct_PasswordJNC JUMP10修改密码正确,初始化状态位CLR LOG_INCLR MODI_PasswordCLR MODI1CLR MODI2CLR Correct_PasswordSETB MODI_Success;修改密码成功状态位改变指示灯111111,1:亮,0不亮CLR L1CLR L2CLR L3CLR L4CLR L5CLR L6LED显示MOV SHOW1,#06HMOV SHOW2,#06HMOV SHOW3,#06HMOV SHOW4,#06HMOV SHOW5,#06HMOV SHOW6,#06HLCALL DSYAJMP JUMP11JUMP10出现错误,标志位清零CLR LOG_INCLR MODI_PasswordCLR MODI1CLR MODI2CLR MODI_SuccessCLR Correct_Password改变指示灯110110,1:亮,0不亮CLR L1CLR L2CLR L3SETB L4CLR L5CLR L6提示ERR003MOV SHOW1,#03HMOV SHOW2,#00HMOV SHOW3,#00HMOV SHOW4,#0AHMOV SHOW5,#0AHMOV SHOW6,#0EH密码修改出现错误,复原原密码MOV PW1,MODI_PW1MOV PW2,MODI_PW2MOV PW3,MODI_PW3MOV PW4,MODI_PW4MOV PW5,MODI_PW5MOV PW6,MODI_PW6LCALL DSYJUMP11RET鸣笛Long_BuzzerMOV R3,#1FHBL13MOV R4,#0FAHCLR BuzzerBL12MOV R5,#0F6H;BL11DJNZ R5,BL11;时延246usDJNZ R4,BL12;(246+4)250=62500usSETB BuzzerDJNZ R3,BL13;6250016=1sRETRETShort_BuzzerMOV R3,#0FHBS13MOV R4,#0FAHCLR BuzzerBS12MOV R5,#0F6H;BS11DJNZ R5,BS11;时延246usDJNZ R4,BS12;(246+4)250=62500usSETB BuzzerDJNZ R3,BS13;6250016=1sRETRET定时器终端程序TIMER MOV TH0,#3CHMOV TL0,#0B0HDJNZ R5,LOOP3S内没有按按键LCALL Short_Buzzer;初始化清零CLR LOG_INCLR MODI_PasswordCLR MODI1CLR MODI2CLR MODI_SuccessCLR Correct_Password;初始化显示CHOOSEMOV SHOW1,#0EHMOV SHOW2,#05HMOV SHOW3,#00HMOV SHOW4,#00HMOV SHOW5,#12HMOV SHOW6,#0CH;计数初始化MOV Password_NUM,#00HLOOP RETITABLE表TABL DB 0C0H,0F9H,0A4H,0B0H,99HDB 92H,82H,0F8H,80H,90H,88HDB 83H,0C6H,0A1H,86H,8EH,8CHDB 0C1H,89H,0C7H,0BFH,91HDB 00H,0FFHEND。

相关文档
最新文档