~~~
#include<reg51.h>
#include<string.h>
#define Buf_Max 100 //緩存長度100
#define Delay_Time 2000 ?//延時長度
sbit LED1 = P0^0; //狀態指示燈1
sbit LED2 = P0^1; //狀態指示燈2
sbit LED3 = P0^2; //狀態指示燈3
sbit LED4 = P0^3; //狀態指示燈4
sbit IGT = P2^4; ?//點火信號
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 ?init_Faduanxin();
/**********************************主函數******************************/
void main(void)
{
? ? ? ? ? ?init_Faduanxin();
while(1)
{?
LED2 = 0;
? ?if(strstr(Rec_Buf,"+CMTI")!=NULL) ? ?//若緩存字符串中含有"+CMTI"就表示有新的短信
? ? ? ?{
? ?
CLR_Buf(); ? ? ? ? ? ? ? ? ? //清除緩存內容
Delay_ms(Delay_Time); ? ? ? ?//延時
Send_ASCII("AT+CMGR=1"); ? ? //發送讀取信息指令
? ?Send_Hex(0x0d); ? ? ? ? ? ? ?//發送回車符
?Send_Hex(0x0a); ? ? ? ? ? ? ?//發送換行符
Delay_ms(Delay_Time); ? ? ? ?//延時
? ? ? ? ? ?//while(!Hand("OK")); ? ? ? ? ?//等待設置成功
//LED2 = 0; ? ? ? ? ? ? ? ? ? ?//點亮設置成功指示燈
? ? ? ?if(strstr(Rec_Buf,"open")!=NULL) ? ? ? //如果信息內容是"open1"
? ? ? ? ? ?{
?LED1 = 0;?
??Delay_ms(3000);?
LED1 = 1;?
? ? ? ? ?}
?else
?{
? ? LED3 = 0;
?}
CLR_Buf(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//清除緩存內容
?
Delay_ms(Delay_Time); ? ? ? ? ? ? ? ? ? //延時
Send_ASCII("AT+CMGD=1"); ? ? ? ? ? ? ? ?//刪除讀取后的信息
Send_Hex(0x0d); ? ? ? ? ? ? ? ? ? ? ? ? //發送回車符
?Send_Hex(0x0a); ? ? ? ? ? ? ? ? ? ? ? ? //發送換行符
Delay_ms(Delay_Time); ? ? ? ? ? ? ? ? ? //延時
while(!Hand("OK"));? ? ? ? ? ? ? ? ? ?//等待設置成功
CLR_Buf(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//清除緩存內容
}
? ? ? ? ? ? ? ?}
}
void ?init_Faduanxin()
{
?IGT=0;
? ? ? ? ? ? Delay_ms(1000); ? ? ? ?//延時
? ? ? ? ? ? IGT=1;
? ? ? ?Serial_Init(); ? ? ? ? //初始化串口
CLR_Buf(); ? ? ? ? ? ? //清除緩存內容
? ? ? ?Delay_ms(3000); ? ? ? ?//延時
? ? ? ?while(!Hand("OK")) ? ? //判斷是否握手成功,如果不成功延時一會,再發送AT握手指令
{
Send_ASCII("AT"); //發送聯機指令?
? ? ? ? ? ? ? ?Send_Hex(0x0d); ? //發送回車符 ? ?
Send_Hex(0x0a); ? //發送換行符
Delay_ms(3000); ? //延時
}
CLR_Buf(); ? ? ? ? ? ? ? ?//清除緩存內容
//LED1 = 0; ? ? ? ? ? ? ? ? //點亮握手成功指示燈
Delay_ms(Delay_Time); ? ? //延時
? ?Send_ASCII("AT+CPMS=\"MT\",\"MT\",\"MT\"");//所有操作都在MT(模塊終端)中進行
Send_Hex(0x0d); ? ? ? ? ? //發送回車符
?Send_Hex(0x0a); ? ? ? ? ? //發送換行符
Delay_ms(Delay_Time); ? ? //延時
//while(!Hand("OK")); ? ? ? //等待設置成功
CLR_Buf(); ? ? ? ? ? ? ? ?//清除緩存內容
Delay_ms(Delay_Time); ? ? //延時
Send_ASCII("AT+CNMI=2,1");//設置當有新短信到來時提示?
Send_Hex(0x0d); ? ? ? ? ? //發送回車符
? Send_Hex(0x0a); ? ? ? ? ? //發送換行符
Delay_ms(Delay_Time); ? ? //延時
//while(!Hand("OK")); ? ? ? //等待設置成功
CLR_Buf(); ? ? ? ? ? ? ? ?//清除緩存內容
//LED3 = 0; ? ? ? ? ? ? ? ? //點亮設置成功指示燈
Delay_ms(Delay_Time); ? ? //延時
Send_ASCII("AT+CMGF=1"); ?//文本(TEXT)模式?
Send_Hex(0x0d); ? ? ? ? ? //發送回車符
Send_Hex(0x0a); ? ? ? ? ? //發送換行符
Delay_ms(Delay_Time); ? ? //延時
//while(!Hand("OK"));? ? ?//等待設置成功
CLR_Buf(); ? ? ? ? ? ? ? ?//清除緩存內容
//LED4 = 0; ? ? ? ? ? ? ? ? //點亮設置成功指示燈
Delay_ms(Delay_Time); ? ? //延時
Send_ASCII("AT+CMGD=1"); ?//刪除第一條信息
Send_Hex(0x0d); ? ? ? ? ? //發送回車符
?Send_Hex(0x0a); ? ? ? ? ? //發送換行符
Delay_ms(Delay_Time); ? ? //延時
//while(!Hand("OK"));? ? ?//等待設置成功
CLR_Buf(); ? ? ? ? ? ? ? ?//清除緩存內容
//LED1 = 0; ? ? ? ? ? ? ? ? //點亮設置成功指示燈
}
/***************************串口初始化函數*****************************/
/*函數原型: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>200) ? ? ? ? ?//如果緩存滿,將緩存指針指向緩存的首地址
{
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; ? ? ? ? ? ? ? ? ? //開串口中斷
}
/****************************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;
}
~~~