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);
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/136398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 设置 Git 在左侧展示

File->settings->Version Control->commit 勾选 Use non-model commit interface

vue.js实现科室无限层选中和回显

一、效果展示&#xff1a; 展示可选层级 查看选中的值 二、实现&#xff1a; <el-form-item label"相关科室:" prop"orgId"><el-cascaderpopper-class"cascader-my":options"orgOptions":show-all-levels"false"…

【ARM Trace32(劳特巴赫) 使用介绍 2 - Veloce 环境中使用trace32 连接 Cortex-M33】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 T32MARM 介绍Trace32 .t32 和 .cmm 差异veloce 下启动TRACE321.1.3 TAP 状态机操作命令1.1.3.1 IDCODE&#xff08;Identification Code&#xff09;寄存器 介绍 T32MARM 介绍 T32MARM 是 Lauterbach 的 Trace32 …

Android ConstraintLayout

0dp 充满约束 to左侧是控件本身,to右边是约束条件 例如: app:layout_constraintBottom_toBottomOf"id/image_1" app:layout_constraintTop_toBottomOf"id/image_1" 指定权重: app:layout_constraintHorizontal_weight"" app:layout_constra…

调试 Mahony 滤波算法的思考 10

调试 Mahony 滤波算法的思考 1. 说在前面的2.Mahony滤波算法的核心思想3. 易懂的理解 Mahony 滤波算法的过程4. 其他的一些思考5. 民间 9轴评估板 1. 说在前面的 之前调试基于QMI8658 6轴姿态解算的时候&#xff0c;我对Mahony滤波的认识还比较浅薄。初次的学习和代码的移植让…

电路布线问题动态规划详解(做题思路)

对于电路布线问题&#xff0c;想必学过动态规划的大家都很清除。今天就来讲解一下这个动态规划经典题目。 目录 问题描述输入分析最优子结构代码 问题描述 在一块电路板的上、下2端分别有n个接线柱。根据电路设计&#xff0c;要求用导 线(i,π(i))将上端接线柱与下端接线柱相…

与set和map相关的OJ题练习

一、两个数组的交集 题目链接&#xff1a; 349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给两个数组&#xff0c;求在数组里面共同出现的部分&#xff0c;就是求两个数组的交集&#xff0c;返回顺序不做要求 解题思路&#xff1a; …

技术分享 | web自动化测试-PageObject 设计模式

为 UI 页面写测试用例时&#xff08;比如 web 页面&#xff0c;移动端页面&#xff09;&#xff0c;测试用例会存在大量元素和操作细节。当 UI 变化时&#xff0c;测试用例也要跟着变化&#xff0c; PageObject 很好的解决了这个问题。 使用 UI 自动化测试工具时&#xff08;包…

ppt聚光灯效果

1.放入三张图片内容或其他 2.全选复制成图片 3.设置黑色矩形&#xff0c;透明度30% 4.粘贴复制后的图片&#xff0c;制定图层 5.插入椭圆&#xff0c;先选中矩形&#xff0c;再选中椭圆&#xff0c;点击绘图工具&#xff0c;选择相交即可&#xff08;关键&#xff09;

Spring Boot 请求/actuator/beans 无法访问 返回404

问题复现 在保证项目加入了spring-boot-starter-actuator依赖&#xff0c;并成功启动后。通过浏览器进行访问&#xff0c;返回如下图结果&#xff1a; 问题排查 1. 查看日志 从日志中可以看到基于路径’/actuator’下只暴露了一个端点 2. 访问http://localhost:8080/actua…

C# OpenCvSharp 环形文字处理 直角坐标与极坐标转换

效果1 效果2 项目 代码 using OpenCvSharp; using System; using System.Drawing; using System.Text; using System.Windows.Forms;namespace OpenCvSharp_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string fileFilter "*.*…

1. Collection,List, Map, Queue

1. java集合框架体系结构图 2. Collection派生的子接口 其中最重要的子接口是&#xff1a; 1&#xff09;List 表示有序可重复列表&#xff0c;重要的实现类有&#xff1a;ArrayList, LinkedList ArrayList特点&#xff1a;底层数组实现&#xff0c;随机查找快&#xff0c;增删…

facebook分享-错误记录

无法拉起分享 "code":30000,"msg":"fail:API_ERROR: API_ERROR" 1.确认facebook的app_id是否一致 2.确认是否在app_id应用的白名单里&#xff0c;注册meta开发者&#xff0c;然后把主页的user_id给管理员加 A ContentProvider for this app was…

小程序发成绩

在这个数字化快速发展的时代&#xff0c;让学生能够方便快捷地获取自己的成绩已经成为一项基本的需求。那么&#xff0c;如何实现这一目标呢&#xff1f;对于许多老师来说&#xff0c;可能首先想到的是使用各种代码或者Excel来发布成绩查询。今天&#xff0c;我们就来探讨一下这…

基于SSM的劳务外包管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

RK3568平台开发系列讲解(音视频篇)RTMP 推流

🚀返回专栏总目录 文章目录 一、RTMP 的工作原理二、RTMP 流媒体服务框架2.1、Nginx 流媒体服务器2.2、FFmpeg 推流沉淀、分享、成长,让自己和他人都能有所收获!😄 📢目前常见的视频监控和视频直播都是使用了 RTMP、RTSP、HLS、MPEG-DASH、 WebRTC流媒体传输协议等。 R…

基于SSM的图书管理借阅系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

k8s configMap挂载(项目配置文件放到configMap中,不同环境不同配置)

背景说明 项目对接配置文件加密&#xff0c;比如数据库密码、redis密码等。但是密文只能放到指定的配置文件中(important.properties)&#xff0c;该配置文件又不能接收环境变量&#xff0c;所以就很难区分不同环境的不同配置&#xff08;不同环境的数据库密码、redis密码一般…

easyscholar配置秘钥连接Zotero-style,更方便的了解文献!

如果你不知道什么是easyScholar,以及怎么安装easyScholar? 请参见文章 easyScholar 一、easyscholar配置秘钥 1.首先打开easyscholar插件&#xff0c;并登录 2.点击自定义数据集 3.依次点击 用户信息-开放接口 4.点击刷新 5.在Zoter中 编辑-首选项-高级-编辑器 6.点击…