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

📄 eic_c.c

📁 C51编写的IC卡读写程序
💻 C
字号:
#include<AT892051.h>

#define	PIN_IO		P3_5			/*	P1_2	*/
#define	PIN_PGM  	P1_4			/*	P1_3	*/
#define	PIN_FUS		P1_3			/*	P1_4	*/
#define	PIN_CLK 	P1_2			/*	P1_5	*/
#define	PIN_RST		P1_1			/*	P1_6	*/
#define	PIN_VCC		P1_0			/*	P1_7	*/
#define	IC_IN		P3_3

#define	IC_FZ		0x00			/*	;2 厂商代码区							*/
#define	IC_IZ		0x02			/*	;8 发行者区			*8 发行商代码区	*/
#define	IC_SC		0x0A			/*	;2 主密码区							*/
#define	IC_SCAC 	0x0C			/*	;1 主密码错误计数区					*/
#define	IC_CPZ		0x0D			/*	;8 代码保护区		*5 卡批号和编号		*/
#define	IC_SC1		0x15			/*	;2 一区密码			*1604			*/
#define	IC_SCAC1	0x17			/*	;1 一区密码错误计数					*/
#define	IC_EZ1		0x18			/*	;2 一区密钥							*/
#define	IC_E1AC		0x1A			/*	;1 一区密钥错误计数					*/
#define	IC_AZ1		0x1B			/*	;N 应用区一							*/
#define	ISSUE_DATE	0x1E			/*	;4 发卡日期							*/
#define	ISSUE_TIME	0x22			/*	;3 发卡时间							*/
#define	USER_NAME	0x25			/*	;8 用户姓名							*/
#define	USER_ID		0x2D			/*	;9 身份证号码							*/
#define	CARD_MONEY0	0x36			/*	;4 余额								*/	
#define	CARD_LEVEL0	0x3B			/*	;1 级别								*/
#define	CARD_CONSU0	0x3C			/*	;4  消费金额							*/
#define	CARD_MONEY1	0x41			/*	;4  余额		备份						*/
#define	CARD_LEVEL1	0x46			/*	;1  级别								*/
#define	CARD_CONSU1	0x47			/*	;4  消费金额							*/

#define	uchar	unsigned	char
#define	uint	unsigned	int
#define	ulong	unsigned	long

uchar	data	Rec_Buf[20];		/*	接收缓冲区			*/
uchar	data	Send_Buf[20];		/*	发送缓冲区			*/
uchar	data	Pause_Buf[10];		/*	数据暂存缓冲区		*/
uchar	data	Rec_Leng;			/*	所接收数据的长度		*/
uchar	data	Send_Leng;			/*	已发送数据的长度		*/
uchar	data	Count_Times;		/*	次数计数				*/
uchar	data	Count_Ms;			/*	毫秒计数				*/
uchar	data	Online_Count;		/*	IC卡在线计数			*/
uchar	data	Timeout_Count;		/*	通讯超时计数			*/
uchar	data	Old_Rec;			/*	上次所接收到的数据	*/
uchar	data	Old_Send;			/*	上次所发送到的数据	*/
uchar	data	Password[2];		/*	密码缓冲区			*/
uchar	data	IC_NO;				/*	IC卡卡型				*/

uint	data	Delay_Count;		/*	延时计数				*/


bdata	bit		Send_Flag;			/*	发送数据标志			*/
bdata	bit		Ic_Online;			/*	IC卡在线标志			*/
bdata	bit		Rec_Full;			/*	接收完一帧数据标志	*/
bdata	bit		Back_Up;			/*	数据须备份标志		*/
bdata	bit		Time_Out;			/*	通信超时标志			*/
bdata	bit		Ic_Inset;			/*	IC卡插入标志			*/
bdata	bit		Err_Ic;				/*	错卡标志				*/
bdata	bit		Compare_Flag;		/*	密码正确与否标志		*/
bdata	bit		Debug_Flag;			/*	调试程序标志			*/

void	My_Start( );
void	My_Work( );
void	My_End( );
void	Powoff_Ic( );
void	Powon_Ic( );
void	Delay_Ms( int delay_time );
void	Delay_Us( int delay_time );
void	Work_Ic( );
void	Test_Ic( );
void	No_Input( );
void	Find_Addr( int aim_addr );
void	Read_Ic( int aim_addr, char aim_leng );
void	Erase_Ic( int aim_addr, char aim_leng );
void	Write_Ic( int aim_addr, char aim_leng );
void	Compare_Password( int aim_addr );
bit		Write_Test( );
void	Compare_Aim( );

	
main( )
{
	My_Start( );
	My_Work( );
	My_End( );
}

void	My_Start( )
/*	初始化子程序	*/
{
	int		my_count = 0x7FFF;
	while( my_count != 0x00 )
	{
		my_count --;
	}
	PIN_VCC = 1;
	TMOD = 0x21;		/*定时器0和1为16位定时器方式*/
	TL0 = 0x66;
	TH0 = 0xFC;
    TL1 = 0xFD;
    TH1 = 0xFD;			/*波特率为9600bps(晶振为11.0592MHz)*/
    SCON  = 0x50;		/*方式3,置SM2,REN(允许串行接收),清TB8,RB8和中断标志*/
    IE = 0x92;
	TR0 = 1;
	TR1 = 1;
	PS = 1;
	Powoff_Ic( );
}

void 	Extern_Int0() 	interrupt 0 
/*	外部中断0	*/
{
	;
}

void 	Time_Int0() 	interrupt 1 
/*	定时器中断0	*/
{
	TR0 = 0;
	TL0 = 0x66;
	TH0 = 0xFC;
    TR0 = 1;
	Delay_Count --;
	Count_Ms ++;
	if( !IC_IN )
	{
		if( !Ic_Online )
		{
			Online_Count ++;
			if( Online_Count > 0xE0 )
			{
				Ic_Inset = 1;
				Ic_Online = 1;
				Timeout_Count = 0;
			}
		}
	}
	else
	{
		Ic_Online = 0;
		Online_Count = 0;
	}
	if( Ic_Online )
	{
		if( !Time_Out )
		{
			if( Count_Ms > 0xFA )
				Timeout_Count ++;
			if( Timeout_Count > 0x14 )
				Time_Out = 1;
		}
	}
}

void 	Extern_Int1() 	interrupt 2 
/*	外部中断1	*/
{
	;
}

void 	Time_Int1() 	interrupt 3 
/*	定时器中断1	*/
{
	;
}

void 	Communication_Int0()	interrupt 4 
/*	串口通讯中断0	*/
{
	uchar	comm_char;
	if( RI )
	{
		comm_char = SBUF;
		RI = 0;
		if( !Rec_Full )
		{
			if( comm_char == 0x7B )
			{
				if( Old_Rec == 0x7B )
				{
					Rec_Buf[Rec_Leng++] = comm_char;
					comm_char =0x00;
				}
			}
			else
			{
				if( Old_Rec == 0x7B )
				{
					Rec_Leng = 00;
					Rec_Buf[Rec_Leng++] = Old_Rec;
				}
				Rec_Buf[Rec_Leng++] = comm_char;
			}
			Old_Rec = comm_char;
		}
		if( Rec_Leng > 0x05 )
		{
			if( Rec_Leng == Rec_Buf[2] );
				Rec_Full = 1;
		}
	}
	else 
	{
		TI = 0;
		if( Send_Flag )
		{
			if( Send_Leng < Send_Buf[2] + 1 )
			{
				SBUF = Send_Buf[Send_Leng++];
			}
			else
			{
				Send_Flag = 0;
				Send_Leng = 0;
			}
		}	
	}
	Time_Out = 0;
}


void	Powoff_Ic( )
/*	IC卡下电子程序	*/
{
	Delay_Ms( 300 );
	PIN_IO = 0;
	PIN_PGM = 0;
	PIN_FUS = 0;
	PIN_CLK = 0;
	PIN_RST = 0;
	Delay_Ms( 5 );
	PIN_VCC	= 1;
	Delay_Ms( 200 );
}

void	Powon_Ic( )
/*	IC卡上电子程序	*/
{
	if( !Ic_Online )
		return;
	PIN_RST = 0;
	PIN_CLK = 0;
	Delay_Ms( 5 );
	PIN_VCC = 0;
	PIN_IO = 0;
}

void	Delay_Ms( int delay_time )
/*	延时N毫秒子程序		*/
{
	Delay_Count = delay_time;
	while( Delay_Count != 0 )
	{
		;
	}
}
void	Delay_Us( int delay_time )
/*	延时N微秒子程序		*/
{
	delay_time -= 4;
	while( delay_time > 0)
		delay_time--;
}

void	My_Debug( )
/*	调试子程序	*/
{
	int		aim_addr;
	aim_addr = IC_SC * 8;
	Powon_Ic( );
	Password[0] = 0x23;
	Password[1] = 0x23;
	while( !Debug_Flag );
	Compare_Password( aim_addr );
	if( Write_Test( ) )
	{
		Compare_Flag = 1;
	}
	else
	{
		Compare_Flag = 1;
	}
	Rec_Buf[3] = 0x01;
	Rec_Buf[4] = 0x00;
	Work_Ic( );
	Rec_Buf[3] = 0x02;
	Rec_Buf[4] = 0x00;
	Work_Ic( );
	Powoff_Ic( );
}

void	My_Work( )
{
	/*My_Debug( );*/
	while( 1 )
	{
		if( Ic_Inset )
		{
			Ic_Inset = 0;
			Powon_Ic( );
			Delay_Ms( 200 );
			Powoff_Ic( );
			Delay_Ms( 100 );
			Powon_Ic( );
			Test_Ic( );
		}
		if( Ic_Online )
		{
			if( ( !PIN_VCC ) && Time_Out )
			{
				Powoff_Ic( );
			}
			if( Rec_Full )
			{
				Rec_Full = 0;
				if( PIN_VCC )
					Powon_Ic( );
				Work_Ic( );
			}
		}
		else
		{
			if( Rec_Full )
			{
				No_Input( );
			}
		}
	}
}

void	Work_Ic( )
/*	对IC卡操作子程序	*/
{
	uchar	ctrl_1, ctrl_0;
	int		aim_addr;
	char	aim_leng;
	if( Err_Ic )
	{
		No_Input( );
		return;
	}
	ctrl_1 = Rec_Buf[3];
	ctrl_0 = Rec_Buf[4];
	switch( ctrl_1 )
	{
		case	0x01	:
			{
				switch( ctrl_0 )
				{
					case	0x00	:
						{
							aim_addr = IC_IZ * 8;
							aim_leng = 0x06;
						}
						break;
					case	0x01	:
						{
							
						}
						break;
					case	0x02	:
						{
							
						}
						break;
					case	0x03	:
						{
							
						}
						break;
					case	0x04	:
						{
							
						}
						break;
					case	0x05	:
						{
							
						}
						break;
					case	0x06	:
						{
							
						}
						break;
					case	0x07	:
						{
							
						}
						break;
					case	0x08	:
						{
							
						}
						break;
					case	0x09	:
						{
							
						}
						break;
					case	0x0A	:
						{
							
						}
						break;
					case	0x0B	:
						{
							
						}
						break;
					case	0x0C	:
						{
							
						}
						break;
					case	0x0D	:
						{
							
						}
						break;
					default			:
						break;
				}
				Write_Ic( aim_addr, aim_leng );
			}
			break;
		case	0x02	:
			{
				switch( ctrl_0 )
				{
					case	0x00	:
						{
							aim_addr = 8;
							aim_leng = 0x0A;
						}
						break;
					case	0x01	:
						{
							
						}
						break;
					case	0x02	:
						{
							
						}
						break;
					case	0x03	:
						{
							
						}
						break;
					case	0x04	:
						{
							
						}
						break;
					case	0x05	:
						{
							
						}
						break;
					case	0x06	:
						{
							
						}
						break;
					case	0x07	:
						{
							
						}
						break;
					case	0x08	:
						{
							
						}
						break;
					case	0x09	:
						{
							
						}
						break;
					case	0x0A	:
						{
							
						}
						break;
					case	0x0B	:
						{
							
						}
						break;
					case	0x0C	:
						{
							
						}
						break;
					case	0x0D	:
						{
							
						}
						break;
					default			:
						break;
				}
				Read_Ic( aim_addr, aim_leng );
			}
			break;
		case	0x03	:
			{
				switch( ctrl_0 )
				{
					case	0x00	:
						{
							
						}
						break;
					case	0x01	:
						{
							
						}
						break;
					case	0x02	:
						{
							
						}
						break;
					case	0x03	:
						{
							
						}
						break;
					case	0x04	:
						{
							
						}
						break;
					case	0x05	:
						{
							
						}
						break;
					case	0x06	:
						{
							
						}
						break;
					case	0x07	:
						{
							
						}
						break;
					case	0x08	:
						{
							
						}
						break;
					case	0x09	:
						{
							
						}
						break;
					case	0x0A	:
						{
							
						}
						break;
					case	0x0B	:
						{
							
						}
						break;
					case	0x0C	:
						{
							
						}
						break;
					case	0x0D	:
						{
							
						}
						break;
					default			:
						break;
				}
			}
			break;
		default			:
			break;
	}
}

void	No_Input( )
/*	回答未插IC卡子程序	*/
{
	data	char	count;
	for( count = 0; count < 0x10; count++ )
	{
		Send_Buf[count] = count;
	}
	Send_Buf[2] = 0x06;
	Send_Leng = 0x00;
	Send_Flag = 1;
	SBUF = 0x99;
}

void	Test_Ic( )
/*	检测IC卡子程序	*/
{
	
}

void	My_End( )
/*	程序结束子程序	*/
{
	
}

void	Reset_Ic( )
/*	IC卡复位子程序	*/
{
	PIN_RST = 1;
	PIN_CLK = 1;
	Delay_Us( 8 );
	PIN_CLK = 0;
	Delay_Us( 8 );
	PIN_RST = 0;
	Delay_Us( 8 );
}

void	Find_Addr( int aim_addr )
/*	IC卡定位子程序	*/
{
	int		count;
	Reset_Ic( );
	for( count = 0; count < aim_addr; count ++ )
	{
		PIN_CLK = 1;
		Delay_Us( 8 );
		PIN_CLK = 0;
		Delay_Us( 8 );
	}
}

void	Read_Ic( int aim_addr, char aim_leng )
/*	从IC卡中读数据子程序	*/
{
	char	count;
	char	num;
	uchar	the_char;
	Find_Addr( aim_addr );
	PIN_RST = 0;
	PIN_PGM = 0;
	PIN_FUS = 1;
	PIN_CLK = 0;
	Delay_Us( 8 );
	for( count = 0; count < aim_leng; count ++ )
	{
		the_char = 0;
		for( num = 0; num < 0x08; num ++ )
		{
			PIN_IO = 1;
			Delay_Us( 8 );
			if( PIN_IO )
				the_char |= 0x01;
			PIN_CLK = 1;
			Delay_Us( 8 );
			PIN_CLK = 0;
			if( num != 0x07 )
				the_char <<= 1;
		}
		Pause_Buf[count] = the_char;
	}
}

void	Erase_Ic( int aim_addr, char aim_leng )
/*	檫除IC卡中的数据子程序	*/
{
	int		count;
	char	num;
	Find_Addr( aim_addr );
	PIN_RST = 0;
	PIN_FUS = 1;
	for( count = 0; count < aim_leng; count ++ )
	{	
		PIN_PGM = 1;
		PIN_IO = 1;
		Delay_Us( 8 );
		PIN_CLK = 1;
		Delay_Ms( 2 );
		PIN_PGM = 0;
		Delay_Ms( 3 );
		PIN_CLK = 0;
		Delay_Us( 8 );
		for(num = 0; num < 0x08; num ++ )
		{
			PIN_CLK = 1;
			Delay_Us( 8 );
			PIN_CLK = 0;
			Delay_Us( 8 );
		}
	}
}

void	Write_Ic( int aim_addr, char aim_leng )
/*	向IC卡中写数据子程序	*/
{
	int		count;
	char	num;
	uchar	the_char, *the_data;
	Erase_Ic( aim_addr, aim_leng );
	Find_Addr( aim_addr );
	PIN_RST = 0;
	PIN_FUS = 1;
	the_data = Pause_Buf;
	for( count = 0; count < aim_leng; count ++ )
	{
		the_char = *the_data;
		the_data ++;
		for( num = 0; num < 0x08; num ++ )
		{
			if( !(the_char & 0x80) )
			{
				PIN_IO = 1;
				Delay_Us( 8 );
				if( PIN_IO )
				{
					while( 1 )
					{
						PIN_PGM = 1;
						PIN_IO = 0;
						Delay_Us( 8 );
						PIN_CLK = 1;
						Delay_Ms( 2 );
						PIN_PGM = 0;
						Delay_Ms( 3 );
						PIN_CLK = 0;
						PIN_PGM = 0;
						Delay_Us( 8 );
						if( !PIN_IO )
							break;
					}
				}
			}
			the_char <<= 1;
			PIN_CLK = 1;
			Delay_Us( 8 );
			PIN_CLK = 0;
		}		
	}
}

void	Compare_Aim( )
/*	比较IC卡中的数据子程序		*/
{
	uchar	test_code;
	char	count, num;
	for( count = 0; count < 2; count ++ )
	{
		test_code = Password[count];
		for( num = 0; num < 8; num ++ )
		{
			PIN_CLK = 1;
			Delay_Us( 8 );
			if( test_code & 0x80 )
			{
				PIN_IO = 1;
			}
			else
			{
				PIN_IO = 0;
			}
			test_code <<= 1;
			Delay_Us( 8 );
			PIN_CLK = 0;
			Delay_Us( 8 );
		}
	}
}

bit		Write_Test( )
/*	IC卡写测试子程序	*/
{
	uchar	count,num;
	if( IC_NO == 0 )
	{
		num = 8;
	}
	else 
		if( IC_NO == 1 )
		{
			num = 4;
		}	
	for( count = 0; count < num; count ++ )
	{
		PIN_CLK = 1;
	   	Delay_Us( 8 );
	   	PIN_CLK = 0;
	   	PIN_IO = 1;                		/*	读出SCAC或ECAC中的第一位	*/
	   	Delay_Us( 8 );
	   	if( PIN_IO )
	   		break;						/*	为'1'则密码正确			*/
	   	if( count == num - 1 )
	   	return( 0 );
	}
	PIN_PGM = 1;         				/*	写该位为'0'				*/
	PIN_IO = 0;
	Delay_Us( 8 );
	PIN_CLK = 1;
	Delay_Ms( 2 );
	PIN_PGM = 0;
	Delay_Ms( 3 );
	PIN_CLK = 0;
	PIN_IO = 1;         				/*	校验是否写正确			*/
	Delay_Us( 8 );
	if( PIN_IO )
		return( 0 );
	PIN_PGM = 1;         				/*	擦除SCAC或ECAC			*/
	PIN_IO = 1 ;
	Delay_Us( 8 );
	PIN_CLK =1;
	Delay_Ms( 2 );
	PIN_PGM = 0;
	Delay_Ms( 3 );
	PIN_CLK =0;
	Delay_Us( 8 );
	return( PIN_IO );	
}

void	Compare_Password( int aim_addr )
/*	比较IC卡的密码子程序	*/
{
		EA = 0;
		TR0 = 0;
		aim_addr--;
		Find_Addr( aim_addr );
		Compare_Aim( );
		EA = 1;
		TR0 = 1;	
}

⌨️ 快捷键说明

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