標(biāo)題: STM32+SIM900A手機發(fā)送短信控制LED亮滅的程序源碼 [打印本頁]

作者: youngkong    時間: 2018-6-11 20:21
標(biāo)題: STM32+SIM900A手機發(fā)送短信控制LED亮滅的程序源碼
使用SIM900A發(fā)送短信。
本程序通過手機短信控制LED的亮滅
使用單片機串口2與模塊通信;接法如下
    STC單片機   GPRS模塊
    P1.2(RXD2)->RXD
    P1.3(TXD2)->TXD
    GND      ->GND
1、板子上電后運行指示燈RUNING_LED會以一秒的頻率閃爍;
2、通過芯片的串口1可以監(jiān)視模塊的登錄情況;
3、手機發(fā)送“onled”點亮LED;
4、手機發(fā)送“offled”熄滅LED;
5、使用串口2與模塊通信,串口1用于將信息打印輸出。

單片機源程序如下:
  1. /**********************************************************************************
  2. * 工程名  :
  3. * 描述    :通過手機發(fā)送短信控制LED
  4. * 實驗平臺:STM32F10X
  5. * 庫版本  :
  6. * 作者    :泥人通信模塊開發(fā)平臺團隊
  7. **********************************************************************************/

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

  14. #define Automatic_Startup 1     //定義自啟動 V1.2版本起有自啟動功能

  15. //#define Buf1_Max 60                                           //串口1緩存長度
  16. #define Buf2_Max 200                                           //串口2緩存長度
  17. /*************        本地常量聲明        **************/


  18. /*************  本地變量聲明        **************/
  19. //char Uart1_Buf[Buf1_Max];
  20. char Uart2_Buf[Buf2_Max];

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

  22. vu8 Timer0_start;        //定時器0延時啟動計數(shù)器
  23. vu8 Uart2_Start;        //串口2開始接收數(shù)據(jù)
  24. vu8 Uart2_End;          //串口2接收數(shù)據(jù)結(jié)束


  25. /*************        本地函數(shù)聲明        **************/
  26. void CLR_Buf2(void);               //清除串口2緩存數(shù)據(jù)
  27. u8 Find(char *a);                  //判斷緩存中是否含有指定的字符串
  28. void Second_AT_Command(char *b,u8 wait_time);  //發(fā)送AT指令函數(shù)  輸入:發(fā)送數(shù)據(jù)的指針、發(fā)送等待時間(單位:S)
  29. void Set_Text_Mode(void);          //設(shè)置短信為TEXT文本模式
  30. void Check_New_Message(void);      //檢查是否有新信息,并執(zhí)行信息內(nèi)容指令
  31. void Wait_CREG(void);              //等待模塊注冊成功

  32. /*************  外部函數(shù)和變量聲明*****************/




  33. /*******************************************************************************
  34. * 函數(shù)名 : main
  35. * 描述   : 主函數(shù)
  36. * 輸入   :
  37. * 輸出   :
  38. * 返回   :
  39. * 注意   : 串口2負責(zé)與GPRS模塊通信,串口1用于串口調(diào)試,可以避免在下載程序時數(shù)據(jù)
  40.                                          還發(fā)送到模塊
  41. *******************************************************************************/
  42. int main(void)
  43. {
  44.         SysTick_Init_Config();
  45.         GPIO_Config();
  46.         
  47.         USART1_Init_Config(115200);
  48.         USART2_Init_Config(115200);
  49.         Timer2_Init_Config();
  50.                                                                                                 UART1_SendString("A");
  51.         Second_AT_Command("AT+CMGF=1",3);               
  52.                                                                                                       UART1_SendString("S");
  53.         Second_AT_Command("AT+CSCS=\"GSM\"",3);                //文本模式
  54.                                                                                                       UART1_SendString("D");
  55.         Second_AT_Command("AT+CNMI=3,2,0,0,0",3);                                                        //新短信直接輸出
  56.                                                                                                       UART1_SendString("F");
  57.                                                  UART1_SendString(Uart2_Buf);
  58.                                                                                    UART1_SendString("L");
  59.         while(1)
  60.         {
  61.                 if(strstr(Uart2_Buf,"+CMT")!=NULL)                   //若緩存字符串中含有"+CMT"就表示有新的短信
  62.                 {
  63.                                                                                                                                                                                                                                                                                                                                 UART1_SendString("G");
  64.                         Delay_nMs(50);//等待數(shù)據(jù)全部接收完成
  65.                                                                                                                                                                                                                                                                                                                                 UART1_SendString("H");
  66.                         UART1_SendString("收到新短信:\r\n");
  67.                                                                                                                                                                                                                                                                                                                                 UART1_SendString("J");
  68.                         Delay_nMs(50);//等待數(shù)據(jù)全部接收完成               
  69.                         UART1_SendString(Uart2_Buf);                        //把模塊返回的信息原樣輸出
  70.                                                                                                                                                                                                                                                                                                                     UART1_SendString("K");
  71.                         CLR_Buf2();
  72.                 }
  73.                
  74.         }        
  75. }

  76. /*******************************************************************************
  77. * 函數(shù)名  : USART2_IRQHandler
  78. * 描述    : 串口1中斷服務(wù)程序
  79. * 輸入    : 無
  80. * 返回    : 無
  81. * 說明    :
  82. *******************************************************************************/
  83. void USART2_IRQHandler(void)                        
  84. {
  85.                         u8 Res=0;
  86.                         Res =USART_ReceiveData(USART2);
  87.                         Uart2_Buf[First_Int] = Res;            //將接收到的字符串存到緩存中
  88.                         First_Int++;                                        //緩存指針向后移動
  89.                         if(First_Int > Buf2_Max)                       //如果緩存滿,將緩存指針指向緩存的首地址
  90.                         {
  91.                                 First_Int = 0;
  92.                         }   
  93. }         

  94. /*******************************************************************************
  95. * 函數(shù)名  : TIM2_IRQHandler
  96. * 描述    : 定時器2中斷斷服務(wù)函數(shù)
  97. * 輸入    : 無
  98. * 輸出    : 無
  99. * 返回    : 無
  100. * 說明    : 無
  101. *******************************************************************************/
  102. void TIM2_IRQHandler(void)   //TIM3中斷
  103. {
  104.         static u8 flag =1;

  105.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //檢查TIM3更新中斷發(fā)生與否
  106.         {
  107.                
  108.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx更新中斷標(biāo)志
  109.                
  110.                 if(Timer0_start)
  111.                 Times++;
  112.                 if(Times > shijian)
  113.                 {
  114.                         Timer0_start = 0;
  115.                         Times = 0;
  116.                 }

  117.         }        
  118. }

  119. /*******************************************************************************
  120. * 函數(shù)名 : CLR_Buf2
  121. * 描述   : 清除串口2緩存數(shù)據(jù)
  122. * 輸入   :
  123. * 輸出   :
  124. * 返回   :
  125. * 注意   :
  126. *******************************************************************************/
  127. void CLR_Buf2(void)
  128. {
  129.         u16 k;
  130.         for(k=0;k<Buf2_Max;k++)      //將緩存內(nèi)容清零
  131.         {
  132.                 Uart2_Buf[k] = 0x00;
  133.         }
  134.     First_Int = 0;              //接收字符串的起始存儲位置
  135. }

  136. /*******************************************************************************
  137. * 函數(shù)名 : Find
  138. * 描述   : 判斷緩存中是否含有指定的字符串
  139. * 輸入   :
  140. * 輸出   :
  141. * 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
  142. * 注意   :
  143. *******************************************************************************/

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

  151. /*******************************************************************************
  152. * 函數(shù)名 : Second_AT_Command
  153. * 描述   : 發(fā)送AT指令函數(shù)
  154. * 輸入   : 發(fā)送數(shù)據(jù)的指針、發(fā)送等待時間(單位:S)
  155. * 輸出   :
  156. * 返回   :
  157. * 注意   :
  158. *******************************************************************************/

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

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

  207. /*******************************************************************************
  208. * 函數(shù)名 : Check_Message_rec
  209. * 描述   : 檢查是否有新信息,并執(zhí)行信息內(nèi)容指令
  210. * 輸入   :
  211. * 輸出   :
  212. * 返回   :
  213. * 注意   :
  214. *******************************************************************************/

  215. void Check_New_Message(void)
  216. {
  217.         if(strstr(Uart2_Buf,"+CMT")!=NULL)                   //若緩存字符串中含有"+CMT"就表示有新的短信
  218.         {
  219.                 Delay_nMs(50);//等待數(shù)據(jù)全部接收完成
  220.                 UART1_SendString("收到新短信:\r\n");
  221.                 UART1_SendString(Uart2_Buf);                        //把模塊返回的信息原樣輸出
  222.                 if(strstr(Uart2_Buf,"onled")!=NULL)     //用于判斷str2是否是str1的子串
  223.                 {
  224.                         LED1_ON();
  225.                 }
  226.                 if(strstr(Uart2_Buf,"offled")!=NULL)
  227.                 {
  228.                         LED1_OFF();
  229.                 }
  230.                 CLR_Buf2();
  231.                 //Second_AT_Command("AT+CMGD=1,4",3);//刪除短信
  232.         }
  233. }

  234. /*******************************************************************************
  235. * 函數(shù)名 : Wait_CREG
  236. * 描述   : 等待模塊注冊成功
  237. ……………………

  238. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
a SIM900短信接收.rar (300.61 KB, 下載次數(shù): 142)



作者: 1205965081    時間: 2019-12-30 10:54
C8T6的???????????????
作者: 學(xué)不止,行不盡    時間: 2020-5-26 09:22
你好,我用了一下你的程序,但收到短信LED燈只是亮三秒怎么回事?
作者: 學(xué)不止,行不盡    時間: 2020-5-26 09:26
你好,我試用了你的程序,但控制燈開啟只有三秒是怎么回事?能解決嗎?還有LED燈光很弱是怎么回事能?應(yīng)該不能是燈的問題,我用其他程序在同一個管腳驅(qū)動燈是明亮的,希望盡快能等到樓主的回復(fù),謝謝
作者: 野肆3    時間: 2022-3-3 22:58
為啥我移植了用不了呢?
作者: 野肆3    時間: 2022-3-3 23:03
你好,我有遇到這種問題,一模一樣的代碼但是沒有接收到,就想問一下你怎么解決的?方便的話介意發(fā)一下源碼嗎我參考一下,謝謝啦!
作者: jnwy    時間: 2022-3-4 14:06
你好,我試用了你的程序,但控制燈開啟只有三秒是怎么回事?能解決嗎?還有LED燈光很弱是怎么回事能?應(yīng)該不能是燈的問題,我用其他程序在同一個管腳驅(qū)動燈是明亮的,希望盡快能等到樓主的回復(fù),謝謝




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1