关于单片机程序的执行

2019-03-24 18:35发布

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define TX_ADR_WIDTH    5           // 5 uints TX address width
#define RX_ADR_WIDTH    5           // 5 uints RX address width
#define TX_PLOAD_WIDTH  32         // 20 uints TX payload
#define RX_PLOAD_WIDTH  32         // 20 uints TX payload
#define READ_REG        0x00          // 读寄存器指令
#define WRITE_REG       0x20         // 写寄存器指令
#define RD_RX_PLOAD     0x61          // 读取接收数据指令
#define WR_TX_PLOAD     0xA0          // 写待发数据指令
#define FLUSH_TX        0xE1         // 冲洗发送 FIFO指令
#define FLUSH_RX        0xE2          // 冲洗接收 FIFO指令
#define REUSE_TX_PL     0xE3          // 定义重复装载数据指令
#define NOP             0xFF          // 保留
#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA           0x01  // 自动应答功能设置
#define EN_RXADDR       0x02  // 可用信道设置
#define SETUP_AW        0x03  // 收发地址宽度设置
#define SETUP_RETR      0x04  // 自动重发功能设置
#define RF_CH           0x05  // 工作频率设置
#define RF_SETUP        0x06  // 发射速率、功耗功能设置
#define STATUS          0x07  // 状态寄存器
#define OBSERVE_TX      0x08  // 发送监测功能
#define CD              0x09  // 地址检测           
#define RX_ADDR_P1      0x0B  // 频道1接收数据地址
#define RX_ADDR_P2      0x0C  // 频道2接收数据地址
#define RX_ADDR_P3      0x0D  // 频道3接收数据地址
#define RX_ADDR_P4      0x0E  // 频道4接收数据地址
#define RX_ADDR_P5      0x0F  // 频道5接收数据地址
#define TX_ADDR         0x10  // 发送地址寄存器
#define RX_PW_P1        0x12  // 接收频道1接收数据长度
#define RX_PW_P2        0x13  // 接收频道2接收数据长度
#define RX_PW_P3        0x14  // 接收频道3接收数据长度
#define RX_PW_P4        0x15  // 接收频道4接收数据长度
#define RX_PW_P5        0x16  // 接收频道5接收数据长度
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
uchar flag,status,fifo_s;
uchar addr[5]={0,0,0,0,0};
uchar  Tx_buf[32];
uchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
//*************************
sbit   CE=P0^7;
sbit  CSN=P0^6;
sbit  SCK=P0^5;
sbit MOSI=P0^4;
sbit MISO=P0^3;
sbit  IRQ=P0^2;
//**********内部延时***************
void delayms(uchar z)
{uchar x,y;
for(x=110;x>0;x--)
    for(y=z;y>0;y--);}
//*************************
void init()
{
            CE=0;
        CSN=1;
        SCK=0;
        IRQ=1;
    status=0;
           TMOD=0x20;//"设置定时器1为工作方式2"
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
         EA=1;
         ES=1;
   }
//***********************************
uchar SPI_RW(uchar uuchar)
{
  uchar bit_ctr;
  for(bit_ctr=0;bit_ctr<8;bit_ctr++)
    {
          MOSI=(uuchar &0x80);
          uuchar=(uuchar<<1);
          SCK=1;
          uuchar |=MISO;
          SCK=0;
        }
        return(uuchar);
}
//*************************
uchar 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 reg_val;
  CSN=0;
  SPI_RW(reg);
  reg_val=SPI_RW(0);
  CSN=1;
  return(reg_val);
}
//**************用于读数据*************
uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar uchars)
{       
        uchar status,uchar_ctr;
        CSN=0;
        status=SPI_RW(reg);
        for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
        pBuf[uchar_ctr]=SPI_RW(0);
        CSN=1;
        return(status);
}
//*************用于写数据*********
uchar SPI_Write_Buf(uchar reg,uchar *pBuf,uchar uchars)
{       
        uchar status,uchar_ctr;
        CSN=0;
        status=SPI_RW(reg);
        for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
    SPI_RW(*pBuf++);
        CSN=1;
        return(status);
}
//*************NRF24L01初始化***************
void init_NRF24L01(void)
{
    delayms(100);
        CE=0;     // chip enable
        CSN=1;   // Spi disable
        SCK=0;  // Spi clock line init high
        IRQ=1;
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);       //  频道0自动        ACK应答允许       
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  
        SPI_RW_Reg(WRITE_REG + RF_CH, 1);        //   设置信道工作为2.4GHZ,收发必须一致
        SPI_RW_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                    //设置发射速率为1MHZ,发射功率为最大值0dB
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收发完成中断响应,16位CRC        ,主接收
}
//*************数据发送***************
void NRF24L01_TxPacket(uchar * tx_buf)
{        CE=0;               
        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P1,TX_ADDRESS, TX_ADR_WIDTH);
        SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);  // 装载数据       
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送
        CE=1;                 //置高CE,激发数据发送
        delayms(1);
}
//**********显示函数*************////////
void send_asc(uchar asc)
{
         SBUF = asc;
     while(!TI);                                //" 等特数据传送(TI发送中断标志)"
                 TI = 0;  
}
//************主函数******************
void main()
{            init();
    init_NRF24L01();
      while(1)
     {  
    status=SPI_Read(0x07);       
    SBUF=status;
        send_asc(status);
         if(flag==1)
                {   ES=0;
                        send_asc(status);
                                 flag=0;
                                  ES=1;}
      }
}
void ser() interrupt 4
{
        RI=0;
        flag=1;
}
该程序正确执行,串口输出0X0E,但是有时返回0x0f,有时返回ox2e,请问大神这是为什么?谢谢!1030506500@qq.com!! 此帖出自小平头技术问答
0条回答

一周热门 更多>