|
#include<reg51.h>
#include<string.h>
#include<stdio.h>
#define Buf_Max 50 //缓存长度200
#define Delay_Time 3000 //延时长度
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
sbit LED5=P1^4;
sbit LED6=P1^5;
sbit LED7=P1^6;
sbit LED8=P1^7;
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(void)
{
Serial_Init(); //初始化串口
CLR_Buf(); //清除缓存内容
Delay_ms(8000); //延时
while(1)
{
Send_ASCII("AT"); //发送联机指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(1000); //延时
LED1 = 0; //点亮握手成功指示灯
CLR_Buf();//清除缓存内容
Send_ASCII("AT+IPR=9600"); //发送联机指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(1000); //延时
Send_ASCII("AT+CPMS=\"SM\",\"SM\",\"SM\"");//所有操作都在MT(模块终端)中进行
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(1000); //延时
CLR_Buf(); //清除缓存内容
LED3 = 0; //点亮设置成功指示灯
Delay_ms(1000); //延时
Send_ASCII("AT+CMGF=1"); //文本(TEXT)模式
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(1000); //延时
CLR_Buf(); //清除缓存内容
LED4 = 0; //点亮设置成功指示灯
Send_ASCII("AT+CNMI=2,1");//设置当有新短信到来时提示
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(1000); //延时
CLR_Buf(); //清除缓存内容
LED5 = 0; //点亮设置成功指示灯
CLR_Buf(); //清除缓存内容
Send_ASCII("AT+CMGR=1"); //发送读取信息指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(1000); //延时
LED6= 0;
Delay_ms(50); //点亮设置成功指示灯
if(strstr(Rec_Buf,"what is the temperature now")!=NULL)
LED8=0;
else CLR_Buf();
CLR_Buf();
Send_ASCII("AT+CMGD=1"); //删除第一条信息
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(1000); //延时
CLR_Buf(); //清除缓存内容
LED2 = 0; //点亮设置成功指示灯
Delay_ms(1000); //延时
}
}
/***************************串口初始化函数*****************************/
/*函数原型: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 = SBUF; //将接收到的字符串存到缓存中
i++; //缓存指针向后移动
//Rec_Buf = '\0';
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;
}
麻烦大家帮我看看程序,是想让tc35i模块接收一条短信如果短信的内容是what is the temperature now,则LED8小灯亮,没接收到或接收到的内容不对小灯不亮,可是灯怎么都不亮,用串口调试软件可以看到模块握手等指令都返回OK,也能看到接收到了内容为what is the temperature now的短信,但灯就是不亮。最后问题就集中在这个判断上if(strstr(Rec_Buf,"what is the temperature now")!=NULL) ,我查了很多资料,感觉也没有不妥的地方,故请教大家,谢谢啊!! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|