找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8589|回复: 10
收起左侧

基于51单片机的GSM模块C语言发送短信程序

  [复制链接]
ID:161074 发表于 2017-1-10 10:20 | 显示全部楼层 |阅读模式
#include<reg52.h>
#include<absacc.h>
#include<stdio.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 TC35RET 0X00
sbit IGT=P1^0;

uchar TC35_CON;
uchar i_TC35_RECE;
uchar TC35_RE[30],
   TC35_MAX,
   i_TC35;
extern uchar TC35_CON;
extern uchar i_TC35_RECE;
extern uchar i_receive,
      TC35_RE[30],
   TC35_MAX,
   i_TC35;
void delay(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);

uchar code TC_MDSJ[]={"AT+CMGS=13969138509"};
//目的手机地址,
uchar code TC_ZXH[]={"AT+CSCA=+8613800531500"};
//本地中心号。
////////其他地方不要乱动//
uchar code TC_FSNR[]={"zhangkaiqiang"};            
//发送短信内容。
uchar code TC_WLZT[]={"AT+CREG?"};            
//网络状态查询
uchar code TC_MSXZ[]={"AT+CMGF=1"};            
//发送模式选择。
uchar code TC_DQML[]={"AT+CMGR=1"};            
//短信读取命令。
uchar code TC_SCML[]={"AT+CMGD=1"};            
//短信删除命令。
uchar code TC_ATF[]={"AT&F"};               
//格式化命令。
void delay(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 |= 0x20 ;
    //TMOD: timer 1, mode 2, 8-bit reload            
    //定时器1为模式2,8位自动重装
    PCON |= 0x80 ; //SMOD=1;
    TH1 = 0xFD ;   //Baud:19200 fosc="11".0592MHz
    IE |= 0x90 ;     //Enable Serial Interrupt
    TR1 = 1 ;       // timer 1 run
    TI=1;        
}         
//向串口发送一个字符
void send_uart( unsigned char ch)
{
    while (TI==0);
    TI= 0 ;
    SBUF=ch;
}
//串口接收中断函数
void serial () interrupt 4 using 3
{
    if (RI)
    {
        RI = 0 ;
        i_receive=SBUF;
        TC35_RE[i_TC35_RECE++]=i_receive;
        // i_TC35_RECE++;
        if(i_TC35_RECE>TC35_MAX)
        {
            TC35_MAX=i_TC35_RECE;
        }
    }
}
void ATNAME()
{

    uchar i;
    for(i=0;i<sizeof(TC_FSNR)-1;i++)
    {
        send_uart(TC_FSNR[i]);
    }
    delay(1000);
    send_uart(0X1A);
    TC35_CON=ATDAT;
}
//写目的手机的
void AT_CMGS()
{
    uchar i;
    for(i=0;i<sizeof(TC_MDSJ)-1;i++)
    {
        send_uart(TC_MDSJ[i]);
    }
    send_uart(0X0D);
    send_uart(0X0D);
    send_uart(0X0A);
    TC35_CON=CMGS;
}
//写信息中心号
void AT_CSCA()
{
    uchar i;
    for(i=0;i<sizeof(TC_ZXH)-1;i++)
    {
        send_uart(TC_ZXH[i]);
    }
    send_uart(0X0D);
    send_uart(0X0D);
    send_uart(0X0A);
    TC35_CON=CSCA;
}
//AT复位指令
void AT_RST()
{
    uchar i;
    for(i=0;i<sizeof(TC_ATF)-1;i++)//TC_ATF:格式化命令。
    {
        send_uart(TC_ATF[i]);
    }
    send_uart(0X0D);
    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[i]);
    }
    send_uart(0X0D);
    send_uart(0X0D);
    send_uart(0X0A);
    TC35_CON=CREG;
}
//AT接收格式指令
void AT_CMGF()
{
    uchar i;
    for(i=0;i<sizeof(TC_MSXZ)-1;i++)//TC_MSXZ:发送模式选择。
    {
        send_uart(TC_MSXZ[i]);
    }
    send_uart(0X0D);
    send_uart(0X0D);
    send_uart(0X0A);
    TC35_CON=CMGF;
}
//AT短消息读取指令
void AT_CMGR()
{
    uchar i;
    for(i=0;i<sizeof(TC_DQML)-1;i++)
    {
        send_uart(TC_DQML[i]);
    }
    send_uart(0X0D);
    send_uart(0X0D);
    send_uart(0X0A);
    TC35_CON=CMGR;
}
//AT短消息删除指令
void AT_CMGD()
{
    uchar i;
    for(i=0;i<sizeof(TC_SCML)-1;i++)
    {
        send_uart(TC_SCML[i]);
    }
    send_uart(0X0D);
    send_uart(0X0D);
    send_uart(0X0A);
    TC35_CON=CMGD;
}

void delay1(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=19;c>0;c--)
        for(b=20;b>0;b--)
            for(a=150;a>0;a--);
}
void GSM(void)
{  
uchar shou=100;
IGT=0;
delay1();
IGT=1;
    init_serialcom(); //初始化串口
    delay(100);
    TC35_MAX=0;
    AT_RST();
    while(shou--)
    {
        delay(100);
        if(TC35_MAX>0)
        {
            if(TC35_CON==RST)//TC35_CON==0x01
            {
                if((TC35_RE[7]=='O')&&(TC35_RE[8]=='K'))
                {
                    TC35_CON=TC35RET;
                    AT_CMGF();
                }
                else
                {}  
            }
            //AT+CMGF 优先信息格式。执行格式有TEXT 方式和PDU 方式。
            else if(TC35_CON==CMGF) //TC35_CON==0x02
            {
                if((TC35_RE[12]=='O')&&(TC35_RE[13]=='K'))
                {
                    TC35_CON=TC35RET; // delay(100);
                    AT_CREG();
                }
                else
                {}
            }
            //AT+CREG 网络注册。获得手机的注册状态。
            else if(TC35_CON==CREG)//TC35_CON==0x04
            {
                if(((TC35_RE[18]=='0')&&(TC35_RE[20]=='1'))||((TC35_RE[18]=='0')&&(TC35_RE[20]=='5')))
                {
                    TC35_CON=TC35RET;
                    AT_CMGD();
                }
                else
                {
                    AT_CREG();
                }
            }
//AT+CMGR 读短信。信息从+CPMS 命令设定的存储器读取。
            else if(TC35_CON==CMGR)//TC35_CON==0x05
            {
                if(TC35_MAX<=30)
                {
                    AT_CMGR();
                }
                else //if((TC35_MAX==77)||(TC35_MAX==79))
                {

                    if(TC35_RE[69]=='0')
                    {
                        TC35_CON=TC35RET;
                        delay(100);
                        AT_CMGD();
                    }
                    else if(TC35_RE[69]=='1')
                    {
                        TC35_CON=TC35RET;
                        delay(100);
                        AT_CMGD();
                    }
                    else if(TC35_RE[69]=='2')
                    {

                        TC35_CON=TC35RET;
                        delay(100);
                        AT_CMGD();
                    }
                    else if(TC35_RE[69]=='3')
                    {
                        TC35_CON=TC35RET;
                        delay(100);
                        AT_CMGD();
                    }
                    else if(TC35_RE[69]=='4')
                    {
                        TC35_CON=TC35RET;
                        delay(100);
                        AT_CMGD();
                    }
                    else if(TC35_RE[69]=='5')
                    {

                        TC35_CON=TC35RET;
                        delay(100);
                        AT_CMGD();
                    }
                    else if(TC35_RE[69]=='6')
                    {

                        TC35_CON=TC35RET;
                        delay(100);
                        AT_CMGD();
                    }
                    else if(TC35_RE[69]=='7')
                    {

                        TC35_CON=TC35RET;
                        delay(100);
                        AT_CMGD();
                    }
                    else
                    {
                        TC35_CON=TC35RET;
                        AT_CMGR();
                    }
                }
            }
//AT+CMGD 删除短信息。删除一个或多个短信息。
            else if(TC35_CON==CMGD)//TC35_CON==0x03
            {
                delay(100);
                if((TC35_RE[12]=='O')&&(TC35_RE[13]=='K'))
                {
                    AT_CSCA();
                }
                else
                {
                }
            }
            //AT+CSCA 短信服务中心地址。
            else if(TC35_CON==CSCA)//TC35_CON==0x07
            {
                delay(100);
                if((TC35_RE[25]=='O')&&(TC35_RE[26]=='K'))
                {

                    AT_CMGS();
                }
                else
                {
                }
            }
            //填写发送内容
            else if(TC35_CON==CMGS)//TC35_CON==0x06
            {
                delay(100);
                if((TC35_RE[22]==0X3E)&&(TC35_RE[23]==0X20))
                {

                    ATNAME();
                }
                else{}
            }
            //发送完毕返回继续扫描接收
            else if(TC35_CON==ATDAT)//0x08
            {
                delay(100);
                if((TC35_RE[0]=='+')||(TC35_RE[0]==0x1A))
                {
                    AT_CMGR();
                }
                else
                {}
            }
            //复位接收组
            for(i_TC35=0;i_TC35<=TC35_MAX;i_TC35++)
            {
                TC35_RE[i_TC35]=0;
            }
            i_TC35_RECE=0;
            TC35_MAX=0;
        }
    }
}
void main()
{
    GSM();

}

回复

使用道具 举报

ID:161074 发表于 2017-1-10 10:21 | 显示全部楼层
不懂的同学直接问我
回复

使用道具 举报

ID:186936 发表于 2017-7-26 08:06 | 显示全部楼层
958809860 发表于 2017-1-10 10:21
**** 作者被禁止或删除 内容自动屏蔽 ****

你好,我现在在学51我想学习GSM模块可以教教我吗
回复

使用道具 举报

ID:247049 发表于 2017-12-3 19:09 来自手机 | 显示全部楼层
958809860 发表于 2017-1-10 10:21
**** 作者被禁止或删除 内容自动屏蔽 ****

您好,我想问下我要发的内容直接在定义那里改就可以了吗?
回复

使用道具 举报

ID:244767 发表于 2017-12-4 22:06 | 显示全部楼层
有没有仿真图
回复

使用道具 举报

ID:286264 发表于 2018-2-28 13:51 | 显示全部楼层
您好,请问楼这个程序驱动的是什么型号的GSM模块?
回复

使用道具 举报

ID:455320 发表于 2018-12-26 12:53 | 显示全部楼层
958809860 发表于 2017-1-10 10:21
**** 作者被禁止或删除 内容自动屏蔽 ****

用单片机做个发短信的需要什么模块呀
回复

使用道具 举报

ID:380141 发表于 2019-10-23 22:15 | 显示全部楼层
TC35模块是2G的,而且只能插移动的卡,电信和联通的都不能用。
回复

使用道具 举报

ID:574058 发表于 2020-4-25 10:30 | 显示全部楼层
958809860 发表于 2017-1-10 10:21
**** 作者被禁止或删除 内容自动屏蔽 ****

你这程序的头文件在哪里啊?
只有主程序啊
回复

使用道具 举报

ID:727538 发表于 2020-5-30 16:24 | 显示全部楼层
958809860 发表于 2017-1-10 10:21
**** 作者被禁止或删除 内容自动屏蔽 ****

1,如果只需要发送的功能,那可以直接删掉接收部分的代码吗?
2,能先设定中间变量,然后通过printf语句,将目标“手机号”和“信息”信息赋值给中间变量,最后放到发送函数中吗?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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