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

📄 demo_232.c

📁 非接触式IC卡编程样例232-C3
💻 C
字号:
#include <reg52.h>
#include <absacc.h>
#include "170cmd.h"

#define ALL            0x01
#define IDLE           0x00
#define KEYB           0x04
#define KEYA           0x00
#define KEYSET0        0x00
#define KEYSET1        0x01
#define KEYSET2        0x02
#define HF             0x40

#define D1WREN     0x02        
                               /*   对"数据块"2,3可写   */
#define D1RDEN     0x01        
                               /*   对"数据块"2,3可读   */
#define D2WREN     0x20        
                               /*   对"数据块"10,11可写 */
#define D2RDEN     0x10        
                               /*   对"数据块"10,11可读 */
#define KEYWREN    0x08        
                               /*   对密码可写            */
#define VALUEWREN  0x04        
                               /*    对16位"电子钱包"可写*/


#define RS232     1
#define LDSTD     0

#define REDLED    1              
#define GREENLED  2              
#define BELL      4              

#define LDCLK     P31
#define LDSDA     P30
#define MAXTIME   10    


unsigned char bdata ldchar;
sbit ldbit=ldchar^7;
unsigned char ld_flags;
unsigned char idata write_buff[32];
unsigned char iscom;


/********************************************************
*
*  常规子程序
*
********************************************************/

void delay_10us()
{
   unsigned char i;
   i=0;
   i=0;
   i=i+i;
}

void delay_50us(unsigned int us)
{
   unsigned char i;
   if(!us) return;
   do
   {
      i++;
	  i--;
	  delay_10us();
	  delay_10us();
	  delay_10us();
	  delay_10us();
   }
   while(--us);
}

void delayms(unsigned int ms)
{
   unsigned char i;
   if(!ms) return;
   do
   {
      i=70;
	  i+=1;
	  i+=1;
	  i+=1;
	  i+=1;
	  i+=1;
	  i-=1;
	  i-=1;
	  i-=1;
	  i-=1;
	  i-=1;
      do
	  {
         delay_10us();
	  }
      while(--i);
   }
   while(--ms);
}

/******************************************/
     /*       串口子程序          */
/******************************************/

void com_init()
{

    TMOD |= 0x20 ;              // set T/C mode 2, Baud set needed
    
    PCON |= 0x80 ;              // set SMOD=1, That mean baud K=2
    TH1   = 0xff ;              // set baudrate=57.6kbps
    
	TL1   = 0x00 ;
    SCON  = 0x50 ;              // set asci mode 1 and Receive Enable
    TR1   = 1    ;              // permit T1 timer, TCON register
    TI=0;
    RI=0;
}

unsigned char com_key()
{
    unsigned int i=0x100;
	do
    {
        if(RI) return 0x01;
    }
    while(--i);
	return 0x00;
}

unsigned char com_handkey()
{
    unsigned int i=0x4000;
	do
    {
        if(RI) return 0x01;
    }
    while(--i);
	return 0x00;
}


void com_send_char(unsigned char s_char)
{
    SBUF=s_char;                     // write a char to SBUF register
    while (!TI) ;                    // check until TI = 1
    TI=0;                            // reset TI
}

char com_get_char()
{
    char c;
    c=SBUF;                          // put the received char to buffer
    RI=0;                            // reset RI
    return (c) ;
}

char com_first_handed(void)
{
   com_send_char(0x23);
   if(!com_key())               return 0x01;
   if(com_get_char()!=0x45)     return 0x20;
   return 0x00;
}

char com_second_handed(void)
{
   if(!com_handkey())               return 0x01;
   if(com_get_char()!=0x67)     return 0x10;
   com_send_char(0x89);
   return 0x00;
}

unsigned char Mf_sendcmd(unsigned char cmd,unsigned char length)
{
   unsigned char i;
   unsigned char pc_cmd,pc_len,pc_jy;
   unsigned char temp_char;
   if(com_first_handed())       return 0xa1;

   pc_jy=0;
   com_send_char(cmd);
   pc_jy^=cmd;

   com_send_char(length);
   pc_jy^=length;

   for(i=0;i<length;i++)
   {
	   temp_char=write_buff[i];
	   com_send_char(temp_char);
	   pc_jy^=temp_char;
   }

   com_send_char(pc_jy);

   if(com_second_handed())      return 0xa2;

   pc_jy=0;
   if(!com_key())               return 0xa3;
   pc_cmd=com_get_char();
   pc_jy^=pc_cmd;

   if(!com_key())               return 0xa3;
   pc_len=com_get_char();
   pc_jy^=pc_len;

   for(i=0;i<pc_len;i++)
   {
       if(!com_key())           return 0xa3;
       temp_char=com_get_char();
       pc_jy^=temp_char;
       write_buff[i]=temp_char;
   }

   if(!com_key())               return 0xa3;
   if(com_get_char()!=pc_jy)    return 0xa4;
   return pc_cmd;
}


void debug_ml10()
{
	unsigned char status;
	unsigned char snr[4];
	unsigned char idata dat[4];
	unsigned char value[2];

    unsigned int i;
	unsigned int count;
	unsigned char bcmd,blen;
	unsigned char idata buff[22];

    /*通用测试程序<内部用>*/
	count=0;
    i=100;
    bcmd=0x00;
	blen=0x00;
	do
	{
	    for(status=0;status<21;status++)
		{
		    write_buff[status]=buff[status];
		}
		status=Mf_sendcmd(bcmd,blen);
		    
		if(status) count++;
		i--;
	}
	while(i);

    /*装载密码A*/
	write_buff[0]=KEYSET0|KEYA;
	write_buff[1]=0x00;
	write_buff[2]=0xff;
	write_buff[3]=0xff;
	write_buff[4]=0xff;
	write_buff[5]=0xff;
	write_buff[6]=0xff;
	write_buff[7]=0xff;
    status=Mf_sendcmd(LOADKEY,8);

    /*装载密码B*/
	write_buff[0]=KEYSET0|KEYB;
	write_buff[1]=0x00;
	write_buff[2]=0xff;
	write_buff[3]=0xff;
	write_buff[4]=0xff;
	write_buff[5]=0xff;
	write_buff[6]=0xff;
	write_buff[7]=0xff;
    status=Mf_sendcmd(LOADKEY,8);

	/*设置密码认证方式*/
    
	    /*用密码A认证*/
	    write_buff[0]=0x00;
        status=Mf_sendcmd(AUTHMODE,1);
  
	    /*用密码B认证*/
	    write_buff[0]=0x01;
        status=Mf_sendcmd(AUTHMODE,1);

    
    /*取卡序列号*/
	status=Mf_sendcmd(GETSNR,0);
    if(status) return;
    for(i=0;i<4;i++)
	{
	    snr[i]=write_buff[i];
	}

	/*读数据块*/
    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
	    write_buff[1+i]=snr[i];
	}
	status=Mf_sendcmd(READBLOCK,5);
    if(status) return;
    for(i=0;i<4;i++)
	{
	    dat[i]=write_buff[i];
	}

    /*写数据块*/
    for(i=0;i<4;i++)
	{
	    dat[i]=status+i;
	}

	write_buff[0]=4;
    for(i=0;i<4;i++)
	{
	   write_buff[1+i]=snr[i];
	}
    for(i=0;i<4;i++)
	{
	   write_buff[5+i]=dat[i];
	}
	status=Mf_sendcmd(WRITEBLOCK,9);
	if(status) return;

	/*写"电子钱包"*/ 
	value[0]=0x00;
	value[1]=0x01; 

    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
	    write_buff[1+i]=snr[i];
	}
    for(i=0;i<2;i++)
	{
	    write_buff[5+i]=value[i];
	}
	status=Mf_sendcmd(WRITEVALUE,7);
    if(status) return;
		
	/*读"电子钱包"*/
    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
	    write_buff[1+i]=snr[i];
	}
	status=Mf_sendcmd(READVALUE,5);
    if(status) return;
    for(i=0;i<2;i++)
	{
	    value[i]=write_buff[i];
	}

	/*减电子钱包*/
    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
	    write_buff[1+i]=snr[i];
	}
    for(i=0;i<2;i++)
	{
	    write_buff[5+i]=value[i];
	}
	status=Mf_sendcmd(DECREMENTVALUE,7);
    if(status) return;

	write_buff[0]=REDLED|GREENLED|BELL;
	write_buff[1]=10;
	write_buff[2]=2;
	write_buff[3]=2;
	status=Mf_sendcmd(ALARM,4);
    return;
}

void debug_m1()
{
	unsigned char status;
	unsigned char snr[4];
	unsigned char idata dat[16];
	unsigned char value[4];

    unsigned int i;
	unsigned int count;
	unsigned char bcmd,blen;
	unsigned char idata buff[22];

    /*通用测试程序<内部用>*/
	count=0;
    i=100;
    bcmd=0x00;
	blen=0x00;
	do
	{
	    for(status=0;status<21;status++)
		{
		    write_buff[status]=buff[status];
		}
		status=Mf_sendcmd(bcmd,blen);
		    
		if(status) count++;
		i--;
	}
	while(i);

	/*装载密码*/
       /*扇区号==0x01*/
	   write_buff[0]=0x01;

	write_buff[1]=0xa0;
	write_buff[2]=0xa1;
	write_buff[3]=0xa2;
	write_buff[4]=0xa3;
	write_buff[5]=0xa4;
	write_buff[6]=0xa5;
    status=Mf_sendcmd(TRANSKEY,7);

    /*取卡序列号*/
	status=Mf_sendcmd(GETSNR,0);
    if(status) return;
    for(i=0;i<4;i++)
	{
	    snr[i]=write_buff[i];
	}

	/*读数据块*/
    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
	    write_buff[1+i]=snr[i];
	}
	status=Mf_sendcmd(READBLOCK,5);
    if(status) return;
    for(i=0;i<16;i++)
	{
	    dat[i]=write_buff[i];
	}

    /*写数据块*/
    for(i=0;i<16;i++)
	{
	    dat[i]=status+i;
	}

	write_buff[0]=4;
    for(i=0;i<4;i++)
	{
	    write_buff[1+i]=snr[i];
	}
    for(i=0;i<16;i++)
	{
	    write_buff[5+i]=dat[i];
	}
	status=Mf_sendcmd(WRITEBLOCK,21);
	if(status) return;

    /*写电子钱包*/ 
    value[0]=0x00;
    value[1]=0x01; 
    value[2]=0x00; 
    value[3]=0x00; 

    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
        write_buff[1+i]=snr[i];
	}
    for(i=0;i<4;i++)
	{
        write_buff[5+i]=value[i];
	}
    status=Mf_sendcmd(WRITEVALUE,9);
    if(status) return;
		
    /*读"电子钱包"*/
    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
       write_buff[1+i]=snr[i];
	}
    status=Mf_sendcmd(READVALUE,5);
    if(status) return;
    for(i=0;i<4;i++)
	{
        value[i]=write_buff[i];
	}

    /*加"电子钱包"*/
    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
        write_buff[1+i]=snr[i];
	}
    for(i=0;i<4;i++)
	{
        write_buff[5+i]=value[i];
	}
    status=Mf_sendcmd(INCREMENTVALUE,9);
    if(status) return;

    /*减"电子钱包"*/
    write_buff[0]=4;
    for(i=0;i<4;i++)
	{
        write_buff[1+i]=snr[i];
	}
    for(i=0;i<4;i++)
	{
        write_buff[5+i]=value[i];
	}
    status=Mf_sendcmd(DECREMENTVALUE,9);
    if(status) return;

    write_buff[0]=REDLED|GREENLED|BELL;
    write_buff[1]=10;
    write_buff[2]=2;
    write_buff[3]=2;
    status=Mf_sendcmd(ALARM,4);
    return;
}

void main()
{
	unsigned char cardtype;
	unsigned char status;
	unsigned char snr[4];
	unsigned char value1[4];
	unsigned char value2[4];

	unsigned int i;
	unsigned int count;

	unsigned char idata dat[16];

	/*****************************/
	unsigned char idata buff[0x20];
    unsigned char bcmd;
	unsigned char blen;
	/*****************************/
	
	com_init();

	while(1)
	{
		delayms(1000);
        if(Mf_sendcmd(GETSNR,0))
		{
		    write_buff[0]=REDLED|GREENLED|BELL;
		    write_buff[1]=40;
		    write_buff[2]=8;
		    write_buff[3]=1;
		    status=Mf_sendcmd(ALARM,4);
		}
		else
		{
		    write_buff[0]=REDLED|GREENLED|BELL;
		    write_buff[1]=20;
		    write_buff[2]=4;
		    write_buff[3]=2;
		    status=Mf_sendcmd(ALARM,4);
		}
	}
	
	while(1)
	{
		/*联接*/
		status=Mf_sendcmd(STATUS,0);
		
		/*灯控*/
		write_buff[0]=REDLED|GREENLED|BELL;
		write_buff[1]=20;
		write_buff[2]=20;
		write_buff[3]=2;
		status=Mf_sendcmd(ALARM,4);
	    
		/*取模块标示号*/
		status=Mf_sendcmd(MCMNO,0);
	    
		/*取模块版本号*/
		status=Mf_sendcmd(MCMVER,0);
        
		/*取卡类型*/
		status=Mf_sendcmd(GETTYPE,0);
        if(status) continue;       /*没有卡,返回*/
        cardtype=write_buff[0];
		
		if(cardtype==0x04)
		{
            while(1)
			{
			    debug_m1();
			}
		}
		else
		{
            while(1)
			{
			    debug_ml10();
			}
		}
	}

	/******************************************************/
	/*      LD_sendcmd()返回代码表                        */
	/*  0XA1,0XA2,0XA3,0XA4  为主控程序通信错误返回代码   */
	/*  具体意义如下                                      */
	/*  0XA1   第一次握手错                               */
	/*  0XA2   第二次握手错                               */
	/*  0XA3   接受数据错                                 */
	/*  0XA4   接受数据校验错                             */
	/*                                                    */
	/*  其他错误代码是模块返回的错误代码                  */
	/*  具体意义参见《各模块》错误代码返回表              */
}

⌨️ 快捷键说明

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