找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2975|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

stm32煙霧報(bào)警器源程序_手機(jī)發(fā)送短信

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:679189 發(fā)表于 2021-3-15 19:26 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)源程序如下:
  1. /**********************************************************************************
  2. * 工程名  :發(fā)送TEXT文本短信
  3. * 描述    :通過(guò)STM32開(kāi)發(fā)板控制模塊發(fā)送TEXT文本短信
  4. * 實(shí)驗(yàn)平臺(tái):STM32F10X
  5. * 庫(kù)版本  :

  6. * 硬件連接說(shuō)明
  7.          使用單片串口2與GPRS模塊通信  注:使用串口2可以避免下載和通信不會(huì)沖突
  8.          STM32      GPRS模塊
  9.          5V        ->5V
  10.          3.3V      ->V_TTL
  11.          PA3 (RXD2)->TXD
  12.          PA2 (TXD2)->RXD
  13.          GND           ->GND
  14.          
  15.          VBAT      ->供電5V(大電流)
  16.          GND           ->GND
  17.          PB9       ->PWR
  18.          PWR:這個(gè)引腳是控制模塊啟動(dòng),V1.2版本已經(jīng)有自啟動(dòng)電路所以不必接

  19. * 軟件功能說(shuō)明
  20.    板子上電后運(yùn)行指示燈600ms亮/3000ms滅的頻率閃爍
  21.          修改短信中心號(hào)、接收方手機(jī)號(hào)和短信內(nèi)容,編譯成功后下載到單片機(jī)里面,就可以實(shí)現(xiàn)發(fā)
  22.          送一條文本短信
  23. **********************************************************************************/

  24. #include "sys.h"
  25. #include "delay.h"
  26. #include "lcd.h"
  27. #include "usart.h"
  28. #include "timer.h"
  29. #include "string.h"
  30. #include "MQ_smog.h"
  31. #include "ds18b20.h"

  32. #define Buf1_Max 60                                           //串口1緩存長(zhǎng)度
  33. #define Buf2_Max 200                                           //串口2緩存長(zhǎng)度
  34. /*************        本地常量聲明        **************/
  35. static unsigned char *SMS_Num="\"+8613800270500\"";//短信中心號(hào) 關(guān)于中心號(hào)的介紹可以看串口調(diào)試筆記的第二部分
  36. static unsigned char *phone="\"18672942506\"";     //短信接收方手機(jī)號(hào)
  37. static unsigned char *content="Fire Alarm!";//發(fā)送短信內(nèi)容
  38. static unsigned char *content1="I am a fire alarm";

  39. /*************  本地變量聲明        **************/
  40. char Uart2_Buf[Buf2_Max];//串口2接收緩存

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

  42. vu8 Timer0_start;        //定時(shí)器0延時(shí)啟動(dòng)計(jì)數(shù)器
  43. vu8 Uart2_Start;        //串口2開(kāi)始接收數(shù)據(jù)
  44. vu8 Uart2_End;          //串口2接收數(shù)據(jù)結(jié)束

  45. u8 t=0;
  46. u8 SMS_flag=1;
  47. u8 flag1 = 1;
  48. short temperature;

  49. extern int flag;

  50. /*************        本地函數(shù)聲明        **************/
  51. void CLR_Buf2(void);
  52. u8 Find(char *a);
  53. void Second_AT_Command(char *b,char *a,u8 wait_time);
  54. void Set_Text_Mode(void);
  55. void Wait_CREG(void);
  56. void Send_Text_Sms(void);
  57. void Send_Text_Sms1(void);

  58. /*******************************************************************************
  59. * 函數(shù)名 : main
  60. * 描述   : 主函數(shù)
  61. * 輸入   :
  62. * 輸出   :
  63. * 返回   :
  64. * 注意   : 串口2負(fù)責(zé)與MG323模塊通信,串口1用于串口調(diào)試,可以避免在下載程序時(shí)數(shù)據(jù)
  65.                                          還發(fā)送到模塊
  66. *******************************************************************************/        
  67. int main(void)
  68. {                
  69.         NVIC_Configuration();          //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
  70.         delay_init();                     //延時(shí)函數(shù)初始化       
  71.         uart_init(9600);
  72.         USART2_Init_Config(9600);
  73.         Timer2_Init_Config();
  74.         LCD_Init();
  75.         Init_smog();
  76.        
  77.         BACK_COLOR=WHITE;  //字體背景色
  78.         POINT_COLOR=RED;
  79.         LCD_Clear(WHITE);
  80.        
  81.         Wait_CREG();    //查詢等待模塊注冊(cè)成功

  82.         Set_Text_Mode();//設(shè)置短信為T(mén)EXT模式
  83.        

  84.         while(DS18B20_Init())        //1:未檢測(cè)到DS18B20的存在 0:存在
  85.         {
  86.                 LCD_ShowString(60,130,200,16,16,"DS18B20 Error");
  87.                 delay_ms(200);
  88.                 LCD_Fill(60,130,239,130+16,WHITE);
  89.                 delay_ms(200);
  90.         }                                                                  
  91. //        LCD_ShowString(60,20,200,16,16,"DS18B20 OK");
  92.         LCD_ShowString(60,40,200,16,16,"Temp:   . C");
  93.        
  94.         while(1)
  95.         {                        
  96.                 if(t%10==0)//每100ms讀取一次
  97.                 {                                                                          
  98.                         temperature=DS18B20_Get_Temp();       
  99.                         if(temperature<0)
  100.                         {
  101.                                 LCD_ShowChar(60+40,40,'-',16,0);                        //顯示負(fù)號(hào)
  102.                                 temperature=-temperature;                                        //轉(zhuǎn)為正數(shù)
  103.                         }else LCD_ShowChar(60+40,40,' ',16,0);                        //去掉負(fù)號(hào)
  104.                         POINT_COLOR=BLUE;//設(shè)置字體為藍(lán)色
  105.                         LCD_ShowNum(60+40+8,40,temperature/10,2,16);        //顯示正數(shù)部分            
  106.                            LCD_ShowNum(60+40+32,40,temperature%10,1,16);        //顯示小數(shù)部分
  107.                        
  108.                         smog();
  109.                         if(flag == 1){
  110.                                 POINT_COLOR=RED;
  111.                                 LCD_ShowString(30,180,160,16,16,"smog:warning!");
  112.                         }
  113.                         else LCD_ShowString(30,180,160,16,16,"             ");
  114.                 }
  115.                 LCD_ShowxNum(30,220,flag,1,16,0);
  116.                 if(flag1 == 1){
  117.                         Send_Text_Sms1();//發(fā)送一條短消息
  118.                         flag1=0;
  119.                 }
  120.                
  121.                 if(flag==1 && (temperature/10)>20 && SMS_flag==1){  //使用溫度報(bào)警時(shí)。只用了整數(shù)部分
  122.                         LCD_ShowString(60,200,160,16,16,"Fire Alarm!");
  123.                         Send_Text_Sms();//發(fā)送一條短消息
  124.                         SMS_flag = 0;
  125.                 }
  126. //                else{
  127. //                        LCD_ShowString(60,200,160,16,16,"           ");
  128. //                        //SMS_flag = 1;
  129. //                }
  130.         }
  131. }

  132. /*******************************************************************************
  133. * 函數(shù)名 : CLR_Buf2
  134. * 描述   : 清除串口2緩存數(shù)據(jù)
  135. * 輸入   :
  136. * 輸出   :
  137. * 返回   :
  138. * 注意   :
  139. *******************************************************************************/
  140. void CLR_Buf2(void)
  141. {
  142.         u16 k;
  143.         for(k=0;k<Buf2_Max;k++)      //將緩存內(nèi)容清零
  144.         {
  145.                 Uart2_Buf[k] = 0x00;
  146.         }
  147.     First_Int = 0;              //接收字符串的起始存儲(chǔ)位置
  148. }

  149. /*******************************************************************************
  150. * 函數(shù)名 : Find
  151. * 描述   : 判斷緩存中是否含有指定的字符串
  152. * 輸入   :
  153. * 輸出   :
  154. * 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
  155. * 注意   :
  156. *******************************************************************************/
  157. u8 Find(char *a)
  158. {
  159.   if(strstr(Uart2_Buf,a)!=NULL)
  160.             return 1;
  161.         else
  162.                 return 0;
  163. }

  164. /*******************************************************************************
  165. * 函數(shù)名 : Second_AT_Command
  166. * 描述   : 發(fā)送AT指令函數(shù)
  167. * 輸入   : 發(fā)送數(shù)據(jù)的指針、希望接收到的應(yīng)答數(shù)據(jù)指針、發(fā)送等待時(shí)間(單位:S)
  168. * 輸出   :
  169. * 返回   :
  170. * 注意   :
  171. *******************************************************************************/
  172. void Second_AT_Command(char *b,char *a,u8 wait_time)         
  173. {
  174.         u8 i;
  175.         char *c;
  176.         c = b;  //保存字符串地址到c
  177.         CLR_Buf2();  //清除串口2緩存數(shù)據(jù)
  178.         i = 0;
  179.         while(i == 0)                    
  180.         {
  181.                 if(!Find(a))  //判斷緩存中是否含有指定的字符串,如果沒(méi)有就一直發(fā)送
  182.                 {
  183.                         if(Timer0_start == 0)
  184.                         {
  185.                                         b = c;                                                        //將字符串地址給b
  186.                                         for (; *b!='\0';b++)  //  \0--字符串結(jié)尾---一次發(fā)送一位字符串,然后b++,當(dāng)字符串結(jié)束時(shí),發(fā)送完成
  187.                                         {
  188.                                                 while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);  //串口2接收引腳無(wú)數(shù)據(jù)時(shí),空循環(huán)
  189.                                                 USART_SendData(USART2,*b);  //UART2_SendData(*b);
  190.                                         }
  191.                                         UART2_SendLR();       
  192.                                         Times = 0;
  193.                                         shijian = wait_time;
  194.                                         Timer0_start = 1;
  195.                         }
  196.                 }
  197.                 else  //如果有,即發(fā)送成功,則令i=1跳出循環(huán)
  198.                 {
  199.                         i = 1;
  200.                         Timer0_start = 0;
  201.                 }
  202.         }
  203.         CLR_Buf2();
  204. }

  205. /*******************************************************************************
  206. * 函數(shù)名 : Set_Text_Mode
  207. * 描述   : 設(shè)置短信為T(mén)EXT文本模式
  208. * 輸入   :
  209. * 輸出   :
  210. * 返回   :
  211. * 注意   :
  212. *******************************************************************************/
  213. void Set_Text_Mode(void)
  214. {
  215.         char temp[50]="AT+CSCA=";
  216.        
  217.         Second_AT_Command("ATE0","OK",3);  //取消回顯        ,發(fā)送ATE0,等待接收到“OK”才結(jié)束,并執(zhí)行下一步
  218.         Second_AT_Command("AT+CMGF=1","OK",3);  //TEXT模式       
  219.         Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);//所有操作都在SIM卡中進(jìn)行
  220.         strcat(temp,(char*)SMS_Num); //字符串拼接函數(shù)(庫(kù)函數(shù))---把"AT+CSCA="與\"+8613800270500\"拼接,并存入temp
  221.         Second_AT_Command(temp,"OK",3);//設(shè)置短信中心號(hào)
  222.        
  223.         LCD_ShowString(30,60,200,16,16,"Set_Text_Mode successful");
  224. }
  225. /*******************************************************************************
  226. * 函數(shù)名 : Send_Text_Sms
  227. * 描述   : 發(fā)送TEXT文本短信
  228. * 輸入   :
  229. * 輸出   :
  230. * 返回   :
  231. * 注意   :
  232. *******************************************************************************/
  233. void Send_Text_Sms(void)
  234. {
  235.         char temp[50]="AT+CMGS=";
  236.        
  237.         strcat(temp,(char*)phone); //字符串拼接函數(shù)(庫(kù)函數(shù))
  238.         Second_AT_Command(temp,">",3); //發(fā)送temp,等待接收到“>”才發(fā)送短信內(nèi)容
  239.         UART2_SendString((char*)content);     //發(fā)送短信內(nèi)容
  240.         USART_SendData(USART2 ,0X1A);  //發(fā)送結(jié)束符
  241.         UART2_SendLR();
  242.        
  243.         LCD_ShowString(30,90,200,16,16,"Send_Text_Sms successful");
  244. }

  245. void Send_Text_Sms1(void)
  246. {
  247.         char temp[50]="AT+CMGS=";
  248.        
  249.         strcat(temp,(char*)phone); //字符串拼接函數(shù)(庫(kù)函數(shù))
  250.         Second_AT_Command(temp,">",3); //發(fā)送temp,等待接收到“>”才發(fā)送短信內(nèi)容
  251.         UART2_SendString((char*)content1);     //發(fā)送短信內(nèi)容
  252.         USART_SendData(USART2 ,0X1A);  //發(fā)送結(jié)束符
  253.         UART2_SendLR();
  254.        
  255.         LCD_ShowString(30,90,200,16,16,"Send_Text_Sms successful");
  256. }

  257. /*******************************************************************************
  258. * 函數(shù)名 : Wait_CREG
  259. * 描述   : 等待模塊注冊(cè)成功
  260. * 輸入   :
  261. * 輸出   :
  262. * 返回   :
  263. * 注意   :
  264. *******************************************************************************/
  265. void Wait_CREG(void)
  266. {
  267.         u8 i;
  268.         u8 k;
  269.         i = 0;
  270.         CLR_Buf2();
  271.         while(i == 0)                               
  272.         {
  273.                 CLR_Buf2();        
  274.                 UART2_SendString("AT+CREG?");   //查詢模塊是否注冊(cè)成功
  275. //                UART2_SendString("/r/n");
  276.                 UART2_SendLR();  //發(fā)回車換行
  277. //                LCD_ShowString(30,120,200,16,16,"debug1");
  278.                 delay_ms(5000);
  279.                 for(k=0;k<Buf2_Max;k++)                             
  280.                 {
  281.                         u8 aa  = Uart2_Buf[0];
  282.                         LCD_ShowString(30,140,200,16,16,(u8*)aa);
  283.                         if(Uart2_Buf[k] == ':')  //如果響應(yīng)返回的結(jié)果中有分號(hào)
  284.                         {
  285. //                                LCD_ShowString(30,140,200,16,16,"debug2");
  286.                                 if((Uart2_Buf[k+4] == '1')||(Uart2_Buf[k+4] == '5')) //說(shuō)明模塊注冊(cè)成功 0:未注冊(cè),且沒(méi)有進(jìn)行搜尋新網(wǎng)絡(luò),1:已注冊(cè)本地網(wǎng)絡(luò),2:未注冊(cè),正在搜尋網(wǎng)絡(luò),4:未知代碼,5:已注冊(cè),處于漫游狀態(tài)
  287.                                         {
  288.                                                 i = 1;  //可跳出while
  289.                                                 break;  //跳出for
  290.                                         }
  291.                         }
  292.                 }
  293. //                LCD_ShowString(30,120,200,16,16,"         ");
  294.         }
  295.         LCD_ShowString(30,120,200,16,16,"CREG successful");
  296. }

  297. //void USART2_IRQHandler(void)                       
  298. //{
  299. //        u8 Res=0;
  300. //        Res =USART_ReceiveData(USART2);
  301. //        LCD_ShowString(30,140,200,16,16,(u8*)Res);
  302. //        Uart2_Buf[First_Int] = Res;            //將接收到的字符串存到緩存中
  303. //        First_Int++;                                        //緩存指針向后移動(dòng)
  304. //        if(First_Int > Buf2_Max)                       //如果緩存滿,將緩存指針指向緩存的首地址
  305. //        {
  306. //                First_Int = 0;
  307. //        }   
  308. //}        


  309. void USART2_IRQHandler(void)                       
  310. {
  311.         u8 Res=0;
  312.         if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET){
  313.                 Res = USART_ReceiveData(USART2);
  314. //                LCD_ShowString(30,140,200,16,16,(u8*)Res);
  315.                 Uart2_Buf[First_Int] = Res;            //將接收到的字符串存到緩存中
  316.                 First_Int++;                                        //緩存指針向后移動(dòng)
  317.                 if(First_Int > Buf2_Max)                       //如果緩存滿,將緩存指針指向緩存的首地址
  318.                 {
  319.                         First_Int = 0;
  320.                 }   
  321.         }
  322. }
復(fù)制代碼


_煙霧報(bào)警器_手機(jī)發(fā)送短信.zip

567.29 KB, 下載次數(shù): 45, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1146186 發(fā)表于 2025-6-9 16:26 | 只看該作者
可以看看原理圖嗎
回復(fù)

使用道具 舉報(bào)

板凳
ID:1155224 發(fā)表于 2025-6-25 14:29 | 只看該作者
有硬件原理圖嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表