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

📄 main.c

📁 读写ID卡源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			vvvv=1;
		default:
			break;
	}
}
void timer2(void) interrupt 5 using 1
{
	mscounter++;
	mscounter1++;
	if(st_1==1)
	{
		if(mscounter>2200)
		{
			off_led(outnum);
			st_1=0;
		}
	}
	if(st_cance==1)
	{
		if(mscounter1>2200)
		{
			SECOND_3=1;
			SECOND_8=1;
			st_cance=0;
		}
	}
	TF2=0;
}
unsigned char CMP_STRING(unsigned char *pt1,
                         unsigned char *pt2,unsigned char len)
{
     unsigned char ct;         // fixed lenth 4.
     for (ct=0;ct<len;ct++)
     {
         if (*pt1++ != *pt2++)
         return 1;
     }
     return 0;                 // equal return 0. 	
}
/////////////////////////////////////////////////////////////////
void 	delay_10ms (uint _10ms)
{
 
   ET2 = 0; 	// Disable timer2 interrupt
  T2CON = 0x04;	// 16-bit auto-reload, clear TF2, start timer
  while (_10ms--)
  {
	while (!TF2)
	{
//	  if (CmdValid || CmdReceived)
	  {
		TR2 = FALSE;
		TF2 = FALSE;
		return;
	  }
	}
	TF2 = FALSE;
}
  TR2 = FALSE;
}

/****************************************************************************
****************************************************************************/
void isr_timer0(void) interrupt 1 using 1
{
//			TH0=0xfe;
//			TL0=0x2b;

		
		if(M_FLAG==1)return;
		if(M_STA==0)
		{
			if(M_BIT==1)
			{
				TR0=0;
				M_STA=0;
				SHORT_FLAG=0;
				M_FLAG=0;
				error_flag=1;
				return;
			}
			else
			{
				M_STA=1;
				SHORT_FLAG=1;
				HALF_FLAG=!HALF_FLAG;
				return;
			}
		}
		else if(M_STA==1)
		{
			if(M_BIT==1)
			{
				TR0=0;
				M_STA=0;
				SHORT_FLAG=0;
				M_FLAG=0;
				error_flag=1;
				return;
			}
			else
			{
				HALF_FLAG=0;
				RCV_BIT=0;
				M_STA=2;
				M_DATA_FLAG=0;
				M_BITS=0;
				R_MRC=0;
				SHORT_FLAG=1;
				HALF_FLAG=!HALF_FLAG;
				return;
			}
		}
		else if(M_STA==2)
		{
			if(HALF_FLAG==0)
			{

				RCV_BIT=M_BIT;
				SHORT_FLAG=1;
				HALF_FLAG=!HALF_FLAG;
				return;
			}
			else 
			{
				if((RCV_BIT==1)&&(M_BIT==1))     //出错返回
				{
					TR0=0;
					M_STA=0;
					SHORT_FLAG=0;
					M_FLAG=0;
					error_flag=1;
					return;
				}
				if((RCV_BIT==0)&&(M_BIT==0))   //出错返回
				{
					TR0=0;
					M_STA=0;
					SHORT_FLAG=0;
					M_FLAG=0;
					error_flag=1;
					return;
				}
				if(((RCV_BIT==0)&&(M_BIT==1))||((RCV_BIT==1)&&(M_BIT==0)))
				{

					if(M_DATA_FLAG==0)        //接受9个bit的头
					{
						if(RCV_BIT==0)	
						{
							M_BITS=0;
							SHORT_FLAG=1;
							HALF_FLAG=!HALF_FLAG;
							return;
						}
						else
						{
							M_BITS++;
							if(M_BITS==9)
							{
								M_DATA_FLAG=1;
								M_BITS=0;
								R_MRC=0;
								RCV_BYTE=0;
								M_BYTES=0;
								M_LRC=0;
								R_MRC=0;
								SHORT_FLAG=1;
								HALF_FLAG=!HALF_FLAG;
								return;
							}
								SHORT_FLAG=1;
								HALF_FLAG=!HALF_FLAG;
								return;
						}
					}
					else            //处理真实接受的数据   M_DATA_FLAG=1
					{
						if(M_BITS==4)    //处理第五位偶效验位
						{
							if(M_BYTES==10)   //处理最后列效验的四个bit
							{
								if(RCV_BIT==1)   //为高电平出错
								{
									TR0=0;
									M_STA=0;
									SHORT_FLAG=0;
									M_FLAG=0;
									error_flag=1;
									return;
								}
								else
								{
									RCV_BYTE^=M_LRC;   //进行异或运算进行每列位校验
									if(RCV_BYTE==0)     //校验正确
									{
										M_FLAG=1;
										error_flag=0;
//										IE=0;
										TR0=0;
										return;
									}
									else                 //校验不正确
									{
										TR0=0;
										M_STA=0;
										SHORT_FLAG=0;
										M_FLAG=0;
										error_flag=1;
										return;
									}
								}
							}
							else
							{
								if((RCV_BIT==0)&&(R_MRC==1))  //出错返回
								{
									TR0=0;
									M_STA=0;
									SHORT_FLAG=0;
									M_FLAG=0;
									error_flag=1;
									return;
								}
								if((RCV_BIT==1)&&((!R_MRC)==1))  //出错返回
								{
									TR0=0;
									M_STA=0;
									SHORT_FLAG=0;
									error_flag=1;
									M_FLAG=0;
									return;
								}
								if((M_BYTES%2)==0)
								{
									M_IDATA[M_BYTES/2]=RCV_BYTE&0x0f;
									M_LRC^=RCV_BYTE;
								}
								else if((M_BYTES%2)==1)
								{
									yyj=M_IDATA[M_BYTES/2];
									yyj=yyj<<4;
									RCV_BYTE=RCV_BYTE&0x0f;
									M_LRC^=RCV_BYTE;
									yyj=yyj+RCV_BYTE;
									M_IDATA[M_BYTES/2]=yyj;
								}
									M_BYTES++;
									RCV_BYTE=0;
									M_BITS=0;
									SHORT_FLAG=1;
									R_MRC=0;
									HALF_FLAG=!HALF_FLAG;
									return;

							}
						}
						else              //处理接受的四个bit数据
						{
							RCV_BYTE=RCV_BYTE<<1;
							if(RCV_BIT==1)
							{
								RCV_BYTE=RCV_BYTE|0x01;
								R_MRC=!R_MRC;
							}
							M_BITS++;
							SHORT_FLAG=1;
							HALF_FLAG=!HALF_FLAG;
							return;
						}
					}
				}
			}
		}
		else
		{
			TR0=0;
			M_STA=0;
			SHORT_FLAG=0;
			M_FLAG=0;
			return;
		}

}
///////////////////////////////////////////

void flash_led(void)
{
	unsigned int i;
	led_3=0;
	for(i=0;i<2800;i++);
	led_3=1;

}
/////////////////////////////////////////////////
void receive_send() interrupt 4
{
		unsigned char s;
		ES=0;
		if(RI)
		{
			RI=0;
			s=SBUF;
			if((rxhead==0)&&(s!=0x02))
			{
				rxhead=0;
				ES=1;
			}
			receive_buf1[rxhead++]=s;
			if(s==0x03)
			{
					receive_flag=1;
					rxhead=0;
					ES=1;
			}
	     }
		else if(TI)
		{
			TI=0;
			if(txhead>2)
			{
				txhead=0;
				ES=1;
				return;
			}
			SBUF=send_buf[txhead++];
			ES=1;
			return;
		}
		ES=1;
}	

void EM_REV (void) interrupt 0 using 1
{
	TR0=0;
	TL0=0x89;                //定时为130uS;  0x89=137   137=256-(x*(11059200/12000000))    x=130
//	TL0=0x10;	
//	TH0=0xff;
//	TL0=0x0f;
	TF0=0;
	TR0=1;
	ET0=1;


	if(M_FLAG==0)
	{
		if(SHORT_FLAG==0)
			M_STA=0;
		else
			SHORT_FLAG=0;
	}
	return;
}
/***************************************************************************/
//;;;;;;;;;;read inter data flash(EEPROM)program ;;;;;;;;;;;;;;;;
//;;;;;;;;;;;;;;ext address data is form 0~29696;;;;;;;;;;;;;;;;;;;;
unsigned char read_eeprom(unsigned int addrdata)
{
		unsigned int address;
		unsigned char data1;
		address=0x2000+addrdata;
		ISP_ADDRH=(unsigned char)(address>>8);
		ISP_ADDRL=(unsigned char)address;
//		EA=0;
		ISP_CONTR=WAIT_TIME;
		ISP_CONTR=0x80;
		ISP_CMD=ISP_IAP_BYTE_READ;
		ISP_TRIG=0x46;
		ISP_TRIG=0xb9;
		;;;
		data1=ISP_DATA;
//		EA=1;
		return data1;
}
//;;;;;;;;;;write data flash(EEPROM) program;;;;;;;;;;;;;;;;;;
//;;;;;;;;;;;ext address 0~29696   data :;;;;;;;;;;;;;;;;;;;;
void write_eeprom(unsigned int addrdata,unsigned char data2)
{
		unsigned int address;
		address=0x2000+addrdata;
		ISP_DATA=data2;
		ISP_ADDRH=(unsigned char)(address>>8);
		ISP_ADDRL=(unsigned char)address;
//		EA=0;
		ISP_CONTR=WAIT_TIME;
		ISP_CONTR=0x80;
		ISP_CMD=ISP_IAP_BYTE_PROGRAM;
		ISP_TRIG=0x46;
		ISP_TRIG=0xb9;
//		EA=1;
}
void write_pagedata(unsigned char pagenumber)
{
		unsigned int i;
		unsigned char sectors;
		sectors=pagenumber;
		erase_eeprom(sectors);
		for(i=0;i<4;i++)
		write_eeprom(sectors*512+i,snr[i]);
		for(i=4;i<512;i++)
		write_eeprom(sectors*512+i,00);
}

void erase_eeprom(unsigned char sectors)
{
		unsigned int addr;
		addr=0x2000+sectors*0x200;                //89c51rc is 0x2000  89c54rd+ is 0x8000
		ISP_ADDRH=(unsigned char)(addr>>8);
		ISP_ADDRL=(unsigned char)addr;
//		EA=0;
		ISP_CONTR=WAIT_TIME;
		ISP_CONTR=0x80;
		ISP_CMD=ISP_IAP_SECTOR_ERASE;
		ISP_TRIG=0x46;
		ISP_TRIG=0xb9;
//		EA=1;

}
void read_cardno(void)
{
	unsigned char i;
	for(i=0;i<4;i++)
	snr4[i]=read_eeprom(i);
}

void read_first(void)
{
	unsigned int i;
	unsigned char j;
	unsigned char ss1;
	select_500(0);
	for(i=0;i<53;i++)
	{
		ss1=readcard1();
		if(ss1==0)
		{
			for(i=0;i<4;i++)
			snr4[i]=snr[i];
			write_pagedata(0);
			led_light(0);
			break;
		}
	}

}



⌨️ 快捷键说明

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