做好的

串口

#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 num1[]={0x74,0x30,0x2e,0x74,0x78,0x74,0x3d,0x74,0x30,0x2e,0x74,0x78,0x74,0x2b,0x22,0x31,0x22,0xff,0xff,0xff};//t0.txt=t0.txt+"1"
uchar xdata num2[]={0x74,0x30,0x2e,0x74,0x78,0x74,0x3d,0x74,0x30,0x2e,0x74,0x78,0x74,0x2b,0x22,0x32,0x22,0xff,0xff,0xff};//t0.txt=t0.txt+"2"
uchar xdata num3[]={0x74,0x30,0x2e,0x74,0x78,0x74,0x3d,0x74,0x30,0x2e,0x74,0x78,0x74,0x2b,0x22,0x33,0x22,0xff,0xff,0xff};//t0.txt=t0.txt+"3"
uchar data 	num4[]={0x74,0x30,0x2e,0x74,0x78,0x74,0x3d,0x74,0x30,0x2e,0x74,0x78,0x74,0x2b,0x22,0x34,0x22,0xff,0xff,0xff};//t0.txt=t0.txt+"4"
uchar data 	num5[]={0x74,0x30,0x2e,0x74,0x78,0x74,0x3d,0x74,0x30,0x2e,0x74,0x78,0x74,0x2b,0x22,0x35,0x22,0xff,0xff,0xff};//t0.txt=t0.txt+"5"
uchar data 	num6[]={0x74,0x30,0x2e,0x74,0x78,0x74,0x3d,0x74,0x30,0x2e,0x74,0x78,0x74,0x2b,0x22,0x36,0x22,0xff,0xff,0xff};//t0.txt=t0.txt+"6"
uchar xdata num7[]={0x74,0x30,0x2e,0x74,0x78,0x74,0x3d,0x74,0x30,0x2e,0x74,0x78,0x74,0x2b,0x22,0x37,0x22,0xff,0xff,0xff};//t0.txt=t0.txt+"7"
uchar xdata num8[]={0x74,0x30,0x2e,0x74,0x78,0x74,0x3d,0x74,0x30,0x2e,0x74,0x78,0x74,0x2b,0x22,0x38,0x22,0xff,0xff,0xff};//t0.txt=t0.txt+"8"
uchar xdata num9[]={0x74,0x30,0x2e,0x74,0x78,0x74,0x3d,0x74,0x30,0x2e,0x74,0x78,0x74,0x2b,0x22,0x39,0x22,0xff,0xff,0xff};//t0.txt=t0.txt+"9"
uchar xdata num0[]={0x74,0x30,0x2e,0x74,0x78,0x74,0x3d,0x74,0x30,0x2e,0x74,0x78,0x74,0x2b,0x22,0x30,0x22,0xff,0xff,0xff};//t0.txt=t0.txt+"0"

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;
		switch(c[z])
		{
			case 0x31: for(i=0;i<20;i++)	   //发送数据1给文本t0
						{
						SBUF = num1[i];	
						delay(5);
						while(!TI); 
						TI = 0; 
						}
						break;		
			case 0x32:	for(i=0;i<20;i++)	  //发送数据2给文本t0
						{
						 SBUF = num2[i];
						 while(!TI); 
						 TI = 0; 
						}break;
			case 0x33: for(i=0;i<20;i++)	  //发送数据3给文本t0
						{
						SBUF = num3[i];
						while(!TI); 
						TI = 0; 
						}break;
			case 0x34:	for(i=0;i<20;i++)	 //发送数据4给文本t0
						{
						SBUF = num4[i];
						while(!TI); 
						TI = 0; 
						}break;
			case 0x35:	for(i=0;i<20;i++)	 //发送数据5给文本t0
						{
						SBUF = num5[i];	
						while(!TI); 
						TI = 0;
						}break;
			case 0x36:	for(i=0;i<20;i++)	 //发送数据6给文本t0
						{
						SBUF = num6[i];	
						 while(!TI); 
						 TI = 0;	 
						}break;
			case 0x37:	for(i=0;i<20;i++)	 //发送数据7给文本t0
						{
						SBUF = num7[i];
						 while(!TI); 
						 TI = 0;	
						}break;
			case 0x38:	for(i=0;i<20;i++)	  //发送数据8给文本t0
						{						
						SBUF = num8[i];	
						 while(!TI); 
						 TI = 0;	
						}break;
			case 0x39:	for(i=0;i<20;i++)	 //发送数据9给文本t0
						{
						SBUF = num9[i];	
						 while(!TI);  
						 TI = 0;
						}break;
			case 0x30:	for(i=0;i<20;i++)	 //发送数据0给文本t0
						{
						SBUF = num0[i];	
						 while(!TI); 
						 TI = 0;
						}break;  
		} 
		ES=1;
		}
		
		EEPROM_DATA=0;	//串口需要清零,要么一直发送停不下来
	}
/*========================发送第二个人==================================*/
	if(EEPROM_DATA==0xb2)
	{
		for(z1=5;z1<9;z1++)
		{
		 ES=0;
		switch(c[z1])
		{
			case 0x31: for(i=0;i<20;i++)	   //发送数据1给文本t0
						{
						SBUF = num1[i];	
						delay(5);
						 while(!TI); 
						 TI = 0; 
						}break;		
			case 0x32:	 for(i=0;i<20;i++)	  //发送数据2给文本t0
						{
						SBUF = num2[i];
						 while(!TI); 
						 TI = 0; 
						}break;
			case 0x33: for(i=0;i<20;i++)	  //发送数据3给文本t0
						{
						SBUF = num3[i];
						 while(!TI); 
						 TI = 0; 
						}break;
			case 0x34:	for(i=0;i<20;i++)	 //发送数据4给文本t0
						{
						SBUF = num4[i];
						 while(!TI); 
						 TI = 0; 
						}break;
			case 0x35:	for(i=0;i<20;i++)	 //发送数据5给文本t0
						{
						SBUF = num5[i];	
						 while(!TI); 
						 TI = 0;
						}break;
			case 0x36:	for(i=0;i<20;i++)	 //发送数据6给文本t0
						{
						SBUF = num6[i];	
						 while(!TI); 
						 TI = 0;	 
						}break;
			case 0x37:	for(i=0;i<20;i++)	 //发送数据7给文本t0
						{
						SBUF = num7[i];
						 while(!TI); 
						 TI = 0;	
						}break;
			case 0x38:	for(i=0;i<20;i++)	  //发送数据8给文本t0
						{						
						SBUF = num8[i];	
						 while(!TI); 
						 TI = 0;	
						}break;
			case 0x39:	for(i=0;i<20;i++)	 //发送数据9给文本t0
						{
						SBUF = num9[i];	
						 while(!TI);  
						 TI = 0;
						}break;
			case 0x30:	for(i=0;i<20;i++)	 //发送数据0给文本t0
						{
						SBUF = num0[i];	
						 while(!TI); 
						 TI = 0;
						}break;  
		} 
		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个一组
			{
				n=0;
				tr1=0;
				tr0_ok=1;
			}					
		}
		
	}
}

主函数

/***********************多人识别修改,可以验证密码正确**********************************************
----------------1.开发环境:Keil v4					   ----------------
----------------2.使用单片机型号:STC89C52RC		   ----------------
----------------3.单片机使用晶振:11.0592M			   ----------------
----------------4.功能:实现密码解锁,和存储记录----------------
----------------5.名称:智能保险柜 ----------------
***********************************************************************/
#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[3],r1,r2,r3,r4;//k2必须等于0,虽然我也不知道为啥
			 
	init();	
		
		for(s8=1;s8<9;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到124地址单元作为密码存储区
		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的第110到115地址单元作为密码存储区
		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的第110到115地址单元作为密码存储区
		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的第110到115地址单元作为密码存储区
		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<3;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函数里
		}
		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[1]++;
				}
				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[1]++;
				}
				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[1]++;
				}
				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[1]++;
				}
				else
				{
					P1=0xfd;  
				}
 /*=====================拆分k并转换成16进制======================================*/

			for(s2=1;s2<6;s2=s2+4)			  //万位	 4个一组
			{	  
				r1++;
				if(r1%2!=0)
				{
					b[s2]=k[1]/1000%10+48;
				}
				else
				{
					b[s2]=k[2]/1000%10+48;
				}
			}

			for(s3=2;s3<7;s3=s3+4)			  //千位  4个一组
			{
				r2++;
				if(r2%2!=0)
				{
					b[s3]=k[1]/100%10+48;
				}
				else
				{
				b[s3]=k[2]/100%10+48;
				}
			}

				for(s4=3;s4<8;s4=s4+4)			  //十位 4个一组
			{
				r3++;
				if(r3%2!=0)
				{
				b[s4]=k[1]/10%10+48;
				}
				else
				{
				b[s4]=k[2]/10%10+48;
				}
			}

				for(s5=4;s5<9;s5=s5+4)			  //个位 4个一组
			{
				r4++;
				if(r4%2!=0)
				{
				b[s5]=k[1]%10+48;
				}
				else
				{
				b[s5]=k[2]%10+48;
				}
			}
/*========================将b写入从27开始到34的地址中============================================*/
			for(s1=1;s1<9;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<3;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<9;s++)
			{
				c[s]=I2C_ReadData(s+26);	//从s+26中读取的k的值分别存入c[s]中	,从C1开始,四个一组(4位数),将万位,千万,百位十位分别赋值给c1,c2,c3,c4。
			}


			fasong();	//发送函数,发送16进制	


	 }	
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值