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

📄 11d.c

📁 射频读写模块是采用最新Mifare技术的微型嵌入式非接触式IC卡读写模块。内嵌ISO14443 Type A协议解释器,并具有射频驱动及接收功能,可以简单实现对MifareOne等卡片的读写操作,读写
💻 C
字号:
#include <reg51.h>
#include "intrins.h"

#define	BYTE  unsigned char

sbit UART_RX_BIT    =P3^1;
sbit UART_TX_BIT    =P3^2;
sbit DIG1           =P3^4;
sbit DIG2           =P3^5;

BYTE SendData[32],ReciData[10];
BYTE tmpCardNo[4];
BYTE tmpResult;

void SoftUART_PutByte(BYTE psData);
BYTE SoftUART_GetByte(void);
BYTE XORCheck(BYTE *psData,BYTE length);

//void Delay_10ms(void);

void Delay_52us_NOP(void);
void Delay_26us_NOP(void);
// 	19200 BAUD
//      1   Bit  = 1/19200 = 52us
//      1.5 Bit  = 52us + 0.5 * 52us = 78us
//      1   Byte = 52 * 10 = 520us
BYTE Commu_Test(void);
BYTE DownLoad_Psd(BYTE BlockNo,BYTE KeyType,BYTE *CardKey);
BYTE Search_Card(void);
BYTE Psd_Verify(BYTE BlockNo,BYTE KeyType,BYTE *CardNo);
BYTE Read_Card(BYTE BlockNo);
BYTE Write_Card(BYTE BlockNo,BYTE *CardData);
BYTE TurnOff_Card(void);
BYTE Shut_RF(BYTE OnOff);
void BuzzOne(BYTE Time);	
void SetRes(BYTE RES,BYTE NUM);
void Display(BYTE dispData);




void main(void)
{
 BYTE tmpKeyType,tmpBlockNo,tmpKey[6];
 BYTE tmpData[16];
 

 BYTE tmpRes; 
 BYTE i;

 tmpKeyType = 0;       // KEY A
 tmpBlockNo = 4;       // Block 4
 for(i=0;i<6;i++) tmpKey[i] = 0xFF;
 for(i=0;i<4;i++) tmpCardNo[i]=0;
 for(i=0;i<16;i++) tmpData[i]=i;

 for(;;)
 {
   //Step1:通讯测试
   tmpRes=Commu_Test();
   SetRes(tmpRes,1);
   //Step2:下载密码
   tmpRes=DownLoad_Psd(tmpBlockNo,tmpKeyType,tmpKey);
   SetRes(tmpRes,2);
   //Step3:寻卡
   tmpRes=Search_Card();
   SetRes(tmpRes,3);
   //Step4:验证密码
   tmpRes=Psd_Verify(tmpBlockNo,tmpKeyType,tmpCardNo);
   SetRes(tmpRes,4);
   //Step5:读卡
   tmpRes=Read_Card(tmpBlockNo);
   SetRes(tmpRes,5);
   //Step6:写卡
   tmpRes=Write_Card(tmpBlockNo,tmpData);
   SetRes(tmpRes,6);
   //Step7:关闭卡
   tmpRes=TurnOff_Card();
   SetRes(tmpRes,7);
   //Step8:关闭或打开射频电路
   tmpRes=Shut_RF(1);
   SetRes(tmpRes,8);
   //Additianl:蜂鸣器
   BuzzOne(200);
//-------------------------------
   Display(tmpResult);	

 }
}
//***************************************************
void SoftUART_PutByte(BYTE psData)
{
        BYTE i;
        BYTE UART_Data;

        UART_Data = psData;

        for(i = 0; i < 10; i++)
        {
                if(i == 0)
                {
                        UART_TX_BIT = 0;   // generate start bit
                }
                else if(i == 9)
                {
                        UART_TX_BIT = 1;   // generate stop bit
                }
                else
                {
	                if(UART_Data & 0x01)
	                {
                                UART_TX_BIT = 1;   // generate HIGH level
                        }
	                else
	                {
                                UART_TX_BIT = 0;   // generate LOW level
                        }

	                UART_Data >>= 1;
                }

                Delay_52us_NOP();
        }
}
//-----------------------------------------------
BYTE SoftUART_GetByte(void)
{
        BYTE i;
        BYTE UART_Data;

        UART_Data = 0x00;

// 增加超时处理: 未连接/未上电/通讯错误等

        while(UART_RX_BIT);        // Wait for start bit

        Delay_52us_NOP();
        Delay_26us_NOP();

        for(i = 0; i < 8; i++)
        {
                if(UART_RX_BIT)
                {
                        if(i < 8) UART_Data |= 0x80;
	        }
                if(i < 7) UART_Data >>= 1;

                Delay_52us_NOP();

        }

        UART_RX_BIT = 1;

        return UART_Data;
}
BYTE XORCheck(BYTE *psData,BYTE length)
{
	BYTE i;
	BYTE XORData;

	XORData = 0;

	for(i = 0; i < length; i++)
	{
	        XORData ^= psData[i];
	}

	return XORData;
}
void Delay_52us_NOP(void)
{
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
void Delay_26us_NOP(void)
{
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();
}
//------------------------------------------------------------------
//------------------------------------------------------------------
//------------------------------------------------------------------
BYTE Commu_Test(void)
{
        BYTE i;

//--------------------------------------------------------------------
// command:3C 04 00 60 00 00  BCC 0D
// send 8 byte
//--------------------------------------------------------------------
        SendData[0] = 0x3c;
        SendData[1] = 0x04;
        SendData[2] = 0x00;
        SendData[3] = 0x60;
        SendData[4] = 0x00;
        SendData[5] = 0x00;
        SendData[6] = XORCheck(SendData,6);
        SendData[7] = 0x0d;

        for(i = 0; i < 8; i++)
        {
                SoftUART_PutByte(SendData[i]);
        }

//--------------------------------------------------------------------
// Right: 3C 01 01 BCC 0D
// Error: 3C 01 00 BCC 0D
//--------------------------------------------------------------------

        for(i = 0; i < 5; i++)
        {
                ReciData[i] = SoftUART_GetByte();
                if(ReciData[i] == 0x0d) break;
        }

        if(ReciData[2] != 0X01) return 1;
       
        return 0;
}
//------------------------------------------------------------------
BYTE DownLoad_Psd(BYTE BlockNo,BYTE KeyType,BYTE *CardKey)
{
        BYTE i;
//--------------------------------------------------------------------
// command:command:3C  0A 01 69 00(A套密码) 00(扇区号=00~15) 六字节卡密码 BCC 0D
//--------------------------------------------------------------------
        SendData[0] = 0x3c;
        SendData[1] = 0x0a;
        SendData[2] = 0x01;
        SendData[3] = 0x69;
        SendData[4] = KeyType;//0x00;
        SendData[5] = BlockNo;//0x00;
		for(i = 0; i < 6; i++) SendData[6 + i] = CardKey[i];
        SendData[12] = XORCheck(SendData,12);
        SendData[13] = 0x0d;

        for(i = 0; i < 13; i++)
        {
                SoftUART_PutByte(SendData[i]);
        }

//--------------------------------------------------------------------
// Right: 3C 02 00 00 BCC 0D
// Error: 3C 01 FF(错误返回代码) BCC 0D
//--------------------------------------------------------------------

        for(i = 0; i < 6; i++)
        {
                ReciData[i] = SoftUART_GetByte();
                if(ReciData[i] == 0x0d) break;
        }

        if(ReciData[1] != 0x02) return 1;
       
        return 0;
}
//------------------------------------------------------------------
BYTE Search_Card(void)
{
        BYTE i;

//--------------------------------------------------------------------
// command:command:3C 04 01 70 00(寻卡模式00(IDLE)或01(ALL)) 00 BCC 0D
//--------------------------------------------------------------------
        SendData[0] = 0x3c;
        SendData[1] = 0x04;
        SendData[2] = 0x01;
        SendData[3] = 0x70;
        SendData[4] = 0x00;
        SendData[5] = 0x00;
        SendData[6] = XORCheck(SendData,6);
        SendData[7] = 0x0d;

        for(i = 0; i < 8; i++)
        {
                SoftUART_PutByte(SendData[i]);
        }

//--------------------------------------------------------------------
// Right: 3C 05 四字节卡号 00 BCC 0D
// Error: 3C 01 FF(错误返回代码) BCC 0D
//--------------------------------------------------------------------

        for(i = 0; i < 9; i++)
        {
                ReciData[i] = SoftUART_GetByte();
                if(ReciData[i] == 0x0d) break;
        }

        if(ReciData[2] != 0x05) 
		{
		   for(i=0;i<4;i++) tmpCardNo[i]=ReciData[i+2];
		   return 1;
		   }
       
        return 0;
}
//------------------------------------------------------------------
BYTE Psd_Verify(BYTE BlockNo,BYTE KeyType,BYTE *CardNo)
{
        BYTE i;

//--------------------------------------------------------------------
// command:3C 08 01 6A 00(A密码或B密码01) 00(块号) 四字节卡号 BCC 0D
//--------------------------------------------------------------------
        SendData[0] = 0x3c;
        SendData[1] = 0x08;
        SendData[2] = 0x01;
        SendData[3] = 0x6a;
        SendData[4] = KeyType;//0x00;
        SendData[5] = BlockNo;//0x00;
		for(i = 0; i < 4; i++) SendData[6 + i] = CardNo[i];
        SendData[10] = XORCheck(SendData,10);
        SendData[11] = 0x0d;

        for(i = 0; i < 12; i++)
        {
                SoftUART_PutByte(SendData[i]);
        }

//--------------------------------------------------------------------
// Right: 3C 02 00 00 BCC 0D
// Error: 3C 01 FF(错误代码) BCC 0D
//--------------------------------------------------------------------

        for(i = 0; i < 6; i++)
        {
                ReciData[i] = SoftUART_GetByte();
                if(ReciData[i] == 0x0d) break;
        }

        if(ReciData[2] != 0x02) return 1;
       
        return 0;
}
//------------------------------------------------------------------
BYTE Read_Card(BYTE BlockNo)
{
        BYTE i;

//--------------------------------------------------------------------
// command:3C 04 01 66 00(绝对块号) 00 BCC 0D
//--------------------------------------------------------------------
        SendData[0] = 0x3c;
        SendData[1] = 0x04;
        SendData[2] = 0x01;
        SendData[3] = 0x66;
        SendData[4] = BlockNo;//0x00;
        SendData[5] = XORCheck(SendData,5);
        SendData[6] = 0x0d;

        for(i = 0; i < 7; i++)
        {
                SoftUART_PutByte(SendData[i]);
        }

//--------------------------------------------------------------------
// Right: 3C 12 00 DATA0~DATA15 BCC 0D
//Error: 3C 01 FF(错误返回代码) BCC 0D
//--------------------------------------------------------------------

        for(i = 0; i <5; i++)
        {
                ReciData[i] = SoftUART_GetByte();
                if(ReciData[i] == 0x0d) break;
        }

        if(ReciData[2] != 0x12) return 1;
       
        return 0;
}
//------------------------------------------------------------------
BYTE Write_Card(BYTE BlockNo,BYTE *CardData)
{
        BYTE i;

//--------------------------------------------------------------------
// command:3C 13 01 67 00(绝对块号) DATA0~DATA15 BCC 0D
//--------------------------------------------------------------------
        SendData[0] = 0x3c;
        SendData[1] = 0x13;
        SendData[2] = 0x01;
        SendData[3] = 0x67;
        SendData[4] = BlockNo;//0x00;
		for(i = 0; i < 15; i++) SendData[5 + i] = CardData[i];
        SendData[21] = XORCheck(SendData,21);
        SendData[22] = 0x0d;

        for(i = 0; i < 23; i++)
        {
                SoftUART_PutByte(SendData[i]);
        }

//--------------------------------------------------------------------
// Right: 3C  02 00 00 BCC 0D
//Error: 3C 01 FF(错误返回代码) BCC 0D
//--------------------------------------------------------------------

        for(i = 0; i < 6; i++)
        {
                ReciData[i] = SoftUART_GetByte();
                if(ReciData[i] == 0x0d) break;
        }

        if(ReciData[2] !=0x02) return 1;
       
        return 0;
}
//------------------------------------------------------------------
BYTE TurnOff_Card(void)
{
        BYTE i;

//--------------------------------------------------------------------
// command:3C 04 01 68 00 00 51 0D
//--------------------------------------------------------------------
        SendData[0] = 0x3c;
        SendData[1] = 0x04;
        SendData[2] = 0x01;
        SendData[3] = 0x68;
        SendData[4] = 0x00;
        SendData[5] = 0x00;
		SendData[6] = 0x51;
        SendData[7] = 0x0d;

        for(i = 0; i < 8; i++)
        {
                SoftUART_PutByte(SendData[i]);
        }

//--------------------------------------------------------------------
//  Right: 3C 02 00 00 3E 0D
//Error: 3C 01 FF (错误返回代码)BCC 0D
//--------------------------------------------------------------------

        for(i = 0; i < 6; i++)
        {
                ReciData[i] = SoftUART_GetByte();
                if(ReciData[i] == 0x0d) break;
        }

        if(ReciData[2] != 0x02) return 1;
       
        return 0;
}
//------------------------------------------------------------------
BYTE Shut_RF(BYTE OnOff)
{
        BYTE i;

//--------------------------------------------------------------------
// command:3C 03 01 72 00(00-关闭射频电路,01-唤醒射频电路) BCC 0D
//--------------------------------------------------------------------
        SendData[0] = 0x3c;
        SendData[1] = 0x03;
        SendData[2] = 0x01;
        SendData[3] = 0x72;
        SendData[4] = OnOff;
        SendData[5] = XORCheck(SendData,5);
        SendData[6] = 0x0d;

        for(i = 0; i < 7; i++)
        {
                SoftUART_PutByte(SendData[i]);
        }

//--------------------------------------------------------------------
// Right:3C 02 00 00 BCC 0D  
//Error:3C 01 FF (错误返回代码)BCC 0D
//--------------------------------------------------------------------

        for(i = 0; i < 6; i++)
        {
                ReciData[i] = SoftUART_GetByte();
                if(ReciData[i] == 0x0d) break;
        }

        if(ReciData[2] != 0x02) return 1;
       
        return 0;
}
//------------------------------------------------------------------
void BuzzOne(BYTE Time)
{
        BYTE i;

//--------------------------------------------------------------------
// command:3C 03 01 6B 55(TIME)  BCC 0D
//--------------------------------------------------------------------
        SendData[0] = 0x3c;
        SendData[1] = 0x03;
        SendData[2] = 0x01;
        SendData[3] = 0x6b;
		SendData[4] = Time;
        SendData[5] = XORCheck(SendData,5);
        SendData[6] = 0x0d;

        for(i = 0; i < 7; i++)
        {
                SoftUART_PutByte(SendData[i]);
        }

}
void SetRes(BYTE RES,BYTE NUM)
{
        BYTE temp1,temp2;
        if(RES==0) 
         {
		   temp1=0xFF<<NUM;
           temp2=0xFF>>7-NUM;
           tmpResult=temp1||temp2;
		 }
		
}
void Display(BYTE dispData)
{
        P1=dispData;
 	    //_clr_(DIG1);
		//delay(10);
		//_setb_(DIG1);
		P1=~dispData;
		//_clr_(DIG2);
		//delay(10);
		//_setb(DIG2);

}

⌨️ 快捷键说明

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