找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

SIM800c與手機(jī)通信 另使用ld3320芯片 智能家具程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
單片機(jī)使用STC15W4K58S4  晶振使用22.1184M
SIM800C連接到單片機(jī)串口2
P10  串口2 RX
P11  串口1 TX
串口1連接語(yǔ)音識(shí)別
P30  RX
P31  TX

P17  藍(lán)色燈
P16  綠色燈
P15  紅色燈
P14  繼電器
以上繼電器以及LED燈全部為高電平觸發(fā)
P01  觸摸模塊
P02  聲音檢測(cè)(聲控開(kāi)關(guān))
P03  測(cè)溫模塊18B20
   

程序的注解我只做了  “單片機(jī)源碼  測(cè)溫版本”   這一個(gè)程序 這個(gè)程序是通用的  不需要測(cè)溫 直接注解就可以

使用SIM8000C 與 LD3320 語(yǔ)音識(shí)別 單片機(jī)使用stc15w4k58s4單片機(jī)實(shí)現(xiàn)網(wǎng)絡(luò)控制 以及語(yǔ)音控制  另外使用18b20 測(cè)溫  使用手機(jī)可以檢測(cè)溫度值  先將程序源碼奉上    有問(wèn)題可以私我  電話(huà)18363353598  qq1506175115   無(wú)法上傳全部資料 我就只上傳程序   另外還有視頻  教程 可以私信我



單片機(jī)源程序如下:
  1. #include "string.h"
  2. #include "delay.h"
  3. #include "uart.h"
  4. #include "intrins.h"

  5. #define Buf1_Max 60                                           //串口1緩存長(zhǎng)度
  6. #define Buf2_Max 200                                           //串口2緩存長(zhǎng)度
  7. /*************        本地常量聲明        **************/

  8. const u8 *string = "AT+CIPSTART=\"TCP\",\"121.42.182.188\",8080";        //IP登錄服務(wù)器
  9. sbit RUNING_LED = P2^1;                                        //運(yùn)行指示燈
  10. sbit LED                          = P1^6;                                        //控制指示燈



  11. /*************  本地變量聲明        **************/
  12. xdata u8 Uart1_Buf[Buf1_Max];
  13. xdata u8 Uart2_Buf[Buf2_Max];

  14. u8 Times=0,First_Int = 0,shijian=0;
  15. u16 Heartbeat=0;
  16. unsigned char ccc[]={"123"};
  17. ////u8 Time_count=0;
  18. ////bdata u8 Flag;//定時(shí)器標(biāo)志位
  19. //sbit Timer0_start =Flag^0;        //定時(shí)器0延時(shí)啟動(dòng)計(jì)數(shù)器
  20. //sbit Heart_beat                =Flag^1;        //發(fā)送心跳幀標(biāo)志位
  21. bit Timer0_start;
  22. bit Heart_beat;
  23. bit user;
  24. /*************        本地函數(shù)聲明        **************/
  25. void GPIO_config(void);
  26. void Timer0Init(void);
  27. void CLR_Buf2(void);
  28. u8 Find(u8 *a);
  29. void Second_AT_Command(u8 *b,u8 *a,u8 wait_time);
  30. void Set_ATE0(void);
  31. void Connect_Server(void);
  32. void Rec_Server_Data(void);
  33. void Wait_CREG(void);
  34. void Send_OK(void);
  35. void Send_shuju(u8 *b);
  36. /*************  外部函數(shù)和變量聲明*****************/




  37. /*******************************************************************************
  38. * 函數(shù)名 : main
  39. * 描述   : 主函數(shù)
  40. * 輸入   :
  41. * 輸出   :
  42. * 返回   :
  43. * 注意   : 串口2負(fù)責(zé)與GPRS模塊通信,串口1用于串口調(diào)試,可以避免在下載程序時(shí)數(shù)據(jù)
  44.                                          還發(fā)送到模塊
  45. *******************************************************************************/
  46. void main(void)
  47. {         P1M0=0XE0;
  48. P1M1=0X00;
  49. P17=0;
  50. P16=0;
  51. P15=0;
  52.         GPIO_config();
  53.         Uart1Init();
  54.         Uart2Init();
  55.         Timer0Init();
  56.         EA=1;        //開(kāi)總中斷
  57.         UART1_SendString("GPRS模塊GPRS測(cè)試程序\r\n");
  58.         UART1_SendString("GPRS模塊在注冊(cè)網(wǎng)絡(luò)\r\n");
  59.         Wait_CREG();
  60.         UART1_SendString("GPRS模塊注冊(cè)成功\r\n");
  61.         UART1_SendString("GPRS模塊開(kāi)始連接服務(wù)器\r\n");
  62.         Set_ATE0();                 //設(shè)置回顯
  63.         Connect_Server();        //設(shè)置GSM工作在網(wǎng)絡(luò)連接 并連接到ip
  64.         Send_OK();                // 連接到賽靈網(wǎng)站
  65.         UART1_SendString("連接成功\r\n");
  66.         while(1)
  67.         {
  68.                 Rec_Server_Data();
  69.                 if(Heart_beat==1)
  70.                 {               
  71.                         Send_shuju("zzo");
  72.                         Heart_beat=0;
  73.                 }       
  74.                
  75.                 if(P24==0||user==1)
  76.                 {
  77.                 Send_shuju("ok");
  78.                 user=0;
  79.                 while(!P24);
  80.                 }               


  81.         }
  82. }

  83. /*******************************************************************************
  84. * 函數(shù)名 : Uart1
  85. * 描述   : 串口1中斷服務(wù)入口函數(shù)
  86. * 輸入   :
  87. * 輸出   :
  88. * 返回   :
  89. * 注意   :
  90. *******************************************************************************/
  91. void Uart1() interrupt 4
  92. {
  93.     if (RI)
  94.     {
  95.         RI = 0;                 //清除RI位
  96.     }
  97.     if (TI)
  98.     {
  99.         TI = 0;                 //清除TI位
  100.     }
  101. }

  102. /*******************************************************************************
  103. * 函數(shù)名 : Uart2
  104. * 描述   : 串口2中斷服務(wù)入口函數(shù)
  105. * 輸入   :
  106. * 輸出   :
  107. * 返回   :
  108. * 注意   :
  109. *******************************************************************************/
  110. void Uart2() interrupt 8
  111. {
  112.                 IE2  &= ~0x01;   //關(guān)閉串口2中斷
  113.     if (S2CON & S2RI)
  114.     {
  115.       S2CON &= ~S2RI;         //清除S2RI位
  116.                         Uart2_Buf[First_Int] = S2BUF;            //將接收到的字符串存到緩存中
  117.                         First_Int++;                                        //緩存指針向后移動(dòng)
  118.                         if(First_Int > Buf2_Max)                       //如果緩存滿(mǎn),將緩存指針指向緩存的首地址
  119.                         {
  120.                                 First_Int = 0;
  121.                         }
  122.     }
  123.     if (S2CON & S2TI)
  124.     {
  125.       S2CON &= ~S2TI;         //清除S2TI位
  126.     }
  127.                 IE2  |= 0x01;   //使能串口2中斷
  128. }
  129. /*******************************************************************************
  130. * 函數(shù)名 : Timer0_ISR
  131. * 描述   : 定時(shí)器0中斷服務(wù)入口函數(shù),20ms中斷一次
  132. * 輸入   :
  133. * 輸出   :
  134. * 返回   :
  135. * 注意   :
  136. *******************************************************************************/
  137. void Timer0_ISR() interrupt 1
  138. {
  139.         TR0=0;//關(guān)定時(shí)器
  140.         Heartbeat++;
  141.         if(Heartbeat>500)//每10秒發(fā)送心跳幀
  142.         {
  143.                 Heartbeat=0;
  144.                 Heart_beat=1;
  145.         }
  146.         if(Timer0_start)
  147.         Times++;
  148.         if(Times > (50*shijian))
  149.         {
  150.                 Timer0_start = 0;
  151.                 Times = 0;
  152.         }
  153.         TR0=1;//開(kāi)定時(shí)器
  154. }
  155. /*******************************************************************************
  156. * 函數(shù)名 : GPIO_config
  157. * 描述   : IO口配置函數(shù)
  158. * 輸入   :
  159. * 輸出   :
  160. * 返回   :
  161. * 注意   :
  162. *******************************************************************************/
  163. void        GPIO_config(void)
  164. {
  165.                 P3M1 &= 0XC3;  //配置P32~P35為推挽輸出
  166.                 P3M0 |=        ~0XC3;
  167.                 LED=0;
  168.                 RUNING_LED=0;
  169. }
  170. /*******************************************************************************
  171. * 函數(shù)名 : Timer0Init
  172. * 描述   : 定時(shí)器0初始化函數(shù)
  173. * 輸入   :
  174. * 輸出   :
  175. * 返回   :
  176. * 注意   :
  177. *******************************************************************************/
  178. void Timer0Init(void)                //20毫秒@22.1184MHz
  179. {
  180.         AUXR &= 0x7F;        //12T模式
  181.         TMOD &= 0xF0;        //設(shè)置定時(shí)器模式 16位重載
  182.         TL0 = 0x00;                //設(shè)定定時(shí)器初值
  183.         TH0 = 0x70;                //設(shè)定定時(shí)器初值
  184.         TF0 = 0;                        //清除TF0標(biāo)志
  185.         TR0 = 1;                        //定時(shí)器0開(kāi)始計(jì)時(shí)
  186.         ET0 = 1;            //使能定時(shí)器0中斷
  187. }
  188. /******
  189. /*******************************************************************************
  190. * 函數(shù)名 : CLR_Buf2
  191. * 描述   : 清除串口2緩存數(shù)據(jù)
  192. * 輸入   :
  193. * 輸出   :
  194. * 返回   :
  195. * 注意   :
  196. *******************************************************************************/
  197. void CLR_Buf2(void)
  198. {
  199.         u16 k;
  200.         for(k=0;k<Buf2_Max;k++)      //將緩存內(nèi)容清零
  201.         {
  202.                 Uart2_Buf[k] = 0x00;
  203.         }
  204.     First_Int = 0;             //接收字符串的起始存儲(chǔ)位置
  205. }

  206. /*******************************************************************************
  207. * 函數(shù)名 : Wait_CREG
  208. * 描述   : 等待模塊注冊(cè)成功
  209. * 輸入   :
  210. * 輸出   :
  211. * 返回   :
  212. * 注意   :
  213. *******************************************************************************/
  214. void Wait_CREG(void)
  215. {
  216.         u8 i;
  217.         u8 k;
  218.         i = 0;
  219.         CLR_Buf2();
  220.   while(i == 0)                               
  221.         {
  222.                 CLR_Buf2();        
  223.                 UART2_SendString("AT+CREG?");
  224.                 UART2_SendLR();
  225.                 delay_ms(5000);                                                 
  226.             for(k=0;k<Buf2_Max;k++)                             
  227.             {
  228.                         if(Uart2_Buf[k] == ':')
  229.                         {
  230.                                 if((Uart2_Buf[k+4] == '1')||(Uart2_Buf[k+4] == '5'))  //說(shuō)模塊注冊(cè)成功
  231.                                 {
  232.                                         i = 1;
  233.                                   break;
  234.                                 }
  235.                         }
  236.                 }
  237.                                 UART1_SendString("注冊(cè)中.....");
  238.         }

  239. }

  240. /*******************************************************************************
  241. * 函數(shù)名 : Find
  242. * 描述   : 判斷緩存中是否含有指定的字符串
  243. * 輸入   :
  244. * 輸出   :
  245. * 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
  246. * 注意   :
  247. *******************************************************************************/

  248. u8 Find(u8 *a)
  249. {
  250.   if(strstr(Uart2_Buf,a)!=NULL)
  251.             return 1;
  252.         else
  253.                         return 0;
  254. }

  255. /*******************************************************************************
  256. * 函數(shù)名 : Second_AT_Command
  257. * 描述   : 發(fā)送AT指令函數(shù)
  258. * 輸入   : 發(fā)送數(shù)據(jù)的指針、發(fā)送等待時(shí)間(單位:S)
  259. * 輸出   :
  260. * 返回   :
  261. * 注意   :
  262. *******************************************************************************/

  263. void Second_AT_Command(u8 *b,u8 *a,u8 wait_time)         
  264. {
  265.         u8 i;
  266.         u8 *c;
  267.         c = b;       
  268.                                                                         //保存字符串地址到c
  269.         CLR_Buf2();
  270.   i = 0;
  271.         while(i == 0)                    
  272.         {
  273.                 if(!Find(a))
  274.                 {
  275.                         if(Timer0_start == 0)
  276.                         {
  277.                                 b = c;                                                        //將字符串地址給b
  278.                                 for (b; *b!='\0';b++)
  279.                                 {
  280.                                         UART2_SendData(*b);
  281.                                 }
  282.                                 UART2_SendLR();       
  283.                                 Times = 0;
  284.                                 shijian = wait_time;
  285.                                 Timer0_start = 1;
  286.                    }
  287.     }
  288.           else
  289.                 {
  290.                         i = 1;
  291.                         Timer0_start = 0;
  292.                 }
  293.         }
  294.         CLR_Buf2();
  295. }

  296. /*******************************************************************************
  297. * 函數(shù)名 : Set_ATE0
  298. * 描述   : 取消回顯
  299. * 輸入   :
  300. * 輸出   :
  301. * 返回   :
  302. * 注意   :
  303. *******************************************************************************/
  304. void Set_ATE0(void)
  305. {
  306.         Second_AT_Command("ATE0","OK",3);                                                                //取消回顯               
  307. }
  308. /*******************************************************************************
  309. * 函數(shù)名 : Connect_Server
  310. * 描述   : GPRS連接服務(wù)器函數(shù)
  311. * 輸入   :
  312. * 輸出   :
  313. * 返回   :
  314. * 注意   :
  315. *******************************************************************************/
  316. void Connect_Server(void)
  317. {
  318.         UART2_SendString("AT+CIPCLOSE=1");        //關(guān)閉連接
  319.         Second_AT_Command("AT+CIPSHUT","SHUT OK",2);                //關(guān)閉移動(dòng)場(chǎng)景

  320.         Second_AT_Command("AT+CGCLASS=\"B\"","OK",2);//設(shè)置GPRS移動(dòng)臺(tái)類(lèi)別為B,支持包交換和數(shù)據(jù)交換
  321.         Second_AT_Command("AT+CGDCONT=1,\"IP\",\"CMNET\"","OK",2);//設(shè)置PDP上下文,互聯(lián)網(wǎng)接協(xié)議,接入點(diǎn)等信息
  322.         Second_AT_Command("AT+CGATT=1","OK",2);//附著GPRS業(yè)務(wù)
  323.         Second_AT_Command("AT+CIPCSGP=1,\"CMNET\"","OK",2);//設(shè)置為GPRS連接模式
  324.         Second_AT_Command("AT+CIPHEAD=1","OK",2);//設(shè)置接收數(shù)據(jù)顯示IP頭(方便判斷數(shù)據(jù)來(lái)源,僅在單路連接有效)
  325.         Second_AT_Command(string,"OK",5);
  326.         delay_ms(100);
  327.         CLR_Buf2();
  328. }
  329. /*******************************************************************************
  330. * 函數(shù)名 : Rec_Server_Data
  331. * 描述   : 接收服務(wù)器數(shù)據(jù)函數(shù)
  332. * 輸入   :
  333. * 輸出   :
  334. * 返回   :
  335. * 注意   :
  336. *******************************************************************************/
  337. void Rec_Server_Data(void)
  338. {
  339.         if(strstr(Uart2_Buf,"+IPD")!=NULL)                   //若緩存字符串中含有+IPD
  340.         {       
  341.                 Heartbeat=0;        //清除心跳幀計(jì)數(shù)器
  342.                 Heart_beat=0;
  343.                 delay_ms(100);
  344.                 if(strstr(Uart2_Buf,"oneled1")!=NULL)
  345.                 {
  346.                         P17 = ~P17;
  347.                         Send_shuju("zlany");
  348.                 }
  349.                 else if(strstr(Uart2_Buf,"oneled2")!=NULL)
  350.                 {
  351.                         P16=~P16;  
  352.                         Send_shuju("zlvy");

  353.                 }
  354.                         else if(strstr(Uart2_Buf,"oneled3")!=NULL)
  355.                 {
  356.                         P15=~P15;
  357.                         Send_shuju("zhongy");
  358.                 }
  359.                
  360.                         else if(strstr(Uart2_Buf,"oneled4")!=NULL)
  361.                 {
  362.                         P15=P16=P17=1;
  363.                         Send_shuju("zkaiy");
  364.                 }
  365.                         else if(strstr(Uart2_Buf,"offled")!=NULL)
  366.                 {
  367.                         P15=P16=P17=0;
  368.                         Send_shuju("zguany");
  369.                 }
  370.                 UART1_SendString("收到新信息:\r\n");
  371.                 UART1_SendLR();
  372.                 UART1_SendString(Uart2_Buf);                
  373.                 CLR_Buf2();
  374.        
  375.         }
  376. }
  377. /*******************************************************************************
  378. * 函數(shù)名 : Send_OK
  379. * 描述   : 發(fā)送數(shù)據(jù)應(yīng)答服務(wù)器的指令,該函數(shù)在有兩功能
  380.                                         1:接收到服務(wù)器的數(shù)據(jù)后,應(yīng)答服務(wù)器
  381.                                         2:服務(wù)器無(wú)下發(fā)數(shù)據(jù)時(shí),每隔10秒發(fā)送一幀心跳,保持與服務(wù)器連接
  382. * 輸入   :
  383. * 輸出   :
  384. * 返回   :
  385. * 注意   :
  386. *******************************************************************************/
  387. void Send_OK(void)
  388. {
  389.         Second_AT_Command("AT+CIPSEND",">",2);
  390.         UART2_SendString("{");
  391.         UART2_SendString("\"LINK\":\"t2c\",\"ISTR\":\"log\",\"TID\":\"aCQZkMidVPXioM1Q\",\"PWD\":\"991004ssd\"}\r\n");
  392.         UART2_SendString("\32\0");     //發(fā)送短信內(nèi)容
  393. }
  394. //向遠(yuǎn)程服務(wù)器數(shù)據(jù)函數(shù)
  395. void Send_shuju(u8 *b)
  396. {

  397.         Second_AT_Command("AT+CIPSEND",">",2);
  398.         UART2_SendString("{");
  399.         UART2_SendString("\"LINK\":\"t2t\",\"ISTR\":\"tt\",\"MSG\":\"");                  //將數(shù)據(jù)發(fā)送到遠(yuǎn)程端設(shè)備
  400.         for (b; *b!='\0';b++)
  401.         {
  402.                 UART2_SendData(*b);
  403.         }
  404.         UART2_SendString("\"}\r\n");                  //將數(shù)據(jù)發(fā)送到遠(yuǎn)程端設(shè)備
  405.         UART2_SendString("\32\0");     //發(fā)送短信內(nèi)容
  406. }
復(fù)制代碼

所有資料51hei提供下載:
SIM800C通信.7z (2.34 MB, 下載次數(shù): 22)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表