📄 alert2.c
字号:
/****************************************************************************
* 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 + -