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

📄 fangdao.c

📁 本代码是用C51开发的
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <fangdao.h>
uchar data int_case;	//中断标志
#define MAX_TM    97             //一个号码暂时定为(12手机号码)*6=72+(ALARM2T:05)*2=20=92
uchar idata uart_buff[MAX_TM]; //通信程序中的缓冲
uchar data send_count,receive_count;
data uchar AT_Command_Type;		//当前发送的命令类型
data uchar AT_Command_Status;		//命令发出以后的返回参数

uchar idata para_temp[MAX_TM-2];
//uchar idata key_temp[MAX_TM];
uchar data read_tmp;             ///读电话本号参数
//uchar num_tmp;     		///写电话本号参数
uchar num_tmp1;			///读短信号码参数
//uchar PHONE_TMP;
uchar TMP_BUF;         // 万用 值
uchar sms_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_100S_cnt;
uchar data timer_200S_cnt;
uchar data sync_count;		//用于TC35控制的计数器
//uchar data Pick_count ;
//uchar data Ring_count;
#define _Nop()    _nop_()
//位变量
bit ring_pin_flag;  		//振铃脚状态
bit pickup_pin_flag;        //摘机脚状态
bit txd_rxd_bit;
bit INT_TMP1;
bit INT_TMP2;
bit at_send_bit;
bit sbc_bit;
//bit Hookoff_bit;
//bit Hookoff_bit1;

void  Int_Timer0(void) interrupt 1 using 3
{


     TH0 = 0xB8;
	TL0 = 0x00; //20ms的时钟基准
   timercount++;
   timer_1S_cnt++;
   if(timer_1S_cnt==50)    //50&200=10000S
    { timer_100S_cnt++;
      timer_1S_cnt=0;
      timer_200S_cnt++;//IO_SBT=~IO_SBT;
      LED_INT0=~LED_INT0;
    }
    if(timer_100S_cnt==60)
    {  //timer_200S_cnt++;
		timer_100S_cnt=0;
	//IO_SBT=~IO_SBT;

    }

    //2.摘挂机事件
	IO_HKS=1;
	if((pickup_pin_flag!=IO_HKS))
	{

		if(IO_HKS==0)
		{
			//int_case|=INT_HANGOFF;
			//int_case&=~INT_PICKUP;
			INT_TMP1=0;
			system_server=SYS_RING;
		}
		else
		  { system_server=SYS_SMSR;INT_TMP1=1;}
		pickup_pin_flag=IO_HKS;

    }

	IO_RING=1;
	if((ring_pin_flag!=IO_RING))
	{

		if(IO_RING==0)
		{
			//int_case|=INT_RINGOFF;
			//int_case&=~INT_RING;
			INT_TMP2=0;
			system_server=SYS_RING;
		}
		else  {  system_server=SYS_SMSR; INT_TMP2=1; }
		ring_pin_flag=IO_RING;
	}




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

       			uart_buff[receive_count++]=SBUF;

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


		if(receive_count>=MAX_TM-1)
       		{
       			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;
       			}
       			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;
        		 // 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<99;i++)
	{
        if(uart_buff[i]==ptr2[j])
        {//第一个字符相同
        	for(k=i;k<70;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,r;

      for(r=1;r<20;r++)
       {
       	if(r<=7)
       	{
       		P0=(0x80>>r);
       	}
       	else
       	{P0=(0x80>>r-8);}

		timer_200S_cnt=0; while(timer_200S_cnt<1) system_sleep;

       	if(system_server==SYS_RING) return;
       	 num_tmp1=r;
		if(READ_TEL(r)!=1)    //读一个短信    at+cmgr=1-19      读指令
		{
			 BELL=1;
			if(system_server==SYS_RING) return;
			timer_200S_cnt=0; while(timer_200S_cnt<2&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
            if(strsearch("+CMTI:"))  return;
			continue;
		}
		 BELL=1;
		para_temp[3]=0x00;
		if(i=strsearch("START"))   //控制系统开启
			 {
                    system_tep=1;
			 		system_server=SYS_START;       return;

		  }
		//--------------------//参数查询命令--为三个语音\三个短信\二个定时时长---------------------------------------------
			else if(i=strsearch("PASST"))  //参数查询命令
			 {

			 		system_server=SYS_PARA;
                     return;

			}
		else
		{


		 			para_temp[0]=(num_tmp1/10)+0x30;para_temp[1]=(num_tmp1%10)+0x30; para_temp[2]=0x0d;para_temp[3]=0x00;
					Send_AT_Command(SMS_CMGD);
					timer_200S_cnt=0; while(timer_200S_cnt<3&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
					 return;

       }

			 return;

	   }




}


void send_sms() //发送短信
{  	uchar  j=1,i=1,k;
     Send_AT_Command(SIM_ID);
   	timer_200S_cnt=0; while(timer_200S_cnt<1&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;

           //根据不同的方式发送短消息内容
		switch(sms_tmp)

		{
		//======================发送收到设备开启指令================================================
			case	smss_alarm:          //ALARM 1
                     IO_OUT=0;

          			 if(!INT_TMP2) read_tmp=0x31;
          			 else read_tmp=0x32;

            		{   TMP_BUF=0;
            			j=PHONE_RD();
            			para_temp[TMP_BUF++]=0x0d;
            			para_temp[TMP_BUF++]=0x0a;
            			para_temp[TMP_BUF++]=0x00;
		 			   timer_200S_cnt=0;
					   Send_AT_Command(SMS_CMGS);
						TMP_BUF=0;
            			para_temp[TMP_BUF++]='S';
            			para_temp[TMP_BUF++]='E';
            			para_temp[TMP_BUF++]='N';
            			para_temp[TMP_BUF++]='D';
            			para_temp[TMP_BUF++]=0x20;
            			para_temp[TMP_BUF++]='O';
            			para_temp[TMP_BUF++]='K';
            			para_temp[TMP_BUF++]=0x20;
            			if(!INT_TMP1) {para_temp[TMP_BUF++]=0x31;   }
            			else if(!INT_TMP2){para_temp[TMP_BUF++]=0x32; }

						para_temp[TMP_BUF++]=0x1a;
            			para_temp[TMP_BUF++]=0x0d;
            			para_temp[TMP_BUF++]=0x00;
            			strcpy(uart_buff,para_temp);
      	 			    Send_AT_Command(AT_COMMAND);
      	 			    at_send_bit=1;
                        send_count=0xff;	//设置接收成功标志
                  		receive_count=0;
      	 			    timer_200S_cnt=0; while(timer_200S_cnt<40&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;

      	 	}
      	 	IO_OUT=1;
      	 		return;
      	 	    break;
       			//tel_tmp
      ////======================================================================
     case  smss_atart  :
               //      num_tmp1=1;
					READ_TEL(num_tmp1);

     				if(i=strsearch("+86"))
     				{
     					for(i=i+2;i<40;i++)
     					{
     						if(uart_buff[i]>='0'&&uart_buff[i]<='9')
				 			para_temp[j++]=uart_buff[i];
                			if(uart_buff[i+1]=='"'&&uart_buff[i+2]==',')
                			{ para_temp[0]=0x20;	para_temp[j++]=0x0d; para_temp[j]=0;break;}
						}
						if(i>=40)     return;
     				}
					timer_200S_cnt=0; while(timer_200S_cnt<2&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
                    Send_AT_Command(SMS_CMGS);
						TMP_BUF=0;
            			para_temp[TMP_BUF++]='S';
            			para_temp[TMP_BUF++]='E';
            			para_temp[TMP_BUF++]='N';
            			para_temp[TMP_BUF++]='D';

            			para_temp[TMP_BUF++]=0x20;
            			    //" ALARM Disable "  巳打开报警功能
            			if(!system_tep)
            			  {
            			  	para_temp[TMP_BUF++]='O';
            				para_temp[TMP_BUF++]='F';
            				para_temp[TMP_BUF++]='F';

            				para_temp[TMP_BUF++]=0x20;   }
            			else
            			//ALARM Enable
            			  { para_temp[TMP_BUF++]='O';
            				para_temp[TMP_BUF++]='N';
            				para_temp[TMP_BUF++]=0x20;

            			  	}

						para_temp[TMP_BUF++]=0x1a;
            			para_temp[TMP_BUF++]=0x0d;
            			para_temp[TMP_BUF++]=0x00;
      	 			    strcpy(uart_buff,para_temp);
      	 			    Send_AT_Command(AT_COMMAND);
      	 			   timer_200S_cnt=0; while(timer_200S_cnt<5&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;


      	 			break;
//==============发送设备参数查询返回值=========================================
		  case smss_para:         //参数查询 记三个可拨号电话,三个可发短信手机号码,两个报警延时时长,
          //read_tmp=0x31;    //第一个
          timer_200S_cnt=0;while(timer_200S_cnt<2&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
          TMP_BUF=0;
           for(read_tmp=0x31;read_tmp<=0x34;read_tmp++)
            {    k=TMP_BUF;
            	j=PHONE_RD();

            	para_temp[TMP_BUF++]=0x0d;
            	para_temp[TMP_BUF++]=0x0a;
            	i=TMP_BUF;
            	timer_200S_cnt=0;while(timer_200S_cnt<2&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;

	      }

		 para_temp[TMP_BUF++]=0x1a;para_temp[TMP_BUF++]=0x0d;para_temp[TMP_BUF++]=0x00;

		       i=80; j=0;
     		 for(k=0;k<=15;k++)
              {
              	uart_buff[i++] =para_temp[k];
     		 }

			READ_TEL(num_tmp1);
            j=0;
     		if(i=strsearch("+86"))
     		{
     					for(i=i+2;i<40;i++)
     					{
     						if(uart_buff[i]>='0'&&uart_buff[i]<='9')
				 			para_temp[j++]=uart_buff[i];
                			if(uart_buff[i+1]=='"'&&uart_buff[i+2]==',')
                			{ para_temp[j++]=0x0d; para_temp[j]=0;break;}
						}
					   if(i>=40)     return;
     		}
        timer_200S_cnt=0; while(timer_200S_cnt<2&&(AT_Command_Status==COMMAND_WAIT)) system_sleep;
	    Send_AT_Command(SMS_CMGS);
		       i=80; j=0; k=20;
     		 for(k=0;k<=15;k++)
              {
              	 para_temp[k]=uart_buff[i++];
     		 }

		 strcpy(uart_buff,para_temp);
      	 Send_AT_Command(AT_COMMAND);

		     break;

		  default:
			break;

⌨️ 快捷键说明

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