51单片机项目制发短信

来源:互联网 发布:亚马逊和淘宝哪个大 编辑:程序博客网 时间:2022/07/04 22:30
#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;
}
1 0
原创粉丝点击