📄 sms232.c
字号:
#include <absacc.h>
#include <w77e58.h>
#include <sms232.h>
uint idata seri1_rnum;
uint idata seri0_rnum;
bit bdata seri1_rend;
uint idata time_1s;
uchar idata crlf_number;
uchar idata seri1_rmode;
bit bdata timeout;
bit bdata r_msg;
bit bdata user_command;
uchar idata smsmode;
uint idata delaytime;
bit bdata msgready_flag;
/*
下位机发送协议:
(1)发送信息:LF+命令(0x31)+手机号码+,+信息+CR
(2)接收回答:LF+命令(0x31)+OK或者ER+CR
下位机接收协议:
(1)接收信息:LF+0x30+手机号码+,+信息+CR
*/
void dog(void)
{
WATCHDOG=1;
WATCHDOG=0;
}
void msec(uint delay_ms)
{
uchar ms_j;
while(delay_ms--){
dog();
for(ms_j=0;ms_j<250;ms_j++)
{;}
}
}
void init_w77e58(void)
{
PMR=PMR|0x01; /*允许访问片内1K的SRAM*/
}
void init_interrupt(void)
{
PS=1;
PS1=1;
PT0=0; /*串口优先级高于定时器0*/
TMOD=0x21; /*定时器0采用方式1;定时器1采用方式2,定时器1用于产生串口0和串口1的波特率*/
TH1=0xfd; /*11.0592MHZ,9600bps*/
TL1=0xfd;
//PCON=PCON|0x80; /*串口0波特率加倍*/
//WDCON=WDCON|0X80; /*串口1波特率加倍*/
SCON=0x50; /*串口0采用方式1*/
SCON1=0x50; /*串口1采用方式1*/
TR1=1; /*启动定时器1*/
TH0=0x4b;
TL0=0xfd; /*timer0 is 50ms at 11.0592MHZ*/
TR0=0; /*停止定时器0*/
ET0=1; /*允许定时器0中断*/
ES=1; /*允许串口0中断*/
ES1=1; /*允许串口1中断*/
EA=1; /*允许总中断*/
}
//向串口0输出一个字符(非中断方式)
void ComOutChar0(uchar OutData)
{
dog();
SBUF=OutData; //输出字符
while(TI==0); //空语句判断字符是否发完
TI=0; //清TI
}
//向串口1输出一个字符(非中断方式)
void ComOutChar1(uchar OutData)
{
dog();
SBUF1=OutData; //输出字符
while(TI_1==0); //空语句判断字符是否发完
TI_1=0; //清TI_1
}
/*
//向串口1输出一个字符串(非中断方式)
void ComOutStr1(uchar *Str)
{
while(*Str!=0x00) //判断是否到了字符串的尾部
{
SBUF1=*Str; //输出字符
while(TI_1==0); //空语句判断字符是否发完
TI_1=0; //清TI_1
Str++; //字符串指针加一
}
}
*/
bit overtime(uint nowdtime)
{
delaytime=nowdtime;
time_1s=0; //清零定时器0累加器,此句应放在timeout=0的前面。
timeout=0; //清零超时标志
TR0=1;
do{
dog();
if(timeout){TR0=0;return(1);}
}while(seri1_rend);
TR0=0;
return(0);
}
bit init_Mobile(void)
{
seri1_rnum=MOBILE_BASE_ADDRESS; //检查是否有未发送的短信
seri1_rmode=3; //接收结束条件为OKcrlf或>SPACE
seri1_rend=1;
ComOutChar1('A');
ComOutChar1('T');
ComOutChar1('\r');
if(overtime(400))return(1);
if(msgready_flag==0)
{
seri1_rnum=MOBILE_BASE_ADDRESS;//如果有:取消未发送的短信
seri1_rmode=1; //接收结束条件为OKcrlf
seri1_rend=1;
ComOutChar1(ESC);
if(overtime(400))return(1);
}
seri1_rnum=MOBILE_BASE_ADDRESS;
seri1_rmode=1; //接收结束条件为OKcrlf
seri1_rend=1;
ComOutChar1('A');
ComOutChar1('T');
ComOutChar1('&');
ComOutChar1('F');
ComOutChar1('\r'); //恢复出厂设置
if(overtime(400))return(1);
seri1_rnum=MOBILE_BASE_ADDRESS;
seri1_rmode=1; //接收结束条件为OKcrlf
seri1_rend=1;
ComOutChar1('A');
ComOutChar1('T');
ComOutChar1('E');
ComOutChar1('0');
ComOutChar1('\r'); //ATE0禁止回显
if(overtime(400))return(1);
seri1_rnum=MOBILE_BASE_ADDRESS; //指向GSM模块接收缓冲区(W77E58内部SRAM)基地址,
seri1_rmode=1; //接收结束条件为OKcrlf
seri1_rend=1; //置位GSM模块接收结束标志
ComOutChar1('A');
ComOutChar1('T');
ComOutChar1('+');
ComOutChar1('C');
ComOutChar1('M');
ComOutChar1('G');
ComOutChar1('D');
ComOutChar1('=');
ComOutChar1('1');
ComOutChar1(',');
ComOutChar1('4');
ComOutChar1('\r'); //AT+CMGD=1,4:删除SIM卡中所有短消息
if(overtime(1200))return(1); //等待1分钟
seri1_rnum=MOBILE_BASE_ADDRESS; //指向GSM模块接收缓冲区(W77E58内部SRAM)基地址,
seri1_rmode=1; //接收结束条件为OKcrlf
seri1_rend=1; //置位GSM模块接收结束标志
ComOutChar1('A');
ComOutChar1('T');
ComOutChar1('+');
ComOutChar1('C');
ComOutChar1('S');
ComOutChar1('M');
ComOutChar1('S');
ComOutChar1('=');
ComOutChar1('0');
ComOutChar1('\r'); //AT+CSMS=0:选择短消息服务
if(overtime(400))return(1);
seri1_rnum=MOBILE_BASE_ADDRESS;
seri1_rmode=1;
seri1_rend=1;
ComOutChar1('A');
ComOutChar1('T');
ComOutChar1('+');
ComOutChar1('C');
ComOutChar1('S');
ComOutChar1('M');
ComOutChar1('P');
ComOutChar1('=');
ComOutChar1('1');
ComOutChar1(',');
ComOutChar1('1');
ComOutChar1('6');
ComOutChar1('7');
ComOutChar1(',');
ComOutChar1('0');
ComOutChar1(',');
ComOutChar1('0');
ComOutChar1('\r'); //AT+CSMP=1,167,0,0:设置有效时间为167(24小时)
if(overtime(400))return(1);
seri1_rnum=MOBILE_BASE_ADDRESS;
seri1_rmode=1;
seri1_rend=1;
ComOutChar1('A');
ComOutChar1('T');
ComOutChar1('+');
ComOutChar1('C');
ComOutChar1('M');
ComOutChar1('G');
ComOutChar1('F');
ComOutChar1('=');
ComOutChar1('1');
ComOutChar1('\r');//AT+CMGF=1:设置文本模式
if(overtime(400))return(1);
seri1_rnum=MOBILE_BASE_ADDRESS;
seri1_rmode=1;
seri1_rend=1;
ComOutChar1('A');
ComOutChar1('T');
ComOutChar1('+');
ComOutChar1('C');
ComOutChar1('S');
ComOutChar1('C');
ComOutChar1('S');
ComOutChar1('=');
ComOutChar1('\"');
ComOutChar1('G');
ComOutChar1('S');
ComOutChar1('M');
ComOutChar1('\"');
ComOutChar1('\r');//AT+CSCS="GSM":设置TE字符集为GSM
if(overtime(400))return(1);
seri1_rnum=MOBILE_BASE_ADDRESS;
seri1_rmode=1;
seri1_rend=1;
ComOutChar1('A');
ComOutChar1('T');
ComOutChar1('+');
ComOutChar1('C');
ComOutChar1('S');
ComOutChar1('D');
ComOutChar1('H');
ComOutChar1('=');
ComOutChar1('1');
ComOutChar1('\r');//AT+CSDH=1:设置在阅读或接收消息时显示消息头信息
if(overtime(400))return(1);
seri1_rnum=MOBILE_BASE_ADDRESS;
seri1_rmode=1;
seri1_rend=1;
ComOutChar1('A');
ComOutChar1('T');
ComOutChar1('+');
ComOutChar1('C');
ComOutChar1('N');
ComOutChar1('M');
ComOutChar1('I');
ComOutChar1('=');
ComOutChar1('2');
ComOutChar1(',');
ComOutChar1('2');
ComOutChar1(',');
ComOutChar1('0');
ComOutChar1(',');
ComOutChar1('0');
ComOutChar1(',');
ComOutChar1('0');
ComOutChar1('\r');//AT+CNMI=2,2,0,0,0:新消息以下列方式指示
//+CMT:<oa>, [<alpha>],<scts>[,<tooa>,<fo>,<pid>,<dcs>,<sca>,<tosca>, <length>]<CR><LF>[<data>]
//+CMT:”13601702443”, , “00/05/18,09:20:16+02”,129,0,0,8,“+8613800210500”,145,4<CR><LF>4E00004100420043
//收到”13601702443”发来的新消息:一ABC,该新消息没有存储
if(overtime(400))return(1);
return(0);
}
bit sendmsg(void)
{
uint i;
USERLED=0;
seri1_rnum=MOBILE_BASE_ADDRESS; //检查是否有未发送的短信
seri1_rmode=3; //接收结束条件为OKcrlf或>SPACE
seri1_rend=1;
ComOutChar1('A');
ComOutChar1('T');
ComOutChar1('\r');
if(overtime(400))return(1);
if(msgready_flag==0)
{
seri1_rnum=MOBILE_BASE_ADDRESS;//如果有:取消未发送的短信
seri1_rmode=1; //接收结束条件为OKcrlf
seri1_rend=1;
ComOutChar1(ESC);
if(overtime(400))return(1);
}
seri1_rnum=MOBILE_BASE_ADDRESS; //指向GSM模块接收缓冲区(W77E58内部SRAM)基地址,
seri1_rmode=2; //接收结束条件为>SPACE
seri1_rend=1; //置位GSM模块接收结束标志
ComOutChar1('A');
ComOutChar1('T');
ComOutChar1('+');
ComOutChar1('C');
ComOutChar1('M');
ComOutChar1('G');
ComOutChar1('S');
ComOutChar1('=');
ComOutChar1('\"');
i=USER_BASE_ADDRESS+2;
while(XBYTE[i]!=',')
{
ComOutChar1(XBYTE[i]);//发送手机号码
i++;
if(i>=TEMP_BASE_ADDRESS)return(1);
}
ComOutChar1('\"');
ComOutChar1('\r'); //AT+CMGS="MobileNo":发送目标手机号码
if(overtime(600))return(1);//30s
seri1_rnum=MOBILE_BASE_ADDRESS; //指向GSM模块接收缓冲区(W77E58内部SRAM)基地址,
seri1_rmode=1; //接收结束条件为OKcrlf
seri1_rend=1; //置位GSM模块接收结束标志
i++;
while(XBYTE[i]!='\r') //发送信息
{
ComOutChar1(XBYTE[i]);
i++;
if(i>=TEMP_BASE_ADDRESS)return(1);
}
ComOutChar1(CTRLZ); //发送信息结束
if(overtime(600))return(1); //30s
return(0);
}
void sendok_touser(void)
{
ComOutChar0('\n'); //发送启始字符LF
ComOutChar0(user_command);//发送识别符,1-9(ASCII)表示用户的命令
ComOutChar0('O');
ComOutChar0('K');
ComOutChar0('\r'); //发送结束字符CR
}
void senderr_touser(void)
{
ComOutChar0('\n'); //发送启始字符LF
ComOutChar0(user_command);
ComOutChar0('E');
ComOutChar0('R');
ComOutChar0('\r'); //发送结束字符CR
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -