《电子系统课程设计基于52的无线收发系统.doc》由会员分享,可在线阅读,更多相关《电子系统课程设计基于52的无线收发系统.doc(27页珍藏版)》请在三一办公上搜索。
1、物理与机电工程学院课程设计报告课程名称: 电子系统课程设计 系 部: 物理与机电工程学院 专业班级: 电子信息工程08级 学生姓名: 学 号: 指导教师: 完成时间: 2011年10月25日 报告成绩: 评阅意见: 评阅教师 日期 基于52的无线收发系统物理与机电工程学院 电子信息工程学号:* 姓名:* 指导老师:*【摘 要】在我们的日常生活学习与工作当中,经常需要两个设备终端之间进行通信,但是设备一多造成使用导线也多,使我们的环境变得非常的杂乱,设备的移动也受到了限制,无线通信不再因使身边一大堆的线路显得杂乱无章,两个通信设备在一定范围内能随意移动。本次设计使用挪威NoRDIC SEMICO
2、NDUCTOR公司的无线收发芯片nRF2401,它把射频收发电路集成在一块芯片上,可在2.4GHz一2.50GHz频段范围内可靠通信,以宏晶科技生产的STC89C52为主控对他进行控制,并增加达拉斯公司的单总线式数字温度传感器DS18B20进行温度信息采集,用数码管和LCD1602分别作为两个终端的显示部分以及按键对其控制实现人机交互。【关键词】 无线通信 温度采集 目录一 设计总体思路,基本原理和框图.4二 单元电路设计.4三 总电路图及元器件清单.6四 安装与调试步骤.8五 故障分析与改进.9六 功能测试与分析.9七 结论与心得体会.9八 程序流程图与代码10九 参考文献24一、设计总体思
3、路、基本原理和框图总体框图如下图所示MCUA独立键盘温度采集无线收发模块A液晶显示器数码管显示无线收发模块BMCUB电磁波根据设计思路本次设计可分为A、B两个系统模块,互为主从机,甲乙可以双向通信。实现如下功能1、 甲可以显示时钟和由乙采集到的温度信息,可以向乙发送命令,使乙当前显示的是温度还是时钟。2、 乙可以按甲的命令显示时钟(与甲时钟需同步)或者温度信息,当乙接受了甲的命令时指示灯闪烁一次。3、 以上的信息传递及显示都是为了证明系统收发信息的有效性,不突出本系统实际应用。系统中主要有MCU、液晶显示、数码管显示、独立按键、温度采集、无线收发等单元。其中MCU为各单元的控制中心,无线收发模
4、块是实现两机通信的终端,显示部分用来观察系统工作状态及无线通信的成功与否。二、单元设计电路1主控MCU单元主控MCU如图1所示,A、B都采用STC89C52为主控MCU,晶振频率为12.0M,C3(10uf),R1(10K)组成上电复位电路。 图12液晶显示单元液晶显示模块如图2所示,采用字符型液晶1602,其具有操作简单显示字符多特点,并接R0(104)进行对比度调节,P0为数据接口,P2.0,P2.1,P3.2为控制线。 图2 图3 图43数码管显示单元如图3所示,数码管采用四位一体的共阴数码管,由于单片机的I/O输出电流较小,故采用三极管进行放大驱动,当位选为高时三极管饱和导通,对应位的
5、数码管选中。4独立按键单元如图4,独立按键用来对系统工作控制,例如调时间,发命令等作用。5温度采集单元温度采集单元采用达拉斯公司生产的数字温度传感器DS18B20进行数据采集,其采用单总线数据传输,具有硬件简单的优势,而且数据采集周期短,精度高,量程大,可以达到室温计的要求,其数据总线与P2.5相接。6无线收发单元无线收发单元采用2.4GHz单片高速2Mbps无线收发芯片nRF24L01,nRF2401是挪威NoRDIC SEMICONDUCTOR公司的产品,它把射频收发电路集成在一块芯片上,可以用MCU模拟SPI通信协议实现数字传输。通过编程,nRF2401芯片的射频工作频率和输出信号的功率
6、等参量可以非常方便地调节。无线收发芯片nRF2401具有以下功能: 125个工作频道,工作频道之间的转换时间小于200us 无线通信数据具有地址检测和循环冗余(CyclicRedunDancy Check,,CRC)检查。 信号的调制方式为频移键控(FSK) 最大数据传输速率1Mbps 最大输出功率0dB 独特的Shock Burst TM射频信号发射模式。该模式降低平均发射功率,降低对微控制器数据传输速率的要求。 接收灵敏度93dBm。 独特的DuoCeiverT“接收模式。该模式支持两个不同工作频道的信号同时接收。 工作电压范围:1.9V一3.6V;具有正常、旁路和掉电3种供电模式。 图5
7、三、总电路图及元件清单1、总原理图如图6所示图62、PCB图如图7所示图73、元器件清单元件名称主要参数数量元件名称主要参数数量LCD16021个电解电容0.1UF2个MCUSTC89C522个10UF6个47UF2个芯片座DIP402个瓷片电容30PF4个LM11173.3V2个1044个晶振12.0M2个定值电阻10K4个数码管四位共阴1个1K20个按键6个2208个三极管90134个排针3排电位器1041个排插1排无线模块8脚2块温度传感器DS18B201个四、安装与调试步骤印制正确的电路板,打好孔,先将比较矮的元器件焊上,不耐温的选择在最后焊接,芯片先放管座,逐个管脚焊接,整个板焊好后
8、才把芯片插上,液晶先插排针,也要等到整个板焊接好后才插上,晶振、蜂鸣器和传感器元件先焊圆柱排孔,在插上,不要直接焊接,以免焊接时损坏,焊接时一定要按正确的方式焊接以避免虚焊,焊好了后下载程序,接通电源,触摸芯片看看是否发热,调整液晶的对比度,然后对照任务书,看能不能达到任务书所要求的性能,如不能达到检查电路以及程序。安装后如图8所示。图8五、故障分析与改进在一开始刚下进程序时并没用达到想象中的效果,A机的液晶屏不显示数据,只有背光亮,于是我就调节了对比度,调节过程中还是不会显示数据,只是在液晶上显示出一些黑格,每个字符都是全黑,可以知道硬件出问题了,特别是液晶模块部分,于是我就开始用万用表检查
9、是否短路和断路,在液晶部分有个地方布线比较密集,而且线比较细,是最容易发生断路和短路的地方,检查之后还是没查出问题,于是再去检查别的还是没出来,最后还是回到液晶部分,终于发现有个管脚虚焊了,于是对每个排针加固了一遍,再次上电便达到了想要的效果,液晶显示出了文字,然后再测试按键,还好比较顺利,A机的硬件部分算是完成了,再测试B机,开始数码管有一个段不亮,对其焊点加固之后就亮了,加上温度测试程序,硬件也算是完成,最后是繁琐的软件调试,由于有两个模块,同时对其调试特别麻烦,一开始只能单方向通信,很久后才发现地址配置有问题,最后终于成功了,系统一切工作正常。六、功能测试与分析(1)下面是所设计的功能列
10、表1、按S1,A机向B机发送命令,使B显示温度,并且发回当前温度值给A机显示出来。2、按S2,A机向B机发送命令,使B显示时钟,并且和A机同步。3、S3,S4,S5配合调整时钟、万年历,S3为调节位置选择按键,S4为数值加按键,S5为数值减按键,万年历支持闰年自动调整。4、按S6,A机显示的温度随B机变化而变化,再次按S6,停止这项功能。(2)实际功能进行测试 上电之后,A机显示万年历时钟,不显示温度,B机显示时钟,但是与A机不同;按S2,B机便显示与A机同步的时钟;再按S1,B机显示当前温度,并发一次当前温度信息给A机显示;按S6,B机不停的给A机发温度信息并实时显示;调节S3、S4、S5可
11、正确调节万年历与时钟。七、结论与心得体会从开始设计到设计结束花了两个星期的时间,前一周主要是设计方案、画板制板,第二个星期开始做程序部分,虽然程序不太长,但是经验少、水平有限,在这个上面还是花了不少的时间,加上硬件做的也有点问题,在联调的时候比较麻烦。通过这次设计能使我学到很多的东西,提高了硬件电路设计的能力、程序设计的能力以及调试的能力。硬件设计要有很多的基础知识,电路基础、模电、数电、单片机、PROTEL等,这都是我们之前学过的专业基础课,这次设计我们都用上了,使我们对之前学过的知识进行应用及巩固;程序设计使用C语言,学单片机之前不懂得C学来有什么用,只知道要应付考试,现在懂得了C的重要性
12、,而且还要学会结合实际的硬件进行软硬结合编程;最后调试可以说是最难的一个步骤了,是最考验一个人的耐性的时候,由于做板的工艺条件不是很好,一旦出问题,要一个一个模块的去检查,硬件检查完了还要检查程序,这个是在书本上学不到的,只有自己去经历、去做才会领悟到这些东西,总结出一些经验,以后可以利用自己之前的经验去解决问题,做多了自然就会掌握很多的调试技巧。作品调试出来后会有很大的成就感,使自己更喜欢做这些事情。经过这次设计,虽然我们很忙,感觉非常的累,头脑总是处于疲劳状态,但是我觉得很值得,因为我学到了很多东西,很多在平常学不到的在这次设计中我学到了。这次设计比之前的实训更有成就感,这次做出来的作品相
13、比以前更加的智能化,不会像以前做的那么的单调,无趣。通过这次使我更加喜欢了这个专业,对这些东西增加了兴趣,对我以后的学习增加了动力,我将会更加的努力,学习好这个专业领域的更多的知识,为以后的工作铺路。八、程序流程图与代码(1)流程图A机流程图液晶初始化主程序开始无线模块初始化结束Timer0中断开始结束定时器0初始化按键扫描时钟更新发送温度信息中断返回判断中断标志Sendflag为1?接收中断开始读取接收到的数据更新液晶显示Y中断返回结束NB机流程图LED闪烁读取一次温度信息主程序开始无线模块初始化结束Timer0中断开始结束定时器0初始化数码管扫描时钟更新中断返回判断中断标志rcv为1?接收
14、中断开始读取接收到的数据判断接收到的命令置位rcv结束NY显示时钟并与A机同步显示温度发回温度信息(2)程序代码A机代码#include #define uchar unsigned char#define uint unsigned int/*NRF24L01端口定义*sbit MISO=P35;sbit MOSI=P33;sbitSCK =P36;sbitCE =P37;sbitCSN=P34;/*按键*sbits1=P10;sbits2=P11;sbits3=P12;sbits4=P13;sbits5=P14;sbits6=P15; /*液晶控制*sbit lcdrs=P20;sbit
15、lcdrw=P21;sbit lcden=P22;/*NRF24L01*#define TX_ADR_WIDTH 5 / 5 uints TX address width 发送地址的宽度#define RX_ADR_WIDTH 5 / 5 uints RX address width 接收地址的宽度#define TX_PLOAD_WIDTH 4 / 4 uints TX payload 发送数据宽度#define RX_PLOAD_WIDTH 4 / 4 uints RX payloaduchar const A_ADRTX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x
16、01;/A机地址uchar const B_ADRRX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x02;/B机地址/*NRF24L01寄存器指令*#define READ_REG 0x00 / 读寄存器指令#define WRITE_REG 0x20 / 写寄存器指令#define RD_RX_PLOAD 0x61 / 读取接收数据指令#define WR_TX_PLOAD 0xA0 / 写待发数据指令#define FLUSH_TX 0xE1 / 清除发送 FIFO指令#define FLUSH_RX 0xE2 / 清除接收 FIFO指令#define REUSE_T
17、X_PL 0xE3 / 定义重复装载数据指令#define NOP 0xFF / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02 / 可用信道设置#define SETUP_AW 0x03 / 收发地址宽度设置#define SETUP_RETR 0x04 / 自动重发功能设置#define RF_CH 0x05 / 工作频率设置#define RF_SETUP 0x06 / 发射速率、功耗功能设置#d
18、efine STATUS 0x07 / 状态寄存器#define OBSERVE_TX 0x08 / 发送监测功能#define CD 0x09 / 地址检测 #define RX_ADDR_P0 0x0A / 频道0接收数据地址#define RX_ADDR_P1 0x0B / 频道1接收数据地址#define RX_ADDR_P2 0x0C / 频道2接收数据地址#define RX_ADDR_P3 0x0D / 频道3接收数据地址#define RX_ADDR_P4 0x0E / 频道4接收数据地址#define RX_ADDR_P5 0x0F / 频道5接收数据地址#define TX
19、_ADDR 0x10 / 发送地址寄存器#define RX_PW_P0 0x11 / 接收频道0接收数据长度#define RX_PW_P1 0x12 / 接收频道0接收数据长度#define RX_PW_P2 0x13 / 接收频道0接收数据长度#define RX_PW_P3 0x14 / 接收频道0接收数据长度#define RX_PW_P4 0x15 / 接收频道0接收数据长度#define RX_PW_P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置/*uchar bdata sta; /状态标志sbit
20、RX_DR=sta6;sbitTX_DS=sta5;sbitMAX_RT=sta4;uchar code table=0123456789.-C:; /写液晶对应ASCLL码/*/*延时函数/*/*延时x毫秒*/void delayms(uint x) uchar y; for(;x0;x-) for(y=111;y0;y-); void write_com(uchar com) /向液晶写指令函数 lcdrs=0;P0=com;delayms(1);lcden=1;delayms(1);lcden=0;void write_data(uchar date) /向液晶写数据函数lcdrs=1;
21、P0=date;delayms(1);lcden=1;delayms(1);lcden=0; void init() /液晶初始化函数 lcdrw=0;lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);/*/*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI读写时序/*/uchar SPI_RW(uchar date)uint bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) / output 8-bit MOSI = (date
22、 & 0x80); / output date, MSB to MOSIdate = (date 1); / shift next bit into MSB.SCK = 1; / Set SCK high.上升沿给出数据date |= MISO; / capture current MISO bitSCK = 0; / .then set SCK low again 下降沿读回数据 return(date); / return read date/*/*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI读时序 reg为寄存器地址/*/uchar SPI_
23、Read(uchar reg)uchar reg_val;CSN = 0; / CSN low, initialize SPI communication.SPI_RW(reg); / Select register to read from.reg_val = SPI_RW(0); / .then read registervalueCSN = 1; / CSN high, terminate SPI communicationreturn(reg_val); / return register value/*/*功能:NRF24L01写寄存器函数/*/void SPI_RW_Reg(uch
24、ar reg, uchar value)CSN = 0; / CSN low, init SPI transactionSPI_RW(reg); / select registerSPI_RW(value); / .and write value to it.CSN = 1; / CSN high again/*/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/*/uchar SPI_Read_Buf(uchar reg,
25、 uchar *pBuf, uchar uchars)uchar status,uchar_ctr;CSN = 0; / Set CSN low, init SPI tranactionstatus = SPI_RW(reg); / Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctruchars;uchar_ctr+)pBufuchar_ctr = SPI_RW(0); / CSN = 1; return(status); / return nRF24L01 status uchar/*/*函数:
26、uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*/void SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)uint uchar_ctr;CSN = 0; /SPI使能 SPI_RW(reg); for(uchar_ctr=0; uchar_ctr8; TL0=65536-50000; EA=1; ET0=1; TR0 = 1; IT0=1; /触发方式为负跳变触发EX0 = 1;
27、uchar hour=23,min=59,sec=50,month=10,day=28; uint year=2011;/*主函数*uchar TxBuf4=0; / uchar RxBuf4=0;uchar rcv = 0;uchar bai,shi,ge,run;uchar weizhi=0,sendflag=0;/*中断处理*/void nRF24L01_int(void) interrupt 0 /中断说明有数据接收到或其他中断源 EX0=0;sta=SPI_Read(STATUS);/ 读取状态寄存其来判断数据接收状况if(RX_DR) /接收到数据 CE = 0; / 进入待机模式
28、读数据SPI_Read_Buf(RD_RX_PLOAD,RxBuf,TX_PLOAD_WIDTH);/ read receive payload from RX_FIFO buffer SPI_RW_Reg(WRITE_REG+STATUS,sta);/清除中断标志 bai = RxBuf1; shi = RxBuf2; ge = RxBuf3; write_com(0x80+0x0a); write_data(tablebai); write_data(tableshi); write_data(table10); write_data(tablege); write_data(0xdf);
29、 write_data(table12); CE = 1; EX0=1; uchar num=0;void Timer0() interrupt 1 TH0=(65536-50000)8; TL0=65536-50000; num+; if(num=20) num=0; sec+; if(sec=60) sec=0; min+; if(min=60) min=0; hour+; if(hour=24) hour=0; day+; switch(month) case 1: case 3: case 5: case 7: case 8: case 10: case 12:if(day=32) day=1; month+; break; case 4: case 6: