標題:
stm32+SIM800C單片機主控制器程序 鏈接阿里云項目分享
[打印本頁]
作者:
james79
時間:
2021-3-25 10:49
標題:
stm32+SIM800C單片機主控制器程序 鏈接阿里云項目分享
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; //準備設(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; //準備設(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),準備開機\r\n"); //串口輸出信息
POWER_KEY(1); //先拉高PC0
Delay_Ms(1500); //延時
POWER_KEY(0); //再拉低PC0,開機
}else{ //反之PC1是高電平,表示目前處于開機狀態(tài)
u1_printf("\r\n目前處于開機狀態(tài),準備重啟\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,說明開機重啟失敗,準備重啟
return 1; //返回1
}
u1_printf("請等待注冊上網(wǎng)絡(luò)... ...\r\n"); //串口輸出信息
if(SIM800C_CREG(30)){ //等待注冊上網(wǎng)絡(luò),超時單位1s,超時時間30s
u1_printf("注冊網(wǎng)絡(luò)超時,準備重啟\r\n"); //串口輸出信息
return 2; //返回2
}else u1_printf("注冊上網(wǎng)絡(luò)\r\n"); //串口輸出信息
if(SIM800C_CSQ(60)){ //查詢信號強度,超時單位100ms,超時時間6s
u1_printf("查詢信號強度超時,準備重啟\r\n"); //串口輸出信息
return 3; //返回3
}
u1_printf("請等待附著上GPRS... ...\r\n"); //串口輸出信息
if(SIM800C_CGATT(30)){ //查詢附著GPRS,超時單位1s,超時時間30s
u1_printf("查詢附著GPRS超時,準備重啟\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è)置單鏈接失敗,準備重啟\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è)置透傳失敗,準備重啟\r\n"); //串口輸出信息
return 6; //返回6
}else u1_printf("設(shè)置透傳成功\r\n"); //串口輸出信息
if(SIM800C_ActivateNetwork()){ //準備激活網(wǎng)絡(luò)
u1_printf("激活網(wǎng)絡(luò)失敗,準備重啟\r\n"); //串口輸出信息
return 7; //返回7
}
Delay_Ms(500); //適當延時
for(i=0;i<3;i++) //重試3次
{
u1_printf("請等待連接上服務(wù)器... ...\r\n"); //串口輸出信息
if(SIM800C_TCPConnect(10)){ //同服務(wù)器建立TCP連接,超時單位1s,超時時間10s
u1_printf("連接失敗,準備再次連接\r\n"); //串口輸出信息
Delay_Ms(500); //適當延時
if(SIM800C_TCPClose(10)){ //準備再次連接前要先發(fā)送關(guān)閉指令,超時單位1s,超時時間10s
u1_printf("連接異常,準備重啟\r\n"); //串口輸出信息
Delay_Ms(500); //適當延時
return 8; //返回7
}
}else return 0; //正確,返回0
}
u1_printf("連接不上服務(wù)器,準備重啟\r\n"); //串口輸出信息
return 9; //返回9
}
復制代碼
所有代碼51hei提供下載:
SIM800C.7z
(224.23 KB, 下載次數(shù): 60)
2021-3-25 16:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
51hei團團
時間:
2021-3-25 16:54
好東東 可惜沒有原理圖PCB文件,樓主能回帖分享一下嗎?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1