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

📄 tc35.c

📁 汽车防盗报警与定位追踪系统源程序
💻 C
字号:

extern void delayms(uint z);

/***********************************TC35定义****************************************/
sbit Start_TC35_IGT=P3^6;		 //	启动TC35-
sbit Close_TC35_PD=P3^7;		 
#define ATwaits					10
#define Textwaits				10
#define Readwaits				10
#define Sendwaits				10

#define UD_OffSet		74		 //在PDU模式下,UD在RsBuf的首地址
#define NewIdex_OffSet	12	 
#define RsBuf_N			150
#define databuf_N		77
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;

xdata	char RsBuf[RsBuf_N];	//定义串口接收数据缓冲区
xdata	char CheckBuf[8];	//定义检测数据缓冲区
uint 	RsPoint		=0;			//RsBuf[]坐标

char 	*ReturnCommand_OffSet;

char 	Index_Tc35[2]={0,0};
//\n0891..换行符'\10''\0'	
char code Ask_Tc35[]={0x0a,0x30,0x38,0x00};			 

/**********************发送中文的帧格式(PDU格式)*************************************

08:短信息信元SMSC(短信息中心号码)的字节长度
91:短信息中心号码类型,91表明中心号码是国际通用电话号码。
683108700505F0:短信息中心号码:8613800750500。
11:PDU SMS发送的文件头字节。这里11指正常发送短信息。
00:信息类型。这里00指让手机自动加上主叫号码。
0B:被叫号码长度。
81:被叫号码类型。

3124525366F5:被叫号码13422535665。

00:PID  Protocol Identifier.协议识别符,1位数字
08:DCS  Data Coding Scheme	短信息编码类型.00:发送数字或者字符  08:内容是汉字,采用UNICODE编码
A9:VP  Validity Period  短消息发送的合法期限,0、1或7位数字,其计算方法依照下表。

				VP值 短消息有效时间长度 
				0~143 (VP+1)×5分钟 
				144~167 12时+(VP-143)×30分 
				168~196 1天×(VP-166) 
				197~255 1周×(VP-192)
**************************************************************************************/
//char code SMS_SETUP[]="0891683108700505F01100OB81";		
char code SMS_DA[]="3136810314F0";	   //接收的手机号码(中文)  万胜
char code SMS_PDV[]="0008A9";	//PID  DCS  VP	 
char code SMS_UD[]="1067094EBA51654FB54F6076848F66FF01";		   //有人入侵你的车!//用户数据长度 +用户数据	注:一个汉字占两个字节  
char code SMS_OVER[]="\x1A\r";			//
char code SendSmg_UDL[]="30";	  ////发送信息,数据长度为 PDU(1)+MR(3)+DA(6)+PID(1)+DCS(1)+VP(1)+UDL(1)+UD(?)=14+UD(?)=???
char code User_DA[]="13422535665";


/***********************************GPS定义****************************/
sbit GPS_EN=P1^7;
//xdata char databuf[70]={"$GPGGA,1114641,3002.3232,N,12206.1157,E,1,03,12.9,53.2,11.6,M,,*4A"};	 //调试用的
xdata	char databuf[databuf_N];
unsigned char tmp;
unsigned char Rt=1;	
unsigned int  databyte;
unsigned char seg_count; //逗号计数器
xdata char seg[20];
unsigned char byte_count; //位数计数器
unsigned char cmd_number; //命令类型
unsigned char mode; //0:结束模式,1:命令模式,2:数据模式
unsigned char buf_full; //1:整句接收完成,相应数据有效。0:缓存数据无效。
unsigned char cmd[8]; //命令类型存储数组
unsigned char MaySendGPS=0;

//声明函数原型
void ClrBuf(unsigned char *p,uint size);
//void UART_init(void);
void SendASC(unsigned char ASC);
void SendToTc35(unsigned char* p,uint Long);
void SendString(unsigned char* p);

void Send_AT(void);
void NumToChar(unsigned char i);
void GetNewIndex(void);
char *mystrstr(char *s, char *t);
void Send_Chinese();

void ReadMsg();
void Send_GPS();

/*********开启TC35模块*********************/  
void start_tc35(void)
{
	Start_TC35_IGT=0;	//sbit Start_TC35_IGT=P3^7;
	delayms(400);
	Start_TC35_IGT=1;   //sbit Start_TC35_IGT=P3^7;
}
/*********关闭TC35模块*********************/ 
void close_tc35(void)
{
	Close_TC35_PD=0;   //sbit Close_TC35_PD=P3^6;
	
	delayms(4000);
	
	Close_TC35_PD=1;	//sbit Close_TC35_PD=P3^6;
}


/*********************发送-个ASCII********************************
*功    能: 串口发送ASCII码
*形    参: ASC
*返 回 值:
*备    注: 
*****************************************************************/
void SendASC(uchar ASC)
{
	bit es;
	es=ES;
	ES=0;//关闭中断
	TI=0;
	SBUF=ASC;
	while(!TI);
	TI=0;
	ES=es;
}

/**********************发送-个数组********************************
*功    能: 串口发送数组命令到TC35,为指定长度
*形    参: uchar* p,数组首地址;		uchar Long为数组长度
*返 回 值:
*备    注: 
*****************************************************************/
void SendToTc35(uchar* p,uint Long)
{
	while(Long--)
	{
    	SendASC(*p++);

  	}
}

/**********************发送-个字符串******************************
*功    能: 串口发送数组命令到TC35,未指定长度
*形    参: uchar* p,字符串首地址;
*返 回 值:
*备    注: 
*****************************************************************/
void SendString(uchar* p)
{
	while(*p)
	{
    	SendASC(*p++);

  	}
}


/***********************擦察除缓冲区*****************************/
void ClrBuf(uchar *p,uint size)
{
	uint i;
	for(i=0;i<size;i++)*p++=0;
}


/***********************字符串查找********************************
*功    能: 查找字符串
*形    参: char *s, char *t  ;在s中查找t
*返 回 值: s_temp(t在s中的位置)成功  0 失败
*备    注: 
*****************************************************************/
char *mystrstr(char *s, char *t)
{
  char    *s_temp;        /*the s_temp point to the s*/
  char    *m_temp;        /*the mv_tmp used to move in the loop*/
  char    *t_temp;        /*point to the pattern string*/

	if (NULL == s || NULL == t) return NULL;

	/*s_temp point to the s string*/
	for (s_temp = s; *s_temp != '\0'; s_temp++){ 
   		/*the move_tmp used for pattern loop*/
		m_temp = s_temp;
    	/*the pattern string loop from head every time*/
		for (t_temp = t; *t_temp == *m_temp; t_temp++, m_temp++);
        /*if at the tail of the pattern string return s_tmp*/
		if (*t_temp == '\0') return s_temp;
     	}
	return NULL;
 }

 /*********************转换北京时间*******************
 *功    能: 将GPS收到的格林尼治时间转化北京时间
*形    参: 
*返 回 值:
*备    注: 北京时间=格林尼治时间+8
**************************************************************** */
void Time_Change (void)
{
	unsigned char hour_shi,hour_ge,hour;
	hour_shi=databuf[seg[3]+1]-48;	
	hour_ge=databuf[seg[3]+2]-48;
	hour_shi=hour_shi*10; 
	hour=hour_shi+hour_ge+8;
	if(hour>23)	{hour=hour-24;}					 //当大于24时,减去24
	databuf[seg[3]+1]=hour/10+48;				  //回存到缓冲区
	databuf[seg[3]+2]=hour%10+48; 
}

/***************************将数字转换成字符输出(ascll码)**************************/
void NumToChar(unsigned char i)
{
	
	if(i>=0&&i<=9)	 //数字小于10
	{
		SendASC(i+48);
	}
	
	else if(i<=99)//数字小于100
	{
		SendASC(i/10+48);
		SendASC(i%10+48);
	}
	
	else 			//数字大于100
	{
		SendASC(i/100+48);
		SendASC(i%100/10+48);
		SendASC(i%10+48);
	}
}
/******************获取索引号并将信息索引转换成数字存入Index_Tc35***************************/
			 
void GetNewIndex(void)
{
	if(*(ReturnCommand_OffSet+NewIdex_OffSet)>=0x30&&*(ReturnCommand_OffSet+NewIdex_OffSet)<=0x39)	  //其中index表示短消息存放的位置
		Index_Tc35[0]=*(ReturnCommand_OffSet+NewIdex_OffSet);
	   else Index_Tc35[0]=0;
		
	if(*(ReturnCommand_OffSet+NewIdex_OffSet+1)>=0x30&&*(ReturnCommand_OffSet+NewIdex_OffSet+1)<=0x39)
		Index_Tc35[1]=*(ReturnCommand_OffSet+NewIdex_OffSet+1);
	  else Index_Tc35[1]=0;  	
}

/***********************发送联机指令******************************
*功    能: 串口发送数组命令到TC35,"AT",
*形    参: 
*返 回 值:
*备    注: 测试GSM模块是否连接正确
**************************************************************** */
void Send_AT(void){
  uchar *p,i=ATwaits;
	while(i--){
    	SendString("AT\r");	   	//"AT"
		//****************************等待应答"OK"
    	ES=1;    //必须中断
    	delayms(150);
    	p=mystrstr(RsBuf,"OK");
    	if(p!=NULL) {
			SendString(p); 
			delayms(1000);
			delayms(1000);
			break;										  
			}
		delayms(1000);
		}
}  
/***********************发送中文**********************************
*功    能: 
*形    参: 
*返 回 值: 信息数据内容首地址,从UDL开始
*备    注: 1 发送成功  0 发送失败
****************************************************************/
void Send_Chinese()//发送定位命令
{ 
	uchar i=Textwaits;
	uchar j=Sendwaits;
	uchar *p;

	RsPoint=0;
	ClrBuf(RsBuf,8);	   //清除串口接收缓冲区前8字节
	ES=1;	
	
	//串口发送"PDU模式"指令
	SendString("AT+CMGF=0\r");
	delayms(1000);		
	//发送信息,数据长度为 PDU(1)+MR(3)+DA(6)+PID(1)+DCS(1)+VP(1)+UDL(1)+UD(?)=14+UD(?)=???  48		  注:一个汉字占两个字节
	SendString("AT+CMGS=");
	SendString(SendSmg_UDL);	
	SendASC('\r');		
	RsPoint=0;
	ES=1;		
	
	while(i--)				   
	{
		delayms(1000);
		p=mystrstr(RsBuf,">");  //////Get">"
		if(p!=NULL)
		{
			SendString("0891683108700505F011000B81");
			SendString(SMS_DA);	 //   5113632843F5 恒	   3136810314F0 胜
			SendString(SMS_PDV);  //  0008A9
			SendString(SMS_UD);	  //  1067094EBA51654FB54F6076848F66FF01
			SendString(SMS_OVER);
						/*		
                       char code SMS_DA[]="3124525366F5";	   //接收的手机号码(中文)
                        char code SMS_PDV[]="0008A9";	//PID  DCS  VP	 
                       char code SMS_UD[]="1067094EBA51654FB54F6076848F66FF01";	//有人入侵你的车!//用户数据长度 +用户数据	注:一个汉字占两个字节  
                       char code SMS_OVER[]="\x1A\r";		// \x 表示后面的是十六进制数,及表示发十六进制的1A加回车
                       char code SendSmg_UDL[]="30";////发送信息,数据长度为 PDU(1)+MR(3)+DA(6)+PID(1)+DCS(1)+VP(1)+UDL(1)+UD(?)=14+UD(?)=???
                       char code User_DA[]="13422535665";	*/


		
			delayms(10);
			//RsPoint=0;
			while(j--)
			{
		    	p=mystrstr(RsBuf,"OK");
				if(NULL!=p)
				{
					//成功发送
					show delayms(1000);
					i=0;
					j=0;
				}
			show delayms(1000);
			}
		}
		show delayms(1000);
	}
	
}	
																					  
/***********************读取短信,并判断******************************
*功    能: 	读取短信,并判断是否"位置"两个字,
			是:	向用户发送GPS信息
			否:跳出循环
*形    参: 
*返 回 值: 
*备    注: 	
************************************************************************/
void ReadMsg()
{
			uchar *p,i=0;
			uchar j=Sendwaits;
						
			ClrBuf(RsBuf,8);
			RsPoint=0;
			ES=1;

			//获取索引号Index_Tc35[]={0,0};
			GetNewIndex();
			delayms(1000);
			SendString("AT\r");
			delayms(1000);
			//串口发送"PDU模式"指令
			SendString("AT+CMGF=0\r");
			delayms(1000);
			SendString("AT+CMGR=");			//向tc35i发送读信息指令"AT+CMGR="//
			SendString(Index_Tc35);	        //输入Index_Tc35//
			SendASC('\r');					//向tc35i发送回车指令// 

			RsPoint=0;
			ES=1;

			while(j--){
			delayms(1000);
			p=mystrstr(RsBuf,Ask_Tc35);
			if(p!=NULL)
			{
				P1_5=0;
				for(i=0;i<8;i++)
				CheckBuf[i]=RsBuf[74+i]; ;
				p=mystrstr(CheckBuf,"4F4D7F6E");		
				if(p!=NULL){
			 	P1_6=0; 			
				Send_GPS();}

			}

			} 	 
		
			 
			
}

/*******************  串口通讯中断接收程序*************************/
void Seril() interrupt 4 using 1
{
  if(RI==1)
  {
    RI=0;
	tmp=SBUF;
    RsBuf[RsPoint++]=tmp;
	RsBuf[RsPoint]=0x00;

	/////////////////////////////////////////////
	if(Rt==1&&GPS_EN==0)				 
	{
		
		if(tmp=='$')
		{  	
			P1_0=0;
			cmd_number=0; //命令类型清空
			mode=1; //接收命令模式
			byte_count=0; //接收位数清空
			seg_count=1;
		}
		if(mode==1)
		{
			P1_1=0;
			cmd[byte_count]=tmp; 
			byte_count++;
			if(tmp==',')
			{  	
				P1_2=0;
				mode=2;
				seg_count=2;
			
			}
		}
		if(mode==2)
		{	 P1_3=0;
			if(cmd[1]=='G'&&cmd[2]=='P'&&cmd[3]=='G'&&cmd[4]=='G'&&cmd[5]=='A')
			{	
				databyte=0;
 				mode=3;
			 }
 		}
		if(mode==3)
		{	if(tmp==',')
			{  	
				seg_count++;
				seg[seg_count]=databyte;
			}
			databuf[databyte]=tmp;
			databyte++;
			if(tmp=='*')
			{  	 P1_4=0;
				databuf[databyte+1]=0x0A;
				databuf[databyte+2]=0x0d;
				Rt=0;
			 }
		}

	}  
 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -