一、简介
本模块是咱们做的“依据物联网的老年人关心体系”的子模块,完结的功用是:当检测到温度反常时,就向指定的监护人打电话或许发短信。
二、所需设备
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(“ATrn”);
DelaySec(3);
Uart2Sends(“ATrn”);
DelaySec(3);
Uart2Sends(“ATD10086;rn”);
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;
}