📄 qd.c
字号:
SBUF1=Ctrl_Info_Buffer[0]; //发送第一个字节
}
else
{
;
}
}
else
{
SCON1 |= 0x08; //如果无控制信息,则回应,回应TB8位置1
SBUF1=0; //回应字节为0x0
Deal_Flag=0;
Rec_Ctrl_Flag=0;
}
}
else
{
SCON1 |= 0x08; //如果无控制信息,则回应,回应TB8位置1
SBUF1=0; //回应字节为0x0
if(Information_Type!=0 && Information_Type!=6)//如果不是控制信息和复位命令
{
Compare_Counter=0;
switch (Information_Type)
{
case 1://Device Error Status
for(i=0;i<6;i++)
{
if(InfoData_Buffer[i+1]!=Device_Error_Status[i])
Compare_Counter++;
}
if (Compare_Counter!=0)
{
for(i=0;i<6;i++) Device_Error_Status[i]=InfoData_Buffer[i+1];
Compare_Counter=0;
Read_Time(); //读取当前时间
Frame_Num++;
Store_Data(InfoData_Buffer,Information_Type,Receive_Data_Num);//存储数据
}
break;
case 2://Column Error Status
for(i=0;i<6;i++)
{
if(InfoData_Buffer[i+1]!=Column_Error_Status[i])
Compare_Counter++;
}
if (Compare_Counter!=0)
{
for(i=0;i<6;i++) Column_Error_Status[i]=InfoData_Buffer[i+1];
Compare_Counter=0;
Read_Time(); //读取当前时间
Frame_Num++;
Store_Data(InfoData_Buffer,Information_Type,Receive_Data_Num);//存储数据
}
break;
case 3://Goods Status
for(i=0;i<6;i++)
{
if(InfoData_Buffer[i+1]!=Goods_Status[i])
Compare_Counter++;
}
if (Compare_Counter!=0)
{
for(i=0;i<6;i++) Goods_Status[i]=InfoData_Buffer[i+1];
Compare_Counter=0;
Read_Time(); //读取当前时间
Frame_Num++;
Store_Data(InfoData_Buffer,Information_Type,Receive_Data_Num);//存储数据
}
break;
case 4://Sale Info
Read_Time(); //读取当前时间
Frame_Num++;
Store_Data(InfoData_Buffer,Information_Type,Receive_Data_Num);//存储数据
break;
case 5: //Device Info
for(i=0;i<13;i++)
{
if(InfoData_Buffer[i+1]!=Device_Info[i])
Compare_Counter++;
}
for(i=16;i<28;i++)
{
if(InfoData_Buffer[i+1]!=Device_Info[i])
Compare_Counter++;
}
if (Compare_Counter!=0) //对除温度状态外其它设备信息进行比较
{
for(i=0;i<28;i++)
Device_Info[i]=InfoData_Buffer[i+1];
Compare_Counter=0;
Read_Time(); //读取当前时间
Frame_Num++;
Store_Data(InfoData_Buffer,Information_Type,Receive_Data_Num);//存储数据
}
else
{
Compare_Counter = 0;
for(i=13;i<16;i++) //温度变化超过“6度”则发送该信息;屏蔽最高位
{
if(((InfoData_Buffer[i+1] & 0x7F) > Device_Info[i] + 6) || ((InfoData_Buffer[i+1] & 0x7F) + 6 < Device_Info[i]))
Compare_Counter ++;
}
if (Compare_Counter!=0)
{
for(i=0;i<28;i++)
Device_Info[i]=InfoData_Buffer[i+1] & 0x7F;
Compare_Counter=0;
Read_Time(); //读取当前时间
Frame_Num++;
Store_Data(InfoData_Buffer,Information_Type,Receive_Data_Num);//存储数据
}
}
break;
default:
break;
}
}
Receive_Data_Num=0;
ReceiveFlag=0;
Deal_Flag=0;
}
}
if( Ini_Data_Flag) //软串口
{
Ini_Data_Flag=0;
STI=1;
EIE2 |= 0x20; // Start SW_TX by enabling
PRT1IF |= 0x80;
}
if(Network_Flag==1)
{
Network_Flag=0;
for(i=0;i<1000;i++) Delay10ms();
WDTCN = 0xa5;
for(i=0;i<80;i++) Delay10ms();
}
if(Send_EX0_Flag)
{
Send_EX0_Flag=0;
if(Request_Flag)
Send_Request_Frame();//发送初始化故障信息请求帧
else
Send_Test_Frame(); //发送测试数据帧
Test_Frame_Num++;
if(Test_Frame_Num>50) //测试帧发送50次无回应,则复位
{
Network_Flag=1;
EX0=0;
Test_Frame_Num=0;
}
}
if(Send_EX1_Flag){
Send_EX1_Flag=0;
if( GPRS_OK == 1)
Send_Data(); //发送未接收回应的数据帧
else
{
counter=0; //计数器清零
EX1=1;
}
}
if(Ctrl_Complete_Flag)
{
Control_Success_For_Ack_Flag=1;
Ctrl_Complete_Flag=0;
Send_Ack_Frame();
}
/* if(P1_3==0||P1_4==0||P1_5==0)
{
Network_Flag=1;
}
*/
}
}
//------------------------------------------------------------------------------------
// Functions
//------------------------------------------------------------------------------------
//
void ProtectCode(void)
{
unsigned char xdata *pwrite;
unsigned char code *pread;
unsigned char temp1=0,temp2=0;
EA = 0;
pread = 0xFDFF;
pwrite = 0xFDFF;
temp1 = *pread;
temp2 = *(pread-1);
if(*pread == 0xFF) {
FLSCL = FLSCL | 0x01; // FLWE = 1; 允许FLASH写/擦除操作
PSCTL = PSCTL | 0x01; // PSWE = 1; 允许FLASH写入
XBYTE[0xFDFF] = 0x00; // 读锁定
XBYTE[0xFDFE] = 0; // 写/擦除锁定
PSCTL = PSCTL & 0xFE; // 禁止FLASH写入
FLSCL = FLSCL & 0xFE; // 禁止FLASH写/擦除
}
EA = 1;
}
void Baudrate_Init(void)
{
T2CON = 0X30; //Set Timer2 as Baudrate Generator of UART0
RCAP2H = 0xff; //Set Reload High Byte
RCAP2L = 0xc4; //Set Reload Low Byte
// SCON0 = 0xd0; //Set UART0 Mode 3 (1 Start Bit ,8 Data Bit ,1 Mode Bit ,1 Stop Bit),the 9th Bit ignored and Enable Receive
SCON0 = 0x50; //Set UART0 Mode 1 (1 Start Bit ,8 Data Bit ,1 Stop Bit) and Enable Receive
T4CON = 0x30; //Use SysClk
RCAP4H = 0xff; //Set Timer1 Mode 2 (Auto Reload Byte)
RCAP4L = 0xc4; //Set Reload High Byte
// TL1 = 0xc4; //Set Reload Low Byte
SCON1 = 0xf0; //Set UART1 Mode 3 (1 Start Bit ,8 Data Bit ,1 Mode Bit ,1 Stop Bit),the 9th Bit ignored and Enable Receive
SADEN1 |=0xf8;
SADDR1 =0x78;
TMR3CN = 0x00; //Timer3 use sysclk/12
TMR3H = 0x3c; //set Timer3 High Byte
TMR3L = 0x00; //set Timer3 Low Byte
TMR3RLH= 0x3c; //set Timer3 Reload High Byte
TMR3RLL= 0x00; // set Timer3 Reload Low Byte Timer3 : 10ms is distance
EIE2 &= 0xfb; //Disable Timer4 Interrupt
ET2 = 0; //Disable Timer2 Interrupt
// EIE2 &= 0xfe; //Disable Timer3 Interrupt
EIE2 |= 0x01; //允许定时器3中断
T4CON |= 0x04; //Start Timer4
TR2 = 1; //Start Timer2
// TMR3CN |= 0x04; //Start Timer3
TMR3CN &=0xFB; //Stop Timer3
}
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
//延时子程序
void Delay10ms()
{
UINT i;
for(i=0;i<10000;i++);
}
//---------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------------
//测试模块是否正常子程序
void AT()
{
UCHAR i;
UCHAR AT_Command[3]="AT\r";
for(i=0;i<3;i++)
{
SBUF0=AT_Command[i];
while(TI0==0); TI0 =0;
}
}
//-------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
//拨号连接GPRS网络子程序
void ATD99()
{
unsigned char i;
for(i=0;i<12;i++) /* ATD*99***1# */
{
SBUF0 = GSMCommand2[i];
while(TI0==0); TI0=0;
}
}
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
// 查询GSM网络信号强度子程序
void GSM_INI( void)
{
unsigned char i;
bit Signal_OK=0;
RI0=0;
// AT();
// for(i=0;i<80;i++) Delay10ms();
AT();
for(i=0;i<80;i++) Delay10ms();
AT();
for(i=0;i<80;i++) Delay10ms();
TMR3CN |= 0x04;
while(!Signal_OK) /* AT+CSQ */
{
for(i=0;i<7;i++)
{
SBUF0 = GSMCommand1[i];
// WDTCN = 0xa5;
while(TI0==0); TI0 = 0;
while(RI0==0);
// WDTCN = 0xa5;
rec[i] = SBUF0;
RI0 = 0;
}
for(i=7;i<15;i++) /* Error state */
{
while(RI0==0);
// WDTCN = 0xa5;
rec[i] = SBUF0;
RI0 = 0;
}
if(rec[8] != 'R' && rec[9] != 'R' && rec[10] != 'R' && rec[11] != 'R')
{
for(i=15;i<25;i++)
{
while(RI0==0);
// WDTCN = 0xa5;
rec[i] = SBUF0;
RI0 = 0;
}
}
for(i=8;i<25;i++){
// WDTCN = 0xa5;
if(rec[i] == ':' && rec[i+2] != '9')
{
Signal_OK = 1;
break;
}
//WDTCN = 0xa5;
}
// for(i=0;i<80;i++) Delay10ms();
}
// WDTCN = 0xDE; // disable watchdog timer
// WDTCN = 0xAD;
TMR3CN &=0xFB;
Timer3_Flag=1;
counter_timer3=0;
Timer3_Counter=0;
}
//---------------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------------------
//PPP的FCS校验子程序
UINT pppfcs16(UINT fcs,unsigned char *cp,int len)
{
while (len--)
fcs = (fcs >> 8) ^ fcstab[(fcs ^ *cp++) & 0xff];
return (fcs);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -