久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7982|回復: 2
打印 上一主題 下一主題
收起左側

使用51單片機和GSM模塊向手機發送短信源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:684871 發表于 2021-5-14 23:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
調試時,通過串口助手向GSM模塊發送相應的AT指令,就可以設置其工作模式。
比如“向指定的手機號碼發送英文短信”。
PS:功能有很多,本貼以發送英文短信為例。
與單片機結合的基本原理就是:把AT指令以字符串形式寫入程序,程序燒入單片機之后,調用串口中斷進行通信。依次向GSM模塊發送指令,GSM模塊接收指令成功則返回“ok”,失敗則返回“error”放在單片機的subf上,通過檢測subf上是否有“ok”來判斷GSM是否接收指令成功。每成功一次就發送下一條指令。以此實現設置GSM的工作模式。
代碼如下:
/*頭文件*/
#include <REG52.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef        unsigned char        u8;
typedef unsigned int        u16;
typedef unsigned long        u32;
/*宏定義*/
#define Success 1U
#define Failure 0U
#define Uart1_Buf_Max 100  //串口數據緩存長度
/*定義一些變量*/
unsigned long  Time_Cont = 0;  //定時器計數器
char phoneNumber[] = "15605156539";//替換成需要被撥打電話的號碼
char msg[] = "fire";                //短信內容      
u8 point1;
u8 xdata  Rec_Buf[Uart1_Buf_Max];  //串口數據緩存
u8 point1 = 0;             //綬存指針
/*函數原型聲明*/
void Uart_Init();
void SendData(unsigned char ch);
void SendString(char *s);
bit Hand(unsigned char *a);
void CLR_Buf(void);
void delay_ms(unsigned int n);
unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry);
void errorLog();
void soft_reset(void);
void phone(char *number);
void sendMessage(char *number,char *msg);

/*************************************************************/
/*************************************************************/
/*********------------------子函數-------------------*********/
/*************************************************************/
/*************************************************************/
//MS延時函數(12M晶振下測試)
void delay_ms(unsigned int n)
{
        unsigned int  i,j;
                for(i=0;i<n;i++)
                        for(j=0;j<123;j++);
}

/****串口中斷觸發函數****/
void Uart_Init()                                                                    
{      
        SCON = 0X50;  //UART方式1;8位UART 0101 0000
        REN  = 1;     //不允許串行口接收數據
        PCON = 0x00;  //SMOD=0;波特率9600不加倍
        TMOD = 0x20;  //T1計數器工作方式方式2自動重裝,0010 0000用于產生波特率
        TH1  = 0xFD;  //裝初值
        TL1  = 0xFD;
        TR1  = 1;     //啟動定時器1
        EA   = 1;     //打開全局中斷控制
        ES   = 1;     //串行口中斷      
}


/*****串口中斷服務函數******/
void RECEIVE_DATA(void) interrupt 4 using 1         //串口中斷服務函數                        
{   
        ES = 0;
        if (RI)
    {
              RI = 0;   //接收完數據,RI由硬件置1,需要用軟件使RI置0,等待下一次接收數據,所以清除RI位
                Rec_Buf[point1] = SBUF; //出去接收到的數據
                point1++;   //在數組中依次存放數據            
                if(point1>=Uart1_Buf_Max)      //接收的數據最大為100   
                {
                        point1 = 0;
                }           
    }
        ES =  1;

}

/*****單片機向GSM模塊發送串口數據******/
void SendData(unsigned char ch)
{
        SBUF = ch;                 //寫數據到UART數據寄存器,SBUF把信息傳遞出去,完成后TI由硬件置1
        while(TI == 0);         //等待發送數據完成
        TI = 0;         //清除發送完成標志位
}


/*****發送字符串******/
void SendString(char *s)
{
    while (*s)                  //檢測字符串結束標志
    {
        SendData(*s++);         //發送當前字符
    }
}


/*****串口命令識別函數******/
bit Hand(unsigned char *a)                   // 串口命令識別函數
{
    if(strstr(Rec_Buf,a)!=NULL)//strstr判斷字符串a是否為字符串Rec_Buf的字串,如果是,則返回1
            return 1;
        else
                return 0;
}

//制造重啟命令
void soft_reset(void)      
{
   ((void (code *) (void)) 0x0000) ();
}


void errorLog()
{
        while (1)
        {
                  if (sendCommand("AT\r\n", "OK\r\n", 100, 10) == Success)
                {
                        soft_reset();
                }
                delay_ms(200);
        }
}

/*****串口緩存清理******/
void CLR_Buf(void)                           // 串口緩存清理
{
        memset(Rec_Buf, 0, Uart1_Buf_Max);      //清空  100個字節大小的Rec_Buf全部置0  ,清空SBUF出去接收到的數據
    point1 = 0;                    
}

/*****函數名:sendCommand*******/
/*****函數功能:*******/
/************/
unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry)
{
        unsigned char n;
        CLR_Buf();//串口緩存清理
        for (n = 0; n < Retry; n++)
        {
                SendString(Command);                 //發送GPRS指令

                Time_Cont = 0;
                while (Time_Cont < Timeout)
                {
                        delay_ms(100);
                        Time_Cont += 100;
                        if (strstr(Rec_Buf, Response) != NULL)
                        {
                              
                                CLR_Buf();
                                return Success;
                        }
                       
                }
                Time_Cont = 0;
        }
      
        CLR_Buf();
        return Failure;
}


/******--------------------------******/
/***發送號碼及短信內容,并判斷是否成功**/
/******--------------------------******/
void sendMessage(char *number,char *msg)
{
        xdata char send_buf[20] = {0};//開辟1個20字節的空間
        memset(send_buf, 0, 20);    //清空  把send_buf初始化為20字節大小的內容全部是0的數組
        strcpy(send_buf, "AT+CMGS=\"");
        /*發送號碼并判斷是否發送成功*/
        strcat(send_buf, number);//連接字符串
        strcat(send_buf, "\"\r\n");
        if (sendCommand(send_buf, ">", 3000, 10) == Success);//判斷手機號碼是否發送成功
        else errorLog();
        /*發送短信內容并判斷是否發送成功*/
        if (sendCommand(msg, msg, 3000, 10) == Success);
        else errorLog();

        memset(send_buf, 0, 40);    //清空
        send_buf[0] = 0x1a;
        send_buf[1] = '\0';
        if (sendCommand(send_buf, "OK\r\n", 10000, 5) == Success);
        else errorLog();
}


/*************************************************************/
/*************************************************************/
/*********------------------主函數-------------------*********/
/*************************************************************/
/*************************************************************/
void main()
{
    Uart_Init();//調用串口中斷函數               
    /*******-----狀態檢測及設置-----********/
        if (sendCommand("AT\r\n", "OK\r\n", 3000, 10) == Success);
        else errorLog();
        delay_ms(100);
      
        if (sendCommand("AT+CSQ\r\n", "OK\r\n", 3000, 10) == Success);//信號質量
        else errorLog();
        delay_ms(100);

        if (sendCommand("AT+CPIN?\r\n", "READY", 3000, 10) == Success);//SIM卡狀態
        else errorLog();
        delay_ms(100);

        if (sendCommand("AT+COPS?\r\n", "OK\r\n", 3000, 10) == Success);//運營商
        else errorLog();
        delay_ms(100);

        if (sendCommand("AT+CREG?\r\n", ",1", 3000, 10) == Success);        //本地SIM卡
        else if(sendCommand("AT+CREG?\r\n", ",5", 3000, 10) == Success        );//漫游SIM卡
        else        errorLog();
        delay_ms(100);


        if (sendCommand("AT+CMGF=1\r\n", "OK\r\n", 1000, 10) == Success);//短消息為文本模式
        else errorLog();
        delay_ms(10);

        if (sendCommand("AT+CSMP=17,167,0,8\r\n", "OK\r\n", 3000, 10) == Success);
        else errorLog();
        delay_ms(10);

        if (sendCommand("AT+CSCS=\"GSM\"\r\n", "OK\r\n", 1000, 10) == Success);
        else errorLog();
        delay_ms(10);

        sendMessage(phoneNumber,msg);                //發送短信

        while(1)
        {      

        }
}

代碼下載:
自己寫的GSM.zip (40.84 KB, 下載次數: 68)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:820289 發表于 2021-5-15 14:14 來自手機 | 只看該作者
感謝樓主無私奉獻,謝謝分享
回復

使用道具 舉報

板凳
ID:1020587 發表于 2022-4-22 10:23 | 只看該作者
可以問您一下 您的 使用51單片機和GSM模塊向手機發送短信源程序 應該如何實際調試嘛
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美视频1区 | 国产精品久久久久婷婷二区次 | 国产一级片一区二区三区 | 一区二区三区高清不卡 | 亚洲一区二区免费电影 | 欧美成人一区二区三区 | 日韩高清国产一区在线 | 欧美一区二区大片 | 日本天堂一区 | 羞羞视频在线观看 | 能免费看的av | 91麻豆精品一区二区三区 | 一区免费看 | 亚洲精品久久久久avwww潮水 | 亚洲国产精品视频一区 | 成人福利影院 | 国产不卡一区 | 一级毛片免费 | 日韩一区二区在线视频 | 色999日韩 | 国产成人久久精品一区二区三区 | 亚洲综合区| jlzzjlzz国产精品久久 | 高清欧美性猛交 | 国产视频中文字幕在线观看 | 色狠狠一区 | 一区欧美 | 久草免费在线视频 | 精品国产一区二区在线 | 国产美女精品视频 | 欧产日产国产精品视频 | 亚洲精品在线视频 | 91电影在线播放 | 亚洲九九精品 | 亚洲国产精品一区二区久久 | 欧美亚洲视频 | 久久久无码精品亚洲日韩按摩 | 一级片网址 | 中国一级特黄真人毛片免费观看 | 国产精品一区二区免费 | 精品丝袜在线 |