当前位置:首页 > 单片机 > 单片机
[导读] 一、简介 本模块是我们做的“基于物联网的老年人关怀系统”的子模块,实现的功能是:当检测到温度异常时,就向指定的监护人打电话或者发短信二、所需设备 Sim900开发板、sim卡、单片机(STC12C5A60S

一、简介

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

二、所需设备

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;
}










/******

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

8位单片机在嵌入式设计领域已经成为半个多世纪以来的主流选择。尽管嵌入式系统市场日益复杂,8位单片机依然不断发展,积极应对新的挑战和系统需求。如今,Microchip推出的8位PIC®和AVR®单片机系列,配备了先进的独立...

关键字: 单片机 嵌入式 CPU

在嵌入式系统开发中,程序烧录是连接软件设计与硬件实现的关键环节。当前主流的单片机烧录技术已形成ICP(在电路编程)、ISP(在系统编程)、IAP(在应用编程)三大技术体系,分别对应开发调试、量产烧录、远程升级等不同场景。...

关键字: 单片机 ISP ICP IAP 嵌入式系统开发

在嵌入式系统开发中,看门狗(Watchdog Timer, WDT)是保障系统可靠性的核心组件,其初始化时机的选择直接影响系统抗干扰能力和稳定性。本文从硬件架构、软件流程、安全规范三个维度,系统分析看门狗初始化的最佳实践...

关键字: 单片机 看门狗 嵌入式系统

本文中,小编将对单片机予以介绍,如果你想对它的详细情况有所认识,或者想要增进对它的了解程度,不妨请看以下内容哦。

关键字: 单片机 开发板 Keil

随着单片机系统越来越广泛地应用于消费类电子、医疗、工业自动化、智能化仪器仪表、航空航天等各领域,单片机系统面临着电磁干扰(EMI)日益严重的威胁。电磁兼容性(EMC)包含系统的发射和敏感度两方面的问题。

关键字: 单片机 电磁兼容

以下内容中,小编将对单片机的相关内容进行着重介绍和阐述,希望本文能帮您增进对单片机的了解,和小编一起来看看吧。

关键字: 单片机 复位电路

在这篇文章中,小编将为大家带来单片机的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 单片机 异常复位

今天,小编将在这篇文章中为大家带来单片机的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: 单片机 仿真器

单片机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对它的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 单片机 中断 boot

一直以来,单片机都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来单片机的相关介绍,详细内容请看下文。

关键字: 单片机 数字信号 模拟信号
关闭