《基于WIFI模块和单片机的无线数据传输(附代码).docx》由会员分享,可在线阅读,更多相关《基于WIFI模块和单片机的无线数据传输(附代码).docx(18页珍藏版)》请在三一办公上搜索。
1、南京工业大学计算机科学与技术学院Project3课程设计2023-2023学年第二学期班级:浦电子1203组员姓名:组员学号:指导老师:武晓光,胡方强,包亚萍袁建华,毛钱萍2015年7月8R目录第一章阶段任务第二章基于WIFI模块的无线数据传输的原理1.1 时钟模块1. 2最小单片机系统的原理1.3 温度传感器DS18B201.4 串口1. 5WIFI模块第三章基于WIFI模块的无线数据传输的实现2. 1WIFl模块设置2.3 串口局部设置2.4 调试与运行过程第四章程序与框图第五章小结第一章阶段任务:第一阶段(1天)1、了解课程所给的WlFI模块,并详细研读其说明书2、复习单片机知识(2天)
2、1、了解温湿度传感器模块,并设计其硬件模块2、了解ICdI602显示模块,并设计其硬件模块(2天)1、设计整合电路:5v转3.3v电路2,串口通讯电路第二阶段(4天)1、链接并完成整体电路图的设计,并检查2、焊接电路并调试。第三阶段(3天)1、根据设计的硬件模块设计程序(1):温湿度传感器模块(2):串口通讯模块(3):WlFl传输与接收模块(4):显示电路模块(3天)2、将设计好的模块程序烧录到单片机内,调试第四阶段:2天2天)明报告第二章基于WIFI模块的无线数据传输的原理1.1时钟DS1302模块:电路原理图:DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟引脚、I/
3、O串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计时脉冲。读写时序说明:DS1302是SPl总线驱动方式。它不仅要向存放器写入控制字,还需要读取相应存放器的数据。控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。数据读写时序如图1.2单片机最小系统的原理:说明复位电路:由电容串联电阻构成,由图并结合电容电压不能突变的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且
4、,这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.晶振电路:典型的品振取11,0592MHZ(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHZ(产生精确的US级时歇,方便定时操作)单片机:一片AT89S51/52或其他51系列兼容单片机特别注意:对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的OoooH开始执行;当接低电平时,复位后直接从外部ROM的OooOH开始执行.1.3温度传感器DS18B20的原理连接到单片机最小系统,并将温
5、度发送给WlFl模块):DS18B20性能特点(1)独特的单线接口方式,只需一个接口引脚即可通信:(2)每一个DS18B20都有一个唯一的64位ROM序列码;(3)在使用中不需要任何外围元件:(4)可用数据线供电,电压范围:+3.0V-+5.5V:(5)测温范围:-55C-+125C,在-I(TC-+85C范围内精度为+0.5C,分辨率为0.0625C:(6)通过编程可实现9-12位的数字读数方式。温度转换成12位数字信号所需时间最长为750ms,而在9位分辩模式工作时仅需93.75ms:(7)用户可自设定非易失性的报警上下限值;(8)告警搜索命令可识别和定位那些超过报警限值的DS18B20:
6、(9)多个DS18B20可以并联在惟一的三线上,实现多点测温;(10)电源极性接反时,DS18B20不会因发热而烧毁,但不能正常工作:DS18B20内部存储器及温度数据格式对于DS18B20内部存储器结构(如图3.1),它包括一个暂存RAM和一个非易失性电可擦除EERV,后者存放报警上下限TH、TLo当改变TH、TL中的值时,数据首先被写进暂存器的第二、三字节中,主机可再读出其中内容进行验证。如果正确,当主机发送复制暂存器命令,暂存器的第二、三字节将被复制到TH、TL中,这样处理有利于确保该数据在单总线上传输的完整性m。暂存器结构EERAM结构温度低字节(BYTEO)温度高字节(BYTEl)上
7、限报警温度TH(BYTE2).下限报警温度TL(BYTE3)结构存放器(BYTE4保存(BYTE5)保存(BYTE6)保存(BYTE7)CRC(BYTE8)图3.1DS18B20结构框图暂存存储器作用是在单线通信时确保数据的完整性,它由8字节组成,头两个字节表示测得的温度读魏以12位转化为例说明温度上下字节存放形式(温度的存储形式如表3.1)及计算:12位转化后得到的12位数据,存储在18B20的两个上下8位的RAM中,二进制中的前面5位是符号位。如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度:如果温度小于0,这5位为1,测到的数值需要取反加1,再乘于0.0
8、625才能得到实际温度I叫表3.1温度的存储形式高8位SSSSS22s2低8位吸22d2一2221S=I时表示温度为负,S=O时表示温度为止,其余低位以二进制补码形式表示,最低位为1时表示0.0625C。温度/数字对应关系如表3.2所示。表3.2DS18B20温度/数字对应关系表温度(C)输出的二进制码对应的十六进制码+125000001111101000007D0H+8500000101010100000550H+25.0625000000011100010191H+10.125000000001010001000A2H+0.5OO(X)0000000010000008H0OO(X)0000
9、0000(M)OO0000H-05Hllllllini100oFFF8H-10J25IlllIlll01101110FF5EH-25.0625HlI11100110IlHFF6FH-55Illl110010010000FC90HDS18B20有六条控制命令,如表3.3所示:表3.3控制命令指令约定代码操作说明温度转换44H启动DS18B20进行温度转换读暂存器BEH读暂存器9个字节内容写暂存器4EH将数据写入暂存器的TH、TL字节复制暂存器48H把暂存器的TH、TL字节写到E2RAM中重新调E2RAMB8H把E:RAM中的TH、TL字节写到哲存器TH、TL字节读电源供电方式B4H启动DS18B
10、20发送电源供电方式的信号给主CPUDS18B20操作命令及时序特性DS18B20对读写的数据位有着严格的时序要求,它是在-根I/O线上读写数据的。同时,DS18B20为了保证各位数据传输的正确性和完整性,它有着严格的通信协议。DS18B20每步操作都要遵循严格的工作时序和通信协议如主机控制DS18B2O完成温度转换这过程,根据DS18B20的通讯协议,须经三个步躲:每-次读写之前都要对DS18B20进行复位,复位成功后发送一条RoM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件
11、作为从设备。而每-次命令和数据的传输都是从主机主动启动写时序开始的,如果要单总线器件送回数据,在进行写命令后,主机需启动读时序完成数据的接收。另外,数据和命令的传输都是低位在先网。(1) DS18B20的复位时序主机控制DS18B20完成任何操作之前必须先初始化,即主机发一复位脉冲(最短为480s的低电平),接着主机释放总线进入接收状态,DS18B20在检测到I/O引脚上的上升沿之后,等待1560s,然后发出存在脉冲(60240)s的低电平。如图3.2所示。(2) DS18B20的读时序DS18B20的读时序分为读0时序和读1时序两个过程。DS18B2O的读时序是从主机把单总线拉低后,在15秒
12、之内就得释放单总线,从而让DS18B2O把数据传输到单总线上。DS18B20完成一个读时序的过程,至少需要60s。如图3.3所示。图3.2DS18B20的复位时序图3.3DS18B20的读时序(3) DS18B2O的写时序DS18B2O的写时序同读时序一样,仍然分为写0时序和写1时序两个过程。DS18B2O写0时序和写1时序的要求不同当要写0时序时,单总线要被拉低至少60s保证DS18B2O能够在15s到45s之间能正确地采样I/O总线上的0”电平,当要写1时序时,单总线被拉低之后,在15s之内就得释放单总线。如图3.4所示。图3.4DS18B20的写时序由DS18B20的通讯协议得知,主机控
13、制DS18B20完成温度转换的过程必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条RoM指令,最后发送RAM指令,从而对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500s,然后释放,DS18B2O收到信号后等待1660s左右,然后发出60240s的存在低脉冲,主CPU收到此信号表示复位成功。1 .4串口局部(让WlFl与电脑,单片机进行通讯)串口原理图:80C51串行口的结构图:80C51串行口的工作方式:方式1方式1是10位数据的异步通信口.TXD为数据发送引脚,RXD为数据接收引脚,传送一帧数据的格式如下图。其中1位起始位,8位数据位,1位停
14、止位。I、方式I输出写入SBUF口xD起写QCZxCIEIXz停止位TI(中断标志)方式1输入RXEKECeD2三CEXX2米样脉冲nunnnn三nwImnIlnnnnnnnn三ImflRl(中断标志)I用软件置REN为1时,接收器以所选择波特率的16倍速率采样RXD引脚电平检测到RXD引脚输入电平发生负跳变时,那么说明起始位有效,将其移入输入移位存放器,并开始接收这一帧信息的其余位。接收过程中,数据从输入移位存放器右边移入,起始位移至输入移位存放器最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的停止位为1)时,将接收到的9位数据的前8位数据装入接收SBUF,第9位(停
15、止位)进入RB8,并置RI=I,向CPU请求中断始位I位,数据9位(含I位附加的第9位,发送时为SCON中的TB&接收时为RB8),停止位I位,一帧数据为11位.方式2的波特率固定为晶振频率的1/64或1/32,方式3的波特率由定时器Tl的溢出率决定。1.5WIFI模块:使用接口:1电源接口系统采用标准电源插座,外径5.5mm内径2.1mm的标准尺寸,内正外负,输入电压范围5-48V,电流35OmA2指示灯ID名称描述1Power设备供电后亮2Ready内部LinUX系统启动完成后亮3Link网络连接建立后亮4RXD本设备的串口收到数据闪烁5TXD本设备通过串口向外发送数据时闪烁2.3RS23
16、2接口设备的串口为公口(针),RS232电平(可以直接连电脑串口的电平).引脚顺序与计算机的COM口保持-致,与电脑连接时需要用交叉线(2-3交叉,7-8交叉,5-5直连,7-8可以不接但是一定不能直连电脑,否那么可能导致工作不正常),一共有6根线有定义,其余悬空。序号名称描述2RXD设备数据接收引脚3TXD设备数据发送引脚5GND信号地8RTS请求发送SCTS去除发送9VCC默认未使用,PCB上有个焊盘跳线,需要时可以将它与设备的电源输入正极连接,用于给串口传感器供电或者外部通过串口线给设备供电.第三章基于WiFi模块的无线传输的实现2.1 WIFI模块的设置2.2 串口局部设置2.3 调试
17、:运行过程:单片机首先运行,然后对DSl8B20和DS1302,LCDI602进行初始化,接着对DS18B20和DS1302进行写设置,读取温度和时间,单片机处理数据,将其在LCD1602上显示,单片机进行串口初始化并通过串口程序将温度和时间准备好,等到串口接收到相应的信号,在发送数据。在程序内检测温度,假设温度超过设定的值(值可通过终端修改),将发出报警信号。蜂鸣器报警,待温度下降后(可通过终端翻开降温系统),蜂鸣器关闭。第五章程序与框图程序:#include#include#include#defineucharunsignedchar#defineuintunsignedintsbitD
18、Q=P20;sbitlcden=P34;sbit1cs=P3a5;sbitdula=P26;sbitwela=P27;/sbitIed=P10;sbitsclk=Pl4;时钟信号线sbitio-Pl5;信号线sbitce=Pl6;片选,也是RSTsbitbuzz=P2A3;sbitledle-P2A5;unsignedinttemp,temp1,tern2,temper,xs,flag,a,s,cc;unsignedcharj;ucharcodeday=1234567m;ucharshi,fn,miao,nian,yue,ri;ucharcdflag;ucharcodenumberJ=r,01
19、23456789m;sbitACC0=ACC0;定义存放器ACC的零位sbitACC7=ACC7;voiddelay!(unsignedintm)unsignedintij;for(i=m;iO;i-)for(j=lIO;jO;j-);voiddelay(unsignedintm)while(m-);程序*DS8B20voidIniLDSl8B20()unsignedcharx=0;DQ=I;delay(8);DQ=O;delay(80);DQ=I;delay(4);x-DQ;delay(20);ucharReadOneCharOunsignedchari=0;unsignedchardat=
20、O;for(i=8;i0;i)DQ=O;dat=l;DQ=I;if(DQ)dat=0x80;delay(4);return(dat);voidWriteOneChar(unsignedchardat)unsignedchari=0;for(i=8;i0;i-)DQR;DQ=datOxOI;delay(5);DQ=I;dat=l;voidduwendu()unsignedchara=0;unsignedcharb=0;Init_DS18B20();WriteOneChar(Oxcc);WriteOneChar(Ox44);delay(5);IniLDSl8B20();WriteOneChar(O
21、xcc);WriteOneChar(Oxbe);delay(5);去除高四位,即正负位个位小数a=ReadOneChar();b=ReadOneChar();tempi=(b4)&0x7f;tempi+=(a&0xK)4;temp2=a&0x0f;temp=(b*256+a)4);整数xs=temp2*0.0625*10;temper=temp+xs;voidwrite_com(ucharcom)Icdrs=O;P0=com;delay(5);Icden=I;delay(5);Icden=O;voidwrite_data(uchardate)Icdrs=I;PO=date;delay(5);I
22、cden=I;delay(5);Icden=O;串口初始化voidckinit()TMOD=OX20J设置定时器1为工作方式2THI=Qxfa:TLl=Oxfa;TR=;REN=I;/允许串行接收SMO=O;SMI=I;工作方式1/SCON=0x50;PCON=0x80;波特率加倍EA=I;ES=:LCD1602初始化voidlcdinit()dula=0;wela=0;Iedle=O;Icden=O;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80+0x10);温度显小voiddisp
23、lay()write_com(0x80+0x40);/write_data(numbertemper/100);write_data(numbertemp/10);write_data(numberltemp%10);write.data(,/);write_data(numberxs%10);write.data(,C);串口中断允许位voidfas(unsignedchardat)ES=O:SBUF=dat;while(!TI);TI=O;ES=I;发送字符串函数voidfss(unsignedchar*str)ucharb,i;b=strlen(str);for(i=0;i0;i-)io
24、=ACCO;就是把最低位的数据传输给IOSdk=1;时钟拉高读走数据sclk=0;时钟拉低允许数据变化ACC=ACC1;把ACC右移一位,然后又把最低的一位传送过去DS1302慎字节char read-ds 13O2_byte。uchar i;读DS1302 一个字节for(i=8;0;i-)ACC=ACC1;特别说明,读回来的数据是从最低位到最高位。ACC7=io;/把读回来的数据存到ACC存放器的最高位,然后在移到最低位sclk=1;sclk=0;returnACC:)DS1302写地址数据voidWrite-ds13O2(ucharadd,uchardat)/写任意地址,任意数据ce=0
25、;/根据时序图编写sclk=O;ce=l;片选翻开Write_dsl302_byte(add);write_ds1302-byte(dat);io=0;释放总线sc1k=O;时钟释放ce=0;片选关闭/拿承$:*.;*申淋*率*.:$:*第;*承奉*事率*申第*申率*返回值时间DS1302读地址数据ucharread_ds13O2(ucharadd)读任意地址数据uchartemp;ce=0;sc1k=O;ce=l;片选翻开write_dsl3O2_byte(add);temp=read_ds1302_byte();sclk=O;时钟释放io=0;释放总线ce=0;片选关闭returntemp
26、:*申*率*右*申油*申率*.$:*冰*.*申率*拿:第3s*申*i*时 间 显 示 函 数*:*率4:率*或*率*米审*/voiddis-sj()ucharth,tl;nian=read_d$l302(0x8d);年存放器yue=read_ds1302(0x89);月存放器ri-read_ds1302(0x87);日存放器write-com(0x800x08);设置时位置th=nian4;write_data(nUmberth);刷新年高位tl-nian&OxOf;write-data(numbertl);刷新年低位write.data(,-);th=yue4;write_data(numb
27、erlihj);tl-yue&OxOf;Write_data(nUmberUI);write-data(1-1);th=ri4;write-data(numberth);tl=rixf;write_data(numbertI);shi=read.ds1302(0x85);时存放器fen=read_ds1302(0x83);分存放器miao=read-ds1302(0x81);秒存放器write_com(0x80+0x48);th=shi4;Write_data(IIUmbeiIIh);刷新时高位tl=shi4;write_data(numberth);tl=fenxf;write_data(n
28、urnbertl);write-data(,:);th=rniao4;write-data(numberth);tl=miao&0x0f;write-data(numbertl);voidfssj()charth,tl;th=nian4;fas(numberthj);tl-nian&OxOf;fas(numbertl);fas(u);th=yue4;fas(numberth);tl=yue&OxOf;fas(numbertl);fas(,-p);th=ri4;fas(numberth);U=ri&OxOf;fas(numbertl);fss(”);th三shi4;fes(numberth);t
29、l=shi&OxOf;fas(umbert1);fas(;);th=fen4;fas(numberthj);tl=fen&OxOf;fas(numbertl);fas(T);th=miao4;fas(numberth);tl=niiao&0x0f;fas(numbertl);fss(,1”);fss(,1Tep:);voidmain()ckinit();lcdinit();cc=30;duwendu();delay1(1000);whi1e(l)duwendu();dis.sj();duwendu();disp1ay();if(flag=l)if(a=T)fssj();fs(numbertem
30、10);fas(numbertem%10);fes(7);fas(numberxs%IOJ);fas);fos(tC,);)if(a=2t)fas(nubercc10J);fas(numbercc%10);fas);f(C);if(a=3)cc+;if(a=,4,)CC-;if(a=,5,)Pl=Oxff;Iedle=I;Pl=Oxfe;delay1(5);Iedle=O;if(a=,6,)Pl=Oxff;Iedle=I;delay1(5);IedIe=O;flag三0;if(temp=cc)buzz=O;fssj();fas(numberltempl0);fas(numbertemp%IOJ
31、);fas(?);fas(numberlxs%IOJ);fas(t,);fas(,C,);fesT);fss(warnning);delay1(2000);if(a=3)cc+;if(a4,)CC-;elsebuzz=l;)voidser()interrupt4RI=O;/接收标志位Hag=1;a=SBUF;接收的数据)框图:第四章小结在这次课程设计中,有些局部的功能能够顺利的实现,但也有局部代码无法实现其功能.首先出现的问题是温度报警功能。因为DS18B20初始化结束后默认温度为85度,单片机读取此温度后将直接进入报警程序,这点是不合理的.为了防止初始温度的影响,我在初始化程序后,WHILE大循环前加一段代码,首先是读温度,此时温度为85度,然后延时一段时间,在进入大循环,紧接着读温度,此时的温度就为正常温度,单片机正常工作。然后还有-个问题,就是在通过串口发送一些报警字符时需要一个一个发送,这会使程序繁琐,减弱程序的可读性,这时就需要一函数来发送字符串。然而这段函数需要用到指针和字符串中的一些函数库,介于这方面我很少使用,所以对此没有太好的方法。经过半天的学习,我重温了C语言根底,运用STRLEN0函数完成了这函数的设计。