//单片机89s52控制GSM(TC35i)发短信和打电话程序
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit D10LED=P0^0;//指示灯0
sbit D11LED=P0^1;//指示灯1
sbit SW4=P0^2; //按钮4(没有用)
sbit SW5=P0^3; //开始按钮,按下后开始发短信,打电话
sbit beeper=P0^4; //蜂鸣器提示器件
sbit J1=P0^6; ////继电器1 ,2提示器件
sbit J2=P0^7;
sbit START_TC=P3^2; //启动TC35i的控制端
uchar code PhoneCall[]={"ATD13795568363;"};//打电话数据
uchar code TxtMode[9]={"AT+CMGF=0"}; //短信模式设置PDU模式
uchar code mess_qian[8]={"AT+CMGS="};// 短信 长度设置
uchar code length[2]={"27"}; //短信的长度 2个数(根据短信内容不同要改变)
uchar code cnum[18]={"0891683108803105F0"};//18个数(中心号码设置)
uchar code pdu1[10]={"11000D9168"};//10个(短信格式设置可以为固定+86的手机)
uchar code pnum[12]={"3197558663F3"};//12个数(短信接收手机号码设置)
uchar code pdu2[6]={"0008A7"};//6个 (短信有效期,可以固定不变)
uchar code lenmsg[2]={"0C"}; //短信内容的长度 2个数(16进制)//(因短信具体内容不同要改变的)
uchar code pdumessage[24] = {"606D559CFF0C6210529FFF01"};//12个数。内容为:“恭喜,成功!”的PDU码。
uchar code AT[]={"AT"}; //联机命令
init_chuankou()
{
EA=0; //关总中断
ET1=0;//禁止中断1
SCON=0X50;
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;//波特率为9600
TR1=1;
}
delay_Xms(uint t)
{
uint i,j;
for(i=t;i>0;i--)
for(j=113;j>0;j--);
}
/*******************************************************/
Print_Char(uchar ch)//发送单个字符
{
SBUF = ch; //送入缓冲区
while(TI == 0); //等待发送完毕
TI = 0; //软件清零
}
Print_Str(uchar * str,uint len)//发送字符串,调用Send_Char() len字符串长度
{
while(len--)
{
Print_Char(*str++);
}
}
/********************************************************/
start_TC35i() //启动TC35i的函数
{
beeper=0;
delay_Xms(500);
delay_Xms(500);
beeper=1; //蜂鸣器响一次
D10LED=0;
J1=0;
delay_Xms(2000);
D10LED=1; //继电器1,灯1工作一次
J1=1;
D11LED=0;
J2=0;
delay_Xms(2000);
D11LED=1; //继电器2,灯2工作一次
J2=1;
START_TC=0;//启动TC35i
delay_Xms(1500);// 时间必须大于100ms
START_TC=1;//完成启动 //此后一直保持高电平
}
void GSM_AT() //发“AT”的函数
{
Print_Str(AT,2);
Print_Char('\r'); //以回车作为结束符号,手机才能识别
ES=1;
delay_Xms(1000); //延时
}
/***************************短信**********************************/
void GSM_TXT() //发送AT+cmgf=0 设置短信模式PDU
{
Print_Str(TxtMode,9);
Print_Char('\r');
ES=1;
delay_Xms(1000);
}
void GSM_CMGS() //发送AT+cmgs= (发短信的命令)
{
Print_Str(mess_qian,8);
}
void GSM_length() //设置短信的长度,length(本例为27,实际不同而不同)
{
Print_Str(length,2);
Print_Char('\r');
ES=1;
delay_Xms(1000);
}
/**********************以下是发PDU码的程序*********************************/
void centernum() //发中心号码
{
Print_Str(cnum,18);
}
void PDU_1() //发PDU1(短信格式设置可以为固定+86的手机)
{
Print_Str(pdu1,10);
}
void pdu_phonenum() //发PDU_phonenum(短信接收手机号码设置)
{
Print_Str(pnum,12);
}
void PDU_2() //发PDU2 (短信有效期,可以固定不变)
{
Print_Str(pdu2,6);
}
void Len_msg() //{"0C"}; //短信内容的长度 2个数(16进制)
{
Print_Str(lenmsg,2);
}
void pdu_message() ////短信内容24/2=12个数()
{
Print_Str(pdumessage,24);
Print_Char(0x1a); //发送结束标志位(CTRL+Z )
delay_Xms(1000);
}
/**********************拨号的程序*********************************/
void phone()
{
Print_Str(PhoneCall,15);//{"ATD13795568363;"};//打电话数据
Print_Char('\r');
ES=1;
delay_Xms(5000);
delay_Xms(5000);
}
/*************************************************************/
void main()
{
init_chuankou(); //串口初始化
start_TC35i();
while(1)
{
if(SW5==0)
{
delay_Xms(100); //抖动延时
if(SW5==0)
{
D10LED=0; //打开led0
while(!SW5);//松手检测
D10LED=1; //关闭led0
beeper=0;//开蜂鸣器
delay_Xms(1000);
beeper=1;//关蜂鸣器
}
//delay_Xms(1000);
TI=0;
GSM_TXT();// TxtMode//发送AT+cmgf=0
delay_Xms(1000);
GSM_CMGS(); //发送AT+cmgs=
GSM_length(); //发 27
delay_Xms(1000);
centernum(); //发中心号码 0891683108803105F0
PDU_1(); //11000D9168
pdu_phonenum(); //发PDU_phonenum: 3197558663F3
PDU_2(); //发PDU2 :0008A7
Len_msg(); //{"0C"}; //短信内容的长度 2个数(16进制)
pdu_message(); ////短信内容24/2=12个数()
//606D559CFF0C6210529FFF01 CTRL+Z
//delay_Xms(3000);
delay_Xms(10000);
beeper=0;
delay_Xms(500);
delay_Xms(500);
beeper=1; //蜂鸣器响一次
delay_Xms(100); //蜂鸣器响的间隔
beeper=0;
delay_Xms(500);
delay_Xms(500);
beeper=1;
D11LED=0;
//蜂鸣器响一次 灯1亮//发完短信后响2声开始打电话
GSM_AT();//发 At
phone();
beeper=0;
delay_Xms(500);
delay_Xms(500);
beeper=1; //蜂鸣器响一次
D10LED=0;
D11LED=1;
delay_Xms(50000);
delay_Xms(50000); //over all
}
}
}