找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm32+SIM800C单片机主控制器程序 链接阿里云项目分享

[复制链接]
跳转到指定楼层
楼主
stm32 单片机主控制器 链接阿里云项目分享

单片机源程序如下:
  1. #include "stm32f10x.h"  //包含需要的头文件
  2. #include "sim800c.h"        //包含需要的头文件
  3. #include "delay.h"            //包含需要的头文件
  4. #include "usart1.h"            //包含需要的头文件
  5. #include "mqtt.h"            //包含需要的头文件
  6. /*-------------------------------------------------*/
  7. /*函数名:初始化SIM800C的GPIO                      */
  8. /*参  数:无                                       */
  9. /*返回值:无                                       */
  10. /*-------------------------------------------------*/
  11. void SIM800C_GPIO_Init(void)
  12. {
  13.         GPIO_InitTypeDef GPIO_InitStructure;                      //定义一个设置IO端口参数的结构体
  14.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);   //使能PC端口时钟
  15.         
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                 //准备设置PC0
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //速率50Mhz
  18.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                     //推免输出方式
  19.         GPIO_Init(GPIOC, &GPIO_InitStructure);                              //设置PC0
  20.         
  21.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;                //准备设置PC1
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //速率50Mhz
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                     //下拉输入
  24.         GPIO_Init(GPIOC, &GPIO_InitStructure);                              //设置PC1
  25. }

  26. /*-------------------------------------------------*/
  27. /*函数名:SIM800C开机                              */
  28. /*参  数:无                                       */
  29. /*返回值:0:开机成功  1:开机失败                   */
  30. /*-------------------------------------------------*/
  31. char SIM800C_Power(void)
  32. {
  33.         if(POWER_STA==0){                                                                      //如果PC1是低电平,表示目前处于关机状态               
  34.                 u1_printf("\r\n目前处于关机状态,准备开机\r\n");       //串口输出信息
  35.                 POWER_KEY(1);                                          //先拉高PC0
  36.                 Delay_Ms(1500);                                                                                   //延时
  37.                 POWER_KEY(0);                                                                                   //再拉低PC0,开机
  38.         }else{                                                     //反之PC1是高电平,表示目前处于开机状态
  39.                 u1_printf("\r\n目前处于开机状态,准备重启\r\n");       //串口输出信息               
  40.                 POWER_KEY(1);                                          //先拉高PC0
  41.                 Delay_Ms(1500);                                                                                   //延时
  42.                 POWER_KEY(0);                                                                                   //再拉低PC0,关机
  43.                 Delay_Ms(1200);                                        //间隔
  44.                 POWER_KEY(1);                                          //先拉高PC0
  45.                 Delay_Ms(1500);                                                                                   //延时
  46.                 POWER_KEY(0);                                                                                   //再拉低PC0,开机,完成重启
  47.         }        
  48.         Delay_Ms(2000);                                                           //延时,等待状态稳定
  49.         if(POWER_STA){                                             //如果PC1是低电平,表示开机或是重启成功
  50.                 u1_printf("开机成功\r\n");                             //串口输出信息
  51.         }else{                                                                                                       //反之PC1是高电平,表示开始或是重启失败
  52.                 u1_printf("开机失败\r\n");                                                            //串口输出信息
  53.                 return 1;                                              //返回1,表示失败
  54.         }        
  55.         return 0;                                                  //返回0,表示成功
  56. }
  57. /*-------------------------------------------------*/
  58. /*函数名:发送设置指令                             */
  59. /*参  数:cmd:指令                                */
  60. /*参  数:timeout:超时时间(100ms的倍数)         */
  61. /*返回值:0:正确   其他:错误                     */
  62. /*-------------------------------------------------*/
  63. char SIM800C_SendCmd(char *cmd, int timeout)
  64. {
  65.         SIM800C_RxCounter=0;                           //800C接收数据量变量清零                        
  66.         memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE);  //清空800C接收缓冲区
  67.         SIM800C_printf("%s\r\n",cmd);                  //发送指令
  68.         while(timeout--){                              //等待超时时间到0
  69.                 Delay_Ms(100);                             //延时100ms
  70.                 if(strstr(SIM800C_RX_BUF,"OK"))            //如果接收到OK表示指令成功
  71.                         break;                                                          //主动跳出while循环
  72.                 u1_printf("%d ",timeout);                  //串口输出现在的超时时间
  73.         }
  74.         u1_printf("\r\n");                             //串口输出信息
  75.         if(timeout<=0)return 1;                        //如果timeout<=0,说明超时时间到了,也没能收到OK,返回1
  76.         else return 0;                                                            //反之,表示正确,说明收到OK,通过break主动跳出while
  77. }
  78. /*-------------------------------------------------*/
  79. /*函数名:CREG指令,查询注册上网络                 */
  80. /*参  数:timeout:超时时间(1s的倍数)            */
  81. /*返回值:0:正确   其他:错误                     */
  82. /*-------------------------------------------------*/
  83. char SIM800C_CREG(int timeout)
  84. {
  85.         while(timeout--){                                  //等待超时时间到0
  86.                 SIM800C_RxCounter=0;                           //800C接收数据量变量清零                        
  87.                 memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE);  //清空800C接收缓冲区
  88.                 SIM800C_printf("AT+CREG?\r\n");                //发送指令,查看是否注册上
  89.                 Delay_Ms(1000);                                //延时1s
  90.                 if(strstr(SIM800C_RX_BUF,"+CREG: 0,1"))        //如果接收到 +CREG: 0,1 表示注册上
  91.                         break;                                                              //主动跳出while循环
  92.                 u1_printf("%d ",timeout);                      //串口输出现在的超时时间
  93.         }
  94.         u1_printf("\r\n");                                 //串口输出信息
  95.         if(timeout<=0)return 1;                            //如果timeout<=0,说明超时时间到了,也没能收到+CREG: 0,1,返回1
  96.         else return 0;                                                                //反之,表示正确,说明收到+CREG: 0,1,通过break主动跳出while
  97. }
  98. /*-------------------------------------------------*/
  99. /*函数名:CSQ指令,查询信号                        */
  100. /*参  数:timeout:超时时间(100ms的倍数)         */
  101. /*返回值:0:正确   其他:错误                     */
  102. /*-------------------------------------------------*/
  103. char SIM800C_CSQ(int timeout)
  104. {
  105.         char  temp1[10],temp2[10] ,temp3[10];                    //定义3个临时缓冲区  
  106.         
  107.         SIM800C_RxCounter=0;                                                   //800C接收数据量变量清零                        
  108.         memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE);                          //清空800C接收缓冲区
  109.         SIM800C_printf("AT+CSQ\r\n");                                         //发送指令,查询信号质量
  110.         while(timeout--){                                        //等待超时时间到0
  111.                 Delay_Ms(100);                                                     //延时100ms
  112.                 if(strstr(SIM800C_RX_BUF,"+CSQ:")){                             //接收到 +CSQ: 表示指令成功
  113.                         sscanf(SIM800C_RX_BUF,"%[^ ] %[^,],%[^,]",temp1,temp2,temp3);   //格式化搜索,信号质量
  114.                         u1_printf("信号强度范围0~31,99表示无信号\r\n");  //串口输出信息
  115.                         u1_printf("信号强度:%s\r\n",temp2);             //串口输出信息
  116.                         break;                                                                    //主动跳出while循环
  117.                 }
  118.                 u1_printf("%d ",timeout);                            //串口输出现在的超时时间
  119.         }
  120.         u1_printf("\r\n");                                       //串口输出信息
  121.         if(timeout<=0)return 1;                                  //如果timeout<=0,说明超时时间到了,也没能收到+CSQ:,返回1
  122.         else return 0;                                                                      //反之,表示正确,说明收到+CSQ:,通过break主动跳出while
  123. }
  124. /*-------------------------------------------------*/
  125. /*函数名:CGATT指令,查询是否附着GPRS              */
  126. /*参  数:timeout:超时时间(1s的倍数)            */
  127. /*返回值:0:正确   其他:错误                     */
  128. /*-------------------------------------------------*/
  129. char SIM800C_CGATT(int timeout)
  130. {
  131.         while(timeout--){                                  //等待超时时间到0
  132.                 SIM800C_RxCounter=0;                           //800C接收数据量变量清零                        
  133.                 memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE);  //清空800C接收缓冲区
  134.                 SIM800C_printf("AT+CGATT?\r\n");               //发送指令,查询是否附着GPRS
  135.                 Delay_Ms(1000);                                //延时1s
  136.                 if(strstr(SIM800C_RX_BUF,"+CGATT: 1"))                   //接收到 +CGATT: 1 表示指令成功
  137.                         break;                                                              //主动跳出while循环
  138.                 u1_printf("%d ",timeout);                      //串口输出现在的超时时间
  139.         }
  140.         u1_printf("\r\n");                                 //串口输出信息
  141.         if(timeout<=0)return 1;                            //如果timeout<=0,说明超时时间到了,也没能收到+CGATT: 1,返回1
  142.         else return 0;                                                                //反之,表示正确,说明收到+CGATT: 1,通过break主动跳出while
  143. }
  144. /*-------------------------------------------------*/
  145. /*函数名:激活数据网络                             */
  146. /*参  数:无                                       */
  147. /*返回值:0:正确   其他:错误                     */
  148. /*-------------------------------------------------*/
  149. char SIM800C_ActivateNetwork(void)
  150. {                                                                      //反之如果time小于timeout,表示正确,通过break主动跳出while
  151.         u1_printf("等待激活GPRS... ...\r\n");                         //串口输出信息
  152.         if(SIM800C_SendCmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"",60)){  //发送激活GPRS命令,超时时间6s
  153.                 u1_printf("激活GPRS失败\r\n");                            //串口输出信息
  154.                 return 1;                                                 //如果if成立,表示超时了,返回1
  155.         }else{                                                        //反之,表示指令正确
  156.                 u1_printf("激活GPRS成功\r\n");                            //串口输出信息
  157.                 u1_printf("等待设置接入点... ...\r\n");                   //串口输出信息
  158.                 if(SIM800C_SendCmd("AT+SAPBR=3,1,\"APN\",\"CMIOT\"",60)){ //发送设置接入点命令,超时时间6s
  159.                         u1_printf("设置接入点失败\r\n");                      //串口输出信息
  160.                         return 2;                                             //如果if成立,表示超时了,返回2
  161.                 }else{                                                                                                          //反之,表示指令正确
  162.                         u1_printf("设置接入点成功\r\n");                      //串口输出信息
  163.                         u1_printf("等待打开GPRS网络... ...\r\n");             //串口输出信息
  164.                         if(SIM800C_SendCmd("AT+SAPBR=1,1",60)){               //发送打开网络命令,超时时间6s
  165.                                 u1_printf("打开GPRS网络失败\r\n");                //串口输出信息
  166.                                 return 3;                                         //如果if成立,表示超时了,返回3
  167.                         }else u1_printf("打开GPRS网络成功\r\n");              //串口输出信息        
  168.                 }
  169.         }        
  170.         return 0;
  171. }
  172. /*-------------------------------------------------*/
  173. /*函数名:同服务器建立TCP连接                      */
  174. /*参  数:timeout:超时时间(1s的倍数)            */
  175. /*返回值:0:正确   其他:错误                     */
  176. /*-------------------------------------------------*/
  177. char SIM800C_TCPConnect(int timeout)
  178. {
  179.         SIM800C_RxCounter=0;                           //800C接收数据量变量清零                        
  180.         memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE);  //清空800C接收缓冲区
  181.         SIM800C_printf("AT+CIPSTART=\"TCP\",\"%s\",\"%d\"\r\n",ServerIP,ServerPort); //发送指令,连接服务器
  182.         while(timeout--){                              //等待超时时间到0
  183.                 Delay_Ms(1000);                            //延时1s
  184.                 if(strstr(SIM800C_RX_BUF,"CONNECT"))       //如果接收到CONNECT表示连接成功
  185.                         break;                                                          //主动跳出while循环
  186. //S                 u1_printf("%d ",timeout);                  //串口输出现在的超时时间
  187.         }
  188. //S         u1_printf("\r\n");                             //串口输出信息
  189.         if(timeout<=0)return 1;                        //如果timeout<=0,说明超时时间到了,也没能收到CONNECT,返回1
  190.         else return 0;                                                            //反之,表示正确,说明收到CONNECT,通过break主动跳出while
  191. }
  192. /*-------------------------------------------------*/
  193. /*函数名:同服务器断开TCP连接                      */
  194. /*参  数:timeout:超时时间(1s的倍数)            */
  195. /*返回值:0:正确   其他:错误                     */
  196. /*-------------------------------------------------*/
  197. char SIM800C_TCPClose(int timeout)
  198. {
  199.         SIM800C_RxCounter=0;                           //800C接收数据量变量清零                        
  200.         memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE);  //清空800C接收缓冲区
  201.         SIM800C_printf("AT+CIPCLOSE\r\n");             //发送指令,断开连接
  202.         while(timeout--){                              //等待超时时间到0
  203.                 Delay_Ms(1000);                            //延时1s
  204.                 if(strstr(SIM800C_RX_BUF,"CLOSE OK"))      //如果接收到CLOSE OK表示连接成功
  205.                         break;                                                          //主动跳出while循环
  206.                 u1_printf("%d ",timeout);                  //串口输出现在的超时时间
  207.         }
  208.         u1_printf("\r\n");                             //串口输出信息
  209.         if(timeout<=0)return 1;                        //如果timeout<=0,说明超时时间到了,也没能收到CLOSE OK,返回1
  210.         else return 0;                                                            //反之,表示正确,说明收到CLOSE OK,通过break主动跳出while
  211. }
  212. /*-------------------------------------------------*/
  213. /*函数名:800C连接物联网云服务器                   */
  214. /*参  数:data:数据                               */
  215. /*返回值:无                                       */
  216. /*-------------------------------------------------*/
  217. char SIM800C_Connect_IoTServer(void)
  218. {
  219.         char i;                         //定义一个变量,用于for循环
  220.         
  221.         SIM800C_GPIO_Init();            //控制800C的IO初始化
  222.         if(SIM800C_Power()){            //控制800C开机或重启,如果返回1,说明开机重启失败,准备重启
  223.                 return 1;                   //返回1
  224.         }

  225.         u1_printf("请等待注册上网络... ...\r\n");        //串口输出信息
  226.         if(SIM800C_CREG(30)){                            //等待注册上网络,超时单位1s,超时时间30s
  227.                 u1_printf("注册网络超时,准备重启\r\n");     //串口输出信息
  228.                 return 2;                                    //返回2
  229.         }else u1_printf("注册上网络\r\n");               //串口输出信息
  230.         
  231.         if(SIM800C_CSQ(60)){                             //查询信号强度,超时单位100ms,超时时间6s
  232.                 u1_printf("查询信号强度超时,准备重启\r\n"); //串口输出信息
  233.                 return 3;                                    //返回3        
  234.         }
  235.         
  236.         u1_printf("请等待附着上GPRS... ...\r\n");        //串口输出信息
  237.         if(SIM800C_CGATT(30)){                           //查询附着GPRS,超时单位1s,超时时间30s
  238.                 u1_printf("查询附着GPRS超时,准备重启\r\n"); //串口输出信息
  239.                 return 4;                                    //返回4        
  240.         }else u1_printf("附着上GPRS\r\n");               //串口输出信息
  241.         
  242.         u1_printf("请等待设置单链接... ...\r\n");        //串口输出信息
  243.         if(SIM800C_SendCmd("AT+CIPMUX=0",60)){           //设置单链接模式,超时单位100ms,超时时间6s        
  244.                 u1_printf("设置单链接失败,准备重启\r\n");   //串口输出信息
  245.                 return 5;                                    //返回5        
  246.         }else u1_printf("设置单链接模式成功\r\n");       //串口输出信息

  247.         u1_printf("请等待设置透传... ...\r\n");         //串口输出信息
  248.         if(SIM800C_SendCmd("AT+CIPMODE=1",60)){         //设置透传模式,超时单位100ms,超时时间6s               
  249.                 u1_printf("设置透传失败,准备重启\r\n");    //串口输出信息
  250.                 return 6;                                   //返回6
  251.         }else u1_printf("设置透传成功\r\n");            //串口输出信息   
  252.         
  253.         if(SIM800C_ActivateNetwork()){                   //准备激活网络
  254.                 u1_printf("激活网络失败,准备重启\r\n");     //串口输出信息
  255.                 return 7;                                    //返回7
  256.         }
  257.         Delay_Ms(500);                                   //适当延时
  258.         for(i=0;i<3;i++)                                 //重试3次                                   
  259.         {
  260.                 u1_printf("请等待连接上服务器... ...\r\n");  //串口输出信息
  261.                 if(SIM800C_TCPConnect(10)){                  //同服务器建立TCP连接,超时单位1s,超时时间10s
  262.                         u1_printf("连接失败,准备再次连接\r\n"); //串口输出信息
  263.                         Delay_Ms(500);                           //适当延时
  264.                         if(SIM800C_TCPClose(10)){                //准备再次连接前要先发送关闭指令,超时单位1s,超时时间10s
  265.                                 u1_printf("连接异常,准备重启\r\n"); //串口输出信息
  266.                                 Delay_Ms(500);                       //适当延时
  267.                                 return 8;                            //返回7
  268.                         }
  269.                 }else return 0;                              //正确,返回0
  270.         }
  271.         u1_printf("连接不上服务器,准备重启\r\n");       //串口输出信息
  272.         return 9;                                        //返回9
  273. }
复制代码

所有代码51hei提供下载:
SIM800C.7z (224.23 KB, 下载次数: 60)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:328014 发表于 2021-3-25 16:54 | 只看该作者
好东东 可惜没有原理图PCB文件,楼主能回帖分享一下吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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