⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_password.c

📁 51做的门禁系统代码
💻 C
字号:
#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar keyvalue,keytemp[7],keyflag,password[6];
uchar romflag,doorflag,adr9346,order,coder,readtemp,codetemp[3],code_case;
const uchar keyin[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};
const uchar value[]={0x03,0x07,0x0b,0x0f,0x02,0x06,0x0a,0x0e,0x01,0x05,0x09,0x0d,0x00,0x04,0x08,0x0c};
sbit door=P1^0;
sbit next=P1^1;
sbit cs=P3^7;
sbit clk=P3^6;
sbit di=P3^5;
sbit doi=P3^4;
//变量说明:
//keyvalue:键值(1次的)
//keytemp[7]:输入的键值存放处(第7为按下ENTER键设计)
//keyflag:按键标志位,当此位为1时有键按下,否则无
//romflag:93C46的密码标志位,当此位为1时有存有密码,否则无
//doorflag:门标志位,即密码是否正确,当此位为1时开门(或密码正确),否则不开(或不正确)
//adr9346:要写入或要读出93C46的地址
//order:要送入93C46的信息
//code:读出的密码(1次的)
//readtemp:读取数据的临时存放处
//codetemp[3]:读取的密码的临时存放处
//code_case:选择密码存放地址情况(1表示从0x01开始的密码,2表示从0x04开始的备用密码,3表示从0x07开始的身份密码)
void delay(uint j)                      //延时
{
	uchar i;
	for(;j>0;j--)
	{
		for(i=0;i<125;i++)
		{;}
	}
}
//延时32us
void delay1()
{
	uchar i;
	for(i=0;i<4;i++)
		 {;}
}
//键盘扫描
void scan()
{
	uchar i,j,m,first,key,temp;
	first=0xef;
	m=0;
	keyflag=0;
	for(i=0;i<4;i++)
	{
		P2=first;
		key=P2;
		if(key!=first)
		  {
		  	delay(10);
		  	temp=P2;
		  	if(key=temp)
		  	{
		  		for(j=0;j<16;j++)
		  		{
		  			if(key=keyin[m])
		  			 {
		  			 	keyvalue=value[m];
		  			 	break;	
		  			 }
		  			else m++;
		  		}
		  	keyflag=1;
		  	}
		  }
        if(keyflag==1) break;
		else first=_crol_(first,1);
	}
}
//密码打包存入codetemp[3]
void pack()
{
  uchar codepack,packtemp,i;
  char n=-1;
  for(i=0;i<3;i++)
	   {	   	
	   	keytemp[n++]=codepack;
	    keytemp[n++]=packtemp;
	   	codepack=codepack<<4;
	   	codepack=codepack+packtemp;
	    codetemp[i]=codepack;
     }
}
//密码解包存入password[6]
void undo()
{
  uchar codeundo,undotemp,dotemp,i,m;
  char n=-1;
  for(i=0;i<3;i++)
	   {
	   	codetemp[i]=codeundo;
	    for(m=0;m<4;m++)
	       {
	   	     codeundo=codeundo>>1;
	   	     dotemp=CY;
	   	     undotemp=undotemp+dotemp;
	   	     undotemp=_crol_(undotemp,1);  	
	       }
	    password[n++]=codeundo;
	    password[n++]=undotemp;
     }
}
//确认比较处理
void enter()
{
	uchar i;
	for(i=0;i<6;i++)
	  {
	  	if(keytemp[i]!=password[i]) break;
	  }
	if(i==5) doorflag=1;
}
//发出指令到93C46
void send9346()
{
	uchar i;
	for(i=0;i<8;i++)
	   {
	   	order=order>>1;
	   	di=CY;
	   	clk=~clk;
	   	delay1();
	   	clk=~clk;
	   	delay1();	   	
	   }
}
//读出93C46的数据
void read9346()
{
	uchar i;
	coder=0;
	for(i=0;i<8;i++)
	   {
	   	clk=~clk;
	   	delay1();
	   	clk=~clk;
	   	delay1();
	   	readtemp=doi;
	   	coder=coder+readtemp;
	   	coder=_cror_(coder,1);
	   }
}
//从93C46读出密码
void readpassword(uchar adr_case)
{
	uchar i,n;
	P3=0xf0;
	delay1();
	clk=0;
	delay1();
	if(adr_case==0) {adr9346=0x00;n=1;}
	else if(adr_case==1) {adr9346=0x01;n=3;}
	else if(adr_case==2) {adr9346=0x04;n=3;}
	else if(adr_case==3) {adr9346=0x07;n=3;}
	order=adr9346+0x80;               //加入读指令
	for(i=0;i<n;i++)
	    {
	    	send9346();
	      read9346();
	      codetemp[i]=coder;
	    }
	 cs=0;
}
//把密码写入93C46
void writepassword(uchar adr_case)
{
	uchar i,n;
	P3=0xf0;                       //写使能
	delay1();
	clk=0;
	delay1();
	order=0x80;
	send9346();
	cs=0;
	P3=0xf0;                       //写入数据
	delay1();
	clk=0;
	delay1();
	if(adr_case==0) {adr9346=0x00;n=1;}
	else if(adr_case==1) {adr9346=0x01;n=3;}
	else if(adr_case==2) {adr9346=0x04;n=3;}
	else if(adr_case==3) {adr9346=0x07;n=3;}
	for(i=0;i<n;i++)
	    {
	    	order=adr9346+0x40;      //加入写指令
	    	send9346();
	    	order=codetemp[i];
	    	send9346();
	    	adr9346++;	      
	    }
	cs=0;
	order=0x00;                    //写禁止
	send9346();
	cs=0;		
}
//输入处理2
void keytwo()
{
	uchar i=0,led=0xfb;
	for(;i<7;i++)
	  {  
	  	while(1) 
	  	     {
	  	    	scan();
	  	    	if(keyflag==0x01) break;
	         }
	     P1=led;
	   	 if(keyvalue==0x02) enter();            //判断是否按下确认键
	   	 else if(keyvalue==0x00) i=i-1;         //判断是否按下清除键
	   	      else keytemp[i]=keyvalue;
	   	 if(doorflag==1) break;
	   	 led=_crol_(led,1);	   	 
	   }
}
//修改现有密码
void repassword()
{
	uchar i=0,led=0xfb;
	readpassword(3);
	undo();
	keytwo();
	enter();
	if(doorflag==1)
	  {
	  	next=0;
	  	keytwo();
	  	pack();
	  	writepassword(code_case);
	  }
}
//输入处理
void key()
{
	uchar i=0,led=0xfb;
	for(;i<7;i++)
	  {  
	  	while(1) 
	  	     {
	  	    	scan();
	  	    	if(keyflag==0x01) break;
	         }
	     P1=led;
	   	 if(keyvalue==0x0b) repassword();       //判断是否按下修改密码键
	   	 else if(keyvalue==0x02) enter();       //判断是否按下确认键
	   	 else if(keyvalue==0x00) i=i-1;         //判断是否按下清除键
	   	      else keytemp[i]=keyvalue;
	   	 if(doorflag==1) break;
	   	 led=_crol_(led,1);	   	 
	   }
}
//93C46有无密码判断处理
void sign()
{
	readpassword(0);
	romflag=coder;
	if(romflag==0x00)
	  {
	  	codetemp[0]=0x00;
        codetemp[1]=0x00;
		codetemp[2]=0x00;
	  	writepassword(1);
	  	writepassword(2);
	  	writepassword(3);
	  	writepassword(0);
	  }
}
//主函数
void main()
{
	//sign();
	doorflag=0;
	while(1)
	     {
	     	P1=0xff;
	     	scan();
	     	if(keyflag==0x01)
	     	   {
	     	   	if(keyvalue==0x03)              //按下了输入密码键
	     	   	   {
                code_case=1;
                readpassword(code_case);                
                key();
                if(doorflag==1) door=0;
                delay(1000);               //开门动作时间1S
                }
	     	   	else if(keyvalue==0x07)        //按下了输入备用密码键
                    {
                     code_case=2;
                     readpassword(code_case);
                     key(); 
                     if(doorflag==1) door=0;
                     delay(1000);          //开门动作时间1S                  	
                    }
	     	   	else if(keyvalue==0x0f)        //按下了修改身份验证密码键
                    {
                     code_case=3;
                     readpassword(code_case);
                     undo();
                     key();
                     enter();
                     if(doorflag==1)
                       {
                       	next=0;
                       	key();
                       	pack();
                       	writepassword(code_case);
                       }
                    }
	     	   }
	     }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -