?? main12.c
字號:
{
ModulFlags.Bit.EchoModule = 0 ;
//RecvFromMS[0x0A + j]:05/05/23,14:49:00
NOAddr = SMS_Start + 0x18;
for(tt=0;tt<Address_Length;tt++)
{
//對方號碼
SMS_Return[tt] = RecvFromMS[NOAddr+tt];
}
for(tt=0;tt<SMS_Header2_SIZE;tt++)
{
SMS_Return[Address_Length+tt] = SMS_Header2[tt];
}
UDLAddr = Address_Length+SMS_Header2_SIZE;
// ----- 格式轉換
EnergyDataAddr = UDLAddr+2;
TimeDataToUCS2();
UDLLength = 34; //17*2
//結束符
AllLength = EnergyDataAddr + UDLLength * 2;
SMS_Return[AllLength] = _CTRLZ;
SendSMS();
}
WaitReturn = 0;
}
}//END of if(TP_UDL == 1)
// ******************************************************************************
else if(TP_UDL >= 0x0D)
{
for(k=0;k<DNE_SIZE;k++)
{//取出對方手機號碼
SMS_Return[k] = RecvFromMS[DataAddr + k];
}
if(strncmppgm2ram((char *)SMS_Return,(const far rom char *)IPAddressEqual,IP_SIZE) == 0)
{//設置IP地址
TP_UDL -=3; //總長度中減去 地址= 這三個字符
Text1 = 0; //IP地址長度初始化為0
//
for(k=0;k<TP_UDL;k++)
{
temp1 = RecvFromMS[(DataAddr+12)+k*4+2];
temp2 = RecvFromMS[(DataAddr+12)+k*4+3];
if(temp1 == '2' && temp2 == 'E')
{
temp3 = '.' ;
}
else if(isdigit(temp1) && isdigit(temp2))
{
temp1 -=0x30;
temp2 -=0x30;
Text3 = temp1 <<4;
temp3 = Text3 + temp2;
}
else
return;
Ip_start_buf2[k] = temp3;
Text1 += 1;
}//END for
Ip_start_buf2[k] = 0x0D; //寫入EEPROM前置結束符
W_eeprom((char *)Ip_start_buf2,IPAddress,(Text1+1));
OK_Data();
SendSMS(); //發送短信 OK
OtherFlags.Bit.TCPLink = 0;
OnlineLed = HIGH; //關閉在線燈
Close_Shut();
}
else if(strncmppgm2ram((char *)SMS_Return,(const far rom char *)DateTimeEQUAL,DTE_SIZE) == 0)
{//設置時間
TP_UDL -=3; //總長度中減去 時間= 這三個字符
//
SetDateTime();
k = 0x09; //destination
for(j=0;j<TP_UDL;j++) //12個數字
{
temp1 = RecvFromMS[(DataAddr+12)+j*4+2];
temp2 = RecvFromMS[(DataAddr+12)+j*4+3];
Text1 = temp1 - 0x30;
Text2 = temp2 - 0x30;
Text3 = Text1 << 4;
TranToMS[k] = Text3 + Text2;
k++;
j++;
temp1 = RecvFromMS[(DataAddr+12)+j*4+2];
temp2 = RecvFromMS[(DataAddr+12)+j*4+3];
Text1 = temp1 - 0x30;
Text2 = temp2 - 0x30;
Text3 = Text1 << 4;
TranToMS[k] = Text3 + Text2;
k +=2;
j++;
}//END for
SendToModule (SetCCLK_SIZE);
DelaySeconds(2);
if(ModulFlags.Bit.EchoModule == 1)
{
cRet = strncmppgm2ram((char *)RecvFromMS,(const far rom char *)OK,L_OK);
if(cRet == 0)
{
OK_Data();
SendSMS(); //發送短信 OK
ReadTime();
}
}
ModulFlags.Bit.EchoModule = 0 ;
ByteRecvUART2 = 0;
}
else
return;
}
WaitReturn = 0; //必須加!否則,module主動上報幀會一直等第二個回車
}//END Proc_SMS
void ErrorMSG(void)
{
LoadCMD_CMGD();
WaitReturn = 0;
SendToModule (CMGR_CMGD_SIZE);
DelaySeconds(4);
}
//**********************************************************
void LoadCipstartBuf(void)
{
for(k=0;k<L_start_buf1;k++)
{
TranToMS[k] = Ip_start_buf1[k];
}
for(k=0;k<LengthIPDNS;k++)
{
TranToMS[k+L_start_buf1] = Ip_start_buf2[k];
}
//裝入端口號
TranToMS[LengthIPDNS+L_start_buf1] = _QUOTE;
TranToMS[LengthIPDNS+L_start_buf1+1] = _COMMA;
TranToMS[LengthIPDNS+L_start_buf1+2] = _QUOTE;
// Read PORT NO
R_eeprom((char *)PortNO,PortAddr,4);
for(k=0;k<4;k++)
{
TranToMS[LengthIPDNS+L_start_buf1+3+k] = PortNO[k];
}
TranToMS[LengthIPDNS+L_start_buf1+7] = _QUOTE;
TranToMS[LengthIPDNS+L_start_buf1+8] = _CR;
//TranToMS數組數據準備好
LengthCipstart = L_start_buf1 + LengthIPDNS + 9;
}
//**********************************************************
void InitPeriph(void)
{
//上電腿、電源控制腿方向定義
SHANGDIAN_CTRL = OUTPUT;
PowerKey_CTRL = OUTPUT;
//紅外腿定義
IrTX_CTRL = OUTPUT;
IrTX = HIGH;
IrRX_CTRL = INPUT;
//485端口定義
EN485 = EnReceive;
EN485_CTRL = OUTPUT;
TRIS_TXD2 = OUTPUT;
TRIS_RXD2 = INPUT;
//LED
OnlineLed = HIGH; //關閉在線燈
OnlineLed_CTRL = OUTPUT;
//SignalLed = HIGH; //關閉信號強度燈
SignalLed_CTRL = OUTPUT;
CMCON = 0x07; // Turn off comparators
ADCON1 = 0x0F; // Set PORTF as digital I/O
//編程(設置采集器編號)按鍵
KEY_CTRL = INPUT;
//定義跟SPI有關的C口pin3,4,5.
CS_FRAM = HIGH; //片選未選擇
CS_FRAM_CTRL = OUTPUT;
HOLD = HIGH; //HOLD
HOLD_CTRL = OUTPUT;
SSPCON1bits.SSPEN = 0;
SCK_CTRL = OUTPUT;
SDI_CTRL = INPUT;
SD0_CTRL = OUTPUT;
SSPSTAT = 0x80;
SSPCON1 = 0B00110001; //spi enable,master,fos/16,idle state high
}
void UART1_setup(void)
{
/* relates crystal freq to baud rate - see PIC18Fxxx data sheet
BRGH=1, Fosc=3.6864MHz BRGH=1, Fosc=4MHz BRGH=1, Fosc=8MHz BRGH=1, Fosc=16MHz
---------------------- ----------------- ----------------- ------------------
Baud SPBRG Baud SPBRG Baud SPBRG Baud SPBRG
1200 191 1200 207.3 1200 415.7 9600 103
2400 95 2400 103.2 2400 207.3 19200 51
4800 47 4800 51.1 4800 103.2 38400 25
9600 23 9600 25.0 9600 51.1 57600 16
19200 11 19200 12.0 19200 25.0 115200 8
38400 5 38400 5.5 38400 12.0
57600 3 57600 3.3 57600 7.7
115200 1 115200 1 115200 1.2 115200 3.3
*/
//#define BRGH_VALUE 1: 1200 +0.16 207 這個誤差小,準確
//#define BRGH_VALUE 0: 1200 +1.67 51
#define BAUD1 1200
// #define BAUD1 9600
// #define BAUD 38400
#define SPBRG1_VALUE ((PIC_CLK/(16UL * BAUD1) -1))
#define BRGH_VALUE 1
//如果 BRGH_VALUE=0 則SPBRG_VALUE= ((PIC_CLK/(64UL * BAUD1) -1))
TXSTA1bits.TRMT=0;
TXSTA1bits.BRGH=BRGH_VALUE;
TXSTA1bits.SYNC=0; //asynchronous
TXSTA1bits.TXEN=0; //enable the transmitter
TXSTA1bits.TX9=1; //發送9位
// TXSTA1bits.TX9=0; //發送8位
// TXSTA1bits.CSRC=1; //異步方式don't care
SPBRG1 = SPBRG1_VALUE;
RCSTA1bits.OERR=0; //enable serial port pins
RCSTA1bits.FERR=0; //enable serial port pins
RCSTA1bits.ADDEN=0; //enable serial port pins
RCSTA1bits.CREN=1; //enable reception
// RCSTA1bits.SREN=0; //異步方式don't care
RCSTA1bits.RX9=1; //接收9位
// RCSTA1bits.RX9=0; //接收8位
RCSTA1bits.SPEN=1; //Serial Port Enable bit
}
void UART2_setup(void)
{
/* relates crystal freq to baud rate - see PIC18Fxxx data sheet
BRGH=1, Fosc=3.6864MHz BRGH=1, Fosc=4MHz BRGH=1, Fosc=8MHz BRGH=1, Fosc=16MHz
---------------------- ----------------- ----------------- ------------------
Baud SPBRG Baud SPBRG Baud SPBRG Baud SPBRG
1200 191 1200 207.3 1200 415.7 9600 103
2400 95 2400 103.2 2400 207.3 19200 51
4800 47 4800 51.1 4800 103.2 38400 25
9600 23 9600 25.0 9600 51.1 57600 16
19200 11 19200 12.0 19200 25.0 115200 8
38400 5 38400 5.5 38400 12.0
57600 3 57600 3.3 57600 7.7
115200 1 115200 1.2 115200 3.3
*/
// #define BAUD1 1200
#define BAUD2 9600
#define BRGH_VALUE2 1
#define SPBRG2_VALUE ((PIC_CLK/(16UL * BAUD2) -1))
TXSTA2bits.TX9D=0; //無奇偶校驗位
TXSTA2bits.TRMT=0; //Transmit Shift Register Status bit
TXSTA2bits.BRGH=BRGH_VALUE2;
TXSTA2bits.SYNC=0;
TXSTA2bits.TXEN=0;
TXSTA2bits.TX9=0; //發送8位
// TXSTA2bits.CSRC=1;
SPBRG2 = SPBRG2_VALUE;
RCSTA2bits.RX9D=0; //無奇偶校驗位
RCSTA2bits.OERR=0;
RCSTA2bits.FERR=0;
RCSTA2bits.ADDEN=0;
RCSTA2bits.CREN=1; //Continuous Receive Enable bit
// RCSTA2bits.SREN=0;
RCSTA2bits.RX9=0; //接收8位
RCSTA2bits.SPEN=1; //Serial Port Enable bit
}
void LoadCMD_AT(void)
{
TranToMS[0] = _A;
TranToMS[1] = _T;
TranToMS[2] = _CR;
}
void LoadCMD_CSCS(void)
{
for(k=0;k<AT_CSCS_SIZE;k++)
{
TranToMS[k] = AT_CSCS_buf[k];
}
}
void LoadCMD_CIPSPRT(void)
{
for(k=0;k<CIPSPRT_SIZE;k++)
{
TranToMS[k] = Ip_CIPSPRT_buf[k];
}
}
void LoadCMD_CREG(void)
{
for(k=0;k<CREG_SIZE;k++)
{
TranToMS[k] = Ip_CREG_buf[k];
}
}
void LoadCMD_CREGAsk(void)
{
for(k=0;k<CREG_ASK_SIZE;k++)
{
TranToMS[k] = CREG_ASK_buf[k];
}
}
void LoadCMD_CCLK(void)
{
for(k=0;k<CCLK_SIZE;k++)
{
TranToMS[k] = Ip_CCLK_buf[k];
}
}
void LoadCMD_CIPHEAD(void)
{
for(k=0;k<CIPHEAD_SIZE;k++)
{
TranToMS[k] = Ip_CIPHEAD_buf[k];
}
}
void LoadCMD_CIPSTATUS(void)
{
for(k=0;k<CIPSTATUS_SIZE;k++)
{
TranToMS[k] = AT_CIPSTATUS[k];
}
}
void LoadCMD_ATE0(void)
{
for(k=0;k<ATE0_SIZE;k++)
{
TranToMS[k] = CMD_ATE0[k];
}
}
void LoadCMD_CIICR(void)
{
TranToMS[0] = _A;
TranToMS[1] = _T;
TranToMS[2] = _PLUS;
TranToMS[3] = _C;
TranToMS[4] = _I;
TranToMS[5] = _I;
TranToMS[6] = _C;
TranToMS[7] = _R;
TranToMS[8] = _CR;
}
void LoadCMD_CIFSR(void)
{
TranToMS[0] = _A;
TranToMS[1] = _T;
TranToMS[2] = _PLUS;
TranToMS[3] = _C;
TranToMS[4] = _I;
TranToMS[5] = _F;
TranToMS[6] = _S;
TranToMS[7] = _R;
TranToMS[8] = _CR;
}
void LoadCMD_CMGR(void)
{
TranToMS[0] = _A;
TranToMS[1] = _T;
TranToMS[2] = _PLUS;
TranToMS[3] = _C;
TranToMS[4] = _M;
TranToMS[5] = _G;
TranToMS[6] = _R;
TranToMS[7] = _EQUAL;
TranToMS[8] = Index0;
TranToMS[9] = Index1;
if(Index1 == _D)
{
// SMS_Start = 0x09; //如果短信的序號是1位數,則CMGR讀出的短信頭從020FH開始
CMGR_CMGD_SIZE = 10;
}
else
{
TranToMS[10] = _CR;
CMGR_CMGD_SIZE = 11;
}
}
void LoadCMD_CMGD(void)
{
TranToMS[0] = _A;
TranToMS[1] = _T;
TranToMS[2] = _PLUS;
TranToMS[3] = _C;
TranToMS[4] = _M;
TranToMS[5] = _G;
TranToMS[6] = _D;
TranToMS[7] = _EQUAL;
TranToMS[8] = Index0;
TranToMS[9] = Index1;
if(Index1 == _D)
{
CMGR_CMGD_SIZE = 10;
}
else
{
TranToMS[10] = _CR;
CMGR_CMGD_SIZE = 11;
}
}
void LoadCMD_CMGL(void)
{
TranToMS[0] = _A;
TranToMS[1] = _T;
TranToMS[2] = _PLUS;
TranToMS[3] = _C;
TranToMS[4] = _M;
TranToMS[5] = _G;
TranToMS[6] = _L;
TranToMS[7] = _EQUAL;
TranToMS[8] = _0;
TranToMS[9] = _CR;
}
void LoadCMD_ATO(void)
{
TranToMS[0] = _A;
TranToMS[1] = _T;
TranToMS[2] = _O;
TranToMS[4] = _CR;
}
void LoadCMD_CIPSEND(void)
{
/* AT+CIPSTART只有在IP_INITIAL、IP_CLOSE、IP_STATUS狀態下
才可以進行連接的建立,連接建立成功后的狀態為CONNECT OK;
連接失敗,則處在失敗的狀態上。
*/
for(k=0;k<CIPSEND_SIZE;k++)
{
TranToMS[k] = Ip_send_buf[k];
}
}
void LoadCMD_CMGS(void)
{
/* AT+CIPSTART只有在IP_INITIAL、IP_CLOSE、IP_STATUS狀態下
才可以進行連接的建立,連接建立成功后的狀態為CONNECT OK;
連接失敗,則處在失敗的狀態上。
*/
for(k=0;k<AT_CMGS_SIZE;k++)
{
TranToMS[k] = AT_CMGS_buf[k];
}
}
void LoadCMD_CIPCLOSE(void)
{
for(k=0;k<CIPCLOSE_SIZE;k++)
{
TranToMS[k] = Ip_close_buf[k];
}
}
void LoadCMD_CIPSHUT(void)
{
for(k=0;k<CIPSHUT_SIZE;k++)
{
TranToMS[k] = Ip_shut_buf[k];
}
}
void ConfigInt(void)
{
RCONbits.IPEN = 0;
PIE1bits.RC1IE=1; // USART1 receive interrupt enable
PIE3bits.RC2IE=1; // USART2 receive interrupt enable
PIE1bits.TMR1IE=1;
INTCONbits.PEIE=1; //Peripheral interrupt enable
INTCONbits.INT0IE=1; //紅外接收IrRXD放在RB0
INTCONbits.GIE=1;
INTCON2bits.INTEDG0=0; //INT0(RB0)配置為下降沿觸發中斷
}
void Timer1_setup(void)
{
TMR1H = hibyte(T1DELAY);
TMR1L = lobyte(T1DELAY);
T1CONbits.T1CKPS0 = 1;
T1CONbits.T1CKPS1 = 1; //八分頻
T1CONbits.T1OSCEN = 0; //不使用內部振蕩
T1CONbits.TMR1CS = 0; //fOSC/4=TCYC
T1CONbits.TMR1ON = 1; //啟動TMR1
}
void PWM_setup(void)
{
//PWM Initialization
// 4MHz crystal,實現38.4k調制輸出,從RE7(CCP2MX=0)
PR2 = 0x19;
CCPR2L = 0x0D; // Duty Cycle is 50% of PWM Period
CCP2CONbits.CCP2X = 0;
CCP2CONbits.CCP2Y = 0;
CCP2CONbits.CCP2M3 = 1; //CCP2置為PWM模式
CCP2CONbits.CCP2M2 = 1;
CCP2CONbits.CCP2M1 = 0;
CCP2CONbits.CCP2M0 = 0;
PWM_CTRL = OUTPUT;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -