• 方案介紹
    • 一、前言
    • 二、SIM800C硬件介紹
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

51單片機+SIM800C(GSM模塊)實現(xiàn)短信發(fā)送功能

05/17 15:01
1085
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

更多詳細資料請聯(lián)系.docx

共1個文件

一、前言

本項目利用51單片機和SIM800C GSM模塊實現(xiàn)短信發(fā)送功能。短信作為一種廣泛應(yīng)用的通信方式,在許多領(lǐng)域具有重要的作用,如物聯(lián)網(wǎng)、安防系統(tǒng)、遠程監(jiān)控等。通過將51單片機與SIM800C GSM模塊相結(jié)合,可以實現(xiàn)在各種應(yīng)用場景下的短信通信功能。

本項目的核心組件是51單片機,是一種低成本、低功耗的單片機,廣泛應(yīng)用于嵌入式系統(tǒng)開發(fā)。利用51單片機的串口功能來控制SIM800C GSM模塊的通信。SIM800C是一款功能強大的GSM模塊,支持GSM/GPRS通信,具有發(fā)送和接收短信的能力。

在本項目中,搭建51單片機和SIM800C GSM模塊的硬件連接。使用C語言編寫程序,在51單片機上實現(xiàn)與SIM800C的通信控制。通過串口通信向SIM800C發(fā)送AT指令,實現(xiàn)短信的發(fā)送功能。

為了實現(xiàn)短信發(fā)送功能,需要熟悉SIM800C的AT指令集,了解如何設(shè)置短信參數(shù)、編寫短信內(nèi)容并發(fā)送。還需要處理SIM800C返回的響應(yīng),以確保短信發(fā)送的成功與否。

image-20230810164852517

image-20230810164922749

二、SIM800C硬件介紹

SIM800C是一款功能強大、靈活可靠的GSM/GPRS模塊,廣泛應(yīng)用于各種通信和控制場景,尤其在物聯(lián)網(wǎng)應(yīng)用中能發(fā)揮重要作用。通過合理使用SIM800C的AT指令,可以輕松實現(xiàn)短信發(fā)送和收取等功能。

2.1 SIM800C的特點

【1】支持多種通信方式:SIM800C支持GSM、GPRS、SMS、MMS、TCP/IP等通信方式,可以實現(xiàn)語音通話、短信收發(fā)、數(shù)據(jù)傳輸等功能。

【2】大量接口:SIM800C提供了UARTSPII2C等接口,方便與其他設(shè)備進行通信和控制。

【3】低功耗設(shè)計:SIM800C具有低功耗模式,在待機時能夠極大地減少電力消耗。

【4】小巧的尺寸:SIM800C模塊體積小巧,便于嵌入各種設(shè)備中。

【5】豐富的工作溫度范圍:SIM800C適用于廣泛的工作溫度范圍,可在惡劣的環(huán)境條件下正常工作。

2.2 使用場景

SIM800C的使用場景廣泛,主要包括以下幾個方面:

【1】物聯(lián)網(wǎng)應(yīng)用:SIM800C可以通過GPRS進行數(shù)據(jù)傳輸,用于物聯(lián)網(wǎng)設(shè)備的遠程監(jiān)控、遠程控制、數(shù)據(jù)采集和傳輸?shù)取?/p>

【2】安防系統(tǒng):SIM800C可以用于報警系統(tǒng),通過短信或語音通知用戶有關(guān)安全事件的信息。

【3】遠程控制應(yīng)用:通過SIM800C模塊,可以實現(xiàn)遠程控制設(shè)備,比如遠程開關(guān)門禁系統(tǒng)等。

【4】移動支付終端:SIM800C可以與移動支付系統(tǒng)集成,實現(xiàn)移動支付終端的功能。

2.3 AT指令介紹

SIM800C使用AT指令進行通信和控制。

下面是一些常用的與短信相關(guān)的AT指令:

【1】AT+CMGF:設(shè)置短信模式,用于選擇短信的格式。例如,AT+CMGF=1表示以文本模式發(fā)送和接收短信。

【2】AT+CMGS:發(fā)送短信。需要指定接收方的電話號碼,并在輸入結(jié)束后按Ctrl+Z(ASCII碼為0x1A)表示短信內(nèi)容輸入完成。例如,AT+CMGS="+123456789"表示發(fā)送短信給號碼+123456789。

【3】AT+CMGR:讀取短信。可以讀取已存儲在模塊中的已接收短信,返回包括發(fā)送方號碼和短信內(nèi)容在內(nèi)的信息。

【4】AT+CMGD:刪除短信。用于刪除指定索引處的短信。例如,AT+CMGD=1表示刪除索引為1的短信。

【5】AT+CNMI:設(shè)置新短消息指示。可以配置模塊在接收到新短信時給出通知,以便及時處理。

三、代碼實現(xiàn)

3.1 STC89C52硬件配置

【1】串口:STC89C52共有兩個串口,分別是UART0和UART1??梢杂糜谂c其他設(shè)備進行異步串行通信

【2】定時器:STC89C52共有三個定時器,分別是Timer0、Timer1和Timer2??梢杂糜诋a(chǎn)生定時中斷、計時等功能。

【3】GPIO:STC89C52具有32個I/O口,每個I/O口可以配置為輸入或輸出。其中,P0口(Port 0)和P2口(Port 2)上的引腳可以作為UART0的GPIO引腳使用,而P3口(Port 3)上的引腳可以作為UART1的GPIO引腳使用。

串口對應(yīng)的GPIO口編號如下:

【A】UART0:

  • TXD:對應(yīng)P0.0口
  • RXD:對應(yīng)P0.1口

【B】UART1:

  • TXD:對應(yīng)P3.1口
  • RXD:對應(yīng)P3.0口

在STC89C52中,UART0的TXD引腳對應(yīng)P0.0口,RXD引腳對應(yīng)P0.1口;UART1的TXD引腳對應(yīng)P3.1口,RXD引腳對應(yīng)P3.0口。

3.2 短信發(fā)送代碼實現(xiàn)

#include <reg52.h>

// 定義SIM800C的串口引腳
sbit SIM_RX = P3^0;  // SIM800C的串口接收引腳
sbit SIM_TX = P3^1;  // SIM800C的串口發(fā)送引腳

// 定義波特率常量
#define BAUDRATE 9600

// 定義發(fā)送函數(shù)
void sendATCommand(char* command) {
    // 發(fā)送AT指令
    for (int i = 0; command[i] != '?'; i++) {
        SBUF = command[i];
        while (TI == 0);  // 等待發(fā)送完成
        TI = 0;  // 清除發(fā)送完成標志
    }
}

// 主函數(shù)
void main() {
    // 初始化串口
    TMOD = 0x20;  // 設(shè)置定時器1為模式2
    TH1 = 256 - BAUDRATE / 9600;  // 設(shè)置波特率
    TL1 = TH1;
    TR1 = 1;  // 啟動定時器1
    SCON = 0x50;  // 設(shè)置串口為模式1,允許接收

    // 發(fā)送AT指令初始化SIM800C模塊
    sendATCommand("ATrn");  // 發(fā)送AT指令,檢測模塊是否正常
    sendATCommand("AT+CMGF=1rn");  // 設(shè)置短信模式為文本模式
    sendATCommand("AT+CNMI=1,2,0,0,0rn");  // 設(shè)置接收新短信時的提示方式

    // 發(fā)送短信
    sendATCommand("AT+CMGS="+1234567890"rn");  // 設(shè)置短信接收號碼
    sendATCommand("Hello, this is a test message.x1A");  // 發(fā)送短信內(nèi)容,以Ctrl+Z作為結(jié)束符

    while (1);
}

3.3 短信發(fā)送、電話撥打功能-封裝子函數(shù)

#include <reg51.h>

// 定義串口1的引腳連接
sbit UART1_TX = P3^1;
sbit UART1_RX = P3^0;

// 初始化串口1
void UART1_Init() {
    TMOD |= 0x20;  // 設(shè)置定時器1為模式2(8位自動重載)
    SCON = 0x50;  // 設(shè)置串口1為工作方式1,并允許接收
    TH1 = 0xFD;   // 設(shè)置波特率9600,對應(yīng)12MHz晶振
    TL1 = 0xFD;
    TR1 = 1;      // 啟動定時器1
}

// 發(fā)送一個字符到串口1
void UART1_SendChar(unsigned char c) {
    SBUF = c;
    while(!TI);  // 等待發(fā)送完成
    TI = 0;      // 清除發(fā)送標志
}

// 發(fā)送字符串到串口1
void UART1_SendString(const unsigned char *str) {
    while (*str) {
        UART1_SendChar(*str++);
    }
}

// 發(fā)送AT指令到SIM800C模塊
void SIM800C_SendATCommand(const unsigned char *atCmd) {
    UART1_SendString(atCmd);
    UART1_SendChar('r');
    UART1_SendChar('n');
}

// 發(fā)送短信
void SIM800C_SendSMS(const unsigned char *phoneNumber, const unsigned char *message) {
    SIM800C_SendATCommand("AT+CMGF=1"); // 設(shè)置為文本模式
    // 等待回復(fù)
    // ...
    SIM800C_SendATCommand("AT+CMGS="");
    UART1_SendString(phoneNumber); // 接收方手機號
    UART1_SendChar('"');
    UART1_SendChar('r');
    UART1_SendString(message); // 短信內(nèi)容
    UART1_SendChar(0x1A); // 發(fā)送Ctrl+Z結(jié)束短信
}

// 撥打電話
void SIM800C_MakeCall(const unsigned char *phoneNumber) {
    SIM800C_SendATCommand("ATD"); // 撥號命令
    UART1_SendString(phoneNumber); // 目標手機號
    UART1_SendChar(';'); // 發(fā)送分號以撥號
}

void main() {
    UART1_Init(); // 初始化串口1

    // 等待SIM800C模塊初始化完成
    // ...

    // 發(fā)送短信
    SIM800C_SendSMS("手機號", "短信內(nèi)容");

    // 撥打電話
    // SIM800C_MakeCall("目標手機號");

    while(1);
}

代碼中需要將"手機號"和"目標手機號"填充為實際的電話號碼。

  • 更多詳細資料請聯(lián)系.docx
    下載

相關(guān)推薦