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

📄 gsm_co.c

📁 刚做一个短信报警器的
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <cheshi.h>
uchar data int_case;	//中断标志
#define MAX_TM   90         //80一个号码暂时定为(12手机号码)*6=72+(ALARM2T:05)*2=20=92
#define MAX_T  60
uchar idata uart_buff[MAX_TM]; //通信程序中的缓冲
uchar idata send_count,receive_count;
data uchar AT_Command_Type;		//当前发送的命令类型
data uchar AT_Command_Status;		//命令发出以后的返回参数
uchar idata para_temp[MAX_T];     //多用临时用
uchar data read_tmp;             ///读电话本号参数
uchar data num_tmp1;			///读短信号码参数
uchar data TMP_BUF;         // 万用 值
uchar data sms_tmp;			///参数代码
uchar idata TEL_temp[20];   //存对方号码,
#define IO_OUT			P3_6  ///蜂鸣器
uchar data system_server ;    //系统状态
//多用值一般不用于多级
uchar tmp_i,tmp_j ;
//---定时用-----------
uint  data timercount;		//50MS定时器,
uchar data timer_1S_cnt;
uchar data timer_10S_cnt;
uchar data timer_S_cnt;
//--------------------
uchar idata LED_P0;
uchar data ring_cnt;    //振铃用
uchar idata PT2272_BUF;//存储用
uchar bdata PT2272_TMP;
sbit PT2272_D0=   PT2272_TMP^0;
sbit PT2272_D1=   PT2272_TMP^1;
sbit PT2272_D2=   PT2272_TMP^2;
sbit PT2272_D3=   PT2272_TMP^3;
sbit PT2272_VT=   PT2272_TMP^4;
//位变量
bit TC35_bit  ;
bit ring_bit  ;  // 电话呼入 2
bit PT2272_BIT;   //315M-是否连结到设备上

bit txd_rxd_bit;    //接收正确的指令中断
bit at_send_bit;    //发送允许


// 中断 IO 模拟脚
bit io_p00_bit;
bit io_p01_bit;
bit io_p02_bit;
bit io_p03_bit;
bit io_p04_bit;
bit io_p05_bit;
bit io_p06_bit;
bit io_p07_bit;
// IO设置开启与关闭
bit io_p00_on;
bit io_p01_on;
bit io_p02_on;
bit io_p03_on;
bit io_p04_on;
bit io_p05_on;
bit io_p06_on;
bit io_p07_on;


 //uchar Read_Call_ID(void);


void int_p02() // 发短中文短信前设置。 P0.2灯闪,同时蜂鸣器长叫一声
{
     LED_INT2=1; BELL=0;
     for(tmp_i=0;tmp_i<8;tmp_i++)    //灯闪三下
     {  timercount=0;  while(timercount<10) watch_dog_clear;
     	LED_INT2=~LED_INT2;
     }
     BELL=1; LED_INT2=0; io_p02_on=1;

      read_tmp=0x31;  TMP_BUF=0;    //读电话本1
   	  PHONE_RD(); para_temp[TMP_BUF++]=0x0d;para_temp[TMP_BUF++]=0x00;
   	  TMP_BUF=0;   // 将读出的电话号码转存起来,做发送对方号码
   	  do{
   	       TEL_temp[TMP_BUF]=para_temp[TMP_BUF];  TMP_BUF++;
   	    }while( TMP_BUF<=18);
      sms_tmp=smss_para;
      send_sms();

}
void int_p03() // 发短中文短信前设置。 P0.2灯闪,同时蜂鸣器长叫一声
{
     LED_INT2=1; BELL=0;
     for(tmp_i=0;tmp_i<8;tmp_i++)    //灯闪三下
     {  timercount=0;  while(timercount<10) watch_dog_clear;
     	LED_INT2=~LED_INT2;
     }
     BELL=1; LED_INT2=0; io_p02_on=1;

      read_tmp=0x31;  TMP_BUF=0;    //读电话本1
   	  PHONE_RD(); para_temp[TMP_BUF++]=0x0d;para_temp[TMP_BUF++]=0x00;
   	  TMP_BUF=0;   // 将读出的电话号码转存起来,做发送对方号码
   	  do{
   	       TEL_temp[TMP_BUF]=para_temp[TMP_BUF];  TMP_BUF++;
   	    }while( TMP_BUF<=18);
      sms_tmp=smss_tel;
      send_sms();

}
void  Int_Timer0(void) interrupt 1 using 3
{


     	 TH0 = 0xB8;
		 TL0 = 0x00; //20ms的时钟基准
    watch_dog_clear;
   timer_1S_cnt++;   timercount++;
   if(timer_1S_cnt==50)    //20×50=1000MS  =1S
    { timer_10S_cnt++; timer_1S_cnt=0;
      timer_S_cnt++;
 	  LED_INT0=~LED_INT0;

    }                              //1秒=1000毫秒
    if(timer_10S_cnt==10)   //10S
    {
	   timer_10S_cnt=0;

	}


   //-------P2.7-D0,P2.6-D1,P2.5-D2,P2.4-D3,    P2.3-VT-315M有信号中断,----------------------------
   //如果有PT2272接入 P2接入口会为低,P2.3-P2.7=0;
    P2=0xff;
    PT2272_BUF= P2&0x0F;     //加VT就是0xf1
    if(PT2272_BUF==0)  //状态检测
    {    PT2272_BIT=1; //可以进行中断
    }

    else if(((PT2272_BUF>0)&&((PT2272_BUF&0x0f)!=0x0f))&&PT2272_BIT==1) //这种方法只用于PT2272-M4的芯片
    {   PT2272_TMP= PT2272_BUF;
    	PT2272_BIT=0;
    }

    IO_P25=1;        //外部中断 P25口
	if((io_p00_bit!=IO_P25))
	{
		if(IO_P25==0)
		{ io_p00_on=0;
		}

		io_p00_bit=IO_P25;
	}
    IO_P24=1;        //外部中断 P24口
	if((io_p02_bit!=IO_P24))
	{
		if(IO_P24==0)
		{ io_p02_on=0;
		}

		io_p02_bit=IO_P24;
	}
	IO_P35=1;        //外部中断 P35口
	if((io_p03_bit!=IO_P35))
	{
		if(IO_P35==0)
		{ io_p03_on=0;
		}

		io_p03_bit=IO_P35;
	}



}
/*****************************************************************************
 *                   TC35 的命令列表,与中断服务程序                          *
 *****************************************************************************/
void  Int_Uart(void) interrupt 4 using 3  //串口的中断程序
{
	if(TI)//数据模式与命令方式共用
	{
    		TI=0;

			if(send_count>=MAX_TM-5)  send_count=0;

			if((uart_buff[send_count]==0)) //应该检测命令结束代码,检测到时结束通信
			{
                	at_send_bit=1;
                	send_count=0xff;
                	uart_buff[0]=0;		//清除接收缓冲区
                	receive_count=0;
                	 return;
            }
			else
			{   if(uart_buff[send_count]<=0xB0)
				  SBUF=uart_buff[send_count++];

                   if((uart_buff[send_count]==0)) //应该检测命令结束代码,检测到时结束通信
					{ at_send_bit=1;
                	 send_count=0xff;
                	 uart_buff[0]=0;		//清除接收缓冲区
                	 receive_count=0;    return;
             		}
			}


    	receive_count=0;
    }

	else
	if(RI) //命令方式
		{
        	RI=0;
        	if(at_send_bit==0)      return;
        	if((send_count==0xff)&&(receive_count<MAX_TM-3))//没有发送时才能进行接收
        	{	//所有的命令返回都是处于 0x0A [Result] 0x0D 之间,其他命令,不会出现这种情况
                uart_buff[receive_count++]=SBUF;
        	}
        	 else
        	 {   receive_count=0;
       			 return;
       		 }
		  if(receive_count>=MAX_TM-3)
       		{
       			if(AT_Command_Type==SMS_CMGR)    receive_count=0;

         		else
		   		 {	receive_count=0;
		   	 		AT_Command_Status=COMMAND_OK;
        			return;
				 }
			     receive_count=0;
 			}

       	if((receive_count==2)&&(uart_buff[1]==0x0d))//没有包含为其他信息的命令返回
       		{	//接收到一个命令回应,可能为,0-OK  1-CONNECT 2-RING 3-NO CARRIER 4-ERROR
       			//只返回OK

       			if(uart_buff[0]=='0')
       			{ AT_Command_Status=COMMAND_OK;  //txd_rxd_bit=1;
       			}
       			if(uart_buff[0]=='2')
       			{    ring_bit=1;  ring_cnt++;
       				 AT_Command_Status=COMMAND_OK;  //txd_rxd_bit=1;
       				 ES=1;			//设置发送指针
     				 receive_count=0;
	  				 send_count=0xff;
       			}
       			else if(uart_buff[0]=='4'||uart_buff[0]=='3')
       		    {  AT_Command_Status=COMMAND_ERROR;}
       			else AT_Command_Status=COMMAND_UNKNOW;
  				 txd_rxd_bit=1;
       			 uart_buff[receive_count]=0;
       			 return;
		    }

   		else if((uart_buff[receive_count-1]==0x0d)
   			  &&(receive_count>=3)
   			  &&(uart_buff[receive_count-3]==0x0a)
   		      &&((uart_buff[receive_count-2]=='0')))
   		    {  ///可能是包含为其他信息的命令返回
        		  uart_buff[receive_count]=0;//RECEIV OK ANSWER, with some message
                  AT_Command_Status=COMMAND_OK;     txd_rxd_bit=1;

        	}

         else if((AT_Command_Type==SMS_CMGS||AT_Command_Type==AT_COMMAND)&&uart_buff[2]=='>')
        	{	AT_Command_Status=COMMAND_OK;    txd_rxd_bit=1;
        		return;
        	}


	}//End of if(RI)
}
/*********************************************************************
 *                  C51中字符串函数的扩充                            *
 *********************************************************************/

uchar strsearch(uchar *ptr2)//查字符串*ptr2在*ptr1中的位置
//本函数是用来检查字符串*ptr2是否完全包含在*ptr1中
//返回:  0  没有找到
//       1-255 从第N个字符开始相同
{
//、	uchar max_length;
	uchar i,j,k;
	uchar flag;
	if(ptr2[0]==0) return(0);
	flag=0;
	for(i=0,j=0;i<MAX_TM-2;i++)
	{
        if(uart_buff[i]==ptr2[j])
        {//第一个字符相同
        	for(k=i;k<MAX_TM-2;k++,j++)
        	{
        		if(ptr2[j]==0)//比较正确
        			return(i+1);               //返回值是整数,不含0
        		if(uart_buff[k]!=ptr2[j]) break;
        	}
        	j=0;
        }
	}
	return(0);
}
//=============================================================================
//                  话机被叫程序
//=============================================================================
//=============================================================================
//                  话机被叫程序
//=============================================================================
uchar Read_Call_ID(void)//读出来电显示的号码
//正确  TRUE
//错误  FALSE
//号码  string_temp[0..16],最多显示前16位
//呼叫方式 stringt_temp[20]
{
	uchar i,j,r;

	Send_AT_Command(CALL_ID);//+CLCC:1,1,4,0,0,"02138950224",129
	//	语音呼入

	//string_temp[0]=0;
	//string_temp[20]=0;  //读来电显示出错时设为1
	if(receive_count<15) return(FALSE);
	uart_buff[receive_count]=0;
	 ring_bit=0;

      ES=1;			//设置发送指针
      receive_count=0;
	  send_count=0xff;
	  RI=0 ;
	j=0;
//	i=strsearch(uart_buff,"CLCC");//查第一个CLCC
    i=strsearch("CLCC");//查第一个CLCC
	if(i==0) return(FALSE);
	j=j+i;
	for(r=0;r<9;r++)
	{
	if(uart_buff[j]==',')   break;
	else  j=j+1;
   }
	if(r>=9) return(FALSE);
	j=j+1;
	for(r=0;r<4;r++)
	{
		if(uart_buff[j]==',')    break;
		else  j=j+1;
    }
	if(r>=4) return(FALSE);
	j=j+1;
	//检查是否为来话呼叫
	if(uart_buff[j]!='4') return(FALSE);
	for(r=0;r<4;r++)
	{
	if(uart_buff[j]==',')    break;
	else  j=j+1;
    }
	if(r>=4) return(FALSE);
	j=j+1;
//	string_temp[20]=uart_buff[j];//读出呼叫类型
	//只要能读出呼叫类型就认为正确
   //	i=strsearch(&uart_buff[j],"\x22");//查第一个"号
   	for(r=0;r<6;r++)
	{
	if(uart_buff[j]=='\x22')   break;
	else  j=j+1;
    }

	if(r>=6)
		return(FALSE);
   	j=j+1;
   i=j;
   //	i=strsearch(&uart_buff[j],"\x22");//查第二个"号
   	for(r=0;r<20;r++)
	{
	if(uart_buff[j]=='\x22')   break;
	else  j=j+1;
   }
   	if(i<=2) return(FALSE);//没有来电号码
   	for(r=0;r<22;r++)
	{
       para_temp[r+2]=uart_buff[i++];
	   if(uart_buff[i]=='\x22')
	   { para_temp[r+3]=0x0d;para_temp[r+4]=0x00;uart_buff[i++]=0x0d;uart_buff[i++]=0; break;}

	 }
     uart_buff[i++]=0;uart_buff[i++]=0;
   	return(TRUE);
}

void ring_auto()   //自动监听  当有电话呼入,只有车主电话可以监听,别的电话会自动挂机
{   uchar i=0;
	 ring_bit=0;
	 ring_cnt=1;
	 LED_INT6=0;
     timercount=0;
     i=0;


          		if(Read_Call_ID())    //读来电显示
              	{  	 ring_cnt=0;
              		timer_S_cnt=0; while(timer_S_cnt<6) watch_dog_clear;
                    if(ring_cnt>=1)
              		 { ring_cnt=0;  Send_AT_Command(PICK_UP);
   				   	  	ES=1;			//设置发送指针
    					receive_count=0;
					    send_count=0xff;
    					uart_buff[0]=0;
						 RI=0 ;
    					AT_Command_Status=COMMAND_WAIT;	//设置接收成功标志
   				   	 	while((AT_Command_Status==COMMAND_WAIT))  watch_dog_clear;
   				   	 }
                     Send_AT_Command(HOOKOFF);
					 ring_bit=0;
					 ring_cnt=0;
					 LED_INT6=1;
					return;

              	}
              	else   { LED_INT6=1; return;   }



       LED_INT6=1;
}

uchar P2_INIT()
{

⌨️ 快捷键说明

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