• 51单片机+SIM800C(GSM模块)实现短信发送功能


    一、前言

    本项目利用51单片机和SIM800C GSM模块实现短信发送功能。短信作为一种广泛应用的通信方式,在许多领域具有重要的作用,如物联网、安防系统、远程监控等。通过将51单片机与SIM800C GSM模块相结合,可以实现在各种应用场景下的短信通信功能。

    本项目的核心组件是51单片机,是一种低成本、低功耗的单片机,广泛应用于嵌入式系统开发。利用51单片机的串口功能来控制SIM800C GSM模块的通信。SIM800C是一款功能强大的GSM模块,支持GSM/GPRS通信,具有发送和接收短信的能力。

    在本项目中,搭建51单片机和SIM800C GSM模块的硬件连接。使用C语言编写程序,在51单片机上实现与SIM800C的通信控制。通过串口通信向SIM800C发送AT指令,实现短信的发送功能。

    为了实现短信发送功能,需要熟悉SIM800C的AT指令集,了解如何设置短信参数、编写短信内容并发送。还需要处理SIM800C返回的响应,以确保短信发送的成功与否。

    image-20230810164852517

    image-20230810164922749

    二、SIM800C硬件介绍

    SIM800C是一款功能强大、灵活可靠的GSM/GPRS模块,广泛应用于各种通信和控制场景,尤其在物联网应用中能发挥重要作用。通过合理使用SIM800C的AT指令,可以轻松实现短信发送和收取等功能。

    2.1 SIM800C的特点

    【1】支持多种通信方式:SIM800C支持GSM、GPRS、SMS、MMS、TCP/IP等通信方式,可以实现语音通话、短信收发、数据传输等功能。

    【2】大量接口:SIM800C提供了UART、SPI和I2C等接口,方便与其他设备进行通信和控制。

    【3】低功耗设计:SIM800C具有低功耗模式,在待机时能够极大地减少电力消耗。

    【4】小巧的尺寸:SIM800C模块体积小巧,便于嵌入各种设备中。

    【5】丰富的工作温度范围:SIM800C适用于广泛的工作温度范围,可在恶劣的环境条件下正常工作。

    2.2 使用场景

    SIM800C的使用场景广泛,主要包括以下几个方面:

    【1】物联网应用:SIM800C可以通过GPRS进行数据传输,用于物联网设备的远程监控、远程控制、数据采集和传输等。

    【2】安防系统:SIM800C可以用于报警系统,通过短信或语音通知用户有关安全事件的信息。

    【3】远程控制应用:通过SIM800C模块,可以实现远程控制设备,比如远程开关、门禁系统等。

    【4】移动支付终端:SIM800C可以与移动支付系统集成,实现移动支付终端的功能。

    2.3 AT指令介绍

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

    下面是一些常用的与短信相关的AT指令:

    【1】AT+CMGF:设置短信模式,用于选择短信的格式。例如,AT+CMGF=1表示以文本模式发送和接收短信。

    【2】AT+CMGS:发送短信。需要指定接收方的电话号码,并在输入结束后按Ctrl+Z(ASCII码为0x1A)表示短信内容输入完成。例如,AT+CMGS="+123456789"表示发送短信给号码+123456789。

    【3】AT+CMGR:读取短信。可以读取已存储在模块中的已接收短信,返回包括发送方号码和短信内容在内的信息。

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

    【5】AT+CNMI:设置新短消息指示。可以配置模块在接收到新短信时给出通知,以便及时处理。

    三、代码实现

    3.1 STC89C52硬件配置

    【1】串口:STM89C52共有两个串口,分别是UART0和UART1。可以用于与其他设备进行异步串行通信。

    【2】定时器:STM89C52共有三个定时器,分别是Timer0、Timer1和Timer2。可以用于产生定时中断、计时等功能。

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

    串口对应的GPIO口编号如下:

    【A】UART0:

    • TXD:对应P0.0口
    • RXD:对应P0.1口

    【B】UART1:

    • TXD:对应P3.1口
    • RXD:对应P3.0口

    在STM89C52中,UART0的TXD引脚对应P0.0口,RXD引脚对应P0.1口;UART1的TXD引脚对应P3.1口,RXD引脚对应P3.0口。

    3.2 短信发送代码实现

    #include 
    
    // 定义SIM800C的串口引脚
    sbit SIM_RX = P3^0;  // SIM800C的串口接收引脚
    sbit SIM_TX = P3^1;  // SIM800C的串口发送引脚
    
    // 定义波特率常量
    #define BAUDRATE 9600
    
    // 定义发送函数
    void sendATCommand(char* command) {
        // 发送AT指令
        for (int i = 0; command[i] != '\0'; i++) {
            SBUF = command[i];
            while (TI == 0);  // 等待发送完成
            TI = 0;  // 清除发送完成标志
        }
    }
    
    // 主函数
    void main() {
        // 初始化串口
        TMOD = 0x20;  // 设置定时器1为模式2
        TH1 = 256 - BAUDRATE / 9600;  // 设置波特率
        TL1 = TH1;
        TR1 = 1;  // 启动定时器1
        SCON = 0x50;  // 设置串口为模式1,允许接收
    
        // 发送AT指令初始化SIM800C模块
        sendATCommand("AT\r\n");  // 发送AT指令,检测模块是否正常
        sendATCommand("AT+CMGF=1\r\n");  // 设置短信模式为文本模式
        sendATCommand("AT+CNMI=1,2,0,0,0\r\n");  // 设置接收新短信时的提示方式
    
        // 发送短信
        sendATCommand("AT+CMGS=\"+1234567890\"\r\n");  // 设置短信接收号码
        sendATCommand("Hello, this is a test message.\x1A");  // 发送短信内容,以Ctrl+Z作为结束符
    
        while (1);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    3.3 短信发送、电话拨打功能-封装子函数

    #include 
    
    // 定义串口1的引脚连接
    sbit UART1_TX = P3^1;
    sbit UART1_RX = P3^0;
    
    // 初始化串口1
    void UART1_Init() {
        TMOD |= 0x20;  // 设置定时器1为模式2(8位自动重载)
        SCON = 0x50;  // 设置串口1为工作方式1,并允许接收
        TH1 = 0xFD;   // 设置波特率9600,对应12MHz晶振
        TL1 = 0xFD;
        TR1 = 1;      // 启动定时器1
    }
    
    // 发送一个字符到串口1
    void UART1_SendChar(unsigned char c) {
        SBUF = c;
        while(!TI);  // 等待发送完成
        TI = 0;      // 清除发送标志
    }
    
    // 发送字符串到串口1
    void UART1_SendString(const unsigned char *str) {
        while (*str) {
            UART1_SendChar(*str++);
        }
    }
    
    // 发送AT指令到SIM800C模块
    void SIM800C_SendATCommand(const unsigned char *atCmd) {
        UART1_SendString(atCmd);
        UART1_SendChar('\r');
        UART1_SendChar('\n');
    }
    
    // 发送短信
    void SIM800C_SendSMS(const unsigned char *phoneNumber, const unsigned char *message) {
        SIM800C_SendATCommand("AT+CMGF=1"); // 设置为文本模式
        // 等待回复
        // ...
        SIM800C_SendATCommand("AT+CMGS=\"");
        UART1_SendString(phoneNumber); // 接收方手机号
        UART1_SendChar('"');
        UART1_SendChar('\r');
        UART1_SendString(message); // 短信内容
        UART1_SendChar(0x1A); // 发送Ctrl+Z结束短信
    }
    
    // 拨打电话
    void SIM800C_MakeCall(const unsigned char *phoneNumber) {
        SIM800C_SendATCommand("ATD"); // 拨号命令
        UART1_SendString(phoneNumber); // 目标手机号
        UART1_SendChar(';'); // 发送分号以拨号
    }
    
    void main() {
        UART1_Init(); // 初始化串口1
    
        // 等待SIM800C模块初始化完成
        // ...
    
        // 发送短信
        SIM800C_SendSMS("手机号", "短信内容");
    
        // 拨打电话
        // SIM800C_MakeCall("目标手机号");
    
        while(1);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70

    代码中需要将"手机号"和"目标手机号"填充为实际的电话号码。

  • 相关阅读:
    华为云数据库 RDS for MySQL 的读写分离,凭什么打破企业数据瓶颈?
    吴恩达2022机器学习专项课测评来了!
    CDN+COS搭建图床超详细步骤
    python爬虫(4)
    C++中的自定义数据类型(结构体)解析
    AWS CLI 命令行详解
    MacBook通过XGP玩女神异闻录5皇家版不踩坑指南
    使用Ruby编写通用爬虫程序
    意外发现一款很好用的开源BI工具——DataEase
    搭建环境AI画图stable-diffusion
  • 原文地址:https://blog.csdn.net/xiaolong1126626497/article/details/134259624