久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32+SIM800C單片機主控制器程序 鏈接阿里云項目分享

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:597084 發(fā)表于 2021-3-25 10:49 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
stm32 單片機主控制器 鏈接阿里云項目分享

單片機源程序如下:
  1. #include "stm32f10x.h"  //包含需要的頭文件
  2. #include "sim800c.h"        //包含需要的頭文件
  3. #include "delay.h"            //包含需要的頭文件
  4. #include "usart1.h"            //包含需要的頭文件
  5. #include "mqtt.h"            //包含需要的頭文件
  6. /*-------------------------------------------------*/
  7. /*函數(shù)名:初始化SIM800C的GPIO                      */
  8. /*參  數(shù):無                                       */
  9. /*返回值:無                                       */
  10. /*-------------------------------------------------*/
  11. void SIM800C_GPIO_Init(void)
  12. {
  13.         GPIO_InitTypeDef GPIO_InitStructure;                      //定義一個設(shè)置IO端口參數(shù)的結(jié)構(gòu)體
  14.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);   //使能PC端口時鐘
  15.         
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                 //準(zhǔn)備設(shè)置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);                              //設(shè)置PC0
  20.         
  21.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;                //準(zhǔn)備設(shè)置PC1
  22.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //速率50Mhz
  23.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                     //下拉輸入
  24.         GPIO_Init(GPIOC, &GPIO_InitStructure);                              //設(shè)置PC1
  25. }

  26. /*-------------------------------------------------*/
  27. /*函數(shù)名:SIM800C開機                              */
  28. /*參  數(shù):無                                       */
  29. /*返回值:0:開機成功  1:開機失敗                   */
  30. /*-------------------------------------------------*/
  31. char SIM800C_Power(void)
  32. {
  33.         if(POWER_STA==0){                                                                      //如果PC1是低電平,表示目前處于關(guān)機狀態(tài)               
  34.                 u1_printf("\r\n目前處于關(guān)機狀態(tài),準(zhǔn)備開機\r\n");       //串口輸出信息
  35.                 POWER_KEY(1);                                          //先拉高PC0
  36.                 Delay_Ms(1500);                                                                                   //延時
  37.                 POWER_KEY(0);                                                                                   //再拉低PC0,開機
  38.         }else{                                                     //反之PC1是高電平,表示目前處于開機狀態(tài)
  39.                 u1_printf("\r\n目前處于開機狀態(tài),準(zhǔn)備重啟\r\n");       //串口輸出信息               
  40.                 POWER_KEY(1);                                          //先拉高PC0
  41.                 Delay_Ms(1500);                                                                                   //延時
  42.                 POWER_KEY(0);                                                                                   //再拉低PC0,關(guān)機
  43.                 Delay_Ms(1200);                                        //間隔
  44.                 POWER_KEY(1);                                          //先拉高PC0
  45.                 Delay_Ms(1500);                                                                                   //延時
  46.                 POWER_KEY(0);                                                                                   //再拉低PC0,開機,完成重啟
  47.         }        
  48.         Delay_Ms(2000);                                                           //延時,等待狀態(tài)穩(wěn)定
  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. /*函數(shù)名:發(fā)送設(shè)置指令                             */
  59. /*參  數(shù):cmd:指令                                */
  60. /*參  數(shù):timeout:超時時間(100ms的倍數(shù))         */
  61. /*返回值:0:正確   其他:錯誤                     */
  62. /*-------------------------------------------------*/
  63. char SIM800C_SendCmd(char *cmd, int timeout)
  64. {
  65.         SIM800C_RxCounter=0;                           //800C接收數(shù)據(jù)量變量清零                        
  66.         memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE);  //清空800C接收緩沖區(qū)
  67.         SIM800C_printf("%s\r\n",cmd);                  //發(fā)送指令
  68.         while(timeout--){                              //等待超時時間到0
  69.                 Delay_Ms(100);                             //延時100ms
  70.                 if(strstr(SIM800C_RX_BUF,"OK"))            //如果接收到OK表示指令成功
  71.                         break;                                                          //主動跳出while循環(huán)
  72.                 u1_printf("%d ",timeout);                  //串口輸出現(xiàn)在的超時時間
  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. /*函數(shù)名:CREG指令,查詢注冊上網(wǎng)絡(luò)                 */
  80. /*參  數(shù):timeout:超時時間(1s的倍數(shù))            */
  81. /*返回值:0:正確   其他:錯誤                     */
  82. /*-------------------------------------------------*/
  83. char SIM800C_CREG(int timeout)
  84. {
  85.         while(timeout--){                                  //等待超時時間到0
  86.                 SIM800C_RxCounter=0;                           //800C接收數(shù)據(jù)量變量清零                        
  87.                 memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE);  //清空800C接收緩沖區(qū)
  88.                 SIM800C_printf("AT+CREG?\r\n");                //發(fā)送指令,查看是否注冊上
  89.                 Delay_Ms(1000);                                //延時1s
  90.                 if(strstr(SIM800C_RX_BUF,"+CREG: 0,1"))        //如果接收到 +CREG: 0,1 表示注冊上
  91.                         break;                                                              //主動跳出while循環(huán)
  92.                 u1_printf("%d ",timeout);                      //串口輸出現(xiàn)在的超時時間
  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. /*函數(shù)名:CSQ指令,查詢信號                        */
  100. /*參  數(shù):timeout:超時時間(100ms的倍數(shù))         */
  101. /*返回值:0:正確   其他:錯誤                     */
  102. /*-------------------------------------------------*/
  103. char SIM800C_CSQ(int timeout)
  104. {
  105.         char  temp1[10],temp2[10] ,temp3[10];                    //定義3個臨時緩沖區(qū)  
  106.         
  107.         SIM800C_RxCounter=0;                                                   //800C接收數(shù)據(jù)量變量清零                        
  108.         memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE);                          //清空800C接收緩沖區(qū)
  109.         SIM800C_printf("AT+CSQ\r\n");                                         //發(fā)送指令,查詢信號質(zhì)量
  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);   //格式化搜索,信號質(zhì)量
  114.                         u1_printf("信號強度范圍0~31,99表示無信號\r\n");  //串口輸出信息
  115.                         u1_printf("信號強度:%s\r\n",temp2);             //串口輸出信息
  116.                         break;                                                                    //主動跳出while循環(huán)
  117.                 }
  118.                 u1_printf("%d ",timeout);                            //串口輸出現(xiàn)在的超時時間
  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. /*函數(shù)名:CGATT指令,查詢是否附著GPRS              */
  126. /*參  數(shù):timeout:超時時間(1s的倍數(shù))            */
  127. /*返回值:0:正確   其他:錯誤                     */
  128. /*-------------------------------------------------*/
  129. char SIM800C_CGATT(int timeout)
  130. {
  131.         while(timeout--){                                  //等待超時時間到0
  132.                 SIM800C_RxCounter=0;                           //800C接收數(shù)據(jù)量變量清零                        
  133.                 memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE);  //清空800C接收緩沖區(qū)
  134.                 SIM800C_printf("AT+CGATT?\r\n");               //發(fā)送指令,查詢是否附著GPRS
  135.                 Delay_Ms(1000);                                //延時1s
  136.                 if(strstr(SIM800C_RX_BUF,"+CGATT: 1"))                   //接收到 +CGATT: 1 表示指令成功
  137.                         break;                                                              //主動跳出while循環(huán)
  138.                 u1_printf("%d ",timeout);                      //串口輸出現(xiàn)在的超時時間
  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. /*函數(shù)名:激活數(shù)據(jù)網(wǎng)絡(luò)                             */
  146. /*參  數(shù):無                                       */
  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)){  //發(fā)送激活GPRS命令,超時時間6s
  153.                 u1_printf("激活GPRS失敗\r\n");                            //串口輸出信息
  154.                 return 1;                                                 //如果if成立,表示超時了,返回1
  155.         }else{                                                        //反之,表示指令正確
  156.                 u1_printf("激活GPRS成功\r\n");                            //串口輸出信息
  157.                 u1_printf("等待設(shè)置接入點... ...\r\n");                   //串口輸出信息
  158.                 if(SIM800C_SendCmd("AT+SAPBR=3,1,\"APN\",\"CMIOT\"",60)){ //發(fā)送設(shè)置接入點命令,超時時間6s
  159.                         u1_printf("設(shè)置接入點失敗\r\n");                      //串口輸出信息
  160.                         return 2;                                             //如果if成立,表示超時了,返回2
  161.                 }else{                                                                                                          //反之,表示指令正確
  162.                         u1_printf("設(shè)置接入點成功\r\n");                      //串口輸出信息
  163.                         u1_printf("等待打開GPRS網(wǎng)絡(luò)... ...\r\n");             //串口輸出信息
  164.                         if(SIM800C_SendCmd("AT+SAPBR=1,1",60)){               //發(fā)送打開網(wǎng)絡(luò)命令,超時時間6s
  165.                                 u1_printf("打開GPRS網(wǎng)絡(luò)失敗\r\n");                //串口輸出信息
  166.                                 return 3;                                         //如果if成立,表示超時了,返回3
  167.                         }else u1_printf("打開GPRS網(wǎng)絡(luò)成功\r\n");              //串口輸出信息        
  168.                 }
  169.         }        
  170.         return 0;
  171. }
  172. /*-------------------------------------------------*/
  173. /*函數(shù)名:同服務(wù)器建立TCP連接                      */
  174. /*參  數(shù):timeout:超時時間(1s的倍數(shù))            */
  175. /*返回值:0:正確   其他:錯誤                     */
  176. /*-------------------------------------------------*/
  177. char SIM800C_TCPConnect(int timeout)
  178. {
  179.         SIM800C_RxCounter=0;                           //800C接收數(shù)據(jù)量變量清零                        
  180.         memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE);  //清空800C接收緩沖區(qū)
  181.         SIM800C_printf("AT+CIPSTART=\"TCP\",\"%s\",\"%d\"\r\n",ServerIP,ServerPort); //發(fā)送指令,連接服務(wù)器
  182.         while(timeout--){                              //等待超時時間到0
  183.                 Delay_Ms(1000);                            //延時1s
  184.                 if(strstr(SIM800C_RX_BUF,"CONNECT"))       //如果接收到CONNECT表示連接成功
  185.                         break;                                                          //主動跳出while循環(huán)
  186. //S                 u1_printf("%d ",timeout);                  //串口輸出現(xiàn)在的超時時間
  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. /*函數(shù)名:同服務(wù)器斷開TCP連接                      */
  194. /*參  數(shù):timeout:超時時間(1s的倍數(shù))            */
  195. /*返回值:0:正確   其他:錯誤                     */
  196. /*-------------------------------------------------*/
  197. char SIM800C_TCPClose(int timeout)
  198. {
  199.         SIM800C_RxCounter=0;                           //800C接收數(shù)據(jù)量變量清零                        
  200.         memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE);  //清空800C接收緩沖區(qū)
  201.         SIM800C_printf("AT+CIPCLOSE\r\n");             //發(fā)送指令,斷開連接
  202.         while(timeout--){                              //等待超時時間到0
  203.                 Delay_Ms(1000);                            //延時1s
  204.                 if(strstr(SIM800C_RX_BUF,"CLOSE OK"))      //如果接收到CLOSE OK表示連接成功
  205.                         break;                                                          //主動跳出while循環(huán)
  206.                 u1_printf("%d ",timeout);                  //串口輸出現(xiàn)在的超時時間
  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. /*函數(shù)名:800C連接物聯(lián)網(wǎng)云服務(wù)器                   */
  214. /*參  數(shù):data:數(shù)據(jù)                               */
  215. /*返回值:無                                       */
  216. /*-------------------------------------------------*/
  217. char SIM800C_Connect_IoTServer(void)
  218. {
  219.         char i;                         //定義一個變量,用于for循環(huán)
  220.         
  221.         SIM800C_GPIO_Init();            //控制800C的IO初始化
  222.         if(SIM800C_Power()){            //控制800C開機或重啟,如果返回1,說明開機重啟失敗,準(zhǔn)備重啟
  223.                 return 1;                   //返回1
  224.         }

  225.         u1_printf("請等待注冊上網(wǎng)絡(luò)... ...\r\n");        //串口輸出信息
  226.         if(SIM800C_CREG(30)){                            //等待注冊上網(wǎng)絡(luò),超時單位1s,超時時間30s
  227.                 u1_printf("注冊網(wǎng)絡(luò)超時,準(zhǔn)備重啟\r\n");     //串口輸出信息
  228.                 return 2;                                    //返回2
  229.         }else u1_printf("注冊上網(wǎng)絡(luò)\r\n");               //串口輸出信息
  230.         
  231.         if(SIM800C_CSQ(60)){                             //查詢信號強度,超時單位100ms,超時時間6s
  232.                 u1_printf("查詢信號強度超時,準(zhǔn)備重啟\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超時,準(zhǔn)備重啟\r\n"); //串口輸出信息
  239.                 return 4;                                    //返回4        
  240.         }else u1_printf("附著上GPRS\r\n");               //串口輸出信息
  241.         
  242.         u1_printf("請等待設(shè)置單鏈接... ...\r\n");        //串口輸出信息
  243.         if(SIM800C_SendCmd("AT+CIPMUX=0",60)){           //設(shè)置單鏈接模式,超時單位100ms,超時時間6s        
  244.                 u1_printf("設(shè)置單鏈接失敗,準(zhǔn)備重啟\r\n");   //串口輸出信息
  245.                 return 5;                                    //返回5        
  246.         }else u1_printf("設(shè)置單鏈接模式成功\r\n");       //串口輸出信息

  247.         u1_printf("請等待設(shè)置透傳... ...\r\n");         //串口輸出信息
  248.         if(SIM800C_SendCmd("AT+CIPMODE=1",60)){         //設(shè)置透傳模式,超時單位100ms,超時時間6s               
  249.                 u1_printf("設(shè)置透傳失敗,準(zhǔn)備重啟\r\n");    //串口輸出信息
  250.                 return 6;                                   //返回6
  251.         }else u1_printf("設(shè)置透傳成功\r\n");            //串口輸出信息   
  252.         
  253.         if(SIM800C_ActivateNetwork()){                   //準(zhǔn)備激活網(wǎng)絡(luò)
  254.                 u1_printf("激活網(wǎng)絡(luò)失敗,準(zhǔn)備重啟\r\n");     //串口輸出信息
  255.                 return 7;                                    //返回7
  256.         }
  257.         Delay_Ms(500);                                   //適當(dāng)延時
  258.         for(i=0;i<3;i++)                                 //重試3次                                   
  259.         {
  260.                 u1_printf("請等待連接上服務(wù)器... ...\r\n");  //串口輸出信息
  261.                 if(SIM800C_TCPConnect(10)){                  //同服務(wù)器建立TCP連接,超時單位1s,超時時間10s
  262.                         u1_printf("連接失敗,準(zhǔn)備再次連接\r\n"); //串口輸出信息
  263.                         Delay_Ms(500);                           //適當(dāng)延時
  264.                         if(SIM800C_TCPClose(10)){                //準(zhǔn)備再次連接前要先發(fā)送關(guān)閉指令,超時單位1s,超時時間10s
  265.                                 u1_printf("連接異常,準(zhǔn)備重啟\r\n"); //串口輸出信息
  266.                                 Delay_Ms(500);                       //適當(dāng)延時
  267.                                 return 8;                            //返回7
  268.                         }
  269.                 }else return 0;                              //正確,返回0
  270.         }
  271.         u1_printf("連接不上服務(wù)器,準(zhǔn)備重啟\r\n");       //串口輸出信息
  272.         return 9;                                        //返回9
  273. }
復(fù)制代碼

所有代碼51hei提供下載:
SIM800C.7z (224.23 KB, 下載次數(shù): 60)

評分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:328014 發(fā)表于 2021-3-25 16:54 | 只看該作者
好東東 可惜沒有原理圖PCB文件,樓主能回帖分享一下嗎?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美二区三区 | 亚洲精品乱码久久久久久蜜桃91 | 在线不卡视频 | 久久国产秒 | 精品亚洲一区二区三区 | 欧美一级片久久 | 亚洲视频中文 | 国产精品久久网 | 日韩亚洲一区二区 | www视频在线观看 | 久久久久国产精品午夜一区 | 欧美日韩国产免费 | 成人黄色网址大全 | 在线免费观看视频你懂的 | 精品国产亚洲一区二区三区大结局 | 日韩精品影院 | 亚洲国产成人精品女人久久久 | 欧美日韩高清在线观看 | 欧美日在线| 爱爱视频网 | 成人影视网址 | 国产日韩亚洲欧美 | 久久免费视频在线 | 亚洲精品在线看 | 欧美一级艳情片免费观看 | 欧美一区二区三区在线看 | 成人精品免费视频 | 九九视频在线观看视频6 | 国产乱码精品一区二区三区忘忧草 | 日韩一三区| 国产精品日女人 | 欧美亚洲国产一区二区三区 | 91精品国产高清一区二区三区 | 亚洲国产成人精品女人久久久 | 99视频免费播放 | 91在线| www.色53色.com| 成人免费视频观看视频 | 91成人影院 | 日韩三级免费网站 | 亚洲精品欧美一区二区三区 |