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