标题:
stm32烟雾报警器源程序_手机发送短信
[打印本页]
作者:
JN0717
时间:
2021-3-15 19:26
标题:
stm32烟雾报警器源程序_手机发送短信
单片机源程序如下:
/**********************************************************************************
* 工程名 :发送TEXT文本短信
* 描述 :通过STM32开发板控制模块发送TEXT文本短信
* 实验平台:STM32F10X
* 库版本 :
* 硬件连接说明
使用单片串口2与GPRS模块通信 注:使用串口2可以避免下载和通信不会冲突
STM32 GPRS模块
5V ->5V
3.3V ->V_TTL
PA3 (RXD2)->TXD
PA2 (TXD2)->RXD
GND ->GND
VBAT ->供电5V(大电流)
GND ->GND
PB9 ->PWR
PWR:这个引脚是控制模块启动,V1.2版本已经有自启动电路所以不必接
* 软件功能说明
板子上电后运行指示灯600ms亮/3000ms灭的频率闪烁
修改短信中心号、接收方手机号和短信内容,编译成功后下载到单片机里面,就可以实现发
送一条文本短信
**********************************************************************************/
#include "sys.h"
#include "delay.h"
#include "lcd.h"
#include "usart.h"
#include "timer.h"
#include "string.h"
#include "MQ_smog.h"
#include "ds18b20.h"
#define Buf1_Max 60 //串口1缓存长度
#define Buf2_Max 200 //串口2缓存长度
/************* 本地常量声明 **************/
static unsigned char *SMS_Num="\"+8613800270500\"";//短信中心号 关于中心号的介绍可以看串口调试笔记的第二部分
static unsigned char *phone="\"18672942506\""; //短信接收方手机号
static unsigned char *content="Fire Alarm!";//发送短信内容
static unsigned char *content1="I am a fire alarm";
/************* 本地变量声明 **************/
char Uart2_Buf[Buf2_Max];//串口2接收缓存
u8 Times=0,First_Int = 0,shijian=0;
vu8 Timer0_start; //定时器0延时启动计数器
vu8 Uart2_Start; //串口2开始接收数据
vu8 Uart2_End; //串口2接收数据结束
u8 t=0;
u8 SMS_flag=1;
u8 flag1 = 1;
short temperature;
extern int flag;
/************* 本地函数声明 **************/
void CLR_Buf2(void);
u8 Find(char *a);
void Second_AT_Command(char *b,char *a,u8 wait_time);
void Set_Text_Mode(void);
void Wait_CREG(void);
void Send_Text_Sms(void);
void Send_Text_Sms1(void);
/*******************************************************************************
* 函数名 : main
* 描述 : 主函数
* 输入 :
* 输出 :
* 返回 :
* 注意 : 串口2负责与MG323模块通信,串口1用于串口调试,可以避免在下载程序时数据
还发送到模块
*******************************************************************************/
int main(void)
{
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
delay_init(); //延时函数初始化
uart_init(9600);
USART2_Init_Config(9600);
Timer2_Init_Config();
LCD_Init();
Init_smog();
BACK_COLOR=WHITE; //字体背景色
POINT_COLOR=RED;
LCD_Clear(WHITE);
Wait_CREG(); //查询等待模块注册成功
Set_Text_Mode();//设置短信为TEXT模式
while(DS18B20_Init()) //1:未检测到DS18B20的存在 0:存在
{
LCD_ShowString(60,130,200,16,16,"DS18B20 Error");
delay_ms(200);
LCD_Fill(60,130,239,130+16,WHITE);
delay_ms(200);
}
// LCD_ShowString(60,20,200,16,16,"DS18B20 OK");
LCD_ShowString(60,40,200,16,16,"Temp: . C");
while(1)
{
if(t%10==0)//每100ms读取一次
{
temperature=DS18B20_Get_Temp();
if(temperature<0)
{
LCD_ShowChar(60+40,40,'-',16,0); //显示负号
temperature=-temperature; //转为正数
}else LCD_ShowChar(60+40,40,' ',16,0); //去掉负号
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowNum(60+40+8,40,temperature/10,2,16); //显示正数部分
LCD_ShowNum(60+40+32,40,temperature%10,1,16); //显示小数部分
smog();
if(flag == 1){
POINT_COLOR=RED;
LCD_ShowString(30,180,160,16,16,"smog:warning!");
}
else LCD_ShowString(30,180,160,16,16," ");
}
LCD_ShowxNum(30,220,flag,1,16,0);
if(flag1 == 1){
Send_Text_Sms1();//发送一条短消息
flag1=0;
}
if(flag==1 && (temperature/10)>20 && SMS_flag==1){ //使用温度报警时。只用了整数部分
LCD_ShowString(60,200,160,16,16,"Fire Alarm!");
Send_Text_Sms();//发送一条短消息
SMS_flag = 0;
}
// else{
// LCD_ShowString(60,200,160,16,16," ");
// //SMS_flag = 1;
// }
}
}
/*******************************************************************************
* 函数名 : 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,char *a,u8 wait_time)
{
u8 i;
char *c;
c = b; //保存字符串地址到c
CLR_Buf2(); //清除串口2缓存数据
i = 0;
while(i == 0)
{
if(!Find(a)) //判断缓存中是否含有指定的字符串,如果没有就一直发送
{
if(Timer0_start == 0)
{
b = c; //将字符串地址给b
for (; *b!='\0';b++) // \0--字符串结尾---一次发送一位字符串,然后b++,当字符串结束时,发送完成
{
while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET); //串口2接收引脚无数据时,空循环
USART_SendData(USART2,*b); //UART2_SendData(*b);
}
UART2_SendLR();
Times = 0;
shijian = wait_time;
Timer0_start = 1;
}
}
else //如果有,即发送成功,则令i=1跳出循环
{
i = 1;
Timer0_start = 0;
}
}
CLR_Buf2();
}
/*******************************************************************************
* 函数名 : Set_Text_Mode
* 描述 : 设置短信为TEXT文本模式
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Set_Text_Mode(void)
{
char temp[50]="AT+CSCA=";
Second_AT_Command("ATE0","OK",3); //取消回显 ,发送ATE0,等待接收到“OK”才结束,并执行下一步
Second_AT_Command("AT+CMGF=1","OK",3); //TEXT模式
Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);//所有操作都在SIM卡中进行
strcat(temp,(char*)SMS_Num); //字符串拼接函数(库函数)---把"AT+CSCA="与\"+8613800270500\"拼接,并存入temp
Second_AT_Command(temp,"OK",3);//设置短信中心号
LCD_ShowString(30,60,200,16,16,"Set_Text_Mode successful");
}
/*******************************************************************************
* 函数名 : Send_Text_Sms
* 描述 : 发送TEXT文本短信
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Send_Text_Sms(void)
{
char temp[50]="AT+CMGS=";
strcat(temp,(char*)phone); //字符串拼接函数(库函数)
Second_AT_Command(temp,">",3); //发送temp,等待接收到“>”才发送短信内容
UART2_SendString((char*)content); //发送短信内容
USART_SendData(USART2 ,0X1A); //发送结束符
UART2_SendLR();
LCD_ShowString(30,90,200,16,16,"Send_Text_Sms successful");
}
void Send_Text_Sms1(void)
{
char temp[50]="AT+CMGS=";
strcat(temp,(char*)phone); //字符串拼接函数(库函数)
Second_AT_Command(temp,">",3); //发送temp,等待接收到“>”才发送短信内容
UART2_SendString((char*)content1); //发送短信内容
USART_SendData(USART2 ,0X1A); //发送结束符
UART2_SendLR();
LCD_ShowString(30,90,200,16,16,"Send_Text_Sms successful");
}
/*******************************************************************************
* 函数名 : Wait_CREG
* 描述 : 等待模块注册成功
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Wait_CREG(void)
{
u8 i;
u8 k;
i = 0;
CLR_Buf2();
while(i == 0)
{
CLR_Buf2();
UART2_SendString("AT+CREG?"); //查询模块是否注册成功
// UART2_SendString("/r/n");
UART2_SendLR(); //发回车换行
// LCD_ShowString(30,120,200,16,16,"debug1");
delay_ms(5000);
for(k=0;k<Buf2_Max;k++)
{
u8 aa = Uart2_Buf[0];
LCD_ShowString(30,140,200,16,16,(u8*)aa);
if(Uart2_Buf[k] == ':') //如果响应返回的结果中有分号
{
// LCD_ShowString(30,140,200,16,16,"debug2");
if((Uart2_Buf[k+4] == '1')||(Uart2_Buf[k+4] == '5')) //说明模块注册成功 0:未注册,且没有进行搜寻新网络,1:已注册本地网络,2:未注册,正在搜寻网络,4:未知代码,5:已注册,处于漫游状态
{
i = 1; //可跳出while
break; //跳出for
}
}
}
// LCD_ShowString(30,120,200,16,16," ");
}
LCD_ShowString(30,120,200,16,16,"CREG successful");
}
//void USART2_IRQHandler(void)
//{
// u8 Res=0;
// Res =USART_ReceiveData(USART2);
// LCD_ShowString(30,140,200,16,16,(u8*)Res);
// Uart2_Buf[First_Int] = Res; //将接收到的字符串存到缓存中
// First_Int++; //缓存指针向后移动
// if(First_Int > Buf2_Max) //如果缓存满,将缓存指针指向缓存的首地址
// {
// First_Int = 0;
// }
//}
void USART2_IRQHandler(void)
{
u8 Res=0;
if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET){
Res = USART_ReceiveData(USART2);
// LCD_ShowString(30,140,200,16,16,(u8*)Res);
Uart2_Buf[First_Int] = Res; //将接收到的字符串存到缓存中
First_Int++; //缓存指针向后移动
if(First_Int > Buf2_Max) //如果缓存满,将缓存指针指向缓存的首地址
{
First_Int = 0;
}
}
}
复制代码
_烟雾报警器_手机发送短信.zip
2021-3-15 19:25 上传
点击文件名下载附件
下载积分: 黑币 -5
567.29 KB, 下载次数: 45, 下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1