/**********************************************************
天祥电子GSM V2.0版测试程序
使用前必务必将程序中的手机号更改为自己的手机号,请不要直接用程序中的手机号,否则将电话或短信发送到我们这里了。
给GSM模块上电以后,稍微等一段时间。
灯状态:
1、D2刚开始1秒一闪烁,大约十多秒后,变成长亮加短时闪烁,此时表示设备已经登录到网络。
2、上电后LED1到LED4依次点亮,然后依次熄灭,表示模块被初始化完毕,可以进行后续操作,如果不是此状态,断电重
来,若非我公司原配模块,可能不能正确初始化,请知悉。
功能:
1、key1按下,给手机打电话。
2、key2按下,挂断电话。
3、key3按下,继电器吸合。
4、key4按下,继电器断开。
5、通过电脑向单片机的串口2发送‘1’,模块向手机号发送短信“你好”。
6、手机向模块发送“打开”,板上继电器吸合,然后给手机回复短信“打开了
7、手机向模块发送“关闭”,板上继电器关闭,然后给手机回复短信“关闭了”。
8、手机向模块上的手机号打电话,响一声后,电话被挂断,板上继电器吸合。
9、手机向模块上的手机号再次打次电话,响一声后,电话被挂断,板上继电器断开,依此重复。
单片机型号:STC12C5A32S2 晶振:11.0592M 波特率:两串口都是9600
应用软件:Keil2、3、4
发布时间:2012-09-27
说 明:若用于商业用途,请保留此段文字或注明代码来源
北京海克智动科技开发有限公司保留所有版权
**********************************************************/
#include<STC_NEW_8051.h>
#include<UART1.h>
#include<UART2.h>
#include<JIEMIAN.h>
#include<string.h>
#include<intrins.h>
#include<stdio.h>
#define Buf1_Max 200 //缓存长度200
#define Buf2_Max 10 //缓存长度200
#define Delay_Time 3000 //延时长度
#define uchar unsigned char
#define uint unsigned int
int key=0;
sbit LED1 = P2^0; //状态指示灯1
sbit LED2 = P2^1; //状态指示灯2
sbit LED3 = P2^2; //状态指示灯3
sbit LED4 = P2^3; //状态指示灯4
sbit K1 = P2^5; //继电器控制端,高电平继电器吸合
sbit KEY1 = P0^0; //按键1,拨打电话
sbit KEY2 = P0^1; //按键2,挂断电话
sbit KEY3 = P0^2; //按键3
sbit KEY4 = P0^3; //按键4
sbit KEY5 = P0^4; //按键5
sbit xin = P0^5;
sbit IGT = P2^4; //启动模块信号
unsigned int First_Int = 0,First_Int2 = 0;
unsigned int Times_Other = 0;shijian_Other = 0;
unsigned char i = 0; //定义缓存指针
unsigned char Buf_First_Serial[Buf1_Max]; //定义缓存数组
unsigned char Buf_2_Serial[Buf2_Max]; //定义缓存数组
unsigned char Ring_num=0;
char code sms[]="0031003000396C345B8C4E86"; //"温度:35C"的Unicode码,发送其它中文,可在这里修改
char code xianshi[]="AT+CLIP=1\n";
char code str[]="AT\n"; //定义字符串1
char code str2[]="AT+CMGF=0\n"; //定义字符串2
char code str3[]="AT+CSCS=GSM\n"; //定义字符串3
char code str4[]="AT+CSMP=17,167,0,8\n"; //定义字符串4
char code str5[]="AT+CMGS="; //定义字符串5
char code str6[]="0891683110808805F011000D9168"; //定义字符串6
char code str7[]="000800"; //定义字符串7
char code str8[]="AT\n"; //定义字符串8
char code str9[]="AT+CMGF=1\n"; //定义字符串9
char code str101[]="AT+CSCS=GSM\n"; //定义字符串10
char code str111[]="AT+CSMP=17,167,0,0\n"; //定义字符串11
char code str12[]="AT+CMGS=13101601289\n"; //定义字符串12
char code str13[]="Hello world!!"; //定义字符串13
char code str14[]="\x1a"; //定义字符串14
void GSM_Sent_PDU_Message(char num[],char sms[]); //声明给指定号码发送PDU模式短信息函数
//0891683108401505F011000D9168
char code str1[]="0891683110808805F011000D9168"; //这里面需要修改手机卡所在地短信中心号码
char code str10[]="11000D9168";
char code str11[]="000800";
char code num[]="18824141247;"; //定义要拨打的电话号码,拨打其它电话在这时修改
char code Phone_num1[]="8128141442F7"; //定义要拨打的电话号码,拨打其它电话在这时修改,这是奇偶位置对调后的
char code Phone_num2[]="8128142480F4"; //定义要拨打的电话号码,拨打其它电话在这时修改,这是奇偶位置对调后的
char code CSCA_num[] = "683110808805F0"; //短信中心号码,奇偶位置对调后的
char code str21[]="4F60597DFF0C00320031680B0034003000395BBF820D76846C345DF2559D5B8CFF0C8BF753CA65F690016C34FF0C8C228C22300280547CFB77ED53F7FF1A003600330031003200340037"; //你好
char code str22[]="996E6C34673A5DF262535F00007E"; //打开了
char code str23[]="996E6C34673A5DF2517395ED007E"; //关闭了
void Delay_ms(unsigned int time); //声明延时函数
void GSM_Sent_PDU_Message1(void);
void GSM_Sent_PDU_Message2(void);
void GSM_Sent_PDU_Message3(void);
void Set_PDU_Mode(void);
/*****************************清除串口1缓存数据函数******************************/
void CLR_Buf1(void)
{
unsigned int k;
for(k=0;k<Buf1_Max;k++) //将缓存内容清零
{
Buf_First_Serial[k] = 0x30;
}
First_Int = 0; //接收字符串的起始存储位置
}
/*****************判断缓存中是否含有指定的字符串函数******************/
/*函数原型:bit Hand(unsigned char *a)
/*函数功能:判断缓存中是否含有指定的字符串
/*输入参数:unsigned char *a 指定的字符串
/*输出参数:bit 1---含有 0---不含有
/*调用模块:无
/*******************************************************************/
bit Hand(unsigned char *a)
{
if(strstr(Buf_First_Serial,a)!=NULL)
return 1;
else
return 0;
}
bit Hand1(void)
{
if((strstr(Buf_First_Serial,"CREG: 0,1")!=NULL)||(strstr(Buf_First_Serial,"CREG: 0,5")!=NULL)) //返回任意一种就说明登录了网络
return 1;
else
return 0;
}
/**********************************主函数******************************/
void main(void)
{
char haoma[]="___________;";
char wenzi1[]="初始化中...";
char wenzi2[]="欢迎使用智能手机";
char wenzi3[]="___________;";
char wenzi4[16]="号码: ";
int abc=0;
int x=0,y=0,z=0,i=0,j=0;
init_lcd();
display_12864(3,0,wenzi1);
K1=0; //上电默认继电器为关闭状态
P2M0 = 0x20; //P2.5设置为推挽输出 89系列单片机无效
P2M1 = 0X00;
IGT=0;
Delay_ms(1000); //延时
IGT=1;
Serial_Init(); //第一个串口初始化
Second_Serial_Port_Initial(); //第二个串口初始化
CLR_Buf1(); //清除缓存内容
Delay_ms(10000); //延时
while(!Hand1()) //判断是否登录了网络,如果不成功延时一会,再发送AT握手指令
{
Send_ASCII("AT+CREG?"); //发送指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(6000); //延时
}
Send_ASCII("AT"); //发送联机指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(Delay_Time); //延时
while(!Hand("OK")) //判断是否握手成功,如果不成功延时一会,再发送AT握手指令
{
Send_ASCII("AT"); //发送联机指令
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(6000); //延时
}
CLR_Buf1(); //清除缓存内容
LED1 = 0; //点亮握手成功指示灯
Delay_ms(Delay_Time); //延时
Send_ASCII("ATE0"); //取消回显防止串口接收其它没用的数据
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(Delay_Time); //延时
/* Send_ASCII("AT+CPMS=\"MT\",\"MT\",\"MT\"");//所有操作都在MT(模块终端)中进行
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(Delay_Time);
// while(!Hand("OK")); //等待设置成功 */
CLR_Buf1(); //清除缓存内容
// Delay_ms(Delay_Time); //延时
Send_ASCII("AT+CNMI=2,1");//设置当有新短信到来时提示
Send_Hex(0x0d); //发送回车符
Send_Hex(0x0a); //发送换行符
Delay_ms(Delay_Time); //延时
while(!Hand("OK")); //等待设置成功
CLR_Buf1(); //清除缓存内容
LED2 = 0; //点亮设置成功指示灯
Delay_ms(Dela