单片机控制SIM900A型GSM模块发送数字短信(附源码)_sim900a用单片机发短信-程序员宅基地

技术标签: gsm  数据格式转化  物联网  通信问题  嵌入式  单片机  

一、模块概述

SIM900A是由SIMCom推出的新款紧凑型产品,它属于双频GSM/GPRS模块,完全采用SMT封装形式,SIM900A仅适用于中国市场,其性能稳定,外观精巧,性价比高。

SIM900A采用工业标准接口,工作频率为GSM/GPRS 850/900/1800/1900MHz,可以低功耗实现语音、SMS、数据和传真信息的传输。另外,SIM900A的尺寸大小为24x24x3mm,能适用于M2M应用中的各类设计需求,尤其适用于紧凑型产品设计。

二、产品特性与接口

2.1 SIM900A的主要特性

2.2 SIM900A的TTL电平接口

SIM900A模块提供两组TTL接口,一组为2.85V的TTL接口,可以与3.3V的单片机直接连接(已做了电平匹配);另一组为兼容各种电压的TTL电平,可以与5V、3.3V等单片机直接连接。连接时,需要将SIM900A的TXD与单片机的RXD连接,SIM900A的RXD与单片机的TXD相连接,GND与单片机的GND相连接。例如,模块与普通51系列单片机(TTL电平为5V)的连接应该是:SIM900A的5VT连接到单片机的P3.0管脚,SM900A的5VR连接到单片机的P3.1管脚,SM900A的VCC_MCU连接到直流5V上,SM900A的GND连接到单片机的GND上。如果您的单片机的TTL电平电压为3.3V时,可将单片机的TXD连接到模块上的5VR,将单片机的RXD连接到模块上的5VT,单片机的GND连接到模块的GND,模块上的VCC_MCU接到直流3.3V上。 从这里可以看出来,模块上5VR、5VT 是可以兼容单片机各种TTL电平接口的。接不同的单片机TTL电平接口时,只要保证模块上VCC_MCU接入的电压跟单片机的TTL电平电压一致就可以了。

三、模块供电

SIM900A模块提供一路电源接口,需要接入5V 1A或1A以上的直流电源,推荐1.5A以上的直流电源。模块的正负极在板子的后面有标出:VCC代表接入电源正极,GND代表接入电源负极。电源接口如下图所示:

电源电路设计如下。注意 IN4007允许通过的最大电流为1A,推荐在VCC_4电源正负极跨接1000UF或以上的极性电容

 

四、模块工作状态指示

五、用到的AT指令

1. AT+CSCS="UCS2"

设置为16位通用8字节倍数编码字符集

2. AT+CMGF=1

设置短信为文本格式

3. AT+CSCA?

提供短消息服务中心的号码

4. AT+CSMP=17,167,0,25

在SUBMIT(提交)消息时,SMSC(短消息服务中心)收到消息起的有效时间为24,协议标识为“0”,编码方式为UNICODE

5. AT+CMGS="*************"

设置接收方手机号,*********为接收方手机号的Unicode码

六、例程(例程均为自己编写且通过验证成功)

6.1 头文件定义(.h)

/*该头文件是Sim900a的头文件*/

#ifndef __Sim_H
#define __Sim_H

void Delay1ms(unsigned int x);//一毫秒延时子函数
void Uart1Sends(unsigned char *str);//发送字符串
void SendOneByte(unsigned char c);//发送一字节
void InitUART();//串口初始化
void Change(unsigned int x);//unicode码转化
void Send(unsigned int t,unsigned int ppm);//发送两个数值

#endif

6.2 函数体(.c)

#include<reg51.h>
#include<Sim.h>/

char mess[40];//短信内容的unicode码的倒序排列
unsigned char count;

/*毫秒级延时子函数*/
void Delay1ms(unsigned int x)   //误差 -0.651041666667us
{
    unsigned char a,b;
    while(x>0)
    {
        for(b=4;b>0;b--)
            for(a=113;a>0;a--);
        x--;
    }
}
/*串口初始化*/
void InitUART()
{
    TMOD = 0x20;
    SCON = 0x40;
    TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 0;//关闭串口中断
    TR1 = 1;
}

/*给mess赋值*/
void Change(unsigned int x)
{
	char count1=0;
	unsigned char  a[5];
	while(x>0)//温度取位
	{
		a[count1]=x%10;
		x/=10;
		count1++;
	}
	count1--;//减去多于的count1
	while(count1>=0)//转化温度
	{
		switch(a[count1])
		{
			case 0:mess[count]='0';count++;mess[count]='0';count++;mess[count]='3';count++;mess[count]='0';count++;break;
			case 1:mess[count]='0';count++;mess[count]='0';count++;mess[count]='3';count++;mess[count]='1';count++;break;
			case 2:mess[count]='0';count++;mess[count]='0';count++;mess[count]='3';count++;mess[count]='2';count++;break;
			case 3:mess[count]='0';count++;mess[count]='0';count++;mess[count]='3';count++;mess[count]='3';count++;break;
			case 4:mess[count]='0';count++;mess[count]='0';count++;mess[count]='3';count++;mess[count]='4';count++;break;
			case 5:mess[count]='0';count++;mess[count]='0';count++;mess[count]='3';count++;mess[count]='5';count++;break;
			case 6:mess[count]='0';count++;mess[count]='0';count++;mess[count]='3';count++;mess[count]='6';count++;break;
			case 7:mess[count]='0';count++;mess[count]='0';count++;mess[count]='3';count++;mess[count]='7';count++;break;
			case 8:mess[count]='0';count++;mess[count]='0';count++;mess[count]='3';count++;mess[count]='8';count++;break;
			case 9:mess[count]='0';count++;mess[count]='0';count++;mess[count]='3';count++;mess[count]='9';count++;break;
		}
		count1--;
	}
					
}

/*发送一个字节*/
void SendOneByte(unsigned char c)
{
    SBUF = c;
    while(!TI);
    TI = 0;
}

//串行口连续发送char型数组,遇到终止号'/0'将停止
void Uart1Sends(unsigned char *str)
{
	while(*str!='\0')
	{
		SBUF=*str;
		while(!TI);
		TI=0;
		str++;
	}
}

void Send(unsigned t,unsigned int ppm)
{
	InitUART();//串口初始化
	count=0;//使用前清零
	Change(t);
	mess[count]='0';count++;mess[count]='0';count++;mess[count]='2';count++;mess[count]='0';count++;
	Change(ppm);
	mess[count]='\0';
	Uart1Sends("AT+CSCS=\"UCS2\"\r\n");
	Delay1ms(3000);
	Uart1Sends("AT+CMGF=1\r\n");
	Delay1ms(3000);
	Uart1Sends("AT+CSCA?\r\n");
	Delay1ms(3000);
	Uart1Sends("AT+CSMP=17,167,0,25\r\n");
	Delay1ms(3000);
	Uart1Sends("AT+CMGS=\"******************\"\r\n");//此处修改为对方的电话号的unicode值
	Delay1ms(3000);
	Uart1Sends(&mess);//修改短信内容
	Delay1ms(5000);
	SendOneByte(0x1a);
	Delay1ms(20000);

}

 

注:想要UNICODE转码工具的可以私聊我,我会发给大家

 

左肩理想,右肩担当。君子不怨永远不会停下脚步!

 

 

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37707218/article/details/104703850

智能推荐

java实现关键字屏蔽,JAVA 关键字、敏感字 屏蔽过滤功能实现-程序员宅基地

文章浏览阅读2k次。demo目录结构:文档内容格式: 直接上代码(检索敏感词算法是从网上搜集参考的,有想法的可以搜索DFA算法研究下):SensitiveFilterService.javapackage com.example.sensitivedemo.test;/*** @Author : JCccc* @CreateTime : 2019/7/30* @Description :**/import java...._java 返回类中屏蔽否个key

tf.keras学习之Flatten()_tensorflow keras使用flatten-程序员宅基地

文章浏览阅读1.8k次。参考网址https://tensorflow.google.cn/api_docs/python/tf/keras/layers/Flattentf.keras.layers.Flatten( data_format=None, **kwargs)作用:展平矩阵,将多维矩阵展平为一维矩阵使用:import tensorflow as tfmodel = tf.keras.Sequential()model.add(tf.keras.Flatten())# 展平矩阵..._tensorflow keras使用flatten

微信公众号访问提示网络出错_阅读微信公众号文章,显示网络异常-程序员宅基地

文章浏览阅读9k次。节日快乐,远离BUG!前两天,我们公司的微信公众号平台出现一个问题:点击公众号菜单进行访问的时候,出现网络异常我以为是外网地址不稳定导致公众号无法访问,就先跟运维的同事说了下,因为是周末,所以运维同事并没有及时回复我,然后我把服务器地址复制出来,在浏览器进行访问,访问没问题,这时运维同事让我把地址发给他,他检测一下。这就尴尬了,我当时没有把问题考虑清楚就发出去了,着实挺尴尬的,就给他说,我..._阅读微信公众号文章,显示网络异常

解决self.encoding = charset_by_name(self.charset).encoding-程序员宅基地

文章浏览阅读2.8k次。解决self.encoding = charset_by_name(self.charset).encoding 解决self.encoding = charset_by_name(self.charset).encoding 1 def createMysqlTable(tablename): 2 # config = ..._self.encoding = charset_by_name(self.charset).encoding

python做数据透视表_利用Python进行数据分组/数据透视表-程序员宅基地

文章浏览阅读870次。1.数据分组源数据表如下所示:1.1 分组键是列名分组键是列名时直接将某一列或多列的列名传给groupby()方法,groupby()方法就会按照这一列或多列进行分组。按照一列进行分组import pandas as pddf = pd.DataFrame(pd.read_excel("Client_Data.xlsx"))print(df)#按照客户分类对数据进行分组print (df.grou..._python 透视数据对分组单元格进行运算

云原生Kubernetes:简化K8S应用部署工具Helm_helm image build-程序员宅基地

文章浏览阅读1k次。HELM有点类似于 Ubuntu 中的 APT 或 CentOS 中的 YUM。Charts是创建 Kubernetes 应用实例的信息集合,也就是一个 helm 的程序包,它包含了运行一个 k8s 应用所有需要的镜像、依赖关系和资源定义等,必要时还会包含 Service 资源定义,它类似于 yum 的 rpm 文件。HELM v3版本与v2版本的架构变化1. 最大的改动就是移除了 Tiller 组件,所有功能都通过 Helm CLI 与 ApiServer 直接交互。_helm image build

随便推点

STM32精英版(正点原子STM32F103ZET6开发板)学习篇5——蜂鸣器实验(三种实现方式)_stm32f1vet6实现蜂鸣-程序员宅基地

文章浏览阅读3k次,点赞10次,收藏40次。硬件电路图注意:  不能通过IO口直接驱动大功率器件(蜂鸣器不能直接接IO口,要像上面电路一样通过三极管进行放大,通过电路图易知当BEEP端输出高电平则基极与发射极导通,电流放大从集电极输出,蜂鸣器响,反之不然)  R38(10K电阻)有什么用?因为STM32复位后默认是浮空状态,IO口电平是不确定的,若不接则可能会通过三极管的B极进行放大,接了之后会从这边走从而就不会导致复位后蜂鸣器响创建文件夹BEEP,并在此文件夹下添加子文件夹:CORE、USER、STM32F10x_FWLIB、HARDWA_stm32f1vet6实现蜂鸣

uni-app 之 使用扩展组件(uni ui) Pagination 分页器使用示例_uni-pagination引入-程序员宅基地

文章浏览阅读6.9k次。先贴出 分页器文档的地址:Pagination 分页器使用步骤:1.下载或者导入插件到你的项目;2.在需要使用的页面引入该插件。使用操作:1.下载或者导入插件到你的项目;导入的操作流程示例图:点击使用HBuilder X导入插件确认打开选择项目并确认然后会在你的项目中自动添加已下目录代码,这就是插件的代码2.在需要使用..._uni-pagination引入

Java Double类型 保留 小数点的4中方式_java结果保留小数点后四位,返回double类型-程序员宅基地

文章浏览阅读614次。Java Double类型 保留 小数点的4中方式public class DoubleTest { //保留两位小数第三位如果大于4会进一位(四舍五入) double f = 6.23556; /** *使用精确小数BigDecimal */ public void fun1() { BigDecimal bg = ..._java结果保留小数点后四位,返回double类型

Flink Get Start MVN 命令执行报错-程序员宅基地

文章浏览阅读399次。【代码】Flink Get Start MVN 命令执行报错。

PHP手写MVC (五)—— 路由-程序员宅基地

文章浏览阅读399次,点赞4次,收藏10次。路由是一个框架中必不可少的组件,其作用是把 URL 按照预定规则解析到特定控制器中。我们在这里定义了两种路由规则:查询字符串。在路径后面使用问号加参数,多个参数用 & 分隔。在配置文件使用 querystring 表示#控制器/方法?参数1=值1&参数2=值2http://domain/user/info?name=php&chapter=10路径...

类Unix系统(经常被称为UN*X或*nix)-程序员宅基地

文章浏览阅读308次。九号计划:Unix的后继者,采用UNIX设计与哲学,但更一致地套用至整个分布式系统,功能上并不完全相同。许多旨在为商业用户提供学术用户可用的功能的闭源。这些系统在很大程度上取代了私有副本。这些系统间日益增长的不兼容性导致了包括。进行商业二进制分许可时,出现了许多基于此的闭源系统,包括。衍生出的分布式操作系统,原本由贝尔实验室开发,现在被。的特性,有许多相似处,并且都在一定程度上遵守。- 全部重写,没有UNIX相关的代码。年代出现了各种自由、低成本和不受限的。标准,因此这些变体被成为。386BSD及其子類(_类unix

推荐文章

热门文章

相关标签