/************************************************************
程序说明:
本程序运行后如果gprs模块找到服务商信号可实现接打电话发送短信等功能
*************************************************************/
#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
//以下是板子上LED的配置
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
//以下是单片机的晶振大小
#define FOSC 11059200UL
//以下是开机后拨打的手机号,改成自己想要的号码即可。
//uchar num[] = "ATD10086;\r\n";
//以下是GSM模块返回数据
uchar rec_data[50];
uchar rec_num;
//注意,无论接收到信号还是发送完信号,都会进中断服务程序的
/*初始化程序(必须使用,否则无法收发),次程序将会使用定时器1*/
void SerialInti()//串口初始化程序(必须使用,否则无法收发)
{
EA=0;
TMOD&=0x0F;
TMOD|=0x20;//定时器1操作模式2,8位自动重载定时器
TH1=0xfd;//装入初值,波特率9600
TL1=0xfd;
TR1=1;//打开定时器
SCON=0x50;
//SM0=0;//设置串行通讯工作模式,(10为一部发送,波特率可变,由定时器1的溢出率控制)
//SM1=1;//(同上)在此模式下,定时器溢出一次就发送一个位的数据
REN=1;//串行接收允许位(要先设置sm0sm1再开串行允许)
EA=1;//开总中断
ES=1;//开串行口中断
}
/*串行通讯中断,收发完成将进入该中断*///如:+CMTI:"SM",2
void Serial_interrupt() interrupt 4
{
uchar temp;
temp=SBUF;
rec_data[rec_num++]=temp;
if(rec_num>=50) //>50之后为什么要等于0????
rec_num=0;
else
;
RI=0;//接收中断信号清零,表示将继续接收
}
//串行口连续发送char型数组,遇到终止号/0将停止
void Uart1Sends(uchar *str) //发送手机号uchar num[] = "ATD10086;\r\n";信息内容
{
while(*str!='\0')
{
SBUF=*str;
while(!TI);//等待发送完成信号(TI=1)出现,TI,发送中断
TI=0;
str++;
}
}
/*
void Uart1BYTE(uchar temp) //发送字节,0X1A
{
SBUF=temp;
while(!TI);//等待发送完成信号(TI=1)出现
TI=0;
}
*/
uchar hand(uchar *ptr) //握手
{
if(strstr(rec_data,ptr)!=NULL) //strstr(),在rec_data中查找是否有ptr
return 1;
else
return 0;
}
void clear_rec_data() //strlen()取rec_data的长度,将rec_data中的数据全部清零
{
uchar i;
for(i=0;i<strlen(rec_data);i++)
{
rec_data[i]='0';
}
rec_num=0;
}
//延时函数大概是1ms
void DelaySec(int ms)
{
uint i;
uchar j;
for(i=0;i<ms;i++)
{
for(j=0;j<200;j++);
for(j=0;j<102;j++);
}
}
void main()
{
uchar i = 0;
SerialInti();
//建议在单片机控制GSM模块前,加上两条 AT 指令,用来同步模块与单片机的波特率
Uart1Sends("AT\r\n");
Uart1Sends("AT\r\n");
while(!hand("OK")) //握手
{
clear_rec_data();
Uart1Sends("AT\r\n");
DelaySec(500);//延时
if(hand("OK"))
{
break;
}
}
P10=0;
clear_rec_data();//删除存储的GSM模块返回的数据,以便于以后继续判断
DelaySec(250);//延时
Uart1Sends("ATI\r\n"); //ATI显示产品信息ID号
while(!hand("OK")) //握手
{
clear_rec_data();
Uart1Sends("ATI\r\n");
DelaySec(500);//延时
if(hand("OK"))
{
break;
}
}
P11=0;
clear_rec_data();//删除存储的GSM模块返回的数据,以便于以后继续判断
Uart1Sends("AT+CSQ\r\n");//信号质量
DelaySec(250);//延时
while(!hand("OK")) //握手
{
clear_rec_data();
Uart1Sends("AT+CSQ\r\n");
DelaySec(500);//延时
if(hand("OK"))
{
break;
}
}
P12=0;
clear_rec_data();
Uart1Sends("AT+CPIN?\r\n");//查看是否读到手机卡
DelaySec(250);//延时
while(!hand("READY")) //握手
{
clear_rec_data();
Uart1Sends("AT+CPIN?\r\n");
DelaySec(500);//延时
if(hand("READY"))
{
break;
}
}
P13=0;
clear_rec_data();
Uart1Sends("AT+COPS?\r\n");//是否注册到网络
DelaySec(250);//延时
while(!hand("CHINA")) //握手
{
clear_rec_data();
Uart1Sends("AT+COPS?\r\n");
DelaySec(500);//延时
if(hand("CHINA"))
{
break;
}
}
P14=0;//这个灯一直不亮
}
|