数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 3712|回复: 4

[PIC] PIC单片机nrf24l01无线模块实验

[复制链接]
发表于 2021-2-5 09:37:09 | 显示全部楼层 |阅读模式
网上买了几片G01-D模块兼容NRF24l01 ,陆陆续续弄了好长时间终于可以使用了。
最远距离没测试,10多米没有压力。感兴趣的可以看看。
程序有些乱。

  1. /***********nrf 24i01.h***********/
  2. #ifndef NRF24L01_h//FASONG
  3. #define NRF24L01_h
  4. #include <pic.h>
  5. //__CONFIG(0X3B31);
  6. #define uint8 unsigned char
  7. #define uint16 unsigned int
  8. void delays(uint16 us);
  9. void SpiInit();
  10. uint8 SPI_RW(uint8 byte);
  11. uint8 SPI_Read(uint8 reg);
  12. uint8 SPI_RW_Reg(uint8 reg,uint8 value);
  13. uint8 SPI_Read_Buf(uint8 reg, uint8 *pBuf, uint8 uchars);
  14. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
  15. void TX_MODE(void);
  16. void SetRX_Mode(void);

  17. void Transmit(uint8 *tx_buf);
  18. void ce24();



  19. #define CSN  RD1
  20. #define IRQ  RC1
  21. #define CE   RD0
  22. #define MOSI RC3
  23. #define MISO RC0
  24. #define SCK  RC2
  25. #define BACK_LED RD4
  26. #define KEY  RB0
  27. /*********************
  28. #define CSN  RE1
  29. #define IRQ  RE0
  30. #define CE   RE2
  31. #define MOSI RC4
  32. #define MISO RC5
  33. #define SCK  RC3
  34. #define BACK_LED RC1
  35. #define KEY  RB7
  36. ************************/

  37. #define TX_ADR_WIDTH   5
  38. #define RX_ADR_WIDTH   5
  39. #define RX_PLOAD_WIDTH 10
  40. #define TX_PLOAD_WIDTH 10
  41. uint8 TX_ADDRESS[TX_ADR_WIDTH]={0X34,0X43,0X10,0X10,0X01};
  42. uint8 RX_ADDRESS[RX_ADR_WIDTH]={0X34,0X43,0X10,0X10,0X01};
  43. uint8 Tx_Buf[TX_PLOAD_WIDTH]={0};
  44. /*
  45. uint8 Tx_Buf[TX_PLOAD_WIDTH]={0xff,0xee,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,
  46.                                0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb
  47.                              ,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xee,0xff};//32
  48. */
  49. uint8 sta=0;//NRF24L01状态

  50. /***********************寄存器指令***********************/
  51. #define READ_REG      0X00    //读寄存器指令
  52. #define WRITE_REG     0X20    //写寄存器指令
  53. #define RD_RX_PLOAD   0X61    //读取接收数据指令
  54. #define WR_TX_PLOAD   0XA0    //写待发数据指令
  55. #define FLUSH_TX      0XE1    //清除发送FIFO指令
  56. #define FLUSH_RX      0XE2    //清除接收FIFO指令
  57. #define REUSE_TX_PL   0XE3    //定义重复装载数据指令
  58. #define NOPP          0XFF    //保留
  59. /***********************寄存器地址***********************/
  60. #define config        0X00    //配置收发状态,CRC校验及收发响应方式
  61. #define EN_AA         0X01    //自动应答功能设置
  62. #define EN_RXADDR     0X02    //可用信道设置
  63. #define SETUP_AW      0X03    //收发地址宽度设置
  64. #define SETUP_RETR    0X04    //自动重发功能设置
  65. #define RF_CH         0X05    //工作频率设置
  66. #define RF_SETUP      0X06    //发送速率,功耗功能设置
  67. #define STATUS        0X07    //状态寄存器
  68. #define OBSERVE_TX    0X08    //发送监测功能
  69. #define CD            0X09    //地址检测
  70. #define RX_ADDR_P0    0X0A    //频道0接收数据地址
  71. #define RX_ADDR_P1    0X0B    //频道1接收数据地址
  72. #define RX_ADDR_P2    0X0C    //频道2接收数据地址
  73. #define RX_ADDR_P3    0X0D    //频道3接收数据地址
  74. #define RX_ADDR_P4    0X0E    //频道4接收数据地址
  75. #define RX_ADDR_P5    0X0F    //频道5接收数据地址
  76. #define TX_ADDR       0X10    //发送地址寄存器
  77. #define RX_PW_P0      0x11    // 接收频道0接收数据有效数据长度
  78. #define RX_PW_P1      0x12    // 接收频道1接收数据有效数据长度
  79. #define RX_PW_P2      0x13    // 接收频道2接收数据有效数据长度
  80. #define RX_PW_P3      0x14    // 接收频道3接收数据有效数据长度
  81. #define RX_PW_P4      0x15    // 接收频道4接收数据有效数据长度
  82. #define RX_PW_P5      0x16    // 接收频道5接收数据有效数据长度
  83. #define FIFO_STATUS   0X17    //FIFO栈入栈出状态寄存器设置
  84. #define MAX_RT        0X10    //MAX_RTD在第5位|
  85. #define TX_DS         0X20    //TX_DS在第6位  | 在读回STATUS时与其相与,就知道该位是否为1
  86. #define RX_DR         0X40    //RX_DR在第7位  |

  87. void ce24()
  88. {

  89. if(KEY==0)
  90.           {
  91.               delays(1000);
  92.               if(KEY==0)
  93.               {
  94.                   //while(KEY==0);
  95.                   BACK_LED=1;
  96.                   delays(5000);
  97.                   BACK_LED=0;
  98.                   //TX_MODE();
  99.                  // Transmit(0xff);
  100.                   delays(5000);
  101.                   sta=SPI_Read(READ_REG+STATUS);
  102.                   SPI_RW_Reg(WRITE_REG+STATUS,sta);//STATUS清0
  103.                   CE=0;
  104.               }
  105.           }
  106. }

  107. void delays(uint16 us)
  108. {
  109.     while(us--);
  110. }

  111. /*****************************************************************/

  112. void SpiInit()
  113. {
  114.      TRISC=0X03;//设置RC3/SCK,RC5/SDO为输出0X20//misoshuru

  115.      TRISD=0X00;//IRQ为输入,CE,CSN为输出0X01


  116.                 CE=0;
  117.                   CSN=1;
  118.      CSN=1;
  119.      SCK=0;
  120.      IRQ=1;

  121.      //delay(50000);

  122.      TX_MODE();
  123.      //Transmit(Tx_Buf);
  124.      delays(50000);
  125.      sta=SPI_Read(READ_REG+STATUS);
  126.       SPI_RW_Reg(WRITE_REG+STATUS,sta);//STATUS清0
  127. CE=0;







  128. }

  129. uint8 SPI_RW(uint8 byte)
  130. {
  131. uint8  bit_ctr;
  132. //DI();
  133.     for(bit_ctr=0;bit_ctr<8;bit_ctr++)    // output 8-bit
  134.     {
  135.      if(byte & 0x80)
  136.       {MOSI = 1;}
  137.      else
  138.      { MOSI = 0;}
  139.      byte = (byte << 1);             // shift next bit into MSB..
  140.      SCK = 1;                   // Set nRF24L01_SCK high..
  141.      if(MISO) byte |= 1;
  142.                 NOP();NOP();NOP();NOP();
  143.      SCK = 0;              // ..then set nRF24L01_SCK low again
  144.                 NOP();NOP();NOP();NOP();
  145.     }
  146.     //EI();
  147.     return(byte);                 // return read byte
  148. }
  149. /*uint8 SPI_Read()   //通过SPI读一个字节
  150. {
  151.       CSN=0;
  152.       SSPBUF=0X00;//读一个字节前必需先写入一个字节
  153.       while(!BF);
  154.       CSN=1;
  155.       return(SSPBUF);
  156. }*/
  157. uint8 SPI_Read(uint8 reg)
  158. {
  159.       uint8 reg_val;
  160.       CSN=0;
  161.       SPI_RW(reg);
  162.       reg_val=SPI_RW(0);
  163.       CSN=1;
  164.       return(reg_val);
  165. }
  166. uint8 SPI_RW_Reg(uint8 reg,uint8 value)//向寄存器写一个字节,同时返回状态字
  167. {
  168.       uint8 status;
  169.       CSN=0;
  170.       status=SPI_RW(reg);
  171.       SPI_RW(value);
  172.       CSN=1;
  173.       return(status);
  174. }
  175. /*****************************************************************************************/
  176. /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  177. /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
  178. /****************************************************************************************/
  179. uint8 SPI_Read_Buf(uint8 reg, uint8 *pBuf, uint8 uchars)
  180. {
  181.               uint8 status,uchar_ctr;

  182.               CSN = 0;                                                // Set CSN low, init SPI tranaction
  183.               status = SPI_RW(reg);                                   // Select register to write to and read status uchar

  184.               for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
  185.                             pBuf[uchar_ctr] = SPI_RW(0);    //

  186.               CSN = 1;                          

  187.               return(status);                    // return nRF24L01 status uchar
  188. }
  189. //*/////////////

  190. uint8 SPI_Write_Buf(uint8 reg,uint8 *pBuf,uint8 bytes)//向寄存器写入一个字符串
  191. {
  192.       uint8 status,byte_ctr;
  193.       CSN=0;
  194.       status=SPI_RW(reg);
  195.       for(byte_ctr=0;byte_ctr< bytes; byte_ctr++)   
  196.   {
  197.             SPI_RW(*pBuf++);
  198.       }
  199.       CSN=1;
  200.       return(status);
  201. }




  202. /***************************以上为SPI通讯程序**********************************/
  203. /******************************************************************************/
  204. //发送模式代码
  205. void TX_MODE(void)
  206. //void TX_MODE(unsigned char *tx_data)
  207. {
  208.      CE=0;
  209.         // CSN=1;   // Spi  disable
  210.      SCK=0;   //
  211.      SPI_RW_Reg(FLUSH_TX,0X00);
  212.      SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); // 写本地地址
  213.      SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);// 写接收端地址
  214. //        SPI_Write_Buf(WR_TX_PLOAD, tx_data, TX_ADR_WIDTH);      //写有效数据地址 + 有效数据 + 有效数据宽度
  215.      SPI_RW_Reg(WRITE_REG+EN_AA,0X01); //  频道0自动              ACK应答允许      
  216.      SPI_RW_Reg(WRITE_REG+EN_RXADDR,0X01); //  允许接收地址只有频道0,
  217.      SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X15);//禁止重发0X00//0AZIDONG 0x15 5ci
  218.      SPI_RW_Reg(WRITE_REG+RF_CH,40);   //   设置信道工作为2.4GHZ,收发必须一致
  219.      SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07);//设置发射速率为1MHZ,发射功率
  220.      SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//设置接收数据长度,本次设置为32字节
  221.      SPI_RW_Reg(WRITE_REG+config,0X0e);//发送上电,16位CRC校验,CRC使能
  222.      CE=1;
  223.                 IRQ=1;
  224.      delays(5000);
  225. }
  226. void Transmit(uint8 *tx_buf)
  227. {
  228.      CE=0;
  229.      SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);
  230.      SPI_RW_Reg(FLUSH_TX,0X00);
  231.      SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
  232.      SPI_RW_Reg(WRITE_REG+config,0X0E);
  233.      CE=1;
  234.      delays(100);
  235. }
  236. /***********************************************************************************************************
  237. /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
  238. /*功能:发送 tx_buf中数据
  239. /**********************************************************************************************************/
  240. void nRF24L01_TxPacket(unsigned char * tx_buf)
  241. {

  242. TX_MODE();
  243. CE=0;   //StandBy I模式
  244. SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
  245. SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);     // 装载数据
  246. SPI_RW_Reg(WRITE_REG + config, 0x0e);      // IRQ收发完成中断响应,16位CRC,主发送////////
  247. CE=1;   //置高CE,激发数据发送
  248. delays(200);
  249. }
  250. /****************************************************************************/
  251. /****************************************************************************************************/
  252. /*函数:void SetRX_Mode(void)
  253. /*功能:数据接收配置
  254. /****************************************************************************************************/
  255. void SetRX_Mode(void)
  256. {
  257.               CE=0;
  258.               SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                               // IRQ收发完成中断响应,16位CRC              ,主接收
  259.               CE = 1;
  260.               delays(180);
  261. }
  262. /******************************************************************************************************/
  263. /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  264. /*功能:数据读取后放如rx_buf接收缓冲区中
  265. /******************************************************************************************************/
  266. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  267. {
  268.     unsigned char revale=0;
  269.               sta=SPI_Read(STATUS);              // 读取状态寄存其来判断数据接收状况
  270.               if(RX_DR)                                                        // 判断是否接收到数据
  271.               {
  272.                   CE = 0;                                           //SPI使能
  273.                             SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
  274.                             revale =1;                                          //读取数据完成标志
  275.               }
  276.               SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
  277.               return revale;
  278. }





  279. unsigned char Check_ACK(void)
  280. {
  281.         sta=SPI_Read(WRITE_REG+STATUS);//读取寄存状态            // 返回状态寄存器
  282. return 1;
  283.         if(MAX_RT || TX_DS)
  284.             {
  285.                     SPI_RW_Reg(WRITE_REG + STATUS, 0xff);  // 清除TX_DS或MAX_RT中断标志
  286.                 CSN = 0;
  287.                 SPI_RW(FLUSH_TX);
  288.                 CSN = 1;
  289.                 IRQ = 1;

  290.                 return 0;
  291.             }
  292.             IRQ = 1;
  293.     //else
  294.          
  295. }

  296. /****************************************/

  297. /**************************************************
  298. 函数:Check_ACK()
  299. 描述:
  300.     检查接收设备有无接收到数据包,设定没有收到应答信
  301.     号是否重发
  302. /***********************************************
  303. uchar Check_ACK(bit clear)
  304. {
  305.     delay(2000);
  306.     while(IRQ);
  307.     sta = SPI_RW(NOP);                    // 返回状态寄存器
  308.     if(TX_DS)
  309.     {
  310.         blink(3);
  311.     }
  312.     //blink(5);
  313.     if(MAX_RT)
  314.         if(clear)                         // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发
  315.             SPI_RW(FLUSH_TX);
  316.     SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除TX_DS或MAX_RT中断标志
  317.     IRQ = 1;
  318.     if(TX_DS)
  319.         return(0x00);
  320.     else
  321.         return(0xff);
  322. }
  323. *************************************************/

  324. /*************************************/
  325. #endif

  326. /************************发送main********************/
  327. /*************发送模式**********/
  328. /********2021.2.1**************/
  329. #include <pic.h>//pic新开发板使用
  330. __CONFIG(0X3B31);//关闭看门狗,选择高速晶振,上电延时复位,掉电复位使能,代码保护

  331. #include "NRF24L01.h"

  332. #define uchar unsigned char
  333. #define uint  unsigned int
  334. #define  DQ      RA0
  335. #define  DQ_in   TRISA0=1
  336. #define  DQ_LOW()    TRISA0=0;DQ=0
  337. #define  DQ_HIGH()   TRISA0=1

  338. uint temper;
  339. char m=0;
  340. uchar flag_fu=0;  //温度正负值标志位
  341. uchar a1,a2,a3,a4;
  342. uchar bz1,bz2,bz3;
  343. void delayms(uint x);
  344. void delayus(uint ,uchar );
  345. void init();  
  346. void reset18();
  347. void write_byte(uchar date);
  348. uchar read_byte();
  349. void get_tem();

  350. void timer1_init();
  351. uchar counter=0;
  352. #define LED RD0

  353. uchar dispaly[8];
  354. const int table[]={0,1,2,3,4,5,6,7,8,9};







  355. void timer1_init()
  356. {
  357.         GIE=1;
  358.         PEIE=1;
  359.         T1CKPS0=1;T1CKPS1=1;                //1:8
  360.         TMR1CS=0;
  361.     TMR1IE=1;
  362.         TMR1ON=1;
  363.         TMR1H=0xfb;
  364.         TMR1L=0x1e;

  365. }
  366.    void interrupt ISR(void)
  367.   {
  368.          
  369.         if(TMR1IF==1)
  370.         {
  371.                
  372.                 TMR1IF=0;
  373.                 TMR1H=0xfb;
  374.                 TMR1L=0x1e;
  375.         if(++counter>=120)
  376.            {
  377.         //        disp(a1,a2,a3,a4);
  378.                                 LED=~LED;
  379.                 counter=0;
  380.         }
  381.         }
  382.                   }




  383. /**********main***********/
  384. void main()
  385. {
  386. int i;
  387. //unsigned char TX_Buf[8] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};
  388. ADON=0;
  389. timer1_init();
  390.    init();
  391. SpiInit();
  392. //write_byte(0x20);
  393. delayms(1000);

  394. delayms(1000);



  395.    while(1)
  396.   {
  397.     uchar num;
  398.   RD2=1;
  399.    get_tem();
  400. delayms(1000);
  401. RD2=0;
  402. delayms(1000);
  403. ce24();
  404.    }  
  405. }
  406. /*************************************/
  407. void delayms(unsigned int x)
  408. {
  409. unsigned int a,b;
  410. for(a=x;a>0;a--)
  411.       for(b=110;b>0;b--);
  412.   }




  413. void init()
  414. {
  415.   TRISB=0x00;
  416.         TRISD=0x00;
  417. PORTD=0X00;
  418.   TRISB0=1;
  419.   //PORTD=0x0f;
  420. ADCON1=0X06;
  421.   delayms(10);
  422. T0CS=0;
  423. TRISA=0x00;

  424.   delayms(10);
  425. //ADON=0;
  426. //ANSEL=0X07;

  427.   PORTA=0x00;
  428.   delayms(10);
  429.   PORTD=0xFF;
  430.         RA5=1;
  431.   delayms(1000);
  432.   PORTD=0x00;
  433. }
  434. void delayus(uint x,uchar y)
  435. {
  436. uint i;uchar j;
  437.     for(i=x;i>0;i--)
  438.       for(j=y;j>0;j--) ;
  439. }

  440. void reset18()
  441. {
  442.       uchar st=1;
  443.           DQ_HIGH();
  444.           NOP();NOP();
  445.      while(st)
  446.   {
  447.           DQ_LOW();
  448.           delayus(15,10);//750us
  449.           DQ_HIGH();
  450.           delayus(3,2);//70us
  451.        st=DQ;
  452.       if(DQ==1)
  453.          st=1;
  454.    else
  455.           st=0;
  456.    delayus(11,10);//500us
  457.    }
  458. }

  459. void write_byte(uchar date)
  460. {
  461.   uchar i,temp;
  462.      DQ_HIGH();
  463.      NOP();NOP();
  464.   for(i=8;i>0;i--)
  465.    {

  466.      temp=date&0x01;
  467.       DQ_LOW();
  468.       delayus(0,0);
  469.       if(temp==1)
  470.         DQ_HIGH();
  471.       delayus(2,1);//45us
  472.       DQ_HIGH();
  473.      date=date>>1;
  474.     }
  475. }

  476. uchar read_byte()
  477. {
  478. uchar i,date;
  479. static bit j;
  480. for(i=8;i>0;i-- )
  481.   {
  482.           date=date>>1;
  483.           DQ_HIGH();
  484.           NOP();NOP();
  485.           DQ_LOW();
  486.           NOP();NOP(); NOP();NOP(); NOP();NOP();
  487.           DQ_HIGH();
  488.           NOP();NOP(); NOP();NOP(); NOP();
  489.           j=DQ;
  490.           if(j==1)
  491.              date=date|0x80;
  492.             delayus(1,1);
  493.    }  
  494.        return(date);  
  495. }

  496. void get_tem()
  497. {
  498.         bz1=0;bz2=0;bz3=0;
  499.         uchar tem1,tem2,num;
  500.         GIE=0;
  501.         reset18();
  502.         write_byte(0xCC);
  503.         write_byte(0x44);
  504.    // delayus(2,2);//600us(60,15)
  505.         GIE=1;

  506.         GIE=0;
  507.         reset18();
  508.         write_byte(0xCC);
  509.                 GIE=1;
  510.    delayus(2,1);
  511.         GIE=0;
  512.         write_byte(0xBE);
  513.         tem1=read_byte();
  514.         tem2=read_byte();
  515.         GIE=1;      
  516.          temper = ((tem2<<4)&0xF0)|((tem1>>4)&0x0F);
  517.   if(temper>127)
  518.   {
  519.         //temper = ~temper + 1;
  520.                         flag_fu=1;
  521.                         bz1=1;
  522.         }
  523.         else
  524.         {
  525.                 flag_fu=0;
  526.                 bz1=0;
  527.         }


  528. /*
  529.    if(temper&0x8000)
  530.         {
  531.                 temper=~temper;
  532.                 temper+=1;
  533.                 flag_fu=1;
  534.         }
  535.         else
  536.         {
  537.                 flag_fu=0;
  538.         }
  539.    */
  540.   temper=(tem2*256+tem1)*6.25;
  541.    if(flag_fu==1)
  542.         {        temper = ~temper + 1;}

  543. if(temper>10000)
  544.         {
  545.                 temper=temper%10000;
  546.         a1=temper/1000;
  547.         a2=temper%1000/100;
  548.         a3=temper%100/10;
  549.         a4=temper%10;
  550.                 m=1;
  551.                 bz3=1;
  552.         }
  553.         else
  554.         {
  555.         temper=temper%10000;
  556.         a1=temper/1000;
  557.         a2=temper%1000/100;
  558.         a3=temper%100/10;
  559.         a4=temper%10;
  560.                         m=0;
  561.                 bz3=0;
  562.         }
  563. //if(a0>2)a0=0;
  564. //TX_MODE();
  565. delayms(30);
  566. if(bz1==bz3){bz2=1;}
  567. delayus(3,2);
  568. dispaly[1]=table[a1];
  569. dispaly[2]=table[a2];
  570. dispaly[3]=table[a3];
  571. dispaly[4]=table[a4];
  572. dispaly[5]=table[bz1];
  573. dispaly[6]=table[bz2];
  574. dispaly[7]=table[bz3];

  575. delayms(3);
  576. nRF24L01_TxPacket( dispaly); // Transmit Tx buffer data
  577. SPI_RW_Reg(WRITE_REG+STATUS,0XFF);
  578. SPI_RW_Reg(FLUSH_TX,0X00);
  579. //value18=(int)temper;



  580. }

  581. /************************数码管接收*******************************/
  582. #include <pic.h>//接收模式
  583. __CONFIG(0x3B31);
  584. //const rom unsigned int CONFIG=0x0101;
  585. #define uint8 unsigned char
  586. #define uint16 unsigned int
  587. #define uchar unsigned char
  588. #define uint unsigned int
  589. #define CSN  RB5
  590. #define IRQ  RB1
  591. #define CE   RB4
  592. #define MOSI RB3
  593. #define MISO RB0
  594. #define SCK  RB2
  595. #define BACK_LED RD7
  596. #define KEY  RB6
  597. uint temperx;
  598. void xianshishuju();
  599. uchar a1,a2,a3,a4;
  600. uchar a0;
  601. #define DOT_SET RD7=0
  602. #define DOT_CLR RD7=1
  603. #define RA1_SET RA1=0
  604. #define RA1_CLR RA1=1
  605. #define RA2_SET RA2=0
  606. #define RA2_CLR RA2=1
  607. #define RA3_SET RA3=0
  608. #define RA3_CLR RA3=1
  609. #define RA4_SET RA4=0
  610. #define RA4_CLR RA4=1


  611. #define TX_ADR_WIDTH   5
  612. #define RX_ADR_WIDTH   5
  613. #define RX_PLOAD_WIDTH 10
  614. #define TX_PLOAD_WIDTH 10
  615. uint8 TX_ADDRESS[TX_ADR_WIDTH]={0X34,0X43,0X10,0X10,0X01};
  616. uint8 RX_ADDRESS[RX_ADR_WIDTH]={0X34,0X43,0X10,0X10,0X01};
  617. uint8 Tx_Buf[TX_PLOAD_WIDTH];
  618. uint8 Rx_Buf[RX_PLOAD_WIDTH];

  619. uint8 sta=0;//NRF24L01状态

  620. /***********************寄存器指令***********************/
  621. #define READ_REG      0X00    //读寄存器指令
  622. #define WRITE_REG     0X20    //写寄存器指令
  623. #define RD_RX_PLOAD   0X61    //读取接收数据指令
  624. #define WR_TX_PLOAD   0XA0    //写待发数据指令
  625. #define FLUSH_TX      0XE1    //清除发送FIFO指令
  626. #define FLUSH_RX      0XE2    //清除接收FIFO指令
  627. #define REUSE_TX_PL   0XE3    //定义重复装载数据指令
  628. //#define NOP           0XFF    //保留
  629. /***********************寄存器地址***********************/
  630. #define config        0X00    //配置收发状态,CRC校验及收发响应方式
  631. #define EN_AA         0X01    //自动应答功能设置
  632. #define EN_RXADDR     0X02    //可用信道设置
  633. #define SETUP_AW      0X03    //收发地址宽度设置
  634. #define SETUP_RETR    0X04    //自动重发功能设置
  635. #define RF_CH         0X05    //工作频率设置
  636. #define RF_SETUP      0X06    //发送速率,功耗功能设置
  637. #define STATUS        0X07    //状态寄存器
  638. #define OBSERVE_TX    0X08    //发送监测功能
  639. #define CD            0X09    //地址检测
  640. #define RX_ADDR_P0    0X0A    //频道0接收数据地址
  641. #define RX_ADDR_P1    0X0B    //频道1接收数据地址
  642. #define RX_ADDR_P2    0X0C    //频道2接收数据地址
  643. #define RX_ADDR_P3    0X0D    //频道3接收数据地址
  644. #define RX_ADDR_P4    0X0E    //频道4接收数据地址
  645. #define RX_ADDR_P5    0X0F    //频道5接收数据地址
  646. #define TX_ADDR       0X10    //发送地址寄存器
  647. #define RX_PW_P0      0x11    // 接收频道0接收数据有效数据长度
  648. #define RX_PW_P1      0x12    // 接收频道1接收数据有效数据长度
  649. #define RX_PW_P2      0x13    // 接收频道2接收数据有效数据长度
  650. #define RX_PW_P3      0x14    // 接收频道3接收数据有效数据长度
  651. #define RX_PW_P4      0x15    // 接收频道4接收数据有效数据长度
  652. #define RX_PW_P5      0x16    // 接收频道5接收数据有效数据长度
  653. #define FIFO_STATUS   0X17    //FIFO栈入栈出状态寄存器设置
  654. #define MAX_RT        0X10    //MAX_RTD在第5位|
  655. #define TX_DS         0X20    //TX_DS在第6位  | 在读回STATUS时与其相与,就知道该位是否为1
  656. #define RX_DR         0X40    //RX_DR在第7位  |

  657. uchar const seg_data[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
  658. //0-9的显示代码

  659. void delay(uint16 us)//延时函数
  660. {
  661.     while(us--);
  662. }


  663. void SpiInit()
  664. {
  665.      TRISC=0X00;//设置RC3/SCK,RC5/SDO为输出0X20//rc0shuru
  666.    //  ANSELE=0X00;
  667.     // TRISD=0X00;//IRQ为输入,CE,CSN为输出0X01
  668.         TRISB=0X43;
  669.        delay(20);
  670.        CE=0;    // chip enable
  671.                 delay(20);
  672.                   CSN=1;   // Spi disable
  673.                  delay(20);
  674.                   SCK=0;
  675.                  delay(20);
  676. }

  677. uint8 SPI_RW(uint8 byte)
  678. {
  679. uint8  bit_ctr;
  680. //DI();
  681.     for(bit_ctr=0;bit_ctr<8;bit_ctr++)    // output 8-bit
  682.     {
  683.      if(byte & 0x80)
  684.       MOSI = 1;
  685.      else
  686.       MOSI = 0;
  687.      byte = (byte << 1);             // shift next bit into MSB..
  688.      SCK = 1;                   // Set nRF24L01_SCK high..
  689.      if(MISO) byte |= 1;
  690.                 NOP();NOP();NOP();NOP();
  691.      SCK = 0;              // ..then set nRF24L01_SCK low again
  692.                 NOP();NOP();NOP();NOP();
  693.     }
  694.     //EI();
  695.     return(byte);           
  696. }

  697. uint8 SPI_Read(uint8 reg)
  698. {
  699.       uint8 reg_val;
  700.       CSN=0;
  701.       SPI_RW(reg);
  702.       reg_val=SPI_RW(0);
  703.       CSN=1;
  704.       return(reg_val);
  705. }
  706. uint8 SPI_RW_Reg(uint8 reg,uint8 value)//向寄存器写一个字节,同时返回状态字
  707. {
  708.       uint8 status;
  709.       CSN=0;
  710.       status=SPI_RW(reg);
  711.       SPI_RW(value);
  712.       CSN=1;
  713.       return(status);
  714. }
  715. uint8 SPI_Write_Buf(uint8 reg,uint8 *pBuf,uint8 bytes)//向寄存器写入一个字符串
  716. {
  717.       uint8 status,byte_ctr;
  718.       CSN=0;
  719.       status=SPI_RW(reg);
  720.       for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)   
  721. {
  722.        //SPI_RW(pBuf[byte_ctr]);    //
  723. SPI_RW(*pBuf++);//gaiguo
  724.       }
  725.       CSN=1;
  726.       return(status);
  727. }
  728. /***************************以上为SPI通讯程序**********************************/
  729. /******************************************************************************/
  730. //接收模式代码
  731. void RX_MODE(void)
  732. {
  733.      CE=0;
  734.      SPI_RW_Reg(FLUSH_TX,0X00);///////////////////gaiguo/////////////
  735.      SPI_Write_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);// 写本地地址
  736.      SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);// 写接收端地址
  737.      SPI_RW_Reg(WRITE_REG+EN_AA,0X01);//  频道0自动 ACK应答允许
  738.      SPI_RW_Reg(WRITE_REG+EN_RXADDR,0X01);//  允许接收地址只有频道0,如果需要多频道,可以参考Page21
  739.      //SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X1a);/////////////////////gaiguo
  740.      SPI_RW_Reg(WRITE_REG+RF_CH,40);
  741.      SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07);
  742.      SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
  743.      SPI_RW_Reg(WRITE_REG+config,0X0f);//接受

  744.      delay(200);
  745.          CE=1;
  746.          delay(200);
  747. }
  748. uint8 SPI_Read_Buf(uint8 reg,uint8 *pBuf,uint8 bytes)
  749. {
  750.      uint8 status,uchar_ctr;
  751.      CSN=0;
  752.      status=SPI_RW(reg);
  753.      for(uchar_ctr=0;uchar_ctr<bytes;uchar_ctr++) //for(byte_ctr=0;byte_ctr< bytes; byte_ctr++)  
  754.      {
  755.           pBuf[uchar_ctr]=SPI_RW(0);//*pBUF++=SPIR_RW(0xff);
  756.      }
  757.      CSN=1;
  758.      return(status);
  759. }
  760. /*********************************************************/
  761. uint8 nRF24l01_RxPacket(uint8 *rx_buf)
  762. {
  763.      uint8 revale=0;
  764.         CE = 1;
  765.          delay(10);
  766. //        RX_MODE();
  767.          // delay(10);
  768.      sta=SPI_Read(STATUS);// 读取状态寄存其来判断数据接收状况
  769.       if(sta&RX_DR)//判断是否接收到数据 if(sta&RX_DR)
  770.      {
  771.                         CE = 0;//SPI使能///tianjia
  772.                          delay(2);
  773.            SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);
  774.                           SPI_RW_Reg(WRITE_REG+STATUS,sta);//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志.
  775.            revale=1;
  776.                                 CSN=0;
  777.                         //        SPI_RW(FLUSH_RX);
  778.                               
  779.                          SPI_RW_Reg(FLUSH_RX,0X00);//////////////////////////////////////////gaiiiii
  780.                         CSN=1;
  781.      }

  782.         IRQ=1;//////////////////////////gaiguo+++      
  783.      return(revale);
  784. }
  785. /*************************
  786. uint8 nRF24l01_RxPacket(uint8 *rx_buf)
  787. {
  788.      uint8 revale=0;

  789. //        RX_MODE();
  790.          // delay(10);
  791.      sta=SPI_Read(STATUS);// 读取状态寄存其来判断数据接收状况
  792.      if(sta&RX_DR)//判断是否接收到数据 if(sta&RX_DR)
  793.      {
  794.                         CE = 0;//SPI使能///tianjia
  795.                          delay(2);
  796.            SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);
  797.            revale=1;
  798.                          //SPI_RW_Reg(FLUSH_RX,0X00);//////////////////////////////////////////gaiiiii
  799.      }
  800.      SPI_RW_Reg(WRITE_REG+STATUS,sta);//接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志.
  801.         IRQ=1;//////////////////////////gaiguo+++      
  802.      return(revale);
  803. }
  804. ********************/
  805. /********************
  806. void xianshishuju()
  807. {
  808.       

  809.                         //        a1=RxBuf[3];           //符号位
  810.    a2=((RxBuf[2]<<4)|RxBuf[1]);  //整数位
  811.    a1=RxBuf[0];       //小数位
  812.       a3=RxBuf[2];       //十位
  813.        a4=RxBuf[1];       //个位
  814.                         
  815.       
  816. PORTD=seg_data[0];
  817.         RA5=1;
  818.         delay(20);
  819.         RA5=0;
  820.         PORTD=seg_data[a1];                                //显示个位
  821.         RA4_CLR;
  822.         DOT_CLR;
  823.         delay(20);
  824.         RA4_SET;
  825.         PORTD=seg_data[a2];
  826.         RA3_CLR;
  827.       
  828.         delay(20);
  829.         RA3_SET;
  830.         PORTD=seg_data[a3];
  831.         RA2_CLR;
  832.         delay(20);
  833.         RA2_SET;
  834.         PORTD=seg_data[a4];
  835.         RA1_CLR;
  836.         delay(20);
  837.         RA1_SET;
  838.                




  839. }
  840. /*******************************
  841. if(nRF24l01_RxPacket(Rx_Buf))
  842.                                   {

  843.                                    a1=Rx_Buf[1];       //小数位
  844.                                          a2=Rx_Buf[2];  //整数位
  845.                                       a3=Rx_Buf[3];       //十位
  846.                                        a4=Rx_Buf[4];       //个位
  847.                               
  848.                                                         };break;









  849. **************************/
  850. void main()
  851. {
  852.      uint8 recv=0;
  853.         uint k=0;
  854.                 int s;
  855.     //unsigned char RX_Buf[20] = {0};

  856.         //OPTION=0X00;    //设置A口为普通I/O口
  857.         TRISD = 0;  //portd 输出
  858.         TRISB = 0X00;                                          //设置B口低4位为输入//高四位为输出
  859.         TRISA = 0;  //porta 输出
  860.         PORTA = 0x00;//先关闭所有显示
  861.         //PORTD = 0x0f;
  862.      //delay(1);
  863.      TRISE0=0;
  864.                 RE0=1;

  865.      delay(1000);
  866.      SpiInit();
  867.         delay(1000);
  868.       RX_MODE();
  869.           delay(3500);
  870.            nRF24l01_RxPacket(Rx_Buf);
  871.   delay(2500);
  872.      RX_MODE();
  873.           delay(3500);


  874. delay(500);


  875.      while(1)
  876.      {



  877.         k++;  
  878.       
  879.         switch(k)
  880.                 {
  881.                 case 1000: if(nRF24l01_RxPacket(Rx_Buf)){break;}

  882.                                                         break;
  883.                         
  884.                
  885.                
  886.                 case 1003:k=0;break;//SPI_RW_Reg(FLUSH_RX,0X00);
  887.                 }

  888.                                 //        a0=Rx_Buf[5];          //biaozhiwei
  889.                                         a1=Rx_Buf[1];       //shi数位
  890.                                          a2=Rx_Buf[2];  //ge数位
  891.                                       a3=Rx_Buf[3];       //0.位
  892.                                        a4=Rx_Buf[4];       //0.00
  893.                                                 a0=Rx_Buf[5];          //biaozhiwei
  894.                                                         s=a0;
  895.                                         if(s==0)
  896.                                         {
  897.                                                 RE0=1;
  898.                                                                 PORTD=seg_data[0];
  899.                                                 RA5=1;
  900.                                                 delay(20);
  901.                                                 RA5=0;
  902.                                                 PORTD=seg_data[a1];                                //显示个位
  903.                                                 RA4_CLR;
  904.                                                
  905.                                                 delay(20);
  906.                                                 RA4_SET;
  907.                                                 PORTD=seg_data[a2];
  908.                                                 RA3_CLR;
  909.                                                 DOT_CLR;
  910.                                                 delay(20);
  911.                                                 RA3_SET;
  912.                                                 PORTD=seg_data[a3];
  913.                                                 RA2_CLR;
  914.                                                 delay(20);
  915.                                                 RA2_SET;
  916.                                                 PORTD=seg_data[a4];
  917.                                                 RA1_CLR;
  918.                                                 delay(20);
  919.                                                 RA1_SET;
  920.                                                                 //        xianshishuju( temperx);
  921.                                 }
  922.                         if(s!=0)
  923.                                         {
  924.                                                 RE0=1;
  925.                                                                 PORTD=seg_data[1];
  926.                                                 RA5=1;
  927.                                                 delay(20);
  928.                                                 RA5=0;
  929.                                                 PORTD=seg_data[a1];                                //显示个位
  930.                                                 RA4_CLR;
  931.                                                
  932.                                                 delay(20);
  933.                                                 RA4_SET;
  934.                                                 PORTD=seg_data[a2];
  935.                                                 RA3_CLR;
  936.                                                 DOT_CLR;
  937.                                                 delay(20);
  938.                                                 RA3_SET;
  939.                                                 PORTD=seg_data[a3];
  940.                                                 RA2_CLR;
  941.                                                 delay(20);
  942.                                                 RA2_SET;
  943.                                                 PORTD=seg_data[a4];
  944.                                                 RA1_CLR;
  945.                                                 delay(20);
  946.                                                 RA1_SET;
  947.                                                                 //        xianshishuju( temperx);
  948.                                 }
  949.                        

  950.      }
  951. }


  952. /**************************************12864接收************/
  953. #include <pic.h>//接收模式2020.2.4
  954. __CONFIG(0x3B31);
  955. //const rom unsigned int CONFIG=0x0101;
  956. //#include "tab1.h"
  957. #include "tab2.h"
  958. #include "dianzhen12864.h"
  959. #include "ds18b20_74.h"
  960. #include "nrf24_74.h"
  961. #define uint8 unsigned char
  962. #define uint16 unsigned int
  963. #define uchar unsigned char
  964. #define uint unsigned int
  965. void delayms(unsigned int x);
  966. void delay(uint16 us);
  967. uint temperx;
  968. uint temper;
  969. uchar d1,d2,d3,d4;

  970.         void get_tem();
  971. uchar flag_fu=0;  //温度正负值标志位

  972. #define BG RA5
  973. #define key RB0


  974. uchar f1,f2,f3,f4;

  975. int table[]={0,1,2,3,4,5,6,7,8,9};

  976. //0-9的显示代码
  977. char const wen1[]={

  978. /*--  文字:  温  --*/
  979. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  980. 0x10,0x60,0x02,0x8C,0x00,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFE,0x00,0x00,0x00,
  981. 0x04,0x04,0x7E,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,
  982. };
  983. char const du1[]={
  984. /*--  文字:  度  --*/
  985. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  986. 0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0x25,0x26,0x24,0xFC,0x24,0x24,0x24,0x04,0x00,
  987. 0x40,0x30,0x8F,0x80,0x84,0x4C,0x55,0x25,0x25,0x25,0x55,0x4C,0x80,0x80,0x80,0x00,


  988. };
  989. char const du2[]={
  990. /*--  文字:  ℃  --*/
  991. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  992. 0x06,0x09,0x09,0xE6,0xF8,0x0C,0x04,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,
  993. 0x00,0x00,0x00,0x07,0x1F,0x30,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00,
  994. };
  995. /***********************/

  996. char const shi[]={
  997. /*--  文字:  室  --*/
  998. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  999. 0x10,0x0C,0x24,0x24,0xA4,0x64,0x25,0x26,0x24,0x24,0xA4,0x24,0x24,0x14,0x0C,0x00,
  1000. 0x40,0x40,0x48,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x4B,0x48,0x40,0x40,0x00,
  1001. };
  1002. char const wai[]={
  1003. /*--  文字:  外  --*/
  1004. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  1005. 0x00,0xC0,0x30,0x1F,0x10,0x10,0xF0,0x00,0x00,0xFF,0x20,0x40,0x80,0x00,0x00,0x00,
  1006. 0x81,0x40,0x21,0x12,0x0C,0x03,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x03,0x00,0x00,
  1007. };
  1008. char const nei[]={
  1009. /*--  文字:  内  --*/
  1010. /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  1011. 0x00,0xF8,0x08,0x08,0x08,0x08,0x88,0x7F,0x88,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,
  1012. 0x00,0xFF,0x00,0x08,0x04,0x02,0x01,0x00,0x00,0x01,0x02,0x4C,0x80,0x7F,0x00,0x00,
  1013. };
  1014. /***************************/
  1015. /*************************************/
  1016. void delayms(uint x)
  1017. {
  1018. unsigned int a,b;
  1019. for(a=x;a>0;a--)
  1020.       for(b=110;b>0;b--);
  1021.   }




  1022.                         void delay(uint16 us)//延时函数
  1023.                         {
  1024.                             while(us--);
  1025.                         }

  1026.         void get_tem()
  1027.                 {
  1028.                                         uchar i,m;
  1029.                         uchar tem1,tem2,num;
  1030.                         GIE=0;
  1031.                         reset18();
  1032.                         write_byte(0xCC);
  1033.                         write_byte(0x44);
  1034.                    // delayus(2,2);//600us(60,15)
  1035.                          GIE=1;
  1036.       
  1037.                         GIE=0;
  1038.                         reset18();
  1039.                         write_byte(0xCC);
  1040.                
  1041.                               
  1042.                                         write_byte(0xBE);
  1043.                                         tem1=read_byte();
  1044.                                         tem2=read_byte();
  1045.                                         GIE=1;      
  1046.                                          temper = ((tem2<<4)&0xF0)|((tem1>>4)&0x0F);
  1047.                   if(temper>127)
  1048.                                                   {
  1049.                                                         //temper = ~temper + 1;
  1050.                                                         flag_fu=1;
  1051.                                                 }
  1052.                         else
  1053.                                         {
  1054.                                                         flag_fu=0;
  1055.                                         }
  1056.                   
  1057.                
  1058.       
  1059.                   temper=(tem2*256+tem1)*6.25;
  1060.                    if(flag_fu==1)
  1061.                                 {        temper = ~temper + 1;}
  1062.                         if(temper>10000)
  1063.         {
  1064.         d1=temper/10000;
  1065.         d2=temper%10000/1000;
  1066.         d3=temper%1000/100;
  1067.         d4=temper%100/10;
  1068.                 m=1;
  1069.         }
  1070.         else
  1071.         {
  1072.         d1=temper/1000;
  1073.         d2=temper%1000/100;
  1074.         d3=temper%100/10;
  1075.         d4=temper%10;
  1076.                         m=0;
  1077.         }
  1078.       
  1079.                 if        (flag_fu==1)

  1080.                 {
  1081.                                 DisplayString1608(1,60,"-");
  1082.                                                 delay(10);
  1083.                                         //DisplayNumber1608(1, 33, 0);
  1084.                                          DisplayNumber1608(1, 68, d1);
  1085.                                         //delay(100);
  1086.                                         delay(10);
  1087.                                         DisplayNumber1608(1, 76,d2 );
  1088.                                         //delay(100);
  1089.                                         delay(10);
  1090.                                          
  1091.                                         DisplayString1608(1,84,".");
  1092.                                         delay(10);
  1093.                                         DisplayNumber1608(1,88,d3 );
  1094.                                         //delay(100);
  1095.                                         delay(10);
  1096.                                         DisplayNumber1608(1, 96,d4 );
  1097.                                         //delay(100);

  1098.                 }      

  1099.                         else{

  1100.                                         if(m==1)
  1101.                                                 {
  1102.                               
  1103.                                                  DisplayNumber1608(1, 60, 1);
  1104.                                                         delay(10);
  1105.                                                  DisplayNumber1608(1, 68, d1);
  1106.                                                 //delay(100);
  1107.                                                 delay(10);
  1108.                                                 DisplayNumber1608(1, 76,d2 );
  1109.                                                 //delay(100);
  1110.                               
  1111.                                                 delay(10);
  1112.                                                 
  1113.                                                 DisplayString1608(1,84,".");
  1114.                                                         delay(10);
  1115.                                                 DisplayNumber1608(1,88,d3 );
  1116.                                                 //delay(100);
  1117.                                                 delay(10);
  1118.                                                 DisplayNumber1608(1, 96,d4 );
  1119.                                                 //delay(100);
  1120.                                                 }
  1121.                        
  1122.                                         else
  1123.                                         {
  1124.                                                 DisplayString1608(1,60," ");
  1125.                                                 delay(10);
  1126.                                         //DisplayNumber1608(1, 33, 0);
  1127.                                          DisplayNumber1608(1, 68, d1);
  1128.                                         //delay(100);
  1129.                                         delay(10);
  1130.                                         DisplayNumber1608(1, 76,d2 );
  1131.                                         //delay(100);
  1132.                                         delay(10);
  1133.                                          
  1134.                                         DisplayString1608(1,84,".");
  1135.                                         delay(10);
  1136.                                         DisplayNumber1608(1,88,d3 );
  1137.                                         //delay(100);
  1138.                                         delay(10);
  1139.                                         DisplayNumber1608(1, 96,d4 );
  1140.                                         //delay(100);
  1141.                                         }               
  1142.                 }

  1143. }

  1144. void main()
  1145. {

  1146.         uint k=0;
  1147. uchar a1,a2,a3,a4;
  1148. uchar bz1,bz2,bz3;//bz1:正负标志bz2: 正常标志bz3:超100标志
  1149. bz1=0;
  1150. bz2=0;
  1151. bz3=0;
  1152. uchar aw1,aw2,aw3;
  1153.     //unsigned char RX_Buf[20] = {0};

  1154.         //OPTION=0X00;    //设置A口为普通I/O口
  1155.         TRISD = 0;  //portd 输出
  1156.         TRISB = 0X01;                                          //设置B口低4位为输入//高四位为输出
  1157.         ADCON1=0X06;
  1158.           delay(100);
  1159.                 T0CS=0;
  1160.                 TRISA=0x00;
  1161.         PORTD = 0x00;
  1162.      //delay(1);
  1163.      TRISE0=0;
  1164.                 RE0=1;
  1165.                 BG=1;
  1166.     InitLCD();
  1167.         delay(1000);
  1168.     clear_screen();
  1169.     reset18();
  1170.      delay(1000);
  1171.      SpiInit();
  1172.         delay(1000);
  1173.       RX_MODE();
  1174.           delay(3500);
  1175.            nRF24l01_RxPacket(Rx_Buf);
  1176.   delay(2500);
  1177.      RX_MODE();
  1178.           delay(3500);
  1179.         display_graphic_16x16(1,1,shi); /*在第 1 页,第 1 列显示单个汉字""*/
  1180.         display_graphic_16x16(1,16,nei); /*在第 1 页,第 1 列显示单个汉字""*/

  1181.     display_graphic_16x16(1,32,wen1); /*在第 1 页,第 1 列显示单个汉字""*/
  1182.     display_graphic_16x16(1,(48),du1); /*在第 1 页,第 17 列显示单个汉字""*/
  1183. display_graphic_16x16(1,(114),du2); /*在第 5 页,第 89 列显示单个数字"9"*/
  1184.         display_graphic_16x16(3,1,shi); /*在第 1 页,第 1 列显示单个汉字""*/
  1185.         display_graphic_16x16(3,16,wai); /*在第 1 页,第 1 列显示单个汉字""*/

  1186.     display_graphic_16x16(3,32,wen1); /*在第 1 页,第 1 列显示单个汉字""*/
  1187.     display_graphic_16x16(3,(48),du1); /*在第 1 页,第 17 列显示单个汉字""*/
  1188. display_graphic_16x16(3,(114),du2); /*在第 5 页,第 89 列显示单个数字"9"*/

  1189. delay(500);


  1190.      while(1)
  1191.      {
  1192.                

  1193.       
  1194.            get_tem();

  1195.         k++;  
  1196.       
  1197.         switch(k)
  1198.                 {
  1199.                 case 30: if(nRF24l01_RxPacket(Rx_Buf))
  1200.                                 {               
  1201.                                                         RD4=1;
  1202.                                 }
  1203.                        
  1204.                                         break;
  1205.                         
  1206.                
  1207.                
  1208.                 case 38:k=0;//        CSN=0;SPI_RW(FLUSH_RX);        CSN=1;
  1209.                                                 RD4=0;break;//SPI_RW_Reg(FLUSH_RX,0X00);

  1210.                 }

  1211.                 delayms(10);

  1212.       

  1213.                                        
  1214.                                         a1=Rx_Buf[1];       //小数位
  1215.                                          a2=Rx_Buf[2];  //整数位
  1216.                                       a3=Rx_Buf[3];       //十位
  1217.                                        a4=Rx_Buf[4];       //个      
  1218.                                                 bz1=Rx_Buf[5];
  1219.                                                         bz2=Rx_Buf[6];
  1220.                                                                 bz3=Rx_Buf[7];
  1221.         delayms(10);

  1222.                
  1223.                               
  1224.                                                 f1=table[a1];
  1225.                                                 f2=table[a2];
  1226.                                                 f3=table[a3];
  1227.                                                 f4=table[a4];
  1228.                                                 aw1=table[bz1];
  1229.                                                 aw2=table[bz2];
  1230.                                                 aw3=table[bz3];
  1231.                         if(aw2==0)
  1232.                         {
  1233.                                         if(aw3==1)
  1234.                                                 {
  1235.                                                            DisplayString1608(3,60,1);
  1236.                                                                 delay(100);
  1237.                                                         //DisplayNumber1608(1, 33, 0);
  1238.                                                          DisplayNumber1608(3, 68, f1);
  1239.                                                         //delay(100);
  1240.                                                         delay(100);
  1241.                                                         DisplayNumber1608(3, 76,f2 );
  1242.                                                         //delay(100);
  1243.                                                         delay(100);
  1244.                                                          //display_graphic_8x16(3,(17),dian);
  1245.                                                         DisplayString1608(3,84,".");
  1246.                                                         delay(100);
  1247.                                                         DisplayNumber1608(3,88,f3 );
  1248.                                                         //delay(100);
  1249.                                                         delay(100);
  1250.                                                         DisplayNumber1608(3, 96,f4);
  1251.                                                         delay(100);
  1252.                                                 }

  1253.                                                                                 if(aw1==1)
  1254.                                                         {
  1255.                                                                    DisplayString1608(3,60,"-");
  1256.                                                                         delay(100);
  1257.                                                                 //DisplayNumber1608(1, 33, 0);
  1258.                                                                  DisplayNumber1608(3, 68, f1);
  1259.                                                                 //delay(100);
  1260.                                                                 delay(100);
  1261.                                                                 DisplayNumber1608(3, 76,f2 );
  1262.                                                                 //delay(100);
  1263.                                                                 delay(100);
  1264.                                                                  //display_graphic_8x16(3,(17),dian);
  1265.                                                                 DisplayString1608(3,84,".");
  1266.                                                                 delay(100);
  1267.                                                                 DisplayNumber1608(3,88,f3 );
  1268.                                                                 //delay(100);
  1269.                                                                 delay(100);
  1270.                                                                 DisplayNumber1608(3, 96,f4);
  1271.                                                                 delay(100);
  1272.                                                         }
  1273.                                        
  1274.                                                 else{
  1275.                                                                 DisplayString1608(3,68,"?");
  1276.                                                                 DisplayString1608(3,76,"?");                                               
  1277.                                                                 DisplayString1608(3,84,"?");
  1278.                                                                 DisplayString1608(3,92,"?");
  1279.                                                 }      
  1280.                                        
  1281.                                 }
  1282.                         delayms(10);
  1283.                                         if(aw2==1)
  1284.                                         {                       
  1285.                        
  1286.                                                            DisplayString1608(3,60," ");
  1287.                                                                         delay(100);
  1288.                                                                 //DisplayNumber1608(1, 33, 0);
  1289.                                                                  DisplayNumber1608(3, 68, f1);
  1290.                                                                 //delay(100);
  1291.                                                                 delay(100);
  1292.                                                                 DisplayNumber1608(3, 76,f2 );
  1293.                                                                 //delay(100);
  1294.                                                                 delay(100);
  1295.                                                                  //display_graphic_8x16(3,(17),dian); /*在第 5 页,第 89 列显示单个数字"9"*/
  1296.                                                                 DisplayString1608(3,84,".");
  1297.                                                                 delay(100);
  1298.                                                                 DisplayNumber1608(3,88,f3 );
  1299.                                                                 //delay(100);
  1300.                                                                 delay(100);
  1301.                                                                 DisplayNumber1608(3, 96,f4);
  1302.                                                                 delay(100);
  1303.                                                
  1304.                                         }
  1305.                         if(key==0)
  1306.                         {
  1307.                                         delayms(20);
  1308.                                         if(key==0)
  1309.                                                 {
  1310.                                                 BG=~BG;
  1311.                                                 }
  1312.                
  1313.                
  1314.                                 }
  1315. }

  1316. }

  1317. /*********************************************************/
复制代码

12864驱动以前发过可以找找。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 2家元 +70 收起 理由
xiaoyao_mdj + 10 優秀文章
家睦 + 60

查看全部打赏

发表于 2021-2-5 13:26:59 | 显示全部楼层
几年前弄了几块这个,调通了就没玩了,不知道弄什么好
回复 支持 反对

使用道具 举报

发表于 2021-2-16 22:55:03 | 显示全部楼层
xiaoyao_mdj 发表于 2021-2-5 13:26
几年前弄了几块这个,调通了就没玩了,不知道弄什么好

做了一个无钥匙进入系统,用了好几年了,家里的门,电动车,单元门,都是靠这个开。随身都不带钥匙了,就带一个这个电子标签。
https://github.com/fryefryefrye/Open-Source-RKS





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 1 反对 0

使用道具 举报

发表于 2021-2-16 23:00:36 | 显示全部楼层
用Arduino驱动比这个方便一点,有现成的库可以调用。
回复 支持 反对

使用道具 举报

发表于 2021-2-16 23:04:38 | 显示全部楼层
这个模块还有一个优点,设置适当的频道,他还可以接受和发射蓝牙的广播信号,可以模拟一个蓝牙设备的广播,也能接受其他蓝牙设备的广播。

甚至可以做一个利用手机作为一个电子标签,做无钥匙开门系统。

https://github.com/fryefryefrye/ ... -Bluetooth-Address/
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-21 18:04 , Processed in 0.218400 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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