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

📄 sle4442.h

📁 利用51单片机实现sle4442的读写
💻 H
字号:
uchar idata rstdata[4];
sbit IO  = P0^3;
sbit RST = P0^1;
sbit CLK = P0^2;

uchar idata temp[33];


void Delay(uchar j)
{uchar data i;
i=j;
for(i;i>0;i--);
}
/*******************************************************/
/*       ic_start函数 作用:启动发送命令起始条件       */
/*******************************************************/
void ic_start(void)                                   
{
  CLK=0;IO=1;Delay(1);CLK=1;Delay(1);IO=0;Delay(1);CLK=0;
 }

/*******************************************************/
/*       ic_stop 函数 作用:命令发送结束信号           */
/*******************************************************/
void ic_stop(void)                                  
{
  IO=0;CLK=1;Delay(2);IO=1;CLK=0;
}
/*******************************************************/
/*     ic_Plus 函数 作用:时钟低跳变,输入比特数据     */
/*******************************************************/
void  ic_plus(void)
{
  CLK=1;Delay(2);CLK=0;Delay(2);
}

/*******************************************************/
/*   ic_sendbyte 函数 作用:字节数据传送               */
/*   将byte发送到sle4442,可以是命令、数据             */
/*******************************************************/
void ic_sendbyte(uchar byte)
{
 uchar data count;
 for(count=0;count<8;count++) /*要传送的数据长度为8 位*/
 {
  if((byte>>count)&0x01)IO=1; /*判断发送位*/
  else IO=0;
  ic_plus(); /*发送数据位  */
 }
}
/*******************************************************/
/*   ic_readbyte 函数 作用:字节数据接收               */
/*   用来接收从卡传来的数据                            */
/*******************************************************/
uchar ic_readbyte(void)
{    uchar data rd_data=0;
     uchar data count;
     for(count=0;count<8;count++)
    {
     CLK=0; /*置时钟线为低准备接收数据位*/
	 IO=1; /*置数据线为输入方式*/
	 Delay(1); /*时钟低电平周期大于4.7 us*/
	 CLK=1; /*置时钟线为高使数据线上数据有效*/
	 rd_data=rd_data>>1;
	 if(IO==1)rd_data=rd_data+0x80; /*读数据位,接收的数据位放入retc 中 */
     }
	 CLK=0;
     return(rd_data);
}
/*******************************************************/
/*   ic_reset 函数 作用:复位和复位响应                */
/*   复位IC 卡并接收响应字存入rstdata[4]               */
/*******************************************************/
void ic_reset(void)
{    uchar data count;
     RST=0;
     CLK=0;
	 Delay(1);
	 RST=1; /*产生复位时序*/
	 Delay(1);
	 CLK=1;
	 Delay(3);
	 CLK=0;
	 Delay(1);
	 RST=0;
	 for(count=0;count<4;count++)
	 rstdata[count]=ic_readbyte();
	 }
/*******************************************************/
/*   ic_break 函数 作用:中止当前操作                  */
/*******************************************************/
void ic_break(void)
{CLK=0;
Delay(1);
RST=1;
Delay(1);
RST=0;
}
/*******************************************************/
/*   ic_write 函数 作用:ic卡处理数据                  */
/*******************************************************/
void ic_write(void)
{
   do
   {
   ic_plus();
   }
   while(IO==0);
}
/*******************************************************/
/*  ic_sendcmd 函数 作用:ic卡发送命令                 */
/*******************************************************/
void ic_sendcmd(uchar ic_cmd,uchar ic_add,uchar ic_data)
{
 ic_start();
 ic_sendbyte(ic_cmd); /*连续发送3 字节指令*/
 ic_sendbyte(ic_add);
 ic_sendbyte(ic_data);
 ic_stop();
 /*部分命令需调用处理函数 */
  if(ic_cmd==0x38||ic_cmd==0x3c||ic_cmd==0x39||ic_cmd==0x33)
 {ic_write();}
}
/*******************************************************************/
/*   ic_compare 函数 作用:卡校验密码							   */
/*  进行SLE4442 卡进行密码核对核对后方能进行写操作				   */
/*  操作成功返回             0x00								   */
/*  卡无效或卡损坏返回       0x01								   */
/*  密码错误返回             0x02								   */
/*  卡只剩1 次机会返回       0x03.							   	   */
/*******************************************************************/

uchar ic_compare(uchar pwd1,uchar pwd2,uchar pwd3)
{uchar ec;
   ic_sendcmd(0x31,0x00,0x00);
   ec=ic_readbyte(); 
   switch(ec&0x07)
    { 
	  case 1:  		   
	  case 2:
	  case 4: return 0x03;
	  case 3:
	  case 5: ec=0xf9; break;
	  case 6: ec=0xfa; break;
	  case 7: ec=0xfb; break;
	  default: return 0x01;
	  }
 ic_sendcmd(0x39,0,ec);
 ic_sendcmd(0x33,0x01,pwd1);
 ic_sendcmd(0x33,0x02,pwd2);
 ic_sendcmd(0x33,0x03,pwd3);
 ic_sendcmd(0x39,1,0xff);
 ic_sendcmd(0x31,0x00,0x00);
 ec=ic_readbyte();
 if((ec&0x07)!=0x07) return(0x02);
 return(0x00);
 }
 
/*******************************************************************/
/*   ic_read_pram 函数 作用:读取保护存储器,并传到上位机		  **/
/*******************************************************************/
void ic_read_pram(void)
{
uchar i;
 ic_sendcmd(0x34,0x00,0x00);
for(i=0;i<32;i++)
{temp[i]=ic_readbyte();
}
temp[32]='\0';
com_send(temp);
}
/*******************************************************************/
/*   ic_read_pram 函数 作用:读取主存储器,并传到上位机		      **/
/*******************************************************************/
void ic_read_mram(void)
{uchar i,j;
ic_sendcmd(0x30,0x20,0x00);
for(j=0;j<14;j++)
{
   for(i=0;i<32;i++)
   {temp[i]=ic_readbyte();
   }
   temp[32]='\0';
com_send(temp);
}
}

⌨️ 快捷键说明

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