📄 sl.c
字号:
Test_Frame_Send();
}
else
{
Test_Frame_Answer = 0;
}
}
// 定时发送数据处理
if(Timer_Gather_Flag == 1)
{
if(CAIJI_Resend_Flag != 1 && WAVE_Resend_Flag !=1)
{
Timer_Gather_Flag = 0;
Timer_Gather_Deal();
}
}
// 处理向采集板的命令重发
if(CAIJI_Timer_End == 1)
{
CAIJI_Timer_End = 0;
CAIJI_Resend_Deal();
}
// 处理向监控中心的命令重发
if(WAVE_Timer_End == 1)
{
WAVE_Timer_End = 0;
WAVE_Resend_Deal();
}
if(GPRS_OK==1) // 测试WAVECOM数据发送报文
{
if(send_flag==1)
{
send_flag=0;
for(j=0;j<3;j++)
{
for(i=0;i<100;i++) Delay10ms();
Inf_Buffer[0]=0x41;
Inf_Buffer[1]=0x42;
Inf_Buffer[2]=0x43;
Inf_Buffer[3]=0x44;
Inf_Buffer[4]=0x45;
Inf_Buffer[5]=0x46;
SEND_DATA_WAVECOM(6);
}
}
}
}
}
//-------------------------------------------------------------------------
//--------------------------------------------------------------------------
// 初始化程序模块
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 = 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
SCON1 = 0x50; //Set UART1 Mode 1 (1 Start Bit ,8 Data Bit ,1 Stop Bit) and Enable Receive
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 |= 0x01; //允许定时器3中断
T4CON |= 0x04; //Start Timer4
TR2 = 1; //Start Timer2
TMR3CN &=0xFB; //Stop Timer3
}
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------
//软串口初始化子程序
void SW_UART_INIT(void)
{
PCA0CPM0 = 0x10; // Module 0 in negative capture mode; module
// 0 interrupt disabled.
PCA0CPM1 = 0x01; // Module 1 in software timer mode; module
// 1 interrupt disabled.
PCA0CN = 0; // Leave PCA disabled
PCA0MD = 0x02; // PCA timebase = SYSCLK/4; PCA counter
// interrupt disabled.
CCF0 = 0; // Clear pending PCA module 0 and
CCF1 = 0; // module 1 capture/compare interrupts.
SRI = 0; // Clear Receive complete flag.
STI = 0; // Clear Transmit complete flag.
SW_TX = 1; // TX line initially high.
STXBSY = 0; // Clear SW_UART Busy flag
}
//------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
// SW_UART_ENABLE: SW_UART Enable Routine
void SW_UART_ENABLE(void)
{
PCA0CPM0 |= 0x01; // Enable module 0 (receive) interrupts.
PCA0CPM1 |= 0x01; // Enable module 1 (transmit) interrupts.
CR = 1; // Start PCA counter.
EIE1 |= 0x08; // Enable PCA interrupts
}
//延时子程序
void Delay10ms()
{
UINT i;
for(i=0;i<10000;i++);
}
// --------------------------------------------------------------------------------
// 上电初始化程序
void Download_Init_Data(void)
{
unsigned char i;
// 初始化备份索引号
CS_RTC = 0;
if((Record_Ind<2) || (Record_Ind>4))
{
Record_Ind = 2;
}
Backup_Index = Record_Ind;
// 初始化信宿IP地址和端口号
CS_RTC = 1;
if(XBYTE[StartAddress] == 0xAA)
{
// FLASH数据已初始化过
for(i=0;i<4;i++)
{
IP_Head[16+i] = XBYTE[StartAddress+Monitor_IP_Add+i]; // 装入IP地址
}
for(i=0;i<2;i++)
{
UDP_Head[2+i] = XBYTE[StartAddress+Monitor_PORT_Add+i]; // 装入端口号
}
Init_Flag = 1; // 设定初始化标识
}
}
//---------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------------
//测试模块是否正常子程序
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();
TMR3CN |= 0x04;
while(!Signal_OK) /* AT+CSQ */
{
for(i=0;i<7;i++)
{
SBUF0 = GSMCommand1[i];
while(TI0==0); TI0 = 0;
while(RI0==0);
rec[i] = SBUF0;
RI0 = 0;
}
for(i=7;i<15;i++) /* Error state */
{
while(RI0==0);
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);
rec[i] = SBUF0;
RI0 = 0;
}
}
for(i=8;i<25;i++){
if(rec[i] == ':' && rec[i+2] != '9')
{
Signal_OK = 1;
break;
}
}
}
TMR3CN &=0xFB;
Timer3_Flag=1;
counter_timer3=0;
Timer3_Counter=0;
}
//--------------------------------------------------------------------
//
// RTC初始化代码
void RTC_Init(void)
{
CS_RTC = 0; // 使能时钟芯片
RegB = 0x02; // 设置时间格式为BCD码格式,24小时制式
// RegA = 0x20; // 开启RTC计时 软串口数据初始化后在开启
RegB |=0x80;
Hour_Alarm = 0xFF;
Minute_Alarm = 0xFF;
Second_Alarm = 0x00;
RegB &= 0x7F;
CS_RTC = 1;
}
// RTC时间更新代码
void RTC_Time_Update(unsigned char xdata *source)
{
unsigned char i;
CS_RTC=0; // open RTC
RegB |= 0x80;
for(i=0;i<10;i++)
{
XBYTE[IniDataAddress+i] = *(source+i);
}
Second_Alarm = 0x00;
Minute_Alarm = 0xFF;
Hour_Alarm = 0xFF;
RegB &= 0x7F;
CS_RTC = 1;
}
// -----------------------------------------------------------------------
// 中断使能处理
void Interrupt_Enable(void)
{
// 网络连接成功后,打开其余的中断
EIE2 |=0x40; // 允许串口1中断
if(Init_Flag == 1)
{
EX0 = 1; // 允许外部1中断
CS_RTC = 0; // 允许时间芯片中断
RegB |=0x20;
CS_RTC = 1;
}
SW_UART_ENABLE(); // 软串口中断设置
SREN = 1; // 允许软串口接收
SES = 1;
}
//------------------------------------------------------------------------
// 软串口初始化数据处理
void Ini_Data_Deal()
{
unsigned char i;
// 数据存入FLASH
CS_RTC = 1;
Erase_Sector(StartAddress);
for(i=0;i<16;i++)
{
Write_Byte(StartAddress+1+i,Ini_Data_Buffer[i]);
}
Write_Byte(StartAddress,0xAA); // 设置FLASH设置标识位
// 初始化时间芯片
CS_RTC = 0;
RegB = 0x06; // 设置时间格式为二进制格式,24小时制式
RegB |= 0x80;
Second = Ini_Data_Buffer[16];
Minute = Ini_Data_Buffer[17];
Hour = Ini_Data_Buffer[18];
Week = Ini_Data_Buffer[19];
Day = Ini_Data_Buffer[20];
Month = Ini_Data_Buffer[21];
Year = Ini_Data_Buffer[22];
Hour_Alarm = 0xFF;
Minute_Alarm = 0xFF;
Second_Alarm = 0x00;
RegB &=0x7F;
// RegA = 0x20; // 开启时间芯片
CS_RTC = 1;
// 开中断
EX0 = 1; // 允许外部1中断
CS_RTC = 0; // 允许时间芯片中断
RegB |=0x20;
RegA = 0x20; // 开启时间芯片
CS_RTC = 1;
// 初始化IP地址
for(i=0;i<4;i++)
{
IP_Head[16+i] = XBYTE[StartAddress+Monitor_IP_Add+i]; // 装入IP地址
}
for(i=0;i<2;i++)
{
UDP_Head[2+i] = XBYTE[StartAddress+Monitor_PORT_Add+i]; // 装入端口号
}
// 设置起始标识
Init_Flag = 1;
// 定时间隔计数器清0
Timer_Num = 0;
// 向采集板发初始化数据
CAIJI_Comm_Len = 0;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = CAIJI_Send_SeqNr++;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x55;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x07;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 0x05;
CS_RTC = 1;
for(i=0;i<5;i++)
{
CAIJI_Command_Buf[CAIJI_Comm_Len++] = XBYTE[StartAddress+Machine_Cycle+i];
}
SEND_DATA_CAIJI(CAIJI_Comm_Len);
/*
// 向监控中心发链路命令
WAVE_Comm_Len = 0;
WAVE_Command_Buf[WAVE_Comm_Len++] = WAVE_Send_SeqNr++; // 命令序列号
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00; // 命令标识
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x00; // command[0]
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x03; // command[1]
WAVE_Command_Buf[WAVE_Comm_Len++] = 0x02; // 数据长度
CS_RTC = 1;
for(i=0;i<2;i++)
{
WAVE_Command_Buf[WAVE_Comm_Len++] = XBYTE[StartAddress+Machine_Num+i];
}
SEND_DATA_WAVECOM(WAVE_Comm_Len); // 向监控中心发送数据
// 设置命令重传标识
WAVE_Resend_Flag = 1;
WAVE_Resend_Num = 0;
WAVE_Timer = 10;
*/
CAIJI_Resend_Flag = 1;
CAIJI_Resend_Num = 0;
CAIJI_Timer = 1;
TMR3CN |= 0x04; // 开启定时器3
// 回送软串口数据
STI=1;
EIE2 |= 0x20; // Start SW_TX by enabling
PRT1IF |= 0x80;
}
//------------------------------------------------------------------------
//处理 WAVECOME 传来数据子程序
void DEAL_DATA_WAVECOM(void)
{
UINT i;
RECEIVEBUFFERPOINT=RECEIVEBUFFER;
if((*RECEIVEBUFFERPOINT==0xFF)&&(*(RECEIVEBUFFERPOINT+2)==0xC0)&&(*(RECEIVEBUFFERPOINT+3)==0x21)&&(*(RECEIVEBUFFERPOINT+4)==0x01) && (PPP_First_Receive==0))
{
WDTCN = 0xDE; // disable watchdog timer
WDTCN = 0xAD;
EXCH_SEND1();
PPP_First_Receive = 1;
}
else if((*RECEIVEBUFFERPOINT==0xFF)&&(*(RECEIVEBUFFERPOINT+2)==0xC0)&&(*(RECEIVEBUFFERPOINT+3)==0x21)&&(*(RECEIVEBUFFERPOINT+4)==0x1))
{
PPP_First_Receive = 0;
EXCH_SEND2();
EXCH_SEND3();
TMR3CN |= 0x04; //启动定时器3,每隔1S发送EXCH_SEND4(),直至收到回应
}
else if((*RECEIVEBUFFERPOINT==0xC0)&&(*(RECEIVEBUFFERPOINT+1)==0x23)&&(*(RECEIVEBUFFERPOINT+2)==0x02))
{
TMR3CN &=0xFB; //关闭定时器3,停止发送EXCH_SEND4()
counter_timer3=0;
EXCH_SEND5();
}
else if((*RECEIVEBUFFERPOINT==0x80)&&(*(RECEIVEBUFFERPOINT+1)==0x21)&&(*(RECEIVEBUFFERPOINT+2)==0x01))
{
for(i=8;i<=12;i++) EXCHANGE6[i+1] = *(RECEIVEBUFFERPOINT+i);
EXCH_SEND6(); //读取网关地址
}
else if((*RECEIVEBUFFERPOINT==0x80)&&(*(RECEIVEBUFFERPOINT+1)==0x21)&&(*(RECEIVEBUFFERPOINT+2)==0x03))
{
for(i=8;i<12;i++) {
EXCHANGE7[i+1] = *(RECEIVEBUFFERPOINT+i); //读取并更新IP地址
IP_Head[i+4] = *(RECEIVEBUFFERPOINT+i);
}
EXCH_SEND7();
GPRS_OK = 1;
Net_Ok_Flag=1;
// 中断使能处理
Interrupt_Enable();
// 发送链路连接命令
Link_Send_Comm();
// EIE2 |=0x40; //允许串口1中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -