?? 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++);
}
//正確時返回長度向串口發(fā)送長度個數(shù)據(jù),錯誤時返回時向串口發(fā)送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 //接收完數(shù)據(jù)
goto comatr;
}
}
else //沒有接收到ART,或者接收失敗
return FALSE;
comatr:
if(ndata[z] == 0x3B)
CPUCD_Format = 0; //正規(guī)則
else if(ndata[z] == 0x03)
CPUCD_Format = 1; //反規(guī)則
else
return FALSE; //錯誤
z++; //Z = 1
if(z>(i-1)) //如果沒有接收到第二個字節(jié)或第二個字節(jié)數(shù)據(jù)錯誤則失敗
return FALSE; //
ln_history = ndata[z] & 0x0F; //取出歷史字節(jié)個數(shù)
number_Ti = ndata[z] &0xF0; //取出反映TA1~TD1
z++; //Z = 2
if (number_Ti & 0X10) //讀TA1,時鐘速率轉換因子
{
if (z>(i-1)) //如果沒有接收到第三個字節(jié)或第三個字節(jié)數(shù)據(jù)錯誤則失敗
return FALSE;
FI = ndata[z]>>4; //ndata[2]
DI = ndata[z] & 0X0F;
z++; //z=3
}
if (number_Ti & 0X20)
{
if (z>(i-1)) //讀TB1,編程電壓、電流參數(shù)
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,指定模式字節(jié)
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,指定模式字節(jié)
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) //接收歷史字節(jié)
{
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 + -