设为首页
加入收藏
联系我们
 
您当前的位置:工控资源网 ->文章中心 ->技术文章 -> 文章内容 退出登录 用户管理
栏目导航
· 网站首页 · 维修指南
· 技术文章 · 家电专栏
· 培训资讯 · 展会信息
· 电脑专栏 · 关于本站
热门文章
· [培训资讯] 6月22日西门子S7-30..
· [培训资讯] 6月22日西门子300/4..
· [培训资讯] 9月份北京工控自动化..
· [技术文章] 从入门到精通:学PLC..
· [培训资讯] 6月22日西门子博途1..
· [家电专栏] 电磁炉原理与维修
· [维修指南] 变频器维修经验
· [技术文章] 可编程控制器梯形图..
· [技术文章] 车间主任岗位责任制..
· [维修指南] 变频器维修常用检测..
· [技术文章] PLC可编程序控制器基..
· [培训资讯] 2月15日欧姆龙PLC编..
相关文章
· [推荐] 6月22日西门子S7-300/400 PL..
· [推荐] 6月22日西门子300/400PLC编程..
· [新闻] 9月份北京工控自动化培训中心..
· [转载] 从入门到精通:学PLC之路详解..
· [推荐] 6月22日西门子博途1500 PLC..
· [推荐] 电磁炉原理与维修
· [推荐] 变频器维修经验
· [推荐] 可编程控制器梯形图的设计方..
· [转载] 车间主任岗位责任制
· [推荐] 变频器维修常用检测方法
· [推荐] PLC可编程序控制器基础知识
· [推荐] 2月15日欧姆龙PLC编程应用培..
IC逻辑加密卡的程序
作者:不详  来源:转载  发布时间:2008-08-20 09:20:34  发布人:admin

减小字体 增大字体

* iccard.h
前一阵子做了个IC卡读写程序,可以读写SLE4442系统逻辑加密卡的,本来想在网上找一个,没找到,自己写了一个,为了让后来人可以轻松一点,所以就奉献给大家:)
注释比较少(本人的坏习惯),看起来有点累,不过建议你在自己看之前先熟悉一下SLE4442的协议。
程序是经过测试的,在我的931上工作的很好,有什么问题,发信给我
Ploto_zhu@etang.com  
*/
#ifndef IC_CARD_H
#define IC_CARD_H
#include <REG931.H>

#define  RdMainMem   0x30        // outgoing data
#define  UpdMainMem  0x38        // processing 
#define  RdPrtMem     0x34        // outgoing data
#define  WrPrtMem    0x3C        // processing
#define  RdSecMem     0x31        // outgoint data
#define  UpdSecMem   0x39        // processing
#define  CmpVerDat   0x33        // processing


sbit CCIO  = P0^3;
sbit CCRST = P0^1;
sbit CCCLK = P0^2;
sbit CCIN  = P2^7;

#ifndef uchar
#define uchar unsigned char 
#endif 
void IC_Reset(uchar *buffer);
void ReadMainMemory(uchar addrFrom,uchar* buffer,uchar ulen);
void ReadProtectedMem(uchar rdBuf[4]) ;
void UpdateMainMemory(uchar addr,uchar value) ;
void WriteProtectedMem(uchar addr, uchar value)  ;
void ReadSecMemory(uchar buffer[4])  ;
void UpdateSecMem(uchar addr, uchar value)   ;
bit CompareVerifData(uchar value[3])   ;

#endif

/* ---------------------   ICCard.c ----------*/
#include "iccard.h"
#include <REG931.H>
/*  2005-9-4 常州中天科技有限公司 祝启忠*/
#ifndef uchar 
#define uchar unsigned char 
#endif
//sbit CCRST=P0^1;
//sbit CCCLK=P0^2;
//sbit CCIO=P0^3;
//void sendtoPC(uchar*);
//void sendBuffer(char* buf,char len) ;

void Delay(int x)
{
    int i;
    for(i=(x<<1);i>0;i--);
}

void OnePlus()
{
    CCCLK=1;
    Delay(20);
    CCCLK=0;
    Delay(20);
}
unsigned char ReadByte()
{
    uchar TempByte;
    uchar Value;
    uchar i;
    Value=0;
    for(i=0;i<8;i++)
    {
        CCCLK=1;
        TempByte=(unsigned char)CCIO;
        Delay(10);
        CCCLK=0;
        Delay(10);
        Value |= (TempByte<<i);
    }
    return Value;
}
void ICSendByte(uchar byte)
{
    uchar TempByte;
    uchar i;
    for(i=0;i<8;i++)
    {
        TempByte= ((byte>>i) & 0x01);
        CCIO=(bit)TempByte;
        Delay(8);
        CCCLK=1;
        Delay(10);
        CCCLK=0;
        Delay(8);
    }

}
void IC_Reset(uchar *buffer)
{
    uchar len;
    CCCLK=0;
    CCRST=0;
    CCIO=1;
    Delay(800);
    CCRST=1;
    Delay(10);
    CCCLK=1;
    Delay(10);
    CCCLK=0;
    Delay(50);
    CCRST=0;
    Delay(10);
    for(len = 0;len <4;len++)
        buffer[len]=ReadByte();
    
}


void SendCommand(uchar Cmd[3])
{
    uchar i;
    //start condition
    //当时钟线为高的时候,IO线从1到0
    CCCLK=0;
    CCIO=1;
    Delay(4);
    CCCLK=1;
    Delay(8);
    CCIO=0;
    Delay(8);

    CCCLK=0;
    Delay(5);  //start condition
    //data
    //IC卡在时钟的上升沿读取数据
    for(i=0;i<3;i++)
        ICSendByte(Cmd[i]);
    //stop condition
    //当时钟线为高的时候, IO从0到1
    CCIO=0;
    Delay(10);
    CCCLK=1;
    Delay(10);
    CCIO=1;
    //命令发送结束
    Delay(10);

}

//读取主存储器
void ReadMainMemory(uchar addrFrom,uchar* buffer,uchar ulen)
{
    unsigned int len;
    uchar buf[3];
    buf[0]=RdMainMem;
    buf[1]=addrFrom;
    buf[2]=0;
    SendCommand(buf);

//    sendtoPC(" send ok");
    //开始读取数据
    CCCLK=0;
    Delay(10);
    for(len=0;len<256-addrFrom;len++)
    {    
        if(len < ulen)
        {
            buffer[len]=ReadByte();
//            sendBuffer(&buffer[len],1);
        }
        else
        {    
            buf[0]=ReadByte();
//            sendBuffer(buf,1);    //要给脉冲,但丢弃数据
        }
    }
//    sendtoPC("Read OK");
    // 给个结束标志
    OnePlus();
}

//读取保护内容,一共32位,4个字节
void ReadProtectedMem(uchar rdBuf[4])
{
    uchar len;
    uchar buf[3];
    buf[0]=RdPrtMem;
    buf[1]=buf[2]=0;//addrFrom;
    SendCommand(buf);
    //开始读取数据
    CCCLK=0;
    Delay(10);
    for(len=0;len<4;len++)
    {    
        rdBuf[len]=ReadByte();
    }

    // 给个结束标志
    OnePlus();

}
//更新主存储器的内容
void UpdateMainMemory(uchar addr,uchar value)
{
    uchar len;
    uchar buf[3];
    buf[0]=UpdMainMem;
    buf[1]=addr;
    buf[2]=value;
    SendCommand(buf);
    //给脉冲
    CCCLK=0;
    Delay(10);
    CCIO=0;
    Delay(10);
    for(len=0;len<254;len++)
    {    
        OnePlus();
    }
    CCIO=1;
    Delay(10);
    OnePlus();


    //    OnePlus();
}
//更新保护存储器中的内容
void WriteProtectedMem(uchar addr, uchar value)
{
    uchar len;
    uchar buf[3];
    buf[0]=WrPrtMem;
    buf[1]=addr;
    buf[2]=value;
    SendCommand(buf);

    //给脉冲
    CCCLK=0;
    Delay(3);
    CCIO=0;
    Delay(10);
    for(len=0;len<254;len++)
    {    
        OnePlus();
    }
    CCIO=1;
    Delay(10);
    OnePlus();
}

//读取安全区的内容
void ReadSecMemory(uchar buffer[4])
{
    uchar len;
    uchar buf[3];
    buf[0]=RdSecMem;
    buf[1]=buf[2]=0xff;//addrFrom;
    SendCommand(buf);
    //开始读取数据
    CCCLK=0;
    Delay(10);
    for(len=0;len<4;len++)
    {    
        buffer[len]=ReadByte();
    }

    // 给个结束标志
    CCIO=1;
    Delay(10);
    OnePlus();

}
//更新安全区的内容
void UpdateSecMem(uchar addr, uchar value)
{
    uchar len;
    uchar buf[3];
    buf[0]=UpdSecMem;
    buf[1]=addr;
    buf[2]=value;
    SendCommand(buf);

    //给脉冲
    CCCLK=0;
    Delay(10);
    CCIO=0;
    Delay(10);
    for(len=0;len<254;len++)
    {    
        OnePlus();
    }
    CCIO=1;
    Delay(10);
    OnePlus();

}

//比较密码
bit CompareVerifData(uchar value[3])
{
    uchar len;
    uchar buf[4];
    ReadSecMemory(buf);
    if(buf[0]== 0)
        return 0;

    //正确,计数一次
//    if(buf[0]
    for(len =0;len <3;len++)
        if(buf[0] & (1 << len) )
        {
            buf[0] &= ~(1<<len);
            break;
        }
    UpdateSecMem(0,buf[0]);  
//    sendtoPC("Update OK");

    for(len = 0;len < 3;len++)
    {
         buf[0]=CmpVerDat;
        buf[1]=len+1;
        buf[2]=value[len];
        SendCommand(buf);
        
        //给脉冲
        CCCLK=0;
//        Delay(5);
        CCIO=0;
        Delay(10);
        OnePlus();
        OnePlus();

        CCIO=1;
        Delay(10);
        OnePlus();
    }


    UpdateSecMem(0,0xff);

    ReadSecMemory(buf);

    if(buf[0] & 0x07 == 0x07)
        return 1;
       else 
        return 0;

}
<--Adforward Begin:--><--Adforward End-->
[] [返回上一页] [打 印] [收 藏]
关于本站 - 公司简介 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 网站留言 - 企业邮局 - 管理登录
Copyright © 2007-2020 www.zggkzy.com All Rights Reserved .
公司地址:北京市大兴区康庄路原生墅康和园137号楼1-102
电话:010-67577139 13811659603 微信:13811659603
联系邮箱:zggkzyw@163.com 京ICP备11002135号
Powered by:工控Vsp4