/***********************多人识别修改,可以验证密码正确**********************************************
----------------1.开发环境:Keil v4 ----------------
----------------2.使用单片机型号:STC89C52RC ----------------
----------------3.单片机使用晶振:11.0592M ----------------
----------------4.功能:实现密码解锁,和存储记录----------------
----------------5.名称:智能保险柜qqqqqqqqqqqqqqqqqq ----------------
************************************参考程序加油***********************************/
#include <reg52.h>
#include <intrins.h>
#include <main.h>
#include <chuankou.h>
#include <delay.h>
#include <eeprom.h>
#define uchar unsigned char
#define uint unsigned int
bit I2C_WriteData(uchar ADDR,uchar DAT);
uchar I2C_ReadData(uchar ADDR);
void main()
{
uchar xdata i,old[25],b[9],k[7],r1,r2,r3,r4,m1=1,m2=1,m3=1,m4=1,m5=1,m6=1;
init();
for(s8=1;s8<25;s8++)
{
c[s]=I2C_ReadData(s+26); //从s+26地址中读取的k的值分别存入c[s]中 ,从C1开始,四个一组(4位数)。
}
while(1)
{
I2C_WriteData(1,0x30);delay(5);
I2C_WriteData(2,0x30);delay(5); //24c02的第1到24地址单元作为密码存储区
I2C_WriteData(3,0x30);delay(5); //必须放到while函数里
I2C_WriteData(4,0x31);delay(5); //一定要加延时,否则会接受不到
I2C_WriteData(5,0x30);delay(5);
I2C_WriteData(6,0x30);delay(5); //24c02的第1到24地址单元作为密码存储区
I2C_WriteData(7,0x30);delay(5); //必须放到while函数里
I2C_WriteData(8,0x32);delay(5); //一定要加延时,否则会接受不到
I2C_WriteData(9,0x30);delay(5);
I2C_WriteData(10,0x30);delay(5); //24c02的第1到24地址单元作为密码存储区
I2C_WriteData(11,0x30);delay(5); //必须放到while函数里
I2C_WriteData(12,0x33);delay(5); //一定要加延时,否则会接受不到
I2C_WriteData(13,0x30);delay(5);
I2C_WriteData(14,0x30);delay(5); //24c02的第1到24地址单元作为密码存储区
I2C_WriteData(15,0x30);delay(5); //必须放到while函数里
I2C_WriteData(16,0x34);delay(5); //一定要加延时,否则会接受不到
I2C_WriteData(17,0x30);delay(5);
I2C_WriteData(18,0x30);delay(5); //24c02的第1到24地址单元作为密码存储区
I2C_WriteData(19,0x30);delay(5); //必须放到while函数里
I2C_WriteData(20,0x35);delay(5); //一定要加延时,否则会接受不到
I2C_WriteData(21,0x30);delay(5);
I2C_WriteData(22,0x30);delay(5); //24c02的第1到24地址单元作为密码存储区
I2C_WriteData(23,0x30);delay(5); //必须放到while函数里
I2C_WriteData(24,0x36);delay(5); //一定要加延时,否则会接受不到
for(s7=1;s7<7;s7++)
{
k[s7]=I2C_ReadData(s7+34); //读取储存在35,36中的k1,k2
}
if(tr2==1) //如果TR2==1则初始化
{
tr2=0;
I2C_WriteData(35,0x00);delay(5); //必须放到while函数里 将k1,k2清零 ,初始化
I2C_WriteData(36,0x00);delay(5); //必须放到while函数里
I2C_WriteData(37,0x00);delay(5); //必须放到while函数里 将k1,k2清零 ,初始化
I2C_WriteData(38,0x00);delay(5); //必须放到while函数里
I2C_WriteData(39,0x00);delay(5); //必须放到while函数里 将k1,k2清零 ,初始化
I2C_WriteData(40,0x00);delay(5); //必须放到while函数里
I2C_WriteData(41,0x00);delay(5); //必须放到while函数里 将k1,k2清零 ,初始化
}
if(tr0_ok==1) //必须把验正密码也包括进去,否则会容易因为进入密码验证过多而出错
{
tr0_ok=0;
ES=0;
for(i=1;i<25;i++)
{
old[i]=I2C_ReadData(i); //将从地址1开始读取的数依次存入old
delay(5);
}
ES=1;
if(a[1]==old[1]&&a[2]==old[2]&&a[3]==old[3]&&a[4]==old[4]) //第一组密码验证
{
ES=0;
for(i=0;i<9;i++)
{
SBUF = num10[i];
delay(5);
while(!TI);
TI = 0;
}
ES=1;
k[1]++;
}
if(a[1]==old[5]&&a[2]==old[6]&&a[3]==old[7]&&a[4]==old[8]) //第二组密码验证
{
for(i=0;i<9;i++) //发送数据1给文本t0
{
ES=0;
SBUF = num10[i];
delay(5);
while(!TI);
TI = 0;
}
ES=1;
k[2]++;
}
if(a[1]==old[9]&&a[2]==old[10]&&a[3]==old[11]&&a[4]==old[12]) //第三组密码验证
{
for(i=0;i<9;i++) //发送数据1给文本t0
{
SBUF = num10[i];
delay(5);
while(!TI);
TI = 0;
}
k[3]++;
}
if(a[1]==old[13]&&a[2]==old[14]&&a[3]==old[15]&&a[4]==old[16]) //第四组密码验证
{
for(i=0;i<9;i++) //发送数据1给文本t0
{
SBUF = num10[i];
delay(5);
while(!TI);
TI = 0;
}
k[4]++;
}
if(a[1]==old[17]&&a[2]==old[18]&&a[3]==old[19]&&a[4]==old[20]) //第五组密码验证
{
for(i=0;i<9;i++) //发送数据1给文本t0
{
SBUF = num10[i];
delay(5);
while(!TI);
TI = 0;
};
k[5]++;
}
if(a[1]==old[21]&&a[2]==old[22]&&a[3]==old[23]&&a[4]==old[24]) //第六组密码验证
{
for(i=0;i<9;i++) //发送数据1给文本t0
{
SBUF = num10[i];
delay(5);
while(!TI);
TI = 0;
}
k[5]++;
}
else
{
P1=0xfd;
}
/*=====================拆分k并转换成16进制======================================*/
for(s2=1;s2<21;s2=s2+4) //万位 4个一组
{
b[s2]=k[m1]/1000%10+48;
m1++; //每进一次k+1
}
for(s3=2;s3<22;s3=s3+4) //千位 4个一组
{
b[s3]=k[1]/100%10+48;
m2++;
}
for(s4=3;s4<23;s4=s4+4) //十位 4个一组
{
b[s4]=k[1]/10%10+48;
m3++;
}
for(s5=4;s5<24;s5=s5+4) //个位 4个一组
{
b[s5]=k[1]%10+48;
m4++;
}
/*========================将b写入从27开始到34的地址中============================================*/
for(s1=1;s1<25;s1++)
{ //必须放到while函数里
I2C_WriteData(s1+26,b[s1]);delay(5);//一定要加延时,否则会接受不到 //将k的值分别存入c[s]中 ,从C1开始,四个一组(4位数)。
} //将k的值分别存入b[s]中 ,从C1开始,四个一组(4位数)。
/*==========================将k的值存放到地址从35,36开始第一个人为k1========================================*/
// for(s6=1;s6<7;s6++)
// {
// I2C_WriteData(s6+34,k[s6]);delay(5); //必须放到while函数里
// }
}
/*=======================================================================
从s+26中读取的k的值分别存入c[s]中,
从C1开始,四个一组(4位数),将万位,千万,百位十位分别赋值给c1,c2,c3,c4
。======================================================================*/
for(s=1;s<25;s++)
{
c[s]=I2C_ReadData(s+26); //从s+26中读取的k的值分别存入c[s]中 ,从C1开始,四个一组(4位数),将万位,千万,百位十位分别赋值给c1,c2,c3,c4。
}
fasong(); //发送函数,发送16进制
}
}
#include <reg52.h>
#include <chuankou.h>
#include <delay.h>
#include <eeprom.h>
#define uchar unsigned char
#define uint unsigned int
bit tr0_ok;
uchar tr0,n,a[5],EEPROM_DATA,z,i,tr1,c[8],d[5],z1,tr2,s,s1,s2,s3,s4,s5,s6,s7,s8;
uchar I2C_ReadData(uchar ADDR);
uchar xdata num11[]={0x74,0x30,0x2e,0x74,0x78,0x74}; //t0.txt //=
uchar xdata num13[]={0x74,0x31,0x2e,0x74,0x78,0x74}; //t1.txt //=
uchar xdata num14[]={0x74,0x32,0x2e,0x74,0x78,0x74}; //t2.txt //=
uchar xdata num15[]={0x74,0x33,0x2e,0x74,0x78,0x74}; //t3.txt //=
uchar data num16[]={0x74,0x34,0x2e,0x74,0x78,0x74}; //t4.txt //=
uchar data num17[]={0x74,0x35,0x2e,0x74,0x78,0x74}; //t5.txt //=
uchar data num1[]={0x2b,0x22,0x31,0x22}; // +"1"
uchar data num2[]={0x2b,0x22,0x32,0x22}; // +"2"
uchar data num3[]={0x2b,0x22,0x33,0x22}; // +"3"
uchar data num4[]={0x2b,0x22,0x34,0x22}; // +"4"
uchar data num5[]={0x2b,0x22,0x35,0x22}; // +"5"
uchar data num6[]={0x2b,0x22,0x36,0x22}; // +"6"
uchar data num7[]={0x2b,0x22,0x37,0x22}; // +"7"
uchar data num8[]={0x2b,0x22,0x38,0x22}; // +"8"
uchar data num9[]={0x2b,0x22,0x39,0x22}; // +"9"
uchar data num0[]={0x2b,0x22,0x30,0x22}; // +"0"
uchar data num12[]={0xff,0xff,0xff}; //
uchar xdata num10[]={0x70,0x61,0x67,0x65,0x20,0x31,0xff,0xff,0xff};//
/*=======初始化=========*/
void init()
{
/*定义占空比*/
TMOD = 0x20; /*=============使用工作模式1会失败 ================*/
/*定义串口*/
SM0 = 0;
SM1 = 1; //工作模式1
REN = 1;
TH1 = 0xfd;
TL1 = 0xfd; //比特率9600
TR1 = 1;
EA = 1; //开总中断
ES = 1; //串口中断打开
}
/*=========串口============*/
void fasong()
{
/*========================发送第一个人==================================*/
if(EEPROM_DATA==0xb1) //发送从c1到c4
{
for(z=1;z<5;z++) //判断每个数是多少
{
ES=0;
for(i=0;i<6;i++) //t0.txt
{
SBUF = num11[i];
delay(5);
while(!TI);
TI = 0;
}
SBUF =0x3d;
delay(5);
while(!TI);
TI = 0;
//=
for(i=0;i<6;i++) //t0.txt
{
SBUF = num11[i];
delay(5);
while(!TI);
TI = 0;
}
switch(c[z])
{
case 0x31: for(i=0;i<4;i++) //发送数据1给文本t0
{
SBUF = num1[i];
delay(5);
while(!TI);
TI = 0;
}
break;
case 0x32: for(i=0;i<4;i++) //发送数据2给文本t0
{
SBUF = num2[i];
while(!TI);
TI = 0;
}break;
case 0x33: for(i=0;i<4;i++) //发送数据3给文本t0
{
SBUF = num3[i];
while(!TI);
TI = 0;
}break;
case 0x34: for(i=0;i<4;i++) //发送数据4给文本t0
{
SBUF = num4[i];
while(!TI);
TI = 0;
}break;
case 0x35: for(i=0;i<4;i++) //发送数据5给文本t0
{
SBUF = num5[i];
while(!TI);
TI = 0;
}break;
case 0x36: for(i=0;i<4;i++) //发送数据6给文本t0
{
SBUF = num6[i];
while(!TI);
TI = 0;
}break;
case 0x37: for(i=0;i<4;i++) //发送数据7给文本t0
{
SBUF = num7[i];
while(!TI);
TI = 0;
}break;
case 0x38: for(i=0;i<4;i++) //发送数据8给文本t0
{
SBUF = num8[i];
while(!TI);
TI = 0;
}break;
case 0x39: for(i=0;i<4;i++) //发送数据9给文本t0
{
SBUF = num9[i];
while(!TI);
TI = 0;
}break;
case 0x30: for(i=0;i<4;i++) //发送数据0给文本t0
{
SBUF = num0[i];
while(!TI);
TI = 0;
}break;
}
for(i=0;i<3;i++) //发送数据0给文本t0
{
SBUF = num12[i];
while(!TI);
TI = 0;
}
ES=1;
}
EEPROM_DATA=0; //串口需要清零,要么一直发送停不下来
}
/*========================发送第二个人==================================*/
if(EEPROM_DATA==0xb2)
{
for(z1=5;z1<9;z1++)
{
ES=0;
for(i=0;i<6;i++) //t1.txt
{
SBUF = num13[i];
delay(5);
while(!TI);
TI = 0;
}
SBUF =0x3d;
delay(5);
while(!TI);
TI = 0;
//=
for(i=0;i<6;i++) //t1.txt
{
SBUF = num13[i];
delay(5);
while(!TI);
TI = 0;
}
switch(c[z1])
{
case 0x31: for(i=0;i<4;i++) //发送数据1给文本t0
{
SBUF = num1[i];
delay(5);
while(!TI);
TI = 0;
}break;
case 0x32: for(i=0;i<4;i++) //发送数据2给文本t0
{
SBUF = num2[i];
while(!TI);
TI = 0;
}break;
case 0x33: for(i=0;i<4;i++) //发送数据3给文本t0
{
SBUF = num3[i];
while(!TI);
TI = 0;
}break;
case 0x34: for(i=0;i<4;i++) //发送数据4给文本t0
{
SBUF = num4[i];
while(!TI);
TI = 0;
}break;
case 0x35: for(i=0;i<4;i++) //发送数据5给文本t0
{
SBUF = num5[i];
while(!TI);
TI = 0;
}break;
case 0x36: for(i=0;i<4;i++) //发送数据6给文本t0
{
SBUF = num6[i];
while(!TI);
TI = 0;
}break;
case 0x37: for(i=0;i<4;i++) //发送数据7给文本t0
{
SBUF = num7[i];
while(!TI);
TI = 0;
}break;
case 0x38: for(i=0;i<4;i++) //发送数据8给文本t0
{
SBUF = num8[i];
while(!TI);
TI = 0;
}break;
case 0x39: for(i=0;i<4;i++) //发送数据9给文本t0
{
SBUF = num9[i];
while(!TI);
TI = 0;
}break;
case 0x30: for(i=0;i<4;i++) //发送数据0给文本t0
{
SBUF = num0[i];
while(!TI);
TI = 0;
}break;
}
for(i=0;i<3;i++) //发送数据0给文本t0
{
SBUF = num12[i];
while(!TI);
TI = 0;
}
ES=1;
}
EEPROM_DATA=0;//串口需要清零,要么一直发送停不下来
}
/*========================发送第三个人==================================*/
if(EEPROM_DATA==0xb3) //发送从c1到c4
{
for(z=1;z<5;z++) //判断每个数是多少
{
ES=0;
for(i=0;i<6;i++) //t2.txt
{
SBUF = num14[i];
delay(5);
while(!TI);
TI = 0;
}
SBUF =0x3d;
delay(5);
while(!TI);
TI = 0;
//=
for(i=0;i<6;i++) //t2.txt
{
SBUF = num14[i];
delay(5);
while(!TI);
TI = 0;
}
switch(c[z])
{
case 0x31: for(i=0;i<4;i++) //发送数据1给文本t0
{
SBUF = num1[i];
delay(5);
while(!TI);
TI = 0;
}
break;
case 0x32: for(i=0;i<4;i++) //发送数据2给文本t0
{
SBUF = num2[i];
while(!TI);
TI = 0;
}break;
case 0x33: for(i=0;i<4;i++) //发送数据3给文本t0
{
SBUF = num3[i];
while(!TI);
TI = 0;
}break;
case 0x34: for(i=0;i<4;i++) //发送数据4给文本t0
{
SBUF = num4[i];
while(!TI);
TI = 0;
}break;
case 0x35: for(i=0;i<4;i++) //发送数据5给文本t0
{
SBUF = num5[i];
while(!TI);
TI = 0;
}break;
case 0x36: for(i=0;i<4;i++) //发送数据6给文本t0
{
SBUF = num6[i];
while(!TI);
TI = 0;
}break;
case 0x37: for(i=0;i<4;i++) //发送数据7给文本t0
{
SBUF = num7[i];
while(!TI);
TI = 0;
}break;
case 0x38: for(i=0;i<4;i++) //发送数据8给文本t0
{
SBUF = num8[i];
while(!TI);
TI = 0;
}break;
case 0x39: for(i=0;i<4;i++) //发送数据9给文本t0
{
SBUF = num9[i];
while(!TI);
TI = 0;
}break;
case 0x30: for(i=0;i<4;i++) //发送数据0给文本t0
{
SBUF = num0[i];
while(!TI);
TI = 0;
}break;
}
for(i=0;i<3;i++) //发送数据0给文本t0
{
SBUF = num12[i];
while(!TI);
TI = 0;
}
ES=1;
}
EEPROM_DATA=0; //串口需要清零,要么一直发送停不下来
}
/*========================发送第四个人==================================*/
if(EEPROM_DATA==0xb4) //发送从c1到c4
{
for(z=1;z<5;z++) //判断每个数是多少
{
ES=0;
for(i=0;i<6;i++) //t3.txt
{
SBUF = num15[i];
delay(5);
while(!TI);
TI = 0;
}
SBUF =0x3d;
delay(5);
while(!TI);
TI = 0;
//=
for(i=0;i<6;i++) //t3.txt
{
SBUF = num15[i];
delay(5);
while(!TI);
TI = 0;
}
switch(c[z])
{
case 0x31: for(i=0;i<4;i++) //发送数据1给文本t0
{
SBUF = num1[i];
delay(5);
while(!TI);
TI = 0;
}
break;
case 0x32: for(i=0;i<4;i++) //发送数据2给文本t0
{
SBUF = num2[i];
while(!TI);
TI = 0;
}break;
case 0x33: for(i=0;i<4;i++) //发送数据3给文本t0
{
SBUF = num3[i];
while(!TI);
TI = 0;
}break;
case 0x34: for(i=0;i<4;i++) //发送数据4给文本t0
{
SBUF = num4[i];
while(!TI);
TI = 0;
}break;
case 0x35: for(i=0;i<4;i++) //发送数据5给文本t0
{
SBUF = num5[i];
while(!TI);
TI = 0;
}break;
case 0x36: for(i=0;i<4;i++) //发送数据6给文本t0
{
SBUF = num6[i];
while(!TI);
TI = 0;
}break;
case 0x37: for(i=0;i<4;i++) //发送数据7给文本t0
{
SBUF = num7[i];
while(!TI);
TI = 0;
}break;
case 0x38: for(i=0;i<4;i++) //发送数据8给文本t0
{
SBUF = num8[i];
while(!TI);
TI = 0;
}break;
case 0x39: for(i=0;i<4;i++) //发送数据9给文本t0
{
SBUF = num9[i];
while(!TI);
TI = 0;
}break;
case 0x30: for(i=0;i<4;i++) //发送数据0给文本t0
{
SBUF = num0[i];
while(!TI);
TI = 0;
}break;
}
for(i=0;i<3;i++) //发送数据0给文本t0
{
SBUF = num12[i];
while(!TI);
TI = 0;
}
ES=1;
}
EEPROM_DATA=0; //串口需要清零,要么一直发送停不下来
}
/*========================发送第五个人==================================*/
if(EEPROM_DATA==0xb5) //发送从c1到c4
{
for(z=1;z<5;z++) //判断每个数是多少
{
ES=0;
for(i=0;i<6;i++) //t4.txt
{
SBUF = num16[i];
delay(5);
while(!TI);
TI = 0;
}
SBUF =0x3d;
delay(5);
while(!TI);
TI = 0;
//=
for(i=0;i<6;i++) //t4.txt
{
SBUF = num16[i];
delay(5);
while(!TI);
TI = 0;
}
switch(c[z])
{
case 0x31: for(i=0;i<4;i++) //发送数据1给文本t0
{
SBUF = num1[i];
delay(5);
while(!TI);
TI = 0;
}
break;
case 0x32: for(i=0;i<4;i++) //发送数据2给文本t0
{
SBUF = num2[i];
while(!TI);
TI = 0;
}break;
case 0x33: for(i=0;i<4;i++) //发送数据3给文本t0
{
SBUF = num3[i];
while(!TI);
TI = 0;
}break;
case 0x34: for(i=0;i<4;i++) //发送数据4给文本t0
{
SBUF = num4[i];
while(!TI);
TI = 0;
}break;
case 0x35: for(i=0;i<4;i++) //发送数据5给文本t0
{
SBUF = num5[i];
while(!TI);
TI = 0;
}break;
case 0x36: for(i=0;i<4;i++) //发送数据6给文本t0
{
SBUF = num6[i];
while(!TI);
TI = 0;
}break;
case 0x37: for(i=0;i<4;i++) //发送数据7给文本t0
{
SBUF = num7[i];
while(!TI);
TI = 0;
}break;
case 0x38: for(i=0;i<4;i++) //发送数据8给文本t0
{
SBUF = num8[i];
while(!TI);
TI = 0;
}break;
case 0x39: for(i=0;i<4;i++) //发送数据9给文本t0
{
SBUF = num9[i];
while(!TI);
TI = 0;
}break;
case 0x30: for(i=0;i<4;i++) //发送数据0给文本t0
{
SBUF = num0[i];
while(!TI);
TI = 0;
}break;
}
for(i=0;i<3;i++) //发送数据0给文本t0
{
SBUF = num12[i];
while(!TI);
TI = 0;
}
ES=1;
}
EEPROM_DATA=0; //串口需要清零,要么一直发送停不下来
}
/*========================发送第六个人==================================*/
if(EEPROM_DATA==0xb6) //发送从c1到c4
{
for(z=1;z<5;z++) //判断每个数是多少
{
ES=0;
for(i=0;i<6;i++) //t5.txt
{
SBUF = num17[i];
delay(5);
while(!TI);
TI = 0;
}
SBUF =0x3d;
delay(5);
while(!TI);
TI = 0;
//=
for(i=0;i<6;i++) //t5.txt
{
SBUF = num17[i];
delay(5);
while(!TI);
TI = 0;
}
switch(c[z])
{
case 0x31: for(i=0;i<4;i++) //发送数据1给文本t0
{
SBUF = num1[i];
delay(5);
while(!TI);
TI = 0;
}
break;
case 0x32: for(i=0;i<4;i++) //发送数据2给文本t0
{
SBUF = num2[i];
while(!TI);
TI = 0;
}break;
case 0x33: for(i=0;i<4;i++) //发送数据3给文本t0
{
SBUF = num3[i];
while(!TI);
TI = 0;
}break;
case 0x34: for(i=0;i<4;i++) //发送数据4给文本t0
{
SBUF = num4[i];
while(!TI);
TI = 0;
}break;
case 0x35: for(i=0;i<4;i++) //发送数据5给文本t0
{
SBUF = num5[i];
while(!TI);
TI = 0;
}break;
case 0x36: for(i=0;i<4;i++) //发送数据6给文本t0
{
SBUF = num6[i];
while(!TI);
TI = 0;
}break;
case 0x37: for(i=0;i<4;i++) //发送数据7给文本t0
{
SBUF = num7[i];
while(!TI);
TI = 0;
}break;
case 0x38: for(i=0;i<4;i++) //发送数据8给文本t0
{
SBUF = num8[i];
while(!TI);
TI = 0;
}break;
case 0x39: for(i=0;i<4;i++) //发送数据9给文本t0
{
SBUF = num9[i];
while(!TI);
TI = 0;
}break;
case 0x30: for(i=0;i<4;i++) //发送数据0给文本t0
{
SBUF = num0[i];
while(!TI);
TI = 0;
}break;
}
for(i=0;i<3;i++) //发送数据0给文本t0
{
SBUF = num12[i];
while(!TI);
TI = 0;
}
ES=1;
}
EEPROM_DATA=0; //串口需要清零,要么一直发送停不下来
}
}
void UART() interrupt 4
{
if(RI)
{
RI = 0;
EEPROM_DATA = SBUF;
if(EEPROM_DATA==0xaa) //接受0xaa开始储存数值
{
tr1=1;
}
if(EEPROM_DATA==0xdd) //进行初始化
{
tr2=1;
}
if(tr1==1) //开始储存数值到a[n];
{
a[n]=EEPROM_DATA;
n++;
if(n==5) //4个一组
{
P1=~P1 ;
n=0;
tr1=0;
tr0_ok=1;
}
}
}
}