735953120@qq.co 发表于 2015-5-15 09:18:42

请问如何用stc单片机启动GPRS模块,并发出相关短信

最近没事,得到一个sim908的GPRS模块,请问如何用单片机向GPRS发送数据?模块自带的教程在电脑上已经调通,但是不知道如何去通过单片机与它进行通信;还有就是例程中定义了这样一个数组“uchar code tab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfd,0xff};//0-9,-,全灭 (共阳字段表)”,关于这个数组还有这样一句代码“   num= 0xff-tab;//共阴”,有没有做过的求解释,我查过这个东西既不是共阳极数码管的码值,也不是共阴极的,在这先谢谢了{:lol:}

735953120@qq.co 发表于 2015-5-15 09:19:41

这是例程所带的程序:
#include<reg52.h>
#include<absacc.h>
#include<stdio.h>

sbit P2_4=P2^4;
sbit P2_2=P2^2;
//---LED显示控制---------
sbit S1=P1^3;
sbit S2=P1^4;
sbit S3=P1^5;
sbit S4=P1^6;
sbit A1=P0^0;
sbit A2=P0^1;
sbitWD=P1^0;
sbitCLK=P1^2;                                 
sbitEN_LED=P1^1;
//-----------------------

#define uint unsigned int
#define uchar unsigned char

uchar num_c,num_d,num_sum,high_t;
uint time_add2,time_add,num_e;

uchar code tab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfd,0xff};//0-9,-,全灭 (共阳字段表)


#define RST      0X01
#define CMGF   0X02
#define CMGD   0X03
#define CREG   0X04
#define CMGR   0X05
#define CMGS   0X06
#define CSCA   0X07
#define ATDAT    0X08
#define TC35RET0X00


uint temp;


void delay(int de_u)
{int u,n;
//10us
for(u=0;u<de_u;u++)
{
for(n=0;n<1000;n++)
{;}
}
}

void Displaybyte(uchar byte)
{   
      uchar num,c;
      num= 0xff-tab;//共阴       
        EN_LED=0;EN_LED=1;       
                for(c=0;c<8;c++)
      {       
                        if(num&0x01)    //(0x80即十进制的128, 二进制的10000000 按位发送)              
                           WD=1;
                        else
                           WD=0;
                        num>>=1;
                        CLK=0;                                  
                          CLK=1;                      
      }
                delay(2);
//                Delay_ms(1);//A0;B0;C0;D0;//CLR_LED;       
}


#include"GSM.h"
void ATE0(void);
void delay_GSM(uint);
void init_serialcom( void );
void send_uart( unsigned char);
void ATNAME(void);
void AT_CMGS(void);
void AT_CSCA(void);
void AT_RST(void);
void AT_CREG(void);
void AT_CMGF(void);
void AT_CMGR(void);
void AT_CMGD(void);
void Init_T0 (void)   
{         
    TMOD = 0x21;   
    TH0 = (65536-10000) /256;
    TL0 = (65536-10000) %256;
    EA = 1;      
    ET0 = 1;
    TR0 = 1;      
}
void Time0_ISR(void)interrupt 1    using 0
{
TH0 = (65536-10000) /256; //初始值
TL0 = (65536-10000) %256;


}





main()
{
//--------初始化-------------------
init_serialcom();
//Init_T0();
//--------发三次关闭回显命令----------------
aaaaS1=1;S2=0;S3=0;S4=0;
Displaybyte(0X00);
delay_GSM(100);
ATE0();
Displaybyte(0X01);
delay_GSM(100);
TC35_MAX=0;
ATE0();
Displaybyte(0X02);
delay_GSM(100);
SMS_CONFIG();
//ATE0();
Displaybyte(0X03);
delay_GSM(100);
//------------------------------


for(i_TC35=0;i_TC35<=39;i_TC35++)
{TC35_RE=0;}
i_TC35_RECE=0;
TC35_MAX=0;

//P0_0是高电平就行这样P01会亮
//

ATE0();
while(1)
{
SEND_MESSAGE();
}



}

735953120@qq.co 发表于 2015-5-15 09:20:03

//----------------------------------------------
//本文件为存放子函数区域
//子函数功能为标准发送AT指令函数
//------------------------------------------------
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define RST      0X01
#define CMGF   0X02
#define CMGD   0X03
#define CREG   0X04
#define CMGR   0X05
#define CMGS   0X06
#define CSCA   0X07
#define ATDAT    0X08
#define TC35RET0X00
uchar TC35_CON;
uchar read_flag;
uchar i_TC35_RECE;
uchar i_receive,
      TC35_RE,
          TC35_MAX,
          i_TC35;
///////需要改动的地方//////其他省份请自己百度下/////////////////////////////////////////////
uchar code TC_MDSJ2[]={"15620323981"};      //目的手机地址,
//------------中心号可以不改,只要你的卡在手机可以发短信就行--------------------------------
uchar code TC_ZXH2[]={"+8613010130500"};      //天津联通本地中心号。
//uchar code TC_ZXH2[]={"+8613800220500"};      //天津移动本地中心号。
////////其他地方不要乱动////////////////////////////////////////////////////////
//----PDU这里不写手机号而是发送的字符数15+16=27 大家看视频可以理解27的意义
uchar code TC_MDSJ1[]={"AT+CMGS=31"};             //目的手机地址,

uchar code TC_ZXH1[]={"AT+CSCA="};            //本地中心号。
//--------以下为PDU格式短信-----------------------

//----------------------固定格式无法改变----
uchar code TC_FSNR1[]={"0011000D9168"};//固定死
//----------------------13135641653F----两两交换---------
uchar code TC_FSNR2[]={"3131651456F3"};
//----------------------固定格式无法改变----
uchar code TC_FSNR3[]={"0008AA"};
//----------------------下面的字符串格式除以二----
uchar code TC_FSNR4[]={"10"};
//-----------------------内容:昆新科技欢迎您!--------------------
//--http://tool.chinaz.com/Tools/UTF-8.aspx--这里查询-----
uchar code TC_FSNR5[]={"660665B079D162806B228FCE60A8FF01"};       //发送短信内容。

//--------以上为PDU格式短信------------------------------------------

uchar code TC_WLZT[]={"AT+CREG?"};                    //网络状态查询
//------0代表PDU格式也就是可以写中文的格式---------------------------
uchar code TC_MSXZ[]={"AT+CMGF=0"};                    //发送模式选择。
uchar code TC_DQML[]={"AT+CMGR=1"};                    //短信读取命令。
uchar code TC_SCML[]={"AT+CMGD=1"};                    //短信删除命令。
uchar code TC_ATF[]={"AT&F"};                      //格式化命令。
uchar code TC_ATE0[]={"ATE0"};                      //清除回显命令
uchar code TC_SMS_1[]={"AT+CNMI=2,1,0;"};          //短信通知命令


void delay_GSM(uint i)
{unsigned int i_delay,j_delay;
for(i_delay=0;i_delay<i;i_delay++)
{for(j_delay=0;j_delay<100;j_delay++){;}}
}
void init_serialcom( void )
   {
       SCON = 0x50 ;//SCON: serail mode 1, 8-bit UART, enable ucvr   
                         //UART为模式1,8位数据,允许接收
          TMOD |= 0x21 ; //TMOD: timer 1, mode 2, 8-bit reload            
                         //定时器1为模式2,8位自动重装
          PCON |= 0x00 ; //SMOD=1;
          TH1 = 0xFD ;   //Baud:9600 fosc="11".0592MHz
          IE |= 0x90 ;   //Enable Serial Interrupt
          TR1 = 1 ;       // timer 1 run
          TI=1;
   
       }         

//向串口发送一个字符
void send_uart( char a_s)
         { // TI= 0 ;
         
            while (TI!=1){;}
            SBUF=a_s;
               TI= 0 ;
                          
          }
//串口接收中断函数
void serial () interrupt 4 using 3
{
    if (RI)
          {
      RI = 0 ;
      i_receive=SBUF;
      TC35_RE=i_receive;
          // i_TC35_RECE++;
             if(i_TC35_RECE>TC35_MAX){TC35_MAX=i_TC35_RECE;}

            }
}

void SMS_CONFIG()
{
uchar i;
for(i=0;i<sizeof(TC_SMS_1)-1;i++)
{send_uart(TC_SMS_1);}
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=RST;
}

void ATE0()
{
uchar i;
for(i=0;i<sizeof(TC_ATE0)-1;i++)
{send_uart(TC_ATE0);}
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=RST;
}
void ATNAME()
{//短信内容
uchar i;
for(i=0;i<sizeof(TC_FSNR1)-1;i++)
{send_uart(TC_FSNR1);}
for(i=0;i<sizeof(TC_FSNR2)-1;i++)
{send_uart(TC_FSNR2);}
for(i=0;i<sizeof(TC_FSNR3)-1;i++)
{send_uart(TC_FSNR3);}
for(i=0;i<sizeof(TC_FSNR4)-1;i++)
{send_uart(TC_FSNR4);}
for(i=0;i<sizeof(TC_FSNR5)-1;i++)
{send_uart(TC_FSNR5);}
delay_GSM(1000);
send_uart(0X1A);
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=ATDAT;
}
//写目的手机的
void AT_CMGS()
{//AT+CMGS=13132061066
uchar i;
for(i=0;i<sizeof(TC_MDSJ1)-1;i++)
{send_uart(TC_MDSJ1);}

send_uart(0X22);
for(i=0;i<sizeof(TC_MDSJ2)-1;i++)
{send_uart(TC_MDSJ2);}
send_uart(0X22);
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CMGS;
}
//写信息中心号
void AT_CSCA()
{//AT+CSCA=+8613010130500
uchar i;
for(i=0;i<sizeof(TC_ZXH1)-1;i++)
{send_uart(TC_ZXH1);}
send_uart(0X22);
for(i=0;i<sizeof(TC_ZXH2)-1;i++)
{send_uart(TC_ZXH2);}

send_uart(0X22);

send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CSCA;
}
//AT复位指令
void AT_RST()
{
uchar i;
for(i=0;i<sizeof(TC_ATF)-1;i++)
{send_uart(TC_ATF);}
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=RST;
}
//AT网络状态查询指令
void AT_CREG()
{
uchar i;
for(i=0;i<sizeof(TC_WLZT)-1;i++)
{send_uart(TC_WLZT);}
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CREG;
}
//AT接收格式指令
void AT_CMGF()
{//AT+CMGF=1
uchar i;
for(i=0;i<sizeof(TC_MSXZ)-1;i++)
{send_uart(TC_MSXZ);}
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CMGF;
}
//AT短消息读取指令
void AT_CMGR()
{//AT+CMGR=1
uchar i;
for(i=0;i<sizeof(TC_DQML)-1;i++)
{send_uart(TC_DQML);}
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CMGR;
}
//AT短消息删除指令
void AT_CMGD()
{//AT+CMGD=1
uchar i;
for(i=0;i<sizeof(TC_SCML)-1;i++)
{send_uart(TC_SCML);}
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CMGD;
}
void SEND_MESSAGE()
{


delay_GSM(10);
if(TC35_MAX>0)
{
if(TC35_CON==RST){
if((TC35_RE=='O')&&(TC35_RE=='K'))
{
S1=0;S2=1;S3=0;S4=0;
Displaybyte(0X00);

TC35_CON=TC35RET;
delay_GSM(10);
AT_CMGF();

}
//如果不成功则重新关闭回显
else{delay_GSM(10);
ATE0();
}
}
else if(TC35_CON==CMGF){

if((TC35_RE=='O')&&(TC35_RE=='K'))
{
S1=0;S2=1;S3=0;S4=0;
Displaybyte(0X01);
TC35_CON=TC35RET;
delay_GSM(10);
AT_CREG();


}
else{AT_CMGF();;}

}
else if(TC35_CON==CREG){
if((TC35_RE=='1')||(TC35_RE=='5'))
{
S1=0;S2=1;S3=0;S4=0;
Displaybyte(0X02);
TC35_CON=TC35RET;
//AT_CSCA();如果写中心号就必须写对,如果不写也无影响,写错会发不出去短信的
AT_CMGS();

}
else{
S1=0;S2=0;S3=1;S4=0;
Displaybyte(0X00);
AT_CREG();


}
}
/*
else if(TC35_CON==CMGD){;}
//填写信息中心号
else if(TC35_CON==CSCA)
{
delay_GSM(10);
if((TC35_RE=='O')&&(TC35_RE=='K'))
{

TC35_CON=TC35RET;
S1=0;S2=1;S3=0;S4=0;
Displaybyte(0X03);
delay_GSM(100);AT_CMGS();
}
//如果没出现CALL READY 则重新初始化
else if((TC35_RE=='+'))
{ delay_GSM(100);AT_CSCA();}
else{AT_CSCA();}
}*/

//填写发送内容
else if(TC35_CON==CMGS){

delay_GSM(10);
if((TC35_RE==0X3E)&&(TC35_RE==0X20))
{
S1=0;S2=1;S3=0;S4=0;
Displaybyte(0X04);
TC35_CON=TC35RET;
delay_GSM(100);ATNAME();}
else{AT_CMGS();}
}
//发送完毕返回继续扫描接收
else if(TC35_CON==ATDAT){
delay_GSM(10);
if(TC35_RE=='+')
{
S1=0;S2=1;S3=0;S4=0;
Displaybyte(0X05);
TC35_CON=TC35RET;
delay_GSM(1000);AT_CMGR();
}
else{
for(i_TC35=0;i_TC35<=29;i_TC35++)
{TC35_RE=0;}
i_TC35_RECE=0;
TC35_MAX=0;
S1=0;S2=1;S3=0;S4=0;
Displaybyte(0X06);
delay_GSM(1000);AT_CMGS();}
}
//复位接收组
for(i_TC35=0;i_TC35<=39;i_TC35++)
{TC35_RE=0;}
i_TC35_RECE=0;
TC35_MAX=0;
}
}






北漂的木木 发表于 2015-5-15 09:56:57

这个模块应该带有串口、USB口、IIC等接口,单片机通常用串口通讯。收发数据用串口不可以么?

fancyboy 发表于 2015-5-15 14:46:44

表述不清楚啊,也没说明你想干什么...gsm模块AT指令很简单

mybigapple 发表于 2015-6-4 14:06:36

你得有模块sim908的GPRS的引脚定义。一般是用串口与单片机连接。单片机配置为最小系统,就可用软件控制模块sim908的GPRS了。

735953120@qq.co 发表于 2015-6-7 14:58:07

北漂的木木 发表于 2015-5-15 09:56
这个模块应该带有串口、USB口、IIC等接口,单片机通常用串口通讯。收发数据用串口不可以么? ...

是串口,可以收发数据的

735953120@qq.co 发表于 2015-6-7 14:59:47

fancyboy 发表于 2015-5-15 14:46
表述不清楚啊,也没说明你想干什么...gsm模块AT指令很简单

我就想搞明白的是,单片机通过串口给SIM908发的是啥?还有就是这个数组是干嘛用的“uchar code tab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfd,0xff};

735953120@qq.co 发表于 2015-6-7 15:01:45

mybigapple 发表于 2015-6-4 14:06
你得有模块sim908的GPRS的引脚定义。一般是用串口与单片机连接。单片机配置为最小系统,就可用软件控制模块 ...

这些都有呢,这是不明白短信是如何发出去的,我在网上看了好多资料他说是发的AT指令,我就是不明白如果是AT指令的话一般要发几个指令

lindabell 发表于 2015-6-7 16:00:37

找他的手册,里面会告诉你怎么使用AT指令的

735953120@qq.co 发表于 2015-6-7 18:07:11

lindabell 发表于 2015-6-7 16:00
找他的手册,里面会告诉你怎么使用AT指令的

看了,但是我想让他根据不同的情况发送不同的信息,但是不知在程序里面设置,所以想搞清楚数据流向

小咯咯怒 发表于 2015-6-7 19:38:21

碰巧最近我给别人做毕设的时候也用过他家这个模块。很简单的,只要明白单片机的串口回事儿就可以。都是通过串口发AT开头的指令就可以,成功会回发OK。买的时候给的资料足够了。
楼主问这个问题花钱注册会员提问也是够拼了,其实你可以问他家的客服,态度蛮好的。

小咯咯怒 发表于 2015-6-7 19:41:39

数码管的码值也得根据你怎么接线来定的。

735953120@qq.co 发表于 2015-6-9 11:06:39

小咯咯怒 发表于 2015-6-7 19:38
碰巧最近我给别人做毕设的时候也用过他家这个模块。很简单的,只要明白单片机的串口回事儿就可以。都是通过 ...

恩恩,谢谢了;用单片机只是我用来测试的SIM908的好坏,实际上我要用PC机控制这个模块发送短信,说白了就是自己编写了个串口软件,当我PC机通过串口收到符合的数据时,我就发送短信,否则就不发;因此我要弄明白,单片机通过串口是如何让他发,还有就是整个过程一共都有哪些指令

735953120@qq.co 发表于 2015-6-9 11:08:14

小咯咯怒 发表于 2015-6-7 19:41
数码管的码值也得根据你怎么接线来定的。

恩恩,好吧;可否举个例子,还是有点小疑惑

小咯咯怒 发表于 2015-6-10 18:49:00

735953120@qq.co 发表于 2015-6-9 11:06
恩恩,谢谢了;用单片机只是我用来测试的SIM908的好坏,实际上我要用PC机控制这个模块发送短信,说白了就 ...

不用自己编写串口软件,随便一个串口工具就可以的。指令文档里都有写。数码管的工作原理在网上也有很多,自己多看看就会了。
页: [1]
查看完整版本: 请问如何用stc单片机启动GPRS模块,并发出相关短信