Sim900+单片机开发,实现打电话发短信

发布者:czl55555最新更新时间:2018-05-05 来源: eefocus关键字:Sim900  单片机  打电话  发短信 手机看文章 扫描二维码
随时随地手机看文章

一、简介

       本模块是我们做的“基于物联网的老年人关怀系统”的子模块,实现的功能是:当检测到温度异常时,就向指定的监护人打电话或者发短信

二、所需设备

        Sim900开发板、sim卡、单片机(STC12C5A60S2)、4根杜邦线

三、工作原理

        单片机向Sim900发送AT命令,Sim900收到相应命令后执行相应的功能

四、开发前准备

       1, 1 张中国移动 SIM 卡(未停机,并开通 GPRS 功能(否则不能测试 GPRS 功能) )

       2, 1 个外部直流电源(保证能给 SIM900A 提供 2A 电流)

五、连线

       ATK-SIM900引脚定义:

      SIM900:发送————STXD;接收————SRXD

      串口助手或单片机:发送————RTXD,接收————RRXD

      STC12C5460S2引脚定义:

      串行口1: 发送————TxD/P3.1; 接收————RxD/P3.0

      串行口2: 发送————TxD2/P1.3;接收————RxD2/P1.2

      连接:

       ATK-SIM900上的STXD与SRXD分别与STC12C5460S2上TXD/P3.1和RXD/p3.0相连

       ATK-SIM900上的RRXD与RTXD分别与STC12C5460S2上的P1.3和P1.2相连

六、程序


/************************************************************

 // File Name: main.c

*************************************************************/
/*程序说明:
本程序可以根据发送的命令的不同实现不同功能,为了便于看效果,我实现了向特定号码打电话,当然你可以改成短信等
1.我们的程序全部都是通过单片机串口2与SIM900通讯,串口1用于获得SIM900返回的数据
2.在开发板上放入您的手机卡,接好天线,打开电源,接入耳机。
3.把程序编译后下载到单片机中,使用STC—ISP下载,具体请参照教程。
4.这里,我只是简简单单的实验了下打电话,并且是持续打,没有什么控制,你可以改一下程序,比如按键控制*/



#include "stc12c5a.h"
#include "systerm.h"
#include "gprs.h"
#include "timer.h"

void main()
{
Timer0Init();
Uart1Init(0,1,253);//初始化串口,设置波特率115200
Uart2Init(0,1,253);//初始化串口,设置波特率115200

        //启动Sim900要按下复位键大概3秒钟
GPRS_RST = 0;//Sim900 复位键拉低
DelaySec(3);//延时3秒
GPRS_RST = 1;//Sim900 复位键拉高
//Sim900启动完成
Uart2Sends("AT\r\n");
DelaySec(3);
Uart2Sends("AT\r\n");
DelaySec(3);
Uart2Sends("ATD10086;\r\n");
DelaySec(5000);
}


/************************************************************

 // File Name: gprs.c

************************************************************/



#include "gprs.h"
#include "systerm.h"
/*////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数名:char Uart2Init(char smod,char brtx12,unsigned char reload)
// 作用: 初始化用于连接gprs的串口2 ,串口2只能设置为独立波特率提供波特率
并打开串口2中断和全局中断
// 参数: smod  s2smod位 0/1
brtx12  brtx12位  0/1
reload  reload寄存器数值  0-255
// 返回: -1  s2smod位错误,没有写入0/1
-2 brtx12位错误,没有写入0/1
0
////////////////////////////////////////////////////////////////////////////////////////////////////*/
char Uart2Init(char s2smod,char brtx12,unsigned char reload)
{
S2CON = 0X50;//8位可变波特率,无奇偶位
BRT = reload;//设置独立波特率发生器波特率


if(s2smod == 1)
{
AUXR |= S2SMOD;   //S2SMOD = 1;//波特率倍速位
}
else if(s2smod == 0)
{
AUXR &= (~S2SMOD);   //S2SMOD = 0;//取消波特率倍速位
}
else
{
return -1;
}

if(brtx12 == 1)
{
AUXR |= BRTx12;//BRTx12 = 1;1T模式
}
else if(brtx12 == 0)
{
AUXR &= (~BRTx12);//BRTx12 = 0;12T模式
}
else
{
return -2;
}

AUXR |= BRTR;//开启波特率发生器
IE2 |= ES2;//  ES2 = 1;   //允许串口2中断
EA = 1;    //开总中断
return 0;  
}


/*////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数名:void Uart2Send(char i)
// 作用: 用于gprs连接的串口1向gps发送1字节数据
// 参数: i  要发送的数据
// 返回: void
////////////////////////////////////////////////////////////////////////////////////////////////////*/
void Uart2Send(char i)
{
unsigned char temp = 0;

IE2 &= (~ES2);//关闭串口2中断//ES2 = 0;
S2CON &= (~S2TI);//S2TI = 0;
S2BUF = i;//装入数据
do
{
temp = S2CON;
temp = temp & 0x02;//temp = S2TI;
}while(temp == 0);//判断是否发送完毕


S2CON &= (~S2TI);//S2TI = 0;
IE2 |= ES2;//ES2 = 1;

}


/*////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数名:void Uart2Sends(char* data_at)
// 作用: 发送字符串到串口2 
// 参数: char* data_at 字符串头地址
// 返回:
////////////////////////////////////////////////////////////////////////////////////////////////////*/
void Uart2Sends(char* data_at)
{


unsigned char cnt=0;


IE2 &= (~ES2);//关闭串口2中断//ES2 = 0;
S2CON &= (~S2TI);//S2TI = 0;



while(*(data_at+cnt))//判断一串数据是否结束
{
S2BUF = *(data_at+cnt);//装入数据
while((S2CON & S2TI) == 0);
S2CON &= (~S2TI);//S2TI = 0;
cnt++;


}


S2CON &= (~S2TI);//S2TI = 0;
IE2 |= ES2;//ES2 = 1;
}




/*////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数名:char Uart1Init(char smod,char brtx12,unsigned char reload)
// 作用: 初始化用于连接gps的串口1 ,将串口1设置位独立波特率发生器提供波特率,
并打开串口1中断和全局中断
// 参数: smod  smod位 0/1
brtx12  brtx12位  0/1
reload  reload寄存器数值  0-255
// 返回: -1  smod位错误,没有写入0/1
-2 brtx12位错误,没有写入0/1
0
////////////////////////////////////////////////////////////////////////////////////////////////////*/
//串口设置位独立波特率提供波特率,和串口2使用同一个波特率,也可以使用定时器1来提供波特率
char Uart1Init(char smod,char brtx12,unsigned char reload)
{
SCON =  0X50;//8位可变波特率,无奇偶位(SM0=0,SM1=1),使能串口接收模块(REN=1)
BRT = reload;//设置独立波特率发生器波特率


if(smod == 1)
{
PCON |= SMOD;   //SMOD = 1;//波特率倍速位
}
else if(smod == 0)
{
PCON &= (~SMOD);   //SMOD = 0;//取消波特率倍速位
}
else
{
return -1;
}

if(brtx12 == 1)
{
AUXR |= BRTx12;//BRTx12 = 1;1T模式
}
else if(brtx12 == 0)
{
AUXR &= (~BRTx12);//BRTx12 = 0;12T模式
}
else
{
return -2;
}

  AUXR |= S1BRS;//串口1设置为使用独立波特率发生器
AUXR |= BRTR;//开启波特率发生器

ES = 1;    //开串口中断
EA = 1;    //开总中断
return 0;  
}


/*////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数名:void Uart1Send(char i)
// 作用: 用于gps连接的串口1向gps发送1字节数据
// 参数: i  要发送的数据
// 返回: void
////////////////////////////////////////////////////////////////////////////////////////////////////*/
void Uart1Send(char i)
{
ES = 0; //关串口中断
TI = 0; //清空发送完中断请求标志位
SBUF = i;  //将数据放入寄存器发送
while(TI == 0);//等待发送完毕,发送完毕 TI == 1
TI = 0;  //清空发送完中断请求标志位
ES = 1;  //开串口中断
}


/*////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数名:void Uart1Sends(char* at)
// 作用: 发送字符串到串口1
// 参数: char* at 字符串头地址
// 返回:
////////////////////////////////////////////////////////////////////////////////////////////////////*/
void Uart1Sends(char* at)
{
unsigned char cnt=0;


ES=0;//关串行口中断  
while(*(at+cnt))//判断一串数据是否结束
{
SBUF=*(at+cnt);//发送数据
while(TI==0);  //查询发送是否结束
TI=0; //清除发送一标志位
cnt++;  //准备发送一个数据
}
ES=1;//开串行口中断  
}


/*////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数名: void Uart1InterruptReceive(void) interrupt 4
// 作用: 接收gps模块传来的定位信号,并将GPRMC信息中的各种信息存入gprmc结构体内,详见gprmc结构体
// 参数: void
// 返回: void
////////////////////////////////////////////////////////////////////////////////////////////////////*/
void Uart1InterruptReceive(void) interrupt 4
{
char tmp = 0;
unsigned char i = 0;
if(RI)
{
ES=0;//关串行口中断
RI=0;//接收中断信号清零,表示将继续接收
while(RI!=0);
while(ES!=0);

tmp = SBUF;
ES=1;//开串行口中断  
}
}


/*////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数名: void Uart2InterruptReceive(void)
// 作用:  串口2的中断函数,用于保存接收到的gprs传来的数据,
当 GprsFlagInfoAble=1,时说明当前保存到gprs_dat_recv[0]-gprs_dat_recv[GprsRecvCntAt]中存放的是一个完整的at回复指令,
必须马上读出出来,否则下一个数据到来后该指令将被取代。
GprsFlagInfoStart 在接收信息时该位置1,接收完一组完整at回复指令清0
// 参数:  void
// 返回:  void
////////////////////////////////////////////////////////////////////////////////////////////////////*/
void Uart2InterruptReceive(void) interrupt 8
{
unsigned char tmp = 0;
char i = 0;


IE2 &= (~ES2);//关闭串口2中断//ES2 = 0;
if(S2CON & S2RI)//if(S2RI == 1)
{


S2CON &= (~S2RI);//S2RI = 0;
tmp = S2BUF;
Uart1Send(tmp);
}
else
{
S2CON &= (~S2TI);//S2TI = 0;
}


IE2 |= ES2;//ES2 = 1;
}










/************************************************************

 // File Name: timer.c

************************************************************/



#include "timer.h" 
#include "stc12c5a.h"

volatile unsigned char data timer0_cnt = 0;
volatile int data sec_cnt = 0;

void Timer0Init(void)
{


TMOD=0x01;                     //设置定时器0为工作方式1
TH0=(65536-45872)/256;         //放入初值,11.0592M,50ms
TL0=(65536-45872)%256;


EA=1;                          //开总中断
ET0=1;                        //开定时器0中断
    TR0=1;                         //启动定时器0
}


void timer0() interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;


timer0_cnt++;


if(timer0_cnt == 20)
{
timer0_cnt = 0;
sec_cnt++;
}

}


void DelaySec(unsigned char sec)
{
sec_cnt = 0;
while(sec_cnt < sec);
}


关键字:Sim900  单片机  打电话  发短信 引用地址: Sim900+单片机开发,实现打电话发短信

上一篇:MSP430F149小系统开发板实现RS232串口通信
下一篇:【TI MSP430】如何实现模拟串口通信

推荐阅读最新更新时间:2024-03-16 16:01

Windows下PIC8位单片机源程序汇编和固化(一)
单片机本身没有开发编程能力,所以要把单片机变成一种应用产品,必须借助于硬件开发和软件开发两种工具。在进行软件开发时,首先利用相关的编辑软件,按照相应的格式建立PIC单片机的源程序(助记符程序),然后对源程序进行汇编。在完成汇编之后,用户可以利用模拟调试软件(价位低)或者硬件在线仿真器(价位高)对其目标程序(机器代码)进行运行调试,以发现其错误并修改之。在经过调试、修改、再汇编之后,即可将修改后的目标程序用硬件(工具)编程器将目标代码烧写到用户的PIC芯片中。最后将烧写后(即固化)的芯片插入到用户板(实验板)脱机运行,如还有问题(通常是多条程序的条件下),就检查硬件电路和软件的设计,找出错误并修改、再汇编、调试直到脱机运行正常为止。
[单片机]
Windows下PIC8位<font color='red'>单片机</font>源程序汇编和固化(一)
汽车自动变速器电控单元设计
随着经济的迅速发展,拥有汽车的用户越来越多,而非熟练驾驶员也大大增加,汽车自动变速箱的推广对于提高汽车使用的经济性、安全性、舒适性和减少废气排放有着重大的影响,它使驾车变得更加轻松和安全。目前自动变速箱在国外轿车中应用很广。AG4液力自动变速器是大众系列轿车主要采用的变速装置,它将车速和节气门开度作为电控单元(ECU)的输入信号,经电控单元处理后,再输出给电磁阀,利用电磁阀控制液压回路,通过控制油路的通/断使各档的变速阀动作,从而完成变速控制。其优越性是免除了手动变速器繁杂的换档和脚踩离合器踏板的频繁操作,通过脚踩油门踏板,便可巧妙地实现自动变速,使开车变得简单、省力。液力自动变速器的电控系统使得汽车自动换档,切换速度柔和、平稳,
[嵌入式]
基于S3C2410X处理器和单片机实现多磁控管电源控制的设计方案
1、电路硬件整体设计 设计主要包括3个模块:1,人机交换模块(S3C2410芯片扩展电路)、2,功率输出模块(ATmega16L芯片扩展电路)、3,磁控管工作电路。人机交换模块主要用来接收使用者的命令数据,再传递给功率输出模块输出给定功率。同时接收功率输出模块电路中功率反馈回来的信息,使得使用者能对相应信息做出处理。整体框架如图1—1所示: 1.1基于S3C2410X处理器的控制电路设计 控制系统中采用韩国三星半道体公司的S3C2410X处理器作为主控制芯片。SBC2410X是一款基于ARM920T内核的16/32位RISC嵌入式微处理器,高性价格比,低功耗。应用该芯片作为主控制芯片,并扩展64M SDRAM、64M Nand
[单片机]
基于S3C2410X处理器和<font color='red'>单片机</font>实现多磁控管电源控制的设计方案
国芯思辰 |国产8位MCU TM52F1363在电陶炉中的应用方案
电陶炉是一种通过电能直接转化为热能的电热炉灶,采用远红外加热原理,无高频辐射,内部发热丝有很多种,比如镍铬合金、碳纤维等。电陶炉能在5秒内的炉芯温度高达300℃以上,日常使用非常方便。 国芯思辰某工程师在设计电陶炉方案时,主控芯片使用的TM52F1363,芯片内置LCD驱动器,无需额外的显示驱动电路开销,并且内置了19通道的12位模数转换器(ADC),是家用电陶炉主控的理想选择。 TM52F1363系统框图 TM52F1363是一个新的,快速的8051架构,与业界标准8051指令集完全兼容的8位单片机,并保持了8051外围的功能模块。通常情况下,TM52执行指令,比传统的8051架构快六倍。芯片通过集成多种功能在芯片上,提
[嵌入式]
国芯思辰 |国产8位<font color='red'>MCU</font> TM52F1363在电陶炉中的应用方案
51单片机在没有硬件SPI的情况下 高速读方法
51单片机在没有硬件SPI的情况下 高速读方法 uchar spi_read(void) { //利用51串口的同步移位功能,以达了最高的读度2MHz CLK RI = 0; while(RI == 0); return SBUF; }
[单片机]
51单片机驱动伺服电机程序
51单片机除了几款加强版的带pwm,很多都不带,所以要用51控制伺服电机很多时候就要软件模拟pwm。看了些代码有的是通过延时来输出pwm波,有的也用了定时器但是那些代码要驱动多路伺服电路就显得比较麻烦。下面的代码是通过定时器0产生每0.5ms一次的提醒,程序在大循环中通过调用DJ()函数可以返还值给伺服电机信号引脚,DJ()函数可以定旋转的角度,但是因为定时器设置是0.5ms的中断这就决定了旋转呢角度只能是-45,-90,0,45,90。如果要提高精度就要通过设置定时器的初值,改变函数的num值来达成。 #include reg52.h unsigned int num=0; //舵机 sbit DJ1=P3^6; sbit DJ
[单片机]
51单片机C编程(十三 DAC0832锯齿波的产生)
#include reg51.h #include absacc.h #define DAC XBYTE //DAC0832的地址 void main() { int i; while(1) { for(i=0;i 255;i++) //送数字量进行转换 {DAC=i;} } }
[单片机]
基于C8051F2xx系列MCU芯片实现锅炉水处理控制装置的设计
自然水中通常含有钙镁等离子,俗称硬水。在锅炉用水中需要去除水中的钙镁离子而形成软水以防止锅炉结垢。在生产中锅炉水的软化处理是一项重要的安全指标,所以,对于锅炉水处理的技术要求愈来愈高。单片机以其较高的灵活性和稳定性广泛应用在自动控制领域。本文所设计的锅炉水处理控制装置,由高低水位控制进水阀开关,选用单片机为核心,C语言编程实现循环时间电路控制。该装置已成功应用于成都富华水处理公司。 1 软水生产工艺过程及对自控系统的要求 1.1 生产工艺过程 软化水设备的工作原理是基于阳离子交换原理。水由交换柱上流下,与交换树脂中的盐离子充分接触达到把原水中的杂质、易结垢的重金属阳离子去除掉。其生产工艺大致分为下列几步:①条件满足后运行;②松
[单片机]
基于C8051F2xx系列<font color='red'>MCU</font>芯片实现锅炉水处理控制装置的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved