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

📄 mainjb.lst

📁 最流行的mifare卡读卡器全部源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.12  MAINJB                                                                 12/09/2002 13:03:09 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE MAINJB
OBJECT MODULE PLACED IN mainjb.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE mainjb.c DB OE SMALL ROM(LARGE) 

stmt level    source

   1          /****************** 本文件定义IC卡读写器物理层及数据链路层函数  **************************/
   2          /****************** 编写时间:2001年9月12日                     **************************/
   3          //#pragma OE
   4          #include "52User.h"
   5          #include "datas.h"
   6          #include "errcode.h" 
   7          #include "intrins.h"
   8          #include "tr2.h"
   9          #include "transt1.h"
  10          #include "memcard1.h"
  11          /****************子函数定义*********************/
  12          void delay_50us()
  13          {
  14   1      	uchar i;
  15   1      	for(i=0;i<5;i++);
  16   1      }
  17          
  18          void delay_104us()
  19          {
  20   1      	TL0=0x68;
  21   1      	ET0=0;
  22   1      	TR0=1;
  23   1      	while(!TF0);
  24   1      	TR0=0;
  25   1      	TF0=0;
  26   1      	ET0=1;
  27   1      }
  28          
  29          void delay_104SAM()
  30          {
  31   1      	TL1=0x68;
  32   1      	ET1=0;
  33   1      	TR1=1;
  34   1      	while(!TF1);
  35   1      	TR1=0;
  36   1      	TF1=0;
  37   1      	ET1=1;
  38   1      }
  39          
  40               
  41          void initT0()
  42          {
  43   1         TL0=0x60;
  44   1         ET0=1;
  45   1         TR0=1;   
  46   1      }
  47          void initT1()
  48          {
  49   1         TL1=0x60;
  50   1         ET1=1;
  51   1         TR1=1;   
  52   1      }
  53          
  54          
  55          /***** 定义ReceiveATR函数,该函数接收来自ICC的复位应答,并将其保存到以RICCBuf为首址的存储空间 *****/
C51 COMPILER V6.12  MAINJB                                                                 12/09/2002 13:03:09 PAGE 2   

  56          /******************* 正确接收完则返回OK,无卡则返回NoCard,超时则返回HaveTimeOut *******************/
  57          
  58          uchar ReceiveATR()
  59          {
  60   1      	uchar i;
  61   1      	uint WaitTime;
  62   1      	WaitTime=9600;
  63   1      	IfSend=0;
  64   1      	ICC_OUTPUT=1;
  65   1      	for(RICCLen=0,i=0;;RICCLen++)
  66   1      	{	
  67   2      		ET0=0;							//关T0中断允许
  68   2      		TR0=1;							
  69   2      		EtuCount=0;
  70   2      		
  71   2      		while(1)						//等待ICC回复起始位
  72   2      		{
  73   3      			if(ICC_OUTPUT==0)			//是否是起始位
  74   3      			{
  75   4      				delay_50us();			//延时去噪
  76   4      				if(ICC_OUTPUT==0)
  77   4      					break;				//是起始位则准备接收
  78   4      			}
  79   3      			if(TF0)
  80   3      			{
  81   4      				TF0=0;
  82   4      				EtuCount++;
  83   4      				if(EtuCount>WaitTime)
  84   4      				{
  85   5      					if(RICCLen!=0)
  86   5      						return OK;
  87   5      					else if(!ICC_Detect)
  88   5      						return NoCard;
  89   5      					else 
  90   5      						return HaveTimeOut;
  91   5      				}						
  92   4      			}				
  93   3      		}
  94   2      		EtuCount=0;
  95   2      		WaitTime=500;
  96   2      		initT0();
  97   2      		rbyte=0x00;
  98   2      		RBitCount=0x08; 				//置接收数据位数
  99   2      		while(RBitCount);				//等待接收结束
 100   2      		delay_104us();
 101   2      		check=ICC_OUTPUT;				//接收校验位
 102   2      		if(check==P)					//接收正确则保存
 103   2      		{
 104   3      			RICCBuf[RICCLen]=rbyte;
 105   3      			ICC_OUTPUT=1;				//接收正确
 106   3      		}
 107   2      		else
 108   2      		{
 109   3      			ICC_OUTPUT=0;				//接收错误,请求重发
 110   3      			delay_50us();
 111   3      			delay_104us();
 112   3      			ICC_OUTPUT=1;
 113   3      			RICCLen--;
 114   3      			continue;					//重新接收数据
 115   3      		}
 116   2      		delay_104us();					//延时,准备接收下一位数据
 117   2      	}
C51 COMPILER V6.12  MAINJB                                                                 12/09/2002 13:03:09 PAGE 3   

 118   1      }
 119          
 120          /****************** 定义函数SendToICC,该函数实现将以SICCBuf为首址的数据发送到ICC **********/
 121          /*********************	发送正确则返回OK,无卡则返回Nocard,其他返回invalid ****************/
 122          
 123          uchar SendToICC()
 124          {  	
 125   1          uchar data ErrorCount;											//错误次数计数	
 126   1      	bit check;															//奇偶校验位
 127   1      	uchar data i;        	
 128   1      	IfSend=1;															// 置接收标志
 129   1      	ICC_OUTPUT=1;
 130   1      	delay_104us();
 131   1      	for(i=0;i<SICCLen;i++)												//准备发送
 132   1      	{
 133   2      		sbyte=SICCBuf[i];
 134   2      		check=P;
 135   2      		SBitCount=8;													//发送数据					
 136   2      //		initT0();
 137   2      		TL0=0x74;
 138   2      		TR0=1;
 139   2      		ET0=1;
 140   2      		ICC_OUTPUT=0;													//发送起始位
 141   2      		while(SBitCount);
 142   2      		TL0=0x88;
 143   2      		ET0=0;
 144   2      		while(!TF0);														//延时1etu
 145   2      		ICC_OUTPUT=check;												//发送校验位
 146   2      		TF0=0;
 147   2      		while(!TF0);
 148   2      	//	delay_104us();
 149   2      		_nop_();
 150   2      		_nop_();
 151   2      		ICC_OUTPUT=1;
 152   2      		TF0=0;
 153   2      		delay_104us();													//保护时间
 154   2      		//delay_50us();
 155   2      		if(ICC_OUTPUT==1)												//判断ICC是否接收正确
 156   2      		{
 157   3      			delay_104us();
 158   3      			ErrorCount=0;
 159   3      			continue;													//正确则发送下字节数据
 160   3      		}
 161   2      		else if (ErrorCount<3)											//判断错误次数是否超出
 162   2      		{
 163   3      			i--;
 164   3      			ErrorCount++;
 165   3      			delay_104us();
 166   3      			delay_104us();
 167   3      			continue;
 168   3      		}
 169   2      		else
 170   2      		{
 171   3      			if(!ICC_Detect)												//判断是否有卡
 172   3      				return 	NoCard;		
 173   3      			else	
 174   3      				return  SendError;
 175   3      		}
 176   2      	}
 177   1      	return OK;
 178   1      }
 179          
C51 COMPILER V6.12  MAINJB                                                                 12/09/2002 13:03:09 PAGE 4   

 180          
 181          /***** 定义ReceiveFromICC函数,该函数接收来自ICC的数据,并将其保存到以RICCBuf为首址的存储空间 *****/
 182          /******************* 正确接收完则返回OK,无卡则返回NoCard,超时则返回HaveTimeOut *******************/
 183          
 184          uchar ReceiveFromICC()
 185          {
 186   1      	uchar data i;
 187   1      	uint WaitTime;
 188   1      	WaitTime=9600;
 189   1      	ICC_OUTPUT=1;		
 190   1      	for(RICCLen=0,i=0;;RICCLen++)
 191   1      	{	
 192   2      		IfSend=0;
 193   2      		EtuCount=0;
 194   2      		ET0=0;							//关T0中断允许
 195   2      		TR0=1;							
 196   2      		while(1)						//等待ICC回复起始位
 197   2      		{							
 198   3      			if(ICC_OUTPUT==0)			//是否是起始位
 199   3      			{
 200   4      				delay_50us();			//延时去噪
 201   4      				if(ICC_OUTPUT==0)
 202   4      					break;							//是起始位则准备接收
 203   4      			}
 204   3      			if(TF0)
 205   3      			{
 206   4      				TF0=0;
 207   4      				EtuCount++;
 208   4      				if(EtuCount>WaitTime)
 209   4      				{
 210   5      					if(ICC_Detect&RICCLen!=0)
 211   5      						return OK;
 212   5      					else if(!ICC_Detect)
 213   5      						return NoCard;
 214   5      					else	
 215   5      						return HaveTimeOut;
 216   5      				}						
 217   4      			}				
 218   3      		}
 219   2      		EtuCount=0;
 220   2      		if(!isTimeOut)
 221   2      			WaitTime=50;
 222   2      		initT0();
 223   2      	 	rbyte=0x00;
 224   2      		RBitCount=0x08; 				//置接收数据位数
 225   2      		while(RBitCount);				//等待接收结束
 226   2      		delay_104us();
 227   2      		check=ICC_OUTPUT;				//接收校验位
 228   2      		if(check==P)					//接收正确则保存
 229   2      		{
 230   3      			RICCBuf[RICCLen]=rbyte;
 231   3      			ICC_OUTPUT=1;				//接收正确
 232   3      			ErrorCount=0;
 233   3      		}
 234   2      		else if(ErrorCount<3)
 235   2      		{
 236   3      			ICC_OUTPUT=0;				//接收错误,请求重发
 237   3      			delay_50us();
 238   3      			delay_104us();
 239   3      			ICC_OUTPUT=1;
 240   3      			RICCLen--;
 241   3      			ErrorCount++;
C51 COMPILER V6.12  MAINJB                                                                 12/09/2002 13:03:09 PAGE 5   

 242   3      			continue;					//重新接收数据
 243   3      		}
 244   2      		else 
 245   2      		{
 246   3      			if(!ICC_Detect)
 247   3      				return NoCard;
 248   3      			else	
 249   3      				return ReceiveError;
 250   3      		}
 251   2      		delay_104us();					//延时,准备接收下一位数据
 252   2      	}
 253   1      }
 254          /*************定义T0的中断服务程序*************/
 255          /**************接收来自ICC的数据***************/
 256          		
 257          RICC()interrupt 1 using 1
 258          {
 259   1      	if(!IfSend)
 260   1      	{
 261   2      		ICC_OUTPUT=1;//
 262   2      		if (ICC_OUTPUT==1)
 263   2      		{
 264   3      			_nop_();
 265   3      			if(ICC_OUTPUT==1)
 266   3      			rbyte|=0x80;	
 267   3      			else 
 268   3      			{
 269   4      				//ICC_OUTPUT=1;//
 270   4      				_nop_();
 271   4      				if(ICC_OUTPUT==1)
 272   4      				rbyte|=0x80;	
 273   4      			}
 274   3      		}
 275   2      		if(RBitCount>1)
 276   2      			rbyte=rbyte>>1;
 277   2      		RBitCount--;  
 278   2        	}
 279   1       	else
 280   1        	{
 281   2      		if(sbyte%2)										//发送一位数据
 282   2      			ICC_OUTPUT=1;
 283   2      		else 
 284   2      			ICC_OUTPUT=0;
 285   2      		sbyte=sbyte>>1;												//右移一位 		
 286   2      		SBitCount--;
 287   2        	}
 288   1      }      
 289          
 290          void EnableEX1()
 291          {
 292   1      	EX1=1;//开外部中断0,即允许拔卡中断;
 293   1         	IT1=1;//下降沿触发;	
 294   1      }
 295          void DisableEX1()
 296          {
 297   1      	EX1=0;
 298   1      	IT1=0;
 299   1      }
 300          void EnableEX0()
 301          {
 302   1      	EX0=1;//开外部中断0,即允许拔卡中断;
 303   1         	IT0=1;//下降沿触发;	
C51 COMPILER V6.12  MAINJB                                                                 12/09/2002 13:03:09 PAGE 6   

 304   1      }
 305          void DisableEX0()
 306          {
 307   1      	EX0=0;
 308   1      	IT0=0;
 309   1      }
 310          
 311          
 312          /***** 定义ReceiveATR函数,该函数接收来自ICC的复位应答,并将其保存到以RICCBuf为首址的存储空间 *****/
 313          /******************* 正确接收完则返回OK,无卡则返回NoCard,超时则返回HaveTimeOut *******************/
 314          
 315          uchar ReceiveSAMATR()
 316          {
 317   1      	uchar i;
 318   1      	uint WaitTime;
 319   1      	WaitTime=9600;
 320   1      	IfSend=0;
 321   1      	SAM_DATA=1;
 322   1      	for(RICCLen=0,i=0;;RICCLen++)
 323   1      	{	
 324   2      		ET1=0;							//关T0中断允许
 325   2      		TR1=1;							
 326   2      		EtuCount=0;
 327   2      		TF1=0;

⌨️ 快捷键说明

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