打印

sim900a配套程序

[复制链接]
810|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
开始吧|  楼主 | 2016-8-3 17:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大神们,我是430新手,需要把一段51程序改成msp430f5529的程序,是关于sim900a控制发送短信的程序,请问有会改的么?怎么改啊。。。。付51程序如下:
/**********************************************************************************
* 工程名  :发送文本短信
* 描述    :通过C51开发板控制模块发送一条TEXT短信
* 实验平台:C51
* 库版本  :
* 作者    :泥人通信模块开发平台团队


* 硬件连接说明
           使用单片串口与GPRS模块通信
           C51        GPRS模块
           P30 (RXD)->RXD
           P31 (TXD)->TXD
           GND            ->GND

* 软件功能说明
     板子上电后运行指示灯RUNING_LED会以一秒的频率闪烁
           打开代码修改短信中心号、接收方手机号和短信内容,编译成功后下载到单片机里面,就可以实现发送一条文本短信
**********************************************************************************/
#include "config.h"
#include "string.h"
#include "delay.h"
#include "uart.h"

#define Automatic_Startup 1     //定义自启动 V1.2版本起有自启动功能

#define Buf1_Max 200                                           //串口1缓存长度
/*************        本地常量声明        **************/
sbit RUNING_LED = P1^2;                                        //运行指示灯

static unsigned char *SMS_Num="\"+8613800551500\"";//短信中心号 关于中心号的介绍可以看串口调试笔记的第二部分
static unsigned char *phone="\"17756024503\"";     //短信接收方手机号
static unsigned char *content="sos摔倒";//发送短信内容
/*************  本地变量声明        **************/

xdata u8 Uart1_Buf[Buf1_Max];

u8 Times=0,First_Int = 0,shijian=0;

bdata u8 Flag;//定时器标志位
sbit Timer0_start =Flag^0;        //定时器0延时启动计数器


/*************        本地函数声明        **************/
void GPIO_config(void); //引脚初始化
void Timer0Init(void);  //定时器0初始化
void CLR_Buf1(void);    //清串口接收缓存
u8 Find(u8 *a);         //查找字符串
void Second_AT_Command(u8 *b,u8 *a,u8 wait_time);  //发送指令
void Wait_CREG(void);   //查询等待模块注册成功
void Set_Text_Mode(void); //设置短信为TEXT模式
void Send_Text_Sms(void); //发送一条TEXT短信
/*************  外部函数和变量声明*****************/




/*******************************************************************************
* 函数名 : main
* 描述   : 主函数
* 输入   :
* 输出   :
* 返回   :
* 注意   : 串口波特率是9600,GPRS模块默认波特率是115200,需要自己通过串口助手修改
                                     为9600方可使用。
*******************************************************************************/
void main(void)
{
          Timer0Init();  //初始化定时器0
          GPIO_config();
          EA=1;        //开总中断
          Uart1Init();    //初始化串口9600
          Wait_CREG();    //查询等待模块注册成功
          Set_Text_Mode();//设置短信为TEXT模式
          Send_Text_Sms();//发送一条短消息
          while(1)
          {
                  ;
          }
         
}

/*******************************************************************************
* 函数名 : Uart1
* 描述   : 串口1中断服务入口函数
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Uart1() interrupt 4
{
      if (RI)
      {
        RI = 0;                 //清除RI位
                          Uart1_Buf[First_Int] = SBUF;            //将接收到的字符串存到缓存中
                          First_Int++;                                        //缓存指针向后移动
                          if(First_Int > Buf1_Max)                       //如果缓存满,将缓存指针指向缓存的首地址
                          {
                                  First_Int = 0;
                          }
      }
      if (TI)
      {
          TI = 0;                 //清除TI位
      }
}
/*******************************************************************************
* 函数名 : Timer0_ISR
* 描述   : 定时器0中断服务入口函数,20ms中断一次
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Timer0_ISR() interrupt 1
{
          static u8 Time_count=0;
    TL0 = 0x00;                  //重置定时器初值
          TH0 = 0xB8;                  //重置定时器初值        
          TR0=0;//关定时器
          Time_count++;
          if(Time_count>=50)
          {
                  Time_count = 0;
                  RUNING_LED =~RUNING_LED;
          }
          if(count_20ms) //20ms延时计数器
                  count_20ms--;
          if(Timer0_start)
            Times++;
          if(Times > (50*shijian))
          {
                  Timer0_start = 0;
                  Times = 0;
          }
          TR0=1;//开定时器
}
/*******************************************************************************
* 函数名 : GPIO_config
* 描述   : IO口配置函数
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void        GPIO_config(void)
{
                  RUNING_LED=0;
}
/*******************************************************************************
* 函数名 : Timer0Init
* 描述   : 定时器0初始化,20ms定时
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Timer0Init(void)                //20毫秒@11.0592MHz
{
          AUXR &= 0x7F;                //定时器时钟12T模式
          TMOD &= 0xF0;                //
          TMOD |= 0x01;                //设置定时器模式,16位定时器
          TL0 = 0x00;                  //设置定时器初值
          TH0 = 0xB8;                  //设置定时器初值
          TF0 = 0;                    //清TF0标志
          TR0 = 1;                    //定时器0开始计时
          ET0 = 1;              //使能定时器0中断
}
/*******************************************************************************
* 函数名 : CLR_Buf1
* 描述   : 清除串口2缓存数据
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void CLR_Buf1(void)
{
          u16 k;
          for(k=0;k<Buf1_Max;k++)      //将缓存内容清零
          {
                  Uart1_Buf[k] = 0x00;
          }
      First_Int = 0;              //接收字符串的起始存储位置
}

/*******************************************************************************
* 函数名 : Find
* 描述   : 判断缓存中是否含有指定的字符串
* 输入   :
* 输出   :
* 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
* 注意   :
*******************************************************************************/

u8 Find(u8 *a)
{
    if(strstr(Uart1_Buf,a)!=NULL)
              return 1;
          else
                          return 0;
}

/*******************************************************************************
* 函数名 : Second_AT_Command
* 描述   : 发送AT指令函数
* 输入   : 发送数据的指针、希望收到的应答、发送等待时间(单位:S)
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/

void Second_AT_Command(u8 *b,u8 *a,u8 wait_time)         
{
          u8 i;
          u8 *c;
          c = b;                                                                                //保存字符串地址到c
          CLR_Buf1();
    i = 0;
          while(i == 0)                    
          {
                  if(!Find(a))           //查找需要应答的字符
                  {
                          if(Timer0_start == 0)//超时重新发送命令
                          {
                                  b = c;                                                 //将字符串地址给b
                                  for (b; *b!='\0';b++)
                                  {
                                          UART1_SendData(*b);
                                  }
                                  UART1_SendLR();        
                                  Times = 0;
                                  shijian = wait_time;
                                  Timer0_start = 1;  //开始计时
                     }
      }
            else
                  {
                          i = 1;
                          Timer0_start = 0;  
                  }
          }
          CLR_Buf1();
}

/*******************************************************************************
* 函数名 : Set_Text_Mode
* 描述   : 设置短信为TEXT文本模式
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Set_Text_Mode(void)
{
          unsigned char temp[50]="AT+CSCA=";
          Second_AT_Command("ATE0","OK",3);                                                                                //取消回显        
          Second_AT_Command("AT+CMGF=1","OK",3);                                                                //TEXT模式        
          Second_AT_Command("AT+CPMS=\"SM\",\"SM\",\"SM\"","OK",3);//所有操作都在SIM卡中进行
          strcat(temp,SMS_Num); //字符串拼接函数(库函数)
          Second_AT_Command(temp,"OK",3);//设置短信中心号
}
/*******************************************************************************
* 函数名 : Send_Text_Sms
* 描述   : 发送TEXT文本短信
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Send_Text_Sms(void)
{
          unsigned char temp[50]="AT+CMGS=";
         
          strcat(temp,phone); //字符串拼接函数(库函数)
          Second_AT_Command(temp,">",3); //等待接收到“>”才发送短信内容
          UART1_SendString(content);     //发送短信内容
          UART1_SendData(0X1A);          //发送结束符
}

/*******************************************************************************
* 函数名 : Wait_CREG
* 描述   : 等待模块注册成功
* 输入   :
* 输出   :
* 返回   :
* 注意   :
*******************************************************************************/
void Wait_CREG(void)
{
          u8 i;
          u8 k;
          i = 0;
          CLR_Buf1();
    while(i == 0)                                
          {
                  CLR_Buf1();        
                  UART1_SendString("AT+CREG?");//查询模块网络注册状态
                  UART1_SendLR();
                  delay_ms(250);                                                  
              for(k=0;k<Buf1_Max;k++)                              
              {
                          if(Uart1_Buf[k] == ':')
                          {
                                  if((Uart1_Buf[k+4] == '1')||(Uart1_Buf[k+4] == '5')) //表明网络注册成功
                                  {
                                          i = 1;
                                    break;
                                  }
                          }
                  }
          }
}

相关帖子

沙发
dirtwillfly| | 2016-8-3 17:39 | 只看该作者
貌似用的51的串口模块,这部分改到msp430基本就是重新写了。

使用特权

评论回复
板凳
dirtwillfly| | 2016-8-3 17:39 | 只看该作者

使用特权

评论回复
地板
开始吧|  楼主 | 2016-8-3 21:38 | 只看该作者
dirtwillfly 发表于 2016-8-3 17:39
貌似用的51的串口模块,这部分改到msp430基本就是重新写了。

完蛋了,我现在根本搞不定啊

使用特权

评论回复
5
开始吧|  楼主 | 2016-8-3 21:39 | 只看该作者
dirtwillfly 发表于 2016-8-3 17:39
直接参考现成的吧
http://wenku.baidu.com/link?url=JrCXNBBW8C_9WjQAo-rheZjAseYUY4cIlorVyOK7iHK6HnyZkCg ...

真的是参考啊,解释了一堆,代码程序没有,哎,,不过还是感谢群主大神

使用特权

评论回复
6
90houyidai| | 2016-8-3 22:49 | 只看该作者
msp430串口配置好,再把51的弄过来应该不难搞吧

使用特权

评论回复
7
dirtwillfly| | 2016-8-4 09:57 | 只看该作者
开始吧 发表于 2016-8-3 21:39
真的是参考啊,解释了一堆,代码程序没有,哎,,不过还是感谢群主大神 ...

这个链接有代码的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

68

帖子

0

粉丝