- UID
- 1023166
- 性别
- 男
- 来自
- 燕山大学
|
本帖最后由 dplion 于 2011-05-29 12:19:48 编辑 引言 近些年信息通信领域中,发展最快、应用最广的就是无线通信技术。而无线通信技术又有着集成化,低功耗,易操作的发展趋势。目前,一些只由微控制器和集成射频芯片构成的无线通信模块不断推出,这种微功率短距离无线数据传输技术在工业、民用等领域得到应用广泛。无线数据传输系统结构微功率短距离无线数据传输技术作为一种无线通信实用技术,一般使用单片射频收发芯片,加上微控制器和少量外围器件构成专用或通用无线通信模块,只要依据命令字进行操作即可实现基本的数据无线传输功能。一个简易无线控制系统可以由微控制器,单片射频收发芯片以及少量外围和显示设备等构成,本课题主要研究的是由C8051F310 单片机最小系统和CC1101无线通信模块组合而成的简易无线控制系统。
1 设计要求
(1)工作频率6-10MHz;
(2)遥控路数不少于8;
(3)遥控距离10m以上;
(4)受控对象为发光二极管LED。
2 总体设计方案
该设备由处理单元、发射模块、接收模块、外接电路等构成。当发射模块发出信号时,接收模块对应的开关就会执行相应的操作,以LED灯的亮灭来显示开关的状态。
(1)处理单元:
对比了51系列和C8051系列单片机的各项性能指标后,选择兼容性较好,性能稳定的C8051F310单片机作为处理单元,该单片机系统工作电压为2.7V~3.6V之间。
(2)发射和接收装置:
无线收发单元选用CC1101射频芯片。CC1101与单片机采用SPI接口连接,该芯片体积小,功耗低,数据速率支持1.2~500 kbps的可编程控制,可以工作在6MHz、35MHz、56MHz、100MHz四个波段,在所有频段提供-30~10 dBm输出功率。本文中CC1101工作在6MHz的频率上,采用FSK调制方式,数据速率为100 kbps,信道间隔为200kHz。
3 单元电路的设计
3
C8051F310是完全集成的混合信号片上系统型MCU芯片,具有体积小,重量轻,控制灵活方便,价格低廉等优点,通常配以简单的外围电路就可以构成一个完整的控制系统,C8051F310单片机采用射频SoC(片上系统)进行无线通讯设计,是开发低成本、低功耗无线通讯应用系统的理想方案。射频SoC(片上系统)的特点是:专门的设计,将全部的高频部分电路全部集成到了电路内部,从无线芯片片机到天线之间,只有简单的滤波电路,系统设计者完全不必进行任何高频电路设计;采用特殊设计,使无线芯片和微处理器和高频线路间,实现完美的配合,数字电路对高频通讯的影响减低到最小;将微处理器和无线芯片设计成一体,变成无线单片机,可以轻松完成无线通讯功能设计开发。
3.2 CC1101通信模块的设计
3.2.1 CC1101模块简介
芯片采用Chipcon公司的CC1101,是根据 SmartRF 技术以0.18μmCMOS工艺制成的一款低成本单片UHF收发器,具有功耗低、电压低、体积小、灵敏度高等特点。电路主要工作在低频的 ISM 和 SRD(短距离设备)频率波段。CC1101集成了一个高度可配置的调制解调器,支持不同的调制格式,其数据传输率最高可达 500kbps。通过开启集成在调制解调器上的前向误差校正选项,能使性能得到提升。CC1101在1.8~3.6V的低电压下工作,其灵敏度为-110dBm,在所有工作频率波段上,可编程输出功率为-30~10dBm。
图3.7 MCU与CC1101接口电路示意图
图3.8 无线通信模块电路原理图
CC1101与一个微控制器和少数几个外接元件便可组成一个完整的无线数据收发系统,在本文无线遥控开关的设计中,使用MCU的P2口对CC1101进行控制和数据的传输,如图3.7所示。图 3.8 是基于CC1101的无线通信模块电路原理图。与LCM的电源接口设计一样,在CC1101的电源供电端加入一个三极管来控制CC1101 与电源的连接,当P3.5 输出高电平时,三极管截止,CC1101与电源断开;当P3.5 输出低电平时,三极管导通,CC1101与电源连接。在不需要CC1101进行无线通信时将其关闭,需要时再打开,这样做的目的也是降低功耗,延长电池的使用寿命。
矩阵键盘的设计
键盘是由若干个按键组成的开关矩阵,它是一种廉价的输入设备。一个键盘,通常包括有数字键(0一9),字母键(A一Z)以及一些功能键。操作人员可以通过键盘向计算机输入数据、地址、指令或其它控制命令,实现人机对话。用于计算机系统的键盘按其结构形式可分为两类:一类是编码键盘,即键盘上闭合键的识别由专用的硬件来实现;另一类是非编码键盘,即键盘上闭合键的识别由软件来识别。为了节省FO线,单片机系统中普遍使用非编码键盘,键盘接口应具备以下功能:键扫描功能即检测是否有键按下;产生相应的键代码(键值);消除按键抖动及多键按下。
4x2的键盘结构中的列线通过电阻接十5v。当键盘上没有键闭合时,所有的行线和列线断开,列线都呈高电平。当键盘上某一个键闭合时,则该键所对应的列线与行线短路。此时列线的电平由行线的电位所决定。如果把列线接到微机的输入口,行线接到微机的输出口,在微机的控制下线都为高电平,则这行上没有键闭合,如果读出的列线状态不全为高电平,则为低电平的列线相交处的键处于闭合状态;如果这一行上没有闭合键,就使行线为低电平,检测该行线上有无闭合键,以此类推,直到最后一根列线都检测完。这种逐行逐列地检查键盘状态的过程就称为对键盘一次扫描。CPU对键盘扫描可以采取程序控制的随机方式,CPU空闲时扫描键盘。也可以采取定时控制方式,每隔一定的时间CPU就对键盘扫描一次。也可以采取中断方式,每当键盘上有键闭合时,向CPU请求中断,CPU响应中断后,对键盘扫描,以识别一个键处于闭合状态,并对该键输入信息做出相应处理。CPU对键盘上闭合键的键号确定,可根据行线和列线的状态计算求得,也可以根据行线和列线状态查表得。非编码键盘识别按键的方法有两种:一是行扫描法,二是线反转法。
图3.12 4x2键盘
5 程序设计
图6.1 发射模块流程图 图6.2 接收模块流程图
在发射时,将CC1101设置在待机和SPIO编程状态,然后在进行射频寄存器的初始化设置后,给键盘赋初值,键盘有健按下时,单片机通过扫描键盘读出按键值,然后把该按键值打包等待发送,单片机发送数据时,单片机按照SPIO接口时序把要发送的数据写入CC1101,再初始化发射端的地址,且应当与接收端的地址相互匹配,发射端发射的数据有效宽度必须与接收端设置一致。然后把单片机设置为发送模式,并且完成数据打包,给数据进行编码、调制以及发送。发送完成后,相应的引脚被置低,CC1101回到待机模式。
在接收时,初始化的设置同发射时基本一致,然后CC1101被设置为接收模式,不断地检测载波,等待接收数据,当检测到同频段的载波并且地址也匹配时,CC1101进行数据包的接收,并完成校验等相关工作。接着,将数据通过SPIO接口传输到单片机中,接收完成后CC1101继续进入待机状态。
总结
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。
回顾起此次单片机课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,在接近四星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。
这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在XXX、XXX、XXX老师的辛勤指导下,终于游逆而解。同时,在XXX、XXX、XXX老师那里我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
参考文献
[1] 李文仲,段朝玉.C8051F系列单片机与短距离无线数据通信[M].北京:北京航空航天大学出版社,2007
[2] 孙江宏 ,李良玉. Protel 99电路设计与应用[M].北京:机械工业出版社,2006
[3] 阎石. 数字电子技术基本教程[M].北京:清华大学出版社,2003
[4] 华成英.模拟电子技术基本教程[M].北京:清华大学出版社,2006
[5] 李建民.单片机原理与应用技术[M].西安:西安电子科技大学出版社,2006
[6] 郭兵.SOC技术原理应用[M].北京:清华大学出版社,2006
[7] 张迎新,雷文,姚静波.C8051F系列SOC单片机原理及应用[M].北京:国防工业出版社,2005
[8] 徐惠民,安德宁.单片微型计算机原理接口与应用[M].北京:北京邮电大学出版社,1996
[9] 李华.MCS-51系列单片机实用接口技术[M].北京:北京航空航天大学出版社,2003
[10] 郭永贞.数字电子技术 [M].西安:西安电子科技大学出版社,2003
[11] 夏季强,沈德金.单片机实验与实践教程[M].北京:北京航空航天大学出版社,2001
[12] 赵晓安.MCS-51单片机原理及应用[M].天津:天津大学出版社,2001
1遥控发射电路
2遥控接收电路
3 遥控发射部分的主程序
/**********************************************************************
* *功能描述:ADC试验,利用C8051F310内部ADC转换器,把当前的P3.3的当前电压
* * 值转换成ADC值从串口输出。
***********************************************************************/
#include <c8051F310.h> //C8051F31X系列头文件。
#include "CC1100.h"
#include <math.h>
#include <ABSACC.h>
#include <intrins.h>
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define uchar unsigned char
uchar arrTx[4];
uchar key;
int y;
sbit SW1=P2^2;
sbit SW2=P2^3;
sbit SW3=P2^4;
sbit SW4=P2^5;
sbit SW5=P2^6;
sbit SW6=P2^7;
//**********************************************************************
//函数名:void PORT_Init (void)
//功能描述:端口初始化。
//**********************************************************************
void PORT_Init (void)
{
P2MDOUT = 0xff; //P2口全为输出。
P1MDOUT = 0xf3;
P0MDOUT |= 0x10; //TXD输出
P0MDOUT &= ~0x20; //RXD输入
XBR0 = 0x01; //硬件UART。
XBR1 = 0xC0; //弱上拉关,交叉开关使能。
}
//**********************************************************************
//函数名:void Internal_Crystal(void)
//功能描述:设定内部时钟。
//**********************************************************************
void Internal_Crystal(void)
{
OSCICN = 0x83; // 内部振荡器允许,不分频最快频率
CLKSEL = 0x00; // 使用内部振荡器。
}
void Delay(unsigned int t) //默认状态,t=1时约3us
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<12;j++)
*P_Watchdog_Clear=0x0001;
}
//**********************************************************************
//按键延时程序
//**********************************************************************
unsigned char key;
void ys()
{unsigned int aaa,bbb;
for(aaa=200;aaa>0;aaa--)
for(bbb=0;bbb<200;bbb++);
}
unsigned char Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //LED灯的编码
void main(void)
{
int j;
PCA0MD &= ~0x40; //关闭看门狗。
PORT_Init(); //初始化I/O口。
Internal_Crystal(); //开启内部晶振
Timer0_Init(); //初始化定时器0。
Init_CC1100(); //初始化CC1100
TMOD = 0x20; //T1 八位自动重装载 T0 16定时
CKCON = 0x01; //T1使用系统时钟 T1CLK=SYSCLK/12 =480000HZ
TL1 = 0x60; //0x2b 1200bps 0x61 19200 bps
TH1 = 0x60;
EA=1;
TR1 = 1;
TR0 = 1;
arrTx[0] = 0x40; //帧头。
arrTx[1] = 0xbb; //标致
arrTx[3] = 0x2A; //帧尾。
/**********************************************************************
//按键程序
***********************************************************************/
while(1)
{
y=0;
key=0;
P2=0xFB;
if(P2!=0xFB) // 判断是否有按键按下
{
Delay(10000); // 延时
if(P2!=0xFB) //再判断是否有按键按下
{
if(P2==0xEB)
key=1;
else if(P2==0xDB)
key=2;
else if(P2==0xBB)
key=3;
else if(P2==0x7B)
key=4;
y=1;
}
}
P2=0xF7;
if(P2!=0xF7) //判断是否有按键按下
{
if(P2!=0xF7) //再判断是否有按键按下
{
if(P2==0xE7)
key=5;
else if(P2==0xD7)
key=6;
else if(P2==0xB7)
key=7;
else if(P2==0x77)
key=8;
y=1;
}
}
if(y==1)
{
arrTx[2] =key; //键盘值
halRfSendPacket(arrTx,4);
*P_Watchdog_Clear=0x01;
}
}
}
4 遥控接收部分的主程序
/**********************************************************************
* *功能描述:ADC试验,利用C8051F310内部ADC转换器,把当前的P2.2的当前电压
* * 值转换成ADC值从串口输出。
***********************************************************************/
#include <c8051F310.h> //C8051F31X系列头文件?
#include "CC1100.h"
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;
//**********************************************************************
//函数名:void PORT_Init (void)
//功能描述:端口初始化。
//**********************************************************************
void PORT_Init (void)
{
P2MDOUT = 0xff; //P2口全为输出。
P1MDOUT = 0xf3;
P0MDOUT |= 0x10; //TXD输出
P0MDOUT &= ~0x20; //RXD输入
P3MDOUT = 0xff;
XBR0 = 0x01; //硬件UART。
XBR1 = 0x40; //弱上拉关,交叉开关使能。
}
//**********************************************************************
//函数名:void Internal_Crystal(void)
//功能描述:设定内部时钟。
//**********************************************************************
void Internal_Crystal(void)
{
OSCICN = 0x83; // 内部振荡器允许,不分频最快频率
CLKSEL = 0x00; // 使用内部振荡器。
}
//**********************************************************************
//延时程序
//**********************************************************************
void ys()
{unsigned int aaa,bbb;
for(aaa=200;aaa>0;aaa--)
for(bbb=0;bbb<200;bbb++);
}
void main(void)
{
unsigned char k;
unsigned char arrRx[4];
PCA0MD &= ~0x40; //关闭看门狗。
PORT_Init(); //初始化I/O口。
Internal_Crystal(); //开启内部晶振。
Init_CC1100(); //初始化CC1100
Timer0_Init(); //初始化定时器0
EA = 1;
TR0 = 1;
while(1)
{
while(halRfReceivePacket(arrRx,4))
{
if(arrRx[1] == 0xbb);
{
if(arrRx[2]==0x01) LED1=!LED1;
else if(arrRx[2]==0x02) LED2=!LED2;
else if(arrRx[2]==0x03) LED3=!LED3;
else if(arrRx[2]==0x04) LED4=!LED4;
else if(arrRx[2]==0x05) LED5=!LED5;
else if(arrRx[2]==0x06) LED6=!LED6;
else if(arrRx[2]==0x07) LED7=!LED7;
else if(arrRx[2]==0x08) LED8=!LED8;
ys();
}
}
}
} |
|
|