久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3953|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于nrf24l01的溫度采集系統(tǒng)(原理圖+PCB圖+單片機(jī)源碼)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:243968 發(fā)表于 2017-10-29 18:58 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
Altium Designer畫(huà)的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include <nrf24l01.h>
  3. #include "intrins.h"
  4. #define  uchar unsigned char
  5. #define  uint          unsigned int

  6. unsigned pcb_id=0;
  7. unsigned char flag=0;
  8. int set_value,state;

  9.          
  10. sbit data_temp1 = P2^4;                                 //數(shù)據(jù)線
  11. sbit data_temp2 = P2^2;                                 //數(shù)據(jù)線
  12. sbit cs = P2^3;                                          //片選
  13. sbit sclk = P2^1;                                          //io口時(shí)鐘

  14. sbit S1 = P1^0;                                 //
  15. sbit S2 = P1^1;                                 //
  16. sbit S3 = P1^2;                                 //
  17. //sbit LED1 = P1^3;                                 //
  18. sbit LED2 = P1^4;                                 //
  19. sbit LED3 = P1^5;                                 //

  20. sbit Relay1 = P1^7;                                 //
  21. sbit Relay2 = P2^0;                                 //  
  22. sbit Ring = P1^6;                                 //                     

  23. sbit LCD_RS = P2^5;           //數(shù)據(jù)命令選擇端            
  24. sbit LCD_RW = P2^6;          //讀寫(xiě)選擇端
  25. sbit LCD_EP = P2^7;           //使能信號(hào)


  26. unsigned char code wendu1[] = "T1:";    //待顯示的字符
  27. unsigned char code wendu2[] = "T2:";    //待顯示的字符
  28. unsigned char code wendu3[] = "T3:";    //待顯示的字符
  29. unsigned char code danger[] = "UNSF";         //待顯示的字符
  30. unsigned char code anquan[] = "Safe";    //待顯示的字符
  31. unsigned char anjian_flag1,anjian_flag2,anjian_flag3,anjian_flag4;
  32. unsigned char ad_temp1,        ad_temp2,ad_temp3,ad_temp4;
  33. unsigned char ring1_flag,ring2_flag,ring3_flag;
  34. unsigned char add_num;
  35. int aa;
  36. float wenduzhi;

  37. unsigned char nrf_tx_buff[4];          // 數(shù)據(jù)送到緩存
  38. unsigned char nrf_rx_buff[4];          // 數(shù)據(jù)送到緩存
  39. uchar bdata nrf_state;

  40. sbit  RX_DR_flag         = nrf_state^6;
  41. sbit  TX_DS_flag         = nrf_state^5;
  42. sbit  MAX_RT_flag = nrf_state^4;

  43. void delay(int ms)
  44. {                           // 延時(shí)子程序
  45.         int i;
  46.         while(ms--)
  47.         {
  48.           for(i = 0; i< 250; i++)
  49.           {
  50.            _nop_();
  51.            _nop_();
  52.            _nop_();
  53.            _nop_();
  54.           }
  55.     }
  56. }

  57. bit lcd_bz()           // 測(cè)試LCD忙碌狀態(tài)
  58. {                          
  59.         bit result;
  60.         LCD_RS = 0;            //寫(xiě)指令
  61.         LCD_RW = 1;
  62.         LCD_EP = 1;            //為產(chǎn)生下降沿做好準(zhǔn)備
  63.         _nop_();                //延時(shí)5ms
  64.         _nop_();
  65.         _nop_();
  66.         _nop_();
  67.         result = (bit)(P0 & 0x80);//判斷狀態(tài)字最高位STA7,確保STA7為0
  68.         LCD_EP = 0;            //將LED_EP拉低,產(chǎn)生下降沿,寫(xiě)入指令
  69.         return result;         //返回結(jié)果,為1禁止讀寫(xiě),為0可以讀寫(xiě)
  70. }

  71. void lcd_wcmd(unsigned char cmd)                // 寫(xiě)入指令數(shù)據(jù)到LCD
  72. {                          
  73.         while(lcd_bz());                 //為1不能進(jìn)行讀寫(xiě)操作
  74.         LCD_RS = 0;                   //寫(xiě)指令
  75.         LCD_RW = 0;
  76.         LCD_EP = 0;
  77.         _nop_();
  78.         _nop_();
  79.         P0 = cmd;                      //將指令寫(xiě)到P0口
  80.         _nop_();
  81.         _nop_();
  82.         _nop_();
  83.         _nop_();
  84.         LCD_EP = 1;                  //使能端高電平,為產(chǎn)生下降沿準(zhǔn)備
  85.         _nop_();
  86.         _nop_();
  87.         _nop_();
  88.         _nop_();
  89.         LCD_EP = 0;                  //產(chǎn)生下降沿,將指令寫(xiě)入LCD  
  90. }

  91. void lcd_pos(unsigned char pos)          //設(shè)定顯示位置
  92. {                          
  93.         lcd_wcmd(pos | 0x80);             //LCD數(shù)據(jù)指針格式80H+地址
  94. }

  95. void lcd_wdat(unsigned char dat)          //寫(xiě)入字符顯示數(shù)據(jù)到LCD
  96. {                          
  97.         while(lcd_bz());                 //LCD忙檢測(cè),為1不能進(jìn)行讀寫(xiě),為0可以讀寫(xiě)
  98.         LCD_RS = 1;                   //寫(xiě)數(shù)據(jù)
  99.         LCD_RW = 0;
  100.         LCD_EP = 0;
  101.         P0 = dat;                       //數(shù)據(jù)送入P0口
  102.         _nop_();
  103.         _nop_();
  104.         _nop_();
  105.         _nop_();
  106.         LCD_EP = 1;                   //使能端拉高。為產(chǎn)生下降沿做準(zhǔn)備
  107.         _nop_();
  108.         _nop_();
  109.         _nop_();
  110.         _nop_();
  111.         LCD_EP = 0;                      //使能端拉低,將數(shù)據(jù)寫(xiě)入LCD
  112. }

  113. void lcd_init()          //LCD初始化設(shè)定
  114. {                        
  115.         lcd_wcmd(0x38);   //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
  116.         delay(1);          //延時(shí)1ms
  117.         lcd_wcmd(0x0c);   //顯示開(kāi),關(guān)光標(biāo)
  118.         delay(1);
  119.         lcd_wcmd(0x06);   //移動(dòng)光標(biāo),當(dāng)讀或?qū)懸粋(gè)字符后地址指針加1且光標(biāo)加1
  120.         delay(1);
  121.         lcd_wcmd(0x01);   //清除LCD的顯示內(nèi)容,地址指針數(shù)據(jù)指針清零
  122.         delay(1);
  123. }


  124. uint ad_549()                           //TLC549處理
  125. {
  126.                   uchar i;
  127.                   ad_temp1=0;
  128.                   ad_temp2=0;
  129.                   ad_temp3=0;
  130.                   ad_temp4=0;
  131.                   cs = 1;                        //初始化,啟動(dòng)
  132.                   sclk = 0;
  133.                   cs = 0;

  134.                   _nop_();        
  135.                   _nop_();            
  136.                   for(i = 0;i < 8;i++)                //讀取采集數(shù)據(jù),讀取的是上一次采集數(shù)據(jù)
  137.                     {

  138.                           sclk = 1;
  139.                           ad_temp1 = ad_temp1 << 1;  
  140.                           if(data_temp1)ad_temp1 |= 0x01;

  141.                           ad_temp2 = ad_temp2 << 1;  
  142.                           if(data_temp2)ad_temp2 |= 0x01;
  143.                           _nop_();
  144.                           _nop_();
  145.                           sclk = 0;
  146.                           _nop_();
  147.                         }         
  148.                   cs = 1;  
  149.                   for(i = 0;i < 14;i++)
  150.                   {
  151.                                     _nop_();
  152.                   }

  153. }

  154. void timer0_init (void)                            // timer0中斷初始化函數(shù)
  155. {
  156.         EA = 0;                     
  157.         TMOD |= 0x01;            
  158.         TR0 = 0;                     
  159.         TL0 = (65536-50000)%256;
  160.         TH0 = (65536-50000)/256;                  
  161.         PT0 = 1;                     
  162.         ET0 = 1;                     
  163.         EA = 1;                     
  164.         TR0 = 1;                     
  165. }

  166. void anjian(void)
  167. {        
  168.         if(S1==0)
  169.         {
  170.                 if(anjian_flag1==0)
  171.                 {
  172.                         anjian_flag1=1;
  173.                         add_num=1;
  174.                 }
  175.         }
  176.         else
  177.         {
  178.                 anjian_flag1=0;
  179.         }

  180.          if(S2==0)
  181.         {
  182.                 if(anjian_flag2==0)
  183.                 {
  184.                         anjian_flag2=1;        
  185.                         add_num=2;        

  186.                 }
  187.         }
  188.         else
  189.         {
  190.                 anjian_flag2=0;
  191.         }

  192.         if(S3==0)
  193.         {
  194.                 if(anjian_flag3==0)
  195.                 {

  196.                         anjian_flag3=1;        
  197.                         add_num=3;               
  198.                 }
  199.         }
  200.         else
  201.         {
  202.                 anjian_flag3=0;
  203.         }
  204.                           
  205. }
  206. void uart_init()  
  207. {
  208.         TMOD |= 0x20;
  209.         TH1 = 0xf3;  
  210.         TL1 = 0xf3;
  211.         TR1 = 1; //啟動(dòng)定時(shí)器1,從而設(shè)定了串口通信的波特率
  212.         PCON=0X80;
  213.         SM0 = 0;  
  214.         SM1 = 1; //設(shè)定串口通信方式為十位異步收發(fā)器  
  215.         REN = 1; //打開(kāi)串口通信  
  216.         EA = 1;  
  217.         ES = 1;
  218. }
  219. void uart_send(databuff)
  220. {
  221.         SBUF=(databuff/100)+0x30;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  222.         while(!TI);                         //等待發(fā)送數(shù)據(jù)完成
  223.         TI=0;
  224.         SBUF=((databuff%100)/10)+0x30;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  225.         while(!TI);                         //等待發(fā)送數(shù)據(jù)完成
  226.         TI=0;
  227.         SBUF=(databuff%10)+0x30;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  228.         while(!TI);                         //等待發(fā)送數(shù)據(jù)完成
  229.         TI=0;

  230. }
  231.         
  232. void uart_sendone(onedata)
  233. {
  234.         SBUF=onedata;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
  235.         while(!TI);                         //等待發(fā)送數(shù)據(jù)完成
  236.         TI=0;
  237. }
  238. void main(void)                        //主程序
  239. {  
  240.         unsigned char zf;
  241.         int temp;
  242.         set_value=100;
  243. //        uart_init();  
  244.         timer0_init ();
  245.         init_io();                              // 初始化IO
  246.         RX_Mode();                              // 設(shè)置為接收模式
  247.         LED2=1;
  248.         LED3=1;
  249.         anjian_flag1=0;
  250.         anjian_flag2=0;
  251.         anjian_flag3=0;
  252.         Relay1=0;
  253.         Relay2=0;
  254.         Ring=0;
  255.         add_num=1;
  256.          if(pcb_id==1)                        //主機(jī)為1、從機(jī)為0初始化
  257.          {
  258.             lcd_init();     // 初始化LCD
  259.             delay(10);     //延時(shí)10ms
  260.             lcd_wcmd(0x06);              //向右移動(dòng)光標(biāo)
  261.             lcd_pos(0x00+0);                //設(shè)置顯示位置為第一行的第17個(gè)字符
  262.             zf = 0;
  263.             while(wendu1[ zf ] != '\0')
  264.             {                           
  265.                lcd_wdat(wendu1[ zf ]);                   //顯示字符"WLCOME  TO"
  266.                zf ++;
  267.             }

  268.              lcd_wcmd(0x06);              //向右移動(dòng)光標(biāo)
  269.             lcd_pos(0x00+9);                //設(shè)置顯示位置為第一行的第17個(gè)字符
  270.             zf = 0;
  271.             while(wendu2[ zf ] != '\0')
  272.             {                           
  273.                lcd_wdat(wendu2[ zf ]);                   //顯示字符"WLCOME  TO"
  274.                zf ++;
  275.             }


  276.             lcd_wcmd(0x06);              //向右移動(dòng)光標(biāo)
  277.             lcd_pos(0x40+0);                //設(shè)置顯示位置為第一行的第17個(gè)字符
  278.             zf = 0;
  279.             while(wendu3[ zf ] != '\0')
  280.             {                           
  281.                lcd_wdat(wendu3[ zf ]);                   //顯示字符"WLCOME  TO"
  282.                zf ++;
  283.             }        

  284.                 lcd_wcmd(0x06);              //向右移動(dòng)光標(biāo)
  285.             lcd_pos(0x40+9);                //設(shè)置顯示位置為第一行的第17個(gè)字符
  286.             zf = 0;
  287.             while(anquan[ zf ] != '\0')
  288.             {                           
  289.                lcd_wdat(anquan[ zf ]);                   //顯示字符"WLCOME  TO"
  290.                zf ++;
  291.             }
  292.         }

  293.         while(1)
  294.         {  
  295.                      if(pcb_id==1)
  296.                 {
  297.                           nrf_state = SPI_Read(STATUS);          // 讀狀態(tài)寄存器
  298.                     if(RX_DR_flag)                                  // 判斷是否接受到數(shù)據(jù)
  299.                         {
  300.                                 SPI_Read_Buf(RD_RX_PLOAD, nrf_rx_buff, TX_PLOAD_WIDTH);  // 從RX FIFO讀出數(shù)據(jù)
  301.                                 if(nrf_rx_buff[0]==0x01)
  302.                                 {
  303.                                         LED2=~LED2;               
  304.                                         aa=        (nrf_rx_buff[1]<<8)+ nrf_rx_buff[2];
  305.                                         lcd_wcmd(0x06);              //向右移動(dòng)光標(biāo)
  306.                                         lcd_pos(0x00+3);                //設(shè)置顯示位置為第一行的第17個(gè)字符                 
  307.                                          lcd_wdat((aa/100)+0x30);
  308.                                         lcd_wdat((aa%100)/10+0x30);
  309.                                         lcd_wdat('.');
  310.                                         lcd_wdat((aa%10)+0x30);        
  311.                                         if(aa>500)
  312.                                         {
  313.                                                  ring1_flag=1;
  314.                                         }
  315.                                         else
  316.                                         {
  317.                                                   ring1_flag=0;
  318.                                         }

  319.                                  }
  320.                                  else if(nrf_rx_buff[0]==0x02)
  321.                                  {
  322.                                            LED2=~LED2;               
  323.                                         aa=        (nrf_rx_buff[1]<<8)+ nrf_rx_buff[2];
  324.                                         lcd_wcmd(0x06);              //向右移動(dòng)光標(biāo)
  325.                                         lcd_pos(0x00+12);                //設(shè)置顯示位置為第一行的第17個(gè)字符                 
  326.                                          lcd_wdat((aa/100)+0x30);
  327.                                         lcd_wdat((aa%100)/10+0x30);
  328.                                         lcd_wdat('.');
  329.                                         lcd_wdat((aa%10)+0x30);        
  330.                                         if(aa>500)
  331.                                         {
  332.                                                  ring2_flag=1;
  333.                                         }
  334.                                         else
  335.                                         {
  336.                                                   ring2_flag=0;
  337.                                         }

  338.                                   }
  339.                                   else if(nrf_rx_buff[0]==0x03)
  340.                                   {
  341.                                                    LED2=~LED2;               
  342.                                                 aa=        (nrf_rx_buff[1]<<8)+ nrf_rx_buff[2];
  343.                                                 lcd_wcmd(0x06);              //向右移動(dòng)光標(biāo)
  344.                                                 lcd_pos(0x40+3);                //設(shè)置顯示位置為第一行的第17個(gè)字符                 
  345.                                                  lcd_wdat((aa/100)+0x30);
  346.                                                 lcd_wdat((aa%100)/10+0x30);
  347.                                                 lcd_wdat('.');
  348.                                                 lcd_wdat((aa%10)+0x30);        
  349.                                                 if(aa>500)
  350.                                                 {
  351.                                                          ring3_flag=1;
  352.                                                 }
  353.                                                 else
  354.                                                 {
  355.                                                           ring3_flag=0;
  356.                                                 }                                 
  357.                                   }
  358.                                   else
  359.                                   {
  360.                                  
  361.                                   }
  362.                                 }

  363.                                 SPI_RW_Reg(WRITE_REG + STATUS, nrf_state);  // 清除RX_DS中斷標(biāo)志

  364.                                 if((ring1_flag==1)||(ring2_flag==1)||(ring3_flag==1))
  365.                                 {
  366.                                           lcd_wcmd(0x06);              //向右移動(dòng)光標(biāo)
  367.                                     lcd_pos(0x40+9);                //設(shè)置顯示位置為第一行的第17個(gè)字符
  368.                                     zf = 0;
  369.                                     while(danger[ zf ] != '\0')
  370.                                     {                           
  371.                                        lcd_wdat(danger[ zf ]);                   //顯示字符"WLCOME  TO"
  372.                                        zf ++;
  373.                                     }
  374.                                         Ring=1;
  375.                                         LED3=0;
  376.                                 }               
  377.                                 else
  378. ……………………

  379. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
程序源碼 (1).zip (75.8 KB, 下載次數(shù): 40)
硬件.zip (653.46 KB, 下載次數(shù): 45)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日日摸日日碰夜夜爽亚洲精品蜜乳 | 91精品国产一区二区三区 | 国产精品久久久久久吹潮 | 国产亚洲一区二区三区在线观看 | 免费精品| 国产欧美一区二区久久性色99 | 国产成人免费网站 | 三级av在线 | 久久久久久亚洲国产精品 | 久久99网| 九九热在线精品视频 | 色男人的天堂 | 国产精品久久久久久久久久久免费看 | japan25hdxxxx日本 做a的各种视频 | 日日干夜夜操 | 狠狠草视频 | 日本不卡一二三 | 特黄一级 | 亚洲精品中文字幕 | 成人免费福利视频 | 欧美日韩亚洲在线 | 视频一区二区中文字幕日韩 | 午夜精品影院 | 中文字幕成人av | 欧美日韩精品免费 | 91www在线观看 | 国产免费一区二区三区 | 午夜精品久久久久久不卡欧美一级 | 亚洲精品国产一区 | 亚洲精品99 | 亚洲二区在线 | 三级在线观看 | 午夜综合 | 97精品国产97久久久久久免费 | 丁香六月伊人 | 成人av在线播放 | 91在线视频观看 | 99久久久国产精品 | 久久日韩粉嫩一区二区三区 | 欧美一区二区三区久久精品 | 区一区二在线观看 |