/**************************************************************
果云科技 GA6 模块
51 单片机例程
KEY1 : 发送TEXT模式的短信
本例程使用11.0592MHZ时钟---->必须为11.0592M
串口设置为:9600,8,n,1.
技术支持: 杜工
******************************************/
#include <reg52.h>
#include "string.h"
#include "GA6_module_errors.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
/************* 本地常量声明 **************/
#define Buf_Max 70 //串口1缓存长度
#define STABLE_TIMES 10 //等待上电后稳定,再进行自适应波特率
/************* 本地变量声明 **************/
//串口1发送回车换行
#define UART1_SendLR() UART1_SendData(0X0D);UART1_SendData(0X0A)
/*LED端口定义*/
sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit LED3 = P1^3;
sbit LED4 = P1^4;
sbit LED5 = P1^5;
sbit LED6 = P1^6;
sbit LED7 = P1^7;
/*KEY端口定义*/
sbit KEY0 = P2^4;
sbit KEY1 = P2^5;
sbit KEY2 = P2^6;
sbit KEY3 = P2^7;
/************* 本地变量声明 **************/
xdata u8 Uart1_Buf[Buf_Max];
u8 First_Int = 0;
static u8 *phone_num = "AT+CMGS=\"15815522222\""; //拨打电话,修改这里可以修改拨打的电话。
u16 count_20ms;
/************* 本地函数声明 **************/
void delay_ms(u16 ms); //延时ms个20ms ms*20ms
void CLR_Buf(void); //清串口接收缓存
u8 Find(u8 *a); //查找字符串
void UART1_SendData(u8 dat); //串口1发送 1字节
void UART1_SendString(char *s);//串口1发送 字符串
void UART1_Send_Command(char *s);
u8 UART1_Send_AT_Command(u8 *b,u8 *a,u8 wait_time,u16 interval_time);//at命令发送
u8 UART1_Send_AT_Command_END(u8 *b,u8 *a,u8 wait_time,u16 interval_time);
u8 Wait_CREG(u8 query_times);
void Timer0Init(void) //20毫秒@115200
{
TMOD &= 0xF0;
TMOD |= 0x01; //
TL0 = (65536-20000)%256; //
TH0 = (65536-20000)/256; //
TF0 = 0; //
ET0 = 1; //
TR0 = 1; //开始计时
}
void Uart1Init(void) //9600bps@11.05926MHz
{
PCON &= 0x7F; //
SCON = 0x50; //
TMOD &= 0x0F; //
TMOD |= 0x20; //
TL1 = 0xFD; //
TH1 = 0xFD; //
ET1 = 0; //
TR1 = 1; //
ES = 1; //
}
int check_status(void)
{
int ret;
ret = UART1_Send_AT_Command("AT","OK",3,50);//测试通信是否成功
if(ret == 0)
{
return COMMUNITE_ERROR;
}
ret = UART1_Send_AT_Command("AT+CPIN?","READY",2,50);//查询卡是否插上
if(ret == 0)
{
return NO_SIM_CARD_ERROR;
}
ret = Wait_CREG(3);//查询卡是否注册到网络
if(ret == 0)
{
return SIM_CARD_NO_REG_ERROR;
}
return 1;
}
/***************************************************************
注:当然你可以返回其他值,来确定到底是哪一步发送指令出现失败了。
****************************************************************/
int send_text_message(char *content)
{
u8 ret;
char end_char[2];
end_char[0] = 0x1A;//结束字符
end_char[1] = '\0';
//设置存储位置
ret = UART1_Send_AT_Command("AT+CPMS=\"SM\",\"ME\",\"SM\"","OK",3,100);
if(ret == 0)
{
return AT_CPMS_ERROR;
}
ret = UART1_Send_AT_Command("AT+CMGF=1","OK",3,50);//配置为TEXT模式
if(ret == 0)
{
return AT_CMGF_ERROR;
}
ret = UART1_Send_AT_Command("AT+CSCS=\"GSM\"","OK",3,50);//设置字符格式
if(ret == 0)
{
return AT_CSCS_ERROR;
}
ret = UART1_Send_AT_Command(phone_num,">",3,50);//输入收信人的电话号码
if(ret == 0)
{
return AT_CMGS_ERROR;
}
UART1_SendString(content); //此函数发送短信内容 不加回车换行
ret = UART1_Send_AT_Command_END(end_char,"OK",1,250);//发送结束符,等待返回ok,等待5S发一次,因为短信成功发送的状态时间比较长
if(ret == 0)
{
return END_CHAR_ERROR;
}
return 1;
}
/**********************************************/
/*设计思路:
(0)进行串口、定时器初始化工作。
(1)开机等待10秒,等待模块准备好。
(2)发送相应的指令。
************************************************/
void main(void)
{
u8 i;
int ret;
Uart1Init(); //串口初始化
Timer0Init();//TIM0初始化
EA = 1; //开启总中断
for(i = 0;i < STABLE_TIMES;i++)//等待网络稳定
{
delay_ms(50);
}
while (1)
{
delay_ms(50);
LED0 = ~LED0;
if(KEY1==0)
{
delay_ms(1);
if(KEY1==0)
{
while(!KEY1);
ret = check_status();
if(ret == 1)
{
ret = send_text_message("hello,GA6 text test!");//发送TEXT短信
}
if(ret == 1)
{
LED1 = 0;
}
else
{
LED1 = 1;
}
}
}
}
}
/*******************************************************************************
* 函数名 : Timer0_ISR
* 描述 : 定时器0中断服务入口函数,1ms中断一次
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Timer0_ISR() interrupt 1
{
TR0=0;//关定时器
TL0 = (65536-20000)%256; //重设定时器初值
TH0 = (65536-20000)/256; //
if(count_20ms > 0) //20ms延时计数器
{
count_20ms--;
}
TR0=1;//开定时器
}
/********************* UART1中断函数************************/
void UART1_ISR (void) interrupt 4
{
if (RI)
{
RI = 0; //清除RI位
Uart1_Buf[First_Int] = SBUF; //将接收到的字符串存到缓存中
First_Int++; //缓存指针向后移动
if(First_Int > Buf_Max) //如果缓存满,将缓存指针指向缓存的首地址
{
First_Int = 0;
}
}
if (TI)
{
TI = 0; //清除TI位
}
}
/*******************************************************************************
* 函数名 : CLR_Buf
* 描述 : 清除串口2缓存数据
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void CLR_Buf(void)
{
u8 k;
for(k=0;k<Buf_Max;k++) //将缓存内容清零
{
Uart1_Buf[k] = 0x00;
}
First_Int = 0; //接收字符串的起始存储位置
}
/*******************************************************************************
* 函数名 : Find
* 描述 : 判断缓存中是否含有指定的字符串
* 输入 :
* 输出 :
* 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
* 注意 :
*******************************************************************************/
u8 Find(u8 *a)
{
ES = 0; //改进程序
if(strstr(Uart1_Buf,a)!=NULL)
{
ES = 1;
return 1;
}
else
{
ES = 1;
return 0;
}
}
/*******************************************************************************
* 函数名 : Wait_CREG
* 描述 : 等待模块注册成功
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
u8 Wait_CREG(u8 query_times)
{
u8 i;
u8 k;
u8 j;
i = 0;
CLR_Buf();
while(i == 0)
{
UART1_Send_Command("AT+CREG?");
delay_ms(100);
for(k=0;k<Buf_Max;k++)
{
if((Uart1_Buf[k] == '+')&&(Uart1_Buf[k+1] == 'C')&&(Uart1_Buf[k+2] == 'R')&&(Uart1_Buf[k+3] == 'E')&&(Uart1_Buf[k+4] == 'G')&&(Uart1_Buf[k+5] == ':'))
{
if((Uart1_Buf[k+7] == '1')&&((Uart1_Buf[k+9] == '1')||(Uart1_Buf[k+9] == '5')))
{
i = 1;
return 1;
}
}
}
j++;
if(j > query_times)
{
return 0;
}
}
return 0;
}
/*----------------------------
UART1 发送串口数据
-----------------------------*/
void UART1_SendData(u8 dat)
{
ES=0; //关串口中断
SBUF=dat;
while(TI!=1); //等待发送成功
TI=0; //清除发送中断标志
ES=1; //开串口中断
}
/*----------------------------
UART1 发送字符串
-----------------------------*/
void UART1_SendString(char *s)
{
while(*s)//检测字符串结束符
{
UART1_SendData(*s++);//发送当前字符
}
}
/**********************************
发送命令
**********************************/
void UART1_Send_Command(char *s)
{
CLR_Buf();
while(*s)//检测字符串结束符
{
UART1_SendData(*s++);//发送当前字符
}
UART1_SendLR();
}
void UART1_Send_Command_END(char *s)
{
GA6 gprs模块 51单片机 程序
4星 · 超过85%的资源 需积分: 24 133 浏览量
2018-09-11
15:12:46
上传
评论 5
收藏 65KB RAR 举报
qq_37426953
- 粉丝: 0
- 资源: 1
最新资源
- 什么是后端开发-关于后端开发的一些小介绍分享
- Jurassic Pack Vol. II Dinosaurs 侏罗纪包卷恐龙二号Unity游戏模型资源unitypackage
- Jurassic Pack Vol. III Dinosaurs 侏罗纪包卷恐龙三号Unity游戏模型资源unitypackag
- Ultimate Seating Controller 终极座椅控制器Unity游戏开发插件资源unitypackage
- 什么是人工智能-关于人工智能的相关介绍说明
- Figma Converter for Unity适用Unity的Figma转换器Unity游戏开发插件unitypackage
- Creepy Animatronic Anims 令人毛骨悚然的电子动画Unity游戏动画插件资源unitypackage
- Rankings & Leaderboards 排名和排行榜Unity游戏开发插件资源unitypackage
- Semantic Color Palette 语义调色板Unity游戏开发插件资源unitypackage
- Low Poly Nature:Lush and Diverse Environments低聚自然郁郁Unity低多边形模型资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈