📄 sl.c
字号:
//-----------------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------------
//#include <c8051f020.h> // SFR declarations
//#include <Absacc.h>
//#include <MAC.c>
//-----------------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------------
#define UINT unsigned int
#define UCHAR unsigned char
#define PPPINITFCS16 0xffff /* Initial FCS value */
#define PPPGOODFCS16 0x3e62 /* Good final FCS value */
/* SW_UART CONSTANTS DEFINITION */
#define BAUD_RATE 9600 // User-definable SW_UART baud rate
#define SYSCLK 18432000 // System clock derived from 18.432MHz XTL
#define TIME_COUNT SYSCLK/BAUD_RATE/4 // Number of PCA counts for one bit-time.
// (PCA configured to count SYSCLK/4)
#define TH_TIME_COUNT TIME_COUNT*3/2 // 3/2 bit-time, for use after receiving
// a START bit. RX should be LOW for one
// bit-time after the edge of the START,
// and the first bit sample starts in the
// middle of the next bit-time.
#define HW_TIME_COUNT SYSCLK/BAUD_RATE/16 // Time count for HW_UART baud rate
#define TI1 (SCON1 & 0x02)
sfr PRT1IF=0xad; // 设置外部中断7寄存器
/* define FLASH address */ // above.
#define StartAddress 0x1000
#define Backup_Add0 0x2000
#define Backup_Add1 0x3000
#define Backup_Add2 0x4000
#define Address5555 XBYTE[0x5555]
#define Address2AAA XBYTE[0x2AAA]
/* define time chip address */
#define IniDataAddress 0xF000
//define RTC Register
#define RegA XBYTE[0xff0a]
#define RegB XBYTE[0xff0b]
#define RegC XBYTE[0xff0c]
#define RegD XBYTE[0xff0d]
#define Hour XBYTE[0xff04]
#define Minute XBYTE[0xff02]
#define Second XBYTE[0xff00]
#define Year XBYTE[0xff09]
#define Month XBYTE[0xff08]
#define Day XBYTE[0xff07]
#define Week XBYTE[0xff06]
#define Century XBYTE[0xff32]
#define Hour_Alarm XBYTE[0xff05]
#define Minute_Alarm XBYTE[0xff03]
#define Second_Alarm XBYTE[0xff01]
#define Record_Ind XBYTE[0xff34]
// define Initilized Data Address
#define Monitor_IP_Add 0x01
#define Monitor_PORT_Add 0x05
#define Machine_Num 0x07
#define Machine_Cycle 0x09
#define Pressure_Limit 0x0A
#define Power_Limit 0x0C
#define UP_Send_Time 0x0E
#define Time_Interval 0x10
//---------------------------------------------------------------------------------------------------
//Global VARIABLES
//-----------------------------------------------------------------------------------
/* SW_UART VARIABLES DEFINITION */
bit SRI; // SW_UART Receive Complete Indicator
bit STI; // SW_UART Transmit Complete Indicator
bit STXBSY; // SW_UART TX Busy flag
bit SREN; // SW_UART RX Enable
bit SES; // SW_UART User-level Interrupt Support Enable
sbit SW_RX = P0^4; // SW_UART Receive pin
sbit SW_TX = P1^2; // SW_UART Transmit pin
//------------------------------------------------------------------------------------
sbit P1_4 = P1^4; // BUTTON DOOR
sbit P1_3 = P1^3; // BUTTON CARGO
sbit P1_5 = P1^5; // BUTTON CLEAR
//------------------------------------------------------------------------------------
sbit CS_RTC=P1^7; //RTC Chip Select,Low Effect, Flash Chip Select pin
sbit GPRS_LED=P1^6; //
bit Net_Ok_Flag=0; // 网络连接成功标识符
bit Timer3_Flag=0; // Flag for GSM Init and EXCHANGE4 resend
bit Reset_Flag=0;
bit EXCH_SEND4_Flag=0;
// 软串口缓存区定义
unsigned char TDR; // SW_UART TX Data Register
unsigned char RDR; // SW_UART RX Data Register (latch)
unsigned char xdata Ini_Data_Buffer[26],*Ini_Data_BufferPoint;
unsigned char xdata Ini_Data_Num_Reci=0,Ini_Data_Num_Send=0;
unsigned char xdata Receive_Ini_Flag=0;
bit Ini_Data_Flag=0;
//-------------------------------------------------------------------------------------
unsigned int xdata counter_timer3=0;
unsigned int xdata Timer3_Counter=0;
// GSM Commands
unsigned char xdata GSMCommand1[7] = "AT+CSQ\r";
unsigned char xdata GSMCommand2[12] = "ATD*99***1#\r";
/*MPU shake hands with WAVECOM*/
UCHAR xdata EXCHANGE1[22]={0x7E,0xFF,0x03,0xC0,0x21,0x01,0x01,0x00,0x0E,0x02,0x06,0x00,0x00,0x00,0x00,0x07,0x02,0x08,0x02,0x00,0x00,0x7E};
UCHAR xdata EXCHANGE2[30]={0x7E,0xFF,0x03,0xC0,0x21,0x02,0x01,0x00,0x16,0x01,0x04,0x05,0xDC,0x02,0x06,0x00,0x00,0x00,0x00,0x07,0x02,0x08,0x02,0x03,0x04,0xC0,0x23,0x00,0x00,0x7E};
UCHAR xdata EXCHANGE3[21]={0x7E,0xC0,0x23,0x01,0x01,0x00,0x0F,0x09,0x48,0x55,0x41,0x4E,0x47,0x4C,0x45,0x49,0x5C,0x00,0x00,0x00,0x7E};
UCHAR xdata EXCHANGE4[21]={0x7E,0xC0,0x23,0x01,0x02,0x00,0x0F,0x09,0x48,0x55,0x41,0x4E,0x47,0x4C,0x45,0x49,0x5C,0x00,0x00,0x00,0x7E};
UCHAR xdata EXCHANGE5[16]={0x7E,0x80,0x21,0x01,0x03,0x00,0x0A,0x03,0x06,0x00,0x00,0x00,0x00,0x97,0x5D,0x7E};
UCHAR xdata EXCHANGE6[16]={0x7E,0x80,0x21,0x02,0x01,0x00,0x0A,0x03,0x06,0xC0,0xA8,0x6F,0x6F,0xA4,0x3D,0x7E};
UCHAR xdata EXCHANGE7[16]={0x7E,0x80,0x21,0x01,0x04,0x00,0x0A,0x03,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x7E};
/*Disconnect form GPRS network*/
//UCHAR xdata EXCHANGE8[14]={0x7E,0xFF,0x03,0xC0,0x21,0x05,0x01,0x00,0x06,0x00,0x00,0x96,0xE,0x7E};
//UCHAR xdata EXCHANGE9[12]={0x7E,0xFF,0x03,0xC0,0x21,0x06,0x02,0x00,0x04,0x00,0x00,0x7E};
// Definition of frame information
UCHAR xdata Frame_Head[2]={0x7E,0x21};
UCHAR xdata IP_Head[20]={0x45,0x9D,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0x11,0x00,0x00,0xFF,0xFF,0xFF,0xFF,211,71,10,117};
UCHAR xdata UDP_Head[8]={0x03,0xEA,0x02,0xBD,0x00,0x00,0x00,0x00};
UCHAR xdata Frame_End[3]={0x00,0x00,0x7E};
// 串口中断接收缓存区定义
unsigned char xdata rec[50],RECEIVEBUFFER[100],*RECEIVEBUFFERPOINT; // UART0 RECEIVE buffer
unsigned char xdata WAVE_Receive_Num = 0;
unsigned char xdata Receive_Buf_UAR1[300]; // UART1 RECEIVE buffer
unsigned int xdata CAIJI_Receive_Len;
//unsigned char xdata Inf_Buffer_UART1[20]; // 采集板送来数据存放区
bit RECEIVE_FLAG = 0,PADDING_Flag = 0,PPP_Rec_Complete = 0; // UART0 RECEIVE FLAG
bit Receive_Flag_UART1=0,Padding_Flag_UART1=0,UART1_Rec_Complete=0; // UART1 RECEIVE FLAG
bit PPP_First_Receive=0;
bit GPRS_OK = 0;
// WAVECOM收发数据相关定义
bit WAVE_Data_Receive = 0,WAVE_Resend_Flag = 0;
unsigned char xdata WAVE_Timer=0,WAVE_Resend_Num,WAVE_Receive_SeqNr = 0,WAVE_Send_SeqNr=0;
unsigned char xdata WAVE_Data_Buffer[50],WAVE_Command_Buf[300];
unsigned char xdata WAVE_Data_Len;
unsigned int xdata WAVE_Comm_Len;
// 采集板收发数据相关定义
bit CAIJI_Data_Receive = 0,CAIJI_Resend_Flag = 0;
unsigned char xdata CAIJI_Timer=0,CAIJI_Resend_Num,CAIJI_Receive_SeqNr = 0,CAIJI_Send_SeqNr = 0;
unsigned char xdata CAIJI_Data_Buffer[300],CAIJI_Command_Buf[15];
unsigned int xdata CAIJI_Data_Len;
unsigned char xdata CAIJI_Comm_Len;
// 采集命令的相关定义
bit Data_Gather_Comm = 0,WAVECOM_Gather=0,Time_Gather = 0;
bit Data_Ready_Flag = 0;
unsigned char xdata Frame_Num = 0;
bit WAVE_Timer_End = 0;
bit CAIJI_Timer_End = 0;
// 数据备份相关定义
unsigned char xdata Backup_Index;
unsigned int Current_Add;
// 上电初始化标识设定
bit Init_Flag = 0;
// 外部中断1相关定义
bit Send_Test_Frame = 0;
bit Test_Frame_Answer = 0;
bit Timer_Gather_Flag = 0;
unsigned char xdata Timer_Num = 0;
// 测试数据定义
bit send_flag=1;
unsigned char xdata Inf_Buffer[10];
UINT code fcstab[256] = {
0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
};
void Delay10ms();
// 初始化子程序组
void Baudrate_Init(void);
void AT();
void GSM_INI(void);
void ATD99();
void Download_Init_Data();
void SW_UART_INIT(); // SW_UART initialization routine
void SW_UART_ENABLE();
void Interrupt_Enable(void);
void Ini_Data_Deal();
// 握手子程序组
void EXCH_SEND1();
void EXCH_SEND2();
void EXCH_SEND3();
void EXCH_SEND4();
void EXCH_SEND5();
void EXCH_SEND6();
void EXCH_SEND7();
// FLASH程序组
void Write_Byte(unsigned int w_address, unsigned char w_byte);
void Erase_Sector(unsigned int w_address);
void Erase_Chip(void);
//void Flash_Test(void);
// RTC程序组
void RTC_Init(void);
void RTC_Time_Update(unsigned char xdata *source);
//void RTC_Test(void);
// FCS校验子程序组
UINT pppfcs16(UINT fcs,unsigned char *cp,int len);
void Fcs16(unsigned char *cp,int len);
// 头校验子程序组
void CHECKSUM_UDP(unsigned int Data_length);
long cksum(unsigned char *ip, int len);
// 应用子程序组
void DEAL_DATA_WAVECOM(void);
void WAVE_Rec_Ack(void);
void SEND_DATA_CAIJI(unsigned char Data_Len);
void SEND_DATA_WAVECOM(unsigned int data_len);
void DEAL_DATA_CAIJI(void);
// 监控命令程序组
void Machine_Message_Set(void);
void Pressure_Limit_Set(void);
void Power_Limit_Set(void);
void UP_Timer_Set(void);
void Time_Interval_Set(void);
void Data_Gather_Set(void);
void Open_Machine_Comm(void);
void Close_Machine_Comm(void);
void Link_Send_Comm();
void Test_Frame_Send();
void Timer_Gather_Deal();
//采集命令组
void Frame_Data_Deal();
void Trouble_Inform_Comm();
void Data_Ready_Comm();
void Get_Data_Comm();
// 重发程序组
void CAIJI_Resend_Deal();
void WAVE_Resend_Deal();
void MAIN (void)
{
UINT delay; // Delay counter.
UINT i;
unsigned char j;
// ProtectCode();
OSCXCN = 0x67; // Enable external crystal
WDTCN = 0xDE; // disable watchdog timer
WDTCN = 0xAD;
EMI0CF = 0x07; // Set External Memory Configuration Register,使用片内 4K 和片外存储器 低端口,地址数据复用
XBR0 = 0x0c; // Set UART0,CEX0,CEX1,
XBR1 = 0x14; // Set /INT0,/INT1
XBR2 = 0x46; // Set UART1,Enable XBAR,Enable EMFILE
P0MDOUT = 0xe5; // Output configuration for P0
P1MDOUT = 0xc4; // Output configuration for P1
P2MDOUT = 0xff; // Output configuration for P2
P3MDOUT = 0xff; // Output configuration for P3
P0 |= 0x1a; // Enable RX0
// Enable RX1
P1 |= 0x3b; // Enable RX2
// 输出PIN初始化
GPRS_LED=1; // LED灯指示初始化
CS_RTC=1; // 禁止访问时钟芯片
delay=256; // Delay >1 ms before polling XTLVLD.
while(delay--);
while (!(OSCXCN & 0x80)); // Wait until external crystal has // started.
OSCICN = 0x0C; // Switch to external oscillator
OSCICN = 0x88; // Disable internal oscillator; enable
// missing clock detector.
while (!(OSCXCN & 0x80)); // Wait until external crystal has // started.
OSCICN = 0x08; // Switch to external oscillator
// 初始化UART0、UART1、TIMER2、TIMER4、TIMER3 ,定时器3中断开
Baudrate_Init(); // 初始化串口0和串口1的波特率
IP |= 0x10; // interrupt UART0 priority
IT0 = 1; // 设置外部中断1为沿触发
// 初始化软串口
SW_UART_INIT();
// 时间芯片初始化
// RTC_Init();
// 复位WAVECOM
GPRS_LED=0;
for(i=0;i<100;i++) Delay10ms();
GPRS_LED=1; // 初始化指示灯
EA=1; // open interrupt control
for(i=0;i<1000;i++) Delay10ms();
// 擦除FLASH
// Erase_Chip();
// 数据初始化
// Download_Init_Data();
//GSM初始化,查询网络信号强度
GSM_INI();
ES0=1; //允许串口0中断
// delay
for(i=0;i<1000;i++) Delay10ms();
for(i=0;i<1000;i++) Delay10ms();
for(i=0;i<1000;i++) Delay10ms();
ATD99(); //拨号连接GPRS网络 ATD*99***1#
for(i=0;i<1000;i++) Delay10ms();
WDTCN = 0xa5;
while(1)
{
// 处理WAVECOM传来的数据
if(PPP_Rec_Complete)
{
PPP_Rec_Complete = 0;
DEAL_DATA_WAVECOM();
}
// 用于连接网络时,超时进行复位
if(Reset_Flag==1)
{
Reset_Flag=0;
for(i=0;i<1000;i++) Delay10ms();
WDTCN = 0xa5;
for(i=0;i<80;i++) Delay10ms();
}
// 用于连接网络时,数组4重发
if(EXCH_SEND4_Flag == 1)
{
EXCH_SEND4_Flag = 0;
EXCH_SEND4();
}
if(GPRS_OK == 1)
{
/*
if(send_flag == 1)
{
send_flag = 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++] = 00;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 01;
CAIJI_Command_Buf[CAIJI_Comm_Len++] = 03;
SEND_DATA_CAIJI(CAIJI_Comm_Len);
// 设置命令重传标识
CAIJI_Resend_Flag = 1;
CAIJI_Resend_Num = 0;
CAIJI_Timer = 1;
TMR3CN |= 0x04; // 开启定时器3
}
*/
i=1;
}
//软串口收到数据处理
if(Ini_Data_Flag == 1)
{
Ini_Data_Flag=0;
Ini_Data_Deal();
}
// 处理采集板传来的数据
if(UART1_Rec_Complete == 1)
{
UART1_Rec_Complete = 0;
DEAL_DATA_CAIJI();
}
// 处理监控中心传来的数据
if(WAVE_Data_Receive == 1)
{
WAVE_Data_Receive = 0;
WAVE_Rec_Ack();
}
// 处理取数据命令
if(Data_Gather_Comm == 1)
{
if(Data_Ready_Flag == 1)
{
if(CAIJI_Resend_Flag != 1 && WAVE_Resend_Flag !=1)
{
Get_Data_Comm();
}
}
}
// 测试帧发送处理
if(Send_Test_Frame == 1)
{
Send_Test_Frame = 0;
if(CAIJI_Resend_Flag != 1 && WAVE_Resend_Flag !=1)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -