//-------------------------------------------------------------------
//工 程 名:TC35短信收发测试
//功 能:通过短信控制小灯亮灭
//设 计:rtx51
//日 期:2009/09/27
//说 明:http://shop36037744.taobao.com
//修 改:
// 无
//-------------------------------------------------------------------
#include "config.h"
sbit IGT=P4^0;
xdata char GsmBuf[500]; //接收缓冲区
xdata char PhoneNumber[12];
uint16 GsmRecvLen;
//---------------------------------------------------------
//函数名称:void send_char(void)
//函数功能:串口2发送一个字符
//输入参数:
// c, 要发送的字符
//返回参数:无
//---------------------------------------------------------
static void send_char(char c)
{
uint8 temp = 0;
IE2 &= 0xfe; //关闭串口2中断使能 cliff
S2CON &= 0xfd; // 清除串口2发送完成标志
S2BUF = c; // 发送数据
do
{
temp = S2CON;
temp &= 0x02;
}
while (temp == 0);
S2CON &= 0xfd;
IE2 |= 0x01; //使能串口2中断 cliff
}
//---------------------------------------------------------
//函数名称:void send_string(void)
//函数功能:串口1发送一个字符串
//输入参数:
// str, 要发送的字符串
//返回参数:无
//---------------------------------------------------------
static void send_string(char* str)
{
uint8 i;
for (i = 0; str[i]; i++)
send_char(str[i]);
}
//---------------------------------------------------------
//函数名称:void delay_ms(void)
//函数功能:延时函数
//输入参数:无
//返回参数:无
//---------------------------------------------------------
static void delay_ms(void)
{
uint16 i, j;
for (i = 0; i < 100; i++)
for (j = 0; j < 100; j++);
}
//---------------------------------------------------------
//函数名称:void flush_recv_buf(void)
//函数功能:清除接收缓冲区
//输入参数:无
//返回参数:无
//---------------------------------------------------------
static void flush_recv_buf(void)
{
GsmRecvLen = 0;
memset(GsmBuf, 0, sizeof(GsmBuf));
}
//---------------------------------------------------------
//函数名称:void debug_print(void)
//函数功能:打印调试输出
//输入参数:无
//返回参数:无
//---------------------------------------------------------
static void debug_print(void)
{
printf("-----------------------------\n");
printf("%s", GsmBuf);
}
//---------------------------------------------------------
//函数名称:void Gsm_Init(void)
//函数功能:gsm初始化函数
//输入参数:无
//返回参数:无
//---------------------------------------------------------
void gsm_init(void)
{
AUXR1 |= 0x10;
P4M0 |= 0x08; // TXD2(P4.3),推挽输出
P4M1 &= (~0x08);
P4 = 0xff; // RXD2(P4.2),输入
S2CON = 0x50; // S2CON:工作模式1,8-bit UART,允许接收
BRT = 0xfd;
AUXR = 0x10; // 启用波特率发生器
IE2 |= 0x01;
P4M0 |= 0x01; // IGT(P4.0),
P4M1 &= (~0x01);
IGT = 0;
delay_ms();
delay_ms();
delay_ms();
delay_ms();
delay_ms();
delay_ms();
IGT = 1;
delay_ms();
delay_ms();
delay_ms();
delay_ms();
delay_ms();
delay_ms();
delay_ms();
delay_ms();
delay_ms();
delay_ms();
delay_ms();
delay_ms();
IGT = 0;
}
//---------------------------------------------------------
// 函数名称:uint8 gsm_send_cmd(char* pcmd)
// 函数功能:gsm命令字发送函数
// 输入参数:
// pcmd,要发送的命令
// 返回参数:
// 0 ,命令发送成功
// 1 ,命令发送失败
//---------------------------------------------------------
uint8 gsm_send_cmd(char* pcmd)
{
uint16 i;
uint8 ret=0;
printf("******in gsm_send_cmd func!******\n");//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//printf("**the cmdret01 is %d!**\n", ret);//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
flush_recv_buf(); // 清除串口缓冲区
send_string(pcmd); // 发送命令
printf("******cmd sending is:%s", pcmd);//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
for (i = 0; i < 500; i++)
{
// delay_ms();
if (strstr(GsmBuf, "ERROR")) // 命令发送成功
{
ret = 1;
printf("****** cmd send fail\n", ret);//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
break;
}
else
ret = 0;
}
printf("******gsm_send_cmd func is over, in gsmbuf is :%s", GsmBuf);//~~~~~~~~~~~~~~~~~~~~~
printf("******the cmdret05 in gsm_send_cmd is %d!\n\n", ret);//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//debug_print(); // 打印调试信息
return ret;
}
//---------------------------------------------------------
//函数名称:void isr_uart2(void)
//函数功能:gsm接收中断处理函数
//输入参数:
// 无
//返回参数:
// 无
//---------------------------------------------------------
void isr_uart2(void) interrupt 8
{
uint8 stat;
stat = S2CON;
if (stat & 0x01) // 串口数据保存到数据缓冲区
{
S2CON &= 0xfe; //清除接受完成中断标志位
GsmBuf[GsmRecvLen++] = S2BUF;
}
//if (stat & 0x02)
// S2CON &= 0xfd;
}
//---------------------------------------------------------
//函数名称:uint8 gsm_start(void)
//函数功能:查询TC35是否启动
//输入参数:无
//返回参数:
// 0,启动成功
// 1,启动失败
//---------------------------------------------------------
uint8 gsm_start(void)
{
uint8 ret;
ret = gsm_send_cmd("AT\r\n");
return ret;
}
//---------------------------------------------------------
//函数名称:uint8 gsm_check_simcard(void)
//函数功能:检测SIM卡
//输入参数:无
//返回参数:
// 0,SIM卡检测成功
// 1,SIM卡检测失败
//---------------------------------------------------------
uint8 gsm_check_simcard(void)
{
return (gsm_send_cmd("AT+CIMI\r\n"));
}
//---------------------------------------------------------
//函数名称:uint8 gsm_check_network(void)
//函数功能:检测SIM卡
//输入参数:无
//返回参数:
// 0,网络注册成功
// 1,网络注册失败
//---------------------------------------------------------
uint8 gsm_check_network(void)
{
uint8 ret;
ret = gsm_send_cmd("AT+CREG?\r\n");
if (ret == 0)
{
if (!strstr(GsmBuf, "+CREG: 0,0"))
ret = 0;
else
ret = 1;
}
else
ret = 1;
return ret;
}
//---------------------------------------------------------
//函数名称:void gsm_send_message(char* pmsg)
//函数功能:发送短消息
//输入参数:
// pmsg,短消息指针
//返回参数:无
//---------------------------------------------------------
void gsm_send_message(char* pmsg)
{
char cmd[23] = {"AT+CMGS=00000000000\r\n"};
gsm_send_cmd("AT+CMGF=1\r\n"); // 设置短消息为text模式
gsm_send_cmd("AT+CSMP=17,167,0,0\r\n"); //设置短消息文本参数(text模式下)
gsm_send_cmd("AT+CSCS=GSM\r\n"); // 设置GSM字符集
//gsm_send_cmd("AT+CMGS=15840956725\r\n"); // 设置目的手机号码
//gsm_send_cmd("tc35 recieve cmd ok!\x01a");// 设置短消息
memcpy((cmd+8), PhoneNumber, 11);
gsm_send_cmd(cmd);
gsm_send_cmd(pmsg);
}
//---------------------------------------------------------
//函数名称:uint8 gsm_recv_message(char* pmsg)
//函数功能:接收短消息
//输入参数:
// pmsg,短消息指针
//返回参数:
// 0,接收到新的短消息
// 1,未接收到新的短消息
//---------------------------------------------------------
uint8 gsm_recv_message(char* pmsg)
{
uint8 ret=0, i;
char* p;
printf("$$in gsm_recv_message func!$$\n", ret);
//printf("**the original ret is %d!**\n", ret);//~~~~~~~~~~~~~~~~~~~~~~~~~
gsm_send_cmd("AT+CMGF=1\r\n"); // 设置短信模式为text
gsm_send_cmd("AT+CSCS=GSM\r\n"); // 设置gsm字符集
ret = gsm_send_cmd("AT+CMGR=1\r\n");// 读取短消息
printf("$$ret01 in gsm_recv_message is %d!$$\n", ret);//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (ret == 0) //读短信命令发送成功
{
printf("CONTENT AT GSMBUF ARE :%s", GsmBuf);
if (strstr(GsmBuf, "+CMGR: 0,,0")) // 没有新的短消息
{
ret = 1;
printf("$$mei duanxin ret02 is %d!$$\n", ret);//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}
else
{
没有合适的资源?快使用搜索试试~ 我知道了~
单片机,GSM模块短信控制继电器开关
共26个文件
lst:4个
obj:4个
c:3个
5星 · 超过95%的资源 需积分: 9 46 下载量 72 浏览量
2012-12-31
11:54:05
上传
评论 3
收藏 64KB RAR 举报
温馨提示
用单片机与GSM模块通讯,用短信控制继电器相应点的开关。完整Keil工程
资源推荐
资源详情
资源评论
收起资源包目录
短信控制继电器1.rar (26个子文件)
短信控制继电器1
Test_Uv2.Bak 2KB
main.OBJ 12KB
config.h 646B
gsm.OBJ 17KB
Test.uvproj 13KB
Test.Uv2 2KB
Test.uvopt 74KB
Test.plg 0B
main.c 4KB
uart.LST 3KB
Test 33KB
Test.hex 12KB
main.LST 11KB
gsm.c 9KB
Test.Opt 2KB
gsm.LST 17KB
config.LST 2KB
config.OBJ 4KB
Test_Opt.Bak 2KB
uart.c 1KB
uart.OBJ 4KB
Test_Opt 1KB
Test.M51 34KB
Test.lnp 80B
Test_uvopt 57KB
stc12c5a60s2.h 17KB
共 26 条
- 1
资源评论
- zhang11830098542013-03-24不错哦 可有用!
- sannewyuan2014-05-04很好的资料,学习使用PIC的好资料
- a56015842013-06-28不错的资料 。 有启发。
wfzlr
- 粉丝: 2
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功