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

📄 fm1702.c

📁 用c51驱动fm1702sl
💻 C
📖 第 1 页 / 共 3 页
字号:
	/*~~~~~~~~~*/	Secnr = Block_Adr / 4;	MIF_Halt();	                        /* Halt */		temp = Request(RF_CMD_REQUEST_STD);	/* Request */		if(temp != FM1715_OK)	{		return(FM1715_REQERR);	}	temp = AntiColl();				    /* AntiCol */	if(temp != FM1715_OK)	{		return(FM1715_ANTICOLLERR);	}	temp = Select_Card();				/* Select */	if(temp != FM1715_OK)	{		return(FM1715_SELERR);	}#if 0	temp = Load_keyE2_CPY((Secnr % 16), Mode);		    /* LoadKey */	if(temp != TRUE)	{        return(FM1715_AUTHERR);	}	temp = Authentication(UID, Secnr, Mode);	/* Authentication */	if(temp != FM1715_OK)	{		return(FM1715_AUTHERR);	}#endif	return FM1715_OK;}/****************************************************************//*名称: MIF_Initival *//*功能: 该函数实现MIFARE卡初始化值操作*//*输入: buff: 四个字节初始化数值起始地址*//* Block_Adr: 块地址*//*输出: FM1715_NOTAGERR: 无卡*//* FM1715_BYTECOUNTERR: 接收字节错误*//* FM1715_NOTAUTHERR: 未经权威认证*//* FM1715_EMPTY: 数据溢出错误*//* FM1715_CRCERR: CRC校验错*//* FM1715_PARITYERR: 奇偶校验错*//* FM1715_WRITEERR: 写卡块数据出错*//* FM1715_OK: 应答正确*//****************************************************************/uchar MIF_Initival(uchar idata *buff, uchar Block_Adr){	/*~~~~~~~~~~~~~~~~~*/	uchar idata	temp;	uchar		i;	/*~~~~~~~~~~~~~~~~~*/	for(i = 0; i < 4; i++)	{		*(buff + 4 + i) = ~(*(buff + i));	}	for(i = 0; i < 4; i++)	{		*(buff + 8 + i) = *(buff + i);	}	*(buff + 12) = Block_Adr;	*(buff + 13) = ~Block_Adr;	*(buff + 14) = Block_Adr;	*(buff + 15) = ~Block_Adr;	temp = MIF_Write(buff, Block_Adr);	return temp;}/****************************************************************//*名称: HL_Read *//*功能: 该函数实现高级读命令*//*输入: Secnr: 扇区号*//* Block_Adr: 块地址*//*输出: 操作状态码*//* 读出数据存于buffer中*//****************************************************************/uchar HL_Read(uchar idata *buff, uchar Block_Adr, uchar Mode){	/*~~~~~~~~~*/	uchar	temp;	/*~~~~~~~~~*/	temp = HL_Active(Block_Adr, Mode);	if(temp != FM1715_OK)	{		return temp;	}	/* Read */	temp = MIF_READ(buff, Block_Adr);	if(temp != FM1715_OK)	{		return temp;	}	return FM1715_OK;}/****************************************************************//*名称: HL_Write *//*功能: 该函数实现高级写命令*//*输入: buff: 待写入数据的首地址*//* Secnr: 扇区号*//* Block_Adr: 块地址*//*输出:操作状态码*//****************************************************************/uchar HL_Write(uchar idata *buff, uchar Block_Adr, uchar Mode){	/*~~~~~~~~~*/	uchar	temp;	/*~~~~~~~~~*/	temp = HL_Active(Block_Adr, Mode);	if(temp != FM1715_OK)	{		return temp;	}	/* Write */	temp = MIF_Write(buff, Block_Adr);	if(temp != FM1715_OK)	{		return FM1715_WRITEERR;	}	return FM1715_OK;}#endif///////////////////////////////////////////////////////////////////////// Delay 50us///////////////////////////////////////////////////////////////////////void delay_50us(unsigned char _50us){    while(_50us--)	{	    _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_();_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_();_nop_();_nop_();_nop_();	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();    }}///////////////////////////////////////////////////////////////////////// Delay 10ms///////////////////////////////////////////////////////////////////////void delay_10ms(unsigned int _10ms){#ifndef NO_TIMER2    RCAP2LH = RCAP2_10ms;    T2LH    = RCAP2_10ms;        TR2 = TRUE;    while (_10ms--)    {	    while (!TF2);	    TF2 = FALSE;    }    TR2 = FALSE;#else    while (_10ms--)    {	    delay_50us(19);	    if (CmdValid)	        return;	    delay_50us(20);	    if (CmdValid)	        return;	    delay_50us(20);	    if (CmdValid)	        return;	    delay_50us(20);	    if (CmdValid)	        return;	    delay_50us(20);	    if (CmdValid )	        return;	    delay_50us(20);	    if (CmdValid)	        return;	    delay_50us(20);	    if (CmdValid)	        return;	    delay_50us(20);	    if (CmdValid)	        return;	    delay_50us(20);	    if (CmdValid)	        return;	    delay_50us(19);	    if (CmdValid)	        return;    }#endif}///////////////////////////////////////////////////////////////////////// 接收和发送中断///////////////////////////////////////////////////////////////////////void isr_UART(void) interrupt 4 using 1{    unsigned char len, i;  	unsigned int j=0;  	  	if(RI)	{				len=SBUF;		RI=0;			for(i=0;i<len;i++)		{			while(!RI)			{				j++;				if(j>1000)				{				    break;				}			}			if(j<1000)			{				buffer[i]=SBUF;				RI=0;				j=0;			}			else			{			    break;			}		}		if(i==len)		{			REN=0;			CmdValid=1;		}	}	else if(!RI && TI)	{		TI=0;		len=buffer[0];		for(i=0;i<len+1;i++)		{			SBUF=buffer[i];			while(!TI);			TI=0;					}		REN=1;	}}///////////////////////////////////////////////////////////////////////// 系统初始化///////////////////////////////////////////////////////////////////////void init(void){	ET2 = 0; 		T2CON = 0x00;		    PCON = 0x80;                    SCON = 0x70;                     TMOD = 0x21;                //TMOD = 0x22;	TH1   = BAUD_9600;	TL1   = TH1;	TR1   = TRUE;               // 波特率发生器		TH0 = 0x60;    TL0 = 0x60;    TR0 = 0;        ET0=0;	ET1=0;	EA=1;	EX0=1;	//IT0 = 1;		TR2=0; 	ES = TRUE;    	EX1 = 0;	EX0 = 0;	CmdValid=0; 		SPEAKER=0;	LED = 0;		delay_10ms(30);	SPEAKER=1;	LED = 1;	delay_10ms(30);	SPEAKER=0;	LED = 0;		Init_FM1715();                 //初始化成 Type A 格式}///////////////////////////////////////////////////////////////////////// IC卡处理函数///////////////////////////////////////////////////////////////////////void cmd_execution(void){	unsigned char cmd,pass_type,temp;	unsigned char status;		pass_type = 0x60;	cmd = buffer[0];	switch(cmd)	{		case 1:             // Halt the card     //终止卡的操作			status=MIF_Halt();						buffer[0]=1;			buffer[1]=status;			break;					case 2:             	MIF_Halt();                                     //RF_CMD_REQUEST_ALL     RF_CMD_REQUEST_STD        	status = Request(RF_CMD_REQUEST_STD);		    /* Request */        	if(status != FM1715_OK)        	{        	    status = Request(RF_CMD_REQUEST_STD);		/* Request */        	    if(status != FM1715_OK)        	    {        	        buffer[0] = 1;        	        buffer[1] = status;        	        break;        	    }        	}			if(tagtype[0]==2)				cardtype=mifarepro;     // Mifare Pro 卡			else if(tagtype[0]==4)				cardtype=mifare1;       // Mifare One 卡			else if(tagtype[0]==16)				cardtype=mifarelight;   // Mifare Light 卡			else				cardtype=unknowncard;			buffer[0]=3;				buffer[1]=status;			buffer[2]=tagtype[0];			buffer[3]=tagtype[1];			break;	    case 3:                                 // 防冲突 读卡的系列号 MLastSelectedSnr			status = AntiColl();;			if(status!=FM1715_OK)			{				buffer[0]=1;					buffer[1]=FM1715_ANTICOLLERR;				break;			}			buffer[0]=5;			buffer[1]=status;			buffer[2]=UID[0];			buffer[3]=UID[1];			buffer[4]=UID[2];			buffer[5]=UID[3];			break;			case 4:		                    // 选择卡 Select Card			status=Select_Card();			if(status!=FM1715_OK)			{				buffer[0]=1;					buffer[1]=FM1715_SELERR;				break;			}			buffer[0]=1;			buffer[1]=status;						break;        case 6:     			pass_type = buffer[1];			status = Load_keyE2_CPY(&buffer[3]);			if(status != TRUE)			{			    buffer[0]=1;			    buffer[1]=status;			    break;        	}			status = Authentication(UID, buffer[2], buffer[1]);	        	if(status != FM1715_OK)        	{        		buffer[0]=1;			    buffer[1]=status;			    break;        	}			buffer[0]=1;			buffer[1]=status;						break;			case 8:  			status=MIF_READ(&buffer[2],buffer[1]);			if(status != FM1715_OK)			{			    buffer[0]=1;			    buffer[1]=status;			    break;			}			else			{				if(cardtype==mifare1||cardtype==mifarepro)					buffer[0]=17;				else if(cardtype==1)					buffer[0]=9;				else					buffer[0]=16;			}			buffer[1]=status;			break;			case 9:		    status=MIF_Write(&buffer[2],buffer[1]);			buffer[0]=1;			buffer[1]=status;						break;			case 10:			if(buffer[1] == RF_CMD_INC)			{			    status = MIF_Increment(&buffer[3],buffer[2]);			    MIF_Transfer(buffer[2]);			}			else if(buffer[1] == RF_CMD_DEC)			{			    status = MIF_Decrement(&buffer[3],buffer[2]);   			    MIF_Transfer(buffer[2]);			}			else			{			    status = 1;			}			buffer[0]=1;				buffer[1]=status;			break;		case 12:    			buffer[0]=1;			buffer[1]=0;			break;		case 14:                                 // 自动寻卡			status = Request(RF_CMD_REQUEST_STD);			while(status)			{			    status = Request(RF_CMD_REQUEST_STD);		    }			if(tagtype[0]==2)				cardtype=mifarepro;     // Mifare Pro 卡			else if(tagtype[0]==4)				cardtype=mifare1;       // Mifare One 卡			else if(tagtype[0]==16)				cardtype=mifarelight;   // Mifare Light 卡			else				cardtype=unknowncard;			buffer[0] = 3;				buffer[1] = status;			buffer[2] = tagtype[0];			buffer[3] = tagtype[1];			break;		case 16:		    temp = read_reg(0x09);        	temp = temp | (0x10);		    write_reg(0x09,temp);                   // PowerDown = 1       进入软件掉电模式		    buffer[0] = 1;	                    // 内部电流消耗模块包括晶振在内关闭			buffer[1] = 0;		    break;		case 17:		    temp = read_reg(0x09);        	temp = temp & (0xEF);		    write_reg(0x09,temp);                   // PowerDown = 0        退出软件掉电模式		    buffer[0] = 1;				buffer[1] = 0;		    break;		default:		    buffer[0] = 1;		    buffer[1] = 1;		    break;		}}void main(void){    unsigned char baud;        init();    while (1)    {	 	    if (CmdValid)	    {		    CmdValid = FALSE;		    if(buffer[0]==11)	    //为了加快相应速度 测试风鸣器		    {		    	buffer[2]=buffer[1];	  	    	buffer[0]=1;         //contact		    	buffer[1]=0;		    	CALL_isr_UART();				    	SPEAKER=1;		    	LED = 1;		    	delay_10ms(buffer[2]);		    	SPEAKER=0;		    	LED = 0;		    }	    	else if(buffer[0]==13)   //设置通讯波特率	    	{    			switch(buffer[1])    			{    				case 0:	    				baud=BAUD_9600;	    				break;	    			case 1:	    				baud=BAUD_19200;	    				break;	    			case 2:	    				baud=BAUD_38400;	    				break;	    			case 3:	    				baud=BAUD_57600;	    				break;	    			default:	    				baud=BAUD_9600;	    				break;	    		}					    		buffer[0]=1;	        //contact	    		buffer[1]=0;	    		CALL_isr_UART();	    		delay_10ms(5);				    		TR1   = 0;	    		TH1   = baud;	    		TL1   = TH1;	    		delay_10ms(2);	    		TR1   = TRUE;	    	}       		else    		{    			cmd_execution();        // 进入IC卡处理程序    			CALL_isr_UART();    		}    	}    }}

⌨️ 快捷键说明

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