⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sl.c

📁 51单片机控制TC35I无线通信模块的完整Keil C程序
💻 C
📖 第 1 页 / 共 5 页
字号:
//-----------------------------------------------------------------------------------
// 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 + -