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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4962|回復: 6
打印 上一主題 下一主題
收起左側

NRF24L01 spi 1602液晶顯示的奇怪的問題

[復制鏈接]
跳轉到指定樓層
樓主
      近段時間搞NRF24L01無線模塊,頭發掉了好幾根。有一些疑問,還請指點。
1.SPI_Read(uchar reg )中的reg_val = SPI_RW(0)如何理解,為什么寫0后就可讀出寄存器中的值了。
/****************************************************************************************************
/*函數:uchar SPI_Read(uchar reg)
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
       uchar reg_val;
       CSN = 0;                // CSN low, initialize SPI communication...
       SPI_RW(reg);            // Select register to read from..
       reg_val = SPI_RW(0);    // ..then read registervalue
       CSN = 1;                // CSN high, terminate SPI communication
       return(reg_val);        // return register value
}
2.SPI_RW(uint uchar)最終uchar是返回狀態寄存器STAUS(地址0x07)里面的值嗎?
**********************
/*函數:uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI寫時序
/****************************************************************************************************/
uint SPI_RW(uint uchar)
{
       uint bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
    {
              MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
              uchar = (uchar << 1);          // shift next bit into MSB..
              SCK = 1;                       // Set SCK high..
              uchar |= MISO;                 // capture current MISO bit
              SCK = 0;                       // ..then set SCK low again
    }
    return(uchar);                     // return read uchar
}
3.    自己從別人的程序里修改一下,做了個最簡的小程序來查看NRF24L01寄存器里面的值,結果就出現也問題,怎么想也想不出問題在哪。本意是在NRF24L01上電后,先讀出寄存器EN_AA里面的值,讓它顯示在液晶1602的第一行第一個位值,期望值是063。NRF24L01上電后,EN_AA默認值是 0011 1111,即十進制63。然后向EN_AA寫入了0x01,再讀出EN_AA里面的值,讓它顯示在液晶1602的第二行第一個位值,期望值顯示的是001。
      結果是液晶1602第一行一開始時是顯示063,第二行顯示是001,但很快第一行顯示變成和第二行一樣,即顯示001。而且第二行的001不斷在閃。不知怎么回事,求指教。程序實際較少,我附在樓下了。還望指點迷津!

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

使用道具 舉報

沙發
ID:65751 發表于 2014-9-10 10:23 | 只看該作者
本帖最后由 codenew 于 2014-9-10 20:57 編輯

      本意是在NRF24L01上電后,先讀出寄存器EN_AA里面的值,讓它顯示在液晶1602的第一行第一個位值,期望值是063。NRF24L01上電后,EN_AA默認值是 0011 1111,即十進制63。然后向EN_AA寫入了0x01,再讀出EN_AA里面的值,讓它顯示在液晶1602的第二行第一個位值,期望值顯示的是001。下面是正常顯示的圖和程序:

#include<reg51.h>   
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
unsigned char code digit[10]={"0123456789"};        //定義字符數組顯示數字
//*********NRF24L01 IO端口定義**********//                                    
sbit  MISO =P1^2;
sbit  MOSI =P1^3;
sbit  SCK  =P1^4;
sbit  CE   =P1^6;
sbit  CSN  =P1^5;
sbit  IRQ  =P1^0;
sbit rs=P3^3;//LCD數據/命令選擇端(H/L)
sbit rw=P3^4;//LCD/寫選擇端(H/L)
sbit en=P3^5;//LCD使能控制
//*************NRF24L01寄存器指令***********//
#define READ_REG        0x00   // 讀寄存器指令
#define WRITE_REG       0x20   // 寫寄存器指令
//*************SPI(nRF24L01)寄存器地址********//
#define CONFIG          0x00  // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
#define EN_AA           0x01  // 自動應答功能設置
void inerDelay_us(unsigned char n);
uint SPI_RW(uint uchar);
uchar SPI_Read(uchar reg);
uint SPI_RW_Reg(uchar reg, uchar value);
void delays(uint x);
void write_com(uchar com);
void display_temp1(unsigned char x);
void write_date(uchar date);
/*****************************************************
函數功能:主函數
***************************************************/
void main(void)
{     
         unsigned int TN;  
         unsigned int TD;  
        uchar i=0;
         //BEEP=0;          //防止蜂鳴器的電流聲
       inerDelay_us(100);
       CE=0;    // chip enable
       CSN=1;   // Spi disable
       SCK=0;   // Spi clock line init high
       write_com(0x38);   //設置工作方式
       write_com(0x0c);   //設置光標
       write_com(0x06);   //設置輸入方式
       write_com(0x01);   //清屏
      
                       
                                 TN=SPI_Read(EN_AA);
                                   write_com(0x80);
                                   display_temp1(TN);     //期望值是063(十進制),NRF24L01上電后,EN_AA默認值是 0011 1111,即十進制63
                                   
                    delays(200);
                    delays(200);
                    delays(200);
                    delays(200);
                    delays(200);
                    delays(200);
                                   
                                   SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);                              
                                  TD=SPI_Read(EN_AA);
                                   write_com(0x80+0x40);      
                                   display_temp1(TD);     //期望值是001,因為前面向EN_AA寫入了0x01
                                delays(200);
                                   delays(200);
                                   delays(200);
                                   delays(200);
                                   delays(200);
                                   delays(200);
}
/*****************************************************
函數功能:顯示十進制數
入口參數:x
***************************************************/
void display_temp1(unsigned char x)
{
       unsigned char j,k,l;     //j,k,l分別儲存溫度的百位、十位和個位
       j=x/100;              //取百位
       k=(x%100)/10;         //取十位
       l=x%10;               //取個位  
       write_date(digit[j]);    //將百位數字的字符常量寫入LCD
       write_date(digit[k]);    //將十位數字的字符常量寫入LCD
       write_date(digit[l]);    //將個位數字的字符常量寫入LCD
       //write_date('.');               //小數點
       delays(50);           //延時1ms給硬件一點反應時間     
}           
      
/***********1602液晶顯示部分子程序****************/
void write_com(uchar com)
{
       rs=0;//命令
       rw=0;
       P0=com;
       delays(5);
       en=1;
       delays(5);
       en=0;
}
void write_date(uchar date)
{
       rs=1;//數據
       rw=0;
       P0=date;
       delays(5);
       en=1;
       delays(5);
       en=0;
}
/****************************************************************************************************/
/*功能:NRF24L01讀寫寄存器函數
/****************************************************************************************************/
uint SPI_RW_Reg(uchar reg, uchar value)
{
       uint status;
       CSN = 0;                   // CSN low, init SPI transaction
       status = SPI_RW(reg);      // select register
       SPI_RW(value);             // ..and write value to it..
       CSN = 1;                   // CSN high again
       return(status);            // return nRF24L01 status uchar
}
/****************************************************************************************************
/*函數:uchar SPI_Read(uchar reg)
/*功能:NRF24L01SPI時序
/*詳細請參考Page19
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
       uchar reg_val;
       CSN = 0;                // CSN low, initialize SPI communication...
       SPI_RW(reg);            // Select register to read from..
       reg_val = SPI_RW(0);    // ..then read registervalue
       CSN = 1;                // CSN high, terminate SPI communication
       return(reg_val);        // return register value
}
/****************************************************************************************************
/*函數:uint SPI_RW(uint uchar)
/*功能:NRF24L01SPI寫時序
/*詳細請參考Page19
/****************************************************************************************************/
uint SPI_RW(uint uchar)
{
       uint bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
    {
              MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
              uchar = (uchar << 1);          // shift next bit into MSB..
              SCK = 1;                       // Set SCK high..
              uchar |= MISO;                 // capture current MISO bit
              SCK = 0;                       // ..then set SCK low again
    }
    return(uchar);                     // return read uchar
}
//*****************長延時*********************************//
void delays(uint x) //毫秒級延時函數
{
  uint i,j;
  for(i=x;i>0;i--)
     for(j=110;j>0;j--);
}
//********************************************************//
//*延時函數
//********************************************************//
void inerDelay_us(unsigned char n)
{  
for(;n>0;n--)
  _nop_();
}

正常.jpg (61.5 KB, 下載次數: 127)

正常

正常
回復

使用道具 舉報

板凳
ID:65751 發表于 2014-9-10 10:36 | 只看該作者
本帖最后由 codenew 于 2014-9-10 20:58 編輯

下面程序第一行先顯示063,第二行先顯示001,很快第一行變成001,而且第二行的001還在不斷閃。

#include<reg51.h>   
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
unsigned char code digit[10]={"0123456789"};        //定義字符數組顯示數字
//*********NRF24L01 IO端口定義**********//                                    
sbit  MISO =P1^2;
sbit  MOSI =P1^3;
sbit  SCK  =P1^4;
sbit  CE   =P1^6;
sbit  CSN  =P1^5;
sbit  IRQ  =P1^0;
//***液晶1602定義,數據口接P0**//
sbit rs=P3^3;//LCD數據/命令選擇端(H/L)
sbit rw=P3^4;//LCD/寫選擇端(H/L)
sbit en=P3^5;//LCD使能控制
//*************NRF24L01寄存器指令***********//
#define READ_REG        0x00   // 讀寄存器指令
#define WRITE_REG       0x20   // 寫寄存器指令
//*************SPI(nRF24L01)寄存器地址********//
#define CONFIG          0x00  // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
#define EN_AA           0x01  // 自動應答功能設置
void inerDelay_us(unsigned char n);
uint SPI_RW(uint uchar);
uchar SPI_Read(uchar reg);
uint SPI_RW_Reg(uchar reg, uchar value);
void delays(uint x);
void write_com(uchar com);
void display_temp1(unsigned char x);
void write_date(uchar date);
/*****************************************************
函數功能:主函數
***************************************************/
void main(void)
{     
         unsigned int TN;  
         unsigned int TD;  
       inerDelay_us(100);
       CE=0;    // chip enable
       CSN=1;   // Spi disable
       SCK=0;   // Spi clock line init high
       write_com(0x38);   //設置工作方式
       write_com(0x0c);   //設置光標
       write_com(0x06);   //設置輸入方式
       write_com(0x01);   //清屏     
                       
                                 TN=SPI_Read(EN_AA);
                                   write_com(0x80);
                                   display_temp1(TN);// 期望值顯示的是063(十進制),NRF24L01上電后,EN_AA默認值是 0011 1111,即十進制63
                                   
                    delays(200);
                    delays(200);
                    delays(200);
                    delays(200);
                    delays(200);
                    delays(200);
                                   
                                   SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);                              
                                  TD=SPI_Read(EN_AA);
                                   write_com(0x80+0x40);      
                                   display_temp1(TD); //期望值顯示的是001,因為前面向EN_AA寫入了0x01
                                delays(200);
                                   delays(200);
                                   delays(200);
                                   delays(200);
                                   delays(200);
                                   delays(200);
}
/*****************************************************
函數功能:顯示十進制數
入口參數:x
***************************************************/
void display_temp1(unsigned char x)
{
       unsigned char j,k,l;     //j,k,l分別儲存溫度的百位、十位和個位
       j=x/100;              //取百位
       k=(x%100)/10;         //取十位
       l=x%10;               //取個位  
       write_date(digit[j]);    //將百位數字的字符常量寫入LCD
       write_date(digit[k]);    //將十位數字的字符常量寫入LCD
       write_date(digit[l]);    //將個位數字的字符常量寫入LCD
       delays(50);           //延時1ms給硬件一點反應時間     
}           
      
/***********1602液晶顯示部分子程序****************/
void write_com(uchar com)
{
       rs=0;//命令
       rw=0;
       P0=com;
       delays(5);
       en=1;
       delays(5);
       en=0;
}
void write_date(uchar date)
{
       rs=1;//數據
       rw=0;
       P0=date;
       delays(5);
       en=1;
       delays(5);
       en=0;
}
/****************************************************************************************************/
/*功能:NRF24L01讀寫寄存器函數
/****************************************************************************************************/
uint SPI_RW_Reg(uchar reg, uchar value)
{
       uint status;
       CSN = 0;                   // CSN low, init SPI transaction
       status = SPI_RW(reg);      // select register
       SPI_RW(value);             // ..and write value to it..
       CSN = 1;                   // CSN high again
       return(status);            // return nRF24L01 status uchar
}
/****************************************************************************************************
/*函數:uchar SPI_Read(uchar reg)
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
       uchar reg_val;
       CSN = 0;                // CSN low, initialize SPI communication...
       SPI_RW(reg);            // Select register to read from..
       reg_val = SPI_RW(0);    // ..then read registervalue
       CSN = 1;                // CSN high, terminate SPI communication
       return(reg_val);        // return register value
}
/****************************************************************************************************
/*函數:uint SPI_RW(uint uchar)
/*功能:NRF24L01SPI寫時序
/****************************************************************************************************/
uint SPI_RW(uint uchar)
{
       uint bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
    {
              MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
              uchar = (uchar << 1);          // shift next bit into MSB..
              SCK = 1;                       // Set SCK high..
              uchar |= MISO;                 // capture current MISO bit
              SCK = 0;                       // ..then set SCK low again
    }
    return(uchar);                     // return read uchar
}
//*****************長延時*********************************//
void delays(uint x) //毫秒級延時函數
{
  uint i,j;
  for(i=x;i>0;i--)
     for(j=110;j>0;j--);
}
//********************************************************//
//*延時函數
//********************************************************//
void inerDelay_us(unsigned char n)
{  
for(;n>0;n--)
  _nop_();
}

異常.jpg (27.85 KB, 下載次數: 117)

異常

異常
回復

使用道具 舉報

地板
ID:65751 發表于 2014-9-10 20:51 | 只看該作者
上面兩個程序看著是一樣的,運行效果卻不一樣,編譯都沒錯呀,為什么會這樣。仔細看了多次,還是覺得一樣的,快發瘋了。。。
回復

使用道具 舉報

5#
ID:37685 發表于 2014-9-10 22:59 來自手機 | 只看該作者
nrf24l01好像有挪威與臺灣之分  ,貌似程序不同
回復

使用道具 舉報

6#
ID:65751 發表于 2014-9-14 21:00 | 只看該作者
     大家不要花時間看了,找出問題所在了。在程序最后加上while(1);,就什么都正常了。如果不加程序又會從頭開始執行。
    主要是平時看C語言教材,主函數最后沒有死循環。51單片機主函數必須要有死循環?望大蝦解釋一下。

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的積分獎勵!

查看全部評分

回復

使用道具 舉報

7#
ID:69678 發表于 2014-11-30 09:16 | 只看該作者
高手哦正在找NRF24L01的程序
#include<reg51.h>   
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
unsigned char code digit[10]={"0123456789"};        //定義字符數組顯示數字
//*********NRF24L01 IO端口定義**********//                                    
sbit  MISO =P1^2;
sbit  MOSI =P1^3;
sbit  SCK  =P1^4;
sbit  CE   =P1^6;
sbit  CSN  =P1^5;
sbit  IRQ  =P1^0;
sbit rs=P3^3;//LCD數據/命令選擇端(H/L)
sbit rw=P3^4;//LCD讀/寫選擇端(H/L)
sbit en=P3^5;//LCD使能控制
//*************NRF24L01寄存器指令***********//
#define READ_REG        0x00   // 讀寄存器指令
#define WRITE_REG       0x20   // 寫寄存器指令
//*************SPI(nRF24L01)寄存器地址********//
#define CONFIG          0x00  // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
#define EN_AA           0x01  // 自動應答功能設置
void inerDelay_us(unsigned char n);
uint SPI_RW(uint uchar);
uchar SPI_Read(uchar reg);
uint SPI_RW_Reg(uchar reg, uchar value);
void delays(uint x);
void write_com(uchar com);
void display_temp1(unsigned char x);
void write_date(uchar date);
/*****************************************************
函數功能:主函數
***************************************************/
void main(void)
{     
         unsigned int TN;  
         unsigned int TD;  
        uchar i=0;
         //BEEP=0;          //防止蜂鳴器的電流聲
       inerDelay_us(100);
       CE=0;    // chip enable
       CSN=1;   // Spi disable
       SCK=0;   // Spi clock line init high
       write_com(0x38);   //設置工作方式
       write_com(0x0c);   //設置光標
       write_com(0x06);   //設置輸入方式
       write_com(0x01);   //清屏
      
                       
                                 TN=SPI_Read(EN_AA);
                                   write_com(0x80);
                                   display_temp1(TN);     //期望值是063(十進制),NRF24L01上電后,EN_AA默認值是 0011 1111,即十進制63。
                                   
                    delays(200);
                    delays(200);
                    delays(200);
                    delays(200);
                    delays(200);
                    delays(200);
                                   
                                   SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);                              
                                  TD=SPI_Read(EN_AA);
                                   write_com(0x80+0x40);      
                                   display_temp1(TD);     //期望值是001,因為前面向EN_AA寫入了0x01。
                                delays(200);
                                   delays(200);
                                   delays(200);
                                   delays(200);
                                   delays(200);
                                   delays(200);                                   while(1);/********意思是這里加個while(1);就正常是把很好的模板程序受益匪淺********/

}
/*****************************************************
函數功能:顯示十進制數
入口參數:x
***************************************************/
void display_temp1(unsigned char x)
{
       unsigned char j,k,l;     //j,k,l分別儲存溫度的百位、十位和個位
       j=x/100;              //取百位
       k=(x%100)/10;         //取十位
       l=x%10;               //取個位  
       write_date(digit[j]);    //將百位數字的字符常量寫入LCD
       write_date(digit[k]);    //將十位數字的字符常量寫入LCD
       write_date(digit[l]);    //將個位數字的字符常量寫入LCD
       //write_date('.');               //小數點
       delays(50);           //延時1ms給硬件一點反應時間     
}           
      
/***********1602液晶顯示部分子程序****************/
void write_com(uchar com)
{
       rs=0;//命令
       rw=0;
       P0=com;
       delays(5);
       en=1;
       delays(5);
       en=0;
}
void write_date(uchar date)
{
       rs=1;//數據
       rw=0;
       P0=date;
       delays(5);
       en=1;
       delays(5);
       en=0;
}
/****************************************************************************************************/
/*功能:NRF24L01讀寫寄存器函數
/****************************************************************************************************/
uint SPI_RW_Reg(uchar reg, uchar value)
{
       uint status;
       CSN = 0;                   // CSN low, init SPI transaction
       status = SPI_RW(reg);      // select register
       SPI_RW(value);             // ..and write value to it..
       CSN = 1;                   // CSN high again
       return(status);            // return nRF24L01 status uchar
}
/****************************************************************************************************
/*函數:uchar SPI_Read(uchar reg)
/*功能:NRF24L01的SPI時序
/*詳細請參考Page19
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
       uchar reg_val;
       CSN = 0;                // CSN low, initialize SPI communication...
       SPI_RW(reg);            // Select register to read from..
       reg_val = SPI_RW(0);    // ..then read registervalue
       CSN = 1;                // CSN high, terminate SPI communication
       return(reg_val);        // return register value
}
/****************************************************************************************************
/*函數:uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI寫時序
/*詳細請參考Page19
/****************************************************************************************************/
uint SPI_RW(uint uchar)
{
       uint bit_ctr;
    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
    {
              MOSI = (uchar & 0x80);         // 用傳過來的數據和0x80進行&與運算
              uchar = (uchar << 1);          // shift next bit into MSB..
              SCK = 1;                       // Set SCK high..
              uchar |= MISO;                 // capture current MISO bit
              SCK = 0;                       // ..then set SCK low again
    }
    return(uchar);                     // return read uchar
}
//*****************長延時*********************************//
void delays(uint x) //毫秒級延時函數
{
  uint i,j;
  for(i=x;i>0;i--)
     for(j=110;j>0;j--);
}
//********************************************************//
//*延時函數
//********************************************************//
void inerDelay_us(unsigned char n)
{  
for(;n>0;n--)
  _nop_();
}


評分

參與人數 1威望 +50 黑幣 +50 收起 理由
admin + 50 + 50 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色在线免费视频 | 欧美日韩亚 | 欧美大片在线观看 | 中文字幕影院 | 亚洲免费在线观看 | 久久久夜 | 欧美一级欧美三级在线观看 | 久久亚洲天堂 | 午夜精品久久久 | 欧美福利视频一区 | 日本中文字幕一区 | 色嗨嗨| 免费一级黄色 | 97av视频在线 | 亚洲午夜av久久乱码 | 成人精品毛片国产亚洲av十九禁 | 日韩视频一区二区 | 日日日操 | 视频一区二区三区中文字幕 | 久久婷婷麻豆国产91天堂 | 一级免费黄色 | 欧美性jizz18性欧美 | 人人干在线视频 | 精品九九九 | 日日夜夜免费精品视频 | 国产精品日韩欧美一区二区三区 | 久久噜 | 日本三级电影免费观看 | 亚洲国产一区二区三区 | 国内精品视频在线 | 免费一区二区三区 | 久久在线 | 麻豆久久久久久久久久 | 精品日韩一区 | 操皮视频| 性一交一乱一透一a级 | 在线看av网址 | 亚洲中午字幕 | 中文字幕在线观看www | 日韩精品久久久久久 | 99精品一区二区三区 |