基于STC12C5A60S2单片机的NRF24L01模块多机温度通讯设计资料分享给大家
调试日志 第一阶段:5月2日至5月19日(考试周结束前) 阅读所需的NRF24L01无线射频模块、DS18B20温度传感器、LCD1602显示屏、LCD12864显示屏的相关资料。 第二阶段:5月20日起 ***************************** 5月20日(周一) 第一步:lcd模块调试和字符串转化函数 因为无线发送和显示需要将char值转化成字符串函数进行操作。要想对NRF24L01进行调试,必须要有适当的显示设备,所以第一步先将LCD12864代码编写出来。 经过查阅资料,整理出的主要代码摘要如下所示。 Char值字符串转换 - uchar *s(uchar unm)
- {
- uchar x,y,z,u,n;
- x=unm/100;
- y=unm%100;
- z=y/10;
- u=y%10;
- n=0;
- if (x!=0)
- {
- str[n]=x+48;
- n++;
- }
- if(!(x==0&z==0))
- {
- str[n]=z+48;
- n++;
- }
- str[n]=u+48;
- n++;
- str[n]='\0';
- return str;
- }
- void main()
- {
- uchar tmp;
- tmp=251;
- delay_ms(100);
- Lcd_Init();
- Lcd_Clr();
- delay_ms(2);
- Lcdshow(0,0,"NRF24L01发射测试");
-
-
- while(1)
- {
- Lcdshow(1,3,s (tmp));
- delay_ms(2000);
- Lcdshow(1,0," ");
- delay_ms(800);
- }
- }
复制代码 屏幕中的现象是第一行显示“NRF24L01发射测试”第二行闪烁显示251。该结果表示LCD12864代码能够正常工作,字符串转换函数正确。 在调试过程中遇到了一个显示函数调用失败的错误,不过用了extern定义了之后即解决问题。
第二步:建立单片机与RNF24L01的通讯 接下来就要测试NRF4L01模块了,先测试最简单的读写寄存器功能。 /*******NRF2402的SPI 写时序*******///Reg int SPI_RW(int uuchar) { int bit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++) { RF_MOSI = (uuchar & 0x80);//输出uuchar的最高位 uuchar = (uuchar << 1); //左移一位 RF_SCK = 1; //将时钟线置1 uuchar |= RF_MISO; //同时读取STATUS RF_SCK = 0; //然后再将时钟线置0 }
return (uuchar); //返回读取的值 }
这一次在程序里加入了NRF24L01最简单的读写寄存器时序的子函数,后面的主函数里只有一句status=SPI_Read(0x07);是从STATUS寄存器(07H)中读取模块的状态。然后用Lcdshow(1,4,s(status));在屏幕上闪烁着显示出来14。这就是最简单的一个字节NRF24L01模块的状态寄存器值,这就标志着接口都连接并定义正确,NRF24L01已正常工作,串行读写程序都能正确运行。STATUS值是1110b,十进制是14。 ************************************ 5月21日(周日)
第三步:与NRF24L01的串行通讯操作各种指令调试 这次在主函数里用读数据函数来读取发送机身份地址寄存器TX_ADDR(0x10),把5个字节的数据存在数组当中,然后显示发送机地址的数值。这个地方被一个问题困扰了很长时间,就是显示出来的地址是2222231,然后屏蔽某些位的时候总是显示几个2,最后是31不变,因为起初对这个寄存器的原理还不是很清楚,所以以为是显示格式问题,几乎花了一整天的时间也没弄出原因来,就在即将放弃的时候发现了网上一篇讲这方面的文章,忽然就茅塞顿开,显示的是上电复位值五个E7,十进制就是231。因为并没有写地址数据进寄存器,而且又没有留够显示空间,所以才出现了上面的这种问题。这个问题险些导致我放弃,给了我很大的教训,拿到东西不能糊里糊涂的急于上手,一定要搞明白原理,要不然几乎必定会出现问题而且无从解决。 ***************************** 5月22日(周一) 在昨天函数的基础上,在读取指令前面放进一句SPI_Write_Buf(STA_MARK_TX+STA_MARK_MX,TX_ADDRESS,5)指令+寄存器,数组,写入数据个数。 把5 4 3 2 1这个表示地址的数组写入,然后显示出写入后地址。这表示指令调试完成! 第四步:射频发送调试 对数据包缓冲状态寄存器FIFO_STATUS的第四位的值为1还是0来判断数据是否成功发送,在进行之前需要关闭自动应答和自动发送。寄存器的值由00010001变为00000001又变为00010001,说明数据成功存入缓冲区,然后发送完毕,已将缓冲区的数据清空。 *******************************************************************************5月23日(周二) 昨天已经完成了对于发送机的调试,今天我又借了几块开发板来进行完整的收发测试。 在发送机的程序上,基本函数模块与发送机一致,在初始化函数中写入0通道地址,在模块接收过程中,如果接收到前面设定好的频率的载波信号的时候CD置为1,没有收到载波信号就为0,写一个主函数如果CD为1就在屏幕上显示1并延时一段时间,如果为0就显示0并持续刷新。在实际结果中,只要频率符合,不管通道地址是否一致,CD的值都会有变化。在调试过程中均设置最大发射功率以保证调试的成功率。 在修改了一些小毛病之后,事实可以证明发送模块可以发送信号且能被接收模块接收到。 继续修改程序让数据包得以完整接收,主函数前部分不变,进入循环后SetRX_Mode();语句进行一次接收,后面if(NRF24L01_PxPackt(RxBuf))是进行接收数据的判断,,如果接受到数据,那就将这32个接收到的数据显示出来,然后延时一段时间,如果没有接到数据就再次进入循环接收。这里使用的是一致的地址。
************5月24日(周三)【满课】********************* 5月25日(周四) 考虑到时间因素以及我们的实际应用场合,温度值是由从机不断检测发送,主机不断刷新的,所以不再进行自动应答和自动重发功能调试。 将已经基本成型的NRF24L01文件和已有的DS18B20、LCD1602、LCD12864的c文件整合,得到一对一的温度检测系统。然后考虑多机通信方案。我想到的可行方案共有三种,第一种是跳频通信,优点是可以无限扩展,缺点是操作较为复杂;第二种是不同发送地址,由主机识别地址来区分从机的编号,该方案最多只能六对一。最后一种是所有从系均使用相同地址来进行发送,在每一次发送的温度值字符串末尾加上一个独有的用于身份识别的字符,该方案操作起来极为简单且经过验证运行稳定 。个人推测,当从机数量过多,或者发送数据量较大,发送频率较为频繁时,系统极易出现不稳定现象。不过对于这个多机温度检测系统,这个问题还是不存在的。 第三阶段:作品基本完成 5月26日——28日 总结文档,绘制原理图并且试图添加一些附加功能,例如OLED,单总线多DS18B20,开机密码等功能,但是因为时间紧迫和个人时间规划问题未能成功。至此多机温度检测系统已基本完成,能够实现题目所要求的内容。
全部资料51hei下载地址(内含源码与清晰图片):
张中-B计划2.zip
(414.3 KB, 下载次数: 59)
|