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

📄 tc35i.c

📁 TC35_GSM
💻 C
字号:
/******************************************************************
** 单片机与控制TC35I读短信并控制相应的动作
** 晶 振  频 率:11.0592M

******************************************************************/
#include<reg51.h>	
#include <string.h>	

#define buf_max 72   //缓存长度72

unsigned char i=0; 
unsigned char *send_data;//要发送的数据
unsigned char rec_buf[buf_max];//接收缓存 

/************************函数声明********************************/
void Ini_UART(void);   //串口初始化
void delay(unsigned int delay_time);//延时函数   
bit hand(unsigned char *a);//判断缓存中是否含有指定的字符串 
void clr_buf(void);//清除缓存内容 
void clr_ms(void);//清除信息
void send_ascii(unsigned char *b);//发送ascii数据 
void send_hex(unsigned char b);//发送hex数据 
unsigned int htd(unsigned int a);//十六进制转十进制
void  Serial_init(void);//串口中断处理函数
void  Mes_To_Call(void);
/***************************************************************/

void main(void)
{	
    Ini_UART();   //串口初始化
          
	while(1)     //单片机和模块连接成功
	{ 
	   Mes_To_Call();
    }
}
/**************************串口初始化函数****************************/
/*函数原型:void Ini_UART(void
/*函数功能:串口初始化
/*输入参数:无
/*输出参数:无
/*调用模块:无
/******************************************************************/ 
void Ini_UART(void)   //串口初始化
{
    unsigned char k;
    
    TMOD=0x20;            //定时器1--方式2
    TL1=0xfa;             
    TH1=0xfa;             //11.0592MHZ晶振,波特率为4800
    SCON=0x50;           //方式1
    TR1=1;               //启动定时	
	ES=1;  
	EA=1; 
	for(k=0;k<20;k++)
	    delay(65535);
	while(!hand("OK"))  //用于指示单片机和模块连接
	{	
        send_ascii("AT");      //发送联机指令 
	    send_hex(0x0d); 
	    for(k=0;k<10;k++)
	        delay(65535);		
	}        	
	clr_buf();
 	send_ascii("AT+CNMI=2,1"); //新短信提示 
	send_hex(0x0d);  
	while(!hand("OK"));
	clr_buf();
	send_ascii("AT+CMGF=1");  //TEXT模式 
	send_hex(0x0d);  
	while(!hand("OK"));	
	clr_buf(); 
    clr_ms();                //删除短信
}
/**************************发送字符(ASCII码)函数*********************/
/*函数原型:void send_ascii(unsigned char *b)
/*函数功能:发送字符(ASCII码)
/*输入参数:unsigned char *b
/*输出参数:无
/*调用模块:无
/******************************************************************/ 
void send_ascii(unsigned char *b)         
{
     ES=0;       //串行口禁止中断
    for (b; *b!='\0';b++)
    {
        SBUF=*b;
        while(TI!=1);
		TI=0;   //定时器中断
	}	  
    ES=1;       //串行口允许中断
}


/**************************发送字符(十六进制)函数*********************/
/*函数原型:void send_ascii(unsigned char b)
/*函数功能:发送字符(十六进制)
/*输入参数:unsigned char b
/*输出参数:无
/*调用模块:无
/******************************************************************/ 
void send_hex(unsigned char b)         
{
    ES=0;
    SBUF=b;
    while(TI!=1);
    TI=0;
    ES=1;
}

/**************************清除缓存数据函数****************************/
/*函数原型:void clr_buf(void)
/*函数功能:清除缓存数据
/*输入参数:无
/*输出参数:无
/*调用模块:无
/**********************************************************************/
void clr_buf(void)
{
    for(i=0;i<buf_max;i++)
	    rec_buf[i]=0;
        i=0;
}

/****************************清除短信函数*****************************/
/*函数原型:void clr_ms(void)
/*函数功能:清除短信
/*输入参数:无
/*输出参数:无
/*调用模块:无
/**********************************************************************/
void clr_ms(void)
{
    unsigned char a,b,c,j; 
	send_ascii("AT+CPMS?");//删除短信
	send_hex(0x0d); 
	while(!hand("OK"));	
    a=*(strstr(rec_buf,"+CPMS")+12);
    b=*(strstr(rec_buf,"+CPMS")+13);  
	c=*(strstr(rec_buf,"+CPMS")+14);
	clr_buf(); 			
	if(b==',')
	{  	  
	    for(j=0x31;j<(a+1);j++)
		{
		    send_ascii("AT+CMGD=");//
			send_hex(j);
	        send_hex(0x0d); 
	        while(!hand("OK"));
		    clr_buf();	        
		}
	}
	else if(c==',')
	{  	  
	    for(j=1;j<((a-0x30)*10+(b-0x30)+1);j++)
		{ 
		    send_ascii("AT+CMGD=");//
			if(j<10)
		        send_hex(j+0x30);
			else
			{
			    send_hex((htd(j)>>4)+0x30);
				send_hex((htd(j)&0x0f)+0x30);
			}				    
	        send_hex(0x0d); 
	        while(!hand("OK"));	
			clr_buf();	        
		}
	} 
}
 /*****************判断缓存中是否含有指定的字符串函数******************/
/*函数原型:bit hand(unsigned char *a)
/*函数功能:判断缓存中是否含有指定的字符串
/*输入参数:unsigned char *a 指定的字符串
/*输出参数:bit 1---含有    0---不含有
/*调用模块:无
/**********************************************************************/
bit hand(unsigned char *a)
{ 
    if(strstr(rec_buf,a)!=NULL)
	    return 1;
	else
		return 0;
}

/**************************十六进制转十进制函数**************************/
/*函数原型:uint htd(uint a)
/*函数功能:十六进制转十进制
/*输入参数:要转换的数据
/*输出参数:转换后的数据
/*调用模块:无
/******************************************************************/ 
unsigned int htd(unsigned int a)
{
	    unsigned int b,c;
		b=a%10;
		c=b;
		a=a/10;
		b=a%10;
		c=c+(b<<4);
		a=a/10;
		b=a%10;
		c=c+(b<<8);
		a=a/10;
		b=a%10;
		c=c+(b<<12);
	    return c;
}
/*******************************延时函数*********************************/
/*函数原型:delay(unsigned int delay_time)
/*函数功能:延时函数
/*输入参数:delay_time (输入要延时的时间)
/*输出参数:无
/*调用模块:无
/**********************************************************************/
void delay(unsigned int delay_time)   //延时子程序
{
  for(;delay_time>0;delay_time--);
}
/*******************************串口中断处理函数*********************************/
/*函数原型:void Serial(void)
/*函数功能:串口中断处理
/*输入参数:无
/*输出参数:无
/*调用模块:无
/**********************************************************************/
void Serial() interrupt 4  //串口中断处理
{	
    unsigned char k=0;
	ES=0;	 //关串口中断
	if(TI)	 //发送
	{
		TI=0;
	}
	else	 //接收,处理
	{	
		RI=0;   //关接收中断
		rec_buf[i]=SBUF;
		if(i<buf_max)
		    i++;
		else
		    i=0;
		RI=0;  //关接收中断
		TI=0;
	}
	ES=1;	 //开串口中断
}

/*******************************读短信短信转接电话函数*************************/
/*函数原型:void  Mes_To_Call(void)
/*函数功能:串口中断处理
/*输入参数:无
/*输出参数:无
/*调用模块:无
/**********************************************************************/
void  Mes_To_Call(void)
 {  
    unsigned char a,b,c,j=0;
	unsigned char k;
	    if(strstr(rec_buf,"+CMTI")!=NULL)//若字符串中含有"+CMTI"就表示有新的短信
		{
		    j++;
		    a=*(strstr(rec_buf,"+CMTI")+12);
			b=*(strstr(rec_buf,"+CMTI")+13); 
		    c=*(strstr(rec_buf,"+CMTI")+14); 
			if((b==0x0d)||(c==0x0d))
			{  

		        clr_buf();
		        send_ascii("AT+CMGR=");//发送读指令
			    send_hex(a);
				if(c==0x0d)
				send_hex(b); 
				send_hex(0x0d);	 
	            while(!hand("OK")); 
		        if(strstr(rec_buf,"yao")!=NULL)        //读短信内容
                  {
				    send_ascii("ATD13895767929;");     //拨打电话
	                send_hex(0x0d);
 				    for(k=0;k<50;k++)
                    delay(65535);
	              }
	            else if(strstr(rec_buf,"liang")!=NULL) //读短信内容   
	              {
				    send_ascii("ATD13895709137;");      //拨打电话
	                send_hex(0x0d); 
                    for(k=0;k<80;k++)
	                delay(65535);
	              }
                else if(hand("13895767929"))
 			       {
				     for(k=0;k<100;k++)
	                 delay(65535);
				     send_ascii("ATD13895709137;");//所有操作都在MT(模块终端)中进行
	                 send_hex(0x0d); 
                     for(k=0;k<80;k++)
	                 delay(65535);
                   }
                  	 
	            clr_buf(); 
		        clr_ms();//删除短信

              
            }
		}
 
 }


⌨️ 快捷键说明

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