⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tx433.lst

📁 nrf9e5带超时无线收发:从串口接收数据(靠超时判断而不是字节判断)
💻 LST
字号:
C51 COMPILER V7.50   TX433                                                                 10/21/2008 10:21:22 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE TX433
OBJECT MODULE PLACED IN tx433.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE tx433.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************
   2          双机无线收发:
   3                  将从串口接收到的字符发送出去。
   4          串口接收靠超时判断,超过20ms就认为完成接收一个数据包,
   5          开始无线发送。
   6          
   7          P06闪烁表明超时判断完成,即一个数据包接收完毕;
   8          P04闪烁表明无线发送数据成功。
   9          
  10          修改:增加"串口接收数目超过缓冲区则重新计数"
  11          ******************************************/
  12          
  13          #include <Nordic\reg9e5.h>
  14          
  15          #define    HFREQ    0                               // 0=433MHz, 1=868/915MHz
  16          #define    POWER    3                               // 0=min power...3 = max power
  17          #define    UART_BUFFER_SIZE    10                   //串口接收缓冲区大小为 10 bytes,最大为31
  18          
  19          unsigned char  UART_BUFFER[UART_BUFFER_SIZE+1];     //串口接收数据缓冲区
  20          unsigned char  countt=0;                            //待发送数据个数
  21          
  22          unsigned int  Tnum=400;                             //设定超时时间
  23          bit    Overtime_Flag;                               //超时标志位
  24          
  25          
  26          //延时函数
  27          void Delay400us(volatile unsigned char n)
  28          {
  29   1          unsigned char i;
  30   1          while(n--)
  31   1              for(i=0;i<35;i++)
  32   1                  ;
  33   1      }
  34          
  35          //超时计时定时器T0初始化
  36          void Time0_Init(void)
  37          {
  38   1          TMOD &= 0xF0;          //定时器/计数器T0选为定时器模式,工作方式2,以TR0启动定时器
  39   1          TMOD |= 0x02;
  40   1          CKCON |= 0x08;         // T0M=1 (/4 timer clock)
  41   1          TH0=0x38;              //16MHz下定时时间为50us
  42   1          TL0=0x38;
  43   1          ET0=1;                 //允许定时器T0中断          
  44   1          TR0=1;                 //启动定时器T0
  45   1          Overtime_Flag=0;       //清超时标志
  46   1      }
  47          
  48          //定时器T0中断服务子程序
  49          void Timer0_ISR (void) interrupt 1
  50          {
  51   1           //TF0=0;                //响应中断后自动清0
  52   1           Tnum--;                 //计时20ms(中断次数计数)
  53   1           if(Tnum==0)             //超时20ms到?
  54   1            {
  55   2             TR0=0;               //关闭定时器T0
C51 COMPILER V7.50   TX433                                                                 10/21/2008 10:21:22 PAGE 2   

  56   2             Overtime_Flag=1;     //超时标志置1
  57   2             P06=~P06;              
  58   2            }
  59   1      }
  60          
  61          //串口接收中断函数 
  62          void serial_ISR (void) interrupt 4
  63          {
  64   1          if(RI)
  65   1            {
  66   2                unsigned char ch;          
  67   2                RI = 0;
  68   2                ch = SBUF;
  69   2                //TR0=1;
  70   2                if(Overtime_Flag==0)                //未超时就接收
  71   2                       {                                                                //*********下面为修改***************
  72   3                                      if(countt==UART_BUFFER_SIZE)  //串口接收数目超过缓冲区则重新计数,缓冲区内数据会混乱
  73   3                              countt=0;
  74   3                                  countt++;
  75   3                      UART_BUFFER[0]=countt;
  76   3                      UART_BUFFER[countt]=ch;
  77   3                   }  
  78   2            }
  79   1          if(TI) 
  80   1            {
  81   2                //TI=0;
  82   2                return;
  83   2            }
  84   1      }
  85          
  86          //SPI读写
  87          unsigned char SpiReadWrite(unsigned char b)
  88          {
  89   1          EXIF &= ~0x20;                  // Clear SPI interrupt
  90   1          SPI_DATA = b;                   // Move byte to send to SPI data register
  91   1          while((EXIF & 0x20) == 0x00)    // Wait until SPI hs finished transmitting
  92   1                 ;
  93   1          return SPI_DATA;
  94   1      }
  95          
  96          //无线发送
  97          void Transmitter(unsigned char *str,unsigned char strlen)
  98          {
  99   1          unsigned char j=0;
 100   1          TRX_CE=0;                   //待机模式
 101   1          //Delay400us(10);
 102   1          RACSN = 0;                  
 103   1          SpiReadWrite(WTP);          //将发送数据写入SPI寄存器
 104   1          for(j=0;j<strlen;j++)
 105   1            {
 106   2             SpiReadWrite(*(str + j)); 
 107   2            }
 108   1       
 109   1          RACSN = 1;
 110   1          TXEN = 1;
 111   1          TRX_CE = 1;              //使能发送
 112   1          Delay400us(2);
 113   1          TRX_CE = 0;              //发送完毕
 114   1          P04=~P04;
 115   1      //    countt=0;
 116   1      }
 117          
C51 COMPILER V7.50   TX433                                                                 10/21/2008 10:21:22 PAGE 3   

 118          //初始化
 119          void Init(void)
 120          {
 121   1          unsigned char tmp,cklf,tmpa,tmpb;
 122   1          
 123   1          TH1 = 0xE6;                      // 9600@16MHz (when T1M=1 and SMOD=1)
 124   1          CKCON |= 0x10;                  // T1M=1 (/4 timer clock)
 125   1          PCON = 0x80;                    // SMOD=1 (double baud rate)
 126   1          SCON = 0x50;                    // Serial mode1, enable receiver
 127   1          TMOD = 0x20;                    // Timer1 8bit auto reload 
 128   1          TR1 = 1;                        // Start timer1  
 129   1      //    P0_ALT |= 0x06;
 130   1      //    P0_DIR |= 0x02;                 // P0.1 (RxD) is input
 131   1          tmpa= P0_ALT | 0x06;                 // Select alternate functions on pins P0.1 and P0.2
 132   1          P0_ALT = tmpa & 0x06;
 133   1          tmpb = P0_DIR | 0x02;                 // P0.1 (RxD) is input
 134   1          P0_DIR =tmpb & 0x02;
 135   1      
 136   1          SPICLK = 0;                     // Max SPI clock
 137   1          SPI_CTRL = 0x02;                // Connect internal SPI controller to Radio
 138   1      
 139   1          // Configure Radio:
 140   1          RACSN = 0;
 141   1          SpiReadWrite(WRC | 0x03);       // Write to RF config address 3 (RX payload)
 142   1          SpiReadWrite(0x01);             // One byte RX payload
 143   1          SpiReadWrite(0x01);             // One byte TX payload
 144   1          RACSN = 1;
 145   1      
 146   1          RACSN = 0;
 147   1          SpiReadWrite(RRC | 0x01);       // Read RF config address 1
 148   1          tmp = SpiReadWrite(0) & 0xf1;   //  PA_PWR[1:0]=00(输出电源-10dBm) HFREQ_PLL=0(433MHz)  Clear the p
             -ower and frequency setting bits
 149   1          RACSN = 1;
 150   1      
 151   1          RACSN = 0;
 152   1          SpiReadWrite(WRC | 0x01);      // Write RF config address 1
 153   1          SpiReadWrite(tmp | (POWER <<2) | (HFREQ << 1));   // Change power defined by POWER and to 433 or 868/9
             -15MHz defined by HFREQ above:
 154   1          RACSN = 1;
 155   1      
 156   1      
 157   1          // Switch to 16MHz clock:
 158   1          RACSN = 0;
 159   1          SpiReadWrite(RRC | 0x09);
 160   1          cklf = SpiReadWrite(0) | 0x1c;
 161   1          RACSN = 1;
 162   1          RACSN = 0;
 163   1          SpiReadWrite(WRC | 0x09);
 164   1          SpiReadWrite(cklf);
 165   1          RACSN = 1;
 166   1      
 167   1          RACSN = 0;
 168   1          SpiReadWrite(WTA);             //写本发送器配套的接收器地址,与rx433里的配置一样才可通信
 169   1          SpiReadWrite(0x18);
 170   1          SpiReadWrite(0x32);
 171   1          SpiReadWrite(0x40);
 172   1          SpiReadWrite(0xAF);
 173   1          RACSN = 1;
 174   1      
 175   1          RACSN = 0;
 176   1          SpiReadWrite(WRC | 0x04);       //设置本发送器发送的数据宽度,与tx433里的配置一样才可通信
 177   1          SpiReadWrite(0x20);             //发送数据宽度为32个字节
C51 COMPILER V7.50   TX433                                                                 10/21/2008 10:21:22 PAGE 4   

 178   1          RACSN = 1;
 179   1      }
 180          
 181          void main(void)
 182          {
 183   1          Init();
 184   1          Time0_Init();  //T0初始化
 185   1          EA=1;
 186   1          ES=1;
 187   1          //PT0=1;       //定时器T0为高优先级
 188   1         
 189   1          while(1)
 190   1           {
 191   2              if(Overtime_Flag)        //超时,将读到的数无线发送
 192   2              {
 193   3                              ES=0;            
 194   3                              //UART_BUFFER[0]=countt;
 195   3                  if(countt != 0)     //缓冲区有接收到数据,开始发送
 196   3                                     Transmitter(UART_BUFFER,(UART_BUFFER[0]+1));
 197   3                  countt=0;  
 198   3                  Overtime_Flag=0;    //复位超时标志 
 199   3                              Tnum=400;
 200   3                              TL0=0x38;           //重置超时计数器
 201   3                              TR0=1;              //启动超时定时器
 202   3                              ES=1;
 203   3              }         
 204   2          }  
 205   1      
 206   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    407    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     14       5
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -