ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
~~~ #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; } ~~~