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

📄 siemens_ic_sle4442.c

📁 Siemens加密接触式IC卡Sle4442的C51源代码
💻 C
字号:
#define  Siemens
//#include <at89x52.h>
#include "head.h"
uchar code Password_Bass[3]={0xad,0x6e,0x46};

//void nop(void);
void SendComm(uchar a,uchar b,uchar c);                      //发送命令
void ReadMode(uchar idata *pt,uchar count);
uchar ResetCard(void);
void BreakOperate(void);
void StartComm(void);
void StopComm(void);
uchar ReadByte(void);
void WriteByte(uchar ch);
void Delay10us(void);
void Delay5us(void);
void ReadMainMem(uchar addr,uchar idata *pt,uchar count);
void ReadSafeMemory(uchar *p);
void WriteSafeMemory(uchar Address,uchar Data);
uchar VerifyPassword(uchar *p);
void CalculatePassword(uchar *p);
void Process(uchar i);

uchar ResetCard(void)
{
    uchar temp;
    Delay5us();    
    card_rest = 0;        
    card_clk = 0;     
    card_dat  = 1;    
    Delay5us();  
    Delay10us();
    Delay10us();    
    card_rest = 1;
    Delay5us();
    card_clk = 1;
    Delay10us();
    Delay10us();
    Delay10us();
    Delay10us();
    card_clk = 0;
    Delay5us();
    card_rest = 0;
    Delay10us();
    temp=ReadByte();       
    if(temp==0xa2)
	{
      temp = ReadByte();
      temp = ReadByte();
      temp = ReadByte();	  
	  card_clk = 0;         
      Delay5us();        
      card_dat  = 1;         
      Delay5us();               
      card_clk = 0;         
      Delay5us();
	  return Siemens_IC_Sel4442;
	}
	else
	{	  
	  return ATMEL_IC_24C01;
	}
}
//-------------------------------------------------------------------------------------
// 函数名称: BreakOperate
// 函数功能: 停止操作
//-----------------------------------------------------------------------------------
void BreakOperate(void)
{
     card_clk = 0;
     card_rest = 0;
     card_dat  = 0;
     Delay5us();
     card_rest = 1;
     card_dat  = 1;
     Delay5us();
     card_rest = 0;
     Delay5us();
     //CT_PW = 1;
}
//------------------------------------------------------------------------------------
// 函数名称: StartComm()
// 函数功能: 启动I2C总线子程序
//-----------------------------------------------------------------------------------
void StartComm(void)
{
    card_clk = 0;
    card_dat  = 1;
    Delay5us();
    card_clk = 1;
    Delay5us();
    card_dat  = 0;
    Delay5us();
}
//-------------------------------------------------------------------------------
// 函数名称: StopComm()
// 函数功能: 停止I2C总线数据传送子程序
//-----------------------------------------------------------------------------
void StopComm(void)
{
    card_clk = 0;
    card_dat  = 0;
    Delay5us();
    card_clk = 1;        //CLK: H
    Delay5us();
    card_dat  = 1;        //IO : H
    Delay10us();
}
//-----------------------------------------------------------------------------------
// 函数名称: ReadByte
// 返回接收的数据
// 函数功能: 接收一字节子程序
//-----------------------------------------------------------------------------------
uchar ReadByte(void)
{
    uchar i,ch;
    ch = 0;
    for (i = 0; i != 8; i++)
    {
        card_clk = 0;
        ch = ch >> 1;           //从低位读起 
        if((uchar)card_dat)
            ch |= 0x80;
		else ch &= 0x7f;
        Delay5us();
        card_clk = 1;
        Delay5us();
    }
	Delay10us();
	Delay10us();
    return ch;
}
//----------------------------------------------------------------------------------
// 函数名称: WriteByte
// 入口参数: ch
// 函数功能: 发送一个字节
//------------------------------------------------------------------------------------
void WriteByte(uchar ch)
{
    uchar i;
    for(i = 8; i > 0; i--)
    {
        card_clk = 0;
        card_dat = (bit)(ch & 0x01);
        Delay5us();
        card_clk = 1;
        Delay10us();
        ch = ch >> 1;                 //右移一位
    }
}
//-------------------------------------------------------------------------------------
// 函数名称: ReadMode
// 入口参数: pt地址指针,指向接收缓冲区,count要接收的数据个数
// 函数功能: 接收n位数据子程序
//----------------------------------------------------------------------------------
void ReadMode(uchar idata *pt,uchar count)
{
    //card_clk=0;
	//StartComm(); 
    //Delay5us();
    do
    {
        *pt = ReadByte();    //读入一个字节
        pt++;                //指针加一
    }while(--count);         //计数器减一,判断
}
//------------------------------------------------------------------------
// 延时10us子程序,根据系统时钟需要调整
//------------------------------------------------------------------------
void Delay10us(void)
{
     feed_dog();;;;;
}
//------------------------------------------------------------------------
// 延时5us子程序,根据系统时钟需要调整
//------------------------------------------------------------------------
void Delay5us(void)
{
     feed_dog();
}
//******************处理过程**************//
void Process(uchar i)
{
    //card_dat = 1;
    card_clk = 0;
	Delay5us();
    card_dat = 0;
	Delay5us();
    for(;i>0;i--)
 	{
     card_clk=1;
	 Delay5us();
	 card_clk = 0;
	 Delay5us();
	}
    card_dat = 1;
	Delay5us();
    card_clk=1;
	Delay5us();
	card_clk = 0;
    Delay5us();
}
//---------------------------------------------------------------------------------
// 函数名称: ReadMainMem()
// 入口参数:  addr: IC存储区地址;
//            pt: 地址指针,指向接收缓冲区;
//            count: 接收数据的个数
// 函数功能: 读存储区
//-----------------------------------------------------------------------------------
void ReadMainMem(uchar addr,uchar idata *pt,uchar count)
{
    SendComm(RMM_COMM,addr,0xff);
    ReadMode(pt,count);
    BreakOperate();
}
void WriteMainMem(uchar addr,uchar idata *pt)
{
    SendComm(WMM_COMM,addr,*pt);
    Process(0xff);
}
//---------------------------------------------------------------------------------
// 函数名称: VerifyPassword()校验密码
// 入口参数:  
//            p: 地址指针,指向密码存储区;
// 出口参数:  0:失败 1:成功
// 函数功能: 读存储区
//-----------------------------------------------------------------------------------
uchar VerifyPassword(uchar *p)
{
 uchar temp[4];//暂存4字节保护密码;
 uchar i;
 ResetCard();
 ReadSafeMemory(temp);//读安全代码以取得错误计数器
 if((temp[0]&0x07)!=0)
 	{if((temp[0]&0x07)==0x07)  i=0x06;
	 if((temp[0]&0x07)==0x06)  i=0x04;
     if((temp[0]&0x07)==0x04)  i=0x00;
	 WriteSafeMemory(0,i);
	 for(i=1;i<4;i++,p++)
	 {
       SendComm(0x33,i,*p);
	   Process(0x02);
     }	     
     WriteSafeMemory(0,0xff);
	 ReadSafeMemory(temp);
	 if((temp[0]&0x07)==0x07) return(0x1);	 
 }
 return(0);
}

/**************读安全存储器************/
void ReadSafeMemory(uchar *p)
{
     uchar i;
     SendComm(0x31,0xff,0xff);
     for(i=0;i<4;i++)
 	 {*p=ReadByte();
	  p++;}
}

/*************写安全存储器***************/
void WriteSafeMemory(uchar Address,uchar Data)
{
    SendComm(0x39,Address,Data);//Address=0,1,2,3
	Process(0xff);
}
//-----------------------------------------------------------------------------
// 函数名称: SendComm()
// 入口参数:  a: 命令字;
//            b: 地址;
//            c: 数据
// 函数功能: 发送一个完整的命令
//-------------------------------------------------------------------------------
void SendComm(uchar a,uchar b,uchar c)
{
    StartComm();          //开始发送命令
    WriteByte(a);          //a: 发命令字
    WriteByte(b);          //b: 发地址
    WriteByte(c);          //c: 发数据
    StopComm();           //结束发送命令
}

⌨️ 快捷键说明

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