|
stm32 單片機主控制器 鏈接阿里云項目分享
51hei圖片_20210325104751.png (319.08 KB, 下載次數(shù): 35)
下載附件
2021-3-25 10:48 上傳
單片機源程序如下:
- #include "stm32f10x.h" //包含需要的頭文件
- #include "sim800c.h" //包含需要的頭文件
- #include "delay.h" //包含需要的頭文件
- #include "usart1.h" //包含需要的頭文件
- #include "mqtt.h" //包含需要的頭文件
- /*-------------------------------------------------*/
- /*函數(shù)名:初始化SIM800C的GPIO */
- /*參 數(shù):無 */
- /*返回值:無 */
- /*-------------------------------------------------*/
- void SIM800C_GPIO_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //定義一個設(shè)置IO端口參數(shù)的結(jié)構(gòu)體
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE); //使能PC端口時鐘
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //準(zhǔn)備設(shè)置PC0
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速率50Mhz
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推免輸出方式
- GPIO_Init(GPIOC, &GPIO_InitStructure); //設(shè)置PC0
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //準(zhǔn)備設(shè)置PC1
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速率50Mhz
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉輸入
- GPIO_Init(GPIOC, &GPIO_InitStructure); //設(shè)置PC1
- }
- /*-------------------------------------------------*/
- /*函數(shù)名:SIM800C開機 */
- /*參 數(shù):無 */
- /*返回值:0:開機成功 1:開機失敗 */
- /*-------------------------------------------------*/
- char SIM800C_Power(void)
- {
- if(POWER_STA==0){ //如果PC1是低電平,表示目前處于關(guān)機狀態(tài)
- u1_printf("\r\n目前處于關(guān)機狀態(tài),準(zhǔn)備開機\r\n"); //串口輸出信息
- POWER_KEY(1); //先拉高PC0
- Delay_Ms(1500); //延時
- POWER_KEY(0); //再拉低PC0,開機
- }else{ //反之PC1是高電平,表示目前處于開機狀態(tài)
- u1_printf("\r\n目前處于開機狀態(tài),準(zhǔn)備重啟\r\n"); //串口輸出信息
- POWER_KEY(1); //先拉高PC0
- Delay_Ms(1500); //延時
- POWER_KEY(0); //再拉低PC0,關(guān)機
- Delay_Ms(1200); //間隔
- POWER_KEY(1); //先拉高PC0
- Delay_Ms(1500); //延時
- POWER_KEY(0); //再拉低PC0,開機,完成重啟
- }
- Delay_Ms(2000); //延時,等待狀態(tài)穩(wěn)定
- if(POWER_STA){ //如果PC1是低電平,表示開機或是重啟成功
- u1_printf("開機成功\r\n"); //串口輸出信息
- }else{ //反之PC1是高電平,表示開始或是重啟失敗
- u1_printf("開機失敗\r\n"); //串口輸出信息
- return 1; //返回1,表示失敗
- }
- return 0; //返回0,表示成功
- }
- /*-------------------------------------------------*/
- /*函數(shù)名:發(fā)送設(shè)置指令 */
- /*參 數(shù):cmd:指令 */
- /*參 數(shù):timeout:超時時間(100ms的倍數(shù)) */
- /*返回值:0:正確 其他:錯誤 */
- /*-------------------------------------------------*/
- char SIM800C_SendCmd(char *cmd, int timeout)
- {
- SIM800C_RxCounter=0; //800C接收數(shù)據(jù)量變量清零
- memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE); //清空800C接收緩沖區(qū)
- SIM800C_printf("%s\r\n",cmd); //發(fā)送指令
- while(timeout--){ //等待超時時間到0
- Delay_Ms(100); //延時100ms
- if(strstr(SIM800C_RX_BUF,"OK")) //如果接收到OK表示指令成功
- break; //主動跳出while循環(huán)
- u1_printf("%d ",timeout); //串口輸出現(xiàn)在的超時時間
- }
- u1_printf("\r\n"); //串口輸出信息
- if(timeout<=0)return 1; //如果timeout<=0,說明超時時間到了,也沒能收到OK,返回1
- else return 0; //反之,表示正確,說明收到OK,通過break主動跳出while
- }
- /*-------------------------------------------------*/
- /*函數(shù)名:CREG指令,查詢注冊上網(wǎng)絡(luò) */
- /*參 數(shù):timeout:超時時間(1s的倍數(shù)) */
- /*返回值:0:正確 其他:錯誤 */
- /*-------------------------------------------------*/
- char SIM800C_CREG(int timeout)
- {
- while(timeout--){ //等待超時時間到0
- SIM800C_RxCounter=0; //800C接收數(shù)據(jù)量變量清零
- memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE); //清空800C接收緩沖區(qū)
- SIM800C_printf("AT+CREG?\r\n"); //發(fā)送指令,查看是否注冊上
- Delay_Ms(1000); //延時1s
- if(strstr(SIM800C_RX_BUF,"+CREG: 0,1")) //如果接收到 +CREG: 0,1 表示注冊上
- break; //主動跳出while循環(huán)
- u1_printf("%d ",timeout); //串口輸出現(xiàn)在的超時時間
- }
- u1_printf("\r\n"); //串口輸出信息
- if(timeout<=0)return 1; //如果timeout<=0,說明超時時間到了,也沒能收到+CREG: 0,1,返回1
- else return 0; //反之,表示正確,說明收到+CREG: 0,1,通過break主動跳出while
- }
- /*-------------------------------------------------*/
- /*函數(shù)名:CSQ指令,查詢信號 */
- /*參 數(shù):timeout:超時時間(100ms的倍數(shù)) */
- /*返回值:0:正確 其他:錯誤 */
- /*-------------------------------------------------*/
- char SIM800C_CSQ(int timeout)
- {
- char temp1[10],temp2[10] ,temp3[10]; //定義3個臨時緩沖區(qū)
-
- SIM800C_RxCounter=0; //800C接收數(shù)據(jù)量變量清零
- memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE); //清空800C接收緩沖區(qū)
- SIM800C_printf("AT+CSQ\r\n"); //發(fā)送指令,查詢信號質(zhì)量
- while(timeout--){ //等待超時時間到0
- Delay_Ms(100); //延時100ms
- if(strstr(SIM800C_RX_BUF,"+CSQ:")){ //接收到 +CSQ: 表示指令成功
- sscanf(SIM800C_RX_BUF,"%[^ ] %[^,],%[^,]",temp1,temp2,temp3); //格式化搜索,信號質(zhì)量
- u1_printf("信號強度范圍0~31,99表示無信號\r\n"); //串口輸出信息
- u1_printf("信號強度:%s\r\n",temp2); //串口輸出信息
- break; //主動跳出while循環(huán)
- }
- u1_printf("%d ",timeout); //串口輸出現(xiàn)在的超時時間
- }
- u1_printf("\r\n"); //串口輸出信息
- if(timeout<=0)return 1; //如果timeout<=0,說明超時時間到了,也沒能收到+CSQ:,返回1
- else return 0; //反之,表示正確,說明收到+CSQ:,通過break主動跳出while
- }
- /*-------------------------------------------------*/
- /*函數(shù)名:CGATT指令,查詢是否附著GPRS */
- /*參 數(shù):timeout:超時時間(1s的倍數(shù)) */
- /*返回值:0:正確 其他:錯誤 */
- /*-------------------------------------------------*/
- char SIM800C_CGATT(int timeout)
- {
- while(timeout--){ //等待超時時間到0
- SIM800C_RxCounter=0; //800C接收數(shù)據(jù)量變量清零
- memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE); //清空800C接收緩沖區(qū)
- SIM800C_printf("AT+CGATT?\r\n"); //發(fā)送指令,查詢是否附著GPRS
- Delay_Ms(1000); //延時1s
- if(strstr(SIM800C_RX_BUF,"+CGATT: 1")) //接收到 +CGATT: 1 表示指令成功
- break; //主動跳出while循環(huán)
- u1_printf("%d ",timeout); //串口輸出現(xiàn)在的超時時間
- }
- u1_printf("\r\n"); //串口輸出信息
- if(timeout<=0)return 1; //如果timeout<=0,說明超時時間到了,也沒能收到+CGATT: 1,返回1
- else return 0; //反之,表示正確,說明收到+CGATT: 1,通過break主動跳出while
- }
- /*-------------------------------------------------*/
- /*函數(shù)名:激活數(shù)據(jù)網(wǎng)絡(luò) */
- /*參 數(shù):無 */
- /*返回值:0:正確 其他:錯誤 */
- /*-------------------------------------------------*/
- char SIM800C_ActivateNetwork(void)
- { //反之如果time小于timeout,表示正確,通過break主動跳出while
- u1_printf("等待激活GPRS... ...\r\n"); //串口輸出信息
- if(SIM800C_SendCmd("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"",60)){ //發(fā)送激活GPRS命令,超時時間6s
- u1_printf("激活GPRS失敗\r\n"); //串口輸出信息
- return 1; //如果if成立,表示超時了,返回1
- }else{ //反之,表示指令正確
- u1_printf("激活GPRS成功\r\n"); //串口輸出信息
- u1_printf("等待設(shè)置接入點... ...\r\n"); //串口輸出信息
- if(SIM800C_SendCmd("AT+SAPBR=3,1,\"APN\",\"CMIOT\"",60)){ //發(fā)送設(shè)置接入點命令,超時時間6s
- u1_printf("設(shè)置接入點失敗\r\n"); //串口輸出信息
- return 2; //如果if成立,表示超時了,返回2
- }else{ //反之,表示指令正確
- u1_printf("設(shè)置接入點成功\r\n"); //串口輸出信息
- u1_printf("等待打開GPRS網(wǎng)絡(luò)... ...\r\n"); //串口輸出信息
- if(SIM800C_SendCmd("AT+SAPBR=1,1",60)){ //發(fā)送打開網(wǎng)絡(luò)命令,超時時間6s
- u1_printf("打開GPRS網(wǎng)絡(luò)失敗\r\n"); //串口輸出信息
- return 3; //如果if成立,表示超時了,返回3
- }else u1_printf("打開GPRS網(wǎng)絡(luò)成功\r\n"); //串口輸出信息
- }
- }
- return 0;
- }
- /*-------------------------------------------------*/
- /*函數(shù)名:同服務(wù)器建立TCP連接 */
- /*參 數(shù):timeout:超時時間(1s的倍數(shù)) */
- /*返回值:0:正確 其他:錯誤 */
- /*-------------------------------------------------*/
- char SIM800C_TCPConnect(int timeout)
- {
- SIM800C_RxCounter=0; //800C接收數(shù)據(jù)量變量清零
- memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE); //清空800C接收緩沖區(qū)
- SIM800C_printf("AT+CIPSTART=\"TCP\",\"%s\",\"%d\"\r\n",ServerIP,ServerPort); //發(fā)送指令,連接服務(wù)器
- while(timeout--){ //等待超時時間到0
- Delay_Ms(1000); //延時1s
- if(strstr(SIM800C_RX_BUF,"CONNECT")) //如果接收到CONNECT表示連接成功
- break; //主動跳出while循環(huán)
- //S u1_printf("%d ",timeout); //串口輸出現(xiàn)在的超時時間
- }
- //S u1_printf("\r\n"); //串口輸出信息
- if(timeout<=0)return 1; //如果timeout<=0,說明超時時間到了,也沒能收到CONNECT,返回1
- else return 0; //反之,表示正確,說明收到CONNECT,通過break主動跳出while
- }
- /*-------------------------------------------------*/
- /*函數(shù)名:同服務(wù)器斷開TCP連接 */
- /*參 數(shù):timeout:超時時間(1s的倍數(shù)) */
- /*返回值:0:正確 其他:錯誤 */
- /*-------------------------------------------------*/
- char SIM800C_TCPClose(int timeout)
- {
- SIM800C_RxCounter=0; //800C接收數(shù)據(jù)量變量清零
- memset(SIM800C_RX_BUF,0,SIM800C_RXBUFF_SIZE); //清空800C接收緩沖區(qū)
- SIM800C_printf("AT+CIPCLOSE\r\n"); //發(fā)送指令,斷開連接
- while(timeout--){ //等待超時時間到0
- Delay_Ms(1000); //延時1s
- if(strstr(SIM800C_RX_BUF,"CLOSE OK")) //如果接收到CLOSE OK表示連接成功
- break; //主動跳出while循環(huán)
- u1_printf("%d ",timeout); //串口輸出現(xiàn)在的超時時間
- }
- u1_printf("\r\n"); //串口輸出信息
- if(timeout<=0)return 1; //如果timeout<=0,說明超時時間到了,也沒能收到CLOSE OK,返回1
- else return 0; //反之,表示正確,說明收到CLOSE OK,通過break主動跳出while
- }
- /*-------------------------------------------------*/
- /*函數(shù)名:800C連接物聯(lián)網(wǎng)云服務(wù)器 */
- /*參 數(shù):data:數(shù)據(jù) */
- /*返回值:無 */
- /*-------------------------------------------------*/
- char SIM800C_Connect_IoTServer(void)
- {
- char i; //定義一個變量,用于for循環(huán)
-
- SIM800C_GPIO_Init(); //控制800C的IO初始化
- if(SIM800C_Power()){ //控制800C開機或重啟,如果返回1,說明開機重啟失敗,準(zhǔn)備重啟
- return 1; //返回1
- }
- u1_printf("請等待注冊上網(wǎng)絡(luò)... ...\r\n"); //串口輸出信息
- if(SIM800C_CREG(30)){ //等待注冊上網(wǎng)絡(luò),超時單位1s,超時時間30s
- u1_printf("注冊網(wǎng)絡(luò)超時,準(zhǔn)備重啟\r\n"); //串口輸出信息
- return 2; //返回2
- }else u1_printf("注冊上網(wǎng)絡(luò)\r\n"); //串口輸出信息
-
- if(SIM800C_CSQ(60)){ //查詢信號強度,超時單位100ms,超時時間6s
- u1_printf("查詢信號強度超時,準(zhǔn)備重啟\r\n"); //串口輸出信息
- return 3; //返回3
- }
-
- u1_printf("請等待附著上GPRS... ...\r\n"); //串口輸出信息
- if(SIM800C_CGATT(30)){ //查詢附著GPRS,超時單位1s,超時時間30s
- u1_printf("查詢附著GPRS超時,準(zhǔn)備重啟\r\n"); //串口輸出信息
- return 4; //返回4
- }else u1_printf("附著上GPRS\r\n"); //串口輸出信息
-
- u1_printf("請等待設(shè)置單鏈接... ...\r\n"); //串口輸出信息
- if(SIM800C_SendCmd("AT+CIPMUX=0",60)){ //設(shè)置單鏈接模式,超時單位100ms,超時時間6s
- u1_printf("設(shè)置單鏈接失敗,準(zhǔn)備重啟\r\n"); //串口輸出信息
- return 5; //返回5
- }else u1_printf("設(shè)置單鏈接模式成功\r\n"); //串口輸出信息
- u1_printf("請等待設(shè)置透傳... ...\r\n"); //串口輸出信息
- if(SIM800C_SendCmd("AT+CIPMODE=1",60)){ //設(shè)置透傳模式,超時單位100ms,超時時間6s
- u1_printf("設(shè)置透傳失敗,準(zhǔn)備重啟\r\n"); //串口輸出信息
- return 6; //返回6
- }else u1_printf("設(shè)置透傳成功\r\n"); //串口輸出信息
-
- if(SIM800C_ActivateNetwork()){ //準(zhǔn)備激活網(wǎng)絡(luò)
- u1_printf("激活網(wǎng)絡(luò)失敗,準(zhǔn)備重啟\r\n"); //串口輸出信息
- return 7; //返回7
- }
- Delay_Ms(500); //適當(dāng)延時
- for(i=0;i<3;i++) //重試3次
- {
- u1_printf("請等待連接上服務(wù)器... ...\r\n"); //串口輸出信息
- if(SIM800C_TCPConnect(10)){ //同服務(wù)器建立TCP連接,超時單位1s,超時時間10s
- u1_printf("連接失敗,準(zhǔn)備再次連接\r\n"); //串口輸出信息
- Delay_Ms(500); //適當(dāng)延時
- if(SIM800C_TCPClose(10)){ //準(zhǔn)備再次連接前要先發(fā)送關(guān)閉指令,超時單位1s,超時時間10s
- u1_printf("連接異常,準(zhǔn)備重啟\r\n"); //串口輸出信息
- Delay_Ms(500); //適當(dāng)延時
- return 8; //返回7
- }
- }else return 0; //正確,返回0
- }
- u1_printf("連接不上服務(wù)器,準(zhǔn)備重啟\r\n"); //串口輸出信息
- return 9; //返回9
- }
復(fù)制代碼
所有代碼51hei提供下載:
SIM800C.7z
(224.23 KB, 下載次數(shù): 60)
2021-3-25 16:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|