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

📄 sle4442.c

📁 非接触式IC卡读和取程序与pcb设计原理图
💻 C
字号:

#include <stdio.h>
#include <intrins.h>
#include <reg51.h>
#include <sle4442.h>
/*********************************************************************  

函 数 名: ReadMainMem()
功    能: 读ic卡主存
说    明: 
调    用: 
全局变量:
入口参数: IC卡地址(32 - 255),指向内部RAM的指针,字节数
出口参数:指向内部RAM的指针 *pt
返 回 值: 无
设    计:zhaojunjie                   日期:2002-04-24
修    改:                             日期:
*********************************************************************/
void ReadMainMem(uchar addr,uchar idata *pt,uchar count)
{
    ResetCard();
    SendComm(RMM_COMM,addr,0xff);
    ReadMode(pt,count);
    BreakOperate();
}
/*********************************************************************  

函 数 名: WriteMainMem()
功    能: 写IC卡主存,一次 1Byte
说    明: 
调    用: 
全局变量:
入口参数: addr: IC卡地址(32 - 255), pt: 指向数据区的指针  i:字节数 
出口参数:无
返 回 值: 无
设    计:zhaojunjie                   日期:2002-04-24
修    改:                             日期:
*********************************************************************/
void WriteMainMem(uchar addr,uchar idata *pt)
{
    ResetCard();
    SendComm(WMM_COMM, addr, *pt);     //写主存的命令字,地址,数据
    ProcessMode();
    BreakOperate();    
}
/*********************************************************************  

函 数 名: ReadProtectMem()
功    能: 读保护存储器
说    明: 
调    用: 
全局变量:
入口参数: 指向直接寻址数据区的指针
出口参数:无
返 回 值: 无
设    计:zhaojunjie                   日期:2002-04-24
修    改:                             日期:
*********************************************************************/
void ReadProtectMem(uchar idata *pt)
{
    ResetCard();    
    SendComm(RPM_COMM,0xff,0xff); //读保护存储器的命令字,后两个参数忽略
    ReadMode(pt,4);               //读出
    BreakOperate();        
}
/*********************************************************************  

函 数 名: ProtectByte()
功    能: 保护一字节,注意待保护的字节是已经写入过的,地址只能在保护存储区内
说    明: 
调    用: 
全局变量:
入口参数: IC卡地址,指向直接寻址数据区的指针
出口参数:无
返 回 值: 无
设    计:zhaojunjie                   日期:2002-04-24
修    改:                             日期:
*********************************************************************/
void ProtectByte(uchar addr,uchar idata *pt)
{
    ResetCard();
    SendComm(WPM_COMM, addr, *pt); //写保护存储区的命令字,地址,数据
    ProcessMode();
    BreakOperate();            
}

/*********************************************************************  

函 数 名: SendComm()
功    能: 发送命令
说    明:
调    用: 
全局变量:
入口参数: a: 命令字, b: 地址, c: 数据
出口参数:无
返 回 值: 无
设    计:zhaojunjie                   日期:2002-04-24
修    改:                             日期:
*********************************************************************/
void SendComm(uchar a,uchar b,uchar c)
{
    StartComm();          //开始发送命令
    WriteByte(a);          //a: 发命令字
    WriteByte(b);          //b: 发地址
    WriteByte(c);          //c: 发数据
    StopComm();           //结束发送命令
}
/*********************************************************************  

函 数 名: StartComm()
功    能: 开始命令模式
说    明: (内部函数)
调    用: 
全局变量:
入口参数: 无
出口参数:无
返 回 值: 无
设    计:zhaojunjie                   日期:2002-04-24
修    改:                             日期:
*********************************************************************/
void StartComm(void)
{
    IC_CLK = 0;
    IC_IO  = 1;
    Delay5us();
    IC_CLK = 1;
    Delay5us();
    IC_IO  = 0;
    Delay5us();
}
/*********************************************************************  

函 数 名: StopComm()
功    能: 结束命令模式
说    明: (内部函数)
调    用: 
全局变量:
入口参数: 无
出口参数:无
返 回 值: 无
设    计:zhaojunjie                   日期:2002-04-24
修    改:                             日期:
*********************************************************************/
void StopComm(void)
{
    IC_CLK = 0;
    IC_IO  = 0;
    Delay5us();
    IC_CLK = 1;        //CLK: H
    Delay5us();
    IC_IO  = 1;        //IO : H
    Delay10us();
}
/*********************************************************************  

函 数 名: ResetCard()
功    能: 卡复位和复位应答
说    明: (内部函数)
调    用: 
全局变量:
入口参数: 无
出口参数:无
返 回 值: 无
设    计:zhaojunjie                   日期:2002-04-24
修    改:                             日期:
*********************************************************************/
void ResetCard(void)
{
    uchar temp;
    Delay5us();    
    IC_RST = 0;        
    IC_CLK = 0;     
    IC_IO  = 1;    
    Delay5us();  
    
    IC_RST = 1;
    Delay5us();
    IC_CLK = 1;
    Delay10us();
    Delay10us();
    Delay10us();
    Delay10us();
    IC_CLK = 0;
    Delay5us();
    IC_RST = 0;
    Delay10us();     //复位和复位应答时序
                     //      ___
                     //RST _|   |_______________________   
                     //       _   _        __   __
                     //CLK __|0|_|1|_ ..._|31|_|32|_____
                     //   _   __  __           ___  _____
                     //     \/  \/D0\ ...    \/D31\/
                     //I/O _/\__/\__/        /\___/
    
    temp = ReadByte();
    temp = ReadByte();
    temp = ReadByte();
    temp = ReadByte();   //空读 32Bit (4Byte)
    IC_CLK = 0;         //     __   __  IC sets I/O to state H
    Delay5us();         //CLK_|31|_|32|______________
    IC_IO  = 1;          //     __   ___  ____________
    _nop_();             //     30 \/ 31\/
    IC_CLK = 0;          //I/O  __ /\___/
    Delay5us();
    
}
/*********************************************************************  

函 数 名: BreakOperate()
功    能: SLE/4442 IC卡操作中止
说    明: (内部函数)
调    用: 
全局变量:
入口参数: 无
出口参数:无
返 回 值: uchar
设    计:zhaojunjie                   日期:2002-04-24
修    改:                             日期:
***********************************************************************/
void BreakOperate(void)
{
     IC_CLK = 0;
     IC_RST = 0;
     IC_IO  = 0;
     Delay5us();
     IC_RST = 1;
     IC_IO  = 1;
     Delay5us();
     IC_RST = 0;
     Delay5us();
}
/*********************************************************************  

函 数 名: ReadByte()
功    能: 从SLE4442读一个字节
说    明: (内部函数)
调    用: 
全局变量:
入口参数: 无
出口参数:无
返 回 值: uchar
设    计:zhaojunjie                   日期:2002-04-24
修    改:                             日期:
***********************************************************************/
uchar ReadByte(void)
{
    uchar i,ch;
    ch = 0;
    for (i = 8; i > 0; i--)
    {
        IC_CLK = 0;
        ch = ch >> 1;           //从低位读起 
        if((uchar)IC_IO)
            ch |= 0x80;
        Delay5us();
        IC_CLK = 1;
        Delay5us();
    }
    return ch;
}
/*********************************************************************  

函 数 名: WriteByte()
功    能: 往SLE4442写一个字节
说    明: (内部函数)
调    用: 
全局变量:
入口参数: uchar
出口参数:无
返 回 值: 无
设    计:zhaojunjie                   日期:2002-04-24
修    改:                             日期:
***********************************************************************/
void WriteByte(uchar ch)
{
    uchar i;
    for(i = 8; i > 0; i--)
    {
        IC_CLK = 0;
        IC_IO = (bit)(ch & 0x01);     
        Delay5us();
        IC_CLK = 1;
        Delay10us();
        ch = ch >> 1;                 //右移一位
    }
}
/*********************************************************************  

函 数 名: ReadMode()
功    能: 连续输入i(=<255)个字节,存放到以pt开头的内部单元中,必须在某一读数据命令模式之后使用
说    明: (内部函数)
调    用: 
全局变量:
入口参数: pt: 起始地址, count: 数据个数
出口参数:无
返 回 值: 无
设    计:zhaojunjie                   日期:2002-04-24
修    改:                             日期:
*********************************************************************/
void ReadMode(uchar idata *pt,uchar count)
{
    IC_CLK=0;
    Delay5us();
    do
    {
        *pt = ReadByte();    //读入一个字节
        pt++;                //指针加一
    }while(--count);             //计数器减一,判断
}
/*********************************************************************  

函 数 名: ProcessMode()
功    能: 处理模式,开始处理模式后,卡片将输入口拉低,处理完后输入口变成高电平
说    明: (内部函数)
调    用: 
全局变量:
入口参数: 无
出口参数:无
返 回 值: 无
设    计:zhaojunjie                   日期:2002-04-24
修    改:                             日期:
*********************************************************************/
void ProcessMode(void)
{
    uint i;
    IC_CLK = 0;
    Delay5us();    
    IC_IO  = 0;
    for (i = 255; i > 0; i--)
    {
        IC_CLK = 1;
        Delay5us();
        IC_CLK = 0;
        Delay5us();
    }
    IC_IO  = 1;
}
/*********************************************************************  

函 数 名: Verify()
功    能: 校验密码
说    明: 
调    用: 
全局变量:
入口参数: 指向存放密码的内部直接寻址RAM地址,
           密码:BCD 码,从低往高放,比如:114086  *pt = 0x11 *pt+1 = 0x40 *pt+2 = 0x86
出口参数:无
返 回 值: 成功返回1,失败返回0,卡片已锁也返回0
设    计:zhaojunjie                   日期:2002-04-24
修    改:                             日期:
*********************************************************************/
bit Verify(uchar idata *pt)
{
     uchar idata temp[4];                //暂存4字节的保密区内容
     uchar i;

     SendComm(RSM_COMM,0xff,0xff);        //读密码存储区的命令字,第2,3个参数在此命令中被忽略
     ReadMode(temp, 4);                   //读出
     if((temp[0] & 0x07) != 0)            //第一字节是错误计数器,如果错误计数器为0,直接退出
     {
         if((temp[0] & 0x07)==0x07)     // 00000111
                i = 0x06;
         else if((temp[0] & 0x07)==0x06)// 00000110 
                i = 0x04;
         else if((temp[0] & 0x07)==0x04)// 00000100
                   i = 0x00;               //将其中一位为1的改为0
        SendComm(WSM_COMM,0,i);            //修改错误计数器
        ProcessMode();                  //处理
        for (i = 1; i < 4; i++, pt++)   //校对3字节的密码
        {
             SendComm(VER_COMM,i,*pt);  //发出校对命令,
             ProcessMode();             //处理
        }
        SendComm(WSM_COMM,0,0xff);      //擦除计数器恢复错误计数器
        ProcessMode();                  //处理
        SendComm(RSM_COMM,0xff,0xff);   //读密码存储区的命令字,第2,3个参数在此命令中被忽略
        ReadMode(temp, 4);              //读错误计数器的内容
        if((temp[0] & 0x07)==0x07)      //如果没有被成功擦除,表明校对失败
             return 1 ;
     }
     return 0;
}
/******************************************************************** 

函 数 名:Delay10us()
功    能:延时10微秒(包括调用和返回的时间),f = 11.0592Mhz
说    明:
调    用:
入口参数:无
出口参数:无
返 回 值:无  
设    计:zhaojunjie           日    期:2002-04-24
修    改:                     日    期: 
***********************************************************************/
void Delay10us(void)
{
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}

/******************************************************************** 

函 数 名: Delay5us()
功    能:延时10微秒(包括调用和返回的时间),f = 11.0592Mhz
说    明:
调    用:
入口参数:无
出口参数:无
返 回 值:无  
设    计:zhaojunjie           日    期:2002-04-24
修    改:                     日    期: 
***********************************************************************/
void Delay5us(void)
{
    _nop_();
    _nop_();
    _nop_();
}
/*//////////////////////////////////////////////////////////////////////*/

 

⌨️ 快捷键说明

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