OpenEdv-开源电子网

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

51控制sim900a 发短信程序

[复制链接]

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-3-3
在线时间
0 小时
发表于 2014-3-3 12:46:58 | 显示全部楼层 |阅读模式

菜鸟来请教一下,求助个大神啊!!用51串口控制,我只可以实现打电话的,但是发短信的无论如何我都实现不了,求解救!!

大家有没有代码发上来共享一下?

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-3-3 21:14:01 | 显示全部楼层
根据我们SIM900A模块的教程,发送那些指令,就可以发送短信的。
估计是你最后的0X1A没发送对吧?呵呵,要16进制发送哦
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-3-3
在线时间
0 小时
 楼主| 发表于 2014-3-3 21:43:12 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我有写这一个的,那个是发送字节0x1a
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-3-3 21:55:15 | 显示全部楼层
回复【3楼】欧洲的松露:
---------------------------------
那你检查下看看是哪个地方出错了,可以用串口助手接收你51单片机发送的指令,来分析一下
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-3-3
在线时间
0 小时
 楼主| 发表于 2014-3-7 08:21:54 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
sim900a的波特率是115200,我将51单片机的初值设为0xff,smod=1;可是用串口助手接收到单片机发送的指令是乱码,(接线完全正确),这个是因为波特率吗,似乎51单片机达不到115200的波特率吧
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-3-7 16:22:48 | 显示全部楼层
回复【5楼】欧洲的松露:
---------------------------------
SIM900A是自适应波特率的,不一定是115200,你9600也可以啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-3-10
在线时间
0 小时
发表于 2014-3-10 23:08:28 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
我正在用mega16控制SIM900A打电话,可是不知道是波特率不同步还是延时的问题,苦无成果,这是程序,还请各位高手指点一下,谢谢!!!!!
#include <iom16v.h>
#include <macros.h>

#define uchar unsigned char
#define uint  unsigned int

#define RxIn 90 //定义接收的数组长度为90
#define mclk 8000000

#define RXD_PORT  DDRD = 0XFFORTD |= BIT(PD0) 

#define realy0   DDRB = 0XFFORTB = ~BIT(PB0)

uchar  AT[]="AT"; //握手信号
uchar  ATE[]="ATE0"; //关回显
uchar  AT_CNMI[]="AT+CNMI=2,1"; //设置这组参数来了新信息直接显示到串口,不作存储
//uchar  AT_CSCA[]="AT+CSCA=\"+8613800816500\""; //设置服务中心号码
uchar  AT_CSCS[]="AT+CSCS=\"GSM\"";

uchar  AT_CMGS_TPYTONGXIN[]="AT+CMGS=\"15694318277\"\r\n";

uchar  ok[]="OK!"; //发送操作成功信息到目标号码
uchar  fail[]="Operate Failed, Try again!"; //发送操作失败信息到目标号码
uchar at[]="ATD18780585524;";
uchar SystemBuf[RxIn]; //储存出口接收数据
uchar CommandBuf[6]; //用来存储指令

uchar state[17]; //用来存储IO口状态
uchar state1[17]; //用来存储IO口状态

uchar Rx=0;
uint temp; //记录状态
uchar temp1; //用记录P0口状态
uchar temp2; //用于记录P2口状态

uchar check=0; //查询标志位
uchar flag=0; //指令标志位
uchar sign=0;

// uchar 3_7=P3^7; //启动GSM的启动线连IGT
// uchar rdata;
// UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (7.8%)
void uart0_init(uint baud)
{
    UCSRB = 0x00; //disable while setting baud rate
    UCSRA = 0x00;
    UCSRC=(1<<URSEL)|(0><UPM0)|(3><<UCSZ0);
    baud=mclk/16/baud-1;
    UBRR=0x03;
    UCSRB=(1<<TXEN)|(1><<RXEN)|(1<<RXCIE);
    DDRD|=0X02;
}

#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{
    DDRB = 0XFF;
    ORTB &= ~0X01;
    //uart has received a character in UDR
    if(Rx><RxIn)
    {
        SystemBuf[Rx]=UDR;
        Rx++;
    }
    //Rx=0;
    ORTB |= 0X01;

}

//call this routine to initialize all peripherals
void init_devices(void)
{
    //stop errant interrupts until set up
    CLI(); //disable all interrupts
    //port_init();
    uart0_init(115200);

    MCUCR = 0x00;
    GICR  = 0x00;
    TIMSK = 0x00; //timer interrupt sources
    SEI(); //re-enable interrupts
    //all peripherals are now initialized
}

/********************************************************
** 函数void Delay_ms(uint i);    **
** 实现功能:进行毫秒延时    **
********************************************************/
void Delay_ms(uint i)
{
    uint x,y;
    for(x=0;x<i;x++)
        for(y=0;y<1141;y++);
}

/***********************************************************************
** 函数void sendchar(uchar ch);
实现功能:发送一字节数据
***********************************************************************/

void sendchar(uchar ch)
{
    while(!(UCSRA&(BIT(UDRE))));   
    UDR = ch;   
    while(!(UCSRA&(BIT(TXC))));  
    UCSRA |= BIT(TXC);   //清零
}


/***********************************************************************
** 函数void sendstring(uchar *p);
实现功能:通过串口发送字符串
***********************************************************************/
void sendstring(uchar *p)
{
    while(*p)
    {
        sendchar(*p);
        p++;
    }
    sendchar(0x0D);
    sendchar(0x0A);       //回车
}

/***********************************************************************
** 函数void sendstringEx(uchar *p);
        实现功能:通过串口发送字符串
***********************************************************************/
void sendstringEx(uchar *p)
{
    while(*p)
    {
        sendchar(*p);
        p++;
    }
}

/************************************************************************
**  函数void GSM_INIT(void);
实现功能:初始化TC35模块
************************************************************************/
void GSM_INIT(void)
{
    LOOP:
    Delay_ms(5000);
    sendstring(AT);

    Delay_ms(5000);
    sendstring(ATE);

    Delay_ms(5000);
    sendstring(AT_CSCS);

    Delay_ms(5000);
    sendstring(AT_CNMI);   //直接显示,不做存储

    Delay_ms(5000);

    for(Rx=0;Rx<RxIn;Rx++)
    {
        SystemBuf[Rx]=0x00;
    }
    Rx=0;
    Delay_ms(1000);

    sendstring(AT_CMGF);
    Delay_ms(2000);
    //  Delay_ms(2000);
    //2,3

    if((SystemBuf[2]==0X4F) && (SystemBuf[3]==0X4B)) //判断是否模块初始化成功,成功的话模块会回复“OK”给单片机
    {
        //sign=1;
        ORTB = 0X01;  //如果单片机没有收到OK,就继续发送初始化指令
        for(Rx=0;Rx<RxIn;Rx++)
        {
            SystemBuf[Rx]=0x00;
        }
        Rx=0;
    }
    else
    {
        for(Rx=0;Rx<RxIn;Rx++)
        {
            SystemBuf[Rx]=0x00;
        }
        Rx=0;

        goto LOOP;
    }
}
void main(void)
{
    Delay_ms(500); //延时大约10秒,等待模块联网
    init_devices();
    
    GSM_INIT();


    sendstringEx(AT_CMGS_TPYTONGXIN);
    Delay_ms(100);
    sendstring("ATD15694318277;");
    Delay_ms(100);
    sendchar(0X1A);
    while(1);
}>
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-3-22
在线时间
0 小时
发表于 2014-3-22 21:38:51 | 显示全部楼层
菜鸟最近在弄一个项目,用STC89系列单片机控制SIM900A给指定手机发送短信,求大神给分享个程序!!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-3-22 22:56:22 | 显示全部楼层
回复【7楼】李慧娟199310:
---------------------------------
你自己分析问题在哪里?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 22:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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