找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm32烟雾报警器源程序_手机发送短信

[复制链接]
跳转到指定楼层
楼主
ID:679189 发表于 2021-3-15 19:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. /**********************************************************************************
  2. * 工程名  :发送TEXT文本短信
  3. * 描述    :通过STM32开发板控制模块发送TEXT文本短信
  4. * 实验平台:STM32F10X
  5. * 库版本  :

  6. * 硬件连接说明
  7.          使用单片串口2与GPRS模块通信  注:使用串口2可以避免下载和通信不会冲突
  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:这个引脚是控制模块启动,V1.2版本已经有自启动电路所以不必接

  19. * 软件功能说明
  20.    板子上电后运行指示灯600ms亮/3000ms灭的频率闪烁
  21.          修改短信中心号、接收方手机号和短信内容,编译成功后下载到单片机里面,就可以实现发
  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缓存长度
  33. #define Buf2_Max 200                                           //串口2缓存长度
  34. /*************        本地常量声明        **************/
  35. static unsigned char *SMS_Num="\"+8613800270500\"";//短信中心号 关于中心号的介绍可以看串口调试笔记的第二部分
  36. static unsigned char *phone="\"18672942506\"";     //短信接收方手机号
  37. static unsigned char *content="Fire Alarm!";//发送短信内容
  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;        //定时器0延时启动计数器
  43. vu8 Uart2_Start;        //串口2开始接收数据
  44. vu8 Uart2_End;          //串口2接收数据结束

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

  49. extern int flag;

  50. /*************        本地函数声明        **************/
  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. * 函数名 : main
  60. * 描述   : 主函数
  61. * 输入   :
  62. * 输出   :
  63. * 返回   :
  64. * 注意   : 串口2负责与MG323模块通信,串口1用于串口调试,可以避免在下载程序时数据
  65.                                          还发送到模块
  66. *******************************************************************************/        
  67. int main(void)
  68. {                
  69.         NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  70.         delay_init();                     //延时函数初始化       
  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();    //查询等待模块注册成功

  82.         Set_Text_Mode();//设置短信为TEXT模式
  83.        

  84.         while(DS18B20_Init())        //1:未检测到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);                        //显示负号
  102.                                 temperature=-temperature;                                        //转为正数
  103.                         }else LCD_ShowChar(60+40,40,' ',16,0);                        //去掉负号
  104.                         POINT_COLOR=BLUE;//设置字体为蓝色
  105.                         LCD_ShowNum(60+40+8,40,temperature/10,2,16);        //显示正数部分            
  106.                            LCD_ShowNum(60+40+32,40,temperature%10,1,16);        //显示小数部分
  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();//发送一条短消息
  118.                         flag1=0;
  119.                 }
  120.                
  121.                 if(flag==1 && (temperature/10)>20 && SMS_flag==1){  //使用温度报警时。只用了整数部分
  122.                         LCD_ShowString(60,200,160,16,16,"Fire Alarm!");
  123.                         Send_Text_Sms();//发送一条短消息
  124.                         SMS_flag = 0;
  125.                 }
  126. //                else{
  127. //                        LCD_ShowString(60,200,160,16,16,"           ");
  128. //                        //SMS_flag = 1;
  129. //                }
  130.         }
  131. }

  132. /*******************************************************************************
  133. * 函数名 : CLR_Buf2
  134. * 描述   : 清除串口2缓存数据
  135. * 输入   :
  136. * 输出   :
  137. * 返回   :
  138. * 注意   :
  139. *******************************************************************************/
  140. void CLR_Buf2(void)
  141. {
  142.         u16 k;
  143.         for(k=0;k<Buf2_Max;k++)      //将缓存内容清零
  144.         {
  145.                 Uart2_Buf[k] = 0x00;
  146.         }
  147.     First_Int = 0;              //接收字符串的起始存储位置
  148. }

  149. /*******************************************************************************
  150. * 函数名 : 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. * 函数名 : Second_AT_Command
  166. * 描述   : 发送AT指令函数
  167. * 输入   : 发送数据的指针、希望接收到的应答数据指针、发送等待时间(单位: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缓存数据
  178.         i = 0;
  179.         while(i == 0)                    
  180.         {
  181.                 if(!Find(a))  //判断缓存中是否含有指定的字符串,如果没有就一直发送
  182.                 {
  183.                         if(Timer0_start == 0)
  184.                         {
  185.                                         b = c;                                                        //将字符串地址给b
  186.                                         for (; *b!='\0';b++)  //  \0--字符串结尾---一次发送一位字符串,然后b++,当字符串结束时,发送完成
  187.                                         {
  188.                                                 while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);  //串口2接收引脚无数据时,空循环
  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  //如果有,即发送成功,则令i=1跳出循环
  198.                 {
  199.                         i = 1;
  200.                         Timer0_start = 0;
  201.                 }
  202.         }
  203.         CLR_Buf2();
  204. }

  205. /*******************************************************************************
  206. * 函数名 : Set_Text_Mode
  207. * 描述   : 设置短信为TEXT文本模式
  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);  //取消回显        ,发送ATE0,等待接收到“OK”才结束,并执行下一步
  218.         Second_AT_Command("AT+CMGF=1","OK",3);  //TEXT模式       
  219.         Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);//所有操作都在SIM卡中进行
  220.         strcat(temp,(char*)SMS_Num); //字符串拼接函数(库函数)---把"AT+CSCA="与\"+8613800270500\"拼接,并存入temp
  221.         Second_AT_Command(temp,"OK",3);//设置短信中心号
  222.        
  223.         LCD_ShowString(30,60,200,16,16,"Set_Text_Mode successful");
  224. }
  225. /*******************************************************************************
  226. * 函数名 : Send_Text_Sms
  227. * 描述   : 发送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); //字符串拼接函数(库函数)
  238.         Second_AT_Command(temp,">",3); //发送temp,等待接收到“>”才发送短信内容
  239.         UART2_SendString((char*)content);     //发送短信内容
  240.         USART_SendData(USART2 ,0X1A);  //发送结束符
  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); //字符串拼接函数(库函数)
  250.         Second_AT_Command(temp,">",3); //发送temp,等待接收到“>”才发送短信内容
  251.         UART2_SendString((char*)content1);     //发送短信内容
  252.         USART_SendData(USART2 ,0X1A);  //发送结束符
  253.         UART2_SendLR();
  254.        
  255.         LCD_ShowString(30,90,200,16,16,"Send_Text_Sms successful");
  256. }

  257. /*******************************************************************************
  258. * 函数名 : Wait_CREG
  259. * 描述   : 等待模块注册成功
  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?");   //查询模块是否注册成功
  275. //                UART2_SendString("/r/n");
  276.                 UART2_SendLR();  //发回车换行
  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] == ':')  //如果响应返回的结果中有分号
  284.                         {
  285. //                                LCD_ShowString(30,140,200,16,16,"debug2");
  286.                                 if((Uart2_Buf[k+4] == '1')||(Uart2_Buf[k+4] == '5')) //说明模块注册成功 0:未注册,且没有进行搜寻新网络,1:已注册本地网络,2:未注册,正在搜寻网络,4:未知代码,5:已注册,处于漫游状态
  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++;                                        //缓存指针向后移动
  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++;                                        //缓存指针向后移动
  317.                 if(First_Int > Buf2_Max)                       //如果缓存满,将缓存指针指向缓存的首地址
  318.                 {
  319.                         First_Int = 0;
  320.                 }   
  321.         }
  322. }
复制代码


_烟雾报警器_手机发送短信.zip

567.29 KB, 下载次数: 45, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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