找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 9707|回復(fù): 10
收起左側(cè)

基于51單片機的GSM模塊C語言發(fā)送短信程序

  [復(fù)制鏈接]
ID:161074 發(fā)表于 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"};            
//發(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();

}

回復(fù)

使用道具 舉報

ID:161074 發(fā)表于 2017-1-10 10:21 | 顯示全部樓層
不懂的同學(xué)直接問我
回復(fù)

使用道具 舉報

ID:186936 發(fā)表于 2017-7-26 08:06 | 顯示全部樓層
958809860 發(fā)表于 2017-1-10 10:21
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

你好,我現(xiàn)在在學(xué)51我想學(xué)習(xí)GSM模塊可以教教我嗎
回復(fù)

使用道具 舉報

ID:247049 發(fā)表于 2017-12-3 19:09 來自觸屏版 | 顯示全部樓層
958809860 發(fā)表于 2017-1-10 10:21
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

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

使用道具 舉報

ID:244767 發(fā)表于 2017-12-4 22:06 | 顯示全部樓層
有沒有仿真圖
回復(fù)

使用道具 舉報

ID:286264 發(fā)表于 2018-2-28 13:51 | 顯示全部樓層
您好,請問樓這個程序驅(qū)動的是什么型號的GSM模塊?
回復(fù)

使用道具 舉報

ID:455320 發(fā)表于 2018-12-26 12:53 | 顯示全部樓層
958809860 發(fā)表于 2017-1-10 10:21
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

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

使用道具 舉報

ID:380141 發(fā)表于 2019-10-23 22:15 | 顯示全部樓層
TC35模塊是2G的,而且只能插移動的卡,電信和聯(lián)通的都不能用。
回復(fù)

使用道具 舉報

ID:574058 發(fā)表于 2020-4-25 10:30 | 顯示全部樓層
958809860 發(fā)表于 2017-1-10 10:21
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

你這程序的頭文件在哪里��?
只有主程序啊
回復(fù)

使用道具 舉報

ID:727538 發(fā)表于 2020-5-30 16:24 | 顯示全部樓層
958809860 發(fā)表于 2017-1-10 10:21
**** 作者被禁止或刪除 內(nèi)容自動屏蔽 ****

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表