标题:
SIM800c与手机通信 另使用ld3320芯片 智能家具程序
[打印本页]
作者:
涛涛啊
时间:
2019-2-26 10:45
标题:
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 无法上传全部资料 我就只上传程序 另外还有视频 教程 可以私信我
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
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1