#include<intrins.h>????
#include <string.h>????
#include<stdlib.h>???
#include "STC89C52.H" ,还有他在定义#include "STC89C52.H"时 这句话是什么意思 #ifndef _STC12C5A60S2_H #define _STC12C5A60S2_H
#define uchar unsigned char
#define uint unsigned int
#include "LCD1602.h"
sbit LED1 = P2^2;
sbit LED2 = P2^3;
#define TRY_TIME 20 //定义 尝试次数
unsigned char xdata con[]={"CONNECT.FAIL"};
unsigned char xdata sim[]={"SIM.FAIL"};
unsigned char xdata sta[]={"START.FAIL"};
unsigned char xdata mes[]={"MESSAGE.FAIL"};
unsigned char xdata one[]={"ONE"};
unsigned char xdata two[]={"TWO"};
unsigned char xdata thr[]={"THREE"};
unsigned char xdata fou[]={"FOUR"};
unsigned char net[] = {"*WWW.SINOVE.COM*"};
unsigned char xdata dat[56]; //串口接收数据数组
unsigned char new[2]; //存放短信数目
unsigned char flag = 0;
unsigned char n = 0;
unsigned char ring = 0;
unsigned char sm = 0;
/*******************************************************************
*功能描述:51单片机ms延时函数
*参数描述:Z的值决定了延时长短
*返回说明:无
*完成时间:2012.12.01
*作 者:上海万硅电子
*******************************************************************/
void delay_1ms(unsigned int z)
{
unsigned int x;
unsigned int y;
for (x=z; x>0; x--)
for (y=110; y>0; y--);
}
/******************************************************************
*功能描述:将data数组初始化为内部数据都为‘Z’
*参数说明:无
*返回说明:无
*完成时间:2012.04.01
*作 者:龙程电子科技
******************************************************************/
void Data_Init() //data数组初始化
{
unsigned char i;
for (i=0; i<55; i++)
{
dat = 'Z';
}
}
/*******************************************************************
*功能描述:51单片机的串口初始化
*参数说明:无
*返回说明:无
*完成时间:2012.12.1
*作 者:万硅电子
*注 :在串口的操作中,初始化是非常重要的!
*******************************************************************/
void Uart_Init()
{
SCON = 0X50; //UART方式1;8位UART
REN = 1; //允许串行口接收数据
  CON = 0x00; //SMOD=0;波特率不加倍
TMOD = 0x20; //T1方式2,用于产生波特率
TH1 = 0xFD; //装初值
TL1 = 0xFD;
TR1 = 1; //启动定时器1
EA = 1; //打开全局中断控制
ES = 1; //打开串行口中断
}
/********************************************************************
*功能描述:51单片机的串口发送字节的函数
*参数说明:mydata:要发送的一个字节
*返回说明:无
*完成时间:2012.04.01
*作 者:上海万硅电子
********************************************************************/
void Uart_Send_Byte(unsigned char mydata)
{
ES = 0; //关串口中断
TI = 0; //发送中断标志清零
SBUF = mydata;
while (!TI);
TI = 0;
ES = 1; //开串口中断
}
/*******************************************************************
*功能描述:51单片机串口发送字符串
*参数说明:s:指向字符串的指针
*返回说明:无
*完成时间:2012.04.01
*作 者:上海万硅电子
*******************************************************************/
void Uart_Send_Str(char *s)
{
int len = strlen(s);
int i;
for (i=0; i<len; i++)
{
Uart_Send_Byte(s);
}
}
/******************************************************************
*功能描述:51单片机的串口中断处理函数
*参数说明:无
*返回说明:无
*完成时间:2012.04.01
*作 者:上海万硅电子
******************************************************************/
void Serve() interrupt 4 using 3 //串口中断函数
{
if((SBUF>=65 && SBUF<=90)||(SBUF>=48 && SBUF<=59)) //只存储‘A-Z’大写字母和‘0-9’数字和”:;“
{
dat[n] = SBUF;
n++;
if(n>2)
{
if ((dat[n-1]=='G') && (dat[n-2]=='N')) // 判断是否为来电 "RING"
{
ring = 1;
}
if ((dat[n-1]=='O') && (dat[n-2]=='N')) // 判断是否为挂断(NO CARRIER)
{
delay_1ms(1000);
Data_Init(); //数据数组初始化
n = 0;
}
if ((dat[n-1]=='E') && (dat[n-2]=='I')) // 判断是否为挂断(NO CARRIER)
{
delay_1ms(1000);
Data_Init(); //数据数组初始化
n = 0;
}
if ((dat[n-1]=='T') && (dat[n-2]=='M')) // 判断是否为短信 "+CMTI: "SM",n"
{
sm = 1;
}
if ((dat[n-1]=='M') && (dat[n-2]=='S')) // 判断是否为短信 "+CMTI: "SM",n"
{
sm = 1;
}
if (sm == 1)
{
if ((dat[n-1]<=59) && (dat[n-1]>=48))
{
new[0] = dat[n-1]; //记录短信条数
}
}
if ((dat[n-1]=='R') && (dat[n-2]=='E')) // 判断是否为ERROR
{
delay_1ms(1000);
Data_Init(); //数据数组初始化
n = 0;
}
if ((dat[n-1]=='R') && (dat[n-2]=='O')) // 判断是否为ERROR
{
delay_1ms(1000);
Data_Init(); //数据数组初始化
n = 0;
}
}
}
RI = 0;
}
/************************* 主函数 ***************************/
void main()
{
unsigned char time;
LCDInit();
Uart_Init();
Data_Init();
DisplayString(0, 1, net); //显示www.sinove.com
/***** 判断是否连接
****** 通过发送“AT”返回“ATOK”判断模块与单片机的连接****/
time=0;
do
{
Uart_Send_Str("AT\r");
time++;
delay_1ms(1000);
if (time==TRY_TIME)
{
DisplayString(0, 0, con);
}
if ((dat[0] == 'A') && (dat[1] == 'T')) //检测GSM模块返回值中的关键字
{
flag = 1;
// DisplayString(0, 0, net);
}
else
{
flag = 0;
}
Data_Init(); //数据数组初始化
n = 0; //数据数组标号清零,以便再次从头写入数据
}
while(flag == 0); //一直发送AT(+回车),直到返回ATOK
/* 此时单片机与模块连接成功 */
flag = 0; //标志清零
time = 0; //次数清零
/** 判断是否注册
*** 通过查询本地短信中心号码来判断是否注册;
** 发送"AT+CSCA?\r",返回“AT+CSCA? +CSCA: "+8613800210500",145 OK”**/
do
{
Uart_Send_Str("AT+CSCA?\r");
time++;
delay_1ms(1000);
if (time==TRY_TIME)
{
DisplayString(0, 0, sim); // 超过尝试次数
}
if ((dat[6] == 'C') && (dat[7] == 'S')) //检测GSM模块返回值中的关键字
{ //验证是否返回本地短信中心号码
flag = 1;
}
else
{
flag = 0;
}
Data_Init(); //数据数组初始化
n = 0; //数据数组标号清零,以便再次从头写入数据
}
while(flag == 0); //一直发“AT+CSCA?\r",直到返回本地短信中心号码
/* 此时可以确认 已经SIM卡网络注册成功*/
flag = 0; //标志清零
time = 0; //次数清零
/*********** 短信初始化 *****************************************************
************ AT+CNMI=1,1,2;\r 为设置来短信提醒,有短信会返回 “+CMTI: "SM",n”
************ 发送“AT+CNMI=1,1,2;\r”,模块返回“AT+CNMI=1,1,2;OK”*************/
do
{
Uart_Send_Str("AT+CNMI=1,1,2;\r"); //短信初始化
time++;
delay_1ms(1000);
if (time==TRY_TIME)
{
DisplayString(0, 0, sta); // 超过尝试次数,
}
if ((dat[2] == 'C') && (dat[3] == 'N')) //查询返回值的关键字 验证是否返回本地短信中心号码
{
flag = 1;
}
else
{
flag = 0;
}
Data_Init(); //数据数组初始化
n = 0; //数据数组标号清零,以便再次从头写入数据
}
while(flag == 0); //一直发"AT+CNMI=1,1,2;\r",直到返回有效信息
/* 此时可以确认 短信初始化完成 */
flag = 0; //标志清零
time = 0; //次数清零
/**************** 短信模式初始化
***************** AT+CMGF=1\r 为 TEXT 模式
***************** 发送“AT+CMGF=1\r” 返回“AT+CMGF=1 OK” *******************/
do
{
Uart_Send_Str("AT+CMGF=1\r"); //短信初始化 为TEXT模式
time++;
delay_1ms(1000);
if (time==TRY_TIME)
{
DisplayString(0, 0, mes); // 超过尝试次数,
}
if ((dat[4] == 'G') && (dat[5] == 'F')) //查询返回值的关键字 验证是否返回正确信息
{
flag = 1;
}
else
{
flag = 0;
}
Data_Init(); //数据数组初始化
n = 0; //数据数组标号清零,以便再次从头写入数据
}
while(flag == 0); //一直发,直到返回正确信号
/* 此时,短信模式选择完成 */
flag = 0; //标志清零
time = 0; //次数清零
/*********************至此,GSM 初始化工作完成 ************************/
delay_1ms(1000);
Data_Init(); //数据数组初始化
/****条件总为1,死循环 处理短信和来电(来电自动接听) ******/
while(1)
{
/************ 不断检测是否有新短信和新来电 *************/
do
{
if (ring == 1)
{
Uart_Send_Str("ATA\r"); // 来电自动应答
ring = 0;
delay_1ms(200);
Data_Init(); //数据数组初始化
}
delay_1ms(1000);
if (sm == 1) //验证是否有短信
{
delay_1ms(500);
sm = 0;
flag = 1;
}
else
{
flag = 0;
}
}
while(flag==0); //一直检测,直到有短信时跳出
delay_1ms(1000);
/***********如果有新短信,进行解读**************/
if (flag == 1)
{
/**** 发送 读短信命令"AT+CMGR=n\r" *******/
Uart_Send_Str("AT+CMGR=");
Uart_Send_Byte(new[0]);
Data_Init(); //发送读取短信命令前,将数组清空
n = 0;
Uart_Send_Str("\r");
delay_1ms(4000); //适当延时
/*GSM模块返回内容为: */
/*
AT+CMGR=n
+CMGR: "REC UNREAD","+8615921004272",,"12/04/01,14:00:47+32"
O1
OK
*/
/** O1 为短信内容
/******** 下面为命令解析并执行 *********/
if (dat[50] == 'O') //Open
{
if (dat[51] == '1')
{
DisplayString(0, 0, one);//1602显示one
}
if (dat[51] == '2')
{
DisplayString(0, 0, two);//1602显示two
}
if (dat[51] == '3')
{
DisplayString(0, 0, thr);//1602显示three
}
if (dat[51] == '4')
{
DisplayString(0, 0, fou);//1602显示four
}
}
if (dat[50] == 'C') //Close
{
if (dat[51] == '1')
{
LED1 = 0;//P1^2输出低电平,关灯
}
if (dat[51] == '2')
{
LED1 = 1;//P1^2输出高电平,开灯
}
if (dat[51] == '3')
{
LED2 = 0;//P1^3输出低电平,关灯
}
if (dat[51] == '4')
{
LED2 = 1;//P1^3输出高电平,开灯
}
}
/****** 删除当前短信 *******/
Uart_Send_Str("AT+CMGD=");
Uart_Send_Byte(new[0]);
Uart_Send_Str("\r");
delay_1ms(4000);
/****** 数据初始化 ********/
Data_Init();
n = 0;
flag = 0;
}
}
}
|