找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3402|回复: 1
收起左侧

SIM系列GSM模块手机短信控制LED的亮灭等STM32代码

[复制链接]
ID:450884 发表于 2018-12-20 16:59 | 显示全部楼层 |阅读模式
0.png


本程序通过手机短信控制LED的亮灭
使用单片机串口2与模块通信;接法如下
    STM32      GPRS模块
    PA3 (RXD2)->RXD
    PA2 (TXD2)->TXD
    GND      ->GND
1、板子上电后运行指示灯RUNING_LED会以一秒的频率闪烁;
2、通过芯片的串口1可以监视模块的登录情况;
3、手机发送“onled”点亮LED;
4、手机发送“offled”熄灭LED;
5、使用串口2与模块通信,串口1用于将信息打印输出。

单片机源程序如下:
  1. /**********************************************************************************
  2. * 工程名  :
  3. * 描述    :通过手机发送短信控制LED
  4. * 实验平台:STM32F10X
  5. * 库版本  :

  6. **********************************************************************************/

  7. #include "stm32f10x.h"
  8. #include "usart.h"
  9. #include "Led.h"
  10. #include "SysTick.h"
  11. #include "timer.h"
  12. #include "string.h"

  13. #define Automatic_Startup 1     //定义自启动 V1.2版本起有自启动功能

  14. //#define Buf1_Max 60                                           //串口1缓存长度
  15. #define Buf2_Max 200                                           //串口2缓存长度
  16. /*************        本地常量声明        **************/


  17. /*************  本地变量声明        **************/
  18. //char Uart1_Buf[Buf1_Max];
  19. char Uart2_Buf[Buf2_Max];

  20. u8 Times=0,First_Int = 0,shijian=0;

  21. vu8 Timer0_start;        //定时器0延时启动计数器
  22. vu8 Uart2_Start;        //串口2开始接收数据
  23. vu8 Uart2_End;          //串口2接收数据结束


  24. /*************        本地函数声明        **************/
  25. void CLR_Buf2(void);
  26. u8 Find(char *a);
  27. void Second_AT_Command(char *b,u8 wait_time);
  28. void Set_Text_Mode(void);
  29. void Check_New_Message(void);
  30. void Wait_CREG(void);

  31. /*************  外部函数和变量声明*****************/




  32. /*******************************************************************************
  33. * 函数名 : main
  34. * 描述   : 主函数
  35. * 输入   :
  36. * 输出   :
  37. * 返回   :
  38. * 注意   : 串口2负责与GPRS模块通信,串口1用于串口调试,可以避免在下载程序时数据
  39.                                          还发送到模块
  40. *******************************************************************************/
  41. int main(void)
  42. {
  43.         SysTick_Init_Config();
  44.         GPIO_Config();
  45.         
  46.         USART1_Init_Config(115200);
  47.         USART2_Init_Config(115200);
  48.         Timer2_Init_Config();
  49.         UART1_SendString("GPRS模块短信测试程序\r\n");
  50.         UART1_SendString("GPRS模块在注册网络\r\n");
  51.         Wait_CREG();
  52.         UART1_SendString("GPRS模块注册成功\r\n");
  53.         UART1_SendString("GPRS模块短信模式设置\r\n");
  54.         Set_Text_Mode();
  55.         UART1_SendString("设置成功,短信模式:TEXT\r\n");
  56.         //Second_AT_Command("AT+CMGD=1,4",3);//删除卡上所有短信
  57.         
  58.         UART1_SendString("初始化完成\r\n");
  59.         while(1)
  60.         {
  61.                 Check_New_Message();
  62.         }
  63. }

  64. /*******************************************************************************
  65. * 函数名  : USART2_IRQHandler
  66. * 描述    : 串口1中断服务程序
  67. * 输入    : 无
  68. * 返回    : 无
  69. * 说明    :
  70. *******************************************************************************/
  71. void USART2_IRQHandler(void)                        
  72. {
  73.                         u8 Res=0;
  74.                         Res =USART_ReceiveData(USART2);
  75.                         Uart2_Buf[First_Int] = Res;            //将接收到的字符串存到缓存中
  76.                         First_Int++;                                        //缓存指针向后移动
  77.                         if(First_Int > Buf2_Max)                       //如果缓存满,将缓存指针指向缓存的首地址
  78.                         {
  79.                                 First_Int = 0;
  80.                         }   
  81. }         

  82. /*******************************************************************************
  83. * 函数名  : TIM2_IRQHandler
  84. * 描述    : 定时器2中断断服务函数
  85. * 输入    : 无
  86. * 输出    : 无
  87. * 返回    : 无
  88. * 说明    : 无
  89. *******************************************************************************/
  90. void TIM2_IRQHandler(void)   //TIM3中断
  91. {
  92.         static u8 flag =1;

  93.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
  94.         {
  95.                
  96.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx更新中断标志
  97.                
  98.                 if(Timer0_start)
  99.                 Times++;
  100.                 if(Times > shijian)
  101.                 {
  102.                         Timer0_start = 0;
  103.                         Times = 0;
  104.                 }
  105.         
  106.                 if(flag)
  107.                 {
  108.                         LED4_ON();
  109.                         flag=0;
  110.                 }
  111.                 else
  112.                 {
  113.                         LED4_OFF();
  114.                         flag=1;
  115.                 }
  116.         }        
  117. }

  118. /*******************************************************************************
  119. * 函数名 : CLR_Buf2
  120. * 描述   : 清除串口2缓存数据
  121. * 输入   :
  122. * 输出   :
  123. * 返回   :
  124. * 注意   :
  125. *******************************************************************************/
  126. void CLR_Buf2(void)
  127. {
  128.         u16 k;
  129.         for(k=0;k<Buf2_Max;k++)      //将缓存内容清零
  130.         {
  131.                 Uart2_Buf[k] = 0x00;
  132.         }
  133.     First_Int = 0;              //接收字符串的起始存储位置
  134. }

  135. /*******************************************************************************
  136. * 函数名 : Find
  137. * 描述   : 判断缓存中是否含有指定的字符串
  138. * 输入   :
  139. * 输出   :
  140. * 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
  141. * 注意   :
  142. *******************************************************************************/

  143. u8 Find(char *a)
  144. {
  145.   if(strstr(Uart2_Buf,a)!=NULL)
  146.             return 1;
  147.         else
  148.                         return 0;
  149. }

  150. /*******************************************************************************
  151. * 函数名 : Second_AT_Command
  152. * 描述   : 发送AT指令函数
  153. * 输入   : 发送数据的指针、发送等待时间(单位:S)
  154. * 输出   :
  155. * 返回   :
  156. * 注意   :
  157. *******************************************************************************/

  158. void Second_AT_Command(char *b,u8 wait_time)         
  159. {
  160.         u8 i;
  161.         char *c;
  162.         c = b;                                                                                //保存字符串地址到c
  163.         CLR_Buf2();
  164.   i = 0;
  165.         while(i == 0)                    
  166.         {
  167.                 if(!Find("OK"))
  168.                 {
  169.                         if(Timer0_start == 0)
  170.                         {
  171.                                 b = c;                                                        //将字符串地址给b
  172.                                 for (; *b!='\0';b++)
  173.                                 {
  174.                                         while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
  175.                                         USART_SendData(USART2,*b);//UART2_SendData(*b);
  176.                                 }
  177.                                 UART2_SendLR();        
  178.                                 Times = 0;
  179.                                 shijian = wait_time;
  180.                                 Timer0_start = 1;
  181.                    }
  182.     }
  183.            else
  184.                 {
  185.                         i = 1;
  186.                         Timer0_start = 0;
  187.                 }
  188.         }
  189.         CLR_Buf2();
  190. }

  191. /*******************************************************************************
  192. * 函数名 : Set_Text_Mode
  193. * 描述   : 设置短信为TEXT文本模式
  194. * 输入   :
  195. * 输出   :
  196. * 返回   :
  197. * 注意   :
  198. *******************************************************************************/
  199. void Set_Text_Mode(void)
  200. {
  201.         Second_AT_Command("ATE0",3);                                                                                //取消回显        
  202.         Second_AT_Command("AT+CNMI=3,2,0,0,0",3);                                                        //新短信直接输出
  203.         Second_AT_Command("AT+CMGF=1",3);                                                                //TEXT模式        
  204.         Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"",3);                //所有操作都在SIM卡中进行        
  205. }

  206. /*******************************************************************************
  207. * 函数名 : Check_Message_rec
  208. * 描述   : 检查是否有新信息,并执行信息内容指令
  209. * 输入   :
  210. * 输出   :
  211. * 返回   :
  212. * 注意   :
  213. *******************************************************************************/

  214. void Check_New_Message(void)
  215. {
  216.         if(strstr(Uart2_Buf,"+CMT")!=NULL)                   //若缓存字符串中含有"+CMT"就表示有新的短信
  217.         {
  218.                 Delay_nMs(50);//等待数据全部接收完成
  219.                 UART1_SendString("收到新短信:\r\n");
  220.                 UART1_SendString(Uart2_Buf);                        //把模块返回的信息原样输出
  221.                 if(strstr(Uart2_Buf,"onled")!=NULL)
  222.                 {
  223.                         LED1_ON();
  224.                 }
  225.                 if(strstr(Uart2_Buf,"offled")!=NULL)
  226.                 {
  227.                         LED1_OFF();
  228.                 }
  229.                 CLR_Buf2();
  230.                 //Second_AT_Command("AT+CMGD=1,4",3);//删除短信
  231.         }
  232. }

  233. /*******************************************************************************
  234. * 函数名 : Wait_CREG
  235. * 描述   : 等待模块注册成功
  236. ……………………

  237. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
SIM系列GSM模块例程(STM32).7z (268.96 KB, 下载次数: 66)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:583243 发表于 2019-7-13 11:22 | 显示全部楼层
太好了,感谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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