通过STC15F2K60S2控制SIM900A发中英文短信,打电话
本文通过串口通信,使用STC15系列单片机实现发短信打电话功能。
一. 注意事项
1. 首先要确定手机卡已经注册到网络,具备打电话发短信功能
2. 正确的硬件连接:
P3.0-----STXD或者5VT
P3.1-----SRXD或者5VR
GND---GND(保证模块和单片机都接地)
3. 确认单片机上的晶振,根据晶振修改自己的程序。
4.推荐先将单片机与电脑相连,确定单片机发送的数据是正确的。如果发送的是乱码,请检查晶振与单片机的串口波特率。之前本人就是因为波特率不同步导致无法发送。
二. 代码实现
首先进行初始化,注意串口中断的中断号为4。
void Inti() //9600bps@11.0592MHz
{PCON &= 0x7F; //波特率不倍速SCON = 0x50; //8位数据,可变波特率AUXR |= 0x40; //定时器1时钟为Fosc,即1TAUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xDC; //设定定时初值TH1 = 0xDC; //设定定时器重装值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1SM0=0;//设置串行通讯工作模式,(10为一部发送,波特率可变,由定时器1的溢出率控制)SM1=1;//(同上)在此模式下,定时器溢出一次就发送一个位的数据REN=1;//串行接收允许位(要先设置sm0sm1再开串行允许)EA=1;//开总中断ES=1;//开串行口中断
}
void interrupt_() interrupt 4
{uchar temp;temp=SBUF;rec_data[rec_num++]=temp;if(rec_num>=50)rec_num=0;else;RI=0;//接收中断信号清零,表示将继续接收}
然后建立发送数组,返回数组的函数。
//串行口连续发送char型数组,遇到终止号/0将停止
void Uart1Sends(uchar *str)
{while(*str!='\0'){SBUF=*str;while(!TI);//等待发送完成信号(TI=1)出现TI=0;str++;}
}
void Uart1BYTE(uchar temp)
{SBUF=temp;while(!TI);//等待发送完成信号(TI=1)出现TI=0;}
uchar hand(uchar *ptr)//GSM模块返回数据数组
{if(strstr(rec_data,ptr)!=NULL)return 1;elsereturn 0;
}
也要记得清除返回数组的数据。防止造成干扰。
void clear_rec_data()
{uchar i;for(i=0;i<strlen(rec_data);i++){rec_data[i]='0';}rec_num=0;
}
//延时函数1s钟
void DelaySec(int sec)
{unsigned char i, j, k,m;for(m=0; m<sec; m++){_nop_();_nop_();i = 43;j = 6;k = 203;do{do{while (--k);} while (--j);} while (--i);}
}
主函数如下:首先将单片机和模块的波特率进行统一。然后再进行短信的发送。注意在发送语句之间需要有一定的延迟时间。
#include <STC15F2K60S2.H>
#include <string.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define FOSC_110592M
uchar rec_data[50];//以下是GSM模块返回数据数组
uchar rec_num;void main()
{uchar i = 0;P2=0xa0;P0=0x00;P2=0x80;P0=0xff;Inti();Uart1Sends("AT\r\n"); //同步波特率,如果将模块配置固定波特率,此条指令就不需要发了while(!hand("OK")) {clear_rec_data();i++;Uart1Sends("AT\r\n");//DelaySec(1);//延时if(i>=5){break;}}clear_rec_data();//删除存储的GSM模块返回的数据,以便于以后继续判断DelaySec(1);//延时P0=0x00;//初始化和检验完毕,led灯产生信号。
//发送英文短信短信Uart1Sends("AT+CSCS=\"GSM\"\r\n"); //DelaySec(1);//延时Uart1Sends("AT+CSCA?\r\n"); //短信中心号码DelaySec(1);//延时Uart1Sends("AT+CMGF=1\r\n"); //方式1DelaySec(1);//延时Uart1Sends("AT+CMGS=\"1561288121*\"\r\n"); //此处修改短信接收方电话号DelaySec(1);//延时Uart1Sends("I am xx"); //此处修改短信内容DelaySec(1);//延时Uart1BYTE(0X1A);DelaySec(5);//延时//拨打电话代码Uart1Sends("ATD1561288121*;\r\n"); //拨打电话while(1);
}
扩展部分:
查询信号质量,判断手机卡,检测是否连接上网络,是否插入等其他初始化内容(如果能够确保该初始化正确,可以不用考虑下面的代码部分)。
// Uart1Sends("AT+CSQ\r\n");//查询信号质量
// DelaySec(1);//延时
// i=0;
// while(!hand("OK")) //检测此条指令GSM模块是否执行OK
// {
// clear_rec_data();
// i++;
// Uart1Sends("AT+CSQ\r\n");//
// DelaySec(1);//延时
// if(i>=5)
// {
// break;
// //return;
// }
// }
// P0=0x00;
// clear_rec_data();
// DelaySec(1);//延时
// Uart1Sends("AT+CPIN?\r\n");//查看是否读到手机卡
// DelaySec(1);//延时
// i=0;
// while(!hand("READY")) //检测SIM模块是否收到SIM卡READY
// {
// clear_rec_data();
// i++;
// Uart1Sends("AT+CPIN?\r\n");//是否注册到网络
// DelaySec(1);//延时
// if(i>=5)
// {
// break;
// //return;
// }
// else
// ;
// }
// clear_rec_data();
// DelaySec(1);//延时
三. 最终简化程序
/************************************************************首先要确定模块已经注册到网络,手机卡能使用打电话发短信,并且没有设置PIN。
然后正确的硬件连接 P3.0-----STXD或者5VT P3.1-----SRXD或者5VR GND---GND。
但对于51单片机而言,只能接TTL。
然后确认单片机上的晶振,根据晶振修改自己的程序。
本人推荐先将单片机与电脑相连,确定单片机发送的数据是正确的。
如果发送的是乱码,请检查晶振与单片机的串口波特率。*************************************************************/#include <STC15F2K60S2.H>
#include <string.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define FOSC_110592M
uchar rec_data[50];//GSM模块返回数据数组
uchar rec_num;void SerialInti() //9600bps@11.0592MHz
{PCON &= 0x7F; //波特率不倍速SCON = 0x50; //8位数据,可变波特率AUXR |= 0x40; //定时器1时钟为Fosc,即1TAUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xDC; //设定定时初值TH1 = 0xDC; //设定定时器重装值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1SM0=0;//设置串行通讯工作模式,(10为一部发送,波特率可变,由定时器1的溢出率控制)SM1=1;//(同上)在此模式下,定时器溢出一次就发送一个位的数据REN=1;//串行接收允许位(要先设置sm0sm1再开串行允许)EA=1;//开总中断ES=1;//开串行口中断
}
void Serial_interrupt() interrupt 4
{uchar temp;temp=SBUF;rec_data[rec_num++]=temp;if(rec_num>=50)rec_num=0;else;RI=0;//接收中断信号清零,表示将继续接收}//串行口连续发送char型数组,遇到终止号/0将停止
void Uart1Sends(uchar *str)
{while(*str!='\0'){SBUF=*str;while(!TI);//等待发送完成信号(TI=1)出现TI=0;str++;}
}
void Uart1BYTE(uchar temp)
{SBUF=temp;while(!TI);//等待发送完成信号(TI=1)出现TI=0;}uchar hand(uchar *ptr)
{if(strstr(rec_data,ptr)!=NULL)return 1;elsereturn 0;
}void clear_rec_data()
{uchar i;for(i=0;i<strlen(rec_data);i++){rec_data[i]='0';}rec_num=0;
}
//延时函数1s钟
void DelaySec(int sec)
{unsigned char i, j, k,m;for(m=0; m<sec; m++){_nop_();_nop_();i = 43;j = 6;k = 203;do{do{while (--k);} while (--j);} while (--i);}
}void main()
{uchar i = 0;P2=0xa0;P0=0x00;P2=0x80;P0=0xff;SerialInti();Uart1Sends("AT\r\n"); //同步波特率,如果将模块配置固定波特率,此条指令就不需要发了while(!hand("OK")) {clear_rec_data();i++;Uart1Sends("AT\r\n");//DelaySec(1);//延时if(i>=5){break;}}clear_rec_data();//删除存储的GSM模块返回的数据,以便于以后继续判断DelaySec(1);//延时P0=0x00;//初始化和检验完毕,led灯产生信号。
//发送英文短信短信Uart1Sends("AT+CSCS=\"GSM\"\r\n"); //DelaySec(1);//延时Uart1Sends("AT+CSCA?\r\n"); //短信中心号码DelaySec(1);//延时Uart1Sends("AT+CMGF=1\r\n"); //方式1DelaySec(1);//延时Uart1Sends("AT+CMGS=\"1561288121*\"\r\n"); //此处修改短信接收方电话号DelaySec(1);//延时Uart1Sends("I am xx"); //此处修改短信内容DelaySec(1);//延时Uart1BYTE(0X1A);DelaySec(5);//延时
//拨打电话代码Uart1Sends("ATD1561288121*;\r\n"); //拨打电话while(1);
}
四. 发送中文短信
本功能的实现需要使用unicode编码字符,详情见-->本人博客。
/************************************************************
首先要确定模块已经注册到网络,手机卡能使用打电话发短信,并且没有设置PIN。
然后正确的硬件连接 P3.0-----STXD或者5VT P3.1-----SRXD或者5VR GND---GND。
但对于51单片机而言,只能接TTL。
然后确认单片机上的晶振,根据晶振修改自己的程序。
本人推荐先将单片机与电脑相连,确定单片机发送的数据是正确的。
如果发送的是乱码,请检查晶振与单片机的串口波特率。
*************************************************************/#include <STC15F2K60S2.H>
#include <string.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define FOSC_110592M
uchar rec_data[50];//GSM模块返回数据数组
uchar rec_num;void lInti() //9600bps@11.0592MHz
{PCON &= 0x7F; //波特率不倍速SCON = 0x50; //8位数据,可变波特率AUXR |= 0x40; //定时器1时钟为Fosc,即1TAUXR &= 0xFE; //串口1选择定时器1为波特率发生器TMOD &= 0x0F; //清除定时器1模式位TMOD |= 0x20; //设定定时器1为8位自动重装方式TL1 = 0xDC; //设定定时初值TH1 = 0xDC; //设定定时器重装值ET1 = 0; //禁止定时器1中断TR1 = 1; //启动定时器1SM0=0;//设置串行通讯工作模式,(10为一部发送,波特率可变,由定时器1的溢出率控制)SM1=1;//(同上)在此模式下,定时器溢出一次就发送一个位的数据REN=1;//串行接收允许位(要先设置sm0sm1再开串行允许)EA=1;//开总中断ES=1;//开串行口中断
}
void Serial_interrupt() interrupt 4
{uchar temp;temp=SBUF;rec_data[rec_num++]=temp;if(rec_num>=50)rec_num=0;else;RI=0;//接收中断信号清零,表示将继续接收}//串行口连续发送char型数组,遇到终止号/0将停止
void Uart1Sends(uchar *str)
{while(*str!='\0'){SBUF=*str;while(!TI);//等待发送完成信号(TI=1)出现TI=0;str++;}
}
void Uart1BYTE(uchar temp)
{SBUF=temp;while(!TI);//等待发送完成信号(TI=1)出现TI=0;}uchar hand(uchar *ptr)
{if(strstr(rec_data,ptr)!=NULL)return 1;elsereturn 0;
}void clear_rec_data()
{uchar i;for(i=0;i<strlen(rec_data);i++){rec_data[i]='0';}rec_num=0;
}
//延时函数1s钟
void DelaySec(int sec)
{unsigned char i, j, k,m;for(m=0; m<sec; m++){_nop_();_nop_();i = 43;j = 6;k = 203;do{do{while (--k);} while (--j);} while (--i);}
}void main()
{uchar i = 0;P2=0xa0;P0=0x00;P2=0x80;P0=0xff;Inti();Uart1Sends("AT\r\n"); //同步波特率,如果将模块配置固定波特率,此条指令就不需要发了while(!hand("OK")) {clear_rec_data();i++;Uart1Sends("AT\r\n");//DelaySec(1);//延时if(i>=5){break;}}clear_rec_data();//删除存储的GSM模块返回的数据,以便于以后继续判断DelaySec(1);//延时P0=0x00;//初始化和检验完毕,led灯产生信号。
//发送中文短信短信Uart1Sends("AT+CMGF=1\r\n"); //DelaySec(1);//延时Uart1Sends("AT+CSMP=17,167,2,25\r\n"); DelaySec(1);//延时Uart1Sends("AT+CSCS=\"UCS2\"\r\n"); DelaySec(1);//延时Uart1Sends("AT+CMGS=\"0031003500360031003200380038003100320031****\"\r\n"); //此处修改短信接收方电话号DelaySec(1);//延时Uart1Sends("621172314f60"); //此处修改短信内容DelaySec(1);//延时Uart1BYTE(0X1A);DelaySec(5);//延时
//拨打电话代码Uart1Sends("ATD1561288121*;\r\n"); //拨打电话while(1);
}
通过STC15F2K60S2控制SIM900A发中英文短信,打电话相关推荐
- Linux 串口 gprs at,linux下GPRS模块使用AT命令实现拨接电话,发中英文短信
开发板 :fl2440 cpu : s3c2440(arm9) 开发模块 :A7(GPRS/GPS) 远程登陆软件:PUTTY **** ...
- GPRS使用AT命令拨接电话,发收中英文短信
**************************************************************************************************** ...
- 基于STM32与GSM模块发送中英文短信
基于STM32与GSM模块发送中英文短信 最近在做毕业设计有用到GSM模块进行短信报警,模块的功能比较多这里就不介绍了,一般的拨打电话都很简单就只需要一条指令即可,发送英文短信也很简单也只要几条命令也 ...
- GSM PDU模式发中文短信
http://blog.csdn.net/dlutxie/article/details/7848623 GSM PDU模式发中文短信 网上的资料也有很多,但参考了这么多天才最终搞定,所以还是把自己的 ...
- 单片机控制GSM模块实现短信收发的软件设计
摘要:借助系统模型,阐明GSM模块收发短信的基本概念以及串口控制SMS的基本原理.详细介绍单片机控制GSM模块工作的软件实现过程,对怎样用单片机控制GSM模块收发短信进行探讨,也对程序设计的主体思想作 ...
- 飞信短信接口php,用PHP实现飞信api接口发飞信短信
用PHP实现飞信api接口发飞信短信 不过这个不能和飞信客户端同时登录,二者只能登一个,只要代码在dw里打开,客户端就掉了呵呵~~~ /* * Created on 2010-4-18 * MiaoP ...
- 苹果手机怎么发语音短信?
说到语音,大家最熟悉的就是用微信发语音了,但是微信发语音的前提是必须是好友, 对于企业来说,使用范围还是受限,其实比微信语音应用范围广的就是语音短信,通过语音通知的新式,只要用户手机能正常接听,就能收 ...
- STM32使用GSM模块发送中英文短信(TEXT模式到PDU模式的转换)
STM32使用GSM模块发送中英文短信(TEXT模式到PDU模式的转换) 目的是按下按键,短信发送 PDU转换网站 链接: PDU转换网站. 使用硬件: ··· 开发板:正点原子战舰V3 GSM模块: ...
- 【转】免费发手机短信的内幕
把真相说出来,曾令我为难,因为我之前是在SP工作,即无线服务提供商,说白了就是经常给大家的手机发一些乱七八糟的广告信息之类的商家.其中的黑幕大家未必了解,现在我离开SP了,看着大家用一些免费发短信的软 ...
最新文章
- ubuntu 安装GPU黑屏 修改GRUB_Ubuntu安装mysql后修改用户名和密码
- 伯克利的电气工程和计算机科学专业,2021年加州大学伯克利分校电气工程与计算机科学专业入学要求高吗?...
- 人人可用的在线抠图,还是AI自动化的那种!北大校友的算法被玩出新高度
- 用链表c语言程序设计,C语言程序设计-基于链表的学生成绩管理系统
- MNN windows
- C语言经典例13-水仙花数
- android wifi 通讯录,通过wifi和gmail从symbian手机中将名片夹(通讯录)导入到android手机 | 古意人...
- Hadoop中RPC机制
- CVPR 2020 Oral:北大华为等提出只用加法的神经网络,重磅开源
- SQL Server 2012 管理新特性:AlwaysOn
- 2016考试计算机知识基础题库,2016年计算机二级公共基础知识基础练习题演练(6)...
- HeadFirstJava——十大遗珠之憾
- java 10阶乘_java编程求1到10的阶乘
- java正则表达式逗号_java – 接受逗号或分号分隔值的正则表达式模式
- oracle实现批量drop表,ORACLE下批量DROP表格
- 计算机基础知识在教学的应用,计算机基础知识中项目教学法的应用
- centos 安装 Go环境
- 可视化搭建平台的地图组件和日历组件方案选型
- pthread_cancel pthread_testcancel测试
- 谷歌浏览器怎么同步收藏夹,书签云帮助你
热门文章
- 质价比之王!真我11 Pro+发布1999元起售
- 日记侠:认清李叫兽,才能认清自己
- spss分析方法-信度分析(转载)
- 第十八届全国大学生智能车竞赛华南赛区成绩与奖项
- linux文件名,Linux教程 概述Linux正规文件名
- lint检查会报警告信息:(onTouchListener warning: onTouch should call View#performClick when a click is detecte
- [读论文][2s生成] SnapFusion: Text-to-Image Diffusion Model on MobileDevices within Two Seconds
- 教你快速查询快递物流,并归类正在派件中的单号
- QDialog概率卡死问题
- 狭义云计算和广义云计算_云计算比我们想象的更环保