單片機使用STC15W4K58S4 晶振使用22.1184M
SIM800C連接到單片機串口2
P10 串口2 RX
P11 串口1 TX
串口1連接語音識別
P30 RX
P31 TX
P17 藍色燈
P16 綠色燈
P15 紅色燈
P14 繼電器
以上繼電器以及LED燈全部為高電平觸發
P01 觸摸模塊
P02 聲音檢測(聲控開關)
P03 測溫模塊18B20
程序的注解我只做了 “單片機源碼 測溫版本” 這一個程序 這個程序是通用的 不需要測溫 直接注解就可以
使用SIM8000C 與 LD3320 語音識別 單片機使用stc15w4k58s4單片機實現網絡控制 以及語音控制 另外使用18b20 測溫 使用手機可以檢測溫度值 先將程序源碼奉上 有問題可以私我 電話18363353598 qq1506175115 無法上傳全部資料 我就只上傳程序 另外還有視頻 教程 可以私信我
0.png (36.7 KB, 下載次數: 63)
下載附件
2019-2-27 00:12 上傳
單片機源程序如下:
- #include "string.h"
- #include "delay.h"
- #include "uart.h"
- #include "intrins.h"
- #define Buf1_Max 60 //串口1緩存長度
- #define Buf2_Max 200 //串口2緩存長度
- /************* 本地常量聲明 **************/
- const u8 *string = "AT+CIPSTART=\"TCP\",\"121.42.182.188\",8080"; //IP登錄服務器
- sbit RUNING_LED = P2^1; //運行指示燈
- sbit LED = P1^6; //控制指示燈
- /************* 本地變量聲明 **************/
- xdata u8 Uart1_Buf[Buf1_Max];
- xdata u8 Uart2_Buf[Buf2_Max];
- u8 Times=0,First_Int = 0,shijian=0;
- u16 Heartbeat=0;
- unsigned char ccc[]={"123"};
- ////u8 Time_count=0;
- ////bdata u8 Flag;//定時器標志位
- //sbit Timer0_start =Flag^0; //定時器0延時啟動計數器
- //sbit Heart_beat =Flag^1; //發送心跳幀標志位
- bit Timer0_start;
- bit Heart_beat;
- bit user;
- /************* 本地函數聲明 **************/
- void GPIO_config(void);
- void Timer0Init(void);
- void CLR_Buf2(void);
- u8 Find(u8 *a);
- void Second_AT_Command(u8 *b,u8 *a,u8 wait_time);
- void Set_ATE0(void);
- void Connect_Server(void);
- void Rec_Server_Data(void);
- void Wait_CREG(void);
- void Send_OK(void);
- void Send_shuju(u8 *b);
- /************* 外部函數和變量聲明*****************/
- /*******************************************************************************
- * 函數名 : main
- * 描述 : 主函數
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 : 串口2負責與GPRS模塊通信,串口1用于串口調試,可以避免在下載程序時數據
- 還發送到模塊
- *******************************************************************************/
- void main(void)
- { P1M0=0XE0;
- P1M1=0X00;
- P17=0;
- P16=0;
- P15=0;
- GPIO_config();
- Uart1Init();
- Uart2Init();
- Timer0Init();
- EA=1; //開總中斷
- UART1_SendString("GPRS模塊GPRS測試程序\r\n");
- UART1_SendString("GPRS模塊在注冊網絡\r\n");
- Wait_CREG();
- UART1_SendString("GPRS模塊注冊成功\r\n");
- UART1_SendString("GPRS模塊開始連接服務器\r\n");
- Set_ATE0(); //設置回顯
- Connect_Server(); //設置GSM工作在網絡連接 并連接到ip
- Send_OK(); // 連接到賽靈網站
- UART1_SendString("連接成功\r\n");
- while(1)
- {
- Rec_Server_Data();
- if(Heart_beat==1)
- {
- Send_shuju("zzo");
- Heart_beat=0;
- }
-
- if(P24==0||user==1)
- {
- Send_shuju("ok");
- user=0;
- while(!P24);
- }
- }
- }
- /*******************************************************************************
- * 函數名 : Uart1
- * 描述 : 串口1中斷服務入口函數
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Uart1() interrupt 4
- {
- if (RI)
- {
- RI = 0; //清除RI位
- }
- if (TI)
- {
- TI = 0; //清除TI位
- }
- }
- /*******************************************************************************
- * 函數名 : Uart2
- * 描述 : 串口2中斷服務入口函數
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Uart2() interrupt 8
- {
- IE2 &= ~0x01; //關閉串口2中斷
- if (S2CON & S2RI)
- {
- S2CON &= ~S2RI; //清除S2RI位
- Uart2_Buf[First_Int] = S2BUF; //將接收到的字符串存到緩存中
- First_Int++; //緩存指針向后移動
- if(First_Int > Buf2_Max) //如果緩存滿,將緩存指針指向緩存的首地址
- {
- First_Int = 0;
- }
- }
- if (S2CON & S2TI)
- {
- S2CON &= ~S2TI; //清除S2TI位
- }
- IE2 |= 0x01; //使能串口2中斷
- }
- /*******************************************************************************
- * 函數名 : Timer0_ISR
- * 描述 : 定時器0中斷服務入口函數,20ms中斷一次
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Timer0_ISR() interrupt 1
- {
- TR0=0;//關定時器
- Heartbeat++;
- if(Heartbeat>500)//每10秒發送心跳幀
- {
- Heartbeat=0;
- Heart_beat=1;
- }
- if(Timer0_start)
- Times++;
- if(Times > (50*shijian))
- {
- Timer0_start = 0;
- Times = 0;
- }
- TR0=1;//開定時器
- }
- /*******************************************************************************
- * 函數名 : GPIO_config
- * 描述 : IO口配置函數
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void GPIO_config(void)
- {
- P3M1 &= 0XC3; //配置P32~P35為推挽輸出
- P3M0 |= ~0XC3;
- LED=0;
- RUNING_LED=0;
- }
- /*******************************************************************************
- * 函數名 : Timer0Init
- * 描述 : 定時器0初始化函數
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Timer0Init(void) //20毫秒@22.1184MHz
- {
- AUXR &= 0x7F; //12T模式
- TMOD &= 0xF0; //設置定時器模式 16位重載
- TL0 = 0x00; //設定定時器初值
- TH0 = 0x70; //設定定時器初值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- ET0 = 1; //使能定時器0中斷
- }
- /******
- /*******************************************************************************
- * 函數名 : CLR_Buf2
- * 描述 : 清除串口2緩存數據
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void CLR_Buf2(void)
- {
- u16 k;
- for(k=0;k<Buf2_Max;k++) //將緩存內容清零
- {
- Uart2_Buf[k] = 0x00;
- }
- First_Int = 0; //接收字符串的起始存儲位置
- }
- /*******************************************************************************
- * 函數名 : Wait_CREG
- * 描述 : 等待模塊注冊成功
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Wait_CREG(void)
- {
- u8 i;
- u8 k;
- i = 0;
- CLR_Buf2();
- while(i == 0)
- {
- CLR_Buf2();
- UART2_SendString("AT+CREG?");
- UART2_SendLR();
- delay_ms(5000);
- for(k=0;k<Buf2_Max;k++)
- {
- if(Uart2_Buf[k] == ':')
- {
- if((Uart2_Buf[k+4] == '1')||(Uart2_Buf[k+4] == '5')) //說模塊注冊成功
- {
- i = 1;
- break;
- }
- }
- }
- UART1_SendString("注冊中.....");
- }
- }
- /*******************************************************************************
- * 函數名 : Find
- * 描述 : 判斷緩存中是否含有指定的字符串
- * 輸入 :
- * 輸出 :
- * 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
- * 注意 :
- *******************************************************************************/
- u8 Find(u8 *a)
- {
- if(strstr(Uart2_Buf,a)!=NULL)
- return 1;
- else
- return 0;
- }
- /*******************************************************************************
- * 函數名 : Second_AT_Command
- * 描述 : 發送AT指令函數
- * 輸入 : 發送數據的指針、發送等待時間(單位:S)
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Second_AT_Command(u8 *b,u8 *a,u8 wait_time)
- {
- u8 i;
- u8 *c;
- c = b;
- //保存字符串地址到c
- CLR_Buf2();
- i = 0;
- while(i == 0)
- {
- if(!Find(a))
- {
- if(Timer0_start == 0)
- {
- b = c; //將字符串地址給b
- for (b; *b!='\0';b++)
- {
- UART2_SendData(*b);
- }
- UART2_SendLR();
- Times = 0;
- shijian = wait_time;
- Timer0_start = 1;
- }
- }
- else
- {
- i = 1;
- Timer0_start = 0;
- }
- }
- CLR_Buf2();
- }
- /*******************************************************************************
- * 函數名 : Set_ATE0
- * 描述 : 取消回顯
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Set_ATE0(void)
- {
- Second_AT_Command("ATE0","OK",3); //取消回顯
- }
- /*******************************************************************************
- * 函數名 : Connect_Server
- * 描述 : GPRS連接服務器函數
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Connect_Server(void)
- {
- UART2_SendString("AT+CIPCLOSE=1"); //關閉連接
- Second_AT_Command("AT+CIPSHUT","SHUT OK",2); //關閉移動場景
- Second_AT_Command("AT+CGCLASS=\"B\"","OK",2);//設置GPRS移動臺類別為B,支持包交換和數據交換
- Second_AT_Command("AT+CGDCONT=1,\"IP\",\"CMNET\"","OK",2);//設置PDP上下文,互聯網接協議,接入點等信息
- Second_AT_Command("AT+CGATT=1","OK",2);//附著GPRS業務
- Second_AT_Command("AT+CIPCSGP=1,\"CMNET\"","OK",2);//設置為GPRS連接模式
- Second_AT_Command("AT+CIPHEAD=1","OK",2);//設置接收數據顯示IP頭(方便判斷數據來源,僅在單路連接有效)
- Second_AT_Command(string,"OK",5);
- delay_ms(100);
- CLR_Buf2();
- }
- /*******************************************************************************
- * 函數名 : Rec_Server_Data
- * 描述 : 接收服務器數據函數
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Rec_Server_Data(void)
- {
- if(strstr(Uart2_Buf,"+IPD")!=NULL) //若緩存字符串中含有+IPD
- {
- Heartbeat=0; //清除心跳幀計數器
- Heart_beat=0;
- delay_ms(100);
- if(strstr(Uart2_Buf,"oneled1")!=NULL)
- {
- P17 = ~P17;
- Send_shuju("zlany");
- }
- else if(strstr(Uart2_Buf,"oneled2")!=NULL)
- {
- P16=~P16;
- Send_shuju("zlvy");
- }
- else if(strstr(Uart2_Buf,"oneled3")!=NULL)
- {
- P15=~P15;
- Send_shuju("zhongy");
- }
-
- else if(strstr(Uart2_Buf,"oneled4")!=NULL)
- {
- P15=P16=P17=1;
- Send_shuju("zkaiy");
- }
- else if(strstr(Uart2_Buf,"offled")!=NULL)
- {
- P15=P16=P17=0;
- Send_shuju("zguany");
- }
- UART1_SendString("收到新信息:\r\n");
- UART1_SendLR();
- UART1_SendString(Uart2_Buf);
- CLR_Buf2();
-
- }
- }
- /*******************************************************************************
- * 函數名 : Send_OK
- * 描述 : 發送數據應答服務器的指令,該函數在有兩功能
- 1:接收到服務器的數據后,應答服務器
- 2:服務器無下發數據時,每隔10秒發送一幀心跳,保持與服務器連接
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Send_OK(void)
- {
- Second_AT_Command("AT+CIPSEND",">",2);
- UART2_SendString("{");
- UART2_SendString("\"LINK\":\"t2c\",\"ISTR\":\"log\",\"TID\":\"aCQZkMidVPXioM1Q\",\"PWD\":\"991004ssd\"}\r\n");
- UART2_SendString("\32\0"); //發送短信內容
- }
- //向遠程服務器數據函數
- void Send_shuju(u8 *b)
- {
- Second_AT_Command("AT+CIPSEND",">",2);
- UART2_SendString("{");
- UART2_SendString("\"LINK\":\"t2t\",\"ISTR\":\"tt\",\"MSG\":\""); //將數據發送到遠程端設備
- for (b; *b!='\0';b++)
- {
- UART2_SendData(*b);
- }
- UART2_SendString("\"}\r\n"); //將數據發送到遠程端設備
- UART2_SendString("\32\0"); //發送短信內容
- }
復制代碼
所有資料51hei提供下載:
SIM800C通信.7z
(2.34 MB, 下載次數: 22)
2019-2-27 00:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|