打印

TC35i的modem模块的控制

[复制链接]
2792|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangchaoran|  楼主 | 2012-11-20 12:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
anazel| | 2012-11-20 13:31 | 只看该作者
用串口控制

使用特权

评论回复
板凳
wangchaoran|  楼主 | 2012-11-20 18:39 | 只看该作者
是的,电平转换能用MAX232吗?怎么连

使用特权

评论回复
地板
ulic| | 2012-11-20 18:43 | 只看该作者
怎么样才能拿到积分?

使用特权

评论回复
5
wangchaoran|  楼主 | 2012-11-20 18:49 | 只看该作者
我不知道,我也是新手,大哥你能回答小弟问的问题吗?

使用特权

评论回复
6
huanben| | 2012-11-20 20:51 | 只看该作者
单片机直接直连。MAX是连接到电脑的。

使用特权

评论回复
7
huanben| | 2012-11-20 20:51 | 只看该作者
也就是说 不用MAX芯片。IO端口直接连接模块控制端口。注意电平匹配。

使用特权

评论回复
8
wangchaoran|  楼主 | 2012-11-21 08:22 | 只看该作者
但我的模块式TC35i的modem(是PCB板,做的时候就已经把MAX3238连上了,因此该模块可以直接连电脑),如果想用单片机控制是不是得再加一个MAX232啊?

使用特权

评论回复
9
anazel| | 2012-11-21 13:55 | 只看该作者
单片机要再加个232才行

使用特权

评论回复
10
wangchaoran|  楼主 | 2012-11-22 22:03 | 只看该作者
但还是不行啊,是不是程序有问题啊,请大家指教,若成功,小弟愿答谢帮小弟解决问题的大哥
#include<stdio.h>
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
//函数定义
void main(void);
void ckcsh(void);
void AT(void);
void CMGF(void);
void CMGS(void);
void SEND(void);
void delay(void);
//*********************************************主函数
void main()
{
        ckcsh();
        AT();
        delay();
        CMGF();
        delay();
        CMGS();
        delay();
        SEND();
        delay(); delay();delay();delay();delay();delay();delay();delay();delay();delay();
}
//*******************************************串口初始化函数
void ckcsh(void)
{
        SCON=0x40;//串口工作方式1,REN=0不接收数据
        PCON=0x00;//波特率不加倍
        TMOD=0x20;//定时1,方式2
        TH1=0xfd; //装入初值
        TL1=0xfd; //装入初值
        TR1=1;//计时开始
        TI=0;
        RI=0;
        ES=0;//串口中断禁止                                                                                                          
    ET1=0;//定时器1禁止
}
//***********************************************at指令函数
void AT()
{
        uchar at[]="AT\r\n";//发送at指令,\r\n回车换行发送
        uint i=0;
        while(at[i]!='\0')
        {
                SBUF=at[i];  
                while(TI==0);
                TI=0;
                i++;
        }
}
void CMGF()//****************************************设置文本格式函数
{
        uchar CMGF[]="AT+CMGF=1\r\n";//设置文本格式
        uint i=0;
        while(CMGF[i]!='\0')
        {
                SBUF=CMGF[i];  
                while(TI==0);
                TI=0;
                i++;
        }
}
void CMGS()        //*********************************设这发送号码函数
{
        uchar CMGS[]="AT+CMGS=\"15933775581\"\r\n";//设置发送号码
        uint i=0;
        while(CMGS[i]!='\0')
        {
                SBUF=CMGS[i];  
                while(TI==0);
                TI=0;
                i++;
        }
}
void SEND()        //********************************发送函数
{
        uchar SEND[]="hello\0x1A";//ctrl+z为\x01A
        uint i=0;
        while(SEND[i]!='\0')
        {
                SBUF=SEND[i];
                while(TI==0);
                TI=0;
                i++;
        }
}

void delay()   
{
    uint i,j;
        for(i=0;i<255;i++)
        {
                for(j=0;j<255;j++);
        }
}

使用特权

评论回复
11
wangchaoran|  楼主 | 2012-11-22 22:08 | 只看该作者
比较郁闷的是,用PC可以控制GSM发送短信,把上述程序烧录到STC89C52中然后用串口助手也可看到各个AT指令,求指教

使用特权

评论回复
12
ichenqiang| | 2012-11-22 22:16 | 只看该作者
/**************http://tpytongxin.taobao.com/****************/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit Send_SMS_PDU_key=P1^4;     //发PDU格式短信按键
sbit LED0=P0^0;
sbit LED1=P0^1;
sbit LED2=P0^2;
sbit LED3=P0^3;

#define MAXCHAR 81
uchar  aa[MAXCHAR];
code uchar ATE0[]="ATE0\r\n";
code uchar CREG_CMD[]="AT+CREG?\r\n";
code uchar SMS_send[]="AT+CMGS=32\r\n";
code uchar ATCN[]="AT+CNMI=2,1\r\n";
code uchar CMGF[]="AT+CMGF=0\r\n";
code uchar CMGR[12]="AT+CMGR=1\r\n";
code uchar CMGD[12]="AT+CMGD=1\r\n";

/*-----------------------------------------------------------------------
1.如果你的晶振是11.0592M
只需要修改下面的号码就可以了,给成你手上拿着的手机的号码


修改方法   在下面这段字符中找到 5129021411F5

其实5129021411F5 --> 15922041115
        8106428517F5                                  18602458715

看明白了吗  电话是两位两位颠倒 将您手上的手机号码替换即可
-----------------------------------------------------------------------*/
uchar  code Sms2_Pdu[]="0891683108100005F011000B818106428517F50008A712521B601D901A4FE1002D96F75DE54EB26D4B";
/*-----------------------------------------------------------------------
1.如果你的晶振不是11.0592M

则修改 Ini_UART 函数 波特率 9600


其他都不用动

-----------------------------------------------------------------------*/

uchar a,j=0,flag=0;

void delay(uint ms)// 延时子程序
{
    uchar i;
    while(ms--)
    {
        for(i=0;i<120;i++);
    }
}


/***********************************************************
函数名称:Print_Char
函数功能:发送单个字符
          入口参数:ch      出口参数:无
***********************************************************/
Print_Char(uchar ch)//发送单个字符
{
    SBUF=ch; //送入缓冲区
    while(TI!=1); //等待发送完毕
    TI=0; //软件清零
}

/***********************************************************
函数名称:Print_Str
函数功能:发送字符串
          入口参数:*str    出口参数:无
***********************************************************/
Print_Str(uchar *str)//发送字符串
{

    while(*str!='\0')
    {
        Print_Char(*str);
        delay(2);
        str++;
    }

}

/***********************************************************
函数名称:Ini_UART
函数功能:串口初始化、定时器初始化
          入口参数:无     出口参数:无
***********************************************************/
Ini_UART(void)//串口初始化、定时器初始化
{
    SCON = 0x50 ;  //SCON: serail mode 1, 8-bit UART, enable ucvr
    //UART为模式1,8位数据,允许接收
    TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
    //定时器1为模式2,8位自动重装
    PCON |= 0x80 ; //SMOD=1;
    TH1 = 0xFA ;   //Baud:19200 fosc="11".0592MHz
    TL1=0xFA;
    IE |= 0x90 ;     //Enable Serial Interrupt
    TR1 = 1 ;       // timer 1 run
    TI=1;
    ES=1;
}

void clearBuff(void)
{
    for(j=0;j<MAXCHAR;j++)
    {
        aa[j]=0x00;
    }
    j=0;
}

void led(int i)
{
    P2 |= i;
    delay(20);
    P2 &= ~i;
    delay(20);
    P2 |= i;
    delay(20);
    P2 &= ~i;
}



void AT(void)
{

    while(1)
    {
        Print_Str(ATE0);
        delay(50);

        Print_Str(ATCN);
        delay(50);

        Print_Str(CMGF);
        delay(100);

        clearBuff();
        Print_Str(CREG_CMD);
        delay(50);




        if(((aa[9]=='0')&&(aa[11]=='1'))||((aa[9]=='0')&&(aa[11]=='5')))
        {
            clearBuff();
            led(0x02);
            break;
        }
        else
        {
            clearBuff();

            led(0x01);
            delay(50);
        }
    }
}


void main()
{
    j=0;

    Ini_UART();
    AT();

    delay(10);

    Print_Str(SMS_send);

    delay(200);
    led(0x04);
    Print_Str(Sms2_Pdu);
    delay(100);
    led(0x08);
    Print_Char(0x1A);
    while(1);
}

void ser() interrupt 4
{



    if(RI==1)
    {  aa[j]=SBUF;//命令存到命令数组

        RI=0; //软件清除接收中断
        j++;
    }


}

你参考下

使用特权

评论回复
13
wangchaoran|  楼主 | 2012-11-22 22:28 | 只看该作者
晶振是11.0592,大哥的意思是把号码设置函数改为下面,其他的均不动???
void CMGS()        //*********************************设这发送号码函数
{
        uchar CMGS[]="AT+CMGS=\"5139735785F1\"\r\n";//设置发送号码
        uint i=0;
        while(CMGS[i]!='\0')
        {
                SBUF=CMGS[i];  
                while(TI==0);
                TI=0;
                i++;
        }
}

使用特权

评论回复
14
chunyang| | 2012-11-22 22:28 | 只看该作者
如果楼主买的模块上有232电平转换芯片,在与MCU直连时应先拆掉,否则要在你的MCU系统上加232电平转换。
连接时注意线序,Modem类的连接方法是顺序连接即TXD-TXD、RXD-RXD,另外注意正确的触发启动,电源要满足峰值2A输出的要求,纹波务必控制在50mV以下,越低越好。
模块启动后,给任何合法的AT指令,模块都应有相应回应,否则检查前面说的几点。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
wangchaoran + 1 不是这的原因,不过还是很谢谢!!!但我只.
15
wangchaoran|  楼主 | 2012-11-23 08:29 | 只看该作者
您说的我不太懂,买的就是一个模块(外壳上写有GSM MODEM),本身就带着电源,GSM直接和PC可以发送短信,单片机连PC通过串口助手也可看到所发AT指令(程序为10楼),但就是单片机不能控制GSM,我也是按照T-T,R-R连线的。现在我在怀疑是程序的问题了

使用特权

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

本版积分规则

9

主题

61

帖子

3

粉丝