单片机无线通信模块开发与应用Word格式文档下载.docx
- 文档编号:18265907
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:27
- 大小:472.80KB
单片机无线通信模块开发与应用Word格式文档下载.docx
《单片机无线通信模块开发与应用Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机无线通信模块开发与应用Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
kielC编译器已注册版:
http:
//202.103.67.224/shaoshan/mu/mcu/kiel.rar
请解压在C:
\下,否则可能不能使用,压缩时已带路径,解压不需设置路径.
89C2051中文资料:
//202.103.67.224/shaoshan/mu/mcu/2051.rar
由于手头没有89C2051的资料,用97C2051的代替,引脚是一样的,够用了.
下面的地址是一个写好了测试程序,发出约100us占空比50%的脉冲,已经编译出hex文件,烧进去就可以用:
pWutGKkj.rar
(12.31KB,下载次数:
982)
如果想自已修改和编译,这里讲下kielC的使用方法:
1
打开工程
运行C:
\Keil\UV2\Uv2.exe,进入kielC的界面,打开菜单project->
openproject,在弹出的文件窗口中找到源程序的解压目录,可以看到一个后辍为uv2的文件,双击就可以了。
2
编译程序
按F7或在菜单project中选buildproject就行了,我已经设置了编译输出hex文件,编译完后去源程序的目录中去找test.hex,并烧入单片机就可以了。
接下来,我讲讲程序的工作原理吧:
首先,程序的开头都要加载头文件,如下:
#include<
reg51.h>
什么是头文件呢?
C语言为了方便程序员,允许大家在一个文件中“copy”进另一个文件的内容,这样就可以使你的主文件里看起来干净多了。
reg51.h文件内定义了单机的大部分SFR,P0P1P2P3端口等东东,如果不加载这些文件,你在用这些东西的时候就得自已定义了。
接下来是定义自已的变量和引脚了。
sbitW_OUT=P3^4;
sbitW_IN=P3^5;
sbitLED1=P1^2;
sbitLED2=P1^4;
拿出其中一行来讲一下
这一句的意思是,给P1.4一个别名,叫作LED2。
用LED2这个名字显然比用P1.4直观多了。
当然,还有别的原因使我不得不给他定义名字,因为在程序里是不允许出现"
P1^4"
这样的语句。
呵呵。
如果没有别的东西要定义了,程序就可以开始了,C语言里是分语句块和函数的,用汇编的朋友在这里要买惯一下。
函数相当于汇编里的子程序。
最简单的函数由函数名,括号和花括号组成,举个例子:
delay(){
函数内容这里就不写了,你可以一行都不写,也不会有问题的
}
以后我会告诉大家如何给函数传参数以及函数如何传回执行结果,也就是返回值,这里先不讲了。
函数名可以用字母开头的任何字符串取名,除了一些特殊符号。
另外就是,有些字符串已经被系统用掉了,例如"
sbit"
"
unsigned"
这样的串,这些也不能用来当函数名,顺便说一下,这些串叫作“保留字”。
C语言里有一个函数名很特别:
main函数。
这个函数特别之处在于,程序就是从这里开始的,main的意义相当于汇编里面的ORG指令。
现在我们把main写出来吧
main(){
好了,现在整个程序变成了这个样子:
这样的程序已经是一个完整的程序了,可以正确的编译,但是,现在还没任何语句指挥CPU去做点中,这样的话,我们继续努力:
先给它来个死循环。
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信号。
这样,写点语句让它发送方波吧,程序从上面抄下来改改就行了:
W_OUT=0;
//发射
W_OUT=1;
//停止
现在,把程序弄复杂点,以便能做更多的事:
unsignedchari=0;
//定义一个变量,值域为0到255,无符号。
后面的“=0”表示在程序开始前就设成0,好比汇编里的“DB”指令。
bitout;
//定义一个变量,只能表示0和1
bitrsv;
i++;
//
i++指令好比汇编里的INC指令,变量增1。
//i从零开如,每循环一次增1,到大于10的时候进入下面的语句块,小于等于10时不执行,直接跳到if(){}的花括号后面去了。
if(i>
10){
i=0;
//将i重新设成0
out=!
out;
//变量取反,out原来为1的话,执行完就为0,原来为0,执行完就为1了
W_OUT=out;
//将out的值传给引脚,以打开/关闭发射模块
rsv=W_IN;
//取接收模块的输出,存在rsv变量中
LED1=rsv;
//将输出值显示出来
LED2=!
rsv;
//将输出值取后后显示出来
好了,讲到这里,完整的程序就出来了,如下
//载入头文件,以便使用已定好的引脚寄存器等符号
//引脚定义部分
//主函数
voidmain(){
bitrsv,out;
//P1=0xFF;
//这句是给初哥们看的,由于上电复位后所有端口本来就是高电平,所以这句是不必要的。
但要注意,P1.0和P1.1没有上拉,所以这两个脚用万用表量是量不出来的。
if(i++>
10){
上面的程序输入的方波频率极高,有几十K,如果想它慢一点,可以将
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与引脚之间,那么,只有引脚为负逻辑的时候,发光管才会亮,单片机复位后,所有引脚都是正逻辑,因此,所有发光管都是关闭的,这样,我们要让它亮的话,要将电平先拉下来,写个小程序吧:
将第二讲里下载回的那个源程序包中的代码删了,粘贴以下几行:
LED1=0;
写完后按F7就会编译,然后从源程序的目录中找到test.hex。
将hex文件烧入2051芯片,插上实验板,打开电源,就可以看到灯亮了。
但是,灯只是亮着没有一点生气,我们让它闪动一下吧,这里我们会用到延时程序,新手们在这里可以学会如何调用函数,也就是汇编里所说的子程序:
//延时函数
voiddelay(void){
unsignedinti;
for(i=0;
i<
60000;
i++)
//将i<
60000改成i<
6000,闪烁会快10倍
i=i;
//i=i这一行没任何意义,的目的只是为了增加每次循环消耗的时间
delay();
LED1=1;
按照前面说的方法编译程序,烧入芯片,通电,就可以看到灯一闪一闪了,改变delay()函数中for(i=0;
i++)这一行"
i<
后面的数字可以改变闪烁的频率,数字越大越慢,但不要超过65535,因为i的类型是unsignedint型,最大只能表示64K。
下面给出一个流水灯的程序,大家试试吧:
sbitLED2=P1^3;
sbitLED3=P1^4;
i++)
LED1=LED2=LED3=1;
//关闭所有
if(i==0)
//i=1时打开第1个灯
if(i==1)
LED2=0;
//i=2时打开第2个灯
if(i==2)
LED3=0;
//i=2时打开第3个灯
//3个灯全部亮过一次了,从头来过
//延时
好了,现在打开电路图,电路图大家都存下了吧?
在第一讲里有
从电路图上可以看到,继电器是直接接在VCC与P3.5之间的,既然上面的例子可以驱动小灯,那同样也可以驱动继电器咯:
sbitJ1=P3^5;
J1=0;
J1=1;
看出来了吧,与前面说过的一个例子很像,不同的就是改变了引脚而已。
运行程序后,可以听到继电器叭嗒叭嗒的不停响。
现在我们说说高级应用。
大家都知道继电器在吸合时要求的电流较大,之后只需要很小的电流维持,根据这一特性,我们可以节省大量的电力:
voiddelay(unsignedintt){//括号中为参数
t;
unsignedinti,j;
//打开继电器
delay(3000);
//机械是很慢的东西,所以程序运行到这里时,继电器还没吸合上呢,等会儿它吧。
//以下是节电程序,方法是利用继电器的惯性,在很短时时间停止给继电器送电,断电器不会弹开。
10;
i++){
if(i<
3;
i++){//将时间分成10份,3份是送电,7份关闭,这样可节电70%,改变i的值可以改变节电效果,i越小越省电。
J1=0;
}else{
J1=1;
这一次我们学会了给函数传递参数了。
改变调用延时函数时括号中的数字,就可以改变延时值。
用同样的方法,我们可以控制发光二极管的亮度,看下面的例子:
j=0;
100;
if(i<
j)
}else{
if(j++==100)
j=0;
程序的原理就是,在while中每次循环一次,j值增大1,j值在for循环中决定了LED1打开的时间,因此j值就决定了LED1的亮度,整个程序的效果就是,LED1慢慢的亮起来。
烧程序试试看,运行----------怎么一下子就亮了?
呵呵,别急,由于实在太快了,你看不出来灯是渐亮的。
不要怪我哦,我只是想从原理讲起,如果一下子把程序写完,很多人就会看不懂了。
下面是完整的程序:
if((j++/600)==100)
看到没,只是改了一个地方:
这样,时间被拉长了600倍。
新学C语言的可能看不懂这一行的意思,我分开写一下,这句话等效于:
j=j+1;
if(j/600==100)
.....
就这么简单。
最后还是要说一下,新学C语言一定要小心,在C语言里“=”和“==”是不一样的,“=”是赋值,“==”是比较,如果写错了就麻烦了。
便例如:
x=1;
LED=1;
if(x==2)
LED=0;
这句执行后,LED是灭的,如果写成
x=0;
if(x=1)
那好,不管x的值是多少,LED都是亮的,因为,由于你写错了运算符,在if()中,x被改成了1,等效于:
if(x)
好了,这一讲完了,继续上班。
单片机无线通信模块开发与应用(四)增加了通信程序
国庆放假了,大家一定都想好好玩玩吧?
那这次就做个简单一点的东西,免得占用兄弟们太多的休假,不然我的罪可就大了.
这次要做的东西,说简单也真简单,说不简单,这是个相当重要的部件.既是想跟电脑连接,接口肯定少不了的,而目前最成熟可靠而又简单的电路要属MAX232了,一个芯片加4个小容便可搞定.电路图如下,是从论坛上另一位兄弟的贴子上复制下来的.做的时候千万不要把电容极性搞反了,图中的极性是正确的.接PC的时候注意,如果是用串行线连接PC和232板子,不能用交差线,用直连就可以了,有卖的.我是直接做到232插头的盒子里,所以不需要考虑这个问题.
vrhlZjgn.rar
(8.06KB,下载次数:
1200)
晶振为22.187时波特率115200,11.059时57600,在PC端改一下就可以了.
有兴趣的朋友要跟上哦,不然就来不及了.后续做的实验全部是很好玩的东西了,虽然离产品有一定差距,但在自已家里用已经很有实用价值了.
[此贴子已经被作者于2004-10-1320:
48:
37编辑过]
q5Te14k6.gif
(4.25KB,下载次数:
34)
2Ita2pW5.jpg
(9.63KB,下载次数:
22)
TgcR9aWD.jpg
(13.38KB,下载次数:
21)
a1lWnJFt.zip
36.74KB,下载次数:
1182
单片机无线通信模块开发与应用(四)
单片机无线通信模块开发与应用(五)
好久没发贴了,这场病病得不轻啊,不过病早好了,这次延误是因为在北京接了个项目,而且正好是关于这套系统的应用,所以干脆就拖了一段时间.
说正题了.前面那么多贴子只是一些外围的制作和设计,但没有外围的建设怎么能做出好东西呢?
呵呵,这次给大家发点正经东西,相信这就是大伙儿最关心的部分---通信协议,其实也不能称其为协议,只能叫做射频编码,为了便于理解起见才叫它通信协议的,大家心里清楚这点就行了,免得说我混淆视听.通信协议分成硬件层和软件层,硬件层,即数据的电信号表示方法,而软件层,指的是数据包的处理.由于软件层定义很广,且跟应用场合相关,不同的应用可能使用完全不同的协议,所以这里就只说说如何传输数据包吧.相信大家都有这能力进行下一步的扩展.我也会在今后的贴子里给出一些应用的实例,以供参考.
我看到论坛上有些朋友之前也做过无线模块的应用,却不成功,例如明浩提过他做的232无线模块,干扰很大,通信不能进行.为什么会这样呢?
要解释这问题,先要说说无线模块的结构和特性:
发射:
无线模块使用一个三级管进行射频发射,从说明书上可看到,当连续发送时间高于5毫秒时,发射效率会降低.
接收:
超再生电路.超再生电路有一个特性,即在没有信号时会收到大量的白噪声,接收模块已经对该噪声进行了处理,白噪声被大幅度削弱了,但是,这并不是说噪声就完全消除了,事实上,当信号源停止发射后几毫秒,噪声会再次出现,也就是所谓的"
零电平干扰"
根据说明书的提示,这段时间大约为5毫秒.
别外,说明书上也指出,信号发射的宽度不应小于0.08毫秒,占空比也不能太大,否则很容易受到干扰.
从上面的资料,我们可以很轻易地分析出干扰来源.
根据资料,我们可以得出一个大概的设计原则:
1.占空比有限制,我们人为限制到1:
4之内.
2.发射时间小于3毫秒.
3.两次发射的间隔小于3毫秒.
4.正式发射信号前要使用前导信号,以消除"
.
根据上面几点,我参考红外信号算法,写出了发送一字节的算法:
1.高低信号电平交替使用,与实际被发送数据的电平值无关,而发送宽度及两次发送的间隔宽度,与被发送数据的电平值相关,对应关系在后面作出描述.
2.以宽度为0.6毫秒的宽度表示位低电平.
3.以宽度为1.2毫秒的宽度表示位高电平.
4.以宽度为1.8毫秒的宽度表示数据正文的发送与结束.
以下给出流程:
1.从零电平开始,交替发送/停止宽度为0.6毫秒的信号,数量为单数个,最少要有2个,发送完后信号电平自然回到高电平,这里,我称该
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 无线通信 模块 开发 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)