单片机无线通信模块开发与应用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

单片机无线通信模块开发与应用(一)现在的单片机越来越便宜,使我们可以开始考虑如何将这些东西应用到生活中去,那么,让我们开始吧,从今天开始,我们要构造一个智能家居平台。其实这东西很多人都想过要做的,但想象是一回事,动起手来又觉得迷茫得很,因为,万事开头难嘛,这么着,让我来带路吧。先做硬件平台。电路图如下,注意,实际制作的时候电路改动了,继电器边上的电阻电容被省掉了,继电器直接接单片机。周末结束后我会再发第二贴,让那三个发光管先闪闪亮起来。我会顺便插上一些基本的C教程。还有,我正在做印刷电路板,做好会通知大家qmi3ehsu.jpg(84.76KB,下载次数:0)单片机无线通信模块开发与应用(一)8giBOL6s.jpg(16.58KB,下载次数:0)Rzr9kFoo.jpg(14.41KB,下载次数:0)jRjzj4TF.jpg(90.74KB,下载次数:0)5T9Lc16S.jpg(86.66KB,下载次数:0)KMqjPN5T.jpg(100.05KB,下载次数:0)lP57zO0c.jpg(100.05KB,下载次数:0)Ib1xbxr4.jpg(13.37KB,下载次数:0)单片机无线通信模块开发与应用(二)看来有些朋友已经等不及了,只好提前发第二贴了。上一讲里面大家已经做好了硬件,那么这一讲,我们搞搞软件。怎么才能让单片机工作起来呢?单片机是一个计算机系统,没有编程是不能工作的,既使用的硬件做得再漂亮也只是个艺术品。本讲座将全部采用kielC作为编程语言,因此你要先去下载一个kielC编译器回来,下载地址如下:kielC编译器已注册版:请解压在C:\下,否则可能不能使用,压缩时已带路径,解压不需设置路径.89C2051中文资料:由于手头没有89C2051的资料,用97C2051的代替,引脚是一样的,够用了.下面的地址是一个写好了测试程序,发出约100us占空比50%的脉冲,已经编译出hex文件,烧进去就可以用:如果想自已修改和编译,这里讲下kielC的使用方法:1打开工程运行C:\Keil\UV2\Uv2.exe,进入kielC的界面,打开菜单project-openproject,在弹出的文件窗口中找到源程序的解压目录,可以看到一个后辍为uv2的文件,双击就可以了。2编译程序按F7或在菜单project中选buildproject就行了,我已经设置了编译输出hex文件,编译完后去源程序的目录中去找test.hex,并烧入单片机就可以了。接下来,我讲讲程序的工作原理吧:首先,程序的开头都要加载头文件,如下:#includereg51.h什么是头文件呢?C语言为了方便程序员,允许大家在一个文件中“copy”进另一个文件的内容,这样就可以使你的主文件里看起来干净多了。reg51.h文件内定义了单机的大部分SFR,P0P1P2P3端口等东东,如果不加载这些文件,你在用这些东西的时候就得自已定义了。接下来是定义自已的变量和引脚了。sbitW_OUT=P3^4;sbitW_IN=P3^5;sbitLED1=P1^2;sbitLED2=P1^4;拿出其中一行来讲一下sbitLED2=P1^4;这一句的意思是,给P1.4一个别名,叫作LED2。用LED2这个名字显然比用P1.4直观多了。当然,还有别的原因使我不得不给他定义名字,因为在程序里是不允许出现P1^4这样的语句。呵呵。如果没有别的东西要定义了,程序就可以开始了,C语言里是分语句块和函数的,用汇编的朋友在这里要买惯一下。函数相当于汇编里的子程序。昀简单的函数由函数名,括号和花括号组成,举个例子:delay(){函数内容这里就不写了,你可以一行都不写,也不会有问题的}以后我会告诉大家如何给函数传参数以及函数如何传回执行结果,也就是返回值,这里先不讲了。函数名可以用字母开头的任何字符串取名,除了一些特殊符号。另外就是,有些字符串已经被系统用掉了,例如sbitunsigned这样的串,这些也不能用来当函数名,顺便说一下,这些串叫作“保留字”。C语言里有一个函数名很特别:main函数。这个函数特别之处在于,程序就是从这里开始的,main的意义相当于汇编里面的ORG指令。现在我们把main写出来吧main(){}好了,现在整个程序变成了这个样子:#includereg51.hsbitW_OUT=P3^4;sbitW_IN=P3^5;sbitLED1=P1^2;sbitLED2=P1^4;main(){}这样的程序已经是一个完整的程序了,可以正确的编译,但是,现在还没任何语句指挥CPU去做点中,这样的话,我们继续努力:先给它来个死循环。main(){while(1){}}while语句是这样用的:while(条件){循环体}当条件符合时,从上往下反复执行循环体,直到条件不满足。C语言里0为“否”,其它为“是”,所以while(1)的意思就是无条件的循环啦,上面说了,除了0,其它都为“是”,那就是说,我用while(2)也可以咯?当然,你完全可以这么用,但别的程序员一定会笑掉大牙。用“1”是人为约定的习惯用法,好比你在说话是绝不会跟人说“我去进食”一样。有了循环,程序就能够不停的运转了,那么,我们该放到什么东西到这个循环里去呢?多了,看:while(1){LED1=0;//注意,LED1在上面已经定义为P1.2了,否则你用“LED1”时,编译器不认识的。LED1=1;}这可以让P1.2上接的小灯不停地一亮一灭,不过,哈哈,速度太快了,你看不出来哦。怎和办?加个延时吧,这个以后再讲。咱们现在不是在做无线数传吗?回到正题上来,让程序做点事。从原理图上可以看出,发射模块跨接在VCC与P3.4之间,当P3.4为高电平时1,模块不通电,为低电平0时通电,模块发射315M信号。这样,写点语句让它发送方波吧,程序从上面抄下来改改就行了:while(1){W_OUT=0;//发射W_OUT=1;//停止}现在,把程序弄复杂点,以便能做更多的事:unsignedchari=0;//定义一个变量,值域为0到255,无符号。后面的“=0”表示在程序开始前就设成0,好比汇编里的“DB”指令。bitout;//定义一个变量,只能表示0和1bitrsv;//定义一个变量,只能表示0和1while(1){i++;//i++指令好比汇编里的INC指令,变量增1。//i从零开如,每循环一次增1,到大于10的时候进入下面的语句块,小于等于10时不执行,直接跳到if(){}的花括号后面去了。if(i10){i=0;//将i重新设成0out=!out;//变量取反,out原来为1的话,执行完就为0,原来为0,执行完就为1了}W_OUT=out;//将out的值传给引脚,以打开/关闭发射模块rsv=W_IN;//取接收模块的输出,存在rsv变量中LED1=rsv;//将输出值显示出来LED2=!rsv;//将输出值取后后显示出来}好了,讲到这里,完整的程序就出来了,如下//载入头文件,以便使用已定好的引脚寄存器等符号#includereg51.h//引脚定义部分sbitW_OUT=P3^4;sbitW_IN=P3^5;sbitLED1=P1^2;sbitLED2=P1^4;//主函数voidmain(){bitrsv,out;unsignedchari=0;//P1=0xFF;//这句是给初哥们看的,由于上电复位后所有端口本来就是高电平,所以这句是不必要的。但要注意,P1.0和P1.1没有上拉,所以这两个脚用万用表量是量不出来的。while(1){if(i++10){i=0;out=!out;}W_OUT=out;rsv=W_IN;LED1=rsv;LED2=!rsv;}}上面的程序输入的方波频率极高,有几十K,如果想它慢一点,可以将if(i++10)中间的10改成100或更大,越大越慢,但由于变量i是一字节型变量,昀大只能到255,所以不要超过255。如果想超过255,请将unsignedchari那句改成unsignedinti这样,你昀大可以设成65535了,不过无线模块的脉宽是受限制的,一般不能超过1ms,过宽会导至发射效率降低以及接收信号有误码,所以,如果看到信号不对时不要以为是电路坏了哦。灯的闪烁频率较快时,要观察它有个方法,下面教你做个昀简单的示波器,而且全免费的:拿着模块快速左右晃动,看出它的波形出来了吧?呵呵,一分钱成本都不要。在上面的例子中,if(i++100)时能明显看出闪烁,if(i++10)时就有点困难了,手要快才行单片机无线通信模块开发与应用(三)这一讲我们来看看如何驱动外部设备。其实上一讲写的小程序里已经暗示过大家了,只是没仔细讲解而已,这一讲就为新手们讲讲吧。驱动外部设备,昀简单的就是设备直接接单片机的引脚,复杂一点的要加个放大电路,例如三级管缓冲器什么的,也有的是加光偶隔离电路。我们暂时不搞那么“复杂”的东西,先来点昀简单的吧。先来看看单片机如何输入控制信号吧。第二讲里的小例子中已经讲过如何接发光二极管,大家先把发光管接上去。一共3个发光管,负极分别接在P1.2P1.3P1.4上,正极接在一起,然后再串一个1K的电阻接VCC。硬件弄好了,讲讲如何驱动:由于发光管是接在VCC与引脚之间,那么,只有引脚为负逻辑的时候,发光管才会亮,单片机复位后,所有引脚都是正逻辑,因此,所有发光管都是关闭的,这样,我们要让它亮的话,要将电平先拉下来,写个小程序吧:将第二讲里下载回的那个源程序包中的代码删了,粘贴以下几行:#includereg51.h//引脚定义部分sbitLED1=P1^2;//主函数voidmain(){LED1=0;}写完后按F7就会编译,然后从源程序的目录中找到test.hex。将hex文件烧入2051芯片,插上实验板,打开电源,就可以看到灯亮了。但是,灯只是亮着没有一点生气,我们让它闪动一下吧,这里我们会用到延时程序,新手们在这里可以学会如何调用函数,也就是汇编里所说的子程序:#includereg51.h//引脚定义部分sbitLED1=P1^2;//延时函数voiddelay(void){unsignedinti;for(i=0;i60000;i++)//将i60000改成i6000,闪烁会快10倍i=i;//i=i这一行没任何意义,的目的只是为了增加每次循环消耗的时间}//主函数voidmain(){while(1){LED1=0;delay();LED1=1;delay();}}按照前面说的方法编译程序,烧入芯片,通电,就可以看到灯一闪一闪了,改变delay()函数中for(i=0;i60000;i++)这一行i后面的数字可以改变闪烁的频率,数字越大越慢,但不要超过65535,因为i的类型是unsignedint型,昀大只能表示64K。下面给出一个流水灯的程序,大家试试吧://载入头文件,以便使用已定好的引脚寄存器等符号#includereg51.h//引脚定义部分sbitLED1=P1^2;sbitLED2=P1^3;sbitLED3=P1^4;//延时函数voiddelay(void){unsignedinti;for(i=0;i60000;i++)i=i;}//主函数voidmain(){unsignedchari=0;while(1){LED1=LED2=LED3=1;//关闭所有if(i==0)LED1=0;//i=1时打开第1个灯if(i==1)LED2=0;//i=2时打开第2个灯if(i==2)LED3=0;//i=2时打开第3个灯if(i==2)i=0;//3个灯全部亮过一次了,从头来过i++;delay();//延时}}好了,现在打开电路图,电路图大家都存下了吧?在第一讲里有从电路图上可以看到,继电器是直接接在VCC与

1 / 31
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功