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

📄 cpu_com.c

📁 psam+sim+sam的一些技术文档
💻 C
📖 第 1 页 / 共 2 页
字号:
{
		//unsigned char *data1;
		//unsigned char *aa;
		idata unsigned char i=0,z=0,ndata1[1];
		//*aa = 0;
		aa = aa|0X08;					//打开使能开关
		//CPU卡复位置低、下电、关时钟
		BT_RST = 0;						//设置为低		
		aa &=0XEF;						//关闭时钟通道
		aa &=0XBF;						//下电
		delay();	 					//
		aa |=0X10;						//为CPU卡上电并关时钟通道
		aa &=0XDF;
		aa |=0XBF;						//为CPU卡上电并开时钟通道
		BT_REC = 1;						//准备接受
		delay();
		BT_RST = 1;						//设置为高
//		read_ATR();
		//delay();
		if(GetChar(ndata1)==TRUE)
		{
			ndata[0]=ndata1[0];
			for(i=1;i<255;i++)
			{
				//BT_REC = 1;
				if(GetChar(ndata1) == TRUE)
				{
					ndata[i]=ndata1[0];
				}
				else
				{	
					//n=101; 
					break;
				}
			 }
		}
}*/
//触点激活子程序冷复位
//税控器
unsigned char cpu_Open(void)
{
		//unsigned char *data1;
		//unsigned char *aa;
		idata unsigned char i=0,z=0,ndata1[1],y = 0;
		//*aa = 0;
		aa = 0xF9;
		//aa = aa|0X08;					//打开使能开关
		aa = 0xF9;
		//CPU卡复位置低、下电、关时钟
cpuope:
		BT_RST = 0;						//设置为低
		//		
	//	aa = 0xEB;
/*
		aa &=0XEF;						//关闭时钟通道..........
		//
//		C_PWR = 1;						//下电
//		CLOCK = 1;						//关闭时钟通道
		//
		aa &=0XBF;						//下电.................
	//	aa = 0xAB;
		//
		delay();	 					//
		//
		aa |=0X10;						//为CPU卡上电并关时钟通道...........
		//aa = 0xBB;
		//
//		C_PWR = 0;
//		V_SEL = 0;
		//	
		aa &=0XDF;
		aa |=0XBF;						//为CPU卡上电并开时钟通道
		//aa = 0x9B;
		//aa = 0xBF;
		//
//		CLOCK = 0;
*/
		aa = 0xE9;
		aa = 0xA9;
		delay();
		aa = 0xB9;
		aa = 0xD9;
		BT_REC = 1;						//准备接受
		delay();
		BT_RST = 1;						//设置为高
//		read_ATR();
		if((i=read_ATR()) == FALSE)
		{	
			if(tck == 1)
			{
				if(y == 4)
				{
					ndata[0] = 0xFF;
					SendCom(1,ndata);
		  		}
				else
				{
					y++;
					goto cpuope;
				}
			}
			else
			{
				ndata[0] = 0xFF;
				SendCom(1,ndata);
				tck = 1;
			}
		}
		else
		{
			SendCom(i,ndata);
		}
		//aa = 0x00;
		//delay();
/*		if(GetChar(ndata1)==TRUE)
		{
			ndata[0]=ndata1[0];
			for(i=1;i<255;i++)
			{
				//BT_REC = 1;
				if(GetChar(ndata1) == TRUE)
				{
					ndata[i]=ndata1[0];
				}
				else
				{	
					//n=101; 
					break;
				}
			 }
		}
		*/
}
/*小机器
void rest(void)
{
		//*aa = *aa|0X08;				//打开使能开关
		//CPU卡复位置低、下电、关时钟
		idata unsigned char i=0,ndata1[1];
		BT_RST = 0;						//设置为低
		delay();
		BT_RST = 1;						//设置为低	
		read_ATR();	
}
*///税控器
void rest(void)
{
		//*aa = *aa|0X08;				//打开使能开关
		//CPU卡复位置低、下电、关时钟
		idata unsigned char i=0,ndata1[1],y = 0;
resta1:
		BT_RST = 0;						//设置为低
		delay();
		BT_RST = 1;						//设置为低	
		if((i=read_ATR()) == FALSE)
		{
			if(tck == 1)
			{
				if(y == 4)
				{
					ndata[0] = 0xFF;
					SendCom(1,ndata);
		  		}
				else
				{
					y++;
					goto resta1;
				}
			}
			else
			{
				ndata[0] = 0xFF;
				SendCom(1,ndata);
				tck = 1;
			}
		}
		else
		{
			SendCom(i,ndata);
		}
}
//触点释放子程序
void cpu_Close(void)
{
  BT_RST = 0;							//复位端置低
  //CLK置低         
  BT_SND = 0;							//接收端置低
  delay();
//  aa = 0X00;							//下电并关闭所有
}
//复位子程序,将CPU卡复位,reset_flag为1则冷复位,为0热复位
/*void Reset(unsigned char reset_flag)
{
		unsigned char a,*ndata1;
		if(reset_flag)
		{
				BT_RST = 1;//将复位信号置高
				BT_SND = 1;
				delay();
		}
		else
		{
				BT_RST = 0;
				BT_SND = 1;
				delay1();
				BT_RST = 1;
				delay();			
		}
}
*/
//接收复位应答:返回TRUE正确,返回FALSE则错误应答信号装入ndata中
/*unsigned char Reset_answer(unsigned *ndata)
{
		unsigned char *data1,len=0;
		idata unsigned char i=0,ndata1[1];
		xdata unsigned char ndata[255];
		if(GetChar(ndata1)==TRUE)
		{
			ndata[0]=ndata1[0];
			for(i=1;i<255;i++)
			{
			    if(GetChar(ndata1)==TRUE)
					{
						ndata[i]=ndata1[0];
					}
					else
				  {	
							//n=10000001; 
							break;
					}
			}
			if(ndata[1]==(i-3))
			{
					return TRUE;
			}
			else
			{
					return FALSE;
			}
		}
		return FALSE;
		
}
*/
//复位
/*unsigned char Rst(void)
{
		unsigned char reset_flag = 1,*ndata;
		Reset(reset_flag);
		if(Reset_answer(ndata)==FALSE)//冷复位失败
		{
				reset_flag = 0;
				Reset(reset_flag);
				if(Reset_answer(ndata)==FALSE)//热复位失败
						return FALSE;
				return TRUE;//热复位成功
		}
		return TRUE;//冷复位成功
}*/
//延时2500uS
void delay(void)
{
		unsigned int i = 0;
		for(i=0;i<413;i++);
		//for(i=0;i<255;i++);
}
//正确时返回长度向串口发送长度个数据,错误时返回时向串口发送0xFF
unsigned char read_ATR(void)
{
	unsigned char idata Present_TA2=FALSE,TA2=0xff,Number_ATR=0;
    unsigned char idata ln_history,number_Ti,Yi=0,y;     
    unsigned char idata FI=1,DI=1,Type_T0=0,Type_Ti=0;
	unsigned char idata ndata1[1]; 
	unsigned char idata i,z=0,x = 0;
	if(GetChar(ndata1) == TRUE)
	{
		ndata[0]=ndata1[0];
		for(i=1;i<32;i++)
		{
			//BT_REC = 1;
			if(GetChar(ndata1)==TRUE)
				ndata[i]=ndata1[0];
			else								//接收完数据
				goto comatr;
		}
	}
	else										//没有接收到ART,或者接收失败
		return FALSE;	
comatr:		
	if(ndata[z] == 0x3B)
 		CPUCD_Format = 0;					//正规则		
	else if(ndata[z] == 0x03)
		CPUCD_Format = 1;					//反规则
	else 
		return FALSE;						//错误
	z++;									//Z = 1
	if(z>(i-1))								//如果没有接收到第二个字节或第二个字节数据错误则失败
		return FALSE;						//
	ln_history = ndata[z] & 0x0F;  			//取出历史字节个数
	number_Ti = ndata[z] &0xF0;  			//取出反映TA1~TD1
	z++;									//Z = 2
	if (number_Ti & 0X10)					//读TA1,时钟速率转换因子
  	{
   		if (z>(i-1))						//如果没有接收到第三个字节或第三个字节数据错误则失败 														
        	return FALSE;
      	FI = ndata[z]>>4;					//ndata[2]						
       	DI = ndata[z] & 0X0F;
       	z++;								//z=3
   	}
	if (number_Ti & 0X20)
    {
    	if (z>(i-1)) 						//读TB1,编程电压、电流参数
        	return FALSE;
	   	z++;								//z=4
   	}
	if (number_Ti & 0X40)
	{
  		if (z>(i-1)) 						//读TC1,8位以外的额外等候时间
      		return FALSE;
     	if (ndata[z] == 255)				//ndata[4]
        	Extra_guardtime_N = 0;
     	else 
        {          	
       		Extra_guardtime_N = ndata[z];
//			Extra_guardtime_N_bak = Extra_guardtime_N;
      	}
  		z++;								//z=5
  	}
	else
	{
		Extra_guardtime_N = 0;
	}
	if (number_Ti & 0X80)
    {
    	if (z>(i-1)) 						//读TD1,无TD1默认Yi=0,Type_T0=0
        	return FALSE;
      	Type_T0 = ndata[z] & 0X0F;			//ndata[5]
      	Yi = ndata[z] & 0xf0;
     	z++;								//z=6
	}
	if (Yi & 0X10)							//TA2,TB2,TC2,TD2的记录
	{
		if (z>(i-1)) 						//读TA2,指定模式字节
      		return FALSE;
      	Present_TA2=TRUE;
      	TA2=ndata[z];						//ndata[6]
  		z++;								//z=7
	}
	if (Yi & 0X20)
    {
   		if (z>(i-1)) 						//读TB2
     		return FALSE;
     	z++;								//z=8
    }
	if (Yi & 0X40)
    {
   		if (z>(i-1)) 						//读TC2
       		return FALSE;
		tc2 = (ndata[z]/10)-1;
      	z++;								//z=9
    }
	if (Yi & 0X80)
    {
    	if (z>(i-1)) 						//读TD2
     		return FALSE;
       		Yi = ndata[z] & 0xf0;
          	Type_Ti = ndata[z] & 0X0F;
          	z++;								//z=10
    }
    else
    {
   		Yi=0;  
    }
	while  (Yi)									//TAi,TBi,TCi,TDi的记录
   	{
  		if (Yi & 0X10)
    	{
     		if (z>(i-1)) 						//读TAi,指定模式字节
          		return FALSE;
			z++;								//z=11
   		}
		if (Yi & 0X20)
     	{
         	if (z>(i-1)) 						//读TBi
           		return FALSE;
          	z++;								//z=12
    	}
		if (Yi & 0X40)
     	{
          	if (z>(i-1)) 						//读TCi
         		return FALSE;
          	z++;								//z=13
    	}
		if (Yi & 0X80)
    	{
    		if (z>(i-1)) 						//读TDi
           		return FALSE;
         	Yi = ndata[z] & 0xf0;				//ndata[13]
           	Type_Ti = ndata[z] & 0X0F;
           	z++;								//z=14
   		}
    	else 
     	{
     	  	Yi=0;
    	}
	}
	while (ln_history)        			//接收历史字节
  	{
 		if(z>(i-1))
      		return FALSE;
       	z++;
      	ln_history--;
    } 
	if (Type_T0 !=0 || Type_Ti !=0)		//接收TCK: 在默认的 T = 0模式下,没有TCK;在 T = 0和 T = 15同时存在时,有TCK
    {
    	if(z>(i-1))
		{
			tck = 0;
        	return FALSE;
	  	}
        z++;

          
          //检查TCK是否正确
		y=0x00;
     	for (x=1;x<=z;x++)
       	{
    		y ^= ndata[x]; 
        }
      	if (y != 0)
		{
			tck = 0;
          	return FALSE;
	  	}
		else
			tck = 1;
    }
//	else
//	{
//		return 255;
//	}
	 return i;
//	 if (Present_TA2==TRUE)//TA2存在,指定模式。
//     {
 //         OCR2 = (Arr_Fi[FI]/372)*52/Arr_Di[DI]-1;
 //         PreTCNT2=(OCR2+1)*2/3-1;
  //   }
/*     else
     {
	  if (Request_PPS() == FALSE)
		return FALSE;
	  else
	  {
		if (Response_PPS() == FALSE)
			return FALSE;
	  }
     }
*/     
//     Extra_guardtime = Extra_guardtime_N;
     //计算波特率机延时因子
//     *ATR = Number_ATR; 
}
void com_Open(void)
{
	TH1=0XFA;         //0XFD波特率为9.6K,fosc=11.059M; 0xFA fosc=22.1184
  	TL1=0XFA;  
// 	TH1=0XF4;         //0XFD波特率为9.6K,fosc=11.059M; 0xFA fosc=22.1184
// 	TL1=0XF4;  
// 	TH1=0XFF;         //0XFD波特率为9.6K,fosc=11.059M; 0xFA fosc=22.1184
// 	TL1=0XFF;  

	SCON=0X50;        //串行口运行方

⌨️ 快捷键说明

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