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

📄 write2401a.c

📁 非接触式IC卡读和取程序与pcb设计原理图
💻 C
字号:
#include "reg51.h"
#include "Write2401A.h"
#include "intrins.h"
main()
{
//    uchar i;
	init();
//	Write_Add = 0x35;
//	Write_Data = 0x66;
	for(;;)
	{	
		if(Card_In == True)
		{
			Card_Insert_Flag = True;
		}
		else
			Card_Insert_Flag = False;
		if(Card_Insert_Flag == True)
		{
			Write_Add = R_Buffer[0];
			Write_Data = R_Buffer[1];
			if(Card_Write_Flag == True)
			{
				NOP();
				NOP();
				Card_Power_Control = True;
				Card_Power_LED = ON;
				Open_At24c01A();
				NOP();
				Start_I2C();
				SendByte(Write_At24c01A);
				if(ack == 1)
				{
					SendByte(Write_Add);
					if(ack == 1)
					{
						SendByte(Write_Data);
						if(ack == 1)
						{
							Send();
							Card_Write_Flag = False;
							Stop_I2C();
							Close_At24c01A();	
						}
					}
				}
			}
			else	NOP();
		}
		else	
		{
			Card_Power_Control = False;
			Card_Power_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_();
}

void init()
{
	TMOD=0x20;
	TL1=0xFd;
	TH1=0xFd;
	SCON=0x50;
	PCON=0x00;
	EA = 1;
	ES = 1;
	TR1=1;	
	P1_5 = OFF;
	P1_6 = OFF;
	P1_7 = OFF;
	RST = OFF;
	Card_In	= 1;
	Card_Insert_Flag = False;
	Card_Power_Control = False;
	Card_Power_LED = OFF;
	Card_Write_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 == 2)
		    {
     		    R_Counter=0;
				Card_Write_Flag = True;		
     		    return;
    		}
   		}
 		R_Counter++;
	}
}

void Send()
{
	SBUF = Write_Add;		
	do{}
	while(TI == 0);	
	TI = 0;
	SBUF = Write_Data;
	do{}
	while(TI == 0);
	TI = 0;
}

⌨️ 快捷键说明

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