?? qd.c
字號:
//----------------------------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------------
//PPP的FCS校驗子程序
void Fcs16(unsigned char *cp,int len)
{
UINT trialfcs;
cp++;
trialfcs = pppfcs16( PPPINITFCS16, cp, len-4 );
trialfcs ^= 0xffff; // complement
cp[len-4] = (trialfcs & 0x00ff); // least significant byte first
cp[len-3] = ((trialfcs >> 8) & 0x00ff);
}
//----------------------------------------------------------------------------------------------------------------------------------
// 發送PPP連接建立的第1條交互語句子程序
void EXCH_SEND1()
{
UINT xdata i,len=22;
Fcs16(EXCHANGE1,len);
for(i=0;i<len;i++)
{
TI0 = 0;
SBUF0 = EXCHANGE1[i];
while(TI0==0); TI0 = 0;
}
}
//----------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------
// 發送PPP連接建立的第2條交互語句子程序
void EXCH_SEND2()
{
UINT xdata i,len=30;
Fcs16(EXCHANGE2,len);
for(i=0;i<len;i++)
{
TI0 = 0;
SBUF0 = EXCHANGE2[i];
while(TI0==0); TI0 = 0;
}
}
//----------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------
// 發送PPP連接建立的第3條交互語句子程序
void EXCH_SEND3()
{
UINT xdata i,len=21;
Fcs16(EXCHANGE3,len);
for(i=0;i<len;i++)
{
TI0 = 0;
SBUF0 = EXCHANGE3[i];
while(TI0==0); TI0 = 0;
}
}
//----------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------
// 發送PPP連接建立的第4條交互語句子程序
void EXCH_SEND4()
{
UINT xdata i,len=21;
Fcs16(EXCHANGE4,len);
for(i=0;i<len;i++)
{
TI0 = 0;
SBUF0 = EXCHANGE4[i];
while(TI0==0); TI0 = 0;
}
}
//----------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------
// 發送PPP連接建立的第5條交互語句子程序
void EXCH_SEND5()
{
UINT xdata i,len=16;
Fcs16(EXCHANGE5,len);
for(i=0;i<len;i++)
{
TI0 = 0;
SBUF0 = EXCHANGE5[i];
while(TI0==0); TI0 = 0;
}
}
//----------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------
// 發送PPP連接建立的第6條交互語句子程序
void EXCH_SEND6()
{
UINT xdata i,len=16;
Fcs16(EXCHANGE6,len);
for(i=0;i<len;i++)
{
TI0 = 0;
SBUF0 = EXCHANGE6[i];
while(TI0==0); TI0 = 0;
}
}
//----------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------
// 發送PPP連接建立的第7條交互語句子程序
void EXCH_SEND7()
{
UINT xdata i,len=16;
Fcs16(EXCHANGE7,len);
for(i=0;i<len;i++)
{
TI0 = 0;
SBUF0 = EXCHANGE7[i];
while(TI0==0); TI0 = 0;
}
}
//----------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------
//發送斷開連接子程序
void EXCH_SEND8()
{
UINT xdata i,len=14;
for(i=0;i<len;i++)
{
TI0 = 0;
SBUF0 = EXCHANGE8[i];
while(TI0==0); TI0 = 0;
}
}
void EXCH_SEND9()
{
UINT xdata i,len=12;
Fcs16(EXCHANGE9,len);
for(i=0;i<len;i++)
{
TI0 = 0;
SBUF0 = EXCHANGE9[i];
while(TI0==0); TI0 = 0;
}
}
//------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
//軟串口初始化子程序
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.
m=0;
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
// EA = 1; // Globally enable interrupts
}
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
//外部中斷1用于定時發送數據
void ReSend_Data1(void) interrupt 2
{
if (counter<10) //以3秒為計時門限,
{
counter++;
// EX1=1; //允許外部中斷1 :方波
}
else
{
/* EX1=0; //關閉外部中斷1;
if(GPRS_OK == 1)
Send_Data(); //發送未接收回應的數據幀,發送結束打開外部中斷1
else
{
counter=0; //計數器清零
EX1=1;
} */
Send_EX1_Flag=1;
}
}
//---------------------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------------------------------
// 定時發送測試幀子程序 :外部中斷0
void TestNetwork(void) interrupt 0
{
unsigned char temp;
// unsigned int i;
CS_RTC=0;
temp=RegC; //讀時鐘芯片的寄存器C,用于中斷標志位清0
CS_RTC=1;
if(Request_Flag==0)
{
if(Test_counter<Distance) //30)// //以3秒為計時門限,
{
EX0=0;
Test_counter++;
EX0=1;
// EX1=1; //允許外部中斷0 :周期性中斷
}
else
{
EX0=0; //關閉外部中斷0;
Send_EX0_Flag=1;
}
}
else
{
if(Test_counter<10)//'Distance) //以3秒為計時門限,
{
EX0=0;
Test_counter++;
EX0=1;
// EX1=1; //允許外部中斷0 :周期性中斷
}
else
{
EX0=0; //關閉外部中斷0;
Send_EX0_Flag=1;
}
}
}
//-------------------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------------------
//定時器3中斷服務子程序
void Timer3_Interrupt(void) interrupt 14
{
unsigned char i;
TMR3CN &=0x7f; // Clear TF3
Timer3_Counter++;
if(Ack_Timer_Flag==1)
{
if(Timer3_Counter>=2)
{ Ack_Timer_Flag=0;
TMR3CN &=0xFB; //關閉定時器
SCON1 |= 0x20; // SM2位置1,只在地址時中斷
if(Rec_Ack_Flag)
{ Ctrl_Complete_Flag=1;
Rec_Ack_Flag=0;
Ctrl_Info_Flag=0; //20ms內收到回應
}
}
}
else
{
if(Timer3_Counter >= 300) //Wait 1s
{
Timer3_Counter = 0;
if(Timer3_Flag) EXCH_SEND4();
counter_timer3++;
if(Timer3_Flag==1)
{
if(counter_timer3>20)
{
counter_timer3=0;
TMR3CN &=0xFB; //關閉定時器
// if(Timer3_Flag==1)
Network_Flag=1; //發送C0 21語句20次無響應,則強制復位
}
}
else
{
if(counter_timer3>10) //發送AT+CSQ語句10次無響應,則強制復位
{
WDTCN = 0xa5;
for(i=0;i<100;i++)Delay10ms();
}
}
}
}
}
//--------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------
//PCA 中斷服務子程序
void PCA_ISR(void) interrupt 9
{
static char SUTXST = 0; // SW_UART TX state variable
static char SURXST = 0; // SW_UART RX state variable
static unsigned char RXSHIFT; // SW_UART RX Shift Register
unsigned int PCA_TEMP; // Temporary storage variable for
// manipulating PCA module high & low bytes.
// Check receive interrupt flag first; service if CCF0 is set.
if (CCF0){
CCF0 = 0; // Clear interrupt flag.
switch (SURXST){
// State 0: START bit received.
// In this state, a negative edge on SW_TX has caused the interrupt,
// meaning a START has been detected and the PCA0CP0 registers have
// captured the value of PCA0.
// - Check for receive enable and good START bit
// - Switch PCA module 0 to software timer mode
// - Add 3/2 bit time to module 0 capture registers to sample LSB.
// - Increment RX state variable.
case 0:
if (SREN & ~SW_RX){ // Check for receive enable and a good
// START bit.
PCA_TEMP = (PCA0CPH0 << 8); // Read module 0 contents into
PCA_TEMP |= PCA0CPL0; // PCA_TEMP.
PCA_TEMP += TH_TIME_COUNT; // Add 3/2 bit times to PCA_TEMP
PCA0CPL0 = PCA_TEMP; // Restore PCA0CPL0 and PCA0CPH0
PCA0CPH0 = (PCA_TEMP >> 8); // with the updated value
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -