51单片机+SIM800C(GSM模块)实现短信发送功能-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、前言

本项目利用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+ZASCII码为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】GPIOSTM89C52具有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 <reg52.h>

// 定义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);
}

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

#include <reg51.h>

// 定义串口1的引脚连接
sbit UART1_TX = P3^1;
sbit UART1_RX = P3^0;

// 初始化串口1
void UART1_Init() {
    TMOD |= 0x20;  // 设置定时器1为模式28位自动重载
    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);
}

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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6