嵌入式軟件設計第12次實驗報告服務器
學號:140201211 姓名:張潤澤函數
組別:第3組 實驗地點:D19字體
1、實驗目的:設計
1.掌握經過GSM短信遠程與嵌入式設備進行交互的方法。調試
2、實驗內容:ip
1.編寫程序把嵌入式開發板採集到的溫度信息經過GSM短信傳送給指定號碼。(每10秒發送1次)ci
2.編寫程序,使手機能夠經過短信指令的方式控制嵌入式開發板的蜂鳴器和LED燈。(好比手機編輯「BEEP_ON」和「BEEP_OFF」控制嵌入式開發板的蜂鳴器)開發
3、實驗過程描述及結果展現:string
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "touch.h"
#include "text.h"
#include "w25qxx.h"
#include "malloc.h"
#include "ff.h"
#include "exfuns.h"
#include <string.h>
#include "dht11.h"it
const u16 POINT_COLOR_TBL[OTT_MAX_TOUCH]={RED,GREEN,BLUE,BROWN,GRED};
extern u16 USART3_RX_STA;
extern u8 USART3_RX_BUF[400];
void LCD_Draw_Circle(u16 x0,u16 y0,u8 r);
unsigned char cnt =0;
u8 TimeCnt =0;
unsigned char *SMS = 0;
u8 SMS_string[10]={"AT+CMGR="};
//定時器6中斷服務器程序
void TIM6_DAC_IRQHandler(void)
{
if(TIM_GetITStatus(TIM6,TIM_IT_Update)!=RESET)//判斷是不是更新中
{
TIM_ClearITPendingBit(TIM6,TIM_IT_Update);//清除TIM6更新中斷標誌
TimeCnt++;
}
}
int main(void)
{
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
delay_init(168); //初始化延時函數
uart_init(115200); //初始化串口波特率爲115200
uart3_init(115200);
LED_Init(); //初始化LED
KEY_Init();
LCD_Init(); //LCD初始化
tp_dev.init(); //觸摸屏初始化
LCD_Clear(BLACK);
POINT_COLOR=YELLOW;//設置字體爲黃色
BACK_COLOR = BLACK;
//如下代碼初始化定時器
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
//定時器初始化
TIM_TimeBaseStructure.TIM_Period = 1000-1;
TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);//使能指定的TIM6中斷,容許更新中斷
NVIC_InitStructure.NVIC_IRQChannel = TIM6_DAC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure);//根據指定的參數初始化NVIC寄存器
}
TIM_Cmd(TIM6,ENABLE);//啓動定時器6
//如下代碼初始化溫溼度傳感器
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Init(GPIOG,&GPIO_InitStructure);
DHT11_Rst();
while(DHT11_Check());
}
//如下代碼配置蜂鳴器
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;
GPIO_Init(GPIOF,&GPIO_InitStructure);
}
//初始化SIM900A
{
unsigned char temp;
unsigned char send_string0[] = {"AT+CNMI=2,1\x0d\x0a"};
u8 send_string1[] = {"AT+CMGF=1\r\n"};
u8 send_string2[] = {"AT+CSCS=\"GSM\"\r\n"};
for(temp=0;temp<2;temp++)
{
USART_SendData(USART3,'A');
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
USART_SendData(USART3,'T');
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
USART_SendData(USART3,'0x0D');
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
USART_SendData(USART3,'0x0A');
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
}
delay_ms(100);
for(temp=0;temp<13;temp++)//發送AT+CNMI=2,1\x0d\x0a
{
USART_SendData(USART3,send_string0[temp]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
}
delay_ms(100);
for(temp=0;temp<11;temp++)//發送AT+CMGF=1\r\n
{
USART_SendData(USART3,send_string1[temp]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
}
delay_ms(100);
for(temp=0;temp<15;temp++)//發送AT+CSCS=\"GSM\"\r\n
{
USART_SendData(USART3,send_string2[temp]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
}
delay_ms(100);
}
USART3_RX_STA = 0;
while(1)
{
if(TimeCnt>=100)
{
TimeCnt=0;
printf("Time is out!\r\n");
//如下代碼把DHT11採集到的當前溫度用短信的形式發送到固定號碼
{
u8 i;
u8 send_string1[] = {"AT+CMGS=\"13021257803\"\r\n"};
u8 add_ascii[]={"\x1A"};
u8 sms_temperature[]={"current temperature:"};
u8 temper[2];
u8 temperature,humidity;
DHT11_Read_Data(&temperature,&humidity);
temper[0]=(temperature/10)+0x30;
temper[1]=(temperature%10)+0x30;
strcat(sms_temperature,temper);
strcat(sms_temperature,add_ascii);
USART_ClearFlag(USART3,USART_FLAG_TC);
printf("send_string1=%s\r\n",send_string1);
for(i=0;i<23;i++)
{
USART_SendData(USART3,send_string1[i]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
}
delay_ms(100);
printf("sms_temperature=%s\r\n",sms_temperature);
for(i=0;i<23;i++)
{
USART_SendData(USART3,sms_temperature[i]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
}
delay_ms(100);
}
}
//如下代碼監控是否有驅動BEEP的短信指令
if(USART3_RX_STA & 0x8000)
{
char* p_display;
USART3_RX_BUF[USART3_RX_STA & 0x7FFF]=0;
if(p_display=strstr((const char*)USART3_RX_BUF,(const char*)"+CMTI:"))
{
p_display=p_display+12;
SMS=p_display;
{
u8 i;
u8 send_string[100] = {"AT+CMGR="};
u8 data_r_n[] = {"\r\n\n"};
char *p_display;
USART_ClearFlag(USART3,USART_FLAG_TC);
strcat(send_string,SMS);
strcat(send_string,data_r_n);
for(i=0;i<12;i++)
{
USART_SendData(USART3,send_string[i]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
}
}
}
if(p_display=strstr((const char*)USART3_RX_BUF,(const char*)"+32"))
{
if(strstr((const char*)USART3_RX_BUF,(const char*)"BEEP_ON"))
{
GPIO_SetBits(GPIOF,GPIO_Pin_8);
}
if(strstr((const char*)USART3_RX_BUF,(const char*)"BEEP_OFF"))
{
GPIO_ResetBits(GPIOF,GPIO_Pin_8);
}
}
USART3_RX_STA=0;
}
}
}
4、總結及實驗心得:
這節課的任務是編寫程序把嵌入式開發板採集到的溫度信息經過GSM短信傳送給指定號碼以及使手機能夠經過短信指令的方式控制嵌入式開發板的蜂鳴器和LED燈(好比手機編輯「BEEP_ON」和「BEEP_OFF」控制嵌入式開發板的蜂鳴器),聽到可以用手機來控制蜂鳴器和LED燈,咱們頓時有了興趣,而後一直在專心地打代碼,打了大約一節課後,代碼終於調試成功了,而後嵌入式開發板果真經過GSM短信傳送給了同組同窗手機裏,因而咱們回覆BEEP_ON,過了一兩秒鐘,蜂鳴器響了,接着咱們回覆BEEP_OFF,蜂鳴器聲音又中止了,這意味着這節課的任務完成了,不過稍有遺憾的是,開發板是每隔十秒鐘傳送一條短信,意味着十秒鐘個人手機卡就要扣費1毛錢,而後咱們當時卻沒有注意,一直在開着開發板,因此,直到最後實驗成功,個人手機已經被扣了將近20元的短信費,不過想到結局是好的,我以爲也值得了。