/******************************************************************** 菜鸟:黄亚光 2010年2月6日 TC35I 使用例子:提取来电显示号码 本程序只用于配合“启东刚成电子有限公司”的TC35I开发板演示,来电提示 两声后(程序停留在等待发送处),将跳线帽跳至PC与单片机通信段,按SW5 发送至PC,用串口调试助手接收显示所提取的内容。本程序只在于给大家一个 参考,希望能对像我一样的爱好者提供点帮助与交流,我认为这个程序至少能 在字符串数组的概念和TC35I有关信息的提取这两方面会给你有所启示,我就是 因为被这两方面困扰了不少时间,所以,突破困扰后特予以公布。 公布这个的另外一个原因,也是想感谢“启东刚成电子有限公司”为我们提供 了一块好开发板(但提供的演示例程太少),本人也只是个刚入门者,对程序 的正确与错误负不起任何责任哦!希望能得到各位高手的不惜指教!(一看这 个就知道我是个菜鸟哦)。你可以自由修改与交流这个程序,但与他人交流时 希望保留本人信息,谢谢!祝各位新年快乐!! EMAIL :yghuang95@sina.com QQ:315259313 /*********************************************************************/ #include //8051头函数 #define uchar unsigned char #define uint unsigned int #define buf_max 38//缓存长度 uint i = 0; uchar aa = 0; //串口接收数据暂存 uchar bb = 0,count3=0; bit zf; bit jdhkg = 0; //来电话启动开关 bit gjkg=0; //关机开关 bit LFKG = 0; //串口来电换行指令检测开关 bit temp1 = 0; bit temp2 = 0; bit read_flag= 0 ; bit cc=0; sbit kaiji = P3^2; //开机启动线 sbit D11 = P0^1; //开机成功指示灯 sbit fmq=P0^4; //0126j sbit sw4=P0^2; //开关机按钮 sbit sw5=P0^3; // 发送按钮 uchar code smso[]={"AT^SMSO"}; //关机 uchar code ate[]={"ATE"}; //握手信号 uchar code at[]={"AT"}; //GSM连接正常命令 uchar rec_buf[buf_max]; //来电号码缓存 uchar code clip1[]={"AT+CLIP=1"};//打开来电提示 void delayms(uchar ms); //延时函数 void kaij(); //开机函数 void off(); //关机函数 void init_ser(); //初始化串口函数 void send_char_com( uchar ch);//向串口发送一个字符函数 void send_string_com( uchar *str, uint ch); //向串口发送一个字符串函数,ch为该字符串长度 void clr_buf(); //清除缓存 void fhda(); //返回0D0A void fhok(); //返回OK void fsate(); //发送ATE函数 void fsat(); //发送AT函数 void fssmso(); //发关机指令函数 void fsclip1(); //发送来电显示指令函数 /*************************************/ void main() { START: kaij(); while(1) { if(read_flag) //如果提取到数据 { ES=0; read_flag= 0 ; //取数标志清0 fmq=0; delayms(10); fmq=1; delayms(50); fmq=0; delayms(10); fmq=1; while(sw5); //等待按键发送 send_string_com(rec_buf,buf_max); ES = 1; } if(!sw4) //3秒关机 off(); if(gjkg) //开机 { gjkg=0; goto START; } } } //====================================== void kaij() //启动TC35I { D11 = 1; //开机前指示灯不亮 kaiji = 0; //打开开机 delayms(20); //延时低电平 kaiji = 1; //恢复高电平 delayms(600); //等待GSM模块启动 init_ser(); //初始化串口 while(D11) //开机成功指示灯亮 { RI = 0; bb = 0; aa = 0; fsate(); //发送ATE握手信号 fhda(); //接收返回的0D0A fhok(); //接收返回的OK if((temp2==1)&&(temp1==1)) { D11 = 0; temp1 = 0; temp2 = 0; } } fsat(); //GSM连接正常命令 fsclip1(); //打开来电提示 } //==================================== void init_ser() //初始化串口 { TMOD = 0x20; //定时器1设置为工作方式2 TH1 = 0xfd; //11.0592MHZ晶振, TL1 = 0xfd; //波特率为9600 TR1 = 1; //启动定时器1 REN = 1; //允许接收数据 SM0 = 0; //方式1,10位,定时器控制 SM1 = 1; EA = 1; //开总中断 ES = 1; //中断法通信 } //========================= void off() //关机 { EA=0; delayms(1); if(sw4) EA=1; delayms(100); //按键3秒关机 if(!sw4) { while(!sw4); fmq=0; delayms(10); fmq=1; fssmso(); //发送关机指令 D11=1; EA=0; while(sw4); //等待重新开机 while(!sw4); fmq=0; delayms(10); fmq=1; gjkg=1; //开机标志 EA=1; } } //====================================== void delayms(uchar ms) // 延时子程序 { unsigned int i; while(ms--) { for(i=0; i<996; i++); } } //========================== void ser() interrupt 4 { ES=0; RI=0; aa=SBUF; bb=1; if(LFKG==1) { if(aa==0x52) { jdhkg = 1; zf=1; } } if(aa==0x0A) { LFKG = 1; } else { LFKG = 0; } if(zf) { rec_buf[count3]=SBUF; count3++; if (count3==buf_max) { if(cc==0) //清除开机过程的数据 { cc=1; count3=0; clr_buf(); //清除缓存数据函数 } else { zf=0; count3=0; read_flag= 1 ;//如果串口接收的数据达到buf_max个 //就置位取数标志 } } } ES=1; } //============================== void fsate() //发送ATE { ES = 0; //发送数据,关掉串口中断 i = 0; while(ate[i]!='\0') //写入数据 { SBUF = ate[i]; while(!TI) ; //等待数据发 TI = 0; i++; } SBUF=0x0d; //CR结束符 while(!TI); TI = 0; ES = 1; //允许串口中断 } //================================ void fsat() { ES = 0; i = 0; while(at[i]!='\0') { SBUF = at[i]; while(!TI) ; TI = 0; i++; } SBUF = 0x0d; while(!TI); TI = 0; ES = 1; } //========================== void fhda() { bit flag1 = 0; bit flag2 = 0; i=0; while((bb==0)&&(i<2000)) { i++; } if((aa==0x0d)||(aa=='\r')) { flag1 = 1; aa = 0; bb = 0; } i=0; while((bb==0)&&(i<2000)) { i++; } if((aa==0x0a)||(aa=='\n')) { flag2 = 1; aa = 0; bb = 0; } if((flag1==1)&&(flag2==1)) { temp1 = 1; flag1 = 0; flag2 = 0; bb = 0; } else { bb = 0; aa = 0; flag1 = 0; flag2 = 0; temp1 = 0; } } //========================= void fhok() { bit flag3 = 0; bit flag4 = 0; i=0; while((bb==0)&&(i<2000)) { i++; } if(aa==0x4F) //'o' { flag3 = 1; aa = 0; bb = 0; } i=0; while((bb==0)&&(i<2000)) { i++; } if(aa==0x4B) //'k' { flag4 = 1; aa = 0; bb = 0; } if((flag3==1)&&(flag4==1)) { temp2 = 1; flag3 = 0; flag4 = 0; bb = 0; } else { aa = 0; bb = 0; temp2 = 0; } } //============================ void fssmso() //发送AT^SMSO关机 { ES=0; i=0; while(smso[i]!='\0') { SBUF = smso[i]; while(!TI) ; TI = 0; i++; } SBUF=0x0d; while(!TI); TI = 0; ES = 1; } //=========================================== void fsclip1() //打开来电提示 { ES=0; i=0; while(clip1[i]!='\0') { SBUF = clip1[i]; while(!TI) ; TI = 0; i++; } SBUF=0x0d; while(!TI); TI = 0; ES = 1; } //================================== //向串口发送一个字符 void send_char_com( unsigned char ch) { ES=0; SBUF=ch; while (TI== 0 ); TI= 0 ; ES=1; } //=========================================== //向串口发送一个字符串,ch为该字符串长度 void send_string_com( unsigned char *str, unsigned int ch) { unsigned int k= 0 ; do { send_char_com(*(str + k)); k++; } while (k < ch); clr_buf(); //清除缓存 } //==================================== void clr_buf() //清除缓存数据函数 { for(i=0;i