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

📄 read4442.c

📁 非接触式IC卡读和取程序与pcb设计原理图
💻 C
字号:
#include <stdio.h>
#include <intrins.h>
#include <reg51.h>
#include <Read4442.h>
main()
{
	init();
	if((IC_In == 1)&&(IC_Read_Flag == 1) == 1)
	{
		IC_VCCC = 1;
		IC_VCC_LED = ON;
		Delay10us();
		if(IC_Read_Flag == True)
		{
			ResetCard();				//
			ReadMainMem(0xEF,&Read_Buffer[0],16);
			BreakOperate();
			Delay10us();
			ResetCard();
			Read_Send();
			//Check_Send();
		}
		Delay10us();
		IC_VCCC = 0;
	}
}


void ReadMainMem(uchar addr,uchar idata *pt,uchar count)
{

    SendComm(RMM_COMM,addr,0xff);
    ReadMode(pt,count);
	//Delay5us();
    BreakOperate();
	//IC_Read_LED = ON;
	IC_Read_Flag = False;
}

void SendComm(uchar a,uchar b,uchar c)
{
    StartComm();          //开始发送命令
    WriteByte(a);          //a: 发命令字
    WriteByte(b);          //b: 发地址
    WriteByte(c);          //c: 发数据
    StopComm();           //结束发送命令
}

void StartComm(void)
{
    IC_CLK = 0;
    IC_IO  = 1;
    Delay5us();
    IC_CLK = 1;
    Delay5us();
    IC_IO  = 0;
    Delay5us();
}

void WriteByte(uchar ch)
{
    uchar i;
    for(i = 8; i > 0; i--)
    {
        IC_CLK = 0;
        IC_IO = (bit)(ch & 0x01);     
        Delay5us();
        IC_CLK = 1;
        Delay10us();
        ch = ch >> 1;                 //右移一位
    }
}

uchar ReadByte(void)
{
    uchar i,ch;
    ch = 0;
    for (i = 8; i > 0; i--)
    {
        IC_CLK = 0;
        ch = ch >> 1;           //从低位读起 
        if((uchar)IC_IO)
            ch |= 0x80;
        Delay5us();
        IC_CLK = 1;
        Delay5us();
    }
    return ch;
}


void StopComm(void)
{
    IC_CLK = 0;
    IC_IO  = 0;
    Delay5us();
    IC_CLK = 1;        //CLK: H
    Delay5us();
    IC_IO  = 1;        //IO : H
    Delay10us();
}

void ReadMode(uchar idata *pt,uchar count)
{
    IC_CLK=0;
    Delay5us();
    do
    {
        *pt = ReadByte();    //读入一个字节
        pt++;                //指针加一
    }while(--count);             //计数器减一,判断
}

void BreakOperate(void)
{
     IC_CLK = 0;
     IC_RST = 0;
     IC_IO  = 0;
     Delay5us();
     IC_RST = 1;
     IC_IO  = 1;
     Delay5us();
     IC_RST = 0;
     Delay5us();
	 IC_VCCC = 0;
}

void ResetCard(void)
{
    uchar temp;
    Delay5us();    
    IC_RST = 0;        
    IC_CLK = 0;     
    IC_IO  = 1;    
    Delay5us();      
    IC_RST = 1;
    Delay5us();
    IC_CLK = 1;
    Delay10us();
    Delay10us();
    Delay10us();
    Delay10us();
    IC_CLK = 0;
    Delay5us();
    IC_RST = 0;
    Delay10us();       
    temp = ReadByte();
    temp = ReadByte();
    temp = ReadByte();
    temp = ReadByte();  
    IC_CLK = 0;         
    Delay5us();        
    IC_IO  = 1;         
    _nop_();           
    IC_CLK = 0;         
    Delay5us();
    
}

void Delay10us(void)
{
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}

void Delay5us(void)
{
    _nop_();
    _nop_();
    _nop_();
}


void init()
{
	//uchar i;
	TMOD=0x20;
	TL1=0xFd;
	TH1=0xFd;
	SCON=0x50;
	PCON=0x00;
	EA = 1;
	ES = 1;
	TR1=1;	
	IC_VCCC = 0;
	IC_In = 1;
	P1_7 = OFF;
	IC_Read_LED = OFF;
	IC_In_LED = OFF; 
	IC_VCC_LED = OFF;
	//for(i = 0;i<=15;i++)
	//{
	//	Read_Buffer[i] = 0xff;
	//}
	IC_Read_Flag = True;
}

void Read_Send()
{
	uchar i;
	for(i = 0;i <= 15; i++)
	{
		SBUF = Read_Buffer[i];		
		do{}
		while(TI == 0);	
		TI = 0;
	}
}
/*
void Check_Send()
{
	if(Read_Buffer[2] == 0xE2)
	{
		SBUF = 0xaa;
		do{}
		while(TI == 0);
		TI = 0;
	}
}
*/

⌨️ 快捷键说明

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