|
单片机源程序如下:- /**********************************************************************************
- * 工程名 :发送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;
- }
- }
- }
复制代码
|
|