|
單片機(jī)源程序如下:- /**********************************************************************************
- * 工程名 :發(fā)送TEXT文本短信
- * 描述 :通過(guò)STM32開(kāi)發(fā)板控制模塊發(fā)送TEXT文本短信
- * 實(shí)驗(yàn)平臺(tái):STM32F10X
- * 庫(kù)版本 :
- * 硬件連接說(shuō)明
- 使用單片串口2與GPRS模塊通信 注:使用串口2可以避免下載和通信不會(huì)沖突
- STM32 GPRS模塊
- 5V ->5V
- 3.3V ->V_TTL
- PA3 (RXD2)->TXD
- PA2 (TXD2)->RXD
- GND ->GND
-
- VBAT ->供電5V(大電流)
- GND ->GND
- PB9 ->PWR
- PWR:這個(gè)引腳是控制模塊啟動(dòng),V1.2版本已經(jīng)有自啟動(dòng)電路所以不必接
- * 軟件功能說(shuō)明
- 板子上電后運(yùn)行指示燈600ms亮/3000ms滅的頻率閃爍
- 修改短信中心號(hào)、接收方手機(jī)號(hào)和短信內(nèi)容,編譯成功后下載到單片機(jī)里面,就可以實(shí)現(xiàn)發(fā)
- 送一條文本短信
- **********************************************************************************/
- #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緩存長(zhǎng)度
- #define Buf2_Max 200 //串口2緩存長(zhǎng)度
- /************* 本地常量聲明 **************/
- static unsigned char *SMS_Num="\"+8613800270500\"";//短信中心號(hào) 關(guān)于中心號(hào)的介紹可以看串口調(diào)試筆記的第二部分
- static unsigned char *phone="\"18672942506\""; //短信接收方手機(jī)號(hào)
- static unsigned char *content="Fire Alarm!";//發(fā)送短信內(nèi)容
- 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; //定時(shí)器0延時(shí)啟動(dòng)計(jì)數(shù)器
- vu8 Uart2_Start; //串口2開(kāi)始接收數(shù)據(jù)
- vu8 Uart2_End; //串口2接收數(shù)據(jù)結(jié)束
- u8 t=0;
- u8 SMS_flag=1;
- u8 flag1 = 1;
- short temperature;
- extern int flag;
- /************* 本地函數(shù)聲明 **************/
- 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);
- /*******************************************************************************
- * 函數(shù)名 : main
- * 描述 : 主函數(shù)
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 : 串口2負(fù)責(zé)與MG323模塊通信,串口1用于串口調(diào)試,可以避免在下載程序時(shí)數(shù)據(jù)
- 還發(fā)送到模塊
- *******************************************************************************/
- int main(void)
- {
- NVIC_Configuration(); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
- delay_init(); //延時(shí)函數(shù)初始化
- 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(); //查詢等待模塊注冊(cè)成功
- Set_Text_Mode();//設(shè)置短信為T(mén)EXT模式
-
- while(DS18B20_Init()) //1:未檢測(cè)到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); //顯示負(fù)號(hào)
- temperature=-temperature; //轉(zhuǎn)為正數(shù)
- }else LCD_ShowChar(60+40,40,' ',16,0); //去掉負(fù)號(hào)
- POINT_COLOR=BLUE;//設(shè)置字體為藍(lán)色
- LCD_ShowNum(60+40+8,40,temperature/10,2,16); //顯示正數(shù)部分
- LCD_ShowNum(60+40+32,40,temperature%10,1,16); //顯示小數(shù)部分
-
- 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();//發(fā)送一條短消息
- flag1=0;
- }
-
- if(flag==1 && (temperature/10)>20 && SMS_flag==1){ //使用溫度報(bào)警時(shí)。只用了整數(shù)部分
- LCD_ShowString(60,200,160,16,16,"Fire Alarm!");
- Send_Text_Sms();//發(fā)送一條短消息
- SMS_flag = 0;
- }
- // else{
- // LCD_ShowString(60,200,160,16,16," ");
- // //SMS_flag = 1;
- // }
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : CLR_Buf2
- * 描述 : 清除串口2緩存數(shù)據(jù)
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void CLR_Buf2(void)
- {
- u16 k;
- for(k=0;k<Buf2_Max;k++) //將緩存內(nèi)容清零
- {
- Uart2_Buf[k] = 0x00;
- }
- First_Int = 0; //接收字符串的起始存儲(chǔ)位置
- }
- /*******************************************************************************
- * 函數(shù)名 : Find
- * 描述 : 判斷緩存中是否含有指定的字符串
- * 輸入 :
- * 輸出 :
- * 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
- * 注意 :
- *******************************************************************************/
- u8 Find(char *a)
- {
- if(strstr(Uart2_Buf,a)!=NULL)
- return 1;
- else
- return 0;
- }
- /*******************************************************************************
- * 函數(shù)名 : Second_AT_Command
- * 描述 : 發(fā)送AT指令函數(shù)
- * 輸入 : 發(fā)送數(shù)據(jù)的指針、希望接收到的應(yīng)答數(shù)據(jù)指針、發(fā)送等待時(shí)間(單位:S)
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Second_AT_Command(char *b,char *a,u8 wait_time)
- {
- u8 i;
- char *c;
- c = b; //保存字符串地址到c
- CLR_Buf2(); //清除串口2緩存數(shù)據(jù)
- i = 0;
- while(i == 0)
- {
- if(!Find(a)) //判斷緩存中是否含有指定的字符串,如果沒(méi)有就一直發(fā)送
- {
- if(Timer0_start == 0)
- {
- b = c; //將字符串地址給b
- for (; *b!='\0';b++) // \0--字符串結(jié)尾---一次發(fā)送一位字符串,然后b++,當(dāng)字符串結(jié)束時(shí),發(fā)送完成
- {
- while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET); //串口2接收引腳無(wú)數(shù)據(jù)時(shí),空循環(huán)
- USART_SendData(USART2,*b); //UART2_SendData(*b);
- }
- UART2_SendLR();
- Times = 0;
- shijian = wait_time;
- Timer0_start = 1;
- }
- }
- else //如果有,即發(fā)送成功,則令i=1跳出循環(huán)
- {
- i = 1;
- Timer0_start = 0;
- }
- }
- CLR_Buf2();
- }
- /*******************************************************************************
- * 函數(shù)名 : Set_Text_Mode
- * 描述 : 設(shè)置短信為T(mén)EXT文本模式
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Set_Text_Mode(void)
- {
- char temp[50]="AT+CSCA=";
-
- Second_AT_Command("ATE0","OK",3); //取消回顯 ,發(fā)送ATE0,等待接收到“OK”才結(jié)束,并執(zhí)行下一步
- Second_AT_Command("AT+CMGF=1","OK",3); //TEXT模式
- Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);//所有操作都在SIM卡中進(jìn)行
- strcat(temp,(char*)SMS_Num); //字符串拼接函數(shù)(庫(kù)函數(shù))---把"AT+CSCA="與\"+8613800270500\"拼接,并存入temp
- Second_AT_Command(temp,"OK",3);//設(shè)置短信中心號(hào)
-
- LCD_ShowString(30,60,200,16,16,"Set_Text_Mode successful");
- }
- /*******************************************************************************
- * 函數(shù)名 : Send_Text_Sms
- * 描述 : 發(fā)送TEXT文本短信
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Send_Text_Sms(void)
- {
- char temp[50]="AT+CMGS=";
-
- strcat(temp,(char*)phone); //字符串拼接函數(shù)(庫(kù)函數(shù))
- Second_AT_Command(temp,">",3); //發(fā)送temp,等待接收到“>”才發(fā)送短信內(nèi)容
- UART2_SendString((char*)content); //發(fā)送短信內(nèi)容
- USART_SendData(USART2 ,0X1A); //發(fā)送結(jié)束符
- 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); //字符串拼接函數(shù)(庫(kù)函數(shù))
- Second_AT_Command(temp,">",3); //發(fā)送temp,等待接收到“>”才發(fā)送短信內(nèi)容
- UART2_SendString((char*)content1); //發(fā)送短信內(nèi)容
- USART_SendData(USART2 ,0X1A); //發(fā)送結(jié)束符
- UART2_SendLR();
-
- LCD_ShowString(30,90,200,16,16,"Send_Text_Sms successful");
- }
- /*******************************************************************************
- * 函數(shù)名 : Wait_CREG
- * 描述 : 等待模塊注冊(cè)成功
- * 輸入 :
- * 輸出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Wait_CREG(void)
- {
- u8 i;
- u8 k;
- i = 0;
- CLR_Buf2();
- while(i == 0)
- {
- CLR_Buf2();
- UART2_SendString("AT+CREG?"); //查詢模塊是否注冊(cè)成功
- // UART2_SendString("/r/n");
- UART2_SendLR(); //發(fā)回車換行
- // 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] == ':') //如果響應(yīng)返回的結(jié)果中有分號(hào)
- {
- // LCD_ShowString(30,140,200,16,16,"debug2");
- if((Uart2_Buf[k+4] == '1')||(Uart2_Buf[k+4] == '5')) //說(shuō)明模塊注冊(cè)成功 0:未注冊(cè),且沒(méi)有進(jìn)行搜尋新網(wǎng)絡(luò),1:已注冊(cè)本地網(wǎng)絡(luò),2:未注冊(cè),正在搜尋網(wǎng)絡(luò),4:未知代碼,5:已注冊(cè),處于漫游狀態(tài)
- {
- 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++; //緩存指針向后移動(dòng)
- // 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++; //緩存指針向后移動(dòng)
- if(First_Int > Buf2_Max) //如果緩存滿,將緩存指針指向緩存的首地址
- {
- First_Int = 0;
- }
- }
- }
復(fù)制代碼
|
|