nRF2401无线数据用STC 51单片机实现驱动的程序

nRF2401无线数据用STC 51单片机实现驱动的程序 。 大家知道nRF2401是一款无线数据传输芯片,也非常常用,淘宝上几块一片,大批的卖家,那么 51单片机 驱动nRF2401无线数据程序怎么写呢?下面请参考,希望对大家有帮助。单片机使用的是STC89C52RC,8个LED接在P0口,低电平有效,测试直观。转载:nRF2401无线数据传输试验测试程序

nRF2401无线数据传输试验测试程序,两块同样nRF2401学习板子上演示数据同步,这是从网上转载的。单片机使用的是STC89C52RC,8个LED接在P0口,低电平有效,测试直观。

  1. 212

复制代码

  1. /***********************************************************/
  2. /*nRF2401学习板V1.0                                        */
  3. /*功能描述:nRF2401无线数据传输                            */
  4. /*芯片    :STC89C52RC  晶振 11.0592M                      */
  5. /*版本    :V1.0                                           */
  6. /***********************************************************/
  7. //测试OK,功能描述:
  8. //8个LED接在P0口,低电平有效
  9. //按键1是LED加 按键2LED减  按键3 LED全亮 按键4 LED全灭
  10. //两块同样的板子能够通过无线控制实现LED显示同步,串口输出数据
  11. #include <reg51.h>
  12. #include <intrins.h>
  13. #define uchar unsigned char
  14. #define uint  unsigned int
  15. #define ulong unsigned long
  16. //端口定义
  17. sbit nRF2401_PWR_UP = P1^4;
  18. sbit nRF2401_CE     = P1^5;
  19. sbit nRF2401_CS     = P1^7;
  20. //////////////////////
  21. sbit DR1    = P1^1;   //通道1
  22. sbit CLK1   = P3^2;
  23. sbit DATA   = P1^0;
  24. //////////////////////
  25. sbit DR2    = P1^3;   //通道2
  26. sbit CLK2   = P1^6;
  27. sbit DOUT2  = P1^2;
  28. ///////LED定义//////////
  29. sbit LED1  = P0^0;
  30. sbit LED2  = P0^1;
  31. sbit LED3  = P0^2;
  32. sbit LED4  = P0^3;
  33. sbit LED5  = P0^4;
  34. sbit LED6  = P0^5;
  35. sbit LED7  = P0^6;
  36. sbit LED8  = P0^7;
  37. ///////按键定义////////////
  38. sbit K1  = P3^3;
  39. sbit K2  = P3^4;
  40. sbit K3  = P3^5;
  41. sbit K4  = P3^6;
  42. sbit speaker=P3^7;//蜂鸣器输出引脚
  43. //Configuration Word       datasheet(page17 of 37)
  44. //Reserved for testing
  45. #define TEST_2         0x8E     //MSB    D143~D136
  46. #define TEST_1         0x08     //       D135~D128
  47. #define TEST_0         0x1C     //       D127~D120
  48. #define DATA2_W        2*8      //通道2 payload数据长度设置(bit)
  49. #define DATA1_W        28*8      //通道1 payload数据长度设置(bit)
  50. //NOTE: DATAx_W(bits)<=256 - ADDR_W - CRC                datasheet(page17 of 37)
  51. #define ADDR2_4      0x00//通道2接收地址
  52. #define ADDR2_3      0x00
  53. #define ADDR2_2      0x00
  54. #define ADDR2_1      0x00
  55. #define ADDR2_0      0x01
  56. #define ADDR1_4      0x00//通道1接收地址
  57. #define ADDR1_3      0x00
  58. #define ADDR1_2      0x00
  59. #define ADDR1_1      0x34
  60. #define ADDR1_0      0x12
  61. #define ADDR_W       2*8    //发送/接收地址宽度(单位:Bit)
  62. #define CRC_L        0x1    //CRC 模式  0:8 位  1:16 位
  63. #define CRC_EN       0x1    //CRC 校验  0:禁用  1:启用
  64. #define RX2_EN       0x0    //双通道功能0:禁用  1:启用
  65. #define CM           0x1    //0:Direct mode   1:ShockBurst mode
  66. #define RFDR_SB      0x0    //传输速率0:250kbps 1:1Mbps(requires 16MHZ crystal)
  67. #define XO_F         0x3    //晶振频率 D12-D10(000:4MHZ  001:8MHZ  010:12MHZ  011:16MHZ  100:20MHZ)
  68. #define RF_PWR       0x3    //发射模式的输出功率D9-D8(00:-20dBm  01:-10dBm  10:-5dBm  11:0dBm)
  69. #define RF_CH        0x2    //Channel 发射频率设置Channel=2400MHz+RF_CH * 1.0MHz  datasheet(page22 of 37)
  70. #define RXEN         0x0    //0:transmit mode    1:receive mode
  71. uchar code nRF2401_Config_Word[18] =
  72. {
  73. TEST_2, TEST_1, TEST_0, DATA2_W, DATA1_W, ADDR2_4, ADDR2_3, ADDR2_2,
  74. ADDR2_1,ADDR2_0,ADDR1_4,ADDR1_3, ADDR1_2, ADDR1_1, ADDR1_0,(ADDR_W<<2 | CRC_L<<1 | CRC_EN),
  75. (RX2_EN<<7 | CM<<6 | RFDR_SB<<5 | XO_F <<2 | RF_PWR),(RF_CH<<1 | RXEN)
  76. };
  77. uchar code Channel_Addr[]={0x34,0x12,0x00,0x00,0x00};//设置通道1地址,发射和接收必须匹配
  78. uchar nRF2401_Data[32]; //定义nRF2401数据发送接收临时存储地址
  79. uchar nRF2401_flag;//定义标志位,bit7-bit2 暂时保留 | bit0:是否有接收数据标志位 1:有 0:无
  80. //| bit1:是否有按键数据标志位 1:有 0:无
  81. /*****************************************/
  82. void delayms(uint count); //延时程序
  83. void speakertest(void);   //蜂鸣器程序
  84. uchar nRF2401_Read_Byte(void); //读字节
  85. void nRF2401_Write_Byte(uchar Send_Byte);//写字节
  86. void nRF2401_config(void);   //参数配置
  87. void nRF2401_Transmit_Mode(void); //设置为发射模式
  88. void nRF2401_Receive_Mode(void);  //设置为接收模式
  89. void nRF2401_Transmit_Data(uchar TxBuf[]);  //nRF2401发送数据子程序
  90. void nRF2401_Receive_Data(uchar *data_temp);//nRF2401接收数据子程序
  91. void init_rs232(void);           //串口初始化
  92. void keytest(void);  //按键测试程序
  93. /*****************************************/
  94. /*************延时子程序start*****************/
  95. void delayms(unsigned int count)
  96. {
  97. unsigned int i,j;
  98. for(i=0;i<count;i++)
  99. for(j=0;j<120;j++);
  100. }
  101. /**************延时子程序end****************/
  102. /* 串口通信初始化设置 */
  103. void init_rs232(void)
  104. {
  105. SCON=0x50;
  106. PCON=0x00;
  107. TH1=0xFD;    //波特率 9600  11.0592MHZ 时候
  108. TL1=0XFD;
  109. TMOD=0X20;
  110. TR1=1;
  111. }
  112. void speakertest(void)//蜂鸣器程序
  113. {
  114. unsigned char i;
  115. for(i=0;i<100;i++)
  116. {
  117. speaker=0;
  118. delayms(1);
  119. speaker=1;
  120. delayms(1);
  121. }
  122. }
  123. /*****************************************/
  124. void keytest(void)  //按键测试程序
  125. {
  126. ////////按键K1判断程序////////
  127. while(K1==0)
  128. {
  129. delayms(100);//按键去抖
  130. if(K1==1)
  131. {
  132. nRF2401_flag|=0x02; //按键标志位nRF2401_flag_bit1=1
  133. speakertest();
  134. nRF2401_Data[0]++;
  135. }
  136. else
  137. {;}
  138. }
  139. /////////////////////////////
  140. ////////按键K2判断程序////////
  141. while(K2==0)
  142. {
  143. delayms(100);//按键去抖
  144. if(K2==1)
  145. {
  146. nRF2401_flag|=0x02; //按键标志位nRF2401_flag_bit1=1
  147. speakertest();
  148. nRF2401_Data[0]--;
  149. }
  150. else
  151. {nRF2401_flag&=0xfd; } //清除按键标志位nRF2401_flag_bit1=0
  152. }
  153. /////////////////////////////
  154. ////////按键K3判断程序////////
  155. while(K3==0)
  156. {
  157. delayms(100);//按键去抖
  158. if(K3==1)
  159. {
  160. nRF2401_flag|=0x02; //按键标志位nRF2401_flag_bit1=1
  161. speakertest();
  162. nRF2401_Data[0]=0x00;
  163. }
  164. else
  165. {nRF2401_flag&=0xfd; } //清除按键标志位nRF2401_flag_bit1=0
  166. }
  167. /////////////////////////////
  168. ////////按键K4判断程序////////
  169. while(K4==0)
  170. {
  171. delayms(100);//按键去抖
  172. if(K4==1)
  173. {
  174. nRF2401_flag|=0x02; //按键标志位nRF2401_flag_bit1=1
  175. speakertest();
  176. nRF2401_Data[0]=0xff;
  177. }
  178. else
  179. {nRF2401_flag&=0xfd; } //清除按键标志位nRF2401_flag_bit1=0
  180. }
  181. if((nRF2401_flag&0x02)==0x02)//判断是否有按键按下
  182. {
  183. P0=~nRF2401_Data[0];
  184. nRF2401_Transmit_Mode();        //设置为发送模式
  185. nRF2401_Transmit_Data(nRF2401_Data); //发送数据
  186. nRF2401_Receive_Mode();         //设置为接收模式
  187. nRF2401_flag&=0xfd; //清除按键标志位nRF2401_flag_bit1=0
  188. }
  189. else
  190. {;}
  191. }
  192. /************读数据子程序***********/
  193. uchar nRF2401_Read_Byte(void)
  194. {
  195. uchar i,j,temp;
  196. temp=0x00;
  197. for (i=0;i<8;i++)
  198. {
  199. CLK1=1;
  200. _nop_();
  201. if (DATA==1) j=1;
  202. else j=0;
  203. temp=(temp<<1)|j;
  204. CLK1=0;
  205. }
  206. return temp;
  207. }
  208. /************写数据子程序***********/
  209. void nRF2401_Write_Byte(uchar Send_Byte)
  210. {
  211. uchar i;
  212. for (i=0;i<8;i++)
  213. {
  214. Send_Byte=Send_Byte<<1;
  215. DATA=CY; //读进位数据
  216. CLK1=1;
  217. _nop_();
  218. CLK1=0;
  219. }
  220. }
  221. /*********配置参数子程序***********/
  222. void nRF2401_config(void)
  223. {
  224. uchar i;
  225. //////stand by/////////////
  226. nRF2401_PWR_UP=1;
  227. nRF2401_CE=0;
  228. nRF2401_CS=0;
  229. /////////////////////////////      datasheet(page24 of 37)
  230. delayms(3);// PWR_DWN -> ST_BY_mode | MAX 3ms | name: Tpd2sby |
  231. nRF2401_CS=1;     //进入配置模式Configuration
  232. ////18个字节的配置字////////////// datasheet(page17 of 37)
  233. for (i=0;i<18;i++)
  234. {
  235. nRF2401_Write_Byte(nRF2401_Config_Word);
  236. }
  237. delayms(1);
  238. nRF2401_CS=0;    //nRF2401_CS 置低使配置有效  datasheet(page26 of 37);
  239. }
  240. /*********设置发射模式子程序*********/
  241. void nRF2401_Transmit_Mode(void)
  242. {
  243. nRF2401_PWR_UP=1; //进入配置模式
  244. nRF2401_CE=0;
  245. nRF2401_CS=1;
  246. delayms(1);
  247. //RXEN(bit0)=0 transmit mode ; datasheet(page22 of 37);
  248. DATA =0;
  249. CLK1=1;
  250. _nop_();
  251. CLK1=0;
  252. //设置为Active(Tx)模式
  253. nRF2401_CE=1;
  254. nRF2401_CS=0;
  255. delayms(1);
  256. }
  257. /*********设置接收模式子程序*********/
  258. void nRF2401_Receive_Mode(void)
  259. {
  260. nRF2401_PWR_UP = 1; //进入配置模式
  261. nRF2401_CE=0;
  262. nRF2401_CS=1;
  263. delayms(1);
  264. //RXEN(bit0)=1 receive mode ; datasheet(page22 of 37);
  265. DATA =1;
  266. CLK1=1;
  267. _nop_();
  268. CLK1=0;
  269. //设置为Active(Rx)模式
  270. nRF2401_CE=1;
  271. nRF2401_CS=0;
  272. delayms(1);
  273. }
  274. //接收方通道硬件地址
  275. /********发送数据子程序*********/
  276. void nRF2401_Transmit_Data(uchar TxBuf[]) //datasheet(page22 of 37);
  277. {
  278. uchar i;
  279. nRF2401_CE=1;
  280. delayms(1);
  281. for (i=0;i< (ADDR_W/8);i++)//写入接收地址(按字节对齐)
  282. {
  283. nRF2401_Write_Byte(Channel_Addr);
  284. }
  285. for (i=0;i<(DATA1_W/8);i++)//写入需要发送的数据(按字节对齐)
  286. {
  287. nRF2401_Write_Byte(TxBuf);
  288. }
  289. nRF2401_CE=0; //nRF2401_CE 置低使发送有效
  290. delayms(1);
  291. }
  292. /********接收数据子程序*********/
  293. void nRF2401_Receive_Data(uchar *data_temp)
  294. {
  295. uchar i;
  296. if (DR1==1) //接收完毕后,DR1自动为0  datasheet(page28 of 37);
  297. {
  298. for (i=0; i<DATA1_W/8; i++)
  299. {
  300. *data_temp=nRF2401_Read_Byte();
  301. data_temp++;
  302. }
  303. nRF2401_flag|=0x01; //接收标志位nRF2401_flag_bit0=1
  304. }
  305. else
  306. {nRF2401_flag&=0xfe;}//接收标志位nRF2401_flag_bit0=0
  307. }
  308. void main(void)
  309. {
  310. delayms(1000);//开机延时
  311. nRF2401_Data[0] = 0;
  312. init_rs232();  //串口初始化
  313. TI=1;          //串口发射有效
  314. nRF2401_config(); //nRF2401初始化配置
  315. delayms(100);
  316. speakertest();  //蜂鸣器叫一声
  317. nRF2401_Transmit_Mode();            //设置为发送模式
  318. nRF2401_Transmit_Data(nRF2401_Data);//发送测试数据
  319. nRF2401_Receive_Mode();             //设置为接收模式
  320. SBUF=0x55; //串口输出0x55 测试是否有正确的串口数据
  321. delayms(100);
  322. while (1)
  323. {
  324. nRF2401_Receive_Data(nRF2401_Data);//接收数据,并存放到nRF2401_Data[32]数组中
  325. if (nRF2401_flag&0x01==0x01) //判断是否有数据收到
  326. {
  327. P0=~nRF2401_Data[0];
  328. SBUF=nRF2401_Data[0];
  329. }
  330. else
  331. {;}
  332. keytest();  //调用按键子程序,无线发送数据
  333. }
  334. }
时间: 2024-09-29 09:47:27

nRF2401无线数据用STC 51单片机实现驱动的程序的相关文章

(转)STC 51单片机烧录协议分析

前段时间买了一个51单片机开发板.买完后发现,这开发板和芯片的厂家都是十分山寨. 芯片产家叫STC,江湖人称"死太惨",它的中文名字叫"宏晶科技",官网是:www.stcmcu.com,相信在打开这个网站之后,你就同意我的看法了.如果还不够的话,可以下载它的芯片手册:STC90C516RD+ PDF,或者 烧录软件,体验体验. 开发板的产家叫做普中科技,一个连官方论坛都打不开的神秘企业,谢天谢地,它还是有官网的:www.prechin.com. 虽然山寨味浓厚,但是

51单片机在win10下的开发

/** * SD Yang * 2015-07-30 * http://weibo.com/atCodeMonkey * */ 首先无论你是不是正版系统win7以上的都可以升级到最新的win10系统,实在不行可以用msdn上的镜像安装,然后通过dos命令激活. win10素来以其兼容性著称,也扬言兼容apk等.暂且不管这些,今天来说一下对于刚开始起步学51单片机的同学在win10下的一些问题. 这是我们推荐的开发环境是 keil + stc烧录工具 + 实验板. keil可以正常安装,但是要注意

[51单片机] SPI nRF24L01无线 [可以放在2个单片机里实现通信]

main.c 1 #include<reg51.h> 2 #include"2401.h" 3 4 #define uint unsigned int 5 #define uchar unsigned char 6 7 sbit KEY8=P3^7; //发送按键 8 sbit beep=P2^3;//喇叭 9 sbit LED6=P1^6; ////接收到数据后的功能实现灯 10 11 void delay_ms(uint z) //延时函数 12 { 13 uint x

[51单片机] nRF24L01 无线模块 测试 按键-灯-远程控制

哈哈,穷吊死一个,自己做的一个超简单的板还没有电源提供,只得借助我的大开发板啦.其实这2个模块是完全可以分开的,无线嘛,你懂得!进入正题,这个实验的功能就是一个发送模块(大的那个板)连接4个按键,通过按动这4个不同的按键来发送4种不同的命令,来控制接收端(小的板)点亮4个不同的灯. >_<!首先是发送模块: 1 void main() 2 { 3 uchar Tx_Buf1[]={1}; //发送的信息1 4 uchar Rx_Buf[32]; //接收到的数据暂存器,最多32字节数据 5 i

[51单片机] SPI nRF24L01 无线简单程序 1

main.c 1 #include <reg51.h> 2 #include <api.h> 3 4 #define uchar unsigned char 5 6 /***************************************************/ 7 #define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址 8 #define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度 9 #define LED P2 10 11

[51单片机] nRF24L01 无线模块 串口法命令 通过无线控制另一个的灯

>_<!概述: 这是在上一个的基础上通过按键发送4种不同命令来控制接收端的LED灯亮的改进版(上一个:http://www.cnblogs.com/zjutlitao/p/3840013.html),这里俺把按键发命令给去掉,然后加入一个串口通信的功能,PC通过串口给发送端发送命令,然后发送端通过无线将命令发给接收端来实现控制,这里接收端和上一个例程中的一样,只是在发送端的代码里去除了按键控制,变成了串口控制. >_<!发送端电路: >_<!接收电路图: >_&l

基于51单片机的无线测温系统

本51项目基于STC89C52MCU,温度传感器为DS18B20,显示模块用的是LCD1602,无线模块用的是Nodemcu. 项目用到的编程语言:C,C++,Lua. 实现思路是这样,DS18B20测温,然后数据串行传送给51单片机,然后51通过串口将数据传送给Nodemcu,Nodemcu通过其WIFI模块将数据发送给上位机,上位机上的程序是用Qt编写的GUI.(这里无线传输采用的是无连接的UDP协议) 1.DS18B20温度测量模块 DS18B20是单总线器件,所以时序要求非常严格,程序编

单片机(simple chip microcomputer)概论、51单片机、MCS-51单片机、STM32、ARM

catalogue 1. 单片机概论 2. 51单片机 3. MCS-51单片机 4. QX-MINI51开发板(STC89C52芯片) 5. STM32单片机 6. stm32f103zet6开发板实验 1. 单片机概论 0x1: 仿真器 单片机应用系统的软硬件调试需要专门的开发工具,称为"单片机开发系统"或"仿真机".常用的开发方式是把开发系统(例如PC)中的CPU和RAM暂时出借给用户系统,利用开发系统对用户系统的软硬件进行调试(又称仿真),然后将调试好的程序

[原创]基于51单片机的红外遥控课程设计

[注]: 一眨眼,大学接近尾声,具有找工作需要,所以把大学做的电子设计“劣作”放上来.希望考研失意,还能赶上“好工作”的春招班车.如果大伙有什么工作推荐也可以联系我哦,因为一年考研少接触了这方面,所以难免有些生疏.但请相信我!给我机会我会很认真学的! 邮箱:[email protected] 转载请注明出处呀! 基于51单片机的红外遥控课程设计 目录 第一章 设计简介... 3 第二章 系统方案... 3 一.设计方案对比... 3 二.方案设计... 4 第三章 硬件设计... 5 一.红外遥