您的位置 首页 编程

STC12C5A60S2单片机老年人关心体系完成打电话和发短信的规划

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

一、简介

本模块是咱们做的“依据物联网的老年人关心体系”的子模块,完结的功用是:当检测到温度反常时,就向指定的监护人打电话或许发短信。

二、所需设备

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;

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/345061.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部