標題: 基于51單片機的GSM模塊C語言發(fā)送短信程序 [打印本頁]

作者: 958809860    時間: 2017-1-10 10:20
標題: 基于51單片機的GSM模塊C語言發(fā)送短信程序
#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"};            
//發(fā)送短信內(nèi)容。
uchar code TC_WLZT[]={"AT+CREG?"};            
//網(wǎng)絡(luò)狀態(tài)查詢
uchar code TC_MSXZ[]={"AT+CMGF=1"};            
//發(fā)送模式選擇。
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位數(shù)據(jù),允許接收
    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;        
}         
//向串口發(fā)送一個字符
void send_uart( unsigned char ch)
{
    while (TI==0);
    TI= 0 ;
    SBUF=ch;
}
//串口接收中斷函數(shù)
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復(fù)位指令
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網(wǎng)絡(luò)狀態(tài)查詢指令
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:發(fā)送模式選擇。
    {
        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 優(yōu)先信息格式。執(zhí)行格式有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 網(wǎng)絡(luò)注冊。獲得手機的注冊狀態(tài)。
            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 命令設(shè)定的存儲器讀取。
            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 短信服務(wù)中心地址。
            else if(TC35_CON==CSCA)//TC35_CON==0x07
            {
                delay(100);
                if((TC35_RE[25]=='O')&&(TC35_RE[26]=='K'))
                {

                    AT_CMGS();
                }
                else
                {
                }
            }
            //填寫發(fā)送內(nèi)容
            else if(TC35_CON==CMGS)//TC35_CON==0x06
            {
                delay(100);
                if((TC35_RE[22]==0X3E)&&(TC35_RE[23]==0X20))
                {

                    ATNAME();
                }
                else{}
            }
            //發(fā)送完畢返回繼續(xù)掃描接收
            else if(TC35_CON==ATDAT)//0x08
            {
                delay(100);
                if((TC35_RE[0]=='+')||(TC35_RE[0]==0x1A))
                {
                    AT_CMGR();
                }
                else
                {}
            }
            //復(fù)位接收組
            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();

}


作者: 958809860    時間: 2017-1-10 10:21
不懂的同學(xué)直接問我
作者: wxc19960311    時間: 2017-7-26 08:06
958809860 發(fā)表于 2017-1-10 10:21
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

你好,我現(xiàn)在在學(xué)51我想學(xué)習(xí)GSM模塊可以教教我嗎
作者: xyx51    時間: 2017-12-3 19:09
958809860 發(fā)表于 2017-1-10 10:21
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

您好,我想問下我要發(fā)的內(nèi)容直接在定義那里改就可以了嗎?

作者: wms123    時間: 2017-12-4 22:06
有沒有仿真圖

作者: huweiye    時間: 2018-2-28 13:51
您好,請問樓這個程序驅(qū)動的是什么型號的GSM模塊?
作者: 279136103    時間: 2018-12-26 12:53
958809860 發(fā)表于 2017-1-10 10:21
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

用單片機做個發(fā)短信的需要什么模塊呀

作者: midrich    時間: 2019-10-23 22:15
TC35模塊是2G的,而且只能插移動的卡,電信和聯(lián)通的都不能用。
作者: qq2166    時間: 2020-4-25 10:30
958809860 發(fā)表于 2017-1-10 10:21
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

你這程序的頭文件在哪里?
只有主程序啊

作者: sheji    時間: 2020-5-30 16:24
958809860 發(fā)表于 2017-1-10 10:21
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

1,如果只需要發(fā)送的功能,那可以直接刪掉接收部分的代碼嗎?
2,能先設(shè)定中間變量,然后通過printf語句,將目標“手機號”和“信息”信息賦值給中間變量,最后放到發(fā)送函數(shù)中嗎?





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1