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

📄 verify4442.c

📁 非接触式IC卡读和取程序与pcb设计原理图
💻 C
字号:

#include <stdio.h>
#include <intrins.h>
#include <reg51.h>
#include <Verify4442.h>
main()
{
	init();
	if(IC_In == 1)
	{
		IC_VCCC = 1;
		IC_VCC_LED = ON;
		Delay10us();		
		ResetCard();				//
		IC_Verify_Flag = Verify(PassWord[0],PassWord[1],PassWord[2]);
		BreakOperate();
		Delay10us();
		//if( IC_Verify_Flag == True)
		//{
			WriteMainMem(0xff,0xff);
			Delay10us();
			WriteMainMem(0xe0,0xe0);
		//}
		Delay10us();
		ResetCard();
		Verify_Send();
		Delay10us();
		IC_VCCC = 0;
	}
}

bit Verify(uchar pt1,pt2,pt3)
{
     uchar idata temp[4];                //暂存4字节的保密区内容
     uchar i;
     SendComm(RSM_COMM,0xff,0xff);        //读密码存储区的命令字,第2,3个参数在此命令中被忽略
     ReadMode(temp, 4);                   //读出
	 IC_PassWord[4] = temp[4]; 	 
     if((temp[0] & 0x07) != 0)            //第一字节是错误计数器,如果错误计数器为0,直接退出
     {
         if((temp[0] & 0x07)==0x07)     // 00000111
                i = 0x06;
         else if((temp[0] & 0x07)==0x06)// 00000110 
                i = 0x04;
         else if((temp[0] & 0x07)==0x04)// 00000100
                   i = 0x00;               //将其中一位为1的改为0
        SendComm(WSM_COMM,0,i);            //修改错误计数器
        ProcessMode();                  //处理
        //for (i = 1; i < 4; i++, pt++)   //校对3字节的密码
        //{
             SendComm(VER_COMM,1,pt1);  //发出校对命令,
             ProcessMode();             //处理
             SendComm(VER_COMM,2,pt2);  //发出校对命令,
             ProcessMode();             //处理
             SendComm(VER_COMM,3,pt3);  //发出校对命令,
             ProcessMode();             //处理
        //}
        SendComm(WSM_COMM,0,0xff);      //擦除计数器恢复错误计数器
        ProcessMode();                  //处理
        SendComm(RSM_COMM,0xff,0xff);   //读密码存储区的命令字,第2,3个参数在此命令中被忽略
        ReadMode(temp, 4);              //读错误计数器的内容
        if((temp[0] & 0x07)==0x07)      //如果没有被成功擦除,表明校对失败
             return 1 ;
     }
     return 0;
}


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;
	IC_Verify_LED = OFF;
	IC_Read_LED = OFF;
	IC_In_LED = OFF; 
	IC_VCC_LED = OFF;
	IC_Read_Flag = True;
	IC_Verify_Flag = False;	
//	IC_Write_add = 0xE0;
//	IC_Write_data = 0xE0;
}

void Verify_Send()
{
	if(IC_Verify_Flag == True)
	{
		SBUF = 0xff;
		do{}
		while(TI == 0);
		TI = 0;
	}
	else
	{
		SBUF = 0x00;
		do{}
		while(TI == 0);
		TI = 0;
	}
}

void ProcessMode(void)
{
    uint i;
    IC_CLK = 0;
    Delay5us();    
    IC_IO  = 0;
    for (i = 255; i > 0; i--)
    {
        IC_CLK = 1;
        Delay5us();
        IC_CLK = 0;
        Delay5us();
    }
    IC_IO  = 1;
}

void WriteMainMem(uchar addr,uchar Data)
{
    ResetCard();
    SendComm(WMM_COMM, addr, Data);     //写主存的命令字,地址,数据
    ProcessMode();
    BreakOperate();    
}

⌨️ 快捷键说明

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