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

📄 dianzimimasuo.c

📁 电子密码锁
💻 C
字号:

	 
	#include<reg52.h>
	#include<intrins.h>
//	#include<c02.h>
	#define uchar unsigned char
	#define uint  unsigned int
	sbit key=P3^2;
	sbit cs=P2^7;
	sbit dat=P3^6;
	sbit clk=P3^7;
	sbit bill=P1^6;
	//	  	#ifndef _24c02_H_
//	#define _24c02_H_  //24c02驱动程序
	#define WriteDeviceAddress 0xa0
	#define ReadDeviceAddress 0xa1
	sbit  SDA=P3^5;
	sbit  SCK=P3^4;
	void delay10ms(void)
	 {unsigned char i,j;
	for(i=20;i>0;i--)
	for(j=248;j>0;j--);
	}
	void DelayWait()
	{ _nop_();
	  _nop_();
	  _nop_();
	  _nop_();
	  _nop_();
	  _nop_();
	  _nop_();
	}
	void Start_Cond()
	{ SDA=1;
	  DelayWait();
	  SCK=1;
	  DelayWait();
	  SDA=0;
	  DelayWait();
	  SCK=0;
	}
	  void Stop_Cond()
	{ SDA=0;
	  DelayWait();
	  SCK=1;
	  DelayWait();
	  SDA=1;
	  DelayWait();
	  SCK=0;
	}
	void Ack()
	{ SDA=0;
	  SCK=1;
	  DelayWait();
	  SCK=0;
	  DelayWait();
	}
	void NoAck()
	{ unsigned char i;
	  SDA=1;
	  _nop_();
	  SCK=1;
	  DelayWait();
	  while((SDA==1)&&(i<250))i++;
	  SCK=0;
	  DelayWait();
	}
	bit Write8Bit(unsigned char input)
	{ unsigned char i;
	  for(i=0;i<8;i++)
	{   SCK=0;
	    input<<=1;
	    SDA=CY;
	    DelayWait();
	    SCK=1;
	    DelayWait();
	    SCK=0;
	}
	  SCK=0;
	  DelayWait();
	  SDA=1;
	  DelayWait();
	  return(CY);
	}
	unsigned char Read8Bit()
	{ unsigned char i,j=0;
	  SCK=0;
	  DelayWait();
	  SDA=1;
	  DelayWait();
	  for(i=8;i!=0;i--)
	{  SCK=1;
	   DelayWait();
	   j=(j<<1)|SDA;
	   SCK=0;
	   DelayWait();
	}
	  return j;
	}
	unsigned char Read_one_Flash(unsigned char nAddr)
	{  unsigned char Data;
	   Start_Cond();
	   Write8Bit(WriteDeviceAddress);
	   NoAck();
	   Write8Bit(nAddr);
	   NoAck();
	   Start_Cond();
	   DelayWait();
	   Write8Bit(ReadDeviceAddress);
	   NoAck();
	   Data=Read8Bit();
	   Stop_Cond();
	   return(Data);
	}
	void Write_one_Flash(unsigned char nAddr,unsigned char Data)
	{  Start_Cond();
	   Write8Bit(WriteDeviceAddress);
	   NoAck();
	   Write8Bit(nAddr);
	   NoAck();
	   Write8Bit(Data);
	   NoAck();
	   Stop_Cond();
	}
	void Read_Flash(unsigned char *nContent,unsigned char nAddr,unsigned char nLen)
	{  unsigned char count;
	   for(count=0;count<nLen;count++)
	  {*(nContent+count)=Read_one_Flash (nAddr+count);}
	}
void Write_Flash(unsigned char *nContent,unsigned char nAddr,unsigned char nLen)
	{  unsigned char temp;
	   unsigned char count;  
	   for(count=0;count<nLen;count++)
	  {temp=*(nContent+count);
	   Write_one_Flash((nAddr+count),temp);
	   delay10ms();
	   delay10ms();
	  }
	}
//	#endif  
	uchar b[6]={0x01,0x02,0x03,0x04,0x05,0x06},c[6]={0x02,0x03,0x04,0x05,0x06,0x07}; 
	uchar *q,*r,count;
	void first(void)
	{  q=b;r=c; 
	  Write_Flash(q,0x00,6);
	  Write_Flash(r,0x06,6);
	}
	void delayus(uchar i)
	{uchar j;
	  do
	  {for(j=0;j<8;j++);
	   }while(i--);
	}
	void delayms(uchar i)
	{uint j;
	  do
	  {for(j=0;j<333;j++);
	   }while(i--);
	}
	void bill1(void)//输入密码正确
	{ uchar i=2;
	 while(i)
	   {  delayms(22);
	      delayms(22);
	   	 bill=0;
	      delayms(22);
	      delayms(22);
		     bill=1;
		     --i;
	   }
	}
	void bill2(void)//输入密码错误
	{ uchar i=10; 
	 while(i)
	   { delayms(7);
		   delayms(7);
		   bill=0;   
		   delayms(7);
		   delayms(7);
		   bill=1;
		   --i;
	   }
	}
	void send(uchar j)
	{uchar i;
	 clk=0;
	 delayus(5);
	 for(i=0;i<8;i++)
	 {if(j&0x80)
	   dat=1;
	   else
	   dat=0;	  
	  clk=1;
	  delayus(1);
	  clk=0;
	  delayus(1); 
	    j=j<<1; 
	 }
	 dat=0;
	 return;
	}	 
	uchar receive()
	{ uchar i,j;
	 j=1;
	 clk=0;
	 dat=1;
	 delayus(5);
	 for(i=0;i<8;i++)
	 {	clk=1;
	     delayus(1);
		j=j*2;
		    if(dat)
	     j|=0x01;
		clk=0;
		delayus(1);
	 }
	   dat=0;
	   return  j;
	}			  
	bit compare(uchar *string1,uchar *string2)
	{uchar t;
	 for(t=0;t<6;t++)
	 {if(string1[t]!=string2[t])
	       return(0);
	 }
	 return(1);
	}
	void main()
	{bit js,k,jp; 
	 uchar i,keynum,s;
	 uchar a[7],d[6],*p,*u;
	  first();
	  p=a;u=d;
	 Read_Flash(u,0x06,6);
	 count=0;
	
	 k=0;
	 cs=1;
	 key=1;
	 clk=0;
	 dat=0;
	 delayms(25);
	 cs=0;
	 send(0xa4);
	 cs=1;
	 while(1)	
	 { for(count=0;count<7;count++)
	  { if(key==0)
	  {  cs=0;
	     send(0x15);
	     keynum=receive();
	     cs=1;
	   switch(keynum)
	   {   case 0x1e:  i=0x0d;break;	 //0x0d,改密键
	       case 0x16:  i=0x0c;break;
	       case 0x0e:  i=0x0b;break;
		   case 0x06:  i=0x0a;break;
		   case 0x1d:  i=0x0e;break;	             //0x0e,取消键
		   case 0x15:  i=0x09;break;
		   case 0x0d:  i=0x06;break;
		   case 0x05:  i=0x03;break;
		   case 0x1c:  i=0x0f;break;	 //0x0f,确定键
		   case 0x14:  i=0x08;break;
		   case 0x0c:  i=0x05;break;
		   case 0x04:  i=0x02;break;
		   case 0x1b:  i=0x00;break;
		   case 0x13:  i=0x07;break;
		   case 0x0b:  i=0x04;break;
		   case 0x03:  i=0x01;break;
		   default : break;
	   }
	  if(count<6)
	  {    if((i!=0x0f)&&(i!=0x0e)&&(i!=0x0d))
	       {cs=0;send(0xcb);send(0x00);cs=1;a[count]=i;} }
	  if(i==0x0e)
	  {count=0;cs=0;send(0xa4);cs=1;}
	  if((i=0x0f)&&(count==6))
	  {count=0;cs=0;send(0xcb);send(0x0f);cs=1;
	   js=compare(p,q); jp=compare(p,u); k=js|jp; 
	    if(k) bill1();  else bill2(); }
	  if((i=0x0d)&&k)
	  {cs=0;send(0xcb);send(0x0d);cs=1;count=0;
	    for(s=0;s<6;s++)
		{d[s]=a[s];}  Write_Flash(u,0x06,6);}
	   while(key==0);
	  }
	   while(key!=0);  
	   cs=0;
	   send(0xa0);
	   cs=1;							 
	 } 	} }

⌨️ 快捷键说明

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