[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;
}
發佈了51 篇原創文章 · 獲贊 23 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章