用51单片机控制SIM A6模块发送短信,程序运行后没有结果
道天翁 2017-05-28 11:48:54 #include "reg52.h"
#include "temp.h"
#include "string.h"
#include "stdlib.h"
#define uint unsigned int
#define uchar unsigned char
#define Buf_Max 80
#define TELL 13778386860
/*sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4; */
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3;
sbit led5=P2^4;
sbit led6=P2^5;
sbit led7=P2^6;
sbit led8=P2^7;
sbit duan=P2^6;
sbit wei=P2^7;
sbit key=P3^4;
uchar flag=0,i=0;
uchar Rec_Buf[Buf_Max];
/*char num=0;
uchar DisplayData[8]; */
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*void datapros(int temp) //温度读取处理转换函数
{
float tp;
if(temp< 0) //当温度值为负数
{
DisplayData[0] = 0x40; // -
//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
}
else
{
DisplayData[0] = 0x00;
tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
//如果温度是正的那么,那么正数的原码就是补码它本身
temp=tp*0.0625*100+0.5;
}
DisplayData[1] = smgduan[temp / 10000];
DisplayData[2] = smgduan[temp % 10000 / 1000];
DisplayData[3] = smgduan[temp % 1000 / 100] | 0x80;
DisplayData[4] = smgduan[temp % 100 / 10];
DisplayData[5] = smgduan[temp % 10];
}
/*void DigDisplay() //数码管显示函数
{
uchar q;
for(q=0;q<6;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
}
P0=DisplayData[5-q];//发送数据
delayms(1); //间隔一段时间扫描
P0=0x00;//消隐
}
} */
void sinit () //定时器初始化
{
SCON=0x50; //定时器1 10位UART 可变 允许接收
TMOD=0x20; //八位自动重装载模式
TH1=0xfd;
TL1=0xfd;
TR1=1; //启动定时器1
IT1=1; //外部中断1触发方式控制允许
EA=1; //打开总中断
ES=1; //串行口中断允许
EX1=1; //定时器T1中断允许
}
void CLR_Buf() //清除缓存内容
{
uchar k;
for (k=0;k<Buf_Max;k++)
{
Rec_Buf[k]=0;
}
i=0; //接收字符串指针指回起点
}
bit Hand(uchar *a) //判断缓存中是否含有指定的字符串函数
{
if (strstr(Rec_Buf,a)!=NULL)
return 1;
else
return 0;
}
void Send_ASCII(uchar *b) //发送字符(ASCII码)函数
{
EA=0;
for (b;*b!='\0';b++)
{
SBUF=*b;
while (TI!=1);
TI=0;
}
EA=1;
}
void Send_Hex(uchar c) //发送字符(十六进制)函数
{
EA=0;
SBUF=c;
while(TI!=1);
TI=0;
EA=1;
}
void Send_message()
{
CLR_Buf();
Send_ASCII("AT+CMGF=1");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!Hand("OK"));
CLR_Buf();
led1=~led1;
Send_ASCII("AT+CMGS=TELL");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!Hand(">"));
led2=~led2;
Send_ASCII("temperature: 28.65");
Send_Hex(0x1a);
delayms(1000);
while(!Hand("OK"));
CLR_Buf();
led4=~led4;
}
void main()
{
int led;
uchar *j, l;
char o[5];
sinit();
while(!Hand("OK"))
{
Send_ASCII("AT");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(2000);
}
CLR_Buf();
led1=0;
delayms(2000);
Send_ASCII("AT+CPMS=\"SM\",\"SM\",\"SM\"");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(2000);
while(!Hand("OK"));
Send_ASCII(Rec_Buf);
CLR_Buf();
led2=0;
delayms(2000);
Send_ASCII("AT+CNMI=2,1");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!Hand("OK"));
CLR_Buf();
led3=0;
delayms(2000);
Send_ASCII("AT+CMGF=1");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!Hand("OK"));
CLR_Buf();
led4=0;
delayms(2000);
Send_ASCII("AT+CMGD=1,4");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!Hand("OK"));
CLR_Buf();
led5=0;
while(1)
{
/* datapros(Ds18b20ReadTemp()); //数据处理函数
DigDisplay();//数码管显示函数 */
if (strstr(Rec_Buf,"+CMTI")!=NULL)
{
led6=~led6;
delayms(2000);
Send_ASCII("AT+CMGR=1");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!Hand("OK"));
led7=~led7;
if (strstr(Rec_Buf,"open led3")!=NULL)
{
led3=0;
Send_message();
}
else if (strstr(Rec_Buf,"close led3")!=NULL)
led3=1;
else if (strstr(Rec_Buf,"led=")!=NULL)
{
j=strstr(Rec_Buf,"led=");
j+=4;
while(*j!='\0')
{
o[l]=*j;
j++;
l++;
}
o[l]='\0';
led=atoi(o);
j=0;
l=0;
P0=0xff;
wei=1;
P0=0x00;
wei=0;
P0=0xff;
duan=1;
P0=smgduan[led];
duan=0;
}
CLR_Buf();
delayms(2000);
Send_ASCII("AT+CMGD=1,4");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!Hand("OK"));
CLR_Buf();
}
if(flag==1)
{
flag=0;
delayms(2000);
Send_ASCII("ATDTELL");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!(Hand("NO")||Hand("BUSY")));
CLR_Buf();
}
led8=1;
delayms(1000);
led8=0;
delayms(1000);
}
}
void sint () interrupt 4
{
ES=0;
if(TI)
{
TI=0;
}
if(RI)
{
RI=0;
Rec_Buf[i]=SBUF;
i++;
if(i>80)
{
i=0;
}
}
ES=1;
}
void int1() interrupt 2
{
EX1=0;
delayms(100);
if(key==0);
{
led1=~led1;
flag=1;
}
while(key==0);
delayms(100);
while(key==0);
EX1=1;
}