用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;
}
...全文
253 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
YZX@ 2019-04-13
  • 打赏
  • 举报
回复
这楼主,谁没事看你这么长的代码
jklinux 2017-05-28
  • 打赏
  • 举报
回复
这种与硬件有关的问题,光看代码也很难看出问题的。 建议楼主,先确定硬件工作正常先。 1. GSM模块可以用ttl转usb或者转232接到PC上,用串口调试工具发AT指令,确定是可以工作 2. 把单片机板上的uart接口也用ttl转usb/232接到pc上测试,确定接收/发送都是正常的 如果都正常,再检查代码了
2022 / 01/ 30: 新版esptool 刷micropython固件指令不是 esptool.py cmd... 而是 esptool cmd... 即可;另外rshell 在 >= python 3.10 的时候出错解决方法可以查看:  已于2022年发布的: 第二章:修复rshell在python3.10出错 免费内容: https://edu.csdn.net/course/detail/29666 micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机玩物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。为记录单片机传输过来的数据, 本教程会教大家入门数据库。  本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 本教程micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。  学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)  

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧