找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2900|回复: 15
打印 上一主题 下一主题
收起左侧

怎么才能让这段单片机程序能够接收和发射,我的这个发射的数据不能收到

[复制链接]
回帖奖励 40 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次(中奖概率 60%)
跳转到指定楼层
楼主
ID:295783 发表于 2018-4-1 17:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做了一套收发的程序
其中大部分程序已完成,接收端和发射端不知道哪里有问题,数据接收不到
我想把这段数据发出去TxBuf[0] =  1;//机台
TxBuf[1] =  1;//机台               
TxBuf[2] =  1;//验证码
TxBuf[3] =  4;//验证码,缺料信号
    TxBuf[4] =  0;//验证码,缺料信号
接收端能接收到这些信息
求各位大神指点指点
不胜感激
QQ:443383851
接收端
  1. /**********************RC522实验开发板例程************************
  2. *  CPU:STC89C52RC
  3. *  晶振:11.0592MHZ
  4. ------------------------------------------------*/
  5. #include <reg52.h>
  6. #include  <STDIO.H>
  7. #include <string.h>
  8. #include "main.h"
  9. #include "mfrc522.h"
  10. #include <intrins.h>//无线
  11. //无线
  12. //无线函数  无线函数  无线函数  无线函数  无线函数   无线函数  无线函数  无线函数
  13. //***************************************NRF24L01寄存器指令*******************************************************
  14. #define READ_REG        0x00   // 读寄存器指令
  15. #define WRITE_REG       0x20  // 写寄存器指令  
  16. #define RD_RX_PLOAD     0x61   // 读取接收数据指令
  17. #define WR_TX_PLOAD     0xA0   // 写待发数据指令
  18. #define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令
  19. #define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令
  20. #define REUSE_TX_PL     0xE3   // 定义重复装载数据指令
  21. #define NOP             0xFF   // 保留
  22. //*************************************SPI(nRF24L01)寄存器地址****************************************************
  23. #define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
  24. #define EN_AA           0x01  // 自动应答功能设置
  25. #define EN_RXADDR       0x02  // 可用信道设置
  26. #define SETUP_AW        0x03  // 收发地址宽度设置
  27. #define SETUP_RETR      0x04  // 自动重发功能设置
  28. #define RF_CH           0x05  // 工作频率设置
  29. #define RF_SETUP        0x06  // 发射速率、功耗功能设置
  30. #define STATUS          0x07  // 状态寄存器
  31. #define OBSERVE_TX      0x08  // 发送监测功能  
  32. #define CD              0x09  // 地址检测            
  33. #define RX_ADDR_P0      0x0A  // 频道0接收数据地址
  34. #define RX_ADDR_P1      0x0B  // 频道1接收数据地址
  35. #define RX_ADDR_P2      0x0C  // 频道2接收数据地址
  36. #define RX_ADDR_P3      0x0D  // 频道3接收数据地址
  37. #define RX_ADDR_P4      0x0E  // 频道4接收数据地址
  38. #define RX_ADDR_P5      0x0F  // 频道5接收数据地址
  39. #define TX_ADDR         0x10  // 发送地址寄存器  
  40. #define RX_PW_P0        0x11  // 接收频道0接收数据长度
  41. #define RX_PW_P1        0x12  // 接收频道0接收数据长度
  42. #define RX_PW_P2        0x13  // 接收频道0接收数据长度
  43. #define RX_PW_P3        0x14  // 接收频道0接收数据长度
  44. #define RX_PW_P4        0x15  // 接收频道0接收数据长度
  45. #define RX_PW_P5        0x16  // 接收频道0接收数据长度
  46. #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
  47. typedef unsigned char uchar; //将无符号字节类型重定义为uchar
  48. typedef unsigned char uint;  
  49. void Delay(unsigned int s);//大延时
  50. void inerDelay_us(unsigned char n);//小延时
  51. void init_NRF24L01(void); //NRF24L01 初始化
  52. uint SPI_RW(uint dat); //根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节?
  53. uchar SPI_Read(uchar reg); //从reg寄存器读一字节
  54. void SetRX_Mode(void); //数据接收配置?
  55. uint SPI_RW_Reg(uchar reg, uchar value); //写数据value到reg寄存器?
  56. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); //从reg寄存器读出bytes个字节,通常用来//读取接收通道数据或接收/发送地址
  57. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); //把pBuf缓存中的数据写入到nRF24L01,通常用来写入发??//射通道数据或接收/发送地址?
  58. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); //数据读取后放入rx_buf接收缓冲区中?
  59. void nRF24L01_TxPacket(unsigned char * tx_buf); //发送?tx_buf中数据?
  60. #define TX_ADR_WIDTH    5   // 5 uints TX address width
  61. #define RX_ADR_WIDTH    5   // 5 uints RX address width
  62. #define TX_PLOAD_WIDTH  4   // 20 uints TX payload
  63. #define RX_PLOAD_WIDTH  4   // 20 uints TX payload
  64. uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
  65. uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
  66. uint bdata sta;   //状态标志  
  67. sbit RX_DR =sta^6; //RX_DR 为 sta 的第六位
  68. sbit TX_DS =sta^5; //TX_DS 为 sta 的第五位
  69. sbit MAX_RT =sta^4; //MAX_RT 为 sta 的第四位
  70. #define DataPort P0    //LCD1602 数据端口
  71. sbit wr=P2^6;
  72. sbit lcden=P2^4;
  73. sbit rs=P2^5;
  74. sbit dula=P3^2;
  75. sbit wela=P2^7;

  76. //**********延时函数***************
  77. void delay(uint z)//延时1毫秒
  78. {
  79. uint x,y;
  80. for(x=z;x>0;x--)
  81.   for(y=110;y>0;y--);//嵌套
  82. }
  83. void inerDelay_us(unsigned char n) //延时,us级,小延时
  84. {
  85. for(;n>0;n--)
  86. _nop_();
  87. }
  88. /*功能:NRF24L01的SPI写时序**********************/
  89. uint SPI_RW(uint dat)
  90. {
  91. uint i;
  92. for(i=0;i<8;i++) // 循环8次
  93. {
  94.   MOSI = (dat & 0x80);  // dat的最高位输出到MOSI
  95.   dat = (dat << 1);     // 左移一位
  96.   SCK = 1; //?拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据??Set?SCK?high..?,时钟置1
  97.   dat |= MISO;          //读MISO到 dat 最低位
  98.   SCK = 0; //?SCK置低
  99. }
  100. return(dat);            //返回读出的一字节
  101. }
  102. /*功能:NRF24L01的SPI读取1个字节**********************/
  103. uchar SPI_Read(uchar reg)
  104. {
  105. uchar reg_val;
  106. CSN = 0;             //CSN置低,开始传输数据
  107. SPI_RW(reg);         //选择寄存器,写一条reg指令
  108. reg_val = SPI_RW(0); //然后从该寄存器读数据,读取reg的值到reg-val中
  109. CSN = 1;             //CSN拉高,结束数据传输
  110. return(reg_val);     //返回寄存器数据
  111. }
  112. /*功能:NRF24L01写一个字节到寄存器函数*/
  113. uint SPI_RW_Reg(uchar reg, uchar value)
  114. {
  115. uchar status;
  116. CSN = 0;               // CSN置低,开始传输数据
  117. status = SPI_RW(reg);  // 选择寄存器,同时返回状态字
  118. SPI_RW(value);         // 然后写数据到该寄存器
  119. CSN = 1;               // CSN拉高,结束数据传输
  120. return(status);        // 返回状态寄存器
  121. }
  122. /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数**********************/
  123. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  124. {
  125. uint status,i;
  126. CSN = 0;                 //CSN置低,开始传输数据
  127. status = SPI_RW(reg);    //选择寄存器,同时返回状态字
  128. for(i=0;i<uchars;i++)
  129. pBuf[i] = SPI_RW(0); //逐个字节从nRF24L01读出
  130. CSN = 1;                 //CSN拉高,结束数据传输
  131. return(status);          //返回状态寄存器
  132. }
  133. /*功能: 用于写数据:reg为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数***************************/
  134. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  135. {
  136. uint status,i;
  137. CSN = 0;               //CSN置低,开始传输数据
  138. status = SPI_RW(reg);  //选择寄存器,同时返回状态字
  139. inerDelay_us(10);
  140. for(i=0; i<uchars; i++)
  141. SPI_RW(*pBuf++); //逐个字节写入nRF24L01
  142. CSN = 1;           //CSN拉高,结束数据传输
  143. return(status);    //返回状态寄存器
  144. }
  145. /*******************************发*****送*****模*****式*****代*****码*************************************/
  146. /*函数:void init_TX_Mode(void)
  147. /*功能:初始化NRF24L01为发送模式**********/
  148. void init_TX_Mode(void)
  149. {   
  150. CE=0;  
  151. SCK=0;  
  152. CSN=1;   
  153. SPI_RW_Reg(FLUSH_TX,0x00);   
  154. SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // Writes TX_Address to nRF24L01   
  155. SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack   
  156. SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0  
  157. SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0   
  158. SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...1a  
  159. SPI_RW_Reg(WRITE_REG + RF_CH, 0);        // Select RF channel 40   
  160. SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR   
  161. SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为2字节   
  162. SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);  
  163. CE=1;   
  164. inerDelay_us(100);
  165. }
  166. /*功能:发送 TxBuf中数据****************************/
  167. void nRF24L01_TxPacket(unsigned char * tx_buf)
  168. {
  169. CE=0; //StandBy I模式,停止射频电路工作
  170. SPI_Write_Buf(WRITE_REG  +  RX_ADDR_P0,  TX_ADDRESS,  TX_ADR_WIDTH); // 装载接收端地址
  171. SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据
  172. SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);   // IRQ收发完成中断响应,16位CRC,主发送
  173. CE=1;   //置高CE,激发数据发送
  174. inerDelay_us(10);
  175. }
  176. /*功能:数据读取后放如RxBuf接收缓冲区中 ************************/
  177. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  178. {
  179. unsigned char revale=0;
  180. sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
  181. if(RX_DR) // 判断是否接收到数据
  182. {
  183.   CE = 0; //SPI使能
  184.   SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// 读取接收的数据
  185.   revale =1; //读取数据完成标志
  186. }
  187. SPI_RW_Reg(WRITE_REG+STATUS,sta);     //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
  188. return revale;
  189. }
  190. /*功能:初始化NRF24L01为接收模式**********************/
  191. void init_RX_Mode(void)
  192. {     
  193. CE=0;   
  194. SCK=0;   
  195. CSN=1;     
  196. SPI_RW_Reg(FLUSH_RX,0x00);     
  197. //SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // Writes TX_Address to nRF24L01     
  198. SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack      
  199. SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0   
  200. SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0     
  201. //SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...1a   
  202. SPI_RW_Reg(WRITE_REG + RF_CH, 0);        // Select RF channel 40
  203. SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为2字节     
  204. SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR     
  205. SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F);   
  206. CE=1;     
  207. inerDelay_us(130);
  208. }
  209. /*功能:数据接收配置**********************/
  210. void SetRX_Mode(void)
  211. {
  212. CE=0;
  213. SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);//CRC使能,16位CRC校验,上电,接收模式
  214. CE = 1;    // 拉高CE启动接收设备
  215. inerDelay_us(130);
  216. }
  217. //无线函数  无线函数  无线函数   无线函数   无线函数  无线函数
  218. void Delay4000ms()  [url=]//@11.0592MHz[/url]
  219. {
  220. unsigned char i, j, k;
  221. _nop_();
  222. i = 29;
  223. j = 4;
  224. k = 219;
  225. do
  226. {
  227.   do
  228.   {
  229.    while (--k);
  230.   } while (--j);
  231. } while (--i);
  232. }
  233. void Delay500ms()  [url=]//@11.0592MHz[/url]
  234. {
  235. unsigned char i, j, k;
  236. _nop_();
  237. i = 4;
  238. j = 129;
  239. k = 119;
  240. do
  241. {
  242.   do
  243.   {
  244.    while (--k);
  245.   } while (--j);
  246. } while (--i);
  247. }
  248. uchar code table[]="A"; //单字符是单引号,多字符是双引号,可以通过加空格的方式
  249. //**********写命令至LCD***********************
  250. void write_com(uchar com)//写指令
  251. {
  252. rs=0;// 选择指令(1是数据,0是指令)
  253. wr=0;
  254. P0=com;// P0口是数据输入口
  255. delay(5); // 延时是为了让液晶有反应时间,必须有
  256. lcden=1;// 等于1时时输入
  257. delay(5);
  258. lcden=0;
  259. }
  260. //**********写数据至LCD************************
  261. void write_date(uchar date)//写数据
  262. {
  263. rs=1;// 选择指令(1是数据,0是指令)
  264. wr=0;
  265. P0=date;// P0口是数据输入口
  266. delay(5); // 延时是为了让液晶有反应时间,必须有
  267. lcden=1;// 等于1时时输入
  268. delay(5);
  269. lcden=0;
  270. }
  271. //*********LCD1602初始化**********************
  272. void InitLcd()
  273. {
  274. uchar num;
  275. dula=0;
  276. wela=0;
  277. lcden=0;
  278. wr=0;
  279. write_com(0x38);//显示模式设置
  280. write_com(0x0c);//不显示光标
  281. write_com(0x06);//指针加1,整屏不移动
  282. write_com(0x01);//清屏
  283. write_com(0x80);//数据口初始化,最左端
  284. for(num=0;num<1;num++)
  285. {
  286.   write_date(table[num]);
  287.   delay(5);
  288. }
  289. TMOD=0x01;//定时器1的工作方式
  290. TH0=(65536-50000)/256;
  291. TL0=(65536-50000)%256;
  292. EA=1;  //总中断打开
  293. ET0=1;//启用定时器0
  294. TR0=1;
  295. }
  296. //*********写一个字符数据到指定的目标***********
  297. void write_rgb(uchar add,uchar date)//写地址和数据
  298. {
  299. write_com(0x80+0x40+add);//写数据的地址第二行
  300. write_date(0x30+date);//指针自动加了一位,前面设置了
  301. }
  302. unsigned char code D1[4] = {0x94, 0x0C, 0xD9, 0x18}; //卡1 A40
  303. unsigned char code D2[4] = {0x15, 0x76, 0xE9, 0x11}; //卡2 A43
  304. unsigned char g_ucTempbuf[20];                        
  305. void main( )
  306. {   
  307. unsigned char status,i;
  308. unsigned int temp;
  309. unsigned char idata  TxBuf[4]={0}; // 要发送的数组,这个是初始化,就是把这个数组里面的值都赋为0
  310. unsigned char idata RxBuf[4]={0}; // 接收的数据 数组
  311. InitLcd();
  312. InitializeSystem( );
  313. PcdReset();//初始化芯片
  314. PcdAntennaOff(); //关闭天线
  315. PcdAntennaOn(); //开启天线
  316. Delay(50);
  317. while ( 1 )
  318. {
  319. init_RX_Mode();
  320.   delay(10);//防止编译警告
  321.   SetRX_Mode();  //设置成接受模式
  322. // RxBuf[0] = 0x00;  //接收的数组相应位清零
  323. // RxBuf[1] = 0x00;
  324. // RxBuf[2] = 0x00;  //接收的数组相应位清零
  325. // RxBuf[3] = 0x00;
  326. // RxBuf[4] = 0x00;
  327.   delay(100);
  328.   nRF24L01_RxPacket(RxBuf);  //接收数据  
  329.    
  330.    if(RxBuf[0] ==1)//验证码
  331.    
  332.    {
  333.    
  334.    if(RxBuf[1] ==1)//验证码
  335.    {
  336.   if(RxBuf[2] ==1)//验证码
  337.   {

  338. if(RxBuf[3] !=0)//验证码
  339. {
  340.    if(RxBuf[4] !=0)//验证码
  341.   {   
  342.    

  343.      //Speaker=~Speaker;  
  344.     write_rgb(0,'A');
  345.     write_rgb(1,RxBuf[0]);
  346.     write_rgb(2,RxBuf[1]);
  347.       //write_rgb(4,RxBuf[2]);
  348.   
  349.     }
  350.   }
  351.    
  352.     }}}
  353.    
  354.   status = PcdRequest(PICC_REQALL, g_ucTempbuf);//PICC_REQALL寻卡方式。g_ucTempbuf记录卡片类型 #define PICC_REQALL 0x52 寻天线区内全部卡
  355.   //????PcdRequest这有5个问题
  356.   if (status != MI_OK)
  357.   {   
  358.    InitializeSystem( );
  359.    PcdReset();
  360.    PcdAntennaOff();
  361.    PcdAntennaOn();
  362.    continue;//结束本次循环,下面不再执行
  363.   }
  364.   status = PcdAnticoll(g_ucTempbuf);//防冲撞
  365.   if (status != MI_OK)
  366.   {    continue;    }  
  367.   PcdAntennaOff();
  368.   ////////以下为超级终端打印出的内容////////////////////////   
  369.   printf("卡序列号:"); //超级终端显示,
  370.   for(i=0;i<4;i++)
  371.   {
  372.    temp=g_ucTempbuf[i];      
  373.    printf("%X",temp);      
  374.   }
  375.   //找到卡1
  376.    
  377.   
  378.    if(g_ucTempbuf[0]==RxBuf[3])
  379.    {
  380.    if(g_ucTempbuf[1]==RxBuf[4])
  381.     {
  382.     // if(g_ucTempbuf[2]==D1[2])
  383.     // {
  384.      // if(g_ucTempbuf[3]==D1[3])
  385.      // {
  386.        printf("找到卡片:");
  387.        //无线
  388.        TxBuf[0] =  4;//机台
  389.        TxBuf[1] =  0;//机台
  390.        TxBuf[2] =  1;//验证码
  391.        init_TX_Mode();
  392.        Delay(10);//防止编译警告
  393.        nRF24L01_TxPacket(TxBuf); //发送数据 Transmit Tx buffer data,看看这个是不是可以写两遍代表发射两遍????
  394.       // TxBuf[0] = 0x00; //清零   
  395.       // TxBuf[1] = 0x00;
  396.       // TxBuf[2] = 0x00; //清零   
  397.       // TxBuf[3] = 0x00;
  398.        Delay(1500);
  399.        J3=0;//电机正向运转
  400.        Delay4000ms();  [url=]//@11.0592MHz[/url]
  401.        Delay500ms();  [url=]//@11.0592MHz[/url];
  402.        J3=1;//电机停止
  403.        PcdHalt(); //功    能:命令卡片进入休眠状态
  404.        PcdAntennaOff();        
  405.       }
  406.      }
  407.     }
  408.    }
  409.   


  410. /////////////////////////////////////////////////////////////////////
  411. //系统初始化
  412. /////////////////////////////////////////////////////////////////////
  413. void InitializeSystem()
  414. {
  415. /* P0M1 = 0x0; P0M2 = 0x0;
  416. P1M1 = 0x0; P1M2 = 0x0;                     
  417. P3M1 = 0x0; P3M2 = 0xFF;
  418. */
  419. //P0 = 0xFF; P1 = 0xFF; P3 = 0xFF;P2 = 0xFF;
  420.   TMOD=0x21;     //设T0为方式1,GATE=1;
  421. SCON=0x50;
  422. TH1=0xF4;          //波特率为2400bps
  423. TL1=0xF4;
  424. TH0=0;
  425. TL0=0;
  426. TR0=1;  
  427. ET0=1;             //允许T0中断
  428. TR1=1;      //开启定时器
  429. TI=1;
  430. EA=1;       //开启总中断
  431. ES = 1;
  432. RI = 1;
  433. }


  434. 发射端
  435. #include <reg52.h>
  436. #include "main.h"
  437. #include <intrins.h>//无线
  438. //无线
  439. //无线函数  无线函数  无线函数  无线函数  无线函数   无线函数  无线函数  无线函数
  440. //***************************************NRF24L01寄存器指令*******************************************************
  441. #define READ_REG        0x00   // 读寄存器指令
  442. #define WRITE_REG       0x20  // 写寄存器指令  
  443. #define RD_RX_PLOAD     0x61   // 读取接收数据指令
  444. #define WR_TX_PLOAD     0xA0   // 写待发数据指令
  445. #define FLUSH_TX        0xE1  // 冲洗发送 FIFO指令
  446. #define FLUSH_RX        0xE2   // 冲洗接收 FIFO指令
  447. #define REUSE_TX_PL     0xE3   // 定义重复装载数据指令
  448. #define NOP             0xFF   // 保留
  449. //*************************************SPI(nRF24L01)寄存器地址****************************************************
  450. #define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
  451. #define EN_AA           0x01  // 自动应答功能设置
  452. #define EN_RXADDR       0x02  // 可用信道设置
  453. #define SETUP_AW        0x03  // 收发地址宽度设置
  454. #define SETUP_RETR      0x04  // 自动重发功能设置
  455. #define RF_CH           0x05  // 工作频率设置
  456. #define RF_SETUP        0x06  // 发射速率、功耗功能设置
  457. #define STATUS          0x07  // 状态寄存器
  458. #define OBSERVE_TX      0x08  // 发送监测功能  
  459. #define CD              0x09  // 地址检测            
  460. #define RX_ADDR_P0      0x0A  // 频道0接收数据地址
  461. #define RX_ADDR_P1      0x0B  // 频道1接收数据地址
  462. #define RX_ADDR_P2      0x0C  // 频道2接收数据地址
  463. #define RX_ADDR_P3      0x0D  // 频道3接收数据地址
  464. #define RX_ADDR_P4      0x0E  // 频道4接收数据地址
  465. #define RX_ADDR_P5      0x0F  // 频道5接收数据地址
  466. #define TX_ADDR         0x10  // 发送地址寄存器  
  467. #define RX_PW_P0        0x11  // 接收频道0接收数据长度
  468. #define RX_PW_P1        0x12  // 接收频道0接收数据长度
  469. #define RX_PW_P2        0x13  // 接收频道0接收数据长度
  470. #define RX_PW_P3        0x14  // 接收频道0接收数据长度
  471. #define RX_PW_P4        0x15  // 接收频道0接收数据长度
  472. #define RX_PW_P5        0x16  // 接收频道0接收数据长度
  473. #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
  474. typedef unsigned char uchar; //将无符号字节类型重定义为uchar
  475. typedef unsigned char uint;  
  476. void Delay(unsigned int s);//大延时
  477. void inerDelay_us(unsigned char n);//小延时
  478. void init_NRF24L01(void); //NRF24L01 初始化
  479. uint SPI_RW(uint dat); //根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节?
  480. uchar SPI_Read(uchar reg); //从reg寄存器读一字节
  481. void SetRX_Mode(void); //数据接收配置?
  482. uint SPI_RW_Reg(uchar reg, uchar value); //写数据value到reg寄存器?
  483. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); //从reg寄存器读出bytes个字节,通常用来//读取接收通道数据或接收/发送地址
  484. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); //把pBuf缓存中的数据写入到nRF24L01,通常用来写入发??//射通道数据或接收/发送地址?
  485. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); //数据读取后放入rx_buf接收缓冲区中?
  486. void nRF24L01_TxPacket(unsigned char * tx_buf); //发送?tx_buf中数据?
  487. #define TX_ADR_WIDTH    5   // 5 uints TX address width
  488. #define RX_ADR_WIDTH    5   // 5 uints RX address width
  489. #define TX_PLOAD_WIDTH  4   // 20 uints TX payload
  490. #define RX_PLOAD_WIDTH  4   // 20 uints TX payload
  491. /**************LCD1602*******************/
  492. #define RS_CLR RS=0
  493. #define RS_SET RS=1
  494. #define RW_CLR RW=0
  495. #define RW_SET RW=1
  496. #define EN_CLR EN=0
  497. #define EN_SET EN=1
  498. #define DataPort P0
  499. uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址
  500. uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址
  501. uint bdata sta;   //状态标志  
  502. sbit RX_DR =sta^6; //RX_DR 为 sta 的第六位
  503. sbit TX_DS =sta^5; //TX_DS 为 sta 的第五位
  504. sbit MAX_RT =sta^4; //MAX_RT 为 sta 的第四位
  505. void Delay(unsigned int s)//大延时
  506. {
  507. unsigned int i;
  508. for(i=0; i<s; i++);
  509. for(i=0; i<s; i++);
  510. }
  511. void inerDelay_us(unsigned char n) //延时,us级,小延时
  512. {
  513. for(;n>0;n--)
  514. _nop_();
  515. }
  516. /*功能:NRF24L01的SPI写时序**********************/
  517. uint SPI_RW(uint dat)
  518. {
  519. uint i;
  520. for(i=0;i<8;i++) // 循环8次
  521. {
  522.   MOSI = (dat & 0x80);  // dat的最高位输出到MOSI
  523.   dat = (dat << 1);     // 左移一位
  524.   SCK = 1; //?拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据??Set?SCK?high..?,时钟置1
  525.   dat |= MISO;          //读MISO到 dat 最低位
  526.   SCK = 0; //?SCK置低
  527. }
  528. return(dat);            //返回读出的一字节
  529. }
  530. /*功能:NRF24L01的SPI读取1个字节**********************/
  531. uchar SPI_Read(uchar reg)
  532. {
  533. uchar reg_val;
  534. CSN = 0;             //CSN置低,开始传输数据
  535. SPI_RW(reg);         //选择寄存器,写一条reg指令
  536. reg_val = SPI_RW(0); //然后从该寄存器读数据,读取reg的值到reg-val中
  537. CSN = 1;             //CSN拉高,结束数据传输
  538. return(reg_val);     //返回寄存器数据
  539. }
  540. /*功能:NRF24L01写一个字节到寄存器函数*/
  541. uint SPI_RW_Reg(uchar reg, uchar value)
  542. {
  543. uchar status;
  544. CSN = 0;               // CSN置低,开始传输数据
  545. status = SPI_RW(reg);  // 选择寄存器,同时返回状态字
  546. SPI_RW(value);         // 然后写数据到该寄存器
  547. CSN = 1;               // CSN拉高,结束数据传输
  548. return(status);        // 返回状态寄存器
  549. }
  550. /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数**********************/
  551. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  552. {
  553. uint status,i;
  554. CSN = 0;                 //CSN置低,开始传输数据
  555. status = SPI_RW(reg);    //选择寄存器,同时返回状态字
  556. for(i=0;i<uchars;i++)
  557. pBuf[i] = SPI_RW(0); //逐个字节从nRF24L01读出
  558. CSN = 1;                 //CSN拉高,结束数据传输
  559. return(status);          //返回状态寄存器
  560. }
  561. /*功能: 用于写数据:reg为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数***************************/
  562. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  563. {
  564. uint status,i;
  565. CSN = 0;               //CSN置低,开始传输数据
  566. status = SPI_RW(reg);  //选择寄存器,同时返回状态字
  567. inerDelay_us(10);
  568. for(i=0; i<uchars; i++)
  569. SPI_RW(*pBuf++); //逐个字节写入nRF24L01
  570. CSN = 1;           //CSN拉高,结束数据传输
  571. return(status);    //返回状态寄存器
  572. }
  573. /*******************************发*****送*****模*****式*****代*****码*************************************/
  574. /*函数:void init_TX_Mode(void)
  575. /*功能:初始化NRF24L01为发送模式**********/
  576. void init_TX_Mode(void)
  577. {   
  578. CE=0;  
  579. SCK=0;  
  580. CSN=1;   
  581. SPI_RW_Reg(FLUSH_TX,0x00);   
  582. SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // Writes TX_Address to nRF24L01   
  583. SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack   
  584. SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0  
  585. SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0   
  586. SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...1a  
  587. SPI_RW_Reg(WRITE_REG + RF_CH, 0);        // Select RF channel 40   
  588. SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR   
  589. SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为2字节   
  590. SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);  
  591. CE=1;   
  592. inerDelay_us(100);
  593. }
  594. /*功能:发送 TxBuf中数据****************************/
  595. void nRF24L01_TxPacket(unsigned char * tx_buf)
  596. {
  597. CE=0; //StandBy I模式,停止射频电路工作
  598. SPI_Write_Buf(WRITE_REG  +  RX_ADDR_P0,  TX_ADDRESS,  TX_ADR_WIDTH); // 装载接收端地址
  599. SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据
  600. SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);   // IRQ收发完成中断响应,16位CRC,主发送
  601. CE=1;   //置高CE,激发数据发送
  602. inerDelay_us(10);
  603. }
  604. /*功能:数据读取后放如RxBuf接收缓冲区中 ************************/
  605. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  606. {
  607. unsigned char revale=0;
  608. sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
  609. if(RX_DR) // 判断是否接收到数据
  610. {
  611.   CE = 0; //SPI使能
  612.   SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// 读取接收的数据
  613.   revale =1; //读取数据完成标志
  614. }
  615. SPI_RW_Reg(WRITE_REG+STATUS,sta);     //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
  616. return revale;
  617. }
  618. /*功能:初始化NRF24L01为接收模式**********************/
  619. void init_RX_Mode(void)
  620. {     
  621. CE=0;   
  622. SCK=0;   
  623. CSN=1;     
  624. SPI_RW_Reg(FLUSH_RX,0x00);     
  625. //SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // Writes TX_Address to nRF24L01     
  626. SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack      
  627. SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0   
  628. SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0     
  629. //SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...1a   
  630. SPI_RW_Reg(WRITE_REG + RF_CH, 0);        // Select RF channel 40
  631. SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为2字节     
  632. SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR     
  633. SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F);   
  634. CE=1;     
  635. inerDelay_us(130);
  636. }
  637. /*功能:数据接收配置**********************/
  638. void SetRX_Mode(void)
  639. {
  640. CE=0;
  641. SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);//CRC使能,16位CRC校验,上电,接收模式
  642. CE = 1;    // 拉高CE启动接收设备
  643. inerDelay_us(130);
  644. }
  645. //无线函数  无线函数  无线函数   无线函数   无线函数  无线函数

  646. /*------------------------------------------------
  647. uS延时函数,含有输入参数 unsigned char t,无返回值
  648. unsigned char 是定义无符号字符变量,其值的范围是
  649. 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  650. 长度如下 T=tx2+5 uS
  651. ------------------------------------------------*/
  652. void DelayUs2x(unsigned char k)
  653. {   
  654. while(--k);
  655. }
  656. /*------------------------------------------------
  657. mS延时函数,含有输入参数 unsigned char t,无返回值
  658. unsigned char 是定义无符号字符变量,其值的范围是
  659. 0~255 这里使用晶振12M,精确延时请使用汇编
  660. ------------------------------------------------*/
  661. void DelayMs(unsigned char k)
  662. {
  663.      
  664. while(k--)
  665. {
  666.      //大致延时1mS
  667.      DelayUs2x(245);
  668.   DelayUs2x(245);
  669. }
  670. }
  671. /*------------------------------------------------
  672.               判忙函数
  673. ------------------------------------------------*/
  674. bit LCD_Check_Busy(void)
  675. {
  676. DataPort= 0xFF;
  677. RS_CLR;
  678. RW_SET;
  679. EN_CLR;
  680. _nop_();
  681. EN_SET;
  682. return (bit)(DataPort & 0x80);
  683. }
  684. /*------------------------------------------------
  685.               写入命令函数
  686. ------------------------------------------------*/
  687. void LCD_Write_Com(unsigned char com)
  688. {  
  689. while(LCD_Check_Busy()); //忙则等待
  690. RS_CLR;
  691. RW_CLR;
  692. EN_SET;
  693. DataPort= com;
  694. _nop_();
  695. EN_CLR;
  696. }
  697. /*------------------------------------------------
  698.               写入数据函数
  699. ------------------------------------------------*/
  700. void LCD_Write_Data(unsigned char Data)
  701. {
  702. while(LCD_Check_Busy()); //忙则等待
  703. RS_SET;
  704. RW_CLR;
  705. EN_SET;
  706. DataPort= Data;
  707. _nop_();
  708. EN_CLR;
  709. }
  710. /*------------------------------------------------
  711.                 清屏函数
  712. ------------------------------------------------*/
  713. void LCD_Clear(void)
  714. {
  715. LCD_Write_Com(0x01);
  716. DelayMs(5);
  717. }
  718. /*------------------------------------------------
  719.               写入字符串函数
  720. ------------------------------------------------*/
  721. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  722. {     
  723. if (y == 0)
  724.   {     
  725.   LCD_Write_Com(0x80 + x);     //表示第一行
  726.   }
  727. else
  728.   {      
  729.   LCD_Write_Com(0xC0 + x);      //表示第二行
  730.   }        
  731. while (*s)
  732.   {     
  733. LCD_Write_Data( *s);     
  734. s ++;     
  735.   }
  736. }
  737. /*------------------------------------------------
  738.               写入字符函数
  739. ------------------------------------------------*/
  740. void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
  741. {     
  742. if (y == 0)
  743.   {     
  744.   LCD_Write_Com(0x80 + x);     
  745.   }   
  746. else
  747.   {     
  748.   LCD_Write_Com(0xC0 + x);     
  749.   }        
  750. LCD_Write_Data( Data);  
  751. }
  752. /*------------------------------------------------
  753.               初始化函数
  754. ------------------------------------------------*/
  755. void LCD_Init(void)
  756. {
  757.    LCD_Write_Com(0x38);    /*显示模式设置*/
  758.    DelayMs(5);
  759.    LCD_Write_Com(0x38);
  760.    DelayMs(5);
  761.    LCD_Write_Com(0x38);
  762.    DelayMs(5);
  763.    LCD_Write_Com(0x38);  
  764.    LCD_Write_Com(0x08);    /*显示关闭*/
  765.    LCD_Write_Com(0x01);    /*显示清屏*/
  766.    LCD_Write_Com(0x06);    /*显示光标移动设置*/
  767.    DelayMs(5);
  768.    LCD_Write_Com(0x0C);    /*显示开及光标设置*/
  769.    }
  770.    
  771. /*------------------------------------------------
  772.                     主函数
  773. ------------------------------------------------*/
  774. void main(void)
  775. {
  776. unsigned char idata  TxBuf[4]={0}; // 要发送的数组,这个是初始化,就是把这个数组里面的值都赋为0
  777. //unsigned char idata RxBuf[4]={0}; // 接收的数据 数组
  778. LCD_Init();
  779. LCD_Clear();//清屏
  780. init_TX_Mode();
  781. while (1)
  782. {
  783. if(Key1==0)
  784. {
  785. DelayMs(10);
  786. if(Key1==0)
  787. {


  788.         //无线
  789. TxBuf[0] =  1;//机台
  790. TxBuf[1] =  1;//机台               
  791. TxBuf[2] =  1;//验证码
  792. TxBuf[3] =  4;//验证码,缺料信号
  793.     TxBuf[4] =  0;//验证码,缺料信号
  794. // init_TX_Mode();
  795. Delay(10);//防止编译警告
  796. nRF24L01_TxPacket(TxBuf); //发送数据 Transm
  797.   init_TX_Mode();
  798.   
  799. TxBuf[0] = 0x00; //清零   
  800. TxBuf[1] = 0x00;
  801. TxBuf[2] = 0x00; //清零   
  802. TxBuf[3] = 0x00;
  803.   TxBuf[4] = 0x00;
  804. Delay(10);
  805.    LCD_Write_String(1,0,"A");
  806.     LCD_Write_String(4,0,"4");
  807.     LCD_Write_String(5,0,"0");
  808.   //LCD_Write_Char(4,0,TxBuf[0]);
  809.   //LCD_Write_Char(6,0,TxBuf[1]);
  810.   
  811.    }
  812.    
  813.   
  814.      }
  815.     }
  816.   

  817.   }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:295783 发表于 2018-4-2 15:49 | 只看该作者
没人帮我吗?
自己顶一下
希望大神可以看到
回复

使用道具 举报

板凳
ID:295783 发表于 2018-4-2 16:26 | 只看该作者
自己顶一下 希望大神可以看见
回复

使用道具 举报

地板
ID:295783 发表于 2018-4-3 11:49 | 只看该作者
再顶一下 帮我看一下接收程序 为什么可以收到不能显示呢
回复

使用道具 举报

5#
ID:295783 发表于 2018-4-8 08:52 | 只看该作者
有奖励都不要嘛? 帮帮忙啦
回复

使用道具 举报

6#
ID:295783 发表于 2018-4-8 15:17 | 只看该作者
难道我进了一个假的论坛吗???
回复

使用道具 举报

7#
ID:295783 发表于 2018-4-8 15:18 | 只看该作者
我急需大神的帮助!!!
回复

使用道具 举报

8#
ID:295783 发表于 2018-4-10 09:02 | 只看该作者
有人能看到这篇帖子吗???
回复

使用道具 举报

9#
ID:262604 发表于 2018-4-10 09:45 | 只看该作者
都能看的到,问题是代码太长了,没法全部看,你只能一点点定位问题
回复

使用道具 举报

10#
ID:304465 发表于 2018-4-10 15:12 | 只看该作者
帮忙顶一下
回复

使用道具 举报

11#
ID:295783 发表于 2018-4-11 09:19 | 只看该作者
wuxianyun 发表于 2018-4-10 09:45
都能看的到,问题是代码太长了,没法全部看,你只能一点点定位问题

问题已经基本解决了 现在正在研究一对多通信 有没有兴趣?
回复

使用道具 举报

12#
ID:295783 发表于 2018-4-11 09:20 | 只看该作者

多谢了 朋友 抱拳!!!
回复

使用道具 举报

13#
ID:155211 发表于 2018-4-11 09:59 | 只看该作者
本人觉得楼主应该好好看一下一对多通信问题,然后理解一下通信协议以及通信发送代码的格式,字节数等等原因,希望有帮助,不喜勿喷
回复

使用道具 举报

14#
ID:295783 发表于 2018-4-11 10:30 | 只看该作者
电子学院 发表于 2018-4-11 09:59
本人觉得楼主应该好好看一下一对多通信问题,然后理解一下通信协议以及通信发送代码的格式,字节数等等原因 ...

恩 我现在正在研究一对多通信 很有帮助 谢谢!
回复

使用道具 举报

15#
ID:305735 发表于 2018-4-11 11:26 | 只看该作者
帮顶一下,这个新手的我搞不来
回复

使用道具 举报

16#
ID:295783 发表于 2018-4-12 08:39 | 只看该作者
ppsos 发表于 2018-4-11 11:26
帮顶一下,这个新手的我搞不来

感谢!抱拳!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表