OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5247|回复: 4

SIM900A模块不能收到短信控制LED灯

[复制链接]

2

主题

5

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2016-5-7
在线时间
1 小时
发表于 2016-5-7 09:56:27 | 显示全部楼层 |阅读模式
2金钱
SIM900A模块用串口调试的时候功能正常
写的一段收到短信就控制LED灯的程序,这是买的时候附赠的资料例程,按理说应该没啥问题,为什么LED灯控制不了
#include<reg52.h>
#include<string.h>
#include<stdio.h>


//发kai时,led亮
//发guan时 led熄灭

//
//正常启动现象:焊接板子上的led亮灭各1秒钟时间,如果一直常亮,说明为初始化成功
//gsm模块上面的led,如果3S闪烁1次,说明正常连接上网络,如果快速亮灭说明还没有连接网络
//
//     11.0592 9600
//
//注意:所有的操作都需要在      gsm模块上面的led,3S闪烁 才能正常通信


sbit led_test=P1^5;
sbit led1=P2^7;


#define Buf_Max 60 //缓存长度200
#define Delay_Time 250  //延时长度

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()
{
unsigned int t=0;
unsigned char time_temp=0;

            led1=0;

            Serial_Init();         //初始化串口

            CLR_Buf();             //清除缓存内容
            Send_ASCII("AT");    //发送联机指令
            while(!Hand("OK"))     //判断是否握手成功,如果不成功延时一会,再发送AT握手指令
                {
                    Delay_ms(100);   //延时
                    time_temp++;
                    if(time_temp>10)
                    {
                    time_temp =0;
                    Send_ASCII("AT"); //发送联机指令
                    }
                }
                                                   
            time_temp =0;
            CLR_Buf();             //清除缓存内容
            Send_ASCII("ATE0");    //发送联机指令
            while(!Hand("OK"));     //判断是否握手成功,如果不成功延时一会,再发送AT握手指令


            time_temp =0;
            CLR_Buf();                //清除缓存内容
            Send_ASCII("AT+CMGF=1");    //发送联机指令
            while(!Hand("OK"));     //判断是否握手成功,如果不成功延时一会,再发送AT握手指令


            time_temp =0;
            CLR_Buf();                //清除缓存内容
            Send_ASCII("AT+CMGD=1,4");    //发送联机指令
            while(!Hand("OK"));     //判断是否握手成功,如果不成功延时一会,再发送AT握手指令


            time_temp =0;
            CLR_Buf();                //清除缓存内容
            t=0;

            while(1)
            {

                if(strstr(Rec_Buf,"+CMTI")!=NULL)    //若缓存字符串中含有"+CMTI"就表示有新的短信
                    {
                        CLR_Buf();                   //清除缓存内容

                        Send_ASCII("AT+CMGR=1");     //发送读取信息指令
                        while(!Hand("OK"));          //等待设置成功
                        
                                                                 
                           if(strstr(Rec_Buf,"kai")!=NULL)  //如果信息内容是"kai"
                                {led_test = 0;}                        
                        if(strstr(Rec_Buf,"guan")!=NULL) //如果信息内容是"guan"
                            {led_test = 1;}                          
                        CLR_Buf();         
                                             //清除缓存内容
                        
                        Send_ASCII("AT+CMGD=1,4");                //删除读取后的信息
                        while(!Hand("OK"));                        //等待设置成功

                        CLR_Buf();                              //清除缓存内容
                        t=0;
                    }

                     t++;     
                    if(t/2500){//正常工作 启动期间 //一次大约为  1S
                          t=0;
                          led1=~led1; //闪烁表示系统运行中,等待指令输入
                    }

            }      

}
/***************************串口初始化函数*****************************/
/*函数原型: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>(Buf_Max-1))          //如果缓存满,将缓存指针指向缓存的首地址
                {
                    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;                   //开串口中断
    Send_Hex(0x0d);           //发送回车符
     Send_Hex(0x0a);           //发送换行符
}
/****************************time ms延时函数***************************/
/*函数原型elay_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;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2016-5-7 10:43:38 | 显示全部楼层
查看下接收短信那部分的代码!!
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2016-5-7
在线时间
1 小时
 楼主| 发表于 2016-5-7 15:44:49 | 显示全部楼层
FantaSy_ 发表于 2016-5-7 10:43
查看下接收短信那部分的代码!!

我今天写了一个单片机接收到任意字符就点亮LED的程序测试了一下,然后打电话给SIM900A模块,发现打电话的时候LED灯不亮,应该是单片机没有接受到SIM900A模块传递的信号,原因最有可能是什么呢
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2016-5-9 23:52:50 | 显示全部楼层
那就说明没有接收到SIM900A的返回信息!!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-5-11 21:10:57 | 显示全部楼层
仿真调试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 15:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表