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

📄 cheshi.#3

📁 GSM MCU 开发板
💻 #3
📖 第 1 页 / 共 3 页
字号:
#include <cheshi.h>
uchar data int_case;	//中断标志
#define MAX_TM    100             //一个号码暂时定为(12手机号码)*6=72+(ALARM2T:05)*2=20=92
uchar xdata uart_buff[MAX_TM]; //通信程序中的缓冲
uchar data send_count,receive_count;
data uchar AT_Command_Type;		//当前发送的命令类型
data uchar AT_Command_Status;		//命令发出以后的返回参数
//uchar string_temp[20];
uchar idata para_temp[MAX_TM];
//uchar idata key_temp[MAX_TM];
uchar data read_tmp;             ///读电话本号参数
uchar num_tmp1;			///读短信号码参数
uchar TMP_BUF;         // 万用 值
uchar sms_tmp;			///参数代码
uchar batt_tmp;         //电池
uchar  tel_tmp;
uchar  tel_tmp1;			///读电话码地址
data uchar  system_tep ;          ///报警功能开启与关闭参数
uchar data system_server ;    //系统状态
uint  data timercount;		//50MS定时器,
uchar data timer_1S_cnt;
uchar data timer_10S_cnt;
uchar data timer_S_cnt;
uchar data timer_led1_cnt;  //第一个灯闪计数器
uchar data timer_led2_cnt;  //第二个灯闪计数器
uchar data ring_cnt;
uchar data eer_int;       //收到TC35模块来的错识代码计数器
//uchar data sync_count;		//用于TC35控制的计数器
//uchar data Pick_count ;
//uchar data Ring_count;
#define _Nop()    _nop_()
//位变量
bit hsk1_pin_flag;
bit ring_pin_flag;//振铃脚状态
bit ring_bit  ;  // 电话呼入 2
bit pickup_pin_flag;        //摘机脚状态
bit txd_rxd_bit;
bit INT_TMP1;
bit INT_TMP2;
bit at_send_bit;
bit tel1_bit;  //指定呼入程序开启与取消
bit  sms_tmp_bit;			//:发短信 QXA 可立即取消10的受控设置。但不影响***的运行

bit p2_stop_bit;
// 中断 IO 模拟脚
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_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);

//bit Hookoff_bit;
//bit Hookoff_bit1;
void int_p01() //  p1口设置
{   uchar i;
    io_p01_on=1;
    // if(!IO_P01==0) return;
     LED_S2=0;
     for(i=0;i<6;i++)    //灯闪三下
     {  timercount=0;
     	while(timercount<1) ;
     	LED_INT=~LED_INT;
     }
      ring_bit=0;
      timercount=0;
      ES=1;			//设置发送指针
      receive_count=0;
	  send_count=0xff;
	RI=0 ;
      while(timercount<120)     //2分钟
      {   if(ring_bit)
          {  if(Read_Call_ID())    //读来电显示
              {   para_temp[0]=0x31; para_temp[1]=',';
             	  Send_AT_Command(PHONE_WRITE);
                  Send_AT_Command(HOOKOFF);
   				 // timer_S_cnt=0;timer_1S_cnt=0;
   				  //while(timer_S_cnt<1&&(AT_Command_Status==COMMAND_WAIT))  ;
				  io_p01_bit=0;
				  return;
               }
              ring_bit=0;

          	}


       }



}

void int_p02() //  p2口设置
{ // uchar i=;
     if(tel1_bit)   return;  //测试是关闭返回
   //  if(!IO_P02==0) return;
      if(p2_stop_bit)  return;
    	 LED_S2=0;
       if(ring_bit)
          {   Read_Call_ID();    //读来电显示
          }

      	   tel_diat();




}
ring_auto()   //自动监听
{   uchar i=0,j;
	 ring_bit=0;
	   ring_cnt=1;
       timercount=0;
       while(timercount<30)     //2分钟
       {
       		if(ring_cnt>=4)
          	{  if(Read_Call_ID())    //读来电显示
              	{   //if(strsearch("para_temp"))
                  	read_tmp=0x31;
   					Send_AT_Command(PHONE_READ);   //读电话号码

					for(j=7;j<12;j++)
					{
						if(uart_buff[j]=='\x22')   break;
    				}
    				i=2 ;
    				j++ ;
					for(;j<25;j++)
					{   if(uart_buff[j]=='\x22')   break;
						if(uart_buff[j]!=para_temp[i++])  break;


					}
                     if(uart_buff[j]!='\x22')
					 {  ring_bit=0; ring_cnt=0;
					      Send_AT_Command(HOOKOFF);
					   return;}

					 Send_AT_Command(PICK_UP);
					 timercount=0;
   				   	 while(timercount<10&&(AT_Command_Status==COMMAND_WAIT))   system_sleep;

                     Send_AT_Command(HOOKOFF);
					ring_bit=0;
					 ring_cnt=0;
					return;

              	 }

           	}
       }
	}
void int_p04() //  p4口设置
{
    //  if(tel1_bit)   return;  //测试是关闭返回
    // if(!IO_P01==0) return;
      io_p04_on=1;
      timercount=0;
      while(timercount<30) io_p04_bit=~io_p04_bit;    //2分钟
      if(io_p04_on) return;
      tel_diat();

}
void   tel_diat2();

void int_p07() //  p4口设置
{
    //  if(tel1_bit)   return;  //测试是关闭返回
    // if(!IO_P01==0) return;
      io_p07_on=1;
      timercount=0;
    //  while(timercount<10) io_p07_bit=~io_p07_bit;    //2分钟
     // if(io_p07_on) return;
      tel_diat2();

}

void  Int_Timer0(void) interrupt 1 using 3
{

   #if  CPU_TYPE2==PLC900
	if(eer_int<=9)
	   {
			EA = 0; //关闭中断
			WFEED1 = 0xA5; //执行清零第一部分
			WFEED2 = 0x5A; //执行清零第二部分
			EA = 1; //开中断
			TH0 = 0x27;  //7.373
			TL0 = 0xFF;
		}


  #elif  CPU_TYPE2==C8051F330
     	 TH0 = 0x9e;
    	 TL0 = 0x38;

  #endif
 //  timercount++;
   timer_1S_cnt++;
   timer_led2_cnt++;
   timer_led1_cnt++;
   if(timer_1S_cnt==40)    //25×40=1000MS  =1S
    { timer_10S_cnt++;
      timer_1S_cnt=0;
      timer_S_cnt++;


    }
    if(timer_10S_cnt==16)   //10S
    {  //timer_S_cnt++;
	//LED_INT=~LED_INT;
	   timer_10S_cnt=0;
	    timercount++;
	}



   //-------------------------------------
    IO_P01=1;
	if((io_p01_bit!=IO_P01))
	{

		if(IO_P01==0)
		{
			//int_case|=INT_RINGOFF;
			//int_case&=~INT_RING;
			io_p01_on=0;
			//system_server=SYS_RING;
		}
		//else  {  system_server=SYS_SMSR; io_p01_on=1; }
		io_p01_bit=IO_P01;
	}
  //---------------------------------------------------
   IO_P02=1;
	if((io_p02_bit!=IO_P02))
	{

		if(IO_P02==0)
		{
			//int_case|=INT_RINGOFF;
			//int_case&=~INT_RING;
			io_p02_on=0;
			//system_server=SYS_RING;
		}
		else  {  system_server=SYS_SMSR; io_p02_on=1; }
		io_p02_bit=IO_P02;
	}

	//---------------------------------------------
	IO_P03=1;
	if((io_p03_bit!=IO_P03))
	{

		if(IO_P03==0)
		{
			//int_case|=INT_RINGOFF;
			//int_case&=~INT_RING;
			io_p03_on=0;
			//system_server=SYS_RING;
		}
		else  {  system_server=SYS_SMSR; io_p03_on=1; }
		io_p03_bit=IO_P03;
	}
//--------------------------------------------------
	IO_P04=1;
	if((io_p04_bit!=IO_P04))
	{

		if(IO_P04==0)
		{
			//int_case|=INT_RINGOFF;
			//int_case&=~INT_RING;
			io_p04_on=0;
			//system_server=SYS_RING;
		}

		io_p04_bit=IO_P04;
	}
//-----------------------------------------------------------------
    IO_P07=1;
	if((io_p07_bit!=IO_P07))
	{

		if(IO_P07==0)
		{
			//int_case|=INT_RINGOFF;
			//int_case&=~INT_RING;
			io_p07_on=0;
			//system_server=SYS_RING;
		}
		//else  {  system_server=SYS_SMSR; io_p04_on=1; }
		io_p07_bit=IO_P07;
	}
  //-------------------------------------------------------



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

			if(send_count>=MAX_TM-1)  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-2))//没有发送时才能进行接收
        	{	//所有的命令返回都是处于 0x0A [Result] 0x0D 之间,其他命令,不会出现这种情况

       			uart_buff[receive_count++]=SBUF;

        	}
        	 else
        	 {
       			//ACC=SBUF;
       			return;
       		 }


		if(receive_count>=MAX_TM-2)
       		{  eer_int=0;
       			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

       			uart_buff[receive_count]=0;
       			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;
                  eer_int=0;
        		 // if(uart_buff[receive_count-2]=='0')
        		 // {AT_Command_Status=COMMAND_OK;}
        		// else{ AT_Command_Status=COMMAND_WAIT; receive_count=0;}
        	}

         else if(AT_Command_Type==SMS_CMGS&&uart_buff[3]=='>')
        	{	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);
	//max_length=strlen(ptr)+1;
	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);
}

//============================================
//==========       读写短信程序
//====================================================
void read_sms()
{    uchar  i,t,j,r;

      for(r=1;r<20;r++)
       {
       	if(system_server==SYS_RING) return;
       	 num_tmp1=r;
		if(READ_TEL(r)!=1)    //读一个短信    at+cmgr=1-19      读指令
		{   //timer_S_cnt=0;timer_1S_cnt=0;
			//while(timer_S_cnt<15) system_sleep;
			if(system_server==SYS_RING) return;
			timer_S_cnt=0;timer_1S_cnt=0; while(timer_S_cnt<10) system_sleep;
            if(!io_p03_on)   p2_stop_bit=1;     //P3如为低电平即可马上取消2的设置
            else if(!io_p01_on)  int_p01();
             else if(!io_p02_on)  int_p02();
             else if(!io_p04_on)  int_p04();
             else if(!io_p07_on)  int_p07();
             else { if(ring_bit)  ring_auto();
                   else  ring_bit=0; }
              //+CMTI: "SM",1
            if(strsearch("+CMTI:"))  return;
            io_p01_bit=0;
			io_p02_bit =0;
			io_p04_bit=0;

           if(r==16)
           {//timer_S_cnt=0;timer_1S_cnt=0; while(timer_S_cnt<1&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
          // Send_AT_Command(SMSS_ID);
		  //  timer_S_cnt=0;timer_1S_cnt=0; while(timer_S_cnt<1&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;

           	}
			continue;
		}

      //---------------手机号码设置-------------
		if((i=strsearch("HS")))       // 发短信 HSP 13*********(A者);发短信 HSD 13*********(B者)
		{
			if(!io_p07_on)    goto DELTER; 		//**当P7口为低电平时,可使9开始受控,
            if(sms_tmp_bit)  goto DELTER;   //可立即取消10的受控设置
			 tel_tmp1=i-1;
            i=i+1;t=0;  j=2;
			if((uart_buff[i]=='P'))
			{
			  	para_temp[0]=0x31;
			}
			 else if((uart_buff[i]=='D'))
               { para_temp[0]=0x32;
            }
            else goto DELTER;
			  	 //短信发送的手机号码在存在SIM卡中的是4,5,6位置
											     //要存的手机号码位置如果是1那在SIM卡中的位置就是4
	    			i=i+1;
			  		tel_tmp=i;          //手机号码的起始位置
		     	system_server=SYS_TEL;

	     }


		//-----  ---设维护,进行设备人工关闭  ------------------
			 else if(i=strsearch("QXP2"))   //控制关闭系统
			 {
				//	sms_tmp=0;
			 		//system_server=SYS_RING;
			 		tel1_bit=1;  //短信取消P2口线设置:发送短信 QXP2 即可取消2的设置.
			 		 goto DELTER;
			 		//continue;

			}
            else if(i=strsearch("QXA"))  // 发短信 QXA 可立即取消10的受控设置。但不影响***的运行。

			 {

			 		sms_tmp_bit=1;
			 		 goto DELTER;

		     }
            else if(i=strsearch("XHT"))   // P5口将变为低电平
			 {
				IO_P05=0;  //短信取消P2口线设置:发送短信 QXP2 即可取消2的设置.

			 goto DELTER;


			}
		else if(i=strsearch("GYT"))   //发短信 GYT  P5口将变为高电平
			 {
				IO_P05=1;  //短信取消P2口线设置:发送短信 QXP2 即可取消2的设置.

			 	 goto DELTER;

			}
 		//--------------------------设备从新启--------------------------
			 else if(i=strsearch("START"))   //控制系统开启
			 {

⌨️ 快捷键说明

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