找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2847|回复: 0
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
单片机使用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   无法上传全部资料 我就只上传程序   另外还有视频  教程 可以私信我



单片机源程序如下:
  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 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表