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为模式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.mfbz.cn/a/121769.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】排序算法复杂度 及 稳定性分析 【图文详解】

排序算法总结 前言[ 一 ] 小数据基本排序算法&#xff08;1&#xff09;冒泡排序&#xff08;2&#xff09;直接插入排序 [ 二 ] &#xff08;由基本排序衍生的用作&#xff09;处理大数据处理排序&#xff08;1&#xff09;堆排序&#xff08;2&#xff09;希尔排序 [ 三 ] 大…

μC/OS-II---内核:多任务与调度

目录 内核&#xff1a;多任务&#xff08;ucos_ii.h文件的函数&#xff09;Task创建Task创建&#xff08;扩展&#xff09;Task删除/请求删除Task改变Task优先级Task挂起和恢复Task信息获取Task调度器上锁和开锁 内核&#xff1a;调度&#xff08;oc_core.c文件的函数&#xff…

后端面试问题(学习版)

JAVA相关 JAVA语言概述 1. 一个".java"源文件中是否可以包含多个类&#xff1f;有什么限制&#xff1f; 可以。 一个源文件可以声明多个类&#xff0c;但是最多只能有一个类使用public进行声明 且要求声明public的类的类名与源文件相同。 2. Java的优势&#xff…

链表经典面试题之一讲

什么是链表&#xff1f; 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 今天给大家分享一道经典的单链表面试题 力扣题目——反转链表https://leetcode.cn/problems/reverse-linked-list/ 只给了头…

第三阶段第一章——PySpark实战

学习了这么多python的知识&#xff0c;是时候来搞点真玩意儿了~~ 春风得意马蹄疾&#xff0c;一日看尽长安花 o(*&#xffe3;︶&#xffe3;*)o 1.前言介绍 &#xff08;1&#xff09;什么是spark Apache Spark是一个开源的分布式计算框架&#xff0c;用于处理大规模数据集的…

从哪些方面做好电商系统的网站建设?

电子商务的迅猛发展&#xff0c;建设一款成功的电商系统网站成为企业取得竞争优势的重要一环。下面将从用户体验、网站设计、安全性和性能优化等方面&#xff0c;介绍如何打造一款优秀的电商系统网站。 一、用户体验 一款成功的电商系统网站必须注重用户体验&#xff0c;确保用…

康耐视深度学习ViDi-ViDi四大工具之一蓝色定位工具/Locate

目录 工具介绍使用步骤说明调整工具ROI添加特征标签生成定位姿态训练并审核模型编辑器参数说明蓝色定位工具/Locate工具 工具介绍 蓝色定位工具用于识别和定位图像中的特定特征或特征组。该工具的输出可用于为其他ViDi 工具提供位置数据。使用该工具时,您提供图像训练集,然后…

MySQL中的datetime和timestamp有什么区别

相同点: 存储格式相同 datetime和timestamp两者的时间格式都是YYYY-MM-DD HH:MM:SS 不同点: 存储范围不同. datetime的范围是1000-01-01到9999-12-31. 而timestamp是从1970-01-01到2038-01-19, 即后者的时间范围很小. 与时区关系. datetime是存储服务器当前的时区. 而timesta…

电脑怎么做图片二维码?在线制作二维码的方法

图片制作二维码是现在经常被使用的一个功能&#xff0c;比如产品照片、自拍、海报等等不同格式或者类型的文件都可以生成二维码。那么想要快速完成二维码制作&#xff0c;使用图片二维码生成器就可以快速完成制作&#xff0c;本文将给大家分享一下在电脑上制作图片二维码的操作…

Presentation Prompter 5.4.2(mac屏幕提词器)

Presentation Prompter是一款演讲辅助屏幕提词器软件&#xff0c;旨在帮助演讲者在公共演讲、主持活动或录制视频时更加流畅地进行演讲。以下是Presentation Prompter的一些特色功能&#xff1a; 提供滚动或分页显示&#xff1a;可以将演讲稿以滚动或分页的形式显示在屏幕上&a…

管理视频推广工作:新媒体团队的成功策略

目前的新媒体团队&#xff0c;在视频管理时呈现出多、杂、散的特点&#xff0c;如何有效管理视频素材是当下许多新媒体团队的管理痛点&#xff0c;也是管理要点。高效的视频推广管理是新媒体团队提升产出效率的关键。 那么新媒体行业该如何管理视频推广工作&#xff1f; 数据…

【修车案例】一波形一案例(10)

故障车型: 2005 teana 2.0日产 维修厂: 建兴汽车保养厂示波器诊断: 通道A – ABS霍尔传感器信号测量故障分析: 诊断计算机报错左后轮胎轮速异常, 速度与其他车轮差较大。 通过示波器量测ABS信号, 2线式霍尔传感器, 信道A正极接信号线, 负极接地线, 干扰较严重就不建议从蓄电池…

windows环境下PHP7.4多线程设置

windows环境下的PHP设置多线程时有一定的难度&#xff0c;难点主要是PHP版本的选择&#xff0c;多线程扩展的选择&#xff0c;以及相关的设置等。 环境 windows 10php-7.4.33-Win32-vc15-x64php_parallel-1.1.4-7.4-ts-vc15-x64phpstudy 8.1.1.2 为了快速的部署PHP环境&…

Wireshark学习 与 TCP/IP协议分析

Wireshark简介和工具应用 如何开始抓包&#xff1f; 打开wireshark&#xff0c;显示如下网络连接。选择你正在使用的&#xff0c;&#xff08;比如我正在使用无线网上网&#xff09;&#xff0c;双击 可以先看下自己的ip地址和网关ip地址&#xff08;看抓包数据时候会用到&…

Mysql--高级(自定义函数、存储过程、视图、事务、索引)

自定义函数 语法 delimiter $$ create function 函数名称(参数列表) returns 返回类型 begin sql语句 end $$ delimiter ; 说明: delimiter用于设置分割符&#xff0c;默认为分号,主要用于命令行&#xff0c;在“sql语句”部分编写的语句需要以分号结尾&#xff0c;此时回车会…

Qt插件开发_入门教程

文章目录 前言插件的好处具体流程1. 第一,我们先创建一个主框架应用(**第一个工程**)2. GUI 设计 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f215270ccfac4e038e7261c4b4891ec1.png)3. 创建动态库项目(**第2个工程**)4. 给插件项目添加qt界面类5.在插件工程添加一个头…

Unix环境高级编程-学习-02-进程环境之进程终止、命令行参数、环境表、C程序的存储空间布局

目录 一、环境信息 二、声明 三、进程终止 1、情况分类 2、退出函数 3、退出实验 &#xff08;1&#xff09;main声明int和调用return值 &#xff08;2&#xff09;main声明int和不调用return &#xff08;3&#xff09;main声明不int和不调用return 4、atexit 5、at…

SpringBoot加载测试类属性和配置说明

一、项目准备 1.创建项目 2.配置yml文件 test:name: FOREVERlove: sing二、测试类属性 1.Value 说明&#xff1a;读取yml中的数据。 package com.forever;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; import org.spr…

Linux中固定ip端口和修改ip地址

一&#xff0c;更改虚拟网络编辑器 1&#xff0c;首先启动VMware&#xff0c;选择自己要更改ip或固定ip的虚拟机&#xff0c;并找到虚拟网络配编辑器&#xff0c;点击进入 2&#xff0c;进入之后需要点击右下角获取管理员权限后才能修改&#xff0c;有管理员权限之后图片如下 …

TSINGSEE青犀车辆违停AI算法在园区道路管控场景中的应用方案

一、背景与需求 园区作为企业办公、生产制造的重要场所&#xff0c;主要道路车辆违停等违规行为会对园区的安全造成隐患&#xff0c;并且在上下班高峰期内&#xff0c;由于发现不及时&#xff0c;车辆违停行为会造成出入口拥堵现象&#xff0c;这也成为园区管理的棘手问题。 …
最新文章