找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机nRF24L01无线传输光照+PM2.5 PCB文件+电路图 LCD12864显示

[复制链接]
跳转到指定楼层
楼主
制作出来的实物图如下:


Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "12864.h"
  4. #include "ds1302.h"


  5. uint stwdh=35;                   //温度上限
  6. uint stwdl=6;                   //温度下限

  7. uint stsdh=85;                   //湿度上限
  8. uint stsdl=20;                   //湿度下限
  9. sbit  fmq  =P1^7;      //蜂鸣器

  10. #define TX_ADR_WIDTH    5           // 5 uints TX address width
  11. #define RX_ADR_WIDTH    5           // 5 uints RX address width
  12. #define TX_PLOAD_WIDTH  32         // 20 uints TX payload
  13. #define RX_PLOAD_WIDTH  32          // 20 uints TX payload
  14. uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
  15. uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
  16. //***************************************NRF24L01寄存器指令*******************************************************
  17. #define READ_REG        0x00          // 读寄存器指令
  18. #define WRITE_REG       0x20         // 写寄存器指令
  19. #define RD_RX_PLOAD     0x61          // 读取接收数据指令
  20. #define WR_TX_PLOAD     0xA0          // 写待发数据指令
  21. #define FLUSH_TX        0xE1         // 冲洗发送 FIFO指令
  22. #define FLUSH_RX        0xE2          // 冲洗接收 FIFO指令
  23. #define REUSE_TX_PL     0xE3          // 定义重复装载数据指令
  24. #define NOP             0xFF          // 保留
  25. //*************************************SPI(nRF24L01)寄存器地址****************************************************
  26. #define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
  27. #define EN_AA           0x01  // 自动应答功能设置
  28. #define EN_RXADDR       0x02  // 可用信道设置
  29. #define SETUP_AW        0x03  // 收发地址宽度设置
  30. #define SETUP_RETR      0x04  // 自动重发功能设置
  31. #define RF_CH           0x05  // 工作频率设置
  32. #define RF_SETUP        0x06  // 发射速率、功耗功能设置
  33. #define STATUS          0x07  // 状态寄存器
  34. #define OBSERVE_TX      0x08  // 发送监测功能
  35. #define CD              0x09  // 地址检测           
  36. #define RX_ADDR_P0      0x0A  // 频道0接收数据地址
  37. #define RX_ADDR_P1      0x0B  // 频道1接收数据地址
  38. #define RX_ADDR_P2      0x0C  // 频道2接收数据地址
  39. #define RX_ADDR_P3      0x0D  // 频道3接收数据地址
  40. #define RX_ADDR_P4      0x0E  // 频道4接收数据地址
  41. #define RX_ADDR_P5      0x0F  // 频道5接收数据地址
  42. #define TX_ADDR         0x10  // 发送地址寄存器
  43. #define RX_PW_P0        0x11  // 接收频道0接收数据长度
  44. #define RX_PW_P1        0x12  // 接收频道0接收数据长度
  45. #define RX_PW_P2        0x13  // 接收频道0接收数据长度
  46. #define RX_PW_P3        0x14  // 接收频道0接收数据长度
  47. #define RX_PW_P4        0x15  // 接收频道0接收数据长度
  48. #define RX_PW_P5        0x16  // 接收频道0接收数据长度
  49. #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
  50. //**************************************************************************************


  51. uint wendu=0;
  52. uint shidu=0;
  53. unsigned int idata pm25=0;
  54. unsigned char  idata RxBuf[32];
  55. unsigned int flag=0;
  56. uchar  hor,min,sec,SetA=0,SetB=0;
  57. unsigned char year=17,month=2,date=11;
  58. unsigned int Alpm25=200;
  59. uchar  initial_time[]={0x00,0x00,0x00};
  60. unsigned int guangzhao=0;

  61. //****************************************IO端口定义***************************************
  62. sbit         MISO        =P0^2;
  63. sbit         MOSI        =P0^4;
  64. sbit        SCK        =P0^1;
  65. sbit        CE           =P0^0;
  66. sbit        CSN        =P0^3;
  67. sbit        IRQ        =P0^5;


  68. sbit    k1         =P2^0;  //设置时间
  69. sbit    k2         =P2^1;  //设置参数上下限
  70. sbit    k3         =P2^2;  // +
  71. sbit    k4         =P2^3;  // -
  72. sbit    k5         =P2^4;  // 确认

  73. void Delay(unsigned int s);
  74. void inerDelay_us(unsigned char n);
  75. void init_NRF24L01(void);
  76. uint SPI_RW(uint uchar);
  77. uchar SPI_Read(uchar reg);
  78. void SetRX_Mode(void);
  79. uint SPI_RW_Reg(uchar reg, uchar value);
  80. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
  81. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
  82. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
  83. void nRF24L01_TxPacket(unsigned char * tx_buf);

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


  247. /********************************************************************
  248. du1302
  249. ***********************************************************************/



  250. void du_ds1302()
  251. {
  252.     uchar k;
  253.         
  254. //   uchar taddr = 0x81;
  255.   // for (k=0; k<3; k++)
  256. //   {
  257.   //      now_time[k] = read_data_ds1302(taddr);/*格式为: 秒 分 时 日 月 星期 年 */
  258.   //      taddr+= 2;
  259. //   }

  260.    k= read_data_ds1302(0x81);
  261.    k=bcd16(k);
  262.    if(k<60) sec=k;
  263.    if(k>=60)
  264.         {
  265.                 k= read_data_ds1302(0x81);
  266.                 k=bcd16(k);
  267.                 if(k<60) sec=k;
  268.                 if(k>=60)
  269.                 {
  270.                         k= read_data_ds1302(0x81);
  271.                         k=bcd16(k);
  272.                         if(k<60) sec=k;
  273.                         if(k>=60)
  274.                         {
  275.                                 write_data_ds1302(0x80,hexbcd(0)); //向DS1302内写秒寄存器80H写入初始秒数据00
  276.                                 write_data_ds1302(0x82,hexbcd(0));//向DS1302内写分寄存器82H写入初始分数据00
  277.                                 write_data_ds1302(0x84,hexbcd(8));//向DS1302内写小时寄存器84H写入初始小时数据12
  278.                                 write_data_ds1302(0x86,hexbcd(11));//向DS1302内写日期寄存器86H写入初始日期数据07
  279.                                 write_data_ds1302(0x88,hexbcd(2));//向DS1302内写月份寄存器88H写入初始月份数据01
  280.                                 write_data_ds1302(0x8c,hexbcd(17));//向DS1302内写年份寄存器8cH写入初始年份数据10
  281.                                 write_data_ds1302(0x8e,0x80);        
  282.                                 date=11;month=2;year=17;
  283.                         }
  284.                 }
  285.         }
  286.         
  287.    k= read_data_ds1302(0x83);
  288.    k=bcd16(k);
  289.    //if(k<60)
  290.                 min=k;
  291.         
  292.    k=read_data_ds1302(0x85);
  293.    k=bcd16(k);
  294.    //if(k<24)
  295.                 hor=k;
  296.         
  297.         k=read_data_ds1302(0x87);
  298.    k=bcd16(k);
  299.    //if(k<24)
  300.                 date=k;
  301.         k=read_data_ds1302(0x89);
  302.    k=bcd16(k);
  303.    //if(k<24)
  304.                 month=k;
  305.         k=read_data_ds1302(0x8d);
  306.    k=bcd16(k);
  307.    //if(k<24)
  308.                 year=k;
  309. }

  310. void xianshishijian(void)
  311. {
  312.         LCD_Setaddress(1,1);

  313.         print("时间");
  314.         LCD_write_dat(':');
  315.         LCD_write_dat(hor/10+0x30);  
  316.         LCD_write_dat(hor%10+0x30);
  317.         LCD_write_dat(':');
  318.         LCD_write_dat(min/10+0x30);  
  319.         LCD_write_dat(min%10+0x30);
  320.         LCD_write_dat(':');
  321.         LCD_write_dat(sec/10+0x30);  
  322.         LCD_write_dat(sec%10+0x30);
  323.         LCD_write_dat(' ');
  324.         LCD_write_dat(' ');
  325.         LCD_write_dat(' ');
  326. }


  327. void xianshiwsd(void)//显示温湿度

  328. {

  329.           LCD_Setaddress(2,1);
  330.          //if(wendu>=99)wendu=99;
  331.     print("温度");
  332.     LCD_write_dat(':');
  333.     LCD_write_dat(wendu/10+0x30);  
  334.     LCD_write_dat(wendu%10+0x30);
  335.          LCD_write_dat(' ');
  336.          print("湿度");
  337.     LCD_write_dat(':');
  338.     LCD_write_dat(shidu/10+0x30);  
  339.     LCD_write_dat(shidu%10+0x30);
  340.    LCD_write_dat(' ');
  341. }


  342. void xianshiguangzhao(void)
  343. {
  344.         LCD_Setaddress(4,1);
  345.         print("光照");
  346.    LCD_write_dat(':');
  347.    LCD_write_dat(guangzhao/10000+0x30);
  348.    LCD_write_dat(guangzhao%10000/1000+0x30);  
  349.    LCD_write_dat(guangzhao%1000/100+0x30);
  350.         LCD_write_dat(guangzhao%100/10+0x30);
  351.    LCD_write_dat(guangzhao%10+0x30);
  352.         LCD_write_dat(' ');
  353.         LCD_write_dat('L');
  354.    LCD_write_dat('x');
  355.         LCD_write_dat(' ');
  356.         LCD_write_dat(' ');
  357.         LCD_write_dat(' ');
  358. }


  359. void xianshipm(void)
  360. {
  361.         LCD_Setaddress(3,1);

  362.    print("PM2.5");
  363.    LCD_write_dat(':');
  364.         LCD_write_dat(pm25/100+0x30);
  365.    LCD_write_dat(pm25%100/10+0x30);  
  366.    LCD_write_dat(pm25%10+0x30);
  367.         LCD_write_dat('u');
  368.         LCD_write_dat('g');
  369.         LCD_write_dat('/');
  370.    LCD_write_dat('m');
  371.    LCD_write_dat('3');
  372.         LCD_write_dat(' ');
  373.         LCD_write_dat(' ');
  374. }

  375. void ShowSetTime(void)
  376. {
  377.         LCD_clr();
  378.         LCD_Setaddress(1,2);
  379.         print("设置日期时间");
  380.         LCD_Setaddress(3,1);
  381.         print("日期");
  382.         LCD_write_dat(':');
  383.         LCD_write_dat(' ');
  384.         LCD_write_dat(year/10+0x30);  
  385.         LCD_write_dat(year%10+0x30);
  386.         LCD_write_dat('-');
  387.         LCD_write_dat(month/10+0x30);  
  388.         LCD_write_dat(month%10+0x30);
  389.         LCD_write_dat('-');
  390.         LCD_write_dat(date/10+0x30);  
  391.         LCD_write_dat(date%10+0x30);
  392.         LCD_write_dat(' ');
  393.         LCD_write_dat(' ');
  394.         
  395.         LCD_Setaddress(4,1);
  396.         print("时间");
  397.         LCD_write_dat(':');
  398.         LCD_write_dat(' ');
  399.         LCD_write_dat(hor/10+0x30);  
  400.         LCD_write_dat(hor%10+0x30);
  401.         LCD_write_dat(':');
  402.         LCD_write_dat(min/10+0x30);  
  403.         LCD_write_dat(min%10+0x30);
  404.         LCD_write_dat(':');
  405.         LCD_write_dat(sec/10+0x30);  
  406.         LCD_write_dat(sec%10+0x30);
  407.         LCD_write_dat(' ');
  408.         LCD_write_dat(' ');
  409. }

  410. void ShowSetAlarmDat(void)
  411. {
  412.         LCD_clr();
  413.         LCD_Setaddress(1,2);
  414.         print("设置上下限值");
  415.         LCD_Setaddress(2,1);
  416.         print("PM2.5");
  417.         LCD_write_dat(':');
  418.         LCD_write_dat(Alpm25/100+0x30);
  419.    LCD_write_dat(Alpm25%100/10+0x30);  
  420.    LCD_write_dat(Alpm25%10+0x30);
  421.         LCD_write_dat('u');
  422.         LCD_write_dat('g');
  423.         LCD_write_dat('/');
  424.    LCD_write_dat('m');
  425.    LCD_write_dat('3');
  426.         
  427.         LCD_Setaddress(3,1);
  428.         print("温度");
  429.    LCD_write_dat(':');
  430.         LCD_write_dat(' ');
  431.         LCD_write_dat('H');
  432.         LCD_write_dat('=');
  433.    LCD_write_dat(stwdh/10+0x30);  
  434.    LCD_write_dat(stwdh%10+0x30);
  435.         LCD_write_dat(' ');
  436.         LCD_write_dat('L');
  437.         LCD_write_dat('=');
  438.    LCD_write_dat(stwdl/10+0x30);  
  439.    LCD_write_dat(stwdl%10+0x30);
  440.         LCD_write_dat(' ');
  441.         
  442.         LCD_Setaddress(4,1);
  443.         print("湿度");
  444.    LCD_write_dat(':');
  445.         LCD_write_dat(' ');
  446.         LCD_write_dat('H');
  447.         LCD_write_dat('=');
  448.    LCD_write_dat(stsdh/10+0x30);  
  449.    LCD_write_dat(stsdh%10+0x30);
  450.         LCD_write_dat(' ');
  451.         LCD_write_dat('L');
  452.         LCD_write_dat('=');
  453.    LCD_write_dat(stsdl/10+0x30);  
  454.    LCD_write_dat(stsdl%10+0x30);
  455.         LCD_write_dat(' ');
  456. }


  457. void SetFun(void)
  458. {
  459.         unsigned int i=2000;
  460.         if((k1==0)||(k2==0))
  461.         {
  462.                 Delay(5000)        ;
  463.                 if((k1==0)&&(k2==0))
  464.                 {
  465.                         write_data_ds1302(0x8e,0x00);
  466.                         write_data_ds1302(0x80,hexbcd(0)); //向DS1302内写秒寄存器80H写入初始秒数据00
  467.                         write_data_ds1302(0x82,hexbcd(0));//向DS1302内写分寄存器82H写入初始分数据00
  468.                         write_data_ds1302(0x84,hexbcd(8));//向DS1302内写小时寄存器84H写入初始小时数据12
  469.                         write_data_ds1302(0x86,hexbcd(11));//向DS1302内写日期寄存器86H写入初始日期数据07
  470.                         write_data_ds1302(0x88,hexbcd(2));//向DS1302内写月份寄存器88H写入初始月份数据01
  471.                         write_data_ds1302(0x8c,hexbcd(17));//向DS1302内写年份寄存器8cH写入初始年份数据10
  472.                         write_data_ds1302(0x8e,0x80);        
  473.                         date=11;month=2;year=17;
  474.                         SetB=0;SetA=0;
  475.                         fmq=0;delay_ms(50);fmq=1;delay_ms(300);
  476.                         fmq=0;delay_ms(50);fmq=1;
  477.                 }
  478.                 while((k1==0)&&(k2==0));
  479.                
  480.         }
  481.         if(k1==0)
  482.         {
  483.                 Delay(5000)        ;
  484.                
  485.                 if(k1==0)
  486.                 {
  487.                         SetB=0;
  488.                         if(SetA<6) SetA++;
  489.                         else SetA=0;
  490.                         switch(SetA)
  491.                         {
  492.                                 case 0:        LCD_clr();break;
  493.                                 case 1:        
  494.                                 case 2:        
  495.                                 case 3:        
  496.                                 case 4:        
  497.                                 case 5:        
  498.                                 case 6:        ShowSetTime();break;                                
  499.                         }
  500.                 }
  501.                 while(k1==0);
  502.         }
  503.         
  504.         if(k2==0)
  505.         {
  506.                 Delay(5000)        ;
  507.                
  508.                 if(k2==0)
  509.                 {
  510.                         SetA=0;
  511.                         if(SetB<5) SetB++;
  512.                         else SetB=0;
  513.                         switch(SetB)
  514.                         {
  515.                                 case 0:        LCD_draw_clr();break;
  516.                                 case 1:        
  517.                                 case 2:        
  518.                                 case 3:        
  519.                                 case 4:        
  520.                                 case 5:        ShowSetAlarmDat();break;                                
  521.                         }
  522.                 }
  523.                 while(k2==0);
  524.         }
  525.         
  526.         if(SetA!=0)
  527.         {
  528.                 if(k3==0)
  529.                 {
  530.                         Delay(5000)        ;
  531.                         if(k3==0)
  532.                         {
  533.                                 switch(SetA)
  534.                                 {
  535.                                         case 1:        sec++;if(sec>59) sec=0;break;
  536.                                         case 2:  min++;if(min>59) min=0;break;
  537.                                         case 3:  hor++;if(hor>23) hor=0;break;
  538.                                         case 4:  
  539.                                         {
  540.                                                 if((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
  541.                                                 {
  542.                                                         date++;
  543.                                                         if(date>31) date=1;
  544.                                                 }
  545.                                                 else if((month==4)||(month==6)||(month==9)||(month==11))
  546.                                                 {
  547.                                                         date++;
  548.                                                         if(date>30) date=1;
  549.                                                 }
  550.                                                 else if(month==2)
  551.                                                 {
  552.                                                         i=2000+year;
  553.                                                         if((i%100)==0)
  554.                                                         {
  555.                                                                 if(i%400==0)        {date++; if(date>29) date=1;}
  556.                                                                 else {date++; if(date>28) date=1;}
  557.                                                         }
  558.                                                         else
  559.                                                         {
  560.                                                                 if((i%4)==0)        {date++; if(date>29) date=1;}
  561.                                                                 else {date++; if(date>28) date=1;}
  562.                                                         }
  563.                                                 }
  564.                                                 else {date++; if(date>31) date=1;}
  565.                                         }break;
  566.                                         case 5:  
  567.                                         {
  568.                                                 month++;if(month>12) month=1;
  569.                                                 if(date>28)
  570.                                                 {
  571.                                                         if(month==2)
  572.                                                         {
  573.                                                                 i=2000+year;
  574.                                                                 if((i%100)==0)
  575.                                                                 {
  576.                                                                         if((i%400)==0)        date=29;
  577.                                                                         else date=28;
  578.                                                                 }
  579.                                                                 else
  580.                                                                 {
  581.                                                                         if((i%4)==0)         date=29;
  582.                                                                         else date=28;
  583.                                                                 }
  584.                                                         }
  585.                                                         if((month==4)||(month==6)||(month==9)||(month==11))
  586.                                                         {
  587.                                                                 if(date>30) date=1;
  588.                                                         }
  589.                                                 }
  590.                                         }break;
  591.                                         case 6:  
  592.                                         {
  593.                                                 year++;if(year>99) year=1;
  594.                                                 if(date>28)
  595.                                                 {
  596.                                                         if(month==2)
  597.                                                         {
  598.                                                                 i=2000+year;
  599.                                                                 if((i%100)==0)
  600.                                                                 {
  601.                                                                         if((i%400)==0)        date=29;
  602.                                                                         else date=28;
  603.                                                                 }
  604.                                                                 else
  605.                                                                 {
  606.                                                                         if((i%4)==0)         date=29;
  607.                                                                         else date=28;
  608.                                                                 }
  609.                                                         }
  610.                                                         if((month==4)||(month==6)||(month==9)||(month==11))
  611.                                                         {
  612.                                                                 if(date>30) date=1;
  613.                                                         }
  614.                                                 }
  615.                                         }break;
  616.                                 }
  617.                         }
  618.                 }
  619.                 if(k4==0)
  620.                 {
  621.                         Delay(5000)        ;
  622.                         if(k4==0)
  623.                         {
  624.                                 switch(SetA)
  625.                                 {
  626.                                         case 1:        if(sec>0) sec--; break;
  627.                                         case 2:  if(min>0) min--; break;
  628.                                         case 3:  if(hor>0) hor--; break;
  629.                                         case 4:  if(date>1) date--; break;
  630.                                         case 5:  
  631.                                         {
  632.                                                 if(month>1) month--;
  633.                                                 if(date>28)
  634.                                                 {
  635.                                                         if(month==2)
  636.                                                         {
  637.                                                                 i=2000+year;
  638.                                                                 if((i%100)==0)
  639.                                                                 {
  640.                                                                         if((i%400)==0)        date=29;
  641.                                                                         else date=28;
  642.                                                                 }
  643.                                                                 else
  644.                                                                 {
  645.                                                                         if((i%4)==0)         date=29;
  646.                                                                         else date=28;
  647.                                                                 }
  648.                                                         }
  649.                                                         if((month==4)||(month==6)||(month==9)||(month==11))
  650.                                                         {
  651.                                                                 if(date>30) date=1;
  652.                                                         }
  653.                                                 }
  654.                                         }break;
  655.                                         case 6:  
  656.                                         {
  657.                                                 if(year>1) year--;
  658.                                                 if(date>28)
  659.                                                 {
  660.                                                         if(month==2)
  661.                                                         {
  662.                                                                 i=2000+year;
  663.                                                                 if((i%100)==0)
  664.                                                                 {
  665.                                                                         if((i%400)==0)        date=29;
  666.                                                                         else date=28;
  667.                                                                 }
  668.                                                                 else
  669.                                                                 {
  670.                                                                         if((i%4)==0)         date=29;
  671.                                                                         else date=28;
  672.                                                                 }
  673.                                                         }
  674.                                                         if((month==4)||(month==6)||(month==9)||(month==11))
  675.                                                         {
  676.                                                                 if(date>30) date=1;
  677.                                                         }
  678.                                                 }
  679.                                         }break;
  680.                                 }
  681.                         }
  682.                 }
  683.                 switch(SetA)
  684.                 {
  685.                         case 1:
  686.                         {
  687.                                 write_data_ds1302(0x8e,0x00);
  688.                                 write_data_ds1302(0x80, hexbcd(sec));
  689.                                 write_data_ds1302(0x8e,0x80);        
  690.                                 LCD_Setaddress(4,7);
  691.                                 LCD_write_dat(' ');  
  692.                                 LCD_write_dat(' ');
  693.                                 delay_ms(20);
  694.                                 LCD_Setaddress(4,7);
  695.                                 LCD_write_dat(sec/10+0x30);  
  696.                                 LCD_write_dat(sec%10+0x30);
  697.                                 LCD_write_dat(' ');
  698.                                 LCD_write_dat(' ');                                                
  699.                         }break;
  700.                         case 2:
  701.                         {
  702.                                 write_data_ds1302(0x8e,0x00);
  703.                                 write_data_ds1302(0x82, hexbcd(min));
  704.                                 write_data_ds1302(0x8e,0x80);        
  705.                                 LCD_Setaddress(4,5);
  706.                                 LCD_write_dat(':');
  707.                                 LCD_write_dat(' ');  
  708.                                 LCD_write_dat(' ');
  709.                                 delay_ms(10);
  710.                                 LCD_Setaddress(4,5);
  711.                                 LCD_write_dat(':');
  712.                                 LCD_write_dat(min/10+0x30);  
  713.                                 LCD_write_dat(min%10+0x30);
  714.                                        
  715.                         }break;
  716.                         case 3:
  717.                         {
  718.                                 write_data_ds1302(0x8e,0x00);
  719.                                 write_data_ds1302(0x84, hexbcd(hor));
  720.                                 write_data_ds1302(0x8e,0x80);        
  721.                                 LCD_Setaddress(4,4);
  722.                                 LCD_write_dat(' ');  
  723.                                 LCD_write_dat(' ');
  724.                                 delay_ms(20);
  725.                                 LCD_Setaddress(4,4);
  726.                                 LCD_write_dat(hor/10+0x30);  
  727.                                 LCD_write_dat(hor%10+0x30);
  728.                                        
  729.                         }break;
  730.                         case 4:
  731.                         {
  732.                                 write_data_ds1302(0x8e,0x00);
  733.                                 write_data_ds1302(0x86, hexbcd(date));
  734.                                 write_data_ds1302(0x8e,0x80);        
  735.                                 LCD_Setaddress(3,7);
  736.                                 LCD_write_dat(' ');  
  737.                                 LCD_write_dat(' ');
  738.                                 delay_ms(20);
  739.                                 LCD_Setaddress(3,7);
  740.                                 LCD_write_dat(date/10+0x30);  
  741.                                 LCD_write_dat(date%10+0x30);
  742.                                 LCD_write_dat(' ');
  743.                                 LCD_write_dat(' ');                                                
  744.                         }break;
  745.                         case 5:
  746.                         {
  747.                                 write_data_ds1302(0x8e,0x00);
  748.                                 write_data_ds1302(0x88, hexbcd(month));
  749.                                 write_data_ds1302(0x8e,0x80);        
  750.                                 LCD_Setaddress(3,5);
  751.                                 LCD_write_dat('-');
  752.                                 LCD_write_dat(' ');  
  753.                                 LCD_write_dat(' ');
  754.                                 delay_ms(10);
  755.                                 LCD_Setaddress(3,5);
  756.                                 LCD_write_dat('-');
  757.                                 LCD_write_dat(month/10+0x30);  
  758.                                 LCD_write_dat(month%10+0x30);
  759.                                 if(month==2)
  760.                                 {
  761.                                         write_data_ds1302(0x8e,0x00);
  762.                                         write_data_ds1302(0x86, hexbcd(date));
  763.                                         write_data_ds1302(0x8e,0x80);
  764.                                         LCD_Setaddress(3,7);
  765.                                         LCD_write_dat(date/10+0x30);  
  766.                                         LCD_write_dat(date%10+0x30);        
  767.                                 }
  768.                                        
  769.                         }break;
  770.                         case 6:
  771.                         {
  772.                                 write_data_ds1302(0x8e,0x00);
  773.                                 write_data_ds1302(0x8c, hexbcd(year));
  774.                                 write_data_ds1302(0x8e,0x80);        
  775.                                 LCD_Setaddress(3,4);
  776.                                 LCD_write_dat(' ');  
  777.                                 LCD_write_dat(' ');
  778.                                 delay_ms(20);
  779.                                 LCD_Setaddress(3,4);
  780.                                 LCD_write_dat(year/10+0x30);  
  781.                                 LCD_write_dat(year%10+0x30);
  782.                                 if(month==2)
  783.                                 {
  784.                                         write_data_ds1302(0x8e,0x00);
  785.                                         write_data_ds1302(0x86, hexbcd(date));
  786.                                         write_data_ds1302(0x8e,0x80);
  787.                                         LCD_Setaddress(3,7);
  788.                                         LCD_write_dat(date/10+0x30);  
  789.                                         LCD_write_dat(date%10+0x30);        
  790.                                 }
  791.                                        
  792.                         }break;
  793.                 }
  794.                
  795.         }
  796.         
  797.         /*************************************设置上下限参数*******************************/
  798.         if(SetB!=0)
  799.         {
  800.                 if(k3==0)
  801.                 {
  802.                         Delay(5000)        ;
  803.                         if(k3==0)
  804.                         {
  805.                                 switch(SetB)
  806.                                 {
  807.                                         case 1:        stsdl++;if(stsdl>90) stsdl=0;break;
  808.                                         case 2:  stsdh++;if(stsdh>90) stsdh=0;break;
  809.                                         case 3:  stwdl++;if(stwdl>60) stwdl=0;break;
  810.                                         case 4:  stwdh++;if(stwdh>60) stwdh=0;break;
  811.                                         case 5:  Alpm25++;if(Alpm25>990) Alpm25=20;break;
  812.                                 }
  813.                         }
  814.                 }
  815.                 if(k4==0)
  816.                 {
  817.                         Delay(5000)        ;
  818.                         if(k4==0)
  819.                         {
  820.                                 switch(SetB)
  821.                                 {
  822.                                         case 1:        if(stsdl>0) stsdl--; break;
  823.                                         case 2:  if(stsdh>0) stsdh--; break;
  824.                                         case 3:  if(stwdl>0) stwdl--; break;
  825.                                         case 4:  if(stwdh>0) stwdh--; break;
  826.                                         case 5:  if(Alpm25>20) Alpm25--; break;
  827.                                 }
  828.                         }
  829.                 }
  830.                 switch(SetB)
  831.                 {
  832.                         case 1:
  833.                         {
  834.                                 LCD_Setaddress(4,7);
  835.                                 LCD_write_dat('=');  
  836.                                 LCD_write_dat(' ');
  837.                                 LCD_write_dat(' ');
  838.                                 delay_ms(20);
  839.                                 LCD_Setaddress(4,7);
  840.                                 LCD_write_dat('=');
  841.                                 LCD_write_dat(stsdl/10+0x30);  
  842.                                 LCD_write_dat(stsdl%10+0x30);
  843.                                 LCD_write_dat(' ');
  844.                                 LCD_write_dat(' ');                                                
  845.                         }break;
  846.                         case 2:
  847.                         {
  848.                                 LCD_Setaddress(4,5);
  849.                                 LCD_write_dat(' ');  
  850.                                 LCD_write_dat(' ');
  851.                                 delay_ms(20);
  852.                                 LCD_Setaddress(4,5);
  853.                                 LCD_write_dat(stsdh/10+0x30);  
  854.                                 LCD_write_dat(stsdh%10+0x30);
  855.                                        
  856.                         }break;
  857.                         case 3:
  858.                         {        
  859.                                 LCD_Setaddress(3,7);
  860.                                 LCD_write_dat('=');  
  861.                                 LCD_write_dat(' ');
  862.                                 LCD_write_dat(' ');
  863.                                 delay_ms(20);
  864.                                 LCD_Setaddress(3,7);
  865.                                 LCD_write_dat('=');
  866.                                 LCD_write_dat(stwdl/10+0x30);  
  867.                                 LCD_write_dat(stwdl%10+0x30);
  868.                                 LCD_write_dat(' ');
  869.                                 LCD_write_dat(' ');                        
  870.                                        
  871.                         }break;
  872.                         case 4:
  873.                         {
  874.                                 LCD_Setaddress(3,5);
  875.                                 LCD_write_dat(' ');  
  876.                                 LCD_write_dat(' ');
  877.                                 delay_ms(20);
  878.                                 LCD_Setaddress(3,5);
  879.                                 LCD_write_dat(stwdh/10+0x30);  
  880.                                 LCD_write_dat(stwdh%10+0x30);                                
  881.                         }break;
  882.                         case 5:
  883.                         {
  884.                                 LCD_Setaddress(2,4);
  885.                                 LCD_write_dat(' ');
  886.                                 LCD_write_dat(' ');  
  887.                                 LCD_write_dat(' ');
  888.                                 delay_ms(20);
  889.                                 LCD_Setaddress(2,4);        
  890.                                 LCD_write_dat(Alpm25/100+0x30);
  891.                                 LCD_write_dat(Alpm25%100/10+0x30);  
  892.                                 LCD_write_dat(Alpm25%10+0x30);
  893.                         }break;
  894.                 }
  895.                
  896.         }
  897.         
  898.         
  899.         
  900.         if(k5==0)
  901.         {
  902.                 Delay(5000)        ;
  903.                
  904.                 if(k5==0)
  905.                 {
  906.                         SetB=0;SetA=0;
  907.                         LCD_clr();
  908.                 }        
  909.         }        
  910.         
  911.         
  912. }


  913. //************************************主函数************************************************************
  914. void main(void)
  915. {        
  916.         init_ds1302();
  917.         LCD_init();
  918.          LCD_draw_clr();
  919.         
  920.         init_NRF24L01() ;
  921.         delay_ms(1);
  922.         Delay(6000);
  923.         
  924.         k1=1;
  925.         k2=1;
  926.         k3=1;
  927.         k4=1;
  928.         while(1)
  929.         {
  930.                 if((SetA==0)&&(SetB==0))
  931.                 {
  932.                         flag++;
  933.                         du_ds1302() ;                                //读取1302时间
  934.                         xianshishijian();                         //显示时间                 
  935.                         SetRX_Mode();                                //设置2401 接收模式
  936.                         if(nRF24L01_RxPacket(RxBuf))        //读取2401 接收寄存器
  937.                         {
  938.                                 if(RxBuf[1]==0xaa)                                                                                  //数据处理
  939.                                 {
  940.                                         wendu=RxBuf[3];         
  941.                                                                                  
  942.                                         shidu=RxBuf[5];        
  943.                                         guangzhao=RxBuf[7]*10000+ RxBuf[8]*1000 +RxBuf[9]*100+RxBuf[10]*10+RxBuf[11];

  944.                                         pm25= RxBuf[12]*100+RxBuf[13];
  945.                                 }
  946.                                 xianshiwsd();
  947.                                 xianshipm();
  948.                                 xianshiguangzhao();
  949.                                 flag=0;
  950.                         }        

  951.                         /////以下为设置 上下限报警程序
  952.                         if((pm25<995)&&(pm25>0))
  953.                         {
  954.                                 if((wendu>stwdh )||(wendu<stwdl)||(shidu>stsdh)||(shidu<stsdl)||(pm25>Alpm25)        )        fmq=0;
  955.                                 else          fmq=1;
  956.                         }

  957.                         if(flag>=250)                                                 //超过250未连接 显示通讯连接
  958.                         {
  959.                                 LCD_draw_clr();
  960.                                 LCD_Setaddress(2,1);

  961.                                 print("通讯连接中。。。");
  962.                                 flag=0;
  963.                         }
  964.                 }
  965.                 SetFun();        //设置参数
  966.         }        
  967. }
复制代码


所有资料51hei提供下载:
无线数据采集系统.rar (2.95 MB, 下载次数: 111)

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

使用道具 举报

沙发
ID:282095 发表于 2019-7-25 10:44 | 只看该作者
感谢群主分享 好资源点赞
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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