欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3502|回復: 0
收起左側

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

[復制鏈接]
ID:371965 發表于 2019-2-26 10:45 | 顯示全部樓層 |閱讀模式
單片機使用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

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

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

  8. const u8 *string = "AT+CIPSTART=\"TCP\",\"121.42.182.188\",8080";        //IP登錄服務器
  9. sbit RUNING_LED = P2^1;                                        //運行指示燈
  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;//定時器標志位
  19. //sbit Timer0_start =Flag^0;        //定時器0延時啟動計數器
  20. //sbit Heart_beat                =Flag^1;        //發送心跳幀標志位
  21. bit Timer0_start;
  22. bit Heart_beat;
  23. bit user;
  24. /*************        本地函數聲明        **************/
  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. /*************  外部函數和變量聲明*****************/




  37. /*******************************************************************************
  38. * 函數名 : main
  39. * 描述   : 主函數
  40. * 輸入   :
  41. * 輸出   :
  42. * 返回   :
  43. * 注意   : 串口2負責與GPRS模塊通信,串口1用于串口調試,可以避免在下載程序時數據
  44.                                          還發送到模塊
  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;        //開總中斷
  57.         UART1_SendString("GPRS模塊GPRS測試程序\r\n");
  58.         UART1_SendString("GPRS模塊在注冊網絡\r\n");
  59.         Wait_CREG();
  60.         UART1_SendString("GPRS模塊注冊成功\r\n");
  61.         UART1_SendString("GPRS模塊開始連接服務器\r\n");
  62.         Set_ATE0();                 //設置回顯
  63.         Connect_Server();        //設置GSM工作在網絡連接 并連接到ip
  64.         Send_OK();                // 連接到賽靈網站
  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. * 函數名 : Uart1
  85. * 描述   : 串口1中斷服務入口函數
  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. * 函數名 : Uart2
  104. * 描述   : 串口2中斷服務入口函數
  105. * 輸入   :
  106. * 輸出   :
  107. * 返回   :
  108. * 注意   :
  109. *******************************************************************************/
  110. void Uart2() interrupt 8
  111. {
  112.                 IE2  &= ~0x01;   //關閉串口2中斷
  113.     if (S2CON & S2RI)
  114.     {
  115.       S2CON &= ~S2RI;         //清除S2RI位
  116.                         Uart2_Buf[First_Int] = S2BUF;            //將接收到的字符串存到緩存中
  117.                         First_Int++;                                        //緩存指針向后移動
  118.                         if(First_Int > Buf2_Max)                       //如果緩存滿,將緩存指針指向緩存的首地址
  119.                         {
  120.                                 First_Int = 0;
  121.                         }
  122.     }
  123.     if (S2CON & S2TI)
  124.     {
  125.       S2CON &= ~S2TI;         //清除S2TI位
  126.     }
  127.                 IE2  |= 0x01;   //使能串口2中斷
  128. }
  129. /*******************************************************************************
  130. * 函數名 : Timer0_ISR
  131. * 描述   : 定時器0中斷服務入口函數,20ms中斷一次
  132. * 輸入   :
  133. * 輸出   :
  134. * 返回   :
  135. * 注意   :
  136. *******************************************************************************/
  137. void Timer0_ISR() interrupt 1
  138. {
  139.         TR0=0;//關定時器
  140.         Heartbeat++;
  141.         if(Heartbeat>500)//每10秒發送心跳幀
  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;//開定時器
  154. }
  155. /*******************************************************************************
  156. * 函數名 : GPIO_config
  157. * 描述   : IO口配置函數
  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. * 函數名 : Timer0Init
  172. * 描述   : 定時器0初始化函數
  173. * 輸入   :
  174. * 輸出   :
  175. * 返回   :
  176. * 注意   :
  177. *******************************************************************************/
  178. void Timer0Init(void)                //20毫秒@22.1184MHz
  179. {
  180.         AUXR &= 0x7F;        //12T模式
  181.         TMOD &= 0xF0;        //設置定時器模式 16位重載
  182.         TL0 = 0x00;                //設定定時器初值
  183.         TH0 = 0x70;                //設定定時器初值
  184.         TF0 = 0;                        //清除TF0標志
  185.         TR0 = 1;                        //定時器0開始計時
  186.         ET0 = 1;            //使能定時器0中斷
  187. }
  188. /******
  189. /*******************************************************************************
  190. * 函數名 : CLR_Buf2
  191. * 描述   : 清除串口2緩存數據
  192. * 輸入   :
  193. * 輸出   :
  194. * 返回   :
  195. * 注意   :
  196. *******************************************************************************/
  197. void CLR_Buf2(void)
  198. {
  199.         u16 k;
  200.         for(k=0;k<Buf2_Max;k++)      //將緩存內容清零
  201.         {
  202.                 Uart2_Buf[k] = 0x00;
  203.         }
  204.     First_Int = 0;             //接收字符串的起始存儲位置
  205. }

  206. /*******************************************************************************
  207. * 函數名 : Wait_CREG
  208. * 描述   : 等待模塊注冊成功
  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'))  //說模塊注冊成功
  231.                                 {
  232.                                         i = 1;
  233.                                   break;
  234.                                 }
  235.                         }
  236.                 }
  237.                                 UART1_SendString("注冊中.....");
  238.         }

  239. }

  240. /*******************************************************************************
  241. * 函數名 : 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. * 函數名 : Second_AT_Command
  257. * 描述   : 發送AT指令函數
  258. * 輸入   : 發送數據的指針、發送等待時間(單位: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. * 函數名 : Set_ATE0
  298. * 描述   : 取消回顯
  299. * 輸入   :
  300. * 輸出   :
  301. * 返回   :
  302. * 注意   :
  303. *******************************************************************************/
  304. void Set_ATE0(void)
  305. {
  306.         Second_AT_Command("ATE0","OK",3);                                                                //取消回顯               
  307. }
  308. /*******************************************************************************
  309. * 函數名 : Connect_Server
  310. * 描述   : GPRS連接服務器函數
  311. * 輸入   :
  312. * 輸出   :
  313. * 返回   :
  314. * 注意   :
  315. *******************************************************************************/
  316. void Connect_Server(void)
  317. {
  318.         UART2_SendString("AT+CIPCLOSE=1");        //關閉連接
  319.         Second_AT_Command("AT+CIPSHUT","SHUT OK",2);                //關閉移動場景

  320.         Second_AT_Command("AT+CGCLASS=\"B\"","OK",2);//設置GPRS移動臺類別為B,支持包交換和數據交換
  321.         Second_AT_Command("AT+CGDCONT=1,\"IP\",\"CMNET\"","OK",2);//設置PDP上下文,互聯網接協議,接入點等信息
  322.         Second_AT_Command("AT+CGATT=1","OK",2);//附著GPRS業務
  323.         Second_AT_Command("AT+CIPCSGP=1,\"CMNET\"","OK",2);//設置為GPRS連接模式
  324.         Second_AT_Command("AT+CIPHEAD=1","OK",2);//設置接收數據顯示IP頭(方便判斷數據來源,僅在單路連接有效)
  325.         Second_AT_Command(string,"OK",5);
  326.         delay_ms(100);
  327.         CLR_Buf2();
  328. }
  329. /*******************************************************************************
  330. * 函數名 : Rec_Server_Data
  331. * 描述   : 接收服務器數據函數
  332. * 輸入   :
  333. * 輸出   :
  334. * 返回   :
  335. * 注意   :
  336. *******************************************************************************/
  337. void Rec_Server_Data(void)
  338. {
  339.         if(strstr(Uart2_Buf,"+IPD")!=NULL)                   //若緩存字符串中含有+IPD
  340.         {       
  341.                 Heartbeat=0;        //清除心跳幀計數器
  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. * 函數名 : Send_OK
  379. * 描述   : 發送數據應答服務器的指令,該函數在有兩功能
  380.                                         1:接收到服務器的數據后,應答服務器
  381.                                         2:服務器無下發數據時,每隔10秒發送一幀心跳,保持與服務器連接
  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");     //發送短信內容
  393. }
  394. //向遠程服務器數據函數
  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\":\"");                  //將數據發送到遠程端設備
  400.         for (b; *b!='\0';b++)
  401.         {
  402.                 UART2_SendData(*b);
  403.         }
  404.         UART2_SendString("\"}\r\n");                  //將數據發送到遠程端設備
  405.         UART2_SendString("\32\0");     //發送短信內容
  406. }
復制代碼

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


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表