找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2256|回复: 0
打印 上一主题 下一主题
收起左侧

GSM收发短信打电话的stm32源码

[复制链接]
跳转到指定楼层
楼主
ID:303561 发表于 2018-4-8 11:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GSM短信发送

单片机源程序如下:
  1. /******************** (C) COPYRIGHT 2012 WildFire Team **************************
  2. * 文件名  :main.c
  3. * 描述    :通过电脑的超级终端向单片机发送数据,单片机将接收到的数据发回电脑,
  4. *         :并显示在超级终端上。用的是串口1的中断方式。         
  5. * 实验平台:野火STM32开发板
  6. * 库版本  :ST3.5.0
  7. *********************************************************************************/
  8. #include "stm32f10x.h"
  9. #include "usart1.h"
  10. #include "systick.h"
  11. #include "bit.h"
  12. #include "GSM.h"

  13. #define led1      PE5
  14. #define led2      PE6

  15. int seat=0; //接收字符串的存储位置
  16. extern vu32 TimingDelay;
  17. extern u8 Uart1_Get_Data;
  18. extern u8 Uart1_Get_Flag;
  19. extern char RX[200];
  20. char content[]="Hi!I am xioawenjun,I have another telephone number,Please call me with 625073,Thanks";
  21. char content_ZT[]="ALL OK";
  22. char NUM_Magz[17]={0x22,0x2b,0x38,0x36,0x31,0x38,0x30,0x32,0x32,0x33,0x30,0x35,0x38,0x36,0x36,0x22};
  23. char NUM1[14]={0x22,0x31,0x38,0x30,0x32,0x32,0x33,0x30,0x35,0x38,0x36,0x36,0x22};
  24. char NUM_Receive[12]={0x31,0x38,0x30,0x32,0x32,0x33,0x30,0x35,0x38,0x36,0x36};

  25. /*
  26. * 函数名:main
  27. * 描述  :主函数
  28. * 输入  :无
  29. * 输出  :无
  30. */
  31. int main(void)
  32. {       
  33.     u16 i,j,FLAG=0;
  34.     SysTick_Init();                     /*systick 初始化*/
  35.         /* USART1 config 115200 8-N-1 */
  36. //        USART1_Config();       
  37.         USART2_Config();
  38.         NVIC_Configuration();
  39.     led1=0;
  40.         led2=1;
  41.         GSM_Init();
  42. ///////////////////////////////////////////////////////////////////
  43.         GPIO_ResetBits(GPIOA, GPIO_Pin_8); //启动信号开始
  44.         Delay_us(100000);         //延时1s
  45.         GPIO_SetBits(GPIOA, GPIO_Pin_8); //启动信号开始
  46.         Delay_us(100000);
  47.         while(!Hand("Interpreter ready"))
  48.               {
  49.                     CLR_RX();
  50.                     GPIO_ResetBits(GPIOA, GPIO_Pin_8); //启动信号开始
  51.                         Delay_us(100000);         //延时1s
  52.                         GPIO_SetBits(GPIOA, GPIO_Pin_8); //启动信号开始
  53.                         Delay_us(100000);
  54.               }
  55.         led1=1;
  56.         Delay_us(500000);
  57.         led1=0;

  58.         USART2_Puts("\r\nAT\r\n");  //握手

  59.     CLR_RX();
  60.         Delay_us(10000);          
  61.         while(!Hand("OK"))
  62.               {
  63.                   led1=~led1;
  64.                   USART2_Puts("AT\r");  //握手
  65.                   Delay_us(100000);             
  66.               }
  67.         CLR_RX();
  68.         Delay_us(10000);

  69. //        USART2_Puts("ATD611123;\r");//拨号“611123”
  70. //        while(!Hand("OK"))       //等待设置成功
  71. //         CLR_RX();
  72. //        Delay_us(200000);
  73. //
  74. //        USART2_Puts("ATH\r");//挂断
  75. //        while(!Hand("OK"))       //等待设置成功
  76. //         CLR_RX();
  77. //        Delay_us(10000);

  78.          led2=~led2;
  79.         while(!Hand("OK"))       //等待设置成功
  80.                   {                            
  81.           USART2_Puts("AT+CMGF=1\r");//设置为TXT模式
  82.                   Delay_us(100000);                               
  83.                   }
  84.          CLR_RX();
  85.         Delay_us(1000);

  86.         led2=~led2;
  87.         while(!Hand("OK"))       //等待设置成功
  88.                   {                            
  89.           USART2_Puts("AT+CSCS=\"GSM\"\r");//设置当前字符集为“GSM”
  90.                   Delay_us(100000);                               
  91.                   }
  92.          CLR_RX();
  93.         Delay_us(1000);
  94.         led2=~led2;

  95.     while(!Hand("OK"))       //等待设置成功
  96.                   {
  97.                   CLR_RX();                           
  98.           USART2_Puts("AT+CSCA?\r");//设置当前字符集为“GSM”
  99.                   Delay_us(100000);                               
  100.                   }
  101.      for(i=0;i<200;i++)
  102.            {
  103.             if(RX[i]==0x22)                //找到8
  104.              {
  105.                  for(j=0;j<16;j++)
  106.                     {
  107.                         NUM_Magz[j]=RX[i];  //读消息中心的号码
  108.                         i++;
  109.                         }
  110.                  i=200;
  111.                  }
  112.            }
  113.          CLR_RX();
  114.         Delay_us(1000);
  115.         led2=~led2;

  116. //                led2=~led2;
  117. //        while(!Hand("OK"))       //等待设置成功
  118. //                  {                            
  119. //          USART2_Puts("AT+CMGR=1\r");//设置读第一条短信
  120. //                  Delay_us(100000);                               
  121. //                  }
  122. //         CLR_RX();
  123. //        Delay_us(1000);

  124.                 led2=~led2;
  125.         while(!Hand("OK"))       //等待设置成功
  126.                   {                            
  127.           USART2_Puts("AT+CNMI=2,1\r\n");//设置当有新短信到来时提示     
  128.                   Delay_us(100000);                               
  129.                   }
  130.          CLR_RX();
  131.         Delay_us(1000);

  132.                 led2=~led2;
  133.         while(!Hand("OK")&&!Hand("ERROR"))       //等待设置成功
  134.                   {                            
  135.           USART2_Puts("AT+CMGD=1\r\n");//设置删除第一条短信     
  136.                   Delay_us(100000);                               
  137.                   }
  138.          CLR_RX();
  139.         Delay_us(1000);

  140.     /* 设置信息中心号码        */
  141.         USART2_Puts("AT+CSCA=");
  142.         USART2_Puts(NUM_Magz);       
  143.         USART2_Puts("\r");
  144.         while(!Hand("OK"));          //等待设置成功
  145.          CLR_RX();
  146.         Delay_us(1000);
  147.         led2=~led2;
  148.         led1=1;       
  149.         for(;;)
  150.         {
  151.                    if(Hand("+CMTI")) //若缓存字符串中含有"+CMTI"就表示有新的短信
  152.                     {
  153.                           Delay_us(1000);   
  154.                         CLR_RX();                   //清除缓存内容
  155.                         USART2_Puts("AT+CMGR=1\r\n");//发送读取信息指令
  156.                 while(!Hand("OK"));          //等待设置成功
  157.                         for(i=0;i<200;i++)
  158.                            {
  159.                            if(RX[i]==0x22)
  160.                              {
  161.                              FLAG++;
  162.                                  }
  163.                            if(FLAG==3)
  164.                              {
  165.                                  FLAG=0;
  166.                                  for(j=0;j<11;j++)
  167.                                     {
  168.                                         i++;
  169.                                         NUM_Receive[j]=RX[i];                                       
  170.                                         if(RX[i]==0x22)
  171.                                           {
  172.                                            NUM_Receive[j]='\0';
  173.                                            j=11;
  174.                                           }
  175.                                         }
  176.                                  i=200;
  177.                                  }
  178.                            }
  179.                         if(Hand("1HD"))         //收到"1HD"回电话
  180.                           {
  181.                             CLR_RX();
  182.                                 Delay_us(1000);
  183.                                 USART2_Puts("ATD");   //打电话
  184.                                 USART2_Puts(NUM_Receive);
  185.                                 USART2_Puts(";\r");
  186.                                 while(!Hand("OK"));
  187.                                 while(!Hand("NO CARRIER"));
  188.                                 CLR_RX();       
  189.                                 Delay_us(1000);
  190.                                 USART2_Puts("AT+CMGD=1\r\n");//删除短信
  191.                         while(!Hand("OK"));          //等待设置成功
  192.                                 CLR_RX();
  193.                                 Delay_us(1000);
  194.                           }
  195.                         if(Hand("1HX"))  //收到"1HX"回复短信
  196.                           {
  197.                             MESSAGE(NUM_Receive,content_ZT); //发短信
  198.                                 while(!Hand("OK"))       //等待设置成功
  199.                                           {                            
  200.                                       USART2_Puts("AT+CMGD=1\r\n");//删除短信   
  201.                                           Delay_us(100000);                               
  202.                                           }
  203.                                 CLR_RX();
  204.                                 Delay_us(1000);
  205.                           }
  206.                
  207.                     }

  208.                    if(Hand("RING")) //若缓存字符串中含有"RING"就表示有新的来电
  209.                     {
  210.                         Delay_us(10000);   
  211.                         CLR_RX();                   //清除缓存内容
  212.                         USART2_Puts("AT+CLCC\r");//读取来电号码
  213.                 while(!Hand("OK"));          //等待设置成功
  214.                         for(i=0;i<200;i++)
  215.                            {
  216.                            if(RX[i]==0x22)
  217.                              {
  218.                                  for(j=0;j<11;j++)
  219.                                     {
  220.                                         i++;
  221.                                         NUM_Receive[j]=RX[i];                                       
  222.                                         if(RX[i]==0x22)
  223.                                           {
  224.                                            NUM_Receive[j]='\0';
  225.                                            j=11;
  226.                                           }
  227.                                         }
  228.                                  i=200;
  229.                                  }
  230.                            }
  231.                         CLR_RX();
  232.                         USART2_Puts("ATH\r\n");//挂断电话
  233.                         while(!Hand("OK"));
  234.                         if(NUM_Receive[0]==0x36) //只回复开头为1的手机号码
  235.                           {
  236.                           MESSAGE(NUM_Receive,content);        //发短信
  237.                        }
  238.                          CLR_RX();
  239.                      Delay_us(300000);
  240.                          USART2_Puts("ATD");   //打电话
  241.                          USART2_Puts(NUM_Receive);
  242.                          USART2_Puts(";\r");
  243.                          while(!Hand("OK"));
  244.                          while(!Hand("NO CARRIER"));
  245.                          CLR_RX();       
  246.                          Delay_us(10000);
  247.                          
  248.                          USART2_Puts("ATD");   //打电话
  249.                          USART2_Puts(NUM_Receive);
  250.                          USART2_Puts(";\r");
  251.                          while(!Hand("OK"));
  252.                          CLR_RX();
  253.                          Delay_us(1500000);
  254.                          USART2_Puts("ATH\r\n");//挂断电话
  255.                          while(!Hand("OK"));
  256.                          CLR_RX();
  257.                          }       
  258.         }
  259. }
  260. /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/
复制代码
  1. #include "GSM.h"
  2. #include "usart1.h"
  3. #include "systick.h"
  4. #include "bit.h"

  5. extern char RX[200];
  6. extern char NUM_Magz[17];

  7. /*
  8. * 函数名:GSM_Init
  9. * 描述  :GSM模块初始化
  10. * 输入  :无
  11. * 输出  :无
  12. * 调用  :由main调用
  13. */
  14. void GSM_Init(void)
  15. {
  16.     u16 i,j;
  17.           GPIO_ResetBits(GPIOA, GPIO_Pin_8); //启动信号开始
  18.         Delay_us(100000);         //延时1s
  19.         GPIO_SetBits(GPIOA, GPIO_Pin_8); //启动信号开始
  20.         Delay_us(100000);
  21.         while(!Hand("Interpreter ready"))
  22.               {
  23.                     CLR_RX();
  24.                     GPIO_ResetBits(GPIOA, GPIO_Pin_8); //启动信号开始
  25.                         Delay_us(100000);         //延时1s
  26.                         GPIO_SetBits(GPIOA, GPIO_Pin_8); //启动信号开始
  27.                         Delay_us(100000);
  28.               }
  29.         led1=1;
  30.         Delay_us(500000);
  31.         led1=0;

  32.         USART2_Puts("\r\nAT\r\n");  //握手

  33.     CLR_RX();
  34.         Delay_us(10000);          
  35.         while(!Hand("OK"))
  36.               {
  37.                   led1=~led1;
  38.                   USART2_Puts("AT\r");  //握手
  39.                   Delay_us(100000);             
  40.               }
  41.         CLR_RX();
  42.         Delay_us(10000);

  43. //        USART2_Puts("ATD611123;\r");//拨号“611123”
  44. //        while(!Hand("OK"))       //等待设置成功
  45. //         CLR_RX();
  46. //        Delay_us(200000);
  47. //
  48. //        USART2_Puts("ATH\r");//挂断
  49. //        while(!Hand("OK"))       //等待设置成功
  50. //         CLR_RX();
  51. //        Delay_us(10000);

  52.          led2=~led2;
  53.         while(!Hand("OK"))       //等待设置成功
  54.                   {                            
  55.           USART2_Puts("AT+CMGF=1\r");//设置为TXT模式
  56.                   Delay_us(100000);                               
  57.                   }
  58.          CLR_RX();
  59.         Delay_us(1000);

  60.         led2=~led2;
  61.         while(!Hand("OK"))       //等待设置成功
  62.                   {                            
  63.           USART2_Puts("AT+CSCS=\"GSM\"\r");//设置当前字符集为“GSM”
  64.                   Delay_us(100000);                               
  65.                   }
  66.          CLR_RX();
  67.         Delay_us(1000);
  68.         led2=~led2;

  69.     while(!Hand("OK"))       //等待设置成功
  70.                   {
  71.                   CLR_RX();                           
  72.           USART2_Puts("AT+CSCA?\r");//设置当前字符集为“GSM”
  73.                   Delay_us(100000);                               
  74.                   }
  75.      for(i=0;i<200;i++)
  76.            {
  77.             if(RX[i]==0x22)                //找到8
  78.              {
  79.                  for(j=0;j<16;j++)
  80.                     {
  81.                         NUM_Magz[j]=RX[i];  //读消息中心的号码
  82.                         i++;
  83.                         }
  84.                  i=200;
  85.                  }
  86.            }
  87.          CLR_RX();
  88.         Delay_us(1000);
  89.         led2=~led2;

  90. //                led2=~led2;
  91. //        while(!Hand("OK"))       //等待设置成功
  92. //                  {                            
  93. //          USART2_Puts("AT+CMGR=1\r");//设置读第一条短信
  94. //                  Delay_us(100000);                               
  95. //                  }
  96. //         CLR_RX();
  97. //        Delay_us(1000);

  98.                 led2=~led2;
  99.         while(!Hand("OK"))       //等待设置成功
  100.                   {                            
  101.           USART2_Puts("AT+CNMI=2,1\r\n");//设置当有新短信到来时提示     
  102.                   Delay_us(100000);                               
  103.                   }
  104.          CLR_RX();
  105.         Delay_us(1000);

  106.                 led2=~led2;
  107.         while(!Hand("OK")&&!Hand("ERROR"))       //等待设置成功
  108.                   {                            
  109.           USART2_Puts("AT+CMGD=1\r\n");//设置删除第一条短信     
  110.                   Delay_us(100000);                               
  111.                   }
  112.          CLR_RX();
  113.         Delay_us(1000);

  114.     /* 设置信息中心号码        */
  115.         USART2_Puts("AT+CSCA=");
  116.         USART2_Puts(NUM_Magz);       
  117.         USART2_Puts("\r");
  118.         while(!Hand("OK"));          //等待设置成功
  119.          CLR_RX();
  120.         Delay_us(1000);
  121.         led2=~led2;
  122.         led1=1;
  123. }
复制代码


所有资料51hei提供下载:
12-GSM收发短信打电话.rar (293.12 KB, 下载次数: 33)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表