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

📄 sms232.c

📁 用W77E58开发的单片机短信收发代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -