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

2023-11-08 11:12

本文主要是介绍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 <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为模式2TH1 = 256 - BAUDRATE / 9600;  // 设置波特率TL1 = TH1;TR1 = 1;  // 启动定时器1SCON = 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为模式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);
}

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

这篇关于51单片机+SIM800C(GSM模块)实现短信发送功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/369469

相关文章

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri