基于-51单片机GPRS手机教程_第1页
基于-51单片机GPRS手机教程_第2页
基于-51单片机GPRS手机教程_第3页
基于-51单片机GPRS手机教程_第4页
基于-51单片机GPRS手机教程_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-. z基于51单片机GPRS打等功能的实现!血顶猎鹰大家好,小弟花了大半个月时间折腾出使用51单片机和TC35进展打,发短信,收到短信后回一个短信给发信人谁发的就回给谁,不是指特定的一个人!网上好多程序都是不能用的,这个程序经本人实际调试过,可以使用!先介绍下功能:按下第一个按钮打给程序中指定的手机按下第二个键发温度值给程序中指定的手机按下第三个键发测试短信给程序中指定的手机随便来个手机发一个bang给和单片机连在一起的手机卡,手机卡回ph=0.7给你的手机,发别的字符就不会这个相当于密码,当然这个bang和ph=0.7这个是你自己设的。下面看看电路图:右边那个长长的就是TC35的接口了,第

2、15脚接单片机,其他的按着连就行了。处于方便,1602就这样接了,还有按钮怎么接程序看看就知道了,红笔是我修改的,你懂的!这些脚和单片机一下,再接下晶振就好了,接下来进入正题。程序如下,程序横向有点长,为了让大家可以看程序方便点就把字体缩小了。里面解释很详细了,程序我是修改别人的,之前不能用,现在可以了。为了便于大家理解,我把几个重要的地方说下打过程mingling(3,AT12);for(*=0;*11;*+)senddata(neirong*); senddata(0*3b);senddata(0*0D);while(sw1=0); senddata(0*0D);/发0*0d停顿打,首先发

3、一些命令准备打,然后输入,在容里面,然后完毕符号,等待按键松开就不打了。发短信的过程ES=0;mingling(8,AT7);for(i=0;i11;i+)senddata(neirongi);senddata(0*0d);delaymm(100);senddata(shi+0*30);senddata(ge+0*30); /发送数据容senddata(0*20);senddata(0*1a);senddata(0*0d);ES=1;串口中断关不关都没事的,一般不会冲突。过程和打的差不多,只是命令有点不同,你懂的!承受短信过程先检测下有没短信来receive_ready();来了的话那个TC3

4、5通过串口给单片机发东西,我看了下东西是这个:&+CMTI: SM,10 10表示我当前的短信数,说明我之前有9条,加上现在的共10条我们取标志位TI,所以有SystemBuf5=0*54)&SystemBuf6=0*49就表示短信来了,0*54,0*49就是TI的意思,你懂的!来短信了我们准备发出短信, if(receiveready=1) read_message(); receiveready=0; sendready=1; Delay_ms(300); message_read();这里是准备的过程其中void message_read(void) /*准备是否回复短信给目标*/ if

5、(sendready=1)&(SystemBuf5=0*47)&(SystemBuf6=0*52) send=1;就是绕来绕去,你们也可以不绕,这里简单。另外我看了下这个时候数组里面存的东西,用我下面注释了的程序就好了如果你们也想看看 /*write_cmd(0*01);write_cmd(0*80);for(i=64;i80;i+)write_dat(SystemBufi);delaymm(1); write_cmd(0*c0);for(i=80;i91;i+)write_dat(SystemBufi);delaymm(1); while(1);/读出来看下,结果是 /&+CMGR: REC

6、 UN 015 /READ,+86151581 1631 /07680,11/06/1 3247 /1,14:01:09+32& 4863 /34567 6479 /8912345678 8089 */看这个小东西把你的手机,发的时间日期,容都记下来存到数组里了,接下来的事情就好办了void readmend(void) /*读取短信容,判断相应指令是否正确*/ uchar i; for(i=0;i4;i+) /将短信容中的指令局部截取出来放到 /mandBuf数组中 mandBufi=SystemBuf64+i; if(mandBuf0=b)&(mandBuf1=a)&(mandBuf2=n

7、)&(mandBuf3=g) /判断指令是否为开发光管指令 write_cmd(0*01); /测试接收write_cmd(0*80);write_dat(b);write_dat(a);write_dat(n);write_dat(g);sendmessage(); /如果发送的指令既不是bang就定义为错误操作,不干别的这里读短信容看看我们的暗号是不是对的,我这里就设置成bang了,如果密码是对的,我们就发短信!上面我们不是看了这个小东西存的东西都放在哪了,看到没,在64开场就是你的容了接下来我们来看看它是怎么发出去的void sendmessage(void) /*发送回复短信指令*/

8、uchar i;for(i=0;i8;i+) AT_SendNumberi=AT_CMGSi; for(i=8;i19;i+) AT_SendNumberi=SystemBuf18+i;/位置2636 将对方提取用来回复给对方 sendstring(AT_SendNumber);senddata(0*0d);delaymm(100);senddata(P);senddata(H);senddata(=);senddata(7);senddata(.);senddata(0);/容senddata(0*20);senddata(0*1a);senddata(0*0d);Delay_ms(30);

9、看到没,和之前我们发短信的方法是一样的,只不过这里用的是它数组里存的,所在位置2636,很方便看出来的哈,用我上面的显示程序就行了。接下来就是删除短信了,发一个指令还有储存的位置,这里人性化处理,不把你以前存在卡里的短信删掉,删掉的是你放进卡之后发过去的指令,这个是这样实现的。read_message(void)程序执行的时候把位置读走了,但是后来没消掉看到没在delete_message(void)中我们用一个循环把你的位置放到数组里,然后再删,程序如下for(i=8;i11;i+)AT_deletei=numberbufi-8; 好了,根本也就是这些了,打到这里累死我了!下面是整个程序!大

10、家拿回去用吧。*include*include*define uchar unsigned char*define uint unsigned int*define R*In 90/定义接收的数组长度为90uchar code AT=AT;/握手信号uchar code ATE=ATE; /关回显uchar code AT_MI=AT+MI=2,1;/设置这组参数来了新信息直接显示到串口,不作存储uchar code AT_CSCA=AT+CSCA=+00;/设置效劳中心AT+CSCA=+00uchar code AT_CMGF=AT+CMGF=1;/设置短信的格式为te*t格式uchar c

11、ode AT_CMGR=AT+CMGR=;/读取短信指令uchar code AT_CMGS=AT+CMGS=;/发送短信指令uchar code AT_CMGD=AT+CMGD=;/发送短信指令uchar AT_delete12;uchar AT_Read12;/用来存储发送读取短信指令 uchar AT_SendNumber22; /用来存储发送短信指令uchar numberbuf3; /用来保存短信条数 uchar idata SystemBufR*In; /储存出口接收数据 uchar mandBuf4; /用来储存指令 uchar R*=0;bit receiveready=0;

12、/接收短信标志位bit sendready=0; /发送短信准备标志位bit send=0; /发送短信标志位sbit IGT=P27;/启动GSM的启动线连IGTsbit sw1=P33; /打sbit sw2=P34;/发测试短信sbit sw3=P35;/发温度sbit beep=P32; /蜂鸣器void Delay_ms(uint i);void Start_GSM(void);void UART_init (void);void sendchar(uchar ch);void sendstring(uchar *p);void GSM_INIT(void);void receive

13、_ready(void);void message_read(void);void read_message(void);void sendmessage(void);uchar code AT7=0*41,0*54,0*2B,0*43,0*4D,0*47,0*53,0*3D;/AT+CMGS= AT+CMGS=+8613*回车输入短消息。Crtl+Z完毕并发送。uchar code AT12=0*41,0*54,0*44,0*3E;/ATD ATD*; 拨号,*为需要拨的,如呼叫,则为ATD;uchar code neirong11=; /sbit DQ=P37; /DS18B20数据传输线

14、接单片机的相应的引脚unsigned char tempL=0; /临时变量低位unsigned char tempH=0;/临时变量高位float temperature; /温度值unsigned char k,ge,shi,bai;uchar code atshanchu= AT+CMGD=9;sbit lcdrs=P10;sbit lcdrw=P11;sbit lcden=P12;void delaymm(uint z)uint *,y;for(*=z;*0;*-)for(y=110;y0;y-);void delay(unsigned int k) unsigned int n; n

15、=0; while(n 0;i-) DQ=1; delay(1); DQ=0; dat=1; DQ=1; if(DQ) dat|=0*80; delay(4); return(dat);void WriteOneChar(unsigned char dat) /*函数功能:向DS18B20写一字节数据*/ unsigned char i=0; for(i=8;i0;i-) DQ=0; DQ=dat&0*01;delay(5);DQ=1;dat=1;delay(4);void Init_DS18B20(void)/*函数功能:DS18B20初始化子程序*/unsigned char *=0; D

16、Q=1; /DQ先置高 delay(8); /延时 DQ=0; /发送复位脉冲 delay(85); /延时480ms) DQ=1; /拉高数据线 delay(14); /等待1560ms) ReadTemperature(void) /*函数功能:向DS18B20读温度值*/ Init_DS18B20(); /初始化WriteOneChar(0*cc); /跳过读序列号的操作WriteOneChar(0*44); /启动温度转换delaymm(125); /转换需要一点时间,延时Init_DS18B20(); /初始化WriteOneChar(0*cc); /跳过读序列号的操作WriteOn

17、eChar(0*be); /读温度存放器头两个值分别为温度的低位和高位delaymm(125);tempL=ReadOneChar(); /读出温度的低位LSBtempH=ReadOneChar(); /读出温度的高位MSB /温度转换,把上下位做相应的运算转化为实际温度temperature=(tempH*256)+tempL)*0.0625; delay(200);return(temperature);void senddata(uchar dat) /*发送数据函数*/ SBUF =dat; while(!TI); TI = 0;void mingling(uchar zijie,uc

18、har *p)/*发送数组函数*/ uchar m; for(m=0;m0;i-) for(j=0;j125;j+) ; /*启动TC35,在 15脚IGT加时长至少为100ms的低电平,该信号下降沿时间小于1ms。启动后,15 脚的信号保持高电平*/void Start_GSM(void) IGT=0; Delay_ms(1000); IGT=1; Delay_ms(1000); void UART_init (void) /*对串口进展初始化*/ TMOD=0*20; /选择定时器1 PCON=0*00;/波特率不加倍 SCON=0*50;/串行工作方式1允许串行接收 TH1=0*FD;/

19、实验板上晶振位11.0592MHZ,选择波特率为9600 TL1=0*FD;/在相应计数器上赋值 EA=1;/总中断开启 ES=1;/串行中断开启 TR1=1;/开启定时器1 void sendchar(uchar ch)/*单片机发送一字节数据*/ SBUF=ch;while(TI=0);TI=0;void sendstring(uchar *p) /*通过串口发送字符串*/ while(*p) sendchar(*p); p+; sendchar(0*0D); sendchar(0*0A);void receive(void) interrupt 4 using 1/*通过中断,串口接收数

20、据*/ if(RI) if(R*R*In) SystemBufR*=SBUF; R*+; RI=0; void GSM_INIT(void) /*初始化TC35模块*/LOOP:Delay_ms(1000);sendstring(AT);Delay_ms(1000); sendstring(ATE); Delay_ms(1000); sendstring(AT_MI);Delay_ms(1000); sendstring(AT_CSCA);Delay_ms(1000); for(R*=0;R*R*In;R*+) SystemBufR*=0*00; R*=0; sendstring(AT_CMG

21、F); Delay_ms(1000); if(SystemBuf2=O)&(SystemBuf3=K) /判断是否模块初始化成功,成功的话模块会回复OK给单片机 /如果单片机没有收到OK,就继续发送初始化指令/for(R*=0;R*R*In;R*+) SystemBufR*=0*00; R*=0; else for(R*=0;R*R*In;R*+) SystemBufR*=0*00; R*=0; goto LOOP; void receive_ready(void) /*接收短信准备*/ uchar i;if(SystemBuf5=0*54)&SystemBuf6=0*49) /如果有新短信来

22、,模块会通过串口向单片机发送字符串,TI /此函数的功能是判断是否有新短信来,如果来的话就置位准备承受位标志为1receiveready=1; /如果不是新短信的指令,就舍弃,并将接收数组清零/*write_cmd(0*01);write_cmd(0*80);for(i=0;i16;i+)write_dat(SystemBufi);delaymm(1); write_cmd(0*c0);for(i=16;i32;i+)write_dat(SystemBufi);delaymm(1); /返回的是&+CMTI: SM,10 10表示我当前的短信数,说明我之前有9条,加上现在的共10条while(

23、1); /删除短信的话我不会把以前存在卡里的短信的删掉*/ else for(i=0;iR*;i+) SystemBufi=0*00; R*=0; void message_read(void) /*准备是否回复短信给目标*/ if(sendready=1)&(SystemBuf5=0*47)&(SystemBuf6=0*52) send=1;void read_message(void) /*发送读取短信指令*/ uchar i; Delay_ms(1000); for(i=0;i3;i+) numberbufi=SystemBuf14+i; /读走,10 for(i=0;i8;i+)AT_

24、Readi=AT_CMGRi;/读取短信指令 for(i=8;i11;i+) AT_Readi=numberbufi-8;/读走,10,是地址 for(R*=0;R*R*In;R*+) SystemBufR*=0*00; R*=0; sendstring(AT_Read); /发送AT+CMGR=,10 10代表短信储存所在位置 void readmend(void) /*读取短信容,判断相应指令是否正确*/ uchar i; for(i=0;i4;i+) /将短信容中的指令局部截取出来放到 /mandBuf数组中 mandBufi=SystemBuf64+i; if(mandBuf0=b)&

25、(mandBuf1=a)&(mandBuf2=n)&(mandBuf3=g) /判断指令是否为开发光管指令 write_cmd(0*01); /测试接收write_cmd(0*80);write_dat(b);write_dat(a);write_dat(n);write_dat(g);sendmessage(); /如果发送的指令既不是bang就定义为错误操作,不干别的void delete_message(void)/*删除短信指令*/ uchar i; Delay_ms(1000); Delay_ms(1000); Delay_ms(5000); for(i=0;i8;i+)AT_del

26、etei=AT_CMGDi; for(i=8;i11;i+) AT_deletei=numberbufi-8; for(R*=0;R*R*In;R*+) SystemBufR*=0*00; R*=0; sendstring(AT_delete); /发送AT+CMGR=, 代表短信储存所在位置void sendmessage(void) /*发送回复短信指令*/ uchar i;for(i=0;i8;i+) AT_SendNumberi=AT_CMGSi; for(i=8;i19;i+) AT_SendNumberi=SystemBuf18+i;/位置2636 将对方提取用来回复给对方 sen

27、dstring(AT_SendNumber);senddata(0*0d);delaymm(100);senddata(P);senddata(H);senddata(=);senddata(7);senddata(.);senddata(0);/容senddata(0*20);senddata(0*1a);senddata(0*0d);Delay_ms(30); void main() uchar *; uchar i; lcdint(); Start_GSM();/开启TC35 Delay_ms(10000);/延时大约10秒 ,等待模块联网/ UART_init(); /串口初始化/ G

28、SM_INIT(); /对tc35模块进展初始化 write_cmd(0*80); write_dat(r); write_dat(e); write_dat(a); write_dat(d); write_dat(y); Delay_ms(1000); while(1) if (!sw1) Delay_ms(5); if(!sw1) write_cmd(0*01);write_cmd(0*80); write_dat(r);write_dat(i);write_dat(n);write_dat(g); mingling(3,AT12);for(*=0;*11;*+)senddata(neir

29、ong*); senddata(0*3b);senddata(0*0D);while(sw1=0); senddata(0*0D);/发0*0d停顿打 if (!sw2) /短信读取温度值 Delay_ms(5); if(!sw2) while(sw2=0);k=ReadTemperature();delaymm(500);k=ReadTemperature();bai=(k%1000)/100;shi=(k%100)/10;ge=k%10;write_cmd(0*01);write_cmd(0*80); write_dat(0*30+bai);write_dat(0*30+shi);write_dat(0*30+ge);ES=0;mingling(8,AT7);for(i=0;i11;i+)senddata(neirongi);senddata(0*0d);delaymm(100);senddata(shi+0*30);senddata(ge+0*30); /发送数据容senddata(0*20);senddata(0*1a);senddata(0*0d);ES=1;delaymm(15000);ES=0;mingling(9,atshanchu);senddata(0*0D);ES=1;delaymm(2500);/删除短信,不过本来就没存到

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论