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

📄 alert2.c

📁 用c语言实现的在arm上运行的无线报警程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
* File:alert.c
* 
*通过串口发送命令Trcmdxxxxxxxxxx,提取电话号码,存储在电话薄,报警信号到来时    
*读取电话薄中电话号码以短信和拨号方式报警 
****************************************************************************/

#include  "config.h" 

//串口1与LED1234共用
//#define   LED1CON       0x00000400            /* LED1控制,低电平点亮,用于通讯指示 */
//#define	  LED4CON	0x00002000		     //P0.13引脚控制LED,低电平点亮
#define   FENGM  0x00000080              //P0.7 蜂鸣器
#define   P06    0x00000040              //p06开机控制信号
//编码方式
/*#define GSM_7BIT		0   //我们使用bit7码
#define GSM_8BIT		4
#define GSM_UCS2		8
*/
// 短消息参数结构,编码/解码共用
// 其中,字符串以0结尾
/*typedef struct {
	char SCA[16];			// 短消息服务中心号码(SMSC地址)
	char TPA[16];			// 目标号码或回复号码(TP-DA或TP-RA)
	char TP_PID;			// 用户信息协议标识(TP-PID)
	char TP_DCS;			// 用户信息编码方式(TP-DCS)
	char TP_SCTS[16];		// 服务时间戳字符串(TP_SCTS), 接收时用到
	char TP_UD[161];		// 原始用户信息(编码前或解码后的TP-UD)
	char index[3];		    // 短消息序号,在读取时用到
	
} SM_PARAM;  

*/
//接收
//XX(SMSC长度) xx(smsc地址类型) xxxxxxxxxxxxxx(服务中心号码)xx() xx(回复地址长度) xx(发送号码类型)xxxxxxxxxxxxxx(回复号码) 这两项是TP-RA
//xx(TP-PID)xx(TP-DCS)xxxxxxxxxxxx(日期时间)xx(时区)xx(长度)xxxx...(信息)
//服务中心号码  发送号码 日期时间 时区 只须高低位交换就可以得到实际数值
//发送
//00 11 00 XX(发送号码长度)  91 (发送号码类型)xxxxxxxxxxxxxx(发送号码) 这两项是TP-DA 
//xx(TP-PID)xx(TP-DCS) xx(有效时间)xx(长度)xxxx...(信息)
/* 定义Fpclk值,用于设置串口波特率 */
#define  FPCLK          2764800L
/* 定义串口模式设置数据结构 */
typedef  struct  UartMode
{  uint8 datab;         // 字长度,5/6/7/8
   uint8 stopb;         // 停止位,1/2
   uint8 parity;    	// 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
}  UARTMODE; 

char REC_1[256];
char REC_2[64];
char REC_3[256];
char REC_4[256];
char REC_5[256];
char REC_6[256];
char REC_7[256];

uint32 j,m;
uint8 count1,count2,count3,count4,count5,count6;
uint8 count7,count8,count9,count10,count11;

uint8 atflag;

char AT[] ="AT\r";

char num[12]="00000000000";//电话号码

char cmd[]="AT+CMGS=23\r";
char pdu[52]="0011000d9168";
char num2[]="00000000000";
char *TPA;//电话号码两两颠倒后的形式
   
char CPBS[]="AT+CPBS=\"SM\"\r";                                       //存储在sim卡
char CPBS1[30]="AT+CPBW=1,\"";                                                //存储于第一条
char CPBS2[30]="AT+CPBR=1\r";                                         //读第一条
   
//char atd[20]="atd";                                                   //拨号
//char ath[5]="ath\r";                                                  //挂断
//char num1[]="02787649995";

uint8 int0count;           //中断计数器
uint8 alert;               //报警标志
uint8 uart0int;            //pc

uint8 cc,dd;

char *ptr;
char *pptr;

uint8 pc_num;              //pc端电话号码读取成功
uint8 num_flag;            //号码存储与卡成功
uint8 lamp;
uint8 count;
/****************************************************************************
* 名称:IRQ_UART1()
* 功能:串口UART1接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_UART1(void)                    //手机接收中断
{ 
   if(0x04==(U1IIR&0x0F) ) 
   {
    if(atflag==1)
    {
        REC_1[j]= U1RBR;
        j++;
    }
    else if(atflag==2)
    {
        REC_3[j]= U1RBR;
        j++;
    }    
     else if(atflag==3)
    {
        REC_4[j]= U1RBR;
        j++;
    }  
    else if(atflag==4)
    {
        REC_5[j]= U1RBR;
        j++;
    }  
    else if(atflag==5)
    {
        REC_6[j]= U1RBR;
        j++;
    }  
    else if(atflag==6)
    {
        REC_7[j]= U1RBR;
        j++;
    }  
   }
   VICVectAddr = 0x00;                          // 中断处理结束
}  
/****************************************************************************
* 名称:IRQ_UART0()
* 功能:串口UART0接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_UART0(void)                    //上位机接收中断
{
    if(0x04==(U0IIR&0x0F) ) 
    REC_2[m]= U0RBR;
    if(REC_2[m]=='$')
    uart0int=1;
    m++;
    
    VICVectAddr = 0x00;                         // 中断处理结束
}
/****************************************************************************
* 名称:IRQ_Eint0()
* 功能:外部中断0    p0.16对应按键3,作为监控锁信号中断  lock_flag
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_Eint0(void)                      //外部中断
{
    
   int0count++;
   if(int0count>3)
   {
    alert=1;
    atflag=4;
   }
   
   while( (EXTINT&0x01)!=0 )		// 等待外部中断信号恢复为高电平	
   {  EXTINT = 0x01;				// 清除EINT1中断标志
   }
   
   VICVectAddr = 0x00;
}
/****************************************************************************
* 名称:IRQ_time0()
* 功能:
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_time0(void)                     //定时器中断
{
   
   cc++;
  
   	     
    T0IR = 0x01;	    			            // 清除中断标志
    VICVectAddr = 0x00;				            // 通知VIC中断处理结束
}
   
/****************************************************************************
* 名称  UART1_SendByte()
* 功能:向串口发送字节数据。
* 入口参数:data                要发送的数据
* 出口参数:无
****************************************************************************/
void  UART1_SendByte(uint8 data)
{  
   U1THR = data;				    // 发送数据
   while( (U1LSR&0x40)==0 );	    // 等待数据发送完毕

}

/****************************************************************************
* 名称  UART1_SendStr()
* 功能:向串口发送字节数据。
* 入口参数:data                要发送的数据
* 出口参数:无
****************************************************************************/
void UART1_SendStr(char *str) 
{ 
   while(1)
   {  if( *str == '\0' ) break;
      UART1_SendByte(*str++);	    // 发送数据
   }
}   
           
/****************************************************************************
* 名称  gsmInvertNumbers()
* 功能:正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'F'凑成偶数
*       如:"8613851872468" --> "683158812764F8"
*pSrc: 源字符串指针
*pDst: 目标字符串指针
*nSrcLength: 源字符串长度
*返回: 目标字符串长度
****************************************************************************/
uint32 gsmInvertNumbers(const char* pSrc, char* pDst, uint32 nSrcLength)
{
	uint32 nDstLength;		// 目标字符串长度
	char ch;			// 用于保存一个字符
       uint32 i;
	// 复制串长度
	nDstLength = nSrcLength;

	// 两两颠倒
	for(i=0; i<nSrcLength;i+=2)
	{
		ch = *pSrc++;		// 保存先出现的字符
		*pDst++ = *pSrc++;	// 复制后出现的字符
		*pDst++ = ch;		// 复制先出现的字符
	}

	// 源串长度是奇数吗?
	if(nSrcLength & 1)
	{
		*(pDst-2) = 'F';	// 补'F'
		nDstLength++;		// 目标串长度加1
	}

	// 输出字符串加个结束符
	*pDst = '\0';

	// 返回目标字符串长度
	return nDstLength;
}



/****************************************************************************
* 名称:UART1_Ini()
* 功能:初始化串口1。设置其工作模式及波特率。
* 入口参数:baud                波特率
*          set          模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
uint8  UART1_Ini(uint32 baud, UARTMODE set)
{  uint32  bak;
   
   //参数过滤 
   if( (0==baud)||(baud>115200) ) return(0);
   if( (set.datab<5)||(set.datab>8) ) return(0);
   if( (0==set.stopb)||(set.stopb>2) ) return(0);
   if( set.parity>4 ) return(0);

   // 设置串口波特率 ///设置U0DLM  U0DLL寄存器
   U1LCR = 0x80;                        // DLAB位置1
   bak = (FPCLK>>4)/baud;//bak即是n
   U1DLM = bak>>8;
   U1DLL = bak&0xff;
   //外部晶振11.0592m,不是使用pll,vpb默认4分频,fpclk=2.7684m,
   //当baud=9600时,n=fpclk/16/baud=18=0x12
   
   
   // 设置串口模式 /  //设置U0LCR寄存器
   bak = set.datab-5;                   // 设置字长度
   if(2==set.stopb) bak |= 0x04;        // 判断是否为2位停止位  
   if(0!=set.parity) set.parity = set.parity-1;
   bak |= set.parity;                   // 设置奇偶校验
   U1LCR = bak;
   
   return(1);
}

/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud                波特率
*          set          模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
uint8  UART0_Ini(uint32 baud, UARTMODE set)
{  uint32  bak;
   
   /* 参数过滤 */
   if( (0==baud)||(baud>115200) ) return(0);
   if( (set.datab<5)||(set.datab>8) ) return(0);
   if( (0==set.stopb)||(set.stopb>2) ) return(0);
   if( set.parity>4 ) return(0);

   /* 设置串口波特率 *///设置U0DLM  U0DLL寄存器
   U0LCR = 0x80;                        // DLAB位置1
   bak = (FPCLK>>4)/baud;//bak即是n
   U0DLM = bak>>8;
   U0DLL = bak&0xff;
   //外部晶振11.0592m,不是使用pll,vpb默认4分频,fpclk=2.7684m,
   //当baud=9600时,n=fpclk/16/baud=18=0x12
   
   
   /* 设置串口模式 */  //设置U0LCR寄存器
   bak = set.datab-5;                   // 设置字长度
   if(2==set.stopb) bak |= 0x04;        // 判断是否为2位停止位  
   if(0!=set.parity) set.parity = set.parity-1;
   bak |= set.parity;                   // 设置奇偶校验
   U0LCR = bak;
   
   return(1);
}             
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  DelayNS(uint32  dly)
{  uint32  i;

⌨️ 快捷键说明

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