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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51控制超聲波測距并用nrf905傳播信息程序

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:85375 發(fā)表于 2015-10-6 20:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
3黑幣
**********************請主要看主函數(shù)部分及后邊的注釋*********************************
******************************求大神指點迷津********************************************
#include <reg52.h>
#include <stdio.h>
#include <math.h>
#include "1602.h"        // 沒用到  先暫時
#include "delay.h"
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

#define WC                0x00                        // Write configuration register command
#define RC                0x10                         // Read  configuration register command
#define WTP                0x20                         // Write TX Payload  command
#define RTP                0x21                        // Read  TX Payload  command
#define WTA                0x22                        // Write TX Address  command
#define RTA                0x23                        // Read  TX Address  command
#define RRP                0x24                        // Read  RX Payload  command
/*******************************************************************************************/
typedef struct RFConfig
{
        uchar n;
        uchar buf[10];
}RFConfig;

code RFConfig RxTxConf =
{
        10,
        0x4c, 0x0c, 0x44, 0x20, 0x20, 0xcc, 0xcc, 0xcc,0xcc, 0x58       
};
// The content of this struct is nRF905's initialize data.初始化數(shù)據(jù)
// CH_NO=1;433MHZ;Normal Opration,No Retrans;RX,TX Address is 4 Bytes
// RX TX Payload Width is 32 Bytes;Disable Extern Clock;Fosc=16MHZ
// 8 Bits CRC And enable
/*******************************************************************************************/
sbit TRIG = P2^0 ;                   //超聲波發(fā)
sbit ECHO = P2^1 ;                   //超聲波收

unsigned char DisTempData[16];
uchar data TxBuf[32];
uchar data RxBuf[32];
//uchar key,rsbrf,delayf,tf;        //暫時改成下一句
uchar tf=0;
float distance;
/*******************************************************************************************/
uchar bdata DATA_BUF;
sbit        flag        =DATA_BUF^7;
sbit        flag1        =DATA_BUF^0;
/*******************************************************************************************/
sbit        TX_EN        =P1^7;
sbit        TRX_CE        =P1^6;
sbit        PWR_UP        =P1^5;
sbit        MISO        =P1^1;
sbit        MOSI        =P1^0;
sbit        SCK                =P3^7;
sbit        CSN                =P3^3;

sbit        AM                =P1^3;
sbit        DR                =P3^2;
sbit        CD                =P1^4;

sbit    LED1    =P3^4;
sbit    LED2    =P3^5;          
//sbit    CHE    =P3^0;                   //什么意思,怎么忘了???
//sbit    KEY2    =P3^1;           //用不到
float ceju(void);//超聲波測距
void nrf_init(void);//nrf初始化
void TIM0init(void); //定時器0初始化
void Config905(void);// Config nRF905 module配置NRF905模式
void SetTxMode(void);// Set nRF905 in Tx mode
void SetRxMode(void);// Set nRF905 in Rx mode
void TxPacket(void);// Send data by nRF905
void RxPacket(void);// Recive data by nRF905
void SpiWrite(uchar);// Write data to nRF905
uchar SpiRead(void);// Read data to nRF905
void Delay(uchar n);// Delay 100us
/*------------------------------------------------
                    主函數(shù)
------------------------------------------------*/
void main()
{
  TIM0init();    //初始化定時器0
  LCD_Init();    //初始化LCD                         沒用到  先暫時
  nrf_init();    //NRF905初始化
  Config905();                                // <主機通過SPI接口向905配置寄存器寫入信息>Config nRF905 module
  TxBuf[0]=1;//第一個字節(jié)對應地址編碼,如1號停車位
LCD_Write_String(0,1,"LY-UR04 demo");
  while(1)
  {
        distance=ceju();
   DelayMs(250);            //延時決定采樣速度
        if(distance<50.0){tf=1;LED1 = 0; TxBuf[1] = 1 ;}//可以TxBuf初始零,然后加一;
      else {tf = 0;LED1 = 1; TxBuf[1] = 0 ;}         //為什么不加此句無論大于or小于50燈都亮,加上就好了
   sprintf(DisTempData,"distance=%3.1f CM     ",distance);//打印輸出結果
   LCD_Write_String(0,0,DisTempData);       //在液晶屏上顯示
   DelayMs(2500);            //延時決定采樣速度/* 有無不影響
/*          if(tf!=1) ;
           else
            {       
                          LED1 = 1;
                  //===============NRF905發(fā)送相應的按鍵          
                     SetTxMode();                // Set Tx Mode
                     TxPacket();                // Transmit Tx buffer data
                        TxBuf[0] = 0x01;
                        TxBuf[1] = 0x00;        //數(shù)據(jù)清零??好像也不需要,都行???
                        SetRxMode();                // Set nRF905 in Rx mode
                        tf=0;
                        Delay(500);
        //                LED1 = 1;
                //        LED2 = 1;                 // 沒用到  先暫時
                  }
*/
    if (tf==1)                          //他們怎么一直不能很好的實現(xiàn),??????????????????/
             {       
                   LED1 = 1;            //燈亮后不會滅,這是我一直不能理解的,不應該有問題啊
                  //===============NRF905發(fā)送相應的按鍵          
                     SetTxMode();                // Set Tx Mode
                     TxPacket();                // Transmit Tx buffer data
                        TxBuf[0] = 0x01;
                        TxBuf[1] = 0x00;        //數(shù)據(jù)清零??好像也不需要,都行???
                        SetRxMode();                // Set nRF905 in Rx mode
                        tf=0;
                        Delay(500);
                        LED1 = 1;
                //        LED2 = 1;                 // 沒用到  先暫時
                  }
//          else ;

         //=====================等待NRF905接收
/*           if (DR)                        // If recive data ready... 加上他們測距就不對了,怎么回事,因為DR懸空,一直等待;
           RxPacket();                        // ... recive data          
              else ;
*/
DelayMs(2500);
  }
}

/*------------------------------------------------
                 定時器中斷子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
ECHO=0;
}
/*------------------------------------------------
                    定時器0初始化
------------------------------------------------*/
void TIM0init(void)
{

  TMOD|= 0x01;//定時器0工作方式1
  TH0=0x00;   
  TL0=0x00;
  ET0=1;
  EA=1;
}
/*------------------------------------------------
                    ceju
------------------------------------------------*/
float ceju(void)
{
  float S;       //距離變量
   TRIG=1;       //觸發(fā)信號是高電平脈沖,寬度大于10us
   DelayUs2x(10);
   TRIG=0;
   while(!ECHO); //等待高電平
   TR0=1;
   while(ECHO);  //等待低電平
   TR0=0;
   S=TH0*256+TL0;//取出定時器值高8位和低8位合并
   S=S/58;       //為什么除以58等于厘米,  Y米=(X秒*344)/2
                             // X秒=( 2*Y米)/344 -> X秒=0.0058*Y米 -> 厘米=微秒/58
   TH0=0;
   TL0=0;        //清除定時器0寄存器中的值
   return S;
}
void Delay(uchar n)
{
        uint i;
        while(n--)
        for(i=0;i<80;i++);       
}
/*******************************************************************************************/
//function nrf_init();
/*******************************************************************************************/
void nrf_init(void)
{
    CSN=1;                                                // Spi         disable                                               
        SCK=0;                                                // Spi clock line init high
        DR=1;                                                // Init DR for input
        AM=1;                                                // Init AM for input
        PWR_UP=1;                                        // nRF905 power on
        TRX_CE=0;                                        // Set nRF905 in standby mode
        TX_EN=0;                                        // set radio in Rx mode
}
/*******************************************************************************************/
//function Config905();
/*******************************************************************************************/
void Config905(void)
{
        uchar i;                                       
        CSN=0;                                                // Spi enable for write a spi command
        SpiWrite(WC);                                // Write config command寫放配置命令
        for (i=0;i<RxTxConf.n;i++)        // Write configration words  寫放配置字
        {
                SpiWrite(RxTxConf.buf[i]);
        }
        CSN=1;                                                // Disable Spi
}

/*******************************************************************************************/
//function SpiWrite();
/*******************************************************************************************/
void SpiWrite(uchar  byte)
{
        uchar i;       
        DATA_BUF=byte;                                // Put function's parameter into a bdata variable               
        for (i=0;i<8;i++)                        // Setup byte circulation bits
        {       
               
                if (flag)                                // Put DATA_BUF.7 on data line
                        MOSI=1;
                else
                        MOSI=0;
                SCK=1;                                        // Set clock line high
                DATA_BUF=DATA_BUF<<1;        // Shift DATA_BUF         高位在前
                SCK=0;                                        // Set clock line low
        }       
}
/*******************************************************************************************/
//function SpiRead();
/*******************************************************************************************/
uchar SpiRead(void)
{
        uchar i;       
        for (i=0;i<8;i++)                        // Setup byte circulation bits
        {       
                DATA_BUF=DATA_BUF<<1;        // Right shift DATA_BUF
                SCK=1;                                        // Set clock line high
                if (MISO)
                        flag1=1;                        // Read data
                else
                        flag1=0;
                                                       
               
                SCK=0;                                        // Set clock line low
        }
        return DATA_BUF;                        // Return function parameter
}
/*******************************************************************************************/
//function TxPacket();
/*******************************************************************************************/
void TxPacket(void)
{
        uchar i;
        //Config905();                               
        CSN=0;                                                // Spi enable for write a spi command       
        SpiWrite(WTP);                                // Write payload command
        for (i=0;i<32;i++)
        {
                SpiWrite(TxBuf[i]);                // Write 32 bytes Tx data
        }
        CSN=1;                                                // Spi disable                                               
        Delay(1);
        CSN=0;                                                // Spi enable for write a spi command       
        SpiWrite(WTA);                                // Write address command
        for (i=0;i<4;i++)                        // Write 4 bytes address
        {
                SpiWrite(RxTxConf.buf[i+5]);
        }       
        CSN=1;                                                // Spi disable
        TRX_CE=1;                                        // Set TRX_CE high,start Tx data transmission
        Delay(1);                                        // while (DR!=1);
        TRX_CE=0;                                        // Set TRX_CE low
}
/*******************************************************************************************/
//function RxPacket();
/*******************************************************************************************/
void RxPacket(void)
{
        uchar i;       
        TRX_CE=0;                                        // Set nRF905 in standby mode       
        CSN=0;                                                // Spi enable for write a spi command
        SpiWrite(RRP);                                // Read payload command       
        for (i=0;i<32;i++)
        {
                RxBuf[i]=SpiRead();                // Read data and save to buffer               
        }
        CSN=1;                                                // Disable spi
        while(DR||AM);       
//        P0=        RxBuf[0];                                // Buffer[0] output from P0 port...
        TRX_CE=1;
        //xx=(RxBuf[0]>>4)&0x0f;
        //TxData(xx);
         //=====================
           if(RxBuf[0] == 1) LED1 = 0 ;
           if(RxBuf[1] == 1) LED2 = 0 ;
          
        Delay(500);                                        // ...light led
//        P0=0xff;                                        // Close led
      LED1 = 1 ;
          LED2 = 1 ;                                                               
}
/*******************************************************************************************/
//function SetTxMode();
/*******************************************************************************************/
void SetTxMode(void)                               
{       
        TX_EN=1;
        TRX_CE=0;
        Delay(1);                                         // delay for mode change(>=650us)
}                               
/*******************************************************************************************/
//function SetRxMode();
/*******************************************************************************************/
void SetRxMode(void)
{
        TX_EN=0;
        TRX_CE=1;
        Delay(1);                                         // delay for mode change(>=650us)                               
}

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www.99热| 波多野结衣在线观看一区二区三区 | 成人在线精品 | 日本一区二区三区视频在线 | 日韩在线综合 | 国产激情精品 | 日韩精品视频中文字幕 | 久久婷婷色 | 久久最新 | 偷拍自拍网 | 三级黄色网址 | 黄色片视频网站 | 亚洲综合激情 | 毛片在线免费 | 成人日韩av| 九九久久久 | 99精品视频在线观看 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 国产精品免费小视频 | 午夜视频在线播放 | 美女久久| 中文字幕成人网 | 国产精品久久久久久久午夜片 | 免费av观看 | 国外成人在线视频 | 成人av播放 | 中文字幕精品一区久久久久 | 99精品国产一区二区青青牛奶 | 亚洲精品在线视频 | 看亚洲a级一级毛片 | 粉嫩高清一区二区三区 | 涩涩视频在线观看 | 国产黄色网址在线观看 | 九九精品久久久 | www.99热这里只有精品 | 美女福利视频网站 | 91在线免费视频 | com.色.www在线观看 | 亚洲网站在线观看 | 天天操天天天 | 中文字幕精品视频 |