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

📄 main.c

📁 ID读卡程序,在可以读取ID卡卡号,判断身份,在门禁考勤大量应用
💻 C
字号:
#include <REGX52.H>
#include <absacc.h>
#include <intrins.h>

//测试通过
//#define TIME10	600
//#define TIME05	300
//#define TIME00	80

#define BEEP P1_3
#define BITIN	!bitin;	

#define INPORT	P1_0     //天线引脚


unsigned int TIME05=260;    //0.5P脉宽    =256us
unsigned int TIME10=550;    //1P脉宽      =512us
unsigned int TIME00=50;     //最小脉宽
unsigned char TT=0;     //延时参数
unsigned char Buff[30]; //接收缓冲
bit bitin;     //波形暂存


unsigned char readbit()    //波形转换
{
	unsigned int mk=500;

	TL0=TH0=0;
	TR0=1;
	while(mk--)
		if(bitin!=INPORT)   //电平变化
			break;
	TR0=0;
	if(mk==0)
		return 0;     //超时错误
	bitin=INPORT;
	mk=TH0*256+TL0;	  //脉宽,
	if((mk>TIME05)&&(mk<=TIME10))
		return 1;                      //1P
	if((mk>=TIME00)&&(mk<=TIME05))
		return 2;                      //0.5P
	return 0;
}

unsigned char readdata()   //读位操作
{
	switch(readbit())
	{
		case 1:		//1T
			return BITIN;
		case 2:		//0.5T
			if(readbit()!=2) return 2;  //等待另一0.5P
			return BITIN;
		default:
			return 2;
	}
}

bit CheckData()
{
	unsigned char i,j;
	bitin=INPORT;
	//if(readdata()!=0)
	//	return 0;
	for(i=0;i<9;i++)
	{
		if(readdata()!=1)   //数据帧头9个1
			return 0;
	}
	//数据
	for(i=0;i<11;i++)
	{
		Buff[i]=0x00;
		for(j=0;j<5;j++)
		{
			Buff[i]<<=1;
			switch(readdata())    //数据装载
			{
				case 0:		//0
					break;
				case 1:		//1
					Buff[i]|=0x08;
					break;
				case 2:		//err
					return 0;
			}
		}
	}
	P1_0=!P1_0;
	P1_1=!P1_1;
	//结束位
	if(Buff[10]&0x08!=0x00)
		return 0;
	//*
	//行奇校验位
	for(i=0;i<10;i++)
		if((((Buff[i]>>4) ^
	   	     (Buff[i]>>3) ^
	   	     (Buff[i]>>2) ^
	   	     (Buff[i]>>1) ^
	   	      Buff[i])&0x08)!=0)
			return 0;

	//列奇校验位
	j=0;
	for(i=0;i<11;i++)
		j=j ^ (Buff[i]&0x80);
	if(j!=0)
		return 0;
	for(i=0;i<11;i++)
		j=j ^ (Buff[i]&0x40);
	if(j!=0)
		return 0;
	for(i=0;i<11;i++)
		j=j ^ (Buff[i]&0x20);
	if(j!=0)
		return 0;
	for(i=0;i<11;i++)
		j=j ^ (Buff[i]&0x10);
	if(j!=0)
		return 0;//*/

	return 1;
}

bit ReadCardNo()     //读取卡号
{
	unsigned char i=10;
	unsigned char j;
	
	bitin=INPORT;
    for(i=90;i&&bitin==INPORT;i--);        
 	if(!i)return 0;

  	for(i=0;i<20;i=i+2)
    {
		if(CheckData())
		{
			//Buff[1]=0x22;
			//Buff[2]=i;
			return 1;
		}
		else
		{
			j=TT+i;
			while(j--);
		}
	}
	return 0;
}

void Sound(void)
{unsigned int a;
 BEEP=0;
 for(a=0;a<20000;a++);
 BEEP=1;
}


void main(void)
{Sound();
 while(1)
  { if(ReadCardNo()) Sound();
  }
}

⌨️ 快捷键说明

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