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

📄 read2401a.c

📁 IC卡的读取源程序,包括源代码.Protel原理图和PCB图,直接就可以设计使用.
💻 C
字号:
#include "reg51.h"
#include "Read2401A.h"
#include "intrins.h"
main()
{
	init();
	for(;;)
	{	
		if(Card_In == True)
		{
			Card_Insert_Flag = True;
			Card_Insert_LED = ON;
		}
		else
		{
			Card_Insert_Flag = False;
			Card_Insert_LED = OFF;
			Card_Power_LED = OFF;
			Card_Write_LED = OFF;
			Card_Read_LED = OFF;
		}	
		if(Card_Insert_Flag == True)
		{

			if(Card_Power_Flag == True)
			{
				Card_Power_Control = True;
				Card_Power_LED = ON;
				NOP();
				NOP();
				if(Card_Write_Flag == True)
				{
					Card_Read_LED = OFF;
					Card_Write_LED = ON;
					Write_Card();
				}	
				if(Card_Read_Flag == True)
				{
					Card_Read_LED = ON;
					Card_Write_LED = OFF;
					Read_Card();
				}
			}
			else
			{	
				if(Card_Write_Flag == True)
				{
					Error_Send();
					Card_Write_Flag = False;
				}	
				if(Card_Read_Flag == True)
				{
					Error_Send();
					Card_Read_Flag = False;
				}
				Card_Power_Control = False;
				Card_Power_LED = OFF;
				Card_Write_LED = OFF;
				Card_Read_LED = OFF;
			}

		}
		else	
		{
			if(Card_Power_Flag == True)
			{
				Error_Send();
				Card_Power_Flag = False;
			}
			if(Card_Write_Flag == True)
			{
				Error_Send();
				Card_Write_Flag = False;
			}	
			if(Card_Read_Flag == True)
			{
				Error_Send();
				Card_Read_Flag = False;
			}
			Card_Power_Control = False;
			Card_Power_LED = OFF;
			Card_Read_LED = OFF;
			Card_Write_LED = OFF;
		}
	}
}

/*--------------------------------
启动卡函数
函数原型:Open_At24c01A()
功能:启动ic卡片
---------------------------------*/
void Open_At24c01A()
{
    NOP();
    SCL=0;
    NOP();
    RST=0;
    NOP();
    RST=1;
    NOP();
    SDA=1;
    NOP();
    SCL=1;
    NOP();
    SCL=0;
    NOP();
    RST=0;
}
/*--------------------------------
关闭卡函数
函数原型:Close_At24c01A()
功能:关闭ic卡片
---------------------------------*/
void Close_At24c01A()
   {
      SDA=0;
      NOP();
      SCL=0;
      NOP();
      RST=0;
      NOP();
   }
/*--------------------------------
延时
函数原型:Nop();
功能:延时
---------------------------------*/
void NOP()
{
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}

/*---------------------------------
启动总线函数
函数原型:Start_I2C()
功能:启动I2C总线,即发送起始条件
---------------------------------*/
void Start_I2C()
{
	SDA = 1;	//发送起始条件数据信号
	_nop_();
	SCL = 1;
	_nop_();		//起始建立时间大于4.7us
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SDA = 0;	//发送起始信号
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SCL = 0;	//钳位
	_nop_();
	_nop_();
}
/*-------------------------------
结束总线函数
函数原型:Stop_I2C()
功能:结束I2C总线,即发送I2C结束条件
-------------------------------*/
void Stop_I2C()
{
	SDA = 0;	//发送结束条件的数据信号
	_nop_();		//发送结束条件的时钟信号
	SCL = 1;	//结束条件建立时间大于4us
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SDA = 1;	//发送I2C总线结束命令
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}

/*------------------------------
字节数据传送函数
函数原型:SendByte(uchar c)
功能:将数据C发送出去,可以是地址,
也可以是数据,发送完成之后等待应答
并且对应答状态位进行操作,不应答和非
应答都使得ACK=0,发送数据正常则ACK=1
--------------------------------*/
void	SendByte(uchar c)
{
	uchar BitCnt;
	for(BitCnt = 0;BitCnt < 8;BitCnt++)			//一个字节
		{
			if((c << BitCnt)& 0x80) SDA = 1;	//判断发送位
			else	SDA = 0;
			_nop_();
			SCL = 1;	//时钟线为高,通知被控器开始接受数据
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			SCL = 0;
		}
	_nop_();
	_nop_();
	SDA = 1;	//释放数据线,准备接受应答位
	_nop_();
	_nop_();
	SCL = 1;
	_nop_();
	_nop_();
	_nop_();
	if(SDA == 1) ack =0;
	else ack = 1;		//判断是否收到应答信号
	SCL = 0;
	_nop_();
	_nop_();
}

/*-------------------------------------------
字节数据接收函数
函数原型:uchar RcvByte();
功能:用来接收从器件传来的数据,并且判断总线错误(不发送应答信号)
发送完成后使用应答信号
-------------------------------------------*/
uchar RevByte()
{
	uchar retc;
	uchar BitCnt;
	retc = 0;
	SDA = 1;
	for(BitCnt=0;BitCnt<8;BitCnt++)
	{
		_nop_();
		SCL = 0;	//置时钟线为低,准备接收
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		SCL = 1;	//置时钟线为高使得数据有效
		_nop_();
		_nop_();
		retc = retc << 1;	//左移补零
		if (SDA == 1)
		retc = retc + 1;	//当数据为真加一
		_nop_();
		_nop_();
	}
	SCL = 0;
	_nop_();
	_nop_();
	return(retc);
}

void init()
{
	TMOD=0x20;
	TL1=0xFd;
	TH1=0xFd;
	SCON=0x50;
	PCON=0x00;
	EA = 1;
	ES = 1;
	TR1=1;	
	Card_Read_LED = OFF;
	Card_Write_LED = OFF;
	Card_Insert_LED = OFF;
	Card_Power_LED = OFF;
	RST = OFF;
	Card_In	= 1;
	Card_Insert_Flag = False;
	Card_Power_Control = False;
	Card_Write_Flag = False;
	Card_Power_Flag = False;
	R_Counter = 0;
}

void R_Serial() interrupt 4 using 1
{
 	if( RI == 1)
 	{ 
		uchar R_Temp;
   		RI = 0;
   		R_Temp = SBUF;   		
  		if(R_Counter==0)
   		{
   			if( R_Temp== 0xFF)
			{
				R_Counter=0;	
			}
  			else return;
  		}
	   	else
		{
			R_Buffer[R_Counter -1] = R_Temp;
            if( R_Counter == 4)
		    {
     		    R_Counter=0;
				Deal_R_Buffer();	
     		    return;
    		}
   		}
 		R_Counter++;
	}
}

void Write_Send()
{
	SBUF =0xFF;		
	do{}
	while(TI == 0);	
	TI = 0;
	SBUF = 0x00;		
	do{}
	while(TI == 0);	
	TI = 0;
	SBUF = Write_Add;		
	do{}
	while(TI == 0);	
	TI = 0;
	SBUF = Write_Data;
	do{}
	while(TI == 0);
	TI = 0;
}

void Read_Send()
{
	SBUF =0xFF;		
	do{}
	while(TI == 0);	
	TI = 0;
	SBUF = 0xFF;		
	do{}
	while(TI == 0);	
	TI = 0;
	SBUF = Read_Add;		
	do{}
	while(TI == 0);	
	TI = 0;
	SBUF = Read_Data;
	do{}
	while(TI == 0);
	TI = 0;
}
void Error_Send()
{
	SBUF =0xFF;		
	do{}
	while(TI == 0);	
	TI = 0;
	SBUF = 0xFF;		
	do{}
	while(TI == 0);	
	TI = 0;
	SBUF = 0xFF;		
	do{}
	while(TI == 0);	
	TI = 0;
	SBUF = 0xFF;
	do{}
	while(TI == 0);
	TI = 0;	
}

void Deal_R_Buffer()
{
	switch(R_Buffer[0])
	{	
		case 0x55:
		{
			switch(R_Buffer[1])
			{
				case 0xff:	
				{
					Card_Read_Flag = True;
					Read_Add = R_Buffer[2];
				}
					break;
				case 0x00:
				{	
					Card_Write_Flag = True;
					Write_Add = R_Buffer[2];
					Write_Data = R_Buffer[3]; 
				}
					break;
				default:	Error_Send();	
			}		
		}
		break;
		case  0xaa:	
			switch(R_Buffer[1])
			{
				case  0xff:	Card_Power_Flag = True;	break;
				case  0x00:	Card_Power_Flag = False;	break;
				default:	Error_Send();
			}
				break;
		default:	Error_Send();
	}
}

void Write_Card()
{
	Open_At24c01A();
	NOP();
	Start_I2C();
	SendByte(Write_At24c01A);
	if(ack == 1)
	{
		SendByte(Write_Add);
		if(ack == 1)
		{
			SendByte(Write_Data);
			if(ack == 1)
			{
				Write_Send();
				Card_Write_Flag = False;
				Stop_I2C();
				NOP();
				Close_At24c01A();	
			}
		}
	}

}

void Read_Card()
{
	Open_At24c01A(); 
	NOP();
	Start_I2C();
	SendByte(Write_At24c01A);
	if(ack == 1)
	{
		SendByte(Read_Add);
		if(ack == 1)
		{
			Start_I2C();
			SendByte(Read_At24c01A);
			if(ack == 1)
			{
				Read_Data = RevByte();
				Read_Send();
				Card_Read_Flag = False;
				Stop_I2C();
				NOP();
				Close_At24c01A();
			}
		}
	}
}

⌨️ 快捷键说明

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