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

📄 alert2.c

📁 用c语言实现的在arm上运行的无线报警程序
💻 C
📖 第 1 页 / 共 2 页
字号:
   for(; dly>0; dly--) 
      for(i=0; i<50000; i++);
}
///////////////////////

/****************************************************************************
* 名称:judge_s()
* 功能:判断手机串口接收数据是否正确
* 入口参数:无
* 出口参数:无
****************************************************************************/
void judge_s(char *sznum,uint8 index)
{  
      
    uint32 i,ii;
       
    for(i=3;i<256;i++) //cpbs的返回不回超过256个字符
    {        
       if((*(sznum+i-3)==0X0D)&&(*(sznum+i-2)==0X0A)&&(*(sznum+i-1)=='O')&&(*(sznum+i)=='K'))
        {
          atflag=index;
          if(atflag==5)//如果读取电话号码命令发送成功
           {
             pptr=sznum;
             if((pptr=strstr(pptr,"+CPBR:"))!=NULL)
               {
                 pptr=pptr+10;
                 strncpy(num2,pptr,11);
               } 
           }
           
          if(atflag==7)//重开外部中断
          {
            alert=0;
            int0count=0;
            VICIntEnable = 0x00004000;		// 使能EINT0中断
            EXTINT = 0x07;					// 清除外部中断标志	
          }
          
          for(ii=0;ii<256;ii++)
          *(sznum+ii)=0;
          j=0;
          VICIntEnClr = 0x00000010;	        //关定时器中断
          cc=0;                             //接收完成就关定时器 cc清零
          
          count=0;
          break;
         }
       else continue;
       
       if(cc>2)  
            {
              VICIntEnClr = 0x00000010;	        //关定时器中断
              cc=0;
              for(ii=0;ii<256;ii++)
              *(sznum+ii)=0;
              j=0;
              
              if(atflag==6)
              {
               alert=0;
               int0count=0;
               VICIntEnable = 0x00004000;		// 使能EINT0中断
               EXTINT = 0x07;					// 清除外部中断标志	
              }
              count=0;                            
              break;//定时器1秒定时,at指令发出4秒没有连接上程序重新运行
             }
             
      
     }          

}
/****************************************************************************
* 名称:judge_s6()
* 功能:判断手机串口接收数据是否正确
* 入口参数:无
* 出口参数:无
****************************************************************************/
void judge_s6(char *sznum,uint8 index)
{  
      
    uint32 i,ii;
       
    for(i=2;i<256;i++) //cpbs的返回不回超过256个字符
    {        
       if((*(sznum+i-2)==0X0D)&&(*(sznum+i-1)==0X0A)&&(*(sznum+i)=='>'))
        {
          atflag=index;
         
          
          for(ii=0;ii<256;ii++)
          *(sznum+ii)=0;
          j=0;
          VICIntEnClr = 0x00000010;	        //关定时器中断
          cc=0;                             //接收完成就关定时器 cc清零
          
          count=0;
          break;
         }
       else continue;
       
       if(cc>2)  
            {
              VICIntEnClr = 0x00000010;	        //关定时器中断
              cc=0;
              for(ii=0;ii<256;ii++)
              *(sznum+ii)=0;
              j=0;
              
              count=0;                            
              break;//定时器1秒定时,at指令发出4秒没有连接上程序重新运行
             }
             
      
     }          

}
/****************************************************************************
* 名称:send_s()
* 功能:手机串口发送命令
* 入口参数:无
* 出口参数:无
****************************************************************************/
void send_s(char *string,char *ssnum)
{
 uint32 ii;
  if(count==0)
  {
   for(ii=0;ii<256;ii++)
   *(ssnum+ii)=0;
   if(atflag==3)
   {
     strcat(string,num);
     strcat(string,"\",129,\"\"\r");
   }
   if(atflag==6)
   { 
      gsmInvertNumbers(num2, TPA, strlen(num2));	// 转换TP-DA到目标PDU串
      strcat(string,TPA);//要发送的号码
      strcat(string,"000801088f668f8662a58b66");//发送的信息  车辆报警
      strcat(string,"\x01a");//回车
   }
   UART1_SendStr(string);
   j=0;
   VICIntEnable = 0x00000010;				// 使能定时器0中断
   cc=0;
   
   count=1;
  }
}

/****************************************************************************
* 名称:fn_alert()
* 功能:完成从手机电话薄读取电话号码并短信报警
* 入口参数:无
* 出口参数:无
****************************************************************************/
void fn_alert(void)
{
  if(atflag==4)
  {                
   send_s(CPBS2,REC_5);   //读取电话号码
   judge_s(REC_5,5);
  }
  
  if(atflag==5)
  {
   send_s(cmd,REC_6);    //发送长度
   judge_s6(REC_6,6);
  }
  
  if(atflag==6)
  {
   send_s(pdu,REC_7);    //发送数据
   judge_s(REC_7,7); 
  }
}
/****************************************************************************
* 名称:fn_num()
* 功能:完成将电话号码存取在手机电话薄
* 入口参数:无
* 出口参数:无
****************************************************************************/
void fn_num(void)
{
 if(atflag==2)
  {                //atflag=2时,REC_3接收,接收正确了atflag=3
   send_s(CPBS,REC_3);   //存电话号码与卡中
   judge_s(REC_3,3);
  }
  
 if(atflag==3)
  {
   send_s(CPBS1,REC_4);     //存电话号码
   judge_s(REC_4,10); //给定10的原因是,在报警信号来的时候,atflag=4,避免冲突,10不被占用
  }
  
 if(atflag==10)
 //电话号码写进电话薄
  {
   pc_num=0;     //清除pc端下载电话号码读取成功标志
   num_flag=1;   //电话号码已经写进电话薄标志
  }
}
/****************************************************************************
* 名称:readnum()
* 功能:从串口接收的数据中提取电话号码
* 入口参数:无
* 出口参数:无
****************************************************************************/
uint8 readnum(void)
{
 uint8 i;
 ptr=REC_2;
 if((ptr=strstr(ptr,"TRCMD"))!=NULL)
        {
           ptr+=5;
           strncpy(num,ptr,11);
           atflag=2;
           uart0int=0;  //可以再次设置
           m=0;
           for(i=0;i<17;i++)
           REC_2[i]=0;
           return 1;
        }
 else
 return 0;

}

///////////////////////
/****************************************************************************
* 名称:main()
* 功能:
****************************************************************************/
int  main(void)
{
  
    UARTMODE  uart1_set;
    UARTMODE  uart0_set;
   
    PINSEL0 = 0x55550005;                // 设置I/O连接到UART1  uart0 蜂鸣器
    PINSEL1 = 0x00000001;                //外部中断0
    
    IODIR=FENGM|P06;                         //蜂鸣器 定义为输出
    
    IOCLR = FENGM;                       //蜂鸣1声
    DelayNS(5);
    IOSET = FENGM;
    DelayNS(5);
    
    IOSET=P06;
    DelayNS(50);
    IOCLR=P06;
    
    //串口1 
   uart1_set.datab = 8;                 // 8位数据位  
   uart1_set.stopb = 1;                 // 1位停止位
   uart1_set.parity = 0;                // 无奇偶校验
   UART1_Ini(9600, uart1_set);          // 初始化串口模式
   
   U1FCR = 0x01;                        // 使能FIFO,并设置触发点为8字节
   U1IER = 0x01;                        // 允许RBR中断,即接收中断
  //串口0
   uart0_set.datab = 8;                 // 8位数据位
   uart0_set.stopb = 1;                 // 1位停止位
   uart0_set.parity = 0;                // 无奇偶校验
   UART0_Ini(9600, uart0_set);          // 初始化串口模式
   
   U0FCR = 0x01;                        // 使能FIFO,并设置触发点为8字节
   U0IER = 0x01;                        // 允许RBR中断,即接收中断
  //定时器0   1s定时
    T0PR = 99;			    // 设置定时器分频为100分频,得110592Hz
	T0MCR = 0x03;		    // 匹配通道0匹配中断并复位T0TC
	T0MR0 = 110592;	        // 比较值
	T0TCR = 0x03;		    // 启动并复位T0TC
	T0TCR = 0x01; 
	
	 
   
   m=0;
   atflag=1;
   j=0;
   alert=0;
   int0count=0;
   
   
   // 设置中断允许 
   VICIntSelect = 0x00000000;           // 设置所有通道为IRQ中断
   
   VICVectCntl1 = 0x27;                 // UART1中断通道分配到IRQ slot 0,即优先级最高  //从0x20到0x30 16个中断通道号  书p155,156
   VICVectAddr1 = (int)IRQ_UART1;       // 设置UART1向量地址
   VICIntEnable = 0x00000080;           // 使能UART1中断
   
   VICVectCntl3 = 0x26;                 // UART0中断通道分配到IRQ slot 0,即优先级最高  //从0x20到0x30 16个中断通道号  书p155,156
   VICVectAddr3 = (int)IRQ_UART0;       // 设置UART0向量地址
   VICIntEnable = 0x00000040;           // 使能UART0中断
   
   VICVectCntl0 = 0x2E;
   VICVectAddr0 = (int)IRQ_Eint0;
   VICIntEnable = 0x00004000;		// 使能EINT0中断
   EXTINT = 0x07;					// 清除外部中断标志	
   
   VICVectCntl2 = 0x24;	// 定时器0中断通道分配最高优先级(向量控制器0)
   VICVectAddr2 = (uint32)IRQ_time0; 	// 设置中断服务程序地址向量 
   VICIntEnable = 0x00000010;				// 使能定时器0中断  
   
   while(1)
   {
     if(uart0int==1)                  //接收到pc发来的设置命令:TRCMD13971234567$
       pc_num=readnum();              //读电话号码
 
     if(pc_num==1)                    //pc端下载电话号码读取成功
       fn_num();                      //存电话号码
     
     if(num_flag==1)                  //号码存放成功
      {
       num_flag=0;
       lamp=1;                        //添加指示设置成功指示灯程序
     
      }
  
                                      //如果设置成功指示灯程序没有点亮,应该从pc端重新设置TRCMD13971234567$
     if(alert==1)                     //报警信号到来
      {
        
        
        VICIntEnClr = 0x00004000;	  //关外部中断
        fn_alert();                   //报警程序
      }
  
   }

}

⌨️ 快捷键说明

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