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

news2024/12/28 20:20:14

一、前言

本项目利用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为模式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为模式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.coloradmin.cn/o/1179882.html

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

相关文章

美国光量子计算解决方案公司QCI正式开启量子计算商业化道路!

​&#xff08;图片来源&#xff1a;网络&#xff09; Quantum Computing Inc&#xff08;QCI&#xff09;是一家率先实现上市的全栈式光量子计算解决方案公司&#xff0c;近日&#xff0c;美国量子计算公司QCI&#xff08;纳斯达克代码: QUBT&#xff09;宣布&#xff0c;其在…

Xilinx DDR3 MIG系列——内存基本概念及原理

本节目录 一、内存简介 (1)内存基本存储原理 (2)内存频率 (3)DDR数据预取技术(Prefetch) (4)DDR3工作流程 (5)DDR3控制器的特点 二、内存基本参数 (1)物理Bank (2)逻辑Bank (3)内存芯片容量 (4)行激活命令—tRCD (5)列选通—CL (6)写入延迟—tDQSS (7)行预充电有效周期—tRP (8…

同样是BGA扇出,为什么别人设计出来的性能就是比你好!

高速先生成员--黄刚 高速先生经常会说一句话&#xff0c;那就是对于信号质量的优化是无极限的&#xff0c;这里说的优化&#xff0c;其实说的就是PCB的设计优化。首先肯定的是&#xff0c;不同的设计工程师去做同样一块PCB板的设计&#xff0c;做出来的肯定都不会完全一样。那不…

DVWA靶场SQL注入

本次注入的是DVWA靶场的SQL injection 1.判断是字符型注入还是数字型注入&#xff0c;构造SQL语句 1 and 12 由此可以判断出为字符型注入 2.考虑闭合方式&#xff0c;先随便丢一个单引号试试看看报错提示 You have an error in your SQL syntax; check the manual that cor…

C语言C位出道心法(二):结构体

C语言C位出道心法(一):基础语法 C语言C位出道心法(二):结构体 一:C语言结构体认知 忙着去耍帅,后期补充完整...........

python简易定时调度

在python中&#xff0c;一般定时调度会使用apscheduler,更基础的我们会使用sched包来实时调度。有时候也是会使用time.sleep的方式来配合使用。在实际的生产中&#xff0c;单纯使用time.sleep会出现睡眼之后程序无法被唤醒的情况&#xff0c;所以后来会尽量的避免使用这种方式。…

Django初窥门径-项目初始化

环境准备 切换pypi源 运行下面的脚本将pypi源切换为阿里云镜像&#xff0c;避免安装python库的过程中出现网络问题 #!/bin/bash# 定义配置内容 config_content"[global] index-url http://mirrors.aliyun.com/pypi/simple/[install] trusted-hostmirrors.aliyun.com &…

VSCode修改主题为Eclipse 绿色护眼模式

前言 从参加开发以来&#xff0c;一直使用eclipse进行开发&#xff0c;基本官方出新版本&#xff0c;我都会更新。后来出来很多其他的IDE工具&#xff0c;我也尝试了&#xff0c;但他们的主题都把我劝退了&#xff0c;黑色主题是谁想出来&#xff1f;&#x1f602; 字体小的时…

马斯克发布大模型Grok;主流AI创意生成工具图谱;Runway视频大赛获奖作品解析;DALL-E 3图像混合操作;42章经播客推荐 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f440; 马斯克「xAI」发布首个AI大模型「Grok」 https://grok.x.ai 11月5日&#xff0c;马斯克旗下人工智能公司 xAI 发布了首款 AI 聊天产品…

(附源码)基于微服务架构的餐饮系统的设计与实现-计算机毕设 86393

基于微服务架构的餐饮系统的设计与实现 摘 要 近年来,我国经济和社会发展迅速,人们物质生活水平日渐提高,餐饮行业更是发展迅速,人们对于餐饮行业的认识和要求也越来越高。传统形式的餐饮行业都是以人为本,管理起来需要很多人力、物力、财力,既不方便管理者的管理,也不方便顾…

YB506A是一款锂电池充、放电管理专用芯片,集成锂电池充电管理和降压DCDC电路

YB506A 锂电转可充电AA/AAA电池专用SOC芯片 概述&#xff1a; YB506A是一款锂电池充、放电管理专用芯片&#xff0c;集成锂电池充电管理和降压DCDC电路。充电过程满足锂电池三段式滑流/恒流/恒压充电规范&#xff0c;YB506A内部的线性充电电路采用了恒流可配置模式&#xff0…

基于食肉植物算法的无人机航迹规划-附代码

基于食肉植物算法的无人机航迹规划 文章目录 基于食肉植物算法的无人机航迹规划1.食肉植物搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用食肉植物算法来优化无人机航迹规划。 …

Find My挂件|苹果Find My技术与挂件结合,智能防丢,全球定位

挂件是各种场合装饰的一种工艺品。有玉石、金属、塑料、布料等材质的。一般是手机上的挂饰、包袋上的装饰、蓝牙耳机的挂饰、各种物品的装饰都可以用得到。如今最新的挂件加入智能模块可实现物品防丢功能。 在智能化加持下&#xff0c;防丢功能的加入使得人们日益关心物品的去…

2.3.3 交换机的RSTP技术

实验2.3.3 交换机的RSTP技术 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.交换机的基本配置。2.开启交换机的STP。3.配置SW3A和SW3B上STP的优先级。将SW3A配置为根交换机&#xff0c;SW3B配置为备用根交换机。4.配置SW2A和SW3B的边缘接口 六、任务验收七、…

.NET MVC 修改项目URL为IP

先从隐藏目录里找到applicationhost.config 如果没有找到这.vs的目录的话就先创建虚拟路径即可然后在下图里插入一行本机IP的数据&#xff0c;注意只能插入不能直接改上面的localhost否则就无法创建虚拟目录了复制上面一行&#xff0c;把localhost改为你的本机IP 配置文件改完…

Fastjson 1.2.47 RCE漏洞复现

一、漏洞特征 Fastjson提供了autotype功能&#xff0c;允许用户在反序列化数据中通过“type”指定反序列化的类型&#xff0c;Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法&#xff0c;那么当组件开启了autotype功能并且反序列化不可信数据时&am…

11.7移位寄存器,计数器,时序分析,状态机,verliog实现

D触发器实现二选1 4位移位寄存器 移位寄存器&#xff0c;可以将寄存的Q信号逐位输出 N位寄存器 递增计数器 带并行载入端递增 这里载入的时候&#xff0c;省略掉的ELSE&#xff0c;自动操作就是锁存原状态&#xff0c;即Q<Q 并行&#xff0c;递减 这个没有复位端 递增递减…

节省服务器资源、实现双向数据传输——深度解析WebSocket协议

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、W…

倾听世界之声 嘉康利冉永夫:数智化直销的齿轮在全球飞转

时隔三年再度举办的世界直销大会&#xff0c;向世界发出了重新设想和重塑直销行业的现场召集令。 “直销&#xff0c;是时候闪耀了&#xff01;”这句话出自世界直销协会联盟主席罗杰巴纳特&#xff08;RogerBarnett&#xff09;之口&#xff0c;在第十七届世界直销大会的主旨演…

leaflet 修改L.circleMarker()的颜色

修改color颜色&#xff0c;我这是不需要展示点&#xff0c;所以设置透明 L.circleMarker(latlng, { radius: 1, color: rgba(0,0,0,0)}).addTo(this.map);