📄 cpu_com.c
字号:
{
//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 + -