标题:
STM32+SIM900A手机发送短信控制LED亮灭的程序源码
[打印本页]
作者:
youngkong
时间:
2018-6-11 20:21
标题:
STM32+SIM900A手机发送短信控制LED亮灭的程序源码
使用SIM900A发送短信。
本程序通过手机短信控制LED的亮灭
使用单片机串口2与模块通信;接法如下
STC单片机 GPRS模块
P1.2(RXD2)->RXD
P1.3(TXD2)->TXD
GND ->GND
1、板子上电后运行指示灯RUNING_LED会以一秒的频率闪烁;
2、通过芯片的串口1可以监视模块的登录情况;
3、手机发送“onled”点亮LED;
4、手机发送“offled”熄灭LED;
5、使用串口2与模块通信,串口1用于将信息打印输出。
单片机源程序如下:
/**********************************************************************************
* 工程名 :
* 描述 :通过手机发送短信控制LED
* 实验平台:STM32F10X
* 库版本 :
* 作者 :泥人通信模块开发平台团队
**********************************************************************************/
#include "stm32f10x.h"
#include "usart.h"
#include "Led.h"
#include "SysTick.h"
#include "timer.h"
#include "string.h"
#define Automatic_Startup 1 //定义自启动 V1.2版本起有自启动功能
//#define Buf1_Max 60 //串口1缓存长度
#define Buf2_Max 200 //串口2缓存长度
/************* 本地常量声明 **************/
/************* 本地变量声明 **************/
//char Uart1_Buf[Buf1_Max];
char Uart2_Buf[Buf2_Max];
u8 Times=0,First_Int = 0,shijian=0;
vu8 Timer0_start; //定时器0延时启动计数器
vu8 Uart2_Start; //串口2开始接收数据
vu8 Uart2_End; //串口2接收数据结束
/************* 本地函数声明 **************/
void CLR_Buf2(void); //清除串口2缓存数据
u8 Find(char *a); //判断缓存中是否含有指定的字符串
void Second_AT_Command(char *b,u8 wait_time); //发送AT指令函数 输入:发送数据的指针、发送等待时间(单位:S)
void Set_Text_Mode(void); //设置短信为TEXT文本模式
void Check_New_Message(void); //检查是否有新信息,并执行信息内容指令
void Wait_CREG(void); //等待模块注册成功
/************* 外部函数和变量声明*****************/
/*******************************************************************************
* 函数名 : main
* 描述 : 主函数
* 输入 :
* 输出 :
* 返回 :
* 注意 : 串口2负责与GPRS模块通信,串口1用于串口调试,可以避免在下载程序时数据
还发送到模块
*******************************************************************************/
int main(void)
{
SysTick_Init_Config();
GPIO_Config();
USART1_Init_Config(115200);
USART2_Init_Config(115200);
Timer2_Init_Config();
UART1_SendString("A");
Second_AT_Command("AT+CMGF=1",3);
UART1_SendString("S");
Second_AT_Command("AT+CSCS=\"GSM\"",3); //文本模式
UART1_SendString("D");
Second_AT_Command("AT+CNMI=3,2,0,0,0",3); //新短信直接输出
UART1_SendString("F");
UART1_SendString(Uart2_Buf);
UART1_SendString("L");
while(1)
{
if(strstr(Uart2_Buf,"+CMT")!=NULL) //若缓存字符串中含有"+CMT"就表示有新的短信
{
UART1_SendString("G");
Delay_nMs(50);//等待数据全部接收完成
UART1_SendString("H");
UART1_SendString("收到新短信:\r\n");
UART1_SendString("J");
Delay_nMs(50);//等待数据全部接收完成
UART1_SendString(Uart2_Buf); //把模块返回的信息原样输出
UART1_SendString("K");
CLR_Buf2();
}
}
}
/*******************************************************************************
* 函数名 : USART2_IRQHandler
* 描述 : 串口1中断服务程序
* 输入 : 无
* 返回 : 无
* 说明 :
*******************************************************************************/
void USART2_IRQHandler(void)
{
u8 Res=0;
Res =USART_ReceiveData(USART2);
Uart2_Buf[First_Int] = Res; //将接收到的字符串存到缓存中
First_Int++; //缓存指针向后移动
if(First_Int > Buf2_Max) //如果缓存满,将缓存指针指向缓存的首地址
{
First_Int = 0;
}
}
/*******************************************************************************
* 函数名 : TIM2_IRQHandler
* 描述 : 定时器2中断断服务函数
* 输入 : 无
* 输出 : 无
* 返回 : 无
* 说明 : 无
*******************************************************************************/
void TIM2_IRQHandler(void) //TIM3中断
{
static u8 flag =1;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中断标志
if(Timer0_start)
Times++;
if(Times > shijian)
{
Timer0_start = 0;
Times = 0;
}
}
}
/*******************************************************************************
* 函数名 : CLR_Buf2
* 描述 : 清除串口2缓存数据
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void CLR_Buf2(void)
{
u16 k;
for(k=0;k<Buf2_Max;k++) //将缓存内容清零
{
Uart2_Buf[k] = 0x00;
}
First_Int = 0; //接收字符串的起始存储位置
}
/*******************************************************************************
* 函数名 : Find
* 描述 : 判断缓存中是否含有指定的字符串
* 输入 :
* 输出 :
* 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
* 注意 :
*******************************************************************************/
u8 Find(char *a)
{
if(strstr(Uart2_Buf,a)!=NULL)
return 1;
else
return 0;
}
/*******************************************************************************
* 函数名 : Second_AT_Command
* 描述 : 发送AT指令函数
* 输入 : 发送数据的指针、发送等待时间(单位:S)
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Second_AT_Command(char *b,u8 wait_time)
{
u8 i;
char *c;
c = b; //保存字符串地址到c
CLR_Buf2();
i = 0;
while(i == 0)
{
if(!Find("OK"))
{
if(Timer0_start == 0)
{
b = c; //将字符串地址给b
for (; *b!='\0';b++)
{
while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
USART_SendData(USART2,*b);//UART2_SendData(*b);
}
UART2_SendLR();
Times = 0;
shijian = wait_time;
Timer0_start = 1;
}
}
else
{
i = 1;
Timer0_start = 0;
}
}
CLR_Buf2();
}
/*******************************************************************************
* 函数名 : Set_Text_Mode
* 描述 : 设置短信为TEXT文本模式
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Set_Text_Mode(void)
{
Second_AT_Command("ATE0",3); //取消回显
Second_AT_Command("AT+CNMI=3,2,0,0,0",3); //新短信直接输出
Second_AT_Command("AT+CMGF=1",3); //TEXT模式
Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"",3); //所有操作都在SIM卡中进行
}
/*******************************************************************************
* 函数名 : Check_Message_rec
* 描述 : 检查是否有新信息,并执行信息内容指令
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Check_New_Message(void)
{
if(strstr(Uart2_Buf,"+CMT")!=NULL) //若缓存字符串中含有"+CMT"就表示有新的短信
{
Delay_nMs(50);//等待数据全部接收完成
UART1_SendString("收到新短信:\r\n");
UART1_SendString(Uart2_Buf); //把模块返回的信息原样输出
if(strstr(Uart2_Buf,"onled")!=NULL) //用于判断str2是否是str1的子串
{
LED1_ON();
}
if(strstr(Uart2_Buf,"offled")!=NULL)
{
LED1_OFF();
}
CLR_Buf2();
//Second_AT_Command("AT+CMGD=1,4",3);//删除短信
}
}
/*******************************************************************************
* 函数名 : Wait_CREG
* 描述 : 等待模块注册成功
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
a SIM900短信接收.rar
(300.61 KB, 下载次数: 142)
2018-6-12 03:04 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
1205965081
时间:
2019-12-30 10:54
C8T6的???????????????
作者:
学不止,行不尽
时间:
2020-5-26 09:22
你好,我用了一下你的程序,但收到短信LED灯只是亮三秒怎么回事?
作者:
学不止,行不尽
时间:
2020-5-26 09:26
你好,我试用了你的程序,但控制灯开启只有三秒是怎么回事?能解决吗?还有LED灯光很弱是怎么回事能?应该不能是灯的问题,我用其他程序在同一个管脚驱动灯是明亮的,希望尽快能等到楼主的回复,谢谢
作者:
野肆3
时间:
2022-3-3 22:58
为啥我移植了用不了呢?
作者:
野肆3
时间:
2022-3-3 23:03
你好,我有遇到这种问题,一模一样的代码但是没有接收到,就想问一下你怎么解决的?方便的话介意发一下源码吗我参考一下,谢谢啦!
作者:
jnwy
时间:
2022-3-4 14:06
你好,我试用了你的程序,但控制灯开启只有三秒是怎么回事?能解决吗?还有LED灯光很弱是怎么回事能?应该不能是灯的问题,我用其他程序在同一个管脚驱动灯是明亮的,希望尽快能等到楼主的回复,谢谢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1