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

📄 debug.c

📁 51单片机收发短信的程序
💻 C
📖 第 1 页 / 共 3 页
字号:
      vege_type[0]='\0';
    put_string(0x9d,"    ");  //清除当前的代号显示
    put_string(0x9d,vege_type);    //显示取消后的vege_type
  }
  else if(display_type==1)       //价格界面
  {
    if(vege_price[4]!='\0')  vege_price[4]='\0';
    else if(vege_price[3]!='\0')  vege_price[3]='\0';
    else if(vege_price[2]!='\0')  vege_price[2]='\0';
    else if(vege_price[1]!='\0')  vege_price[1]='\0';
    else if(vege_price[0]!='\0')  vege_price[0]='\0';
    else if(vege_price[0]=='\0')     //如果没有输入价格
    {
      display_type=0;
      write_cmd(0x01);             //清除当前界面
      delay_160ms();              //如果没这句经常会乱屏
      type_screen();               //返回到品种界面
      return;
    }
    put_string(0x8a,"     ");     //清除正在显示的价格
    put_string(0x8a,vege_price);    //在第3行第4列显示当前蔬菜价格
  }
  else if(display_type==2)         //信息界面
  {
    //清除各全局变量
    info_count=0;
    info_page_index=0;
    vege_type[0]=vege_type[1]=vege_type[2]='\0';
    vege_price[0]=vege_price[1]=vege_price[2]=vege_price[3]=vege_price[4];
    vege_price[5]='\0';
    for(i=0;i<140;i++)
      sms_deliver.PDUData[i]='\0';
    display_type=0;

    write_cmd(0x01);
    put_string(0x90,"  ");
    put_string(0x90,"所有信息已删  !");
    put_string(0x96,chu);
    delay_1s();
    type_screen();
  }
}

//确认键
void key_confirm()
{
  char idata i;
  if(display_type==0)         //蔬菜品种界面
  {
    if(    (vege_type[0]<='5'&&vege_type[0]>='0')
       &&  (vege_type[1]<='9'&&vege_type[1]>='0')
       && !(vege_type[0]=='5'&&vege_type[1]=='9')
       && !(vege_type[0]=='0'&&vege_type[1]=='0') )//合理的类型(没有蔬菜类型59和00)
    {
      display_type=1;          //价格界面
      price_screen();         //显示价格界面
    }
    else
    {
      put_string(0x9d,"代号错");
      delay_160ms();
      put_string(0x9d,"      ");
      vege_type[0]='\0';      //蔬菜品种清除
      vege_type[1]='\0';
    }
  }
  if(display_type==1)           //价格界面
  {
    if(vege_price[0]!='\0')
    {
      if(sms_deliver.PDUData[0]=='\0')
      {
        sms_deliver.PDUData[0]='P';
        sms_deliver.PDUData[1]='R';
      }
      if(sms_deliver.PDUData[0]=='P')
        sms_deliver.PDUData[strlen(sms_deliver.PDUData)]=',' ;  //蔬菜信息间隔逗号
      strcat(sms_deliver.PDUData,vege_type);     //保存此条菜价信息
      strcat(sms_deliver.PDUData,vege_price);
      info_count++;                   //信息条数加1
      write_cmd(0x01) ;      //清除当前显示
      put_string(0x90,"  ") ;  //第二行第一列
      for(i=0;i<1;i++)
      {
        put_string(0x90,"该信息存储成功。") ;      //间隔160ms闪烁显示"该信息存储成功"
        delay_500ms();
        write_cmd(0x01);
        delay_160ms();
      }
      vege_type[0]=vege_type[1]=vege_price[0]=vege_price[1]
      =vege_price[2]=vege_price[3]=vege_price[4]='\0';
      if(strlen(sms_deliver.PDUData)<40)                 //未满
      {
        display_type=0;
        type_screen();
      }
      else                 //信息已满
      {
        write_cmd(0x01);   //消除当前显示
        put_string(0x90,"  ");
        put_string(0x90,"信息已满!");      //间隔160ms闪烁显示
        for(i=0;i<2;i++)
          delay_1s();
        write_cmd(0x01);
        display_type=2;
        info_screen();
      }
    }
  }
  return;
}

//PAGEDOWN键的响应函数
void key_pageup()
{
  char idata page_count , x;
  if(display_type==0)     //如果是品种界面显示,就响应按键显示相应的界面
  {
    if(vege_page_index==0)
      vege_page_index=9;
    else
      vege_page_index--;
    type_screen();
    return;
  }
  if(display_type==2)  //蔬菜信息界面
  {
    if(info_count>3)   //如果信息数大于3条
    {
      page_count=0;
      x=info_count;
      while(x>0)
      {
        page_count++;
        x-=3;
      }
      info_page_index=(info_page_index==0)?(page_count-1):(info_page_index-1) ;
      info_screen();
    }
    return;
  }
  return;
}

//PAGEDOWN键的响应函数
void key_pagedown()
{
  char idata page_count , x;
  if(display_type==0)     //如果是品种界面显示,就响应按键显示相应的界面
  {
    if(vege_page_index==9)
      vege_page_index=0;
    else
      vege_page_index++;
    type_screen();
    return;
   }
  if(display_type==2)  //蔬菜信息界面
  {
    if(info_count>3)
    {
      page_count=0;
      x=info_count;
      while(x>0)
      {
        page_count++;
        x-=3;
      }
      info_page_index=( (info_page_index==page_count-1)?0:info_page_index+1 ) ;
      info_screen();
    }
    return;
  }
}
//发送键的响应函数
void key_send()
{
  uchar idata i,j,flag=2;    // flag: 0(信息发送成功) 1(发送失败) 2(没有返回值)
  if(display_type==0)
  {
    if(info_count!=0)
    {
      display_type=2;
      info_screen();
      return;
    }
    else
    {
      put_string(0x9d,"无信息"); //没有存蔬菜信息
      delay_160ms();
      put_string(0x9d,"      ");
      put_string(0x9d,vege_type);
    }
  }
  else if(display_type==2)
  {
    write_cmd(0x01);
    put_string(0x90,"  ");
    put_string(0x90,"信息发送中...");
    memset(RcvBuf,0,sizeof(RcvBuf));
    receive_SMS();     //receive SMS,judge the center_phone change
    delay();
    //如果不成功就再发,最多发三次,再不成功就放弃
    for(i=0;i<3;i++)
    {
      send_response();                    //send SMS
      delay_1s(); delay_1s(); delay_1s();
      for(j=0; j<30;j++)
      {
        if( RcvBuf[j]=='O'&&RcvBuf[j+1]=='K' )  //返回的"OK"
        {  flag=0 ;  break;    }       //0: 发送成功
        else if( RcvBuf[j]=='E'&&RcvBuf[j+1]=='R'&&RcvBuf[j+2]=='R'
                 &&RcvBuf[j+3]=='O'&&RcvBuf[j+4]=='R' )    //返回的"ERROR"
        {  flag=1 ;  break;    }       //1: 发送失败
      }
      if(flag==0)  break;         //发送成功,跳出循环
    }
    if( flag==0 )
    {
      write_cmd(0x01);   //清除当前显示
      put_string(0x90,"  ");
      put_string(0x90,"发送成功");
      delay_1s();
      delay_1s();
      //清除各全局变量
      memset(sms_deliver.PDUData,0,sizeof(sms_deliver.PDUData));
      info_count=0;
      info_page_index=0;
      memset(vege_type,'\0',sizeof(vege_type));
      memset(vege_price,'\0',sizeof(vege_price));
    }
    if( flag==1&&i==3)   //第三次发返回的还是ERROR
    {
      write_cmd(0x01);    //清除当前显示
      put_string(0x90,"  ");
      put_string(0x90,"失败,没信号");
      delay_1s();
      delay_1s();
    }
    display_type=0;
    type_screen();                             //返回蔬菜品种界面
  }
}

//program to process keys when pressed////
void key_int() interrupt 2
{
  int idata t;                       //延时变量;
  uchar idata keycode;               //键盘码;
  uchar idata scancode;              //扫描码;
  uchar idata flag=0xff;             //键是否释放标志;
             //延时去抖动
  t=4000;
  while(t--);  //延时10ms;
  if(INT1==1)
    return;                     //如果中断引脚为高电平,为抖动,则跳出;
  EX1=0;                      //关闭中断,开始处理键盘;
             //扫描被按下的键的位置
  scancode=0xef;              //给出第一行的键盘扫描码,进行逐行扫描;
  while(scancode!=0xff)
  {
    P1=scancode;                //输入扫描码,扫描第一行;
    keycode=P1;                 //数据送到键码,看是否本行有键按下;
    if((keycode&0x0f)!=0x0f)
      break;                      //有键按下,退出循环;
    else
      scancode=(keycode<<1)|0x0f ; //否则,更新扫描码换下一行继续扫描;
  }                             //当扫描码变为0xff时,不满足循环条件则退出循环;
         //判断键是否被释放//
  P1=0x0f;
  while(1)
  {
    if(INT1==1)                 //INT1=1时,键释放
    {
      flag=~flag;
      if(flag==0)         //键释放标志为零则跳出循环
      break;
    }
  }
              //确定键值,转到相应的处理程序//
  keycode=~keycode;
  switch(keycode)
  {
    case 0x28:key_num(0);break;
    case 0x12:key_num(1);break;
    case 0x22:key_num(2);break;
    case 0x42:key_num(3);break;
    case 0x82:key_num(4);break;
    case 0x14:key_num(5);break;
    case 0x24:key_num(6);break;
    case 0x44:key_num(7);break;
    case 0x84:key_num(8);break;
    case 0x18:key_num(9);break;
    case 0x48:key_dot();break;
    case 0x11:key_cancel();break;
    case 0x81:key_confirm();break;
    case 0x21:key_pageup();break;
    case 0x41:key_pagedown();break;
    case 0x88:key_send();break;
    default:break;
  }
  EX1=1;                        //重新打开中断,可以接受新的中断
}

//////////////////////////////////////////////////////////////////////////////////
//////////////////以下程序为与手机模块相关的程序//////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
void GSM_int(void) interrupt 4
{
  EA=0;
  delay();
  if(RI==1)                     //data received
  {
      RI=0;
      RcvBuf[RcvIndex]=SBUF;
      RcvIndex++;
      if(RcvIndex>4)
      {
          if(SBUF==LF)
          {
              LFCount++;
              if(RcvBuf[RcvIndex-3]=='K' ||RcvBuf[RcvIndex-3]=='R')
              {
                  if(RcvBuf[6]=='L'&&RcvBuf[2]=='+')
                  {
                      bListEnd=1;
                      listchar_count=RcvIndex;
                      memcpy(ListBuf,RcvBuf,sizeof(RcvBuf));
                  }
                  bResponsed=1;
                  RcvIndex=0;
                  LFCount=0;
              }
          }
      }
      else
        if(RcvBuf[RcvIndex-2]==PROMPT)
           RcvIndex=0;
   }
  EA=1;
}
/////////////////////function: send string////////////////////////////////////////
void send_string(char  * str)
{
  char idata i=0;
  uchar idata len=strlen(str);
  for(i=0;i<len;i++)
  {
    SBUF=str[i];
    while(!TI){}
    TI=0;
  }
}
/////////////手机模块初始化函数///////////////////////////////////////////////////////////
char init_GSM()
{
  char idata result=0 ,i;
  IGT=0;
  delay_1s();
  delay_1s();
  delay_1s();
  send_string("AT\r");            //test  AT command
  delay_1s();
  send_string("ATE0\r");            //Enable command echo
  delay_160ms();
  put_string(0x80,RcvBuf);    ///////for debug
  result=find_OK_ERROR()+result;
  send_string("AT+CMGF=0\r");       //Select SMS message formate(选择短消息信息格式:0-PDU;1-文本)
  delay_160ms();
  put_string(0x80,RcvBuf);    ///////for debug
  delay_1s();      //////////for debug
  result=find_OK_ERROR()+result;
  send_string("AT+CNMI=0,0,0,0,1\r");
  delay_160ms();
  put_string(0x80,RcvBuf);    ///////for debug
  delay_1s();      //////////for debug
  result=find_OK_ERROR()+result;
  send_string("AT+CMEE=2\r");       //Report mobile equipment error
  delay_160ms();
  put_string(0x80,RcvBuf);    ///////for debug
  delay_1s();      //////////for debug
  result=find_OK_ERROR()+result;
  send_string("AT+CPMS?\r");
  delay_160ms();
  put_string(0x80,RcvBuf);    ///////for debug
  delay_1s();      //////////for debug
  result=find_OK_ERROR()+result;
  send_string("AT+CREG?\r");  //simply assume registered,refine later
  delay_160ms();
  put_string(0x80,RcvBuf);    ///////for debug
  delay_1s();      //////////for debug
  result=find_OK_ERROR()+result;
  send_string("AT+CFUN=1\r");  //set ME to full function
//  send_string("AT+CFUN=1,1\r");  //reset and restart ME to full function
  delay_160ms();
  put_string(0x80,RcvBuf);    ///////for debug
  delay_1s();      //////////for debug
  send_string("AT+COPS=0\r");  //GSM network operator is to be selected automatically
  for(i=0;i<9;i++)
    delay_1s();
  send_string("AT+COPS?\r");  //read the status to GSM network operator
  delay_160ms();
//  send_string("AT+CPAS\r");  //Mobile equipment activity status 0:ready 3:incoming call
//  delay_160ms();               //for debug
//  send_string("AT+WS46=12\r");  //select GSM network
//  delay_160ms();      //////////for debug
  if(result==0||result==1)
  {
    put_string(0x80,"success");      /////////for debug
    delay_1s();        /////////////for debug
    return 0 ;
  }
  else
  {
    put_string(0x80,"failed") ;       /////////for debug
    return 1;
  }
}
/////在RcvBuf的前80个字符中寻找第一个出现的字符串是"OK"或者"ERROR"还是都没有////
//////////////如果是OK就返回0,是ERROR就返回1,没找到就返回2///////////////////
char find_OK_ERROR()
{
  char i;
  for(i=0;i<140;i++)
  {
    if(RcvBuf[i]==0) return 2;
    if(strncmp(RcvBuf+i,"OK",2)==0)  return 0;
    else if(strncmp(RcvBuf+i,"ERROR",5)==0)  return 1;
  }
  return 3;
}

//////////////function:           ///////////////////////////////////////////
void receive_SMS()
{
  uint  ii;
  char  cmgl_state=0;
  uchar  j;
  RcvIndex=0;
  bResponsed=0;
  memset(RcvBuf,0,sizeof(RcvBuf));   //接收前清空接收缓冲区
  send_string("AT+CMGL=4\r");
  wait_5s();
  if(bListEnd)                       //如果有短信存在,则在GSM中断中会将bListEnd置1
  {
    for(ii=0;ii<listchar_count;ii++)
    {
	    if(cmgl_state==0)
      {

⌨️ 快捷键说明

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