找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3640|回复: 0
收起左侧

基于51单片机的无线投票器程序设计发射板程序

[复制链接]
ID:208888 发表于 2017-6-11 10:07 | 显示全部楼层 |阅读模式
基于51单片机的无线投票器程序设计发射板系统源代码

  1. /*--------------------------------------------------------------------------------------------------------------------
  2. #include <reg52.h>
  3. #include <intrins.h>

  4. typedef unsigned char uchar;
  5. typedef unsigned char uint;
  6. //****************************************NRF24L01端口定义***************************************
  7. sbit         MISO        =P1^5;
  8. sbit         MOSI        =P1^4;
  9. sbit        SCK            =P1^3;
  10. sbit        CE            =P1^1;
  11. sbit        CSN                =P1^2;
  12. sbit        IRQ                =P1^6;

  13. sbit LCD_RS =P2^5;
  14. sbit LCD_RW =P2^6;
  15. sbit LCD_E  =P2^7;
  16. //************************************按键***************************************************
  17. sbit        KEY1=P3^1;
  18. sbit        KEY2=P3^3;
  19. sbit        KEY3=P3^5;
  20. //************************************数码管位选*********************************************
  21. sbit        led1=P3^2;
  22. sbit        led2=P3^4;
  23. sbit        led3=P3^6;
  24. //*********************************************NRF24L01*************************************
  25. #define TX_ADR_WIDTH    5           // 5 uints TX address width
  26. #define RX_ADR_WIDTH    5           // 5 uints RX address width
  27. #define TX_PLOAD_WIDTH  20          // 20 uints TX payload
  28. #define RX_PLOAD_WIDTH  20          // 20 uints TX payload
  29. #define LCD_DATA        P0
  30. uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
  31. uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
  32. //***************************************NRF24L01寄存器指令*******************************************************
  33. #define READ_REG        0x00          // 读寄存器指令
  34. #define WRITE_REG       0x20         // 写寄存器指令
  35. #define RD_RX_PLOAD     0x61          // 读取接收数据指令
  36. #define WR_TX_PLOAD     0xA0          // 写待发数据指令
  37. #define FLUSH_TX        0xE1         // 冲洗发送 FIFO指令
  38. #define FLUSH_RX        0xE2          // 冲洗接收 FIFO指令
  39. #define REUSE_TX_PL     0xE3          // 定义重复装载数据指令
  40. #define NOP             0xFF          // 保留
  41. //*************************************SPI(nRF24L01)寄存器地址****************************************************
  42. #define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
  43. #define EN_AA           0x01  // 自动应答功能设置
  44. #define EN_RXADDR       0x02  // 可用信道设置
  45. #define SETUP_AW        0x03  // 收发地址宽度设置
  46. #define SETUP_RETR      0x04  // 自动重发功能设置
  47. #define RF_CH           0x05  // 工作频率设置
  48. #define RF_SETUP        0x06  // 发射速率、功耗功能设置
  49. #define STATUS          0x07  // 状态寄存器
  50. #define OBSERVE_TX      0x08  // 发送监测功能
  51. #define CD              0x09  // 地址检测           
  52. #define RX_ADDR_P0      0x0A  // 频道0接收数据地址
  53. #define RX_ADDR_P1      0x0B  // 频道1接收数据地址
  54. #define RX_ADDR_P2      0x0C  // 频道2接收数据地址
  55. #define RX_ADDR_P3      0x0D  // 频道3接收数据地址
  56. #define RX_ADDR_P4      0x0E  // 频道4接收数据地址
  57. #define RX_ADDR_P5      0x0F  // 频道5接收数据地址
  58. #define TX_ADDR         0x10  // 发送地址寄存器
  59. #define RX_PW_P0        0x11  // 接收频道0接收数据长度
  60. #define RX_PW_P1        0x12  // 接收频道0接收数据长度
  61. #define RX_PW_P2        0x13  // 接收频道0接收数据长度
  62. #define RX_PW_P3        0x14  // 接收频道0接收数据长度
  63. #define RX_PW_P4        0x15  // 接收频道0接收数据长度
  64. #define RX_PW_P5        0x16  // 接收频道0接收数据长度
  65. #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
  66. //**************************************************************************************
  67. void Delay(unsigned int s);
  68. void inerDelay_us(unsigned char n);
  69. void init_NRF24L01(void);
  70. uint SPI_RW(uint uchar);
  71. uchar SPI_Read(uchar reg);
  72. void SetRX_Mode(void);
  73. uint SPI_RW_Reg(uchar reg, uchar value);
  74. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
  75. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
  76. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
  77. void nRF24L01_TxPacket(unsigned char * tx_buf);


  78. //*****************************************长延时*****************************************
  79. void Delay(unsigned int s)
  80. {
  81.         unsigned int i;
  82.         for(i=0; i<s; i++);
  83.         for(i=0; i<s; i++);
  84. }
  85. //******************************************************************************************
  86. uint         bdata sta;   //状态标志
  87. sbit        RX_DR        =sta^6;
  88. sbit        TX_DS        =sta^5;
  89. sbit        MAX_RT        =sta^4;
  90. /******************************************************************************************
  91. /*延时函数
  92. /******************************************************************************************/
  93. void inerDelay_us(unsigned char n)
  94. {
  95.         for(;n>0;n--)
  96.                 _nop_();
  97. }
  98. //****************************************************************************************
  99. /*NRF24L01初始化
  100. //***************************************************************************************/
  101. void init_NRF24L01(void)
  102. {
  103.     inerDelay_us(100);
  104.         CE=0;    // chip enable
  105.         CSN=1;   // Spi  disable
  106.         SCK=0;   //
  107.         SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址       
  108.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
  109.         SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动        ACK应答允许       
  110.         SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  
  111.         SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
  112.         SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
  113.         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                   //设置发射速率为1MHZ,发射功率为最大值0dB
  114. }
  115. /****************************************************************************************************
  116. /*函数:uint SPI_RW(uint uchar)
  117. /*功能:NRF24L01的SPI写时序
  118. /****************************************************************************************************/
  119. uint SPI_RW(uint uchar)
  120. {
  121.         uint bit_ctr;
  122.            for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
  123.            {
  124.                 MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
  125.                 uchar = (uchar << 1);           // shift next bit into MSB..
  126.                 SCK = 1;                      // Set SCK high..
  127.                 uchar |= MISO;                         // capture current MISO bit
  128.                 SCK = 0;                              // ..then set SCK low again
  129.            }
  130.     return(uchar);                             // return read uchar
  131. }
  132. /****************************************************************************************************
  133. /*函数:uchar SPI_Read(uchar reg)
  134. /*功能:NRF24L01的SPI时序
  135. /****************************************************************************************************/
  136. uchar SPI_Read(uchar reg)
  137. {
  138.         uchar reg_val;
  139.        
  140.         CSN = 0;                // CSN low, initialize SPI communication...
  141.         SPI_RW(reg);            // Select register to read from..
  142.         reg_val = SPI_RW(0);    // ..then read registervalue
  143.         CSN = 1;                // CSN high, terminate SPI communication
  144.        
  145.         return(reg_val);        // return register value
  146. }
  147. /****************************************************************************************************/
  148. /*功能:NRF24L01读写寄存器函数
  149. /****************************************************************************************************/
  150. uint SPI_RW_Reg(uchar reg, uchar value)
  151. {
  152.         uint status;
  153.        
  154.         CSN = 0;                   // CSN low, init SPI transaction
  155.         status = SPI_RW(reg);      // select register
  156.         SPI_RW(value);             // ..and write value to it..
  157.         CSN = 1;                   // CSN high again
  158.        
  159.         return(status);            // return nRF24L01 status uchar
  160. }
  161. /****************************************************************************************************/
  162. /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  163. /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
  164. /****************************************************************************************************/
  165. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  166. {
  167.         uint status,uchar_ctr;
  168.        
  169.         CSN = 0;                                    // Set CSN low, init SPI tranaction
  170.         status = SPI_RW(reg);                       // Select register to write to and read status uchar
  171.        
  172.         for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
  173.                 pBuf[uchar_ctr] = SPI_RW(0);    //
  174.        
  175.         CSN = 1;                           
  176.        
  177.         return(status);                    // return nRF24L01 status uchar
  178. }
  179. /*********************************************************************************************************
  180. /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  181. /*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
  182. /*********************************************************************************************************/
  183. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  184. {
  185.         uint status,uchar_ctr;
  186.        
  187.         CSN = 0;            //SPI使能      
  188.         status = SPI_RW(reg);   
  189.         for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
  190.                 SPI_RW(*pBuf++);
  191.         CSN = 1;           //关闭SPI
  192.         return(status);    //
  193. }
  194. /****************************************************************************************************/
  195. /*函数:void SetRX_Mode(void)
  196. /*功能:数据接收配置
  197. /****************************************************************************************************/
  198. void SetRX_Mode(void)
  199. {
  200.         CE=0;
  201.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收发完成中断响应,16位CRC        ,主接收
  202.         CE = 1;
  203.         inerDelay_us(130);
  204. }
  205. /******************************************************************************************************/
  206. /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  207. /*功能:数据读取后放如rx_buf接收缓冲区中
  208. /******************************************************************************************************/
  209. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  210. {
  211.     unsigned char revale=0;
  212.         sta=SPI_Read(STATUS);        // 读取状态寄存其来判断数据接收状况
  213.         if(RX_DR)                                // 判断是否接收到数据
  214.         {
  215.             CE = 0;                         //SPI使能
  216.                 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
  217.                 revale =1;                        //读取数据完成标志
  218.         }
  219.         SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
  220.         return revale;
  221. }
  222. /***********************************************************************************************************
  223. /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
  224. /*功能:发送 tx_buf中数据
  225. /**********************************************************************************************************/
  226. void nRF24L01_TxPacket(unsigned char * tx_buf)
  227. {
  228.         CE=0;                        //StandBy I模式       
  229.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
  230.         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 装载数据       
  231.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送
  232.         CE=1;                 //置高CE,激发数据发送
  233.         inerDelay_us(10);
  234. }
  235. //************************************主函数************************************************************
  236. void main(void)
  237. {          
  238.         unsigned char tf =0;
  239.         unsigned char TxBuf[20]={0};         //
  240.         unsigned char RxBuf[20]={0};       

  241.         init_NRF24L01() ;

  242.         while(1)
  243.         {
  244.             if(KEY1 ==0 )
  245.                     {
  246.                     TxBuf[1] = 2 ;
  247.                         led1=0;
  248.               }
  249.                 else
  250.                   {
  251.                    led1=1;
  252.                    TxBuf[1] = 1 ;
  253.                   }

  254.            if(KEY2 ==0 )
  255.              {
  256.                         TxBuf[2] =2 ;
  257.                         led2=0;
  258.              }
  259.                 else
  260.                   {
  261.                    led2=1;
  262.                    TxBuf[2] = 1 ;
  263.                   }

  264.                 if(KEY3 ==0 )
  265.              {
  266.                         TxBuf[3] =2 ;
  267.                         led3=0;

  268.              }
  269.                 else
  270.                   {
  271.                    led3=1;
  272.                    TxBuf[3] = 1 ;
  273.                   }
  274.           
  275.        
  276.                 nRF24L01_TxPacket(TxBuf);        // Transmit Tx buffer data
  277.                 TxBuf[1] = 0x00;
  278.                 TxBuf[2] = 0x00;
  279.                 TxBuf[3] = 0x00;       
  280.                 Delay(1000);
  281.        


  282.                 SetRX_Mode();
  283.             Delay(1000);
  284.                 nRF24L01_RxPacket(RxBuf);
  285.        
  286.                 Delay(1000);                               


  287.         }
  288.        
  289. }


  290. 附录3:接收板系统源代码
  291. #include <reg52.h>
  292. #include <intrins.h>

  293. typedef unsigned char uchar;
  294. typedef unsigned char uint;
  295. //****************************************NRF24L01端口定义***************************************
  296. sbit         MISO        =P1^5;
  297. sbit         MOSI        =P1^4;
  298. sbit        SCK            =P1^3;
  299. sbit        CE            =P1^1;
  300. sbit        CSN                =P1^2;
  301. sbit        IRQ                =P1^6;

  302. sbit LCD_RS =P2^5;
  303. sbit LCD_RW =P2^6;
  304. sbit LCD_E  =P2^7;
  305. //************************************按键***************************************************
  306. sbit        KEY1=P3^1;
  307. sbit        KEY2=P3^3;
  308. sbit        KEY3=P3^5;
  309. //************************************数码管位选*********************************************
  310. sbit        led1=P3^2;
  311. sbit        led2=P3^4;
  312. sbit        led3=P3^6;
  313. //*********************************************NRF24L01*************************************
  314. #define TX_ADR_WIDTH    5           // 5 uints TX address width
  315. #define RX_ADR_WIDTH    5           // 5 uints RX address width
  316. #define TX_PLOAD_WIDTH  20          // 20 uints TX payload
  317. #define RX_PLOAD_WIDTH  20          // 20 uints TX payload
  318. #define LCD_DATA        P0
  319. uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
  320. uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
  321. //***************************************NRF24L01寄存器指令*******************************************************
  322. #define READ_REG        0x00          // 读寄存器指令
  323. #define WRITE_REG       0x20         // 写寄存器指令
  324. #define RD_RX_PLOAD     0x61          // 读取接收数据指令
  325. #define WR_TX_PLOAD     0xA0          // 写待发数据指令
  326. #define FLUSH_TX        0xE1         // 冲洗发送 FIFO指令
  327. #define FLUSH_RX        0xE2          // 冲洗接收 FIFO指令
  328. #define REUSE_TX_PL     0xE3          // 定义重复装载数据指令
  329. #define NOP             0xFF          // 保留
  330. //*************************************SPI(nRF24L01)寄存器地址****************************************************
  331. #define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
  332. #define EN_AA           0x01  // 自动应答功能设置
  333. #define EN_RXADDR       0x02  // 可用信道设置
  334. #define SETUP_AW        0x03  // 收发地址宽度设置
  335. #define SETUP_RETR      0x04  // 自动重发功能设置
  336. #define RF_CH           0x05  // 工作频率设置
  337. #define RF_SETUP        0x06  // 发射速率、功耗功能设置
  338. #define STATUS          0x07  // 状态寄存器
  339. #define OBSERVE_TX      0x08  // 发送监测功能
  340. #define CD              0x09  // 地址检测           
  341. #define RX_ADDR_P0      0x0A  // 频道0接收数据地址
  342. #define RX_ADDR_P1      0x0B  // 频道1接收数据地址
  343. #define RX_ADDR_P2      0x0C  // 频道2接收数据地址
  344. #define RX_ADDR_P3      0x0D  // 频道3接收数据地址
  345. #define RX_ADDR_P4      0x0E  // 频道4接收数据地址
  346. #define RX_ADDR_P5      0x0F  // 频道5接收数据地址
  347. #define TX_ADDR         0x10  // 发送地址寄存器
  348. #define RX_PW_P0        0x11  // 接收频道0接收数据长度
  349. #define RX_PW_P1        0x12  // 接收频道0接收数据长度
  350. #define RX_PW_P2        0x13  // 接收频道0接收数据长度
  351. #define RX_PW_P3        0x14  // 接收频道0接收数据长度
  352. #define RX_PW_P4        0x15  // 接收频道0接收数据长度
  353. #define RX_PW_P5        0x16  // 接收频道0接收数据长度
  354. #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
  355. //**************************************************************************************
  356. void Delay(unsigned int s);
  357. void inerDelay_us(unsigned char n);
  358. void init_NRF24L01(void);
  359. uint SPI_RW(uint uchar);
  360. uchar SPI_Read(uchar reg);
  361. void SetRX_Mode(void);
  362. uint SPI_RW_Reg(uchar reg, uchar value);
  363. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
  364. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
  365. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
  366. void nRF24L01_TxPacket(unsigned char * tx_buf);

  367. void delay5ms(void);   //误差 0us
  368. void LCD_WriteData(uchar LCD_1602_DATA);         /********LCD1602数据写入***********/
  369. void LCD_WriteCom(uchar LCD_1602_COM);                 /********LCD1602命令写入***********/
  370. void lcd_1602_word(uchar Adress_Com,uchar Num_Adat,uchar *Adress_Data); /*1602字符显示函数,变量依次为字符显示首地址,显示字符长度,所显示的字符*/
  371. void InitLcd();       
  372. //*****************************************长延时*****************************************
  373. void Delay(unsigned int s)
  374. {
  375.         unsigned int i;
  376.         for(i=0; i<s; i++);
  377.         for(i=0; i<s; i++);
  378. }
  379. //******************************************************************************************
  380. uint         bdata sta;   //状态标志
  381. sbit        RX_DR        =sta^6;
  382. sbit        TX_DS        =sta^5;
  383. sbit        MAX_RT        =sta^4;
  384. /******************************************************************************************
  385. /*延时函数
  386. /******************************************************************************************/
  387. void inerDelay_us(unsigned char n)
  388. {
  389.         for(;n>0;n--)
  390.                 _nop_();
  391. }
  392. //****************************************************************************************
  393. /*NRF24L01初始化
  394. //***************************************************************************************/
  395. void init_NRF24L01(void)
  396. {
  397.     inerDelay_us(100);
  398.         CE=0;    // chip enable
  399.         CSN=1;   // Spi  disable
  400.         SCK=0;   //
  401.         SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址       
  402.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
  403.         SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动        ACK应答允许       
  404.         SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  
  405.         SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
  406.         SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
  407.         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                   //设置发射速率为1MHZ,发射功率为最大值0dB
  408. }
  409. /****************************************************************************************************
  410. /*函数:uint SPI_RW(uint uchar)
  411. /*功能:NRF24L01的SPI写时序
  412. /****************************************************************************************************/
  413. uint SPI_RW(uint uchar)
  414. {
  415.         uint bit_ctr;
  416.            for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
  417.            {
  418.                 MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
  419.                 uchar = (uchar << 1);           // shift next bit into MSB..
  420.                 SCK = 1;                      // Set SCK high..
  421.                 uchar |= MISO;                         // capture current MISO bit
  422.                 SCK = 0;                              // ..then set SCK low again
  423.            }
  424.     return(uchar);                             // return read uchar
  425. }
  426. /****************************************************************************************************
  427. /*函数:uchar SPI_Read(uchar reg)
  428. /*功能:NRF24L01的SPI时序
  429. /****************************************************************************************************/
  430. uchar SPI_Read(uchar reg)
  431. {
  432.         uchar reg_val;
  433.        
  434.         CSN = 0;                // CSN low, initialize SPI communication...
  435.         SPI_RW(reg);            // Select register to read from..
  436.         reg_val = SPI_RW(0);    // ..then read registervalue
  437.         CSN = 1;                // CSN high, terminate SPI communication
  438.        
  439.         return(reg_val);        // return register value
  440. }
  441. /****************************************************************************************************/
  442. /*功能:NRF24L01读写寄存器函数
  443. /****************************************************************************************************/
  444. uint SPI_RW_Reg(uchar reg, uchar value)
  445. {
  446.         uint status;
  447.        
  448.         CSN = 0;                   // CSN low, init SPI transaction
  449.         status = SPI_RW(reg);      // select register
  450.         SPI_RW(value);             // ..and write value to it..
  451.         CSN = 1;                   // CSN high again
  452.        
  453.         return(status);            // return nRF24L01 status uchar
  454. }
  455. /****************************************************************************************************/
  456. /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  457. /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
  458. /****************************************************************************************************/
  459. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  460. {
  461.         uint status,uchar_ctr;
  462.        
  463.         CSN = 0;                                    // Set CSN low, init SPI tranaction
  464.         status = SPI_RW(reg);                       // Select register to write to and read status uchar
  465.        
  466.         for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
  467.                 pBuf[uchar_ctr] = SPI_RW(0);    //
  468.        
  469.         CSN = 1;                           
  470.        
  471.         return(status);                    // return nRF24L01 status uchar
  472. }
  473. /*********************************************************************************************************
  474. /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  475. /*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
  476. /*********************************************************************************************************/
  477. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  478. {
  479.         uint status,uchar_ctr;
  480.        
  481.         CSN = 0;            //SPI使能      
  482.         status = SPI_RW(reg);   
  483.         for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
  484.                 SPI_RW(*pBuf++);
  485.         CSN = 1;           //关闭SPI
  486.         return(status);    //
  487. }
  488. /****************************************************************************************************/
  489. /*函数:void SetRX_Mode(void)
  490. /*功能:数据接收配置
  491. /****************************************************************************************************/
  492. void SetRX_Mode(void)
  493. {
  494.         CE=0;
  495.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收发完成中断响应,16位CRC        ,主接收
  496.         CE = 1;
  497.         inerDelay_us(130);
  498. }
  499. /******************************************************************************************************/
  500. /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  501. /*功能:数据读取后放如rx_buf接收缓冲区中
  502. /******************************************************************************************************/
  503. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  504. {
  505.     unsigned char revale=0;
  506.         sta=SPI_Read(STATUS);        // 读取状态寄存其来判断数据接收状况
  507.         if(RX_DR)                                // 判断是否接收到数据
  508.         {
  509.             CE = 0;                         //SPI使能
  510.                 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
  511.                 revale =1;                        //读取数据完成标志
  512.         }
  513.         SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
  514.         return revale;
  515. }
  516. /***********************************************************************************************************
  517. /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
  518. /*功能:发送 tx_buf中数据
  519. /**********************************************************************************************************/
  520. void nRF24L01_TxPacket(unsigned char * tx_buf)
  521. {
  522.         CE=0;                        //StandBy I模式       
  523.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
  524.         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 装载数据       
  525.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送
  526.         CE=1;                 //置高CE,激发数据发送
  527.         inerDelay_us(10);
  528. }
  529. //************************************主函数************************************************************
  530. void main(void)
  531. {   uchar n;       
  532.         unsigned char tf =0;
  533.         unsigned char TxBuf[20]={0};         //
  534.         unsigned char RxBuf[20]={0};       
  535.     InitLcd();
  536.         init_NRF24L01() ;
  537.         lcd_1602_word(0x80,16,"*****Loading****");
  538.         lcd_1602_word(0xc0,16,"*****Loading****");
  539.         while(1)
  540.         {
  541.    
  542.                 SetRX_Mode();
  543.                 RxBuf[1] = 0x00;
  544.                 RxBuf[2] = 0x00;
  545.                 RxBuf[3] = 0x00;
  546.             Delay(1000);
  547.                 nRF24L01_RxPacket(RxBuf);
  548.             n=RxBuf[1]+RxBuf[2]+RxBuf[3];                                       
  549.                   
  550.                   if(n>4)
  551.                   {                
  552.                       lcd_1602_word(0x80,16,"**Pass****Pass**");
  553.                           lcd_1602_word(0xc0,16,"**Pass****Pass**");
  554.               }
  555.              if(n==3)
  556.                   {
  557.                           lcd_1602_word(0x80,16,"**Down****Down**");
  558.                           lcd_1602_word(0xc0,16,"**Down****Down**");                         
  559.                   }
  560.                 n=0;
  561.                 RxBuf[1] = 0x00;
  562.                 RxBuf[2] = 0x00;
  563.                 RxBuf[3] = 0x00;
  564.                 Delay(1000);                 //old is '1000'               
  565.        

  566.         }
  567.        
  568. }


  569. void lcd_1602_word(uchar Adress_Com,uchar Num_Adat,uchar *Adress_Data)
  570. {
  571. uchar i;
  572. uchar Data_Word;
  573. LCD_WriteCom(Adress_Com);
  574. for(i=0;i<Num_Adat;i++)
  575.   {
  576.    Data_Word=*Adress_Data;
  577.    LCD_WriteData(Data_Word);
  578.    Adress_Data++;
  579.   }
  580. }

  581. /***************1602函数*******************/
  582. void LCD_WriteData(uchar LCD_1602_DATA)         /********LCD1602数据写入***********/
  583. {
  584. delay5ms();  //操作前短暂延时,保证信号稳定
  585. LCD_E=0;
  586. LCD_RS=1;
  587. LCD_RW=0;
  588. _nop_();
  589. LCD_E=1;
  590. LCD_DATA=LCD_1602_DATA;
  591. LCD_E=0;
  592. LCD_RS=0;
  593. }

  594. /********LCD1602命令写入***********/
  595. void LCD_WriteCom(uchar LCD_1602_COM)
  596. {
  597. delay5ms();//操作前短暂延时,保证信号稳定
  598. LCD_E=0;
  599. LCD_RS=0;
  600. LCD_RW=0;
  601. _nop_();
  602. LCD_E=1;
  603. LCD_DATA=LCD_1602_COM;
  604. LCD_E=0;
  605. LCD_RS=0;
  606. }


  607. void InitLcd()
  608. {
  609. delay5ms();
  610. delay5ms();
  611. LCD_WriteCom(0x38); //display mode
  612. LCD_WriteCom(0x38); //display mode
  613. LCD_WriteCom(0x38); //display mode
  614. LCD_WriteCom(0x06); //显示光标移动位置
  615. LCD_WriteCom(0x0c); //显示开及光标设置
  616. LCD_WriteCom(0x01); //显示清屏
  617. delay5ms();
  618. delay5ms();
  619. }

  620. void delay5ms(void)   //误差 0us
  621. {
  622.     unsigned char a,b;
  623.     for(b=185;b>0;b--)
  624.         for(a=12;a>0;a--);
  625. }

复制代码


基于51单片机的无线投票表决器程序设计.rar

17.02 KB, 下载次数: 16, 下载积分: 黑币 -5

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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