[51]GSM短信控制燈的亮滅
#include<reg52.h>
#include<string.h>
#include<stdio.h>
//發kai時,led亮
//發guan時 led熄滅
//
//正常啓動現象:焊接板子上的led亮滅各1秒鐘時間,如果一直常亮,說明爲初始化成功
//gsm模塊上面的led,如果3S閃爍1次,說明正常連接上網絡,如果快速亮滅說明還沒有連接網絡
//
// 11.0592 9600
//
//注意:所有的操作都需要在 gsm模塊上面的led,3S閃爍 才能正常通信
sbit led_test=P1^5;
sbit led1=P1^0;
sbit led2=P1^2;
#define Buf_Max 60 //緩存長度200
#define Delay_Time 250 //延時長度
unsigned char i = 0; //定義緩存指針
unsigned char Rec_Buf[Buf_Max]; //定義緩存數組
void Serial_Init(void); //聲明串口初始化函數
void Send_ASCII(unsigned char *b); //聲明發送字符(ASCII碼)函數
void Delay_ms(unsigned int time); //聲明延時函數
void CLR_Buf(void); //聲明清除緩存內容
void Send_Hex(unsigned char b); //聲明發送字符(十六進制)函數
bit Hand(unsigned char *a); //聲明判斷緩存中是否含有指定的字符串函數
void main()
{
unsigned int t=0;
unsigned char time_temp=0;
led1=0;
Serial_Init(); //初始化串口
CLR_Buf(); //清除緩存內容
Send_ASCII("AT"); //發送聯機指令
while(!Hand("OK")) //判斷是否握手成功,如果不成功延時一會,再發送AT握手指令
{
Delay_ms(100); //延時
time_temp++;
if(time_temp>10)
{
time_temp =0;
Send_ASCII("AT"); //發送聯機指令
}
}
time_temp =0;
CLR_Buf(); //清除緩存內容
Send_ASCII("ATE0"); //發送聯機指令
while(!Hand("OK")); //判斷是否握手成功,如果不成功延時一會,再發送AT握手指令
time_temp =0;
CLR_Buf(); //清除緩存內容
Send_ASCII("AT+CMGF=1"); //發送聯機指令
while(!Hand("OK")) //判斷是否握手成功,如果不成功延時一會,再發送AT握手指令
{
Delay_ms(100); //延時
time_temp++;
if(time_temp>10)
{
time_temp =0;
Send_ASCII("AT+CMGF=1"); //發送聯機指令
}
}
time_temp =0;
CLR_Buf(); //清除緩存內容
Send_ASCII("AT+CMGD=1,4"); //發送聯機指令
while(!Hand("OK")) //判斷是否握手成功,如果不成功延時一會,再發送AT握手指令
{
Delay_ms(100); //延時
time_temp++;
if(time_temp>10)
{
time_temp =0;
Send_ASCII("AT+CMGD=1,4"); //發送聯機指令
}
}
time_temp =0;
CLR_Buf(); //清除緩存內容
t=0;
led2=0;
while(1)
{
if(strstr(Rec_Buf,"+CMTI")!=NULL) //若緩存字符串中含有"+CMTI"就表示有新的短信
{
CLR_Buf(); //清除緩存內容
Send_ASCII("AT+CMGR=1"); //發送讀取信息指令
while(!Hand("OK")) //判斷是否握手成功,如果不成功延時一會,再發送AT握手指令
{
Delay_ms(100); //延時
time_temp++;
if(time_temp>10)
{
time_temp =0;
Send_ASCII("AT+CMGR=1"); //發送聯機指令
}
}
if(strstr(Rec_Buf,"kai")!=NULL) //如果信息內容是"kai"
{led_test = 0;}
if(strstr(Rec_Buf,"guan")!=NULL) //如果信息內容是"guan"
{led_test = 1;}
CLR_Buf();
//清除緩存內容
Send_ASCII("AT+CMGD=1,4"); //刪除讀取後的信息
while(!Hand("OK")) //判斷是否握手成功,如果不成功延時一會,再發送AT握手指令
{
Delay_ms(100); //延時
time_temp++;
if(time_temp>10)
{
time_temp =0;
Send_ASCII("AT+CMGD=1,4"); //發送聯機指令
}
}
CLR_Buf(); //清除緩存內容
t=0;
}
t++;
if(t/2500){//正常工作 啓動期間 //一次大約爲 1S
t=0;
led1=~led1; //閃爍表示系統運行中,等待指令輸入
}
}
}
/***************************串口初始化函數*****************************/
/*函數原型:void Serial_Init(void)
/*函數功能:串口初始化
/*輸入參數:無
/*輸出參數:無
/**********************************************************************/
void Serial_Init(void)//串口初始化函數
{
SCON = 0x50;//串口:方式1,允許發送和接收
TMOD = 0x20;//定時器1:模式2,8位自動重裝模式,用於產生波特率
TH1 = 0xFD; //11.0592MHZ晶振,波特率爲9600
TL1 = 0xFD;
TR1 = 1; //開啓定時器1
ES = 1; //開啓串口中斷
EA = 1; //開啓全局中斷
}
/****************************串口中斷處理函數**************************/
/*函數原型:void Serial_Int(void)
/*函數功能:串口中斷處理
/*輸入參數:無
/*輸出參數:無
/**********************************************************************/
void Serial_Int() interrupt 4
{
ES = 0; //關串口中斷,防止中斷嵌套
if(TI) //如果是發送中斷,則不做任何處理
{
TI = 0; //清除發送中斷標誌位
}
if(RI) //如果是接送中斷,則進行處理
{
RI = 0; //清除接收中斷標誌位
Rec_Buf[i] = SBUF; //將接收到的字符串存到緩存中
i++; //緩存指針向後移動
if(i>(Buf_Max-1)) //如果緩存滿,將緩存指針指向緩存的首地址
{
i = 0;
}
}
ES = 1; //開啓串口中斷
}
/****************************發送字符(ASCII)函數***********************/
/*函數原型:void Send_ASCII(unsigned char *b)
/*函數功能:發送字符(ASCII碼)
/*輸入參數:unsigned char *b
/*輸出參數:無
/**********************************************************************/
void Send_ASCII(unsigned char *b)
{
ES = 0; //關串口中斷
for (b; *b!='\0';b++)
{
SBUF = *b;
while(TI!=1); //等待發送完成
TI = 0; //清除發送中斷標誌位
}
ES = 1; //開串口中斷
Send_Hex(0x0d); //發送回車符
Send_Hex(0x0a); //發送換行符
}
/****************************time ms延時函數***************************/
/*函數原型:Delay_ms(unsigned int time)
/*函數功能:延時Time ms
/*輸入參數:time
/*輸出參數:無
/**********************************************************************/
void Delay_ms(unsigned int time)
{
unsigned char j;
for(;time>0;time--)
{
j = 1500;
while(j--);
}
}
/**************************清除緩存數據函數****************************/
/*函數原型:void CLR_Buf(void)
/*函數功能:清除緩存數據
/*輸入參數:無
/*輸出參數:無
/*調用模塊:無
/**********************************************************************/
void CLR_Buf(void)
{
unsigned char k;
for(k=0;k<Buf_Max;k++) //將緩存內容清零
{
Rec_Buf[k] = 0;
}
i = 0; //接收字符串的起始存儲位置
}
/*************************發送字符(十六進制)函數********************/
/*函數原型:void Send_Hex(unsigned char c)
/*函數功能:發送字符(十六進制)
/*輸入參數:unsigned char c
/*輸出參數:無
/*調用模塊:無
/******************************************************************/
void Send_Hex(unsigned char c)
{
ES = 0; //關串口中斷
SBUF = c;
while(TI!=1); //等待發送完成
TI = 0; //清除發送中斷標誌位
ES = 1; //開串口中斷
}
/*****************判斷緩存中是否含有指定的字符串函數******************/
/*函數原型:bit Hand(unsigned char *a)
/*函數功能:判斷緩存中是否含有指定的字符串
/*輸入參數:unsigned char *a 指定的字符串
/*輸出參數:bit 1---含有 0---不含有
/*調用模塊:無
/*******************************************************************/
bit Hand(unsigned char *a)
{
if(strstr(Rec_Buf,a)!=NULL)
return 1;
else
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.